@skaile/workspaces 5.19.0 → 6.1.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 (757) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +8 -8
  3. package/dist/app-sdk/index.js +1 -1
  4. package/dist/{asset-feeds-QGLI3AXI.js → asset-feeds-HJFV7UPW.js} +32 -24
  5. package/dist/asset-feeds-HJFV7UPW.js.map +1 -0
  6. package/dist/asset-manager/catalog-deployer.js +12 -12
  7. package/dist/asset-manager/index.js +19 -19
  8. package/dist/asset-manager/installer.js +14 -14
  9. package/dist/asset-manager/renderers.js +13 -13
  10. package/dist/asset-manager/src/index.d.ts +214 -27
  11. package/dist/asset-manager/src/index.d.ts.map +1 -1
  12. package/dist/asset-manager/src/install-agent.d.ts +2 -2
  13. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  14. package/dist/asset-manager/src/install-instances.d.ts +8 -8
  15. package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
  16. package/dist/asset-manager/src/installer.d.ts +34 -3
  17. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  18. package/dist/asset-manager/src/mcp-config.d.ts +35 -14
  19. package/dist/asset-manager/src/mcp-config.d.ts.map +1 -1
  20. package/dist/asset-manager/src/renderers.d.ts +12 -12
  21. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  22. package/dist/bridge/codex-app-server.js +2 -2
  23. package/dist/bridge/harnesses/claude-sdk.d.ts +2 -0
  24. package/dist/bridge/{drivers → harnesses}/claude-sdk.js +69 -73
  25. package/dist/bridge/harnesses/claude-sdk.js.map +1 -0
  26. package/dist/bridge/{drivers/gemini.d.ts → harnesses/codex.d.ts} +1 -1
  27. package/dist/bridge/{drivers → harnesses}/codex.js +53 -53
  28. package/dist/bridge/harnesses/codex.js.map +1 -0
  29. package/dist/bridge/{drivers/claude-sdk.d.ts → harnesses/continue.d.ts} +1 -1
  30. package/dist/bridge/{drivers → harnesses}/continue.js +30 -30
  31. package/dist/bridge/harnesses/continue.js.map +1 -0
  32. package/dist/bridge/{drivers → harnesses}/echo.d.ts +1 -1
  33. package/dist/bridge/{drivers → harnesses}/echo.js +27 -27
  34. package/dist/bridge/harnesses/echo.js.map +1 -0
  35. package/dist/bridge/{drivers/continue.d.ts → harnesses/gemini.d.ts} +1 -1
  36. package/dist/bridge/harnesses/gemini.js +18 -0
  37. package/dist/bridge/{drivers → harnesses}/goose.d.ts +1 -1
  38. package/dist/bridge/{drivers → harnesses}/goose.js +30 -30
  39. package/dist/bridge/harnesses/goose.js.map +1 -0
  40. package/dist/bridge/{drivers → harnesses}/omp.d.ts +1 -1
  41. package/dist/bridge/{drivers → harnesses}/omp.js +31 -31
  42. package/dist/bridge/harnesses/omp.js.map +1 -0
  43. package/dist/bridge/{drivers → harnesses}/opencode.d.ts +1 -1
  44. package/dist/bridge/{drivers → harnesses}/opencode.js +31 -31
  45. package/dist/bridge/harnesses/opencode.js.map +1 -0
  46. package/dist/bridge/{drivers → harnesses}/qwen.d.ts +1 -1
  47. package/dist/bridge/{drivers → harnesses}/qwen.js +20 -20
  48. package/dist/bridge/harnesses/qwen.js.map +1 -0
  49. package/dist/bridge/index.js +25 -25
  50. package/dist/bridge/src/agent-exec.d.ts +2 -2
  51. package/dist/bridge/src/agent-transcript.d.ts +1 -1
  52. package/dist/bridge/src/agent-transcript.d.ts.map +1 -1
  53. package/dist/bridge/src/approval-card.d.ts +3 -3
  54. package/dist/bridge/src/capability-dispatch.d.ts +5 -5
  55. package/dist/bridge/src/claude-sdk-surface.d.ts +17 -0
  56. package/dist/bridge/src/claude-sdk-surface.d.ts.map +1 -0
  57. package/dist/bridge/src/cloud.d.ts +4 -4
  58. package/dist/bridge/src/codex/config-toml.d.ts +3 -3
  59. package/dist/bridge/src/codex/friendly-error.d.ts +1 -1
  60. package/dist/bridge/src/codex/friendly-error.d.ts.map +1 -1
  61. package/dist/bridge/src/codex/{managed-driver.d.ts → managed-harness.d.ts} +5 -5
  62. package/dist/bridge/src/codex/managed-harness.d.ts.map +1 -0
  63. package/dist/bridge/src/codex/native-approvals.d.ts +1 -1
  64. package/dist/bridge/src/codex/native-approvals.d.ts.map +1 -1
  65. package/dist/bridge/src/error-classifier.d.ts +7 -7
  66. package/dist/bridge/src/{driver-capabilities.d.ts → harness-capabilities.d.ts} +18 -18
  67. package/dist/bridge/src/harness-capabilities.d.ts.map +1 -0
  68. package/dist/bridge/src/harness-model-check.d.ts +40 -0
  69. package/dist/bridge/src/harness-model-check.d.ts.map +1 -0
  70. package/dist/bridge/src/{drivers → harnesses}/_subprocess-cli.d.ts +8 -8
  71. package/dist/bridge/src/harnesses/_subprocess-cli.d.ts.map +1 -0
  72. package/dist/bridge/src/{drivers → harnesses}/claude-context-usage.d.ts +5 -5
  73. package/dist/bridge/src/harnesses/claude-context-usage.d.ts.map +1 -0
  74. package/dist/bridge/src/{drivers → harnesses}/claude-sdk.d.ts +27 -27
  75. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -0
  76. package/dist/bridge/src/{drivers → harnesses}/claude-self-turns.d.ts +5 -5
  77. package/dist/bridge/src/harnesses/claude-self-turns.d.ts.map +1 -0
  78. package/dist/bridge/src/{drivers → harnesses}/claude-tool-allowlist.d.ts +4 -4
  79. package/dist/bridge/src/harnesses/claude-tool-allowlist.d.ts.map +1 -0
  80. package/dist/bridge/src/{drivers → harnesses}/codex.d.ts +14 -14
  81. package/dist/bridge/src/harnesses/codex.d.ts.map +1 -0
  82. package/dist/bridge/src/{drivers → harnesses}/continue.d.ts +12 -12
  83. package/dist/bridge/src/harnesses/continue.d.ts.map +1 -0
  84. package/dist/bridge/src/{drivers → harnesses}/echo.d.ts +16 -16
  85. package/dist/bridge/src/harnesses/echo.d.ts.map +1 -0
  86. package/dist/bridge/src/{drivers → harnesses}/flow-script.d.ts +9 -9
  87. package/dist/bridge/src/harnesses/flow-script.d.ts.map +1 -0
  88. package/dist/bridge/src/{drivers → harnesses}/gemini.d.ts +15 -15
  89. package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -0
  90. package/dist/bridge/src/{drivers → harnesses}/goose.d.ts +10 -10
  91. package/dist/bridge/src/harnesses/goose.d.ts.map +1 -0
  92. package/dist/bridge/src/{drivers → harnesses}/omp-models-yml.d.ts +12 -12
  93. package/dist/bridge/src/harnesses/omp-models-yml.d.ts.map +1 -0
  94. package/dist/bridge/src/{drivers → harnesses}/omp.d.ts +23 -23
  95. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -0
  96. package/dist/bridge/src/{drivers → harnesses}/opencode.d.ts +11 -11
  97. package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -0
  98. package/dist/bridge/src/{drivers → harnesses}/qwen.d.ts +12 -12
  99. package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -0
  100. package/dist/bridge/src/{drivers → harnesses}/recovery-policy.d.ts +4 -4
  101. package/dist/bridge/src/harnesses/recovery-policy.d.ts.map +1 -0
  102. package/dist/bridge/src/{drivers → harnesses}/resume-probe.d.ts +3 -3
  103. package/dist/bridge/src/harnesses/resume-probe.d.ts.map +1 -0
  104. package/dist/bridge/src/{drivers → harnesses}/sanitize-assistant-text.d.ts +1 -1
  105. package/dist/bridge/src/harnesses/sanitize-assistant-text.d.ts.map +1 -0
  106. package/dist/bridge/src/{drivers → harnesses}/scrub-transcript.d.ts +1 -1
  107. package/dist/bridge/src/harnesses/scrub-transcript.d.ts.map +1 -0
  108. package/dist/bridge/src/index.d.ts +5 -4
  109. package/dist/bridge/src/index.d.ts.map +1 -1
  110. package/dist/bridge/src/logger.d.ts +4 -4
  111. package/dist/bridge/src/models.d.ts +1 -1
  112. package/dist/bridge/src/normalizer.d.ts +5 -3
  113. package/dist/bridge/src/normalizer.d.ts.map +1 -1
  114. package/dist/bridge/src/provider-materialize/continue-config-yaml.d.ts +5 -5
  115. package/dist/bridge/src/provider-materialize/continue-config-yaml.d.ts.map +1 -1
  116. package/dist/bridge/src/provider-materialize/credential-env.d.ts +3 -3
  117. package/dist/bridge/src/provider-materialize/{env-drivers.d.ts → env-harnesses.d.ts} +19 -19
  118. package/dist/bridge/src/provider-materialize/env-harnesses.d.ts.map +1 -0
  119. package/dist/bridge/src/provider-materialize/goose-custom-providers.d.ts +5 -5
  120. package/dist/bridge/src/provider-materialize/goose-custom-providers.d.ts.map +1 -1
  121. package/dist/bridge/src/provider-materialize/opencode-config.d.ts +7 -7
  122. package/dist/bridge/src/provider-materialize/opencode-config.d.ts.map +1 -1
  123. package/dist/bridge/src/provider-materialize/session-config-home.d.ts +5 -5
  124. package/dist/bridge/src/provider-materialize/session-config-home.d.ts.map +1 -1
  125. package/dist/bridge/src/provider-registry-derive.d.ts +4 -4
  126. package/dist/bridge/src/provider-registry-derive.d.ts.map +1 -1
  127. package/dist/bridge/src/reconfigure-ledger.d.ts +8 -8
  128. package/dist/bridge/src/reconfigure-ledger.d.ts.map +1 -1
  129. package/dist/bridge/src/registry.d.ts +34 -41
  130. package/dist/bridge/src/registry.d.ts.map +1 -1
  131. package/dist/bridge/src/runner-private-env.d.ts +2 -2
  132. package/dist/bridge/src/runtime.d.ts +11 -11
  133. package/dist/bridge/src/runtime.d.ts.map +1 -1
  134. package/dist/bridge/src/types.d.ts +158 -158
  135. package/dist/bridge/src/types.d.ts.map +1 -1
  136. package/dist/{chunk-7NT4F6SR.js → chunk-2LAPHLDH.js} +587 -521
  137. package/dist/chunk-2LAPHLDH.js.map +1 -0
  138. package/dist/{chunk-25ZVWL2R.js → chunk-3GMOPFWH.js} +4 -4
  139. package/dist/{chunk-25ZVWL2R.js.map → chunk-3GMOPFWH.js.map} +1 -1
  140. package/dist/{chunk-X5YPJV4N.js → chunk-3MWQKQUB.js} +2 -2
  141. package/dist/{chunk-X5YPJV4N.js.map → chunk-3MWQKQUB.js.map} +1 -1
  142. package/dist/{chunk-EPBKISS5.js → chunk-3TG2NV2F.js} +2 -2
  143. package/dist/chunk-3TG2NV2F.js.map +1 -0
  144. package/dist/{chunk-L2AMXONH.js → chunk-3X7VTCPG.js} +2 -2
  145. package/dist/chunk-3X7VTCPG.js.map +1 -0
  146. package/dist/{chunk-VIM3PWZM.js → chunk-4FVIT5DI.js} +3 -3
  147. package/dist/{chunk-VIM3PWZM.js.map → chunk-4FVIT5DI.js.map} +1 -1
  148. package/dist/{chunk-IF6IA3PZ.js → chunk-4MUDQCBP.js} +4 -4
  149. package/dist/{chunk-IF6IA3PZ.js.map → chunk-4MUDQCBP.js.map} +1 -1
  150. package/dist/{chunk-MKRWN7XP.js → chunk-5J4NPGFM.js} +5 -5
  151. package/dist/chunk-5J4NPGFM.js.map +1 -0
  152. package/dist/{chunk-5TBFN46Z.js → chunk-5KRMNUL4.js} +4 -4
  153. package/dist/chunk-5KRMNUL4.js.map +1 -0
  154. package/dist/{chunk-7SCS64BG.js → chunk-5Y2KGB4H.js} +109 -74
  155. package/dist/chunk-5Y2KGB4H.js.map +1 -0
  156. package/dist/{chunk-YIF2IJUA.js → chunk-6GWSDPBP.js} +3 -3
  157. package/dist/{chunk-YIF2IJUA.js.map → chunk-6GWSDPBP.js.map} +1 -1
  158. package/dist/{chunk-WST6UITC.js → chunk-6YR4ALVX.js} +17 -17
  159. package/dist/chunk-6YR4ALVX.js.map +1 -0
  160. package/dist/{chunk-YROR332M.js → chunk-7DN6JKP2.js} +2 -2
  161. package/dist/chunk-7DN6JKP2.js.map +1 -0
  162. package/dist/{chunk-IZCR27MU.js → chunk-7EKQDY2T.js} +3 -3
  163. package/dist/chunk-7EKQDY2T.js.map +1 -0
  164. package/dist/chunk-7HX6FNKL.js +317 -0
  165. package/dist/chunk-7HX6FNKL.js.map +1 -0
  166. package/dist/{chunk-COJIL7G4.js → chunk-7LP7RCZI.js} +7 -7
  167. package/dist/chunk-7LP7RCZI.js.map +1 -0
  168. package/dist/{chunk-2PBSAH3Z.js → chunk-AATHJRKL.js} +4 -4
  169. package/dist/{chunk-2PBSAH3Z.js.map → chunk-AATHJRKL.js.map} +1 -1
  170. package/dist/{chunk-C7WBGSBV.js → chunk-ABFPSVIS.js} +10 -10
  171. package/dist/chunk-ABFPSVIS.js.map +1 -0
  172. package/dist/{chunk-ICSCSM5D.js → chunk-ADPM6AYF.js} +3 -3
  173. package/dist/{chunk-ICSCSM5D.js.map → chunk-ADPM6AYF.js.map} +1 -1
  174. package/dist/{chunk-WOIRYY5L.js → chunk-AITJ7ELM.js} +141 -27
  175. package/dist/chunk-AITJ7ELM.js.map +1 -0
  176. package/dist/{chunk-HU5HVKY7.js → chunk-ASWTQQ7E.js} +4 -4
  177. package/dist/{chunk-HU5HVKY7.js.map → chunk-ASWTQQ7E.js.map} +1 -1
  178. package/dist/{chunk-RO6VOM6Z.js → chunk-AZ2H6R5I.js} +51 -25
  179. package/dist/chunk-AZ2H6R5I.js.map +1 -0
  180. package/dist/{chunk-I7TWVK6N.js → chunk-BBBCJSSU.js} +4 -4
  181. package/dist/{chunk-I7TWVK6N.js.map → chunk-BBBCJSSU.js.map} +1 -1
  182. package/dist/{chunk-AJ7EGIFR.js → chunk-BIRW3HOG.js} +3 -3
  183. package/dist/chunk-BIRW3HOG.js.map +1 -0
  184. package/dist/{chunk-FPHNJE4M.js → chunk-CEKW3KXP.js} +91 -30
  185. package/dist/chunk-CEKW3KXP.js.map +1 -0
  186. package/dist/{chunk-F6AA42GW.js → chunk-COYF6IG2.js} +5 -5
  187. package/dist/{chunk-F6AA42GW.js.map → chunk-COYF6IG2.js.map} +1 -1
  188. package/dist/{chunk-HT35SQZD.js → chunk-DGTI65OC.js} +30 -30
  189. package/dist/chunk-DGTI65OC.js.map +1 -0
  190. package/dist/{chunk-W4Q6CKJ5.js → chunk-DIGFA7Z5.js} +11 -11
  191. package/dist/chunk-DIGFA7Z5.js.map +1 -0
  192. package/dist/{chunk-335ENCCS.js → chunk-E572OHGY.js} +2 -2
  193. package/dist/{chunk-335ENCCS.js.map → chunk-E572OHGY.js.map} +1 -1
  194. package/dist/{chunk-Y5MBW5EU.js → chunk-EJPMNDTP.js} +3 -3
  195. package/dist/{chunk-Y5MBW5EU.js.map → chunk-EJPMNDTP.js.map} +1 -1
  196. package/dist/chunk-EX3GLAL6.js +31 -0
  197. package/dist/chunk-EX3GLAL6.js.map +1 -0
  198. package/dist/{chunk-XWOPZW26.js → chunk-FKQNBCDW.js} +38 -38
  199. package/dist/chunk-FKQNBCDW.js.map +1 -0
  200. package/dist/{chunk-6E6PKKAD.js → chunk-G5SUWZEU.js} +18 -8
  201. package/dist/chunk-G5SUWZEU.js.map +1 -0
  202. package/dist/{chunk-2GXSSZAM.js → chunk-GNZBFSRB.js} +12 -12
  203. package/dist/chunk-GNZBFSRB.js.map +1 -0
  204. package/dist/{chunk-PYJS5K7V.js → chunk-HMISULVD.js} +5 -5
  205. package/dist/{chunk-PYJS5K7V.js.map → chunk-HMISULVD.js.map} +1 -1
  206. package/dist/{chunk-IP2IPMEH.js → chunk-HPMQRAIF.js} +18 -18
  207. package/dist/chunk-HPMQRAIF.js.map +1 -0
  208. package/dist/{chunk-MRHVPQNO.js → chunk-HWNK3F3X.js} +1015 -189
  209. package/dist/chunk-HWNK3F3X.js.map +1 -0
  210. package/dist/{chunk-ZQSOJH6I.js → chunk-IHFGPHCT.js} +141 -341
  211. package/dist/chunk-IHFGPHCT.js.map +1 -0
  212. package/dist/{chunk-CQJH4G2K.js → chunk-ILLTBKDJ.js} +101 -102
  213. package/dist/chunk-ILLTBKDJ.js.map +1 -0
  214. package/dist/{chunk-FKU57Q5Q.js → chunk-IRYKRKVQ.js} +3 -3
  215. package/dist/{chunk-FKU57Q5Q.js.map → chunk-IRYKRKVQ.js.map} +1 -1
  216. package/dist/{chunk-J24CY3PF.js → chunk-J72MO2WA.js} +39 -39
  217. package/dist/chunk-J72MO2WA.js.map +1 -0
  218. package/dist/{chunk-Y56YIT6J.js → chunk-JCPD4QRM.js} +4 -4
  219. package/dist/chunk-JCPD4QRM.js.map +1 -0
  220. package/dist/{chunk-X3RMRJNR.js → chunk-JRN5QF4C.js} +8 -3
  221. package/dist/chunk-JRN5QF4C.js.map +1 -0
  222. package/dist/{chunk-K4O6L3WH.js → chunk-KNY356I3.js} +3 -3
  223. package/dist/{chunk-K4O6L3WH.js.map → chunk-KNY356I3.js.map} +1 -1
  224. package/dist/{chunk-XJVBUDDJ.js → chunk-KUQAJVYT.js} +8 -8
  225. package/dist/chunk-KUQAJVYT.js.map +1 -0
  226. package/dist/{chunk-4ZTPYIBE.js → chunk-KW37WNXY.js} +12 -12
  227. package/dist/chunk-KW37WNXY.js.map +1 -0
  228. package/dist/{chunk-MJHSLODD.js → chunk-LSI2IVFT.js} +2 -2
  229. package/dist/chunk-LSI2IVFT.js.map +1 -0
  230. package/dist/{chunk-WDXZA7QW.js → chunk-LSSYC5IC.js} +2 -2
  231. package/dist/{chunk-WDXZA7QW.js.map → chunk-LSSYC5IC.js.map} +1 -1
  232. package/dist/{chunk-WG6V4ISA.js → chunk-NB7SYQYP.js} +7 -7
  233. package/dist/{chunk-WG6V4ISA.js.map → chunk-NB7SYQYP.js.map} +1 -1
  234. package/dist/{chunk-EAZECHPM.js → chunk-NBAGV6L2.js} +5 -5
  235. package/dist/chunk-NBAGV6L2.js.map +1 -0
  236. package/dist/{chunk-JTOWA6RS.js → chunk-NUA33BYO.js} +181 -64
  237. package/dist/chunk-NUA33BYO.js.map +1 -0
  238. package/dist/{chunk-A6SMCEEE.js → chunk-QAKUD6QN.js} +11 -11
  239. package/dist/{chunk-A6SMCEEE.js.map → chunk-QAKUD6QN.js.map} +1 -1
  240. package/dist/{chunk-QG6GHTRM.js → chunk-QEULL4Q3.js} +8 -8
  241. package/dist/chunk-QEULL4Q3.js.map +1 -0
  242. package/dist/{chunk-ZX4KRWRB.js → chunk-QSYQOTWN.js} +4 -4
  243. package/dist/{chunk-ZX4KRWRB.js.map → chunk-QSYQOTWN.js.map} +1 -1
  244. package/dist/{chunk-X4ZZTHU3.js → chunk-RDTLPOPD.js} +4 -4
  245. package/dist/{chunk-X4ZZTHU3.js.map → chunk-RDTLPOPD.js.map} +1 -1
  246. package/dist/{chunk-GOCWM7FN.js → chunk-RHN5MRQO.js} +21 -4
  247. package/dist/chunk-RHN5MRQO.js.map +1 -0
  248. package/dist/{chunk-XM6T2AZ2.js → chunk-S2XHGWQC.js} +162 -124
  249. package/dist/chunk-S2XHGWQC.js.map +1 -0
  250. package/dist/{chunk-VJ7NU7GD.js → chunk-SVTMNSPI.js} +23 -6
  251. package/dist/chunk-SVTMNSPI.js.map +1 -0
  252. package/dist/{chunk-I37INEWE.js → chunk-UI745XC3.js} +10 -23
  253. package/dist/chunk-UI745XC3.js.map +1 -0
  254. package/dist/{chunk-N46LQR46.js → chunk-VMVDAZLA.js} +53 -30
  255. package/dist/chunk-VMVDAZLA.js.map +1 -0
  256. package/dist/{chunk-IG5LZ3WU.js → chunk-VTETQCR6.js} +10 -10
  257. package/dist/chunk-VTETQCR6.js.map +1 -0
  258. package/dist/{chunk-EFLKSMCO.js → chunk-VUJXZDCY.js} +5 -5
  259. package/dist/{chunk-EFLKSMCO.js.map → chunk-VUJXZDCY.js.map} +1 -1
  260. package/dist/{chunk-H6UVIKQ2.js → chunk-VYVTEMAW.js} +3 -3
  261. package/dist/{chunk-H6UVIKQ2.js.map → chunk-VYVTEMAW.js.map} +1 -1
  262. package/dist/{chunk-M3WPBTGJ.js → chunk-WD3L5QSU.js} +2 -2
  263. package/dist/{chunk-M3WPBTGJ.js.map → chunk-WD3L5QSU.js.map} +1 -1
  264. package/dist/{chunk-R6O6YWU7.js → chunk-WYZXSJBK.js} +3 -3
  265. package/dist/{chunk-R6O6YWU7.js.map → chunk-WYZXSJBK.js.map} +1 -1
  266. package/dist/{chunk-R4I3VBSS.js → chunk-X3YGUKCG.js} +5 -5
  267. package/dist/{chunk-R4I3VBSS.js.map → chunk-X3YGUKCG.js.map} +1 -1
  268. package/dist/{chunk-RPZVHXQ3.js → chunk-XFIEVEU7.js} +4 -4
  269. package/dist/chunk-XFIEVEU7.js.map +1 -0
  270. package/dist/{chunk-VSZWNUZC.js → chunk-XGULGQA3.js} +4 -4
  271. package/dist/chunk-XGULGQA3.js.map +1 -0
  272. package/dist/{chunk-Q6E6FM7P.js → chunk-XKNXPLKR.js} +6 -6
  273. package/dist/{chunk-Q6E6FM7P.js.map → chunk-XKNXPLKR.js.map} +1 -1
  274. package/dist/{chunk-7XSAW5OC.js → chunk-YLLVSR2U.js} +4 -4
  275. package/dist/{chunk-7XSAW5OC.js.map → chunk-YLLVSR2U.js.map} +1 -1
  276. package/dist/{chunk-6Z5KTFJT.js → chunk-Z3VKUWAX.js} +3 -3
  277. package/dist/{chunk-6Z5KTFJT.js.map → chunk-Z3VKUWAX.js.map} +1 -1
  278. package/dist/{chunk-5BEFNLOR.js → chunk-Z7ZEZZB6.js} +8 -8
  279. package/dist/chunk-Z7ZEZZB6.js.map +1 -0
  280. package/dist/{chunk-2LSDMJI2.js → chunk-ZAELRYKS.js} +4 -4
  281. package/dist/{chunk-2LSDMJI2.js.map → chunk-ZAELRYKS.js.map} +1 -1
  282. package/dist/{chunk-UQ33Y4DM.js → chunk-ZBHZLWV3.js} +4 -4
  283. package/dist/{chunk-UQ33Y4DM.js.map → chunk-ZBHZLWV3.js.map} +1 -1
  284. package/dist/{chunk-TIIXG3PN.js → chunk-ZDLUQLI6.js} +4 -4
  285. package/dist/{chunk-TIIXG3PN.js.map → chunk-ZDLUQLI6.js.map} +1 -1
  286. package/dist/{chunk-PHRNUTSG.js → chunk-ZFUZ5AKM.js} +4 -4
  287. package/dist/{chunk-PHRNUTSG.js.map → chunk-ZFUZ5AKM.js.map} +1 -1
  288. package/dist/{chunk-V257LUBM.js → chunk-ZHGKAZJ7.js} +251 -26
  289. package/dist/chunk-ZHGKAZJ7.js.map +1 -0
  290. package/dist/claude-code-RE46FJXI.js +10 -0
  291. package/dist/{claude-code-2PU7TITZ.js.map → claude-code-RE46FJXI.js.map} +1 -1
  292. package/dist/cli/index.js +1066 -647
  293. package/dist/cli/index.js.map +1 -1
  294. package/dist/cli/src/agent-pins.d.ts +11 -0
  295. package/dist/cli/src/agent-pins.d.ts.map +1 -1
  296. package/dist/cli/src/commands/catalog.d.ts +4 -4
  297. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  298. package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
  299. package/dist/cli/src/commands/config.d.ts +2 -2
  300. package/dist/cli/src/commands/config.d.ts.map +1 -1
  301. package/dist/cli/src/commands/diff.d.ts.map +1 -1
  302. package/dist/cli/src/commands/harness.d.ts +24 -0
  303. package/dist/cli/src/commands/harness.d.ts.map +1 -0
  304. package/dist/cli/src/commands/integration.d.ts +1 -1
  305. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  306. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  307. package/dist/cli/src/commands/library-index.d.ts +20 -2
  308. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  309. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  310. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  311. package/dist/cli/src/commands/migrate-files.d.ts +14 -0
  312. package/dist/cli/src/commands/migrate-files.d.ts.map +1 -1
  313. package/dist/cli/src/commands/migrate-harness.d.ts +49 -0
  314. package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -0
  315. package/dist/cli/src/commands/migrate.d.ts +4 -2
  316. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  317. package/dist/cli/src/commands/plugin/types.d.ts +1 -6
  318. package/dist/cli/src/commands/plugin/types.d.ts.map +1 -1
  319. package/dist/cli/src/commands/plugin-registry-cmd.d.ts +1 -1
  320. package/dist/cli/src/commands/preset-export.d.ts +1 -1
  321. package/dist/cli/src/commands/project.d.ts +20 -2
  322. package/dist/cli/src/commands/project.d.ts.map +1 -1
  323. package/dist/cli/src/commands/run.d.ts +2 -2
  324. package/dist/cli/src/commands/run.d.ts.map +1 -1
  325. package/dist/cli/src/commands/serve-preflight.d.ts +11 -11
  326. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  327. package/dist/cli/src/commands/serve.d.ts +1 -1
  328. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  329. package/dist/cli/src/commands/session-logs/local-query.d.ts +2 -0
  330. package/dist/cli/src/commands/session-logs/local-query.d.ts.map +1 -1
  331. package/dist/cli/src/commands/source.d.ts +9 -2
  332. package/dist/cli/src/commands/source.d.ts.map +1 -1
  333. package/dist/cli/src/commands/store.d.ts.map +1 -1
  334. package/dist/cli/src/commands/update.d.ts.map +1 -1
  335. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  336. package/dist/cli/src/config-checks.d.ts +37 -0
  337. package/dist/cli/src/config-checks.d.ts.map +1 -0
  338. package/dist/cli/src/harness-error.d.ts +47 -0
  339. package/dist/cli/src/harness-error.d.ts.map +1 -0
  340. package/dist/cli/src/helpers.d.ts +5 -5
  341. package/dist/cli/src/helpers.d.ts.map +1 -1
  342. package/dist/cli/src/plugin-store/index.d.ts +2 -2
  343. package/dist/cli/src/setup.d.ts +3 -3
  344. package/dist/cli/src/setup.d.ts.map +1 -1
  345. package/dist/cli/src/skill-checks.d.ts +27 -0
  346. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  347. package/dist/cli/src/store-addable.d.ts +11 -0
  348. package/dist/cli/src/store-addable.d.ts.map +1 -1
  349. package/dist/connectors/config.js +6 -6
  350. package/dist/connectors/index.js +31 -31
  351. package/dist/connectors/src/connector-prompt.d.ts +5 -5
  352. package/dist/connectors/src/connector-registry.d.ts +1 -1
  353. package/dist/connectors-7THEF7YA.js +48 -0
  354. package/dist/{connectors-RBGZ3M7G.js.map → connectors-7THEF7YA.js.map} +1 -1
  355. package/dist/connectors-shared/index.js +2 -2
  356. package/dist/core/framework.js +1 -1
  357. package/dist/{bridge/drivers/codex.d.ts → core/harness-targets.d.ts} +1 -1
  358. package/dist/core/harness-targets.js +4 -0
  359. package/dist/core/harness-targets.js.map +1 -0
  360. package/dist/core/index.js +11 -11
  361. package/dist/core/manifest.js +2 -2
  362. package/dist/core/models.js +1 -1
  363. package/dist/core/provider-registry-credentials.js +2 -2
  364. package/dist/core/provider-registry.js +1 -1
  365. package/dist/core/publish-manifest.js +3 -3
  366. package/dist/core/ref.js +1 -1
  367. package/dist/core/runtime-assets.js +6 -6
  368. package/dist/core/src/agent-instances.d.ts.map +1 -1
  369. package/dist/core/src/asset-roots.d.ts +2 -2
  370. package/dist/core/src/config-key-diagnostics.d.ts +9 -0
  371. package/dist/core/src/config-key-diagnostics.d.ts.map +1 -0
  372. package/dist/core/src/framework.d.ts +21 -21
  373. package/dist/core/src/framework.d.ts.map +1 -1
  374. package/dist/core/src/{driver-sdk.d.ts → harness-sdk.d.ts} +9 -9
  375. package/dist/core/src/harness-sdk.d.ts.map +1 -0
  376. package/dist/core/src/harness-targets.d.ts +71 -0
  377. package/dist/core/src/harness-targets.d.ts.map +1 -0
  378. package/dist/core/src/index.d.ts +8 -8
  379. package/dist/core/src/index.d.ts.map +1 -1
  380. package/dist/core/src/manifest.d.ts +10 -0
  381. package/dist/core/src/manifest.d.ts.map +1 -1
  382. package/dist/core/src/models.d.ts +8 -0
  383. package/dist/core/src/models.d.ts.map +1 -1
  384. package/dist/core/src/provider-registry.d.ts +2 -2
  385. package/dist/core/src/settings.d.ts +17 -16
  386. package/dist/core/src/settings.d.ts.map +1 -1
  387. package/dist/core/src/store.d.ts +12 -12
  388. package/dist/core/src/store.d.ts.map +1 -1
  389. package/dist/core/src/workspace-config.d.ts +39 -21
  390. package/dist/core/src/workspace-config.d.ts.map +1 -1
  391. package/dist/core/src/workspace-yaml-editor.d.ts +10 -3
  392. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  393. package/dist/core/store.js +2 -2
  394. package/dist/core/workspace-config.js +5 -5
  395. package/dist/deploy/index.js +12 -12
  396. package/dist/discovery/index.js +5 -5
  397. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  398. package/dist/discovery/src/parse-manifest.d.ts.map +1 -1
  399. package/dist/{ensure-sources-GKVLE6L5.js → ensure-sources-IH7CHSJF.js} +22 -22
  400. package/dist/{ensure-sources-GKVLE6L5.js.map → ensure-sources-IH7CHSJF.js.map} +1 -1
  401. package/dist/factory-assets/connectors/box.js +31 -31
  402. package/dist/factory-assets/connectors/deploy.js +31 -31
  403. package/dist/factory-assets/connectors/devserver.js +31 -31
  404. package/dist/factory-assets/connectors/flow/CONNECTOR.md +5 -5
  405. package/dist/factory-assets/connectors/flow/adapter.d.ts +3 -3
  406. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  407. package/dist/factory-assets/connectors/flow/adapter.js +31 -31
  408. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
  409. package/dist/factory-assets/connectors/flow/contract.js +1 -1
  410. package/dist/factory-assets/connectors/flow/engine/types.d.ts +1 -1
  411. package/dist/factory-assets/connectors/flow/engine.js +13 -13
  412. package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts +2 -2
  413. package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts.map +1 -1
  414. package/dist/factory-assets/connectors/flow/orchestrator-turn.d.ts +4 -4
  415. package/dist/factory-assets/connectors/flow/orchestrator-turn.d.ts.map +1 -1
  416. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts +1 -1
  417. package/dist/factory-assets/connectors/flow/prompt-fragments.js +1 -1
  418. package/dist/factory-assets/connectors/flow/run-flow.d.ts +12 -12
  419. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
  420. package/dist/factory-assets/connectors/flow/run-flow.js +33 -33
  421. package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts +1 -1
  422. package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts.map +1 -1
  423. package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts +22 -22
  424. package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts.map +1 -1
  425. package/dist/factory-assets/connectors/flow.js +31 -31
  426. package/dist/factory-assets/connectors/git.js +31 -31
  427. package/dist/factory-assets/connectors/gmail.js +31 -31
  428. package/dist/factory-assets/connectors/googledrive.js +31 -31
  429. package/dist/factory-assets/connectors/local.js +31 -31
  430. package/dist/factory-assets/connectors/mattermost.js +31 -31
  431. package/dist/factory-assets/connectors/memory.js +31 -31
  432. package/dist/factory-assets/connectors/minio.js +31 -31
  433. package/dist/factory-assets/connectors/postgres.js +31 -31
  434. package/dist/factory-assets/connectors/s3.js +31 -31
  435. package/dist/factory-assets/connectors/sharepoint.js +31 -31
  436. package/dist/factory-assets/connectors/sqlite.js +31 -31
  437. package/dist/factory-assets/connectors/static-server.js +31 -31
  438. package/dist/factory-assets/connectors/tunnel.js +31 -31
  439. package/dist/factory-assets/connectors/webdav.js +31 -31
  440. package/dist/factory-assets/connectors/xstate-store.js +31 -31
  441. package/dist/factory-assets/connectors/xstate.js +31 -31
  442. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +1 -1
  443. package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +2 -2
  444. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +3 -3
  445. package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +1 -1
  446. package/dist/flows-4JZQ3XFK.js +26 -0
  447. package/dist/{flows-W2FB7WIM.js.map → flows-4JZQ3XFK.js.map} +1 -1
  448. package/dist/{helpers-34QNVIGB.js → helpers-JNMK3FC2.js} +22 -22
  449. package/dist/{helpers-34QNVIGB.js.map → helpers-JNMK3FC2.js.map} +1 -1
  450. package/dist/library/index.js +15 -15
  451. package/dist/library/install.js +4 -4
  452. package/dist/library/src/index.d.ts +1 -1
  453. package/dist/library/src/index.d.ts.map +1 -1
  454. package/dist/library/src/local/library-dir.d.ts +22 -5
  455. package/dist/library/src/local/library-dir.d.ts.map +1 -1
  456. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  457. package/dist/library/src/remote/remote-catalog-source.d.ts +6 -0
  458. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  459. package/dist/{library-publish-RUQTKTJU.js → library-publish-I3UWXAHI.js} +69 -67
  460. package/dist/library-publish-I3UWXAHI.js.map +1 -0
  461. package/dist/model-endpoint/index.js +15 -15
  462. package/dist/model-endpoint/src/resolve.d.ts +1 -1
  463. package/dist/open-library-NKKUJLWA.js +42 -0
  464. package/dist/{open-library-PVTIUQUF.js.map → open-library-NKKUJLWA.js.map} +1 -1
  465. package/dist/open-registry-BYAXSHUI.js +32 -0
  466. package/dist/{open-registry-SOIS3TA2.js.map → open-registry-BYAXSHUI.js.map} +1 -1
  467. package/dist/paths-UKWE35XS.js +22 -0
  468. package/dist/{paths-JLNX7Y4X.js.map → paths-UKWE35XS.js.map} +1 -1
  469. package/dist/plugin-registry/index.js +1 -1
  470. package/dist/plugin-registry/src/context.d.ts +3 -3
  471. package/dist/plugin-registry/src/context.d.ts.map +1 -1
  472. package/dist/plugin-registry/src/deploy-handle.d.ts +1 -1
  473. package/dist/plugin-registry/src/index.d.ts +2 -2
  474. package/dist/plugin-registry/src/index.d.ts.map +1 -1
  475. package/dist/plugin-registry/src/internal.d.ts.map +1 -1
  476. package/dist/plugin-registry/src/registry.d.ts +3 -3
  477. package/dist/plugin-registry/src/registry.d.ts.map +1 -1
  478. package/dist/plugin-registry/src/targets.d.ts +9 -9
  479. package/dist/plugin-registry/src/targets.d.ts.map +1 -1
  480. package/dist/plugin-store-ABE35NRX.js +23 -0
  481. package/dist/{plugin-store-G2GWAHSD.js.map → plugin-store-ABE35NRX.js.map} +1 -1
  482. package/dist/plugins/src/asset-kind-provider.d.ts +1 -1
  483. package/dist/project-BIPK47JK.js +86 -0
  484. package/dist/{project-EX47PUBN.js.map → project-BIPK47JK.js.map} +1 -1
  485. package/dist/resolver/index.js +12 -12
  486. package/dist/runner/index.js +50 -50
  487. package/dist/runner/src/agent.d.ts +3 -3
  488. package/dist/runner/src/agent.d.ts.map +1 -1
  489. package/dist/runner/src/agents/in-process-host.d.ts +1 -1
  490. package/dist/runner/src/agents/instances.d.ts +1 -1
  491. package/dist/runner/src/agents/instances.d.ts.map +1 -1
  492. package/dist/runner/src/agents/run-controller.d.ts +7 -7
  493. package/dist/runner/src/agents/run-controller.d.ts.map +1 -1
  494. package/dist/runner/src/agents/standalone-surface.d.ts +2 -2
  495. package/dist/runner/src/agents/standalone-surface.d.ts.map +1 -1
  496. package/dist/runner/src/ai-provider-switch.d.ts +7 -7
  497. package/dist/runner/src/assistant-home.d.ts +1 -1
  498. package/dist/runner/src/capability-registry.d.ts +2 -2
  499. package/dist/runner/src/coalesced-restart.d.ts +2 -2
  500. package/dist/runner/src/compaction/context-window.d.ts +8 -8
  501. package/dist/runner/src/compaction/context-window.d.ts.map +1 -1
  502. package/dist/runner/src/compaction/orchestrator.d.ts +24 -24
  503. package/dist/runner/src/compaction/orchestrator.d.ts.map +1 -1
  504. package/dist/runner/src/compaction-gate.d.ts +30 -30
  505. package/dist/runner/src/compaction-gate.d.ts.map +1 -1
  506. package/dist/runner/src/composition/content-source.d.ts.map +1 -1
  507. package/dist/runner/src/composition/dry-run.d.ts +2 -2
  508. package/dist/runner/src/composition/dry-run.d.ts.map +1 -1
  509. package/dist/runner/src/composition/errors.d.ts +16 -1
  510. package/dist/runner/src/composition/errors.d.ts.map +1 -1
  511. package/dist/runner/src/composition/resolve-instance.d.ts +2 -2
  512. package/dist/runner/src/composition/resolve.d.ts +1 -1
  513. package/dist/runner/src/config.d.ts +3 -3
  514. package/dist/runner/src/config.d.ts.map +1 -1
  515. package/dist/runner/src/context-usage/collector.d.ts +15 -15
  516. package/dist/runner/src/context-usage/collector.d.ts.map +1 -1
  517. package/dist/runner/src/context-usage/compose.d.ts +6 -6
  518. package/dist/runner/src/context-usage/compose.d.ts.map +1 -1
  519. package/dist/runner/src/context-usage/estimator.d.ts +1 -1
  520. package/dist/runner/src/context-usage/index.d.ts +1 -1
  521. package/dist/runner/src/context-usage/index.d.ts.map +1 -1
  522. package/dist/runner/src/context-usage/transcript-tracker.d.ts +2 -2
  523. package/dist/runner/src/context-usage/transcript-tracker.d.ts.map +1 -1
  524. package/dist/runner/src/credential-notice.d.ts +4 -4
  525. package/dist/runner/src/credential-notice.d.ts.map +1 -1
  526. package/dist/runner/src/credential-rotated.d.ts +1 -1
  527. package/dist/runner/src/final-text.d.ts +1 -1
  528. package/dist/runner/src/{driver-swap-gate.d.ts → harness-swap-gate.d.ts} +21 -21
  529. package/dist/runner/src/harness-swap-gate.d.ts.map +1 -0
  530. package/dist/runner/src/late-mcp-rebuild.d.ts +6 -6
  531. package/dist/runner/src/late-mcp-rebuild.d.ts.map +1 -1
  532. package/dist/runner/src/lifecycle-handler.d.ts +1 -1
  533. package/dist/runner/src/lifecycle-handler.d.ts.map +1 -1
  534. package/dist/runner/src/manifest.d.ts +1 -1
  535. package/dist/runner/src/mcp-runtime-handlers.d.ts +6 -6
  536. package/dist/runner/src/mcp-runtime-handlers.d.ts.map +1 -1
  537. package/dist/runner/src/model-endpoint-discovery.d.ts +1 -1
  538. package/dist/runner/src/pending-turns.d.ts +3 -3
  539. package/dist/runner/src/platform-blocks.d.ts +5 -5
  540. package/dist/runner/src/platform-blocks.d.ts.map +1 -1
  541. package/dist/runner/src/prompt-turn-queue.d.ts +1 -1
  542. package/dist/runner/src/provider-quota-forwarder.d.ts +1 -1
  543. package/dist/runner/src/provider-quota-forwarder.d.ts.map +1 -1
  544. package/dist/runner/src/reconfigure-handler.d.ts +14 -14
  545. package/dist/runner/src/reconfigure-handler.d.ts.map +1 -1
  546. package/dist/runner/src/resource-handler.d.ts +1 -1
  547. package/dist/runner/src/resources.d.ts +5 -5
  548. package/dist/runner/src/resources.d.ts.map +1 -1
  549. package/dist/runner/src/runner-capabilities.d.ts +7 -7
  550. package/dist/runner/src/runtime-session-emit.d.ts +5 -5
  551. package/dist/runner/src/runtime-session-emit.d.ts.map +1 -1
  552. package/dist/runner/src/s3-presign-client.d.ts +1 -1
  553. package/dist/runner/src/serve-credentials.d.ts +7 -7
  554. package/dist/runner/src/serve-credentials.d.ts.map +1 -1
  555. package/dist/runner/src/serve.d.ts +46 -34
  556. package/dist/runner/src/serve.d.ts.map +1 -1
  557. package/dist/runner/src/session-builder.d.ts +41 -41
  558. package/dist/runner/src/session-builder.d.ts.map +1 -1
  559. package/dist/runner/src/session-capability-wiring.d.ts +9 -9
  560. package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
  561. package/dist/runner/src/session-stimulus.d.ts +1 -1
  562. package/dist/runner/src/session.d.ts +5 -5
  563. package/dist/runner/src/session.d.ts.map +1 -1
  564. package/dist/runner/src/skill-staging.d.ts +16 -16
  565. package/dist/runner/src/skill-staging.d.ts.map +1 -1
  566. package/dist/runner/src/turn-end-contract.d.ts +5 -5
  567. package/dist/runner/src/turn-end-contract.d.ts.map +1 -1
  568. package/dist/runner/src/turn-scheduler.d.ts +22 -22
  569. package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
  570. package/dist/runner/src/turn-status-replay.d.ts +1 -1
  571. package/dist/runner/src/usage-limit-turn-hold.d.ts +1 -1
  572. package/dist/sdk/asset-manager.js +19 -19
  573. package/dist/sdk/bridge.js +25 -25
  574. package/dist/sdk/core.js +11 -11
  575. package/dist/sdk/flow.js +13 -13
  576. package/dist/sdk/index.js +54 -54
  577. package/dist/sdk/index.js.map +1 -1
  578. package/dist/sdk/resolver.js +12 -12
  579. package/dist/sdk/runner.js +50 -50
  580. package/dist/sdk/session.js +2 -2
  581. package/dist/sdk/src/agent-session.d.ts +1 -1
  582. package/dist/sdk/src/local-runtime.d.ts +1 -1
  583. package/dist/sdk/src/local-runtime.d.ts.map +1 -1
  584. package/dist/sdk/src/types.d.ts +1 -1
  585. package/dist/sdk/src/types.d.ts.map +1 -1
  586. package/dist/sdk/store.js +2 -2
  587. package/dist/sdk/transport/ws/server.js +12 -12
  588. package/dist/sdk/transport/ws.js +12 -12
  589. package/dist/sdk/transport.js +12 -12
  590. package/dist/sdk/types.js +1 -1
  591. package/dist/serve-preflight-FLTIBTEX.js +107 -0
  592. package/dist/serve-preflight-FLTIBTEX.js.map +1 -0
  593. package/dist/session/index.js +2 -2
  594. package/dist/session/src/dispatcher.d.ts +2 -2
  595. package/dist/sessions-2Q7SSYPT.js +5 -0
  596. package/dist/{sessions-DICDEONJ.js.map → sessions-2Q7SSYPT.js.map} +1 -1
  597. package/dist/{setup-AFZQNGKA.js → setup-AG6NFHSN.js} +52 -52
  598. package/dist/setup-AG6NFHSN.js.map +1 -0
  599. package/dist/skills-UQYUHVKO.js +26 -0
  600. package/dist/{skills-YYYC6D5X.js.map → skills-UQYUHVKO.js.map} +1 -1
  601. package/dist/source-ASEHI2XS.js +85 -0
  602. package/dist/{source-DGPCT5IC.js.map → source-ASEHI2XS.js.map} +1 -1
  603. package/dist/{source-manifest-publish-AGJ63JF2.js → source-manifest-publish-IEVV3W6J.js} +62 -62
  604. package/dist/{source-manifest-publish-AGJ63JF2.js.map → source-manifest-publish-IEVV3W6J.js.map} +1 -1
  605. package/dist/store/index.js +2 -2
  606. package/dist/store/src/store.d.ts +3 -3
  607. package/dist/store/src/store.d.ts.map +1 -1
  608. package/dist/transport/index.js +12 -12
  609. package/dist/transport/ws/server.js +12 -12
  610. package/dist/transport/ws.js +12 -12
  611. package/dist/tui/index.js +70 -70
  612. package/dist/tui/index.js.map +1 -1
  613. package/dist/tui/src/repl-session.d.ts +5 -5
  614. package/dist/tui/src/repl.d.ts +5 -5
  615. package/dist/tui/src/repl.d.ts.map +1 -1
  616. package/dist/types/index.js +1 -1
  617. package/dist/types/manifests.js +1 -1
  618. package/dist/types/src/agent-lifecycle.d.ts +1 -1
  619. package/dist/types/src/agent-lifecycle.d.ts.map +1 -1
  620. package/dist/types/src/ask-slots.d.ts +1 -1
  621. package/dist/types/src/capabilities.d.ts +1 -1
  622. package/dist/types/src/context-usage.d.ts +22 -22
  623. package/dist/types/src/context-usage.d.ts.map +1 -1
  624. package/dist/types/src/events.d.ts +49 -49
  625. package/dist/types/src/events.d.ts.map +1 -1
  626. package/dist/types/src/index.d.ts +2 -2
  627. package/dist/types/src/index.d.ts.map +1 -1
  628. package/dist/types/src/install-manifest.d.ts +1 -1
  629. package/dist/types/src/install-manifest.d.ts.map +1 -1
  630. package/dist/types/src/lifecycle.d.ts +6 -6
  631. package/dist/types/src/lifecycle.d.ts.map +1 -1
  632. package/dist/types/src/logging.d.ts +1 -1
  633. package/dist/types/src/manifests/agent.d.ts +3 -3
  634. package/dist/types/src/protocol.d.ts +4 -4
  635. package/dist/types/src/runtime.d.ts +38 -38
  636. package/dist/types/src/runtime.d.ts.map +1 -1
  637. package/dist/types/src/version.d.ts +22 -11
  638. package/dist/types/src/version.d.ts.map +1 -1
  639. package/dist/validator-DRHMJ457.js +5 -0
  640. package/dist/{validator-FA2PFW6N.js.map → validator-DRHMJ457.js.map} +1 -1
  641. package/dist/workspace-plugin/adapters/mcp.js +41 -41
  642. package/dist/workspace-plugin/adapters/omp.js +26 -26
  643. package/dist/workspace-plugin/adapters/omp.js.map +1 -1
  644. package/dist/workspace-plugin/index.js +3 -3
  645. package/dist/workspace-plugin/src/plugin.d.ts +5 -5
  646. package/dist/workspace-plugin/src/plugin.d.ts.map +1 -1
  647. package/dist/workspace-plugin/src/tools/flows.d.ts +1 -1
  648. package/dist/workspace-plugin/src/tools/validator.d.ts +6 -6
  649. package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
  650. package/dist/workspace-plugin/src/types.d.ts +2 -2
  651. package/dist/workspace-plugin/src/types.d.ts.map +1 -1
  652. package/package.json +59 -59
  653. package/dist/asset-feeds-QGLI3AXI.js.map +0 -1
  654. package/dist/bridge/drivers/claude-sdk.js.map +0 -1
  655. package/dist/bridge/drivers/codex.js.map +0 -1
  656. package/dist/bridge/drivers/continue.js.map +0 -1
  657. package/dist/bridge/drivers/echo.js.map +0 -1
  658. package/dist/bridge/drivers/gemini.js +0 -18
  659. package/dist/bridge/drivers/goose.js.map +0 -1
  660. package/dist/bridge/drivers/omp.js.map +0 -1
  661. package/dist/bridge/drivers/opencode.js.map +0 -1
  662. package/dist/bridge/drivers/qwen.js.map +0 -1
  663. package/dist/bridge/src/codex/managed-driver.d.ts.map +0 -1
  664. package/dist/bridge/src/driver-capabilities.d.ts.map +0 -1
  665. package/dist/bridge/src/driver-model-check.d.ts +0 -25
  666. package/dist/bridge/src/driver-model-check.d.ts.map +0 -1
  667. package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +0 -1
  668. package/dist/bridge/src/drivers/claude-context-usage.d.ts.map +0 -1
  669. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +0 -1
  670. package/dist/bridge/src/drivers/claude-self-turns.d.ts.map +0 -1
  671. package/dist/bridge/src/drivers/claude-tool-allowlist.d.ts.map +0 -1
  672. package/dist/bridge/src/drivers/codex.d.ts.map +0 -1
  673. package/dist/bridge/src/drivers/continue.d.ts.map +0 -1
  674. package/dist/bridge/src/drivers/echo.d.ts.map +0 -1
  675. package/dist/bridge/src/drivers/flow-script.d.ts.map +0 -1
  676. package/dist/bridge/src/drivers/gemini.d.ts.map +0 -1
  677. package/dist/bridge/src/drivers/goose.d.ts.map +0 -1
  678. package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +0 -1
  679. package/dist/bridge/src/drivers/omp.d.ts.map +0 -1
  680. package/dist/bridge/src/drivers/opencode.d.ts.map +0 -1
  681. package/dist/bridge/src/drivers/qwen.d.ts.map +0 -1
  682. package/dist/bridge/src/drivers/recovery-policy.d.ts.map +0 -1
  683. package/dist/bridge/src/drivers/resume-probe.d.ts.map +0 -1
  684. package/dist/bridge/src/drivers/sanitize-assistant-text.d.ts.map +0 -1
  685. package/dist/bridge/src/drivers/scrub-transcript.d.ts.map +0 -1
  686. package/dist/bridge/src/provider-materialize/env-drivers.d.ts.map +0 -1
  687. package/dist/chunk-2GXSSZAM.js.map +0 -1
  688. package/dist/chunk-4ZTPYIBE.js.map +0 -1
  689. package/dist/chunk-5BEFNLOR.js.map +0 -1
  690. package/dist/chunk-5TBFN46Z.js.map +0 -1
  691. package/dist/chunk-6E6PKKAD.js.map +0 -1
  692. package/dist/chunk-7NT4F6SR.js.map +0 -1
  693. package/dist/chunk-7SCS64BG.js.map +0 -1
  694. package/dist/chunk-AJ7EGIFR.js.map +0 -1
  695. package/dist/chunk-C7WBGSBV.js.map +0 -1
  696. package/dist/chunk-COJIL7G4.js.map +0 -1
  697. package/dist/chunk-CQJH4G2K.js.map +0 -1
  698. package/dist/chunk-EAZECHPM.js.map +0 -1
  699. package/dist/chunk-EPBKISS5.js.map +0 -1
  700. package/dist/chunk-FPHNJE4M.js.map +0 -1
  701. package/dist/chunk-GOCWM7FN.js.map +0 -1
  702. package/dist/chunk-HT35SQZD.js.map +0 -1
  703. package/dist/chunk-I37INEWE.js.map +0 -1
  704. package/dist/chunk-IG5LZ3WU.js.map +0 -1
  705. package/dist/chunk-IP2IPMEH.js.map +0 -1
  706. package/dist/chunk-IZCR27MU.js.map +0 -1
  707. package/dist/chunk-J24CY3PF.js.map +0 -1
  708. package/dist/chunk-JTOWA6RS.js.map +0 -1
  709. package/dist/chunk-L2AMXONH.js.map +0 -1
  710. package/dist/chunk-MJHSLODD.js.map +0 -1
  711. package/dist/chunk-MKRWN7XP.js.map +0 -1
  712. package/dist/chunk-MRHVPQNO.js.map +0 -1
  713. package/dist/chunk-N46LQR46.js.map +0 -1
  714. package/dist/chunk-PUK7TQT4.js +0 -13
  715. package/dist/chunk-PUK7TQT4.js.map +0 -1
  716. package/dist/chunk-QG6GHTRM.js.map +0 -1
  717. package/dist/chunk-RO6VOM6Z.js.map +0 -1
  718. package/dist/chunk-RPZVHXQ3.js.map +0 -1
  719. package/dist/chunk-V257LUBM.js.map +0 -1
  720. package/dist/chunk-VJ7NU7GD.js.map +0 -1
  721. package/dist/chunk-VSZWNUZC.js.map +0 -1
  722. package/dist/chunk-W4Q6CKJ5.js.map +0 -1
  723. package/dist/chunk-WOIRYY5L.js.map +0 -1
  724. package/dist/chunk-WST6UITC.js.map +0 -1
  725. package/dist/chunk-X3RMRJNR.js.map +0 -1
  726. package/dist/chunk-XJVBUDDJ.js.map +0 -1
  727. package/dist/chunk-XM6T2AZ2.js.map +0 -1
  728. package/dist/chunk-XWOPZW26.js.map +0 -1
  729. package/dist/chunk-Y56YIT6J.js.map +0 -1
  730. package/dist/chunk-YROR332M.js.map +0 -1
  731. package/dist/chunk-ZQSOJH6I.js.map +0 -1
  732. package/dist/claude-code-2PU7TITZ.js +0 -10
  733. package/dist/cli/src/driver-error.d.ts +0 -28
  734. package/dist/cli/src/driver-error.d.ts.map +0 -1
  735. package/dist/connectors-RBGZ3M7G.js +0 -48
  736. package/dist/core/driver-targets.d.ts +0 -2
  737. package/dist/core/driver-targets.js +0 -4
  738. package/dist/core/driver-targets.js.map +0 -1
  739. package/dist/core/src/driver-sdk.d.ts.map +0 -1
  740. package/dist/core/src/driver-targets.d.ts +0 -71
  741. package/dist/core/src/driver-targets.d.ts.map +0 -1
  742. package/dist/flows-W2FB7WIM.js +0 -26
  743. package/dist/library-publish-RUQTKTJU.js.map +0 -1
  744. package/dist/open-library-PVTIUQUF.js +0 -42
  745. package/dist/open-registry-SOIS3TA2.js +0 -32
  746. package/dist/paths-JLNX7Y4X.js +0 -22
  747. package/dist/plugin-store-G2GWAHSD.js +0 -23
  748. package/dist/project-EX47PUBN.js +0 -84
  749. package/dist/runner/src/driver-swap-gate.d.ts.map +0 -1
  750. package/dist/serve-preflight-QXRKGOI5.js +0 -108
  751. package/dist/serve-preflight-QXRKGOI5.js.map +0 -1
  752. package/dist/sessions-DICDEONJ.js +0 -5
  753. package/dist/setup-AFZQNGKA.js.map +0 -1
  754. package/dist/skills-YYYC6D5X.js +0 -26
  755. package/dist/source-DGPCT5IC.js +0 -85
  756. package/dist/validator-FA2PFW6N.js +0 -5
  757. /package/dist/bridge/{drivers → harnesses}/gemini.js.map +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../cli/src/agent-checks.ts","../cli/src/skill-checks.ts","../cli/src/commands/publish-core.ts","../cli/src/store-auth.ts","../cli/src/commands/library-index.ts"],"names":["path","fs","path2","error","fs2","join","readFileSync","dirname","parseYaml","stringifyYaml"],"mappings":"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","file":"chunk-AITJ7ELM.js","sourcesContent":["/**\n * Agent checks that need the filesystem or the library's asset list. The schema\n * refinement (`AgentManifestSchema`) already refuses what the manifest alone can\n * show: a bad cron, an unknown capability slot, an agent composing itself by name.\n * This file adds the rest: local `composes:` paths and `memory.blocks[].source`\n * files (resolved against the agent's own directory), and `composes:` refs that name\n * an asset the library does not hold.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Diagnostic } from \"@skaile/workspaces/core\";\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport { resolveBinding, UnknownCompositionKindError } from \"@skaile/workspaces/runner\";\nimport {\n type AgentComposeItem,\n agentDeprecationDiagnostics,\n composeRefTarget,\n composeSlotDiagnostics,\n} from \"@skaile/workspaces/types/manifests\";\nimport type { AssetFinding } from \"./skill-checks.ts\";\n\nconst error = (text: string): AssetFinding => ({ tag: \"agent\", text, conformance: false });\n\n/**\n * Pseudo-kind valid only as a convention-file composition item (`SOUL.md`); it is\n * never an asset kind and is never published.\n */\nconst PSEUDO_COMPOSE_KINDS: ReadonlySet<string> = new Set([\"soul\"]);\n\n/**\n * Check every `composes[].kind` of a parsed `agent.yaml` against the registry\n * (plus the `soul` pseudo-kind), and that a registered kind with no default binding (a\n * `preset`) names a `binding`: session build would throw `unknown_asset_kind` for it. One\n * `unknown_asset_kind` error diagnostic per offending item, pathed `composes[<i>].kind`.\n */\nexport function checkComposeKinds(parsed: unknown, registry: IAssetKindRegistry): Diagnostic[] {\n if (parsed === null || typeof parsed !== \"object\") return [];\n const composes = (parsed as Record<string, unknown>).composes;\n if (!Array.isArray(composes)) return [];\n const diagnostics: Diagnostic[] = [];\n composes.forEach((item, i) => {\n if (item === null || typeof item !== \"object\") return;\n const fields = item as Record<string, unknown>;\n const kind = fields.kind;\n if (typeof kind !== \"string\") return;\n if (!PSEUDO_COMPOSE_KINDS.has(kind) && !registry.getProvider(kind)) {\n diagnostics.push({\n code: \"unknown_asset_kind\",\n severity: \"error\",\n message: `composes item kind \"${kind}\" is not a registered asset kind (registered: ${registry.getAllKinds().join(\", \")})`,\n path: `composes[${i}].kind`,\n });\n return;\n }\n if (fields.binding !== undefined || typeof fields.ref !== \"string\") return;\n try {\n resolveBinding({ kind, ref: fields.ref } as AgentComposeItem);\n } catch (err) {\n if (!(err instanceof UnknownCompositionKindError)) throw err;\n diagnostics.push({\n code: \"unknown_asset_kind\",\n severity: \"error\",\n message: `composes item \"${fields.ref}\" of kind \"${kind}\" has no default binding; set \\`binding:\\` (the session build fails without it)`,\n path: `composes[${i}].binding`,\n });\n }\n });\n return diagnostics;\n}\n\n/**\n * The findings of an `agent.yaml` document that need no filesystem: composed kinds that are\n * not registered or have no default binding, duplicate or unknown slots, and the deprecated 0.1\n * fields. `validate`, `library index` and the publish plan all take them through\n * {@link checkAsset}'s sibling `checkParsedAsset`, so one agent gets one verdict (p415).\n *\n * @returns `errors` fail the asset; `advisories` only warn.\n */\nexport function checkAgentDefinition(\n parsed: Record<string, unknown>,\n registry: IAssetKindRegistry,\n): { errors: AssetFinding[]; advisories: AssetFinding[] } {\n const errors: AssetFinding[] = [];\n const advisories: AssetFinding[] = [];\n for (const d of [\n ...checkComposeKinds(parsed, registry),\n ...composeSlotDiagnostics(parsed),\n ...agentDeprecationDiagnostics(parsed),\n ]) {\n (d.severity === \"error\" ? errors : advisories).push({\n tag: \"agent\",\n text: `${d.code}: ${d.path}: ${d.message}`,\n conformance: false,\n });\n }\n return { errors, advisories };\n}\n\n/** `child` is `parent` or lies inside it. */\nfunction isInside(parent: string, child: string): boolean {\n const rel = path.relative(parent, child);\n return rel === \"\" || (!rel.startsWith(\"..\") && !path.isAbsolute(rel));\n}\n\nfunction records(value: unknown): Array<Record<string, unknown>> {\n return Array.isArray(value)\n ? value.filter((v): v is Record<string, unknown> => v !== null && typeof v === \"object\")\n : [];\n}\n\n/**\n * The errors an agent's files add: a local `composes[].ref` path that does not exist,\n * leaves the library or points at the agent itself, and a `memory.blocks[].source`\n * that is missing, leaves the agent directory, or holds more characters than the\n * block's `max_chars`. Paths resolve against `agentDir`.\n *\n * `library index`, `library publish` and `skaile validate` run it for an agent\n * manifest whose directory is known.\n *\n * @param parsed Parsed agent manifest (`agent.yaml` document or `AGENT.md` frontmatter).\n * @param agentDir Absolute directory of the agent manifest.\n * @param libraryRoot Absolute root of the library holding the agent; a local compose\n * path outside it cannot be published.\n * @returns One error finding per problem; empty when the agent's files are consistent.\n */\nexport function checkAgentFiles(\n parsed: Record<string, unknown>,\n agentDir: string,\n libraryRoot: string,\n): AssetFinding[] {\n const out: AssetFinding[] = [];\n\n records(parsed.composes).forEach((item, i) => {\n if (typeof item.kind !== \"string\" || typeof item.ref !== \"string\") return;\n const target = composeRefTarget({ kind: item.kind, ref: item.ref });\n if (target?.type !== \"local\") return;\n const where = `composes[${i}].ref`;\n const resolved = path.resolve(agentDir, target.path);\n if (!fs.existsSync(resolved)) {\n out.push(\n error(`${where}: local path \"${item.ref}\" does not exist (resolved from ${agentDir})`),\n );\n return;\n }\n if (!isInside(libraryRoot, resolved)) {\n out.push(\n error(`${where}: local path \"${item.ref}\" leaves the library and cannot be published`),\n );\n return;\n }\n const ownManifests = [\n agentDir,\n path.join(agentDir, \"agent.yaml\"),\n path.join(agentDir, \"AGENT.md\"),\n ];\n if (item.kind === \"agent\" && ownManifests.includes(resolved)) {\n out.push(\n error(\n `${where}: agent composes itself (${item.ref}); an agent cannot be its own sub-agent`,\n ),\n );\n }\n });\n\n const blocks = records(\n parsed.memory !== null && typeof parsed.memory === \"object\"\n ? (parsed.memory as Record<string, unknown>).blocks\n : undefined,\n );\n blocks.forEach((block, i) => {\n if (typeof block.source !== \"string\" || block.source === \"\") return;\n const where = `memory.blocks[${i}].source`;\n const resolved = path.resolve(agentDir, block.source);\n if (!isInside(agentDir, resolved)) {\n out.push(error(`${where}: \"${block.source}\" leaves the agent directory`));\n return;\n }\n let stat: fs.Stats;\n try {\n stat = fs.statSync(resolved);\n } catch {\n out.push(error(`${where}: file \"${block.source}\" does not exist in ${agentDir}`));\n return;\n }\n if (!stat.isFile()) {\n out.push(error(`${where}: \"${block.source}\" is not a file`));\n return;\n }\n const max = block.max_chars;\n if (typeof max !== \"number\") return;\n const length = [...fs.readFileSync(resolved, \"utf-8\").trim()].length;\n if (length > max) {\n out.push(\n error(\n `${where}: \"${block.source}\" holds ${length} characters, more than memory block \"${String(block.name)}\" max_chars ${max}`,\n ),\n );\n }\n });\n\n return out;\n}\n\n/** What `composes[].ref` is resolved against: the assets the library holds and the publisher it inherits. */\nexport interface ComposeRefContext {\n /** Whether the library, or a registered library of the same publisher, holds `kind:name`. */\n hasAsset: (kind: string, name: string) => boolean;\n /**\n * Whether the library or any registered library holds `kind:name` of the bare `publisher`\n * (the offline check `requires:` entries get, p1200).\n */\n holds: (publisher: string, kind: string, name: string) => boolean;\n /** The library's publisher, when known; refs naming another publisher are not judged. */\n publisher: string | undefined;\n}\n\n/**\n * The context `validate`, `library index` and the publish plan resolve `composes[]` refs with.\n *\n * @param own `kind:name` identities of the assets of the library being checked.\n * @param registered `publisher/kind:name` keys of the assets every registered library holds.\n * @param publisher The library's publisher, when known.\n */\nexport function composeRefContext(\n own: ReadonlySet<string>,\n registered: ReadonlySet<string>,\n publisher: string | undefined,\n): ComposeRefContext {\n const bare = publisher?.replace(/^@/, \"\");\n return {\n publisher,\n hasAsset: (kind, name) =>\n own.has(`${kind}:${name}`) ||\n (bare !== undefined && registered.has(`${bare}/${kind}:${name}`)),\n holds: (holder, kind, name) =>\n (holder === bare && own.has(`${kind}:${name}`)) ||\n registered.has(`${holder}/${kind}:${name}`),\n };\n}\n\n/**\n * Errors for `composes[]` items that name an asset no library holds (`kind:name` is neither in\n * the library being checked nor in a registered library of its publisher): `skaile add` fails\n * on such an agent with `requires … not found` (p415). A ref that names another publisher is\n * external and cannot be judged here. A bare ref (`skill:sea-lore`) inherits the agent's publisher.\n *\n * @param parsed Parsed agent manifest.\n * @param context What the refs are resolved against.\n * @returns One finding per unresolved ref.\n */\nexport function agentComposeRefProblems(\n parsed: Record<string, unknown>,\n context: ComposeRefContext,\n): AssetFinding[] {\n const out: AssetFinding[] = [];\n records(parsed.composes).forEach((item, i) => {\n if (typeof item.kind !== \"string\" || typeof item.ref !== \"string\") return;\n const target = composeRefTarget({ kind: item.kind, ref: item.ref });\n if (target?.type !== \"asset\" || target.kind === \"soul\") return;\n if (target.publisher !== undefined) {\n if (context.publisher === undefined) return;\n if (target.publisher.replace(/^@/, \"\") !== context.publisher.replace(/^@/, \"\")) return;\n }\n if (context.hasAsset(target.kind, target.name)) return;\n out.push({\n tag: \"agent\",\n text: `composes[${i}].ref: ${item.ref} is not held by this library or any registered library; \\`skaile add\\` fails with \"requires … not found\". Add the asset to a library (\\`skaile library create ${target.kind} ${target.name}\\`) or drop the item`,\n conformance: false,\n });\n });\n return out;\n}\n","/**\n * Per-asset checks shared by `skaile validate`, `skaile library index` and the\n * `library publish` plan, so all three give the same verdict for the same asset\n * file: {@link checkAsset} returns the errors (semver, kind schema, flow\n * definition) and the advisories (agentskills.io conformance, untouched scaffold).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n type AssetEntry,\n ASSET_NAME_HINT,\n assetRefProblem,\n checkAgentSkillConformance,\n isValidAssetName,\n parseAssetRef,\n parseDep,\n readAssetBody,\n} from \"@skaile/workspaces/core\";\nimport {\n flowFileNameError,\n invalidSemverMessage,\n parseManifestFile,\n SEMVER_RE,\n} from \"@skaile/workspaces/discovery\";\nimport { parseFlowDefinition } from \"@skaile/workspaces/factory-assets/connectors/flow/contract\";\nimport { filesEntryPaths } from \"@skaile/workspaces/library\";\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport {\n agentComposeRefProblems,\n type ComposeRefContext,\n checkAgentDefinition,\n checkAgentFiles,\n} from \"./agent-checks.ts\";\nimport {\n FLOW_DESCRIPTION_PLACEHOLDER,\n isScaffoldBody,\n PRESET_DESCRIPTION_PLACEHOLDER,\n PRESET_ITEM_PLACEHOLDER_REF,\n SKILL_DESCRIPTION_PLACEHOLDER_PREFIX,\n} from \"@skaile/workspaces/types/manifests\";\n\n/** Per-type regex patterns for deterministic asset discovery. */\nexport const MANIFEST_GLOBS: Array<{ pattern: RegExp; kind: string }> = [\n { pattern: /\\/SKILL\\.md$/, kind: \"skill\" },\n { pattern: /\\/agent\\.yaml$/, kind: \"agent\" },\n { pattern: /\\/AGENT\\.md$/, kind: \"agent\" },\n { pattern: /\\/CONTRACT\\.md$/, kind: \"contract\" },\n { pattern: /\\/PERSONA\\.md$/, kind: \"persona\" },\n { pattern: /\\/RULESET\\.md$/, kind: \"ruleset\" },\n { pattern: /\\.flow\\.yaml$/, kind: \"flow\" },\n { pattern: /\\.flow\\.json$/, kind: \"flow\" },\n { pattern: /\\/CONNECTOR\\.md$/, kind: \"connector\" },\n { pattern: /\\.prompt\\.md$/, kind: \"prompt\" },\n { pattern: /\\/MCP\\.md$/, kind: \"mcp-server\" },\n { pattern: /\\/knowledge\\.yaml$/, kind: \"knowledge\" },\n { pattern: /\\/knowledge\\/index\\.yaml$/, kind: \"knowledge\" },\n { pattern: /\\.preset\\.yaml$/, kind: \"preset\" },\n];\n\n/** The kind a manifest file name stands for (`SKILL.md` → `skill`), `undefined` for any other file. */\nexport function manifestKindOfFile(file: string): string | undefined {\n const posix = file.split(path.sep).join(\"/\");\n const hay = posix.startsWith(\"/\") ? posix : `/${posix}`;\n return MANIFEST_GLOBS.find((g) => g.pattern.test(hay))?.kind;\n}\n\n/**\n * The one sentence for a manifest file that cannot be parsed (an empty or front-matter-less\n * `SKILL.md`, invalid YAML). `validate`, `library index` and the publish plan print it after their\n * own `<file> [<kind>] —` prefix, so the author reads the same cause and fix everywhere (p1206).\n */\nexport function manifestParseErrorText(reason: string): string {\n return `parse error: ${reason}`;\n}\n\n/** One advisory finding, printed as `<file> [<tag>] — <text>`. */\nexport interface AssetFinding {\n /** `skill conformance` for agentskills.io findings, else the asset kind. */\n tag: string;\n text: string;\n /** `true` for an agentskills.io conformance finding (`--strict-conformance` escalates these). */\n conformance: boolean;\n /** `true` for the untouched `library create` body: an error in `validate`, `library index` and the publish plan. */\n scaffoldBody?: true;\n /**\n * Set on a `requires:` entry no registered library holds (p1200): the canonical\n * `kind:@publisher/name` the publish plan asks the store about.\n */\n unheldRef?: string;\n}\n\n/** Frontmatter keys older docs mention that no release reads, for any kind (`validate` names them). */\nconst UNUSED_KEYS = [\"reads_from\", \"writes_to\"] as const;\n\n/**\n * Run the advisory checks for one parsed asset manifest: agentskills.io conformance\n * (skills only), keys nothing reads (every kind) and the untouched `library create` body (skill, agent, prompt, contract).\n * The flow and preset scaffolds are errors, see {@link checkAsset}. Other kinds yield no findings.\n *\n * @param kind Asset kind of the manifest.\n * @param parsed Parsed manifest (frontmatter for markdown kinds, the document for YAML).\n * @param body The markdown body after the frontmatter (`undefined` for YAML kinds).\n * @param dirName The manifest's parent folder name (enables the skill name==dir rule).\n */\nexport function checkAssetManifest(\n kind: string,\n parsed: Record<string, unknown>,\n body: string | undefined,\n dirName: string,\n): AssetFinding[] {\n const out: AssetFinding[] = [];\n if (kind === \"skill\") {\n for (const f of checkAgentSkillConformance(parsed, { dirName })) {\n out.push({ tag: \"skill conformance\", text: `${f.field}: ${f.message}`, conformance: true });\n }\n }\n // Keys no release reads: the file passes the schema (it is loose) but the key does nothing (p486).\n for (const key of UNUSED_KEYS) {\n if (key in parsed) {\n out.push({\n tag: kind,\n text: `${key}: unknown key; nothing in skaile reads it, so it has no effect. Remove it`,\n conformance: false,\n });\n }\n }\n // `library create` writes a placeholder body under a `# <name>` heading;\n // shipping it untouched is never intended.\n if (isScaffoldBody(kind, body)) {\n const noun = kind === \"skill\" ? \"skill prompt\" : kind;\n out.push({\n tag: kind,\n text: `body is still the scaffold placeholder; write the ${noun}`,\n conformance: false,\n scaffoldBody: true,\n });\n }\n return out;\n}\n\n/** The version `library index` records for a parsed manifest: top-level `version`, else `metadata.version`. */\nexport function declaredVersion(parsed: Record<string, unknown>): string | undefined {\n const scalar = (v: unknown): string | undefined =>\n typeof v === \"string\" ? v : typeof v === \"number\" ? String(v) : undefined;\n const meta = parsed.metadata;\n const nested =\n meta !== null && typeof meta === \"object\"\n ? scalar((meta as Record<string, unknown>).version)\n : undefined;\n return scalar(parsed.version) ?? nested;\n}\n\n/** The refusal text for a version that is not semver, `undefined` when it is. */\nexport function invalidSemverText(version: string): string | undefined {\n return SEMVER_RE.test(version) ? undefined : invalidSemverMessage(version);\n}\n\n/**\n * The version scalar exactly as written in the manifest text (`1.0`, not the `1` yaml reads),\n * `undefined` when the text has no `version:` line. Markdown manifests are searched in their\n * frontmatter only.\n */\nfunction rawVersionScalar(text: string): string | undefined {\n const front = text.startsWith(\"---\") ? (text.split(/\\n---/, 1)[0] ?? text) : text;\n const m = /^[ \\t]*version:[ \\t]*([^\\s#][^#\\n]*?)[ \\t]*(?:#.*)?$/m.exec(front);\n return m?.[1];\n}\n\n/**\n * The refusal for a manifest version that is not semver: {@link invalidSemverText}, and for a yaml\n * number (`version: 1.0` is read as the number 1) the scalar as written plus the quoted fix.\n * `undefined` when the version is absent or valid.\n *\n * @param parsed Parsed manifest.\n * @param rawText The manifest file text, to show the scalar the author wrote.\n */\nexport function versionProblemText(\n parsed: Record<string, unknown>,\n rawText?: string,\n): string | undefined {\n const version = declaredVersion(parsed);\n const text = version === undefined ? undefined : invalidSemverText(version);\n if (text === undefined) return undefined;\n const meta = parsed.metadata;\n const nested =\n meta !== null && typeof meta === \"object\"\n ? (meta as Record<string, unknown>).version\n : undefined;\n const key =\n parsed.version === undefined || parsed.version === null ? \"metadata.version\" : \"version\";\n const written = key === \"version\" ? parsed.version : nested;\n if (typeof written !== \"number\") return text;\n const raw = (rawText === undefined ? undefined : rawVersionScalar(rawText)) ?? String(written);\n // `1` → `1.0.0`, `1.5` → `1.5.0`: the number the author meant, in three parts.\n const fix = /^\\d+(\\.\\d+)?$/.test(raw)\n ? `${raw}${raw.includes(\".\") ? \"\" : \".0\"}.0`\n : DEFAULT_VERSION;\n return `version ${raw} is not valid semver: yaml reads an unquoted number as a number, not a string. Write it quoted with three parts: ${key}: \"${fix}\"`;\n}\n\n/**\n * The refusal for a directory that holds a kind + name another directory already holds.\n * `library index` and the publish plan print it, so both name the directory and the fix alike.\n *\n * @param dir The duplicate directory, relative to the library root.\n * @param detail Why it is a duplicate, e.g. `already registered at \"fun/skills/x\"`.\n * @param library The registered library name, for the re-run hint.\n */\nexport function duplicateAssetMessage(\n kind: string,\n name: string,\n dir: string,\n detail: string,\n library: string,\n): string {\n return `${kind}:${name} found in ${dir} but ${detail}. Rename or delete one of the two directories, then re-run \\`skaile library index ${library}\\`.`;\n}\n\n/** Result of {@link checkAsset}: what fails the asset, and what only warns. */\nexport interface AssetCheckResult {\n /** Findings that fail `validate`, make `library index` exit 1 and the publish plan refuse the asset. */\n errors: AssetFinding[];\n /** Advisories ({@link checkAssetManifest}): printed as warnings, exit code unchanged. */\n advisories: AssetFinding[];\n}\n\n/** The version a manifest without one is read at: the default `library index` records. */\nconst DEFAULT_VERSION = \"0.1.0\";\n\n/** The kinds `library create` scaffolds; a missing version and an empty `metadata:` are handled alike for all. */\nconst SCAFFOLD_KINDS: Record<string, true> = {\n skill: true,\n agent: true,\n prompt: true,\n contract: true,\n flow: true,\n preset: true,\n};\n\n/**\n * The manifest the kind schema and the flow parser see: a missing version reads as\n * {@link DEFAULT_VERSION} and an empty `metadata:` as absent, for every scaffolded kind, so no\n * kind refuses what another accepts.\n */\nfunction withManifestDefaults(\n kind: string,\n parsed: Record<string, unknown>,\n): Record<string, unknown> {\n if (!SCAFFOLD_KINDS[kind]) return parsed;\n const out = { ...parsed };\n if (out.metadata === null) delete out.metadata;\n // Only an absent version is defaulted; a present but wrong one (an object, a list) stays an error.\n const meta = out.metadata;\n const nested =\n typeof meta === \"object\" && meta !== null && \"version\" in meta ? meta.version : undefined;\n if (out.version == null && nested == null) out.version = DEFAULT_VERSION;\n return out;\n}\n\n/**\n * The refusal for an asset name or id that breaks the canonical rule (lowercase kebab-case,\n * at most 64 characters), `undefined` when the identity is absent (the schema owns that) or valid.\n * An explicit `publisher:` in the manifest is checked as part of the ref it forms.\n */\nexport function manifestIdentityError(\n kind: string,\n parsed: Record<string, unknown>,\n): string | undefined {\n const identity = kind === \"flow\" ? parsed.id : parsed.name;\n if (typeof identity !== \"string\" || identity.length === 0) return undefined;\n\n const publisher = typeof parsed.publisher === \"string\" ? parsed.publisher : undefined;\n if (publisher !== undefined) {\n try {\n parseAssetRef(`${kind}:@${publisher}/${identity}`);\n return undefined;\n } catch (e) {\n return e instanceof Error ? e.message : String(e);\n }\n }\n if (!isValidAssetName(identity)) {\n return `invalid asset ${kind === \"flow\" ? \"id\" : \"name\"} \"${identity}\" — ${ASSET_NAME_HINT}`;\n }\n return undefined;\n}\n\n/**\n * The untouched `library create flow` / `library create preset` content: a flow with no nodes\n * and the example preset item can never be consumed, so they fail like the `TODO:` description\n * of every other kind. Also matches the generic descriptions older releases scaffolded.\n */\nfunction scaffoldDefinitionErrors(kind: string, parsed: Record<string, unknown>): string[] {\n const out: string[] = [];\n if (kind === \"flow\") {\n if (parsed.description === FLOW_DESCRIPTION_PLACEHOLDER) {\n out.push(\"description is still the scaffold placeholder; say what the flow does\");\n }\n if (parsed.nodes === undefined) {\n out.push(\"nodes is missing; a flow needs at least one node\");\n } else if (Array.isArray(parsed.nodes) && parsed.nodes.length === 0) {\n out.push(\"nodes is still the scaffold placeholder (nodes: []); add the flow's nodes\");\n }\n }\n if (kind === \"preset\") {\n if (parsed.description === PRESET_DESCRIPTION_PLACEHOLDER) {\n out.push(\n `description is still the scaffold placeholder (\"${PRESET_DESCRIPTION_PLACEHOLDER}\"); say what the preset does`,\n );\n }\n const items = Array.isArray(parsed.items) ? parsed.items : [];\n const placeholderItem = items.some((item) => {\n const ref = typeof item === \"string\" ? item : (item as { ref?: unknown } | null)?.ref;\n return typeof ref === \"string\" && ref.trim() === PRESET_ITEM_PLACEHOLDER_REF;\n });\n if (placeholderItem) {\n out.push(\n `item ${PRESET_ITEM_PLACEHOLDER_REF} is still the scaffold placeholder; replace it with the preset's real items`,\n );\n }\n }\n return out;\n}\n\n/**\n * The `requires:` entries of a content manifest, read where `parseRequires` reads them. An\n * `agent.yaml` has none: its `requires` is a deprecated 0.1 field no release reads (the\n * agent definition check says so, p1311).\n */\nfunction contentRequiresEntries(parsed: Record<string, unknown>, fileName?: string): string[] {\n if (fileName === \"agent.yaml\") return [];\n const metadata = parsed.metadata;\n const raw =\n parsed.requires ??\n (metadata && typeof metadata === \"object\"\n ? (metadata as Record<string, unknown>).requires\n : undefined);\n const list =\n typeof raw === \"string\"\n ? raw.split(\",\")\n : Array.isArray(raw)\n ? raw.map((e) => (typeof e === \"string\" ? e : JSON.stringify(e)))\n : [];\n return list.map((e) => e.trim()).filter(Boolean);\n}\n\n/**\n * One finding per `requires:` entry that no registered library holds, read offline (p1200): the\n * same check `dependencies:` in `skaile.manifest.yaml` gets (p119). The finding is a warning in\n * `validate` and `library index`; the publish plan asks the store about each one\n * (`unheldRef`) and refuses only when the store does not list it either. Without a `context`\n * nothing is judged.\n *\n * @param kind Asset kind of the manifest.\n * @param parsed Parsed manifest.\n * @param fileName Base name of the manifest file.\n * @param context What the refs are resolved against.\n */\nexport function unheldRequiresFindings(\n kind: string,\n parsed: Record<string, unknown>,\n fileName: string | undefined,\n context: ComposeRefContext | undefined,\n): AssetFinding[] {\n if (!context) return [];\n const out: AssetFinding[] = [];\n const bare = (p: string): string => p.replace(/^@/, \"\");\n for (const entry of contentRequiresEntries(parsed, fileName)) {\n if (assetRefProblem(entry, { allowBare: true })) continue;\n const dep = parseDep(entry);\n const publisher = dep.publisher ?? context.publisher;\n if (publisher === undefined) continue;\n if (context.holds(bare(publisher), dep.kind, dep.name)) continue;\n out.push({\n tag: kind,\n text: `requires \"${entry}\" is not held by any registered library (checked offline: this library and the local index; the store was not asked). \\`skaile add\\` fails with \"requires … not found\" unless the library that holds it is registered`,\n conformance: false,\n unheldRef: `${dep.kind}:@${bare(publisher)}/${dep.name}`,\n });\n }\n return out;\n}\n\n/**\n * The refs an asset names that `add` would refuse: every `requires:` entry (SKILL.md\n * `metadata.requires`, `AGENT.md`; a bare `name` or `kind:name` means the same publisher) and\n * every preset `items[].ref` (a `library://` instance ref is not an asset ref). One rule,\n * {@link assetRefProblem}, so `validate`, `library index` and the publish plan fail them\n * exactly as the manifest `dependencies:` check does (p135).\n */\nfunction referenceErrors(\n kind: string,\n parsed: Record<string, unknown>,\n registry: IAssetKindRegistry,\n fileName?: string,\n): string[] {\n const isKnownKind = (k: string): boolean => registry.getProvider(k) !== undefined;\n const out: string[] = [];\n for (const entry of contentRequiresEntries(parsed, fileName)) {\n const problem = assetRefProblem(entry, { allowBare: true, isKnownKind });\n if (problem) out.push(`invalid requires entry \"${entry}\": ${problem}`);\n }\n if (kind === \"preset\" && Array.isArray(parsed.items)) {\n for (const item of parsed.items) {\n const ref = typeof item === \"string\" ? item : (item as { ref?: unknown } | null)?.ref;\n if (typeof ref !== \"string\" || ref.startsWith(\"library://\")) continue;\n const problem = assetRefProblem(ref, { isKnownKind });\n if (problem) out.push(`invalid preset item \"${ref}\": ${problem}`);\n }\n }\n return out;\n}\n\n/**\n * The plain text for a `name` or `description` the kind schema refuses, `undefined` for any other\n * schema error. The schema's own words (`Invalid input: expected string, received undefined`) name no\n * fix, so every kind says the same thing for the same mistake: what is wrong and what to write (p1401).\n */\nfunction nameDescriptionProblem(\n kind: string,\n parsed: Record<string, unknown>,\n dirName: string,\n e: { path: string; message: string },\n): string | undefined {\n if (e.path === \"name\") {\n const name = parsed.name;\n if ((name ?? null) === null) {\n return `name is required: add \\`name: ${dirName}\\` (lowercase kebab-case, the name of the ${kind})`;\n }\n if (typeof name !== \"string\") {\n return `name must be text: write \\`name: ${dirName}\\` (lowercase kebab-case, the name of the ${kind})`;\n }\n return undefined;\n }\n if (e.path === \"description\") {\n const description = parsed.description;\n if ((description ?? null) === null) {\n return `description is required: say what the ${kind} does and when to use it`;\n }\n if (typeof description !== \"string\") {\n return `description must be text: say what the ${kind} does and when to use it`;\n }\n if (description.trim() === \"\" && !e.message.startsWith(\"description is empty\")) {\n return `description: description is empty — say what the ${kind} does and when to use it`;\n }\n }\n return undefined;\n}\n\n/**\n * The one per-asset check list behind `skaile validate`, `skaile library index`\n * and `skaile library publish`. Errors: an asset name that is not canonical (kebab-case,\n * at most 64 characters), a declared version that is not semver, the kind's manifest schema,\n * a `TODO:` scaffold description (every kind; the skill schema already refuses it), the\n * untouched flow/preset scaffold, and for flows the flow engine's own definition parser —\n * a flow the engine cannot load is no flow. A missing version reads as 0.1.0 and an empty\n * `metadata:` as absent for every scaffolded kind. Advisories (the untouched `library create` body,\n * agentskills.io conformance): {@link checkAssetManifest}.\n *\n * @param kind Asset kind of the manifest.\n * @param parsed Parsed manifest (frontmatter for markdown kinds, the document for YAML).\n * @param body The markdown body after the frontmatter (`undefined` for YAML kinds).\n * @param dirName The manifest's parent folder name (enables the skill name==dir rule).\n * @param registry The kind registry that owns each kind's manifest schema.\n * @param rawText The manifest file text, to show a yaml-number version as the author wrote it.\n * @param fileName Base name of the manifest file; a flow's `id:` must match its stem (p670).\n * @param agentFiles Where the agent lives (`dir`) and the library holding it: an agent's local\n * `composes[].ref` paths and memory sources are checked against them. With `fileName`\n * `agent.yaml` the definition checks (composed kinds, slots, deprecated fields) run too, so\n * `validate`, `library index` and the publish plan refuse the same agents (p415). With\n * `composeRefs` a `composes[]` ref no library holds fails the agent too.\n */\nexport function checkAsset(\n kind: string,\n parsed: Record<string, unknown>,\n body: string | undefined,\n dirName: string,\n registry: IAssetKindRegistry,\n rawText?: string,\n fileName?: string,\n agentFiles?: { dir: string; libraryRoot: string; composeRefs?: ComposeRefContext },\n): AssetCheckResult {\n const errors: AssetFinding[] = [];\n const error = (text: string): void => {\n errors.push({ tag: kind, text, conformance: false });\n };\n\n const identity = manifestIdentityError(kind, parsed);\n if (identity) error(identity);\n const flowFileError = kind === \"flow\" ? flowFileNameError(parsed, fileName) : undefined;\n if (flowFileError) error(flowFileError);\n\n const semver = versionProblemText(parsed, rawText);\n if (semver) error(semver);\n\n const effective = withManifestDefaults(kind, parsed);\n // A markdown kind carries its version in the `metadata:` block, every other kind at the top level.\n const versionKey = [\"skill\", \"prompt\", \"contract\"].includes(kind)\n ? \"metadata.version\"\n : \"version\";\n const provider = registry.getProvider(kind);\n // The paths the kind schema already reported, so the flow definition parser does not repeat them.\n const reported = new Set<string>();\n if (!provider) {\n error(`unknown_asset_kind: kind \"${kind}\" is not registered`);\n } else {\n const result = provider.validateManifest(effective);\n if (!result.ok) {\n for (const e of result.errors) {\n if (e.path === \"version\" || e.path === \"metadata.version\") {\n // The semver text above already names a version that is present but wrong.\n if (!semver) {\n error(`${e.path}: must be a semver string — set ${versionKey}: ${DEFAULT_VERSION}`);\n }\n continue;\n }\n reported.add(e.path);\n const plain = nameDescriptionProblem(kind, parsed, dirName, e);\n if (plain) {\n error(plain);\n continue;\n }\n error(`${e.path ? `${e.path}: ` : \"\"}${e.message}`);\n }\n }\n }\n\n // The skill schema refuses the scaffold description itself; every other kind says so here,\n // in the same words, so no kind ships `TODO: describe this …`.\n const description = parsed.description;\n if (\n kind !== \"skill\" &&\n typeof description === \"string\" &&\n description.trim().startsWith(SKILL_DESCRIPTION_PLACEHOLDER_PREFIX)\n ) {\n error(\n `description: description is still the scaffold placeholder (${SKILL_DESCRIPTION_PLACEHOLDER_PREFIX} …) — say what the ${kind} does and when to use it`,\n );\n }\n for (const text of scaffoldDefinitionErrors(kind, parsed)) error(text);\n for (const text of referenceErrors(kind, parsed, registry, fileName)) error(text);\n\n if (kind === \"flow\") {\n // The flow schema has no `description`, the other kinds do: a flow without one is refused in the\n // words of every other kind (p1402).\n if (!reported.has(\"description\")) {\n const plain = nameDescriptionProblem(kind, parsed, dirName, {\n path: \"description\",\n message: \"\",\n });\n if (plain) {\n error(plain);\n reported.add(\"description\");\n }\n }\n const flow = parseFlowDefinition(effective);\n if (!flow.ok) {\n for (const e of flow.errors) {\n // The kind schema already said it, in plain words: say it once.\n if (reported.has(e.path)) continue;\n error(`invalid flow definition: ${e.path || \"<root>\"}: ${e.message}`);\n }\n }\n }\n\n // The untouched `library create` body is flagged as an advisory carrying `scaffoldBody`: an error\n // in `validate` and the publish plan (a passing `validate` means the asset can be published), a\n // warning in `library index` (the local dev loop) that says publish refuses it (p675).\n const advisories = checkAssetManifest(kind, parsed, body, dirName);\n advisories.push(...unheldRequiresFindings(kind, parsed, fileName, agentFiles?.composeRefs));\n if (kind === \"agent\") {\n if (fileName === \"agent.yaml\") {\n const definition = checkAgentDefinition(parsed, registry);\n errors.push(...definition.errors);\n advisories.push(...definition.advisories);\n }\n if (agentFiles) errors.push(...checkAgentFiles(parsed, agentFiles.dir, agentFiles.libraryRoot));\n if (agentFiles?.composeRefs) {\n errors.push(...agentComposeRefProblems(parsed, agentFiles.composeRefs));\n }\n }\n return { errors, advisories };\n}\n\n/**\n * Locate the manifest file of a first-party asset inside its `root` directory:\n * `SKILL.md`, `agent.yaml` / `AGENT.md`, `CONTRACT.md`, `PERSONA.md`, `RULESET.md`,\n * `<name>.prompt.md`, `<name>.flow.yaml` / `.flow.json` or `<name>.preset.yaml`. `null` when none\n * exists.\n */\nexport function findAssetManifestFile(dir: string, kind: string, name: string): string | null {\n const candidates: string[] = [];\n if (kind === \"skill\") candidates.push(\"SKILL.md\");\n else if (kind === \"agent\") candidates.push(\"agent.yaml\", \"AGENT.md\");\n else if (kind === \"contract\") candidates.push(\"CONTRACT.md\");\n else if (kind === \"persona\") candidates.push(\"PERSONA.md\");\n else if (kind === \"ruleset\") candidates.push(\"RULESET.md\");\n else if (kind === \"prompt\") candidates.push(`${name}.prompt.md`);\n else if (kind === \"flow\") candidates.push(`${name}.flow.yaml`, `${name}.flow.json`);\n else if (kind === \"preset\") candidates.push(`${name}.preset.yaml`);\n for (const c of candidates) {\n const file = path.join(dir, c);\n if (fs.existsSync(file)) return file;\n }\n // A single prompt/flow/preset file whose name differs from the entry name.\n const suffix =\n kind === \"prompt\"\n ? \".prompt.md\"\n : kind === \"flow\"\n ? \".flow.yaml\"\n : kind === \"preset\"\n ? \".preset.yaml\"\n : null;\n if (suffix && fs.existsSync(dir)) {\n const matches = fs.readdirSync(dir).filter((f) => f.endsWith(suffix));\n if (matches.length === 1) return path.join(dir, matches[0]);\n }\n return null;\n}\n\n/**\n * The manifest file of a first-party manifest entry: inside its `root:` directory\n * ({@link findAssetManifestFile}), or among the files a `files:`-only entry lists (p1201).\n * `null` for a curated entry or when none exists.\n */\nexport function findEntryManifestFile(\n libraryPath: string,\n entry: Pick<AssetEntry, \"kind\" | \"name\" | \"root\" | \"files\" | \"source\">,\n): string | null {\n if (entry.root) {\n return findAssetManifestFile(path.join(libraryPath, entry.root), entry.kind, entry.name);\n }\n const listed = filesEntryPaths(libraryPath, entry as AssetEntry);\n if (!listed) return null;\n const listedAbs = new Set(listed.map((f) => path.resolve(libraryPath, f)));\n for (const f of listed) {\n const dir = path.dirname(path.join(libraryPath, f));\n const found = findAssetManifestFile(dir, entry.kind, entry.name);\n if (found && listedAbs.has(path.resolve(found))) return found;\n }\n return null;\n}\n\n/**\n * The {@link checkAsset} errors of one manifest file on disk — what `library index`\n * asks of each asset before it writes it into the manifest. A file that cannot be\n * read or parsed yields none: the parse failure is reported by whoever owns it.\n * The untouched `library create` body is an error too, for all six kinds: a passing\n * check means the asset can be published (p1020).\n *\n * @param file Absolute path of the manifest file.\n * @param kind Asset kind of the manifest.\n * @param registry The kind registry that owns each kind's manifest schema.\n * @param libraryRoot The library holding the asset; an agent's local files are checked against it.\n * @param composeRefs What an agent's `composes[]` refs resolve against; without it they are not checked.\n */\nexport function checkAssetFile(\n file: string,\n kind: string,\n registry: IAssetKindRegistry,\n libraryRoot?: string,\n composeRefs?: ComposeRefContext,\n): AssetFinding[] {\n let text: string;\n try {\n text = fs.readFileSync(file, \"utf8\");\n } catch {\n return [];\n }\n const res = parseManifestFile(file, text);\n if (!res.ok) return [];\n const checked = checkAsset(\n kind,\n res.data,\n readAssetBody(file, text),\n path.basename(path.dirname(file)),\n registry,\n text,\n path.basename(file),\n libraryRoot === undefined\n ? undefined\n : { dir: path.dirname(file), libraryRoot, ...(composeRefs ? { composeRefs } : {}) },\n );\n return [...checked.errors, ...checked.advisories.filter((f) => f.scaffoldBody)];\n}\n\n/**\n * The lines `skaile validate` prints for a library asset that fails its kind checks, as `add` shows\n * them before it refuses the asset (p1550): `<file> [<tag>] — <text>`, the file relative to the\n * library. The untouched `library create` scaffold is not one: `add` deploys it with its own\n * warning. A source that is a folder is read through its manifest file.\n *\n * @param asset The library entry (`source` is the manifest file or its folder).\n * @param libraryPath The library holding it.\n */\nexport function libraryAssetRefusals(\n asset: { kind: string; name: string; source: string },\n libraryPath: string,\n registry: IAssetKindRegistry,\n): string[] {\n let file: string | null = asset.source;\n try {\n if (fs.statSync(file).isDirectory()) file = findAssetManifestFile(file, asset.kind, asset.name);\n } catch {\n return [];\n }\n // `validate` checks a file only when its name is the manifest file of a kind (`MANIFEST_GLOBS`).\n // A source asset whose `source` is a companion file of a folder agent (`DUTIES.md`) is no\n // manifest: the verdict stays `validate`'s, which does not look at it.\n if (!file || manifestKindOfFile(file) !== asset.kind) return [];\n const rel = path.relative(libraryPath, file).split(path.sep).join(\"/\");\n // `checkAssetFile` yields nothing for a file it cannot parse (the parse failure belongs to\n // whoever owns the file), so `add` reads it first: a file `library index` skips is no asset.\n try {\n const parsed = parseManifestFile(file, fs.readFileSync(file, \"utf8\"));\n if (!parsed.ok) return [`${rel} [${asset.kind}] — ${manifestParseErrorText(parsed.reason)}`];\n } catch {\n return [];\n }\n return checkAssetFile(file, asset.kind, registry, libraryPath)\n .filter((f) => !f.scaffoldBody && !/scaffold placeholder|placeholder \\(/i.test(f.text))\n .map((f) => `${rel} [${f.tag}] — ${f.text}`);\n}\n\n/**\n * The `requires:` entries of one manifest file on disk that no registered library holds\n * ({@link unheldRequiresFindings}); `library index` prints them as warnings (p1200). A file that\n * cannot be read or parsed yields none.\n */\nexport function unheldRequiresOfFile(\n file: string,\n kind: string,\n context: ComposeRefContext,\n): AssetFinding[] {\n try {\n const res = parseManifestFile(file, fs.readFileSync(file, \"utf8\"));\n return res.ok ? unheldRequiresFindings(kind, res.data, path.basename(file), context) : [];\n } catch {\n return [];\n }\n}\n","/**\n * Shared store-interaction core for the two publish front-ends — the curator\n * sidecar flow (`source manifest publish`) and the first-party library flow\n * (`library publish`). Both differ only in their git side-effects + how they\n * resolve the source repo; the store orchestration below (register → sync →\n * candidates → per-asset preview+publish) is identical.\n *\n * The store REST surface is reached through the injectable {@link PublisherClient}\n * so the orchestration stays unit/integration-testable without a live store.\n *\n * @docLink cli/commands/source#manifest-publish\n */\n\nimport { SKAILE_MANIFEST_FILENAME, type SkPublishManifest } from \"@skaile/workspaces/core\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport type { PublisherClient } from \"../store-publisher.ts\";\n\n/**\n * One-line rendering of a namespace-availability probe for a `--dry-run` plan.\n * The `message` is store-authored (identical to what a real publish would echo)\n * — we only prepend a status glyph so the reader sees green/amber/red at a\n * glance without the CLI re-deriving any authorization logic.\n */\nexport function formatNamespaceAvailability(a: {\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n message: string;\n}): string {\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return `${S.ok(\"✓\")} ${a.message}`;\n case \"claimable-by-you\":\n return `${S.warn(\"!\")} ${a.message}`;\n default:\n return `${S.err(\"✗\")} ${a.message}`;\n }\n}\n\n/**\n * Preflight the target namespace against the store's availability probe BEFORE a\n * publish does any irreversible work (a public git push). Returns `{ ok: false }`\n * with a guided message for `reserved` (not yours) and `claimable-by-you` (must\n * claim first) — the two states a real publish would reject — so the caller can\n * abort with actionable guidance instead of a raw 422 after pushing bytes.\n *\n * The probe is advisory: any failure (offline, older store) returns `{ ok: true }`\n * so the store stays the authority and a valid publish is never blocked.\n */\nexport async function preflightNamespace(\n client: PublisherClient,\n namespace: string,\n): Promise<{ ok: boolean; message?: string }> {\n let a: Awaited<ReturnType<PublisherClient[\"namespaceAvailability\"]>>;\n try {\n a = await client.namespaceAvailability(namespace);\n } catch {\n return { ok: true };\n }\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return { ok: true };\n case \"claimable-by-you\":\n return {\n ok: false,\n message:\n `@${namespace} isn't yours yet — claim it in the store first` +\n `${a.claimMethod ? ` (${a.claimMethod})` : \"\"}, then re-run. ${a.message}`,\n };\n default: // reserved, or any unrecognized future status (fail safe → block)\n return { ok: false, message: `Cannot publish under @${namespace} — ${a.message}` };\n }\n}\n\n/** One candidate row shape the matcher operates on (kind + name are the key). */\ninterface CandidateLike {\n kind: string;\n name: string;\n}\n\n/**\n * Keep only candidates whose `(kind, name)` pair is declared in the manifest.\n * The backend may merge extra assets from the base repo into the candidate\n * list; a publish only touches what the manifest curated/declared.\n */\nexport function matchCandidatesToManifest<T extends CandidateLike>(\n candidates: T[],\n manifest: SkPublishManifest,\n): T[] {\n const wanted = new Set((manifest.assets ?? []).map((a) => `${a.kind}:${a.name}`));\n return candidates.filter((c) => wanted.has(`${c.kind}:${c.name}`));\n}\n\n/** A canonical ref string `kind:@publisher/name[#version]` for reporting. */\nexport function refFor(kind: string, publisher: string, name: string, version?: string): string {\n const base = `${kind}:@${publisher}/${name}`;\n return version ? `${base}#${version}` : base;\n}\n\n/** Placeholder namespace shown when neither the asset nor the manifest names a publisher. */\nconst UNSET_NAMESPACE = \"<manifest publisher>\";\n\n/**\n * The publisher namespace one manifest asset publishes under:\n * `assets[].publisher` first, else the manifest's top-level `publisher` —\n * the same priority discovery applies when it indexes the asset. `undefined`\n * when neither is declared.\n */\nexport function assetNamespace(\n asset: { publisher?: string },\n manifest: SkPublishManifest,\n): string | undefined {\n return asset.publisher ?? manifest.publisher;\n}\n\n/**\n * The version-less canonical ref of one manifest asset for messages:\n * `kind:@<publisher>/<name>` (`assets[].publisher ?? publisher`), or the bare\n * `kind:name` when the manifest declares no namespace.\n */\nexport function assetEntryRef(\n asset: { kind: string; name: string; publisher?: string },\n manifest: SkPublishManifest,\n): string {\n const ns = assetNamespace(asset, manifest);\n return ns ? refFor(asset.kind, ns, asset.name) : `${asset.kind}:${asset.name}`;\n}\n\n/**\n * The warning `skaile validate` and the publish plan print when a manifest\n * entry's `version` differs from the one in the asset's own file. The file is\n * the source of truth; `skaile library index` rewrites the entry from it.\n *\n * @param entryRef - {@link assetEntryRef} of the entry.\n * @param relFile - the asset file, relative to the library root (posix).\n */\nexport function manifestVersionMismatchMessage(\n entryRef: string,\n entryVersion: string,\n relFile: string,\n fileVersion: string,\n): string {\n return (\n `${SKAILE_MANIFEST_FILENAME} [assets] — ${entryRef}: manifest version ${entryVersion} ` +\n `differs from ${relFile} (${fileVersion}). The file is the source of truth: ` +\n \"bump the version there, then run `skaile library index <library>`.\"\n );\n}\n\n/**\n * Every distinct namespace the manifest's assets (optionally narrowed to\n * `assetName`) publish under, in first-seen order. A manifest whose assets\n * carry no namespace at all falls back to its top-level `publisher` so an\n * empty inventory still reports the namespace it would claim.\n */\nexport function manifestNamespaces(manifest: SkPublishManifest, assetName?: string): string[] {\n const out = new Set<string>();\n for (const a of manifest.assets ?? []) {\n if (assetName && a.name !== assetName) continue;\n const ns = assetNamespace(a, manifest);\n if (ns) out.add(ns);\n }\n if (out.size === 0 && manifest.publisher) out.add(manifest.publisher);\n return [...out];\n}\n\n/**\n * The canonical refs a publish would produce, one per manifest asset (optionally\n * narrowed to `assetName`), each under its own `assets[].publisher ?? publisher`.\n */\nexport function plannedRefs(manifest: SkPublishManifest, assetName?: string): string[] {\n return (manifest.assets ?? [])\n .filter((a) => !assetName || a.name === assetName)\n .map((a) =>\n refFor(\n a.kind,\n assetNamespace(a, manifest) ?? UNSET_NAMESPACE,\n a.name,\n a.version ?? manifest.version,\n ),\n );\n}\n\n/** The bare asset name from a `kind:@publisher/name#version` ref or a plain name. */\nexport function bareName(ref: string): string {\n const afterKind = ref.includes(\":\") ? ref.slice(ref.indexOf(\":\") + 1) : ref;\n const afterScope = afterKind.includes(\"/\")\n ? afterKind.slice(afterKind.indexOf(\"/\") + 1)\n : afterKind;\n return afterScope.split(\"#\")[0];\n}\n\n/**\n * Refuse a present-but-empty `--asset` (`--asset \"$UNSET\"`): an empty string is falsy, so it\n * would silently select every asset of a publish, register or yank.\n */\nexport function exitOnEmptyAsset(asset: string | undefined): void {\n if (asset !== undefined && asset.trim() === \"\") {\n logErr(\n \"--asset needs a ref (`kind:@publisher/name[#version]` or a name); it is empty. Drop the option to select every asset.\",\n );\n process.exit(1);\n }\n}\n\n/**\n * Poll a job until it leaves `running` or the deadline passes. Returns the last\n * observed state — the caller MUST treat a still-`running` result as a timeout\n * (not success), since it means the deadline was hit before the job finished.\n */\nexport async function pollJob(\n client: PublisherClient,\n jobId: string,\n intervalMs = 1_500,\n timeoutMs = 60_000,\n): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }> {\n const deadline = Date.now() + timeoutMs;\n let job = await client.jobGet(jobId);\n while (job.status === \"running\" && Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n job = await client.jobGet(jobId);\n }\n return job;\n}\n\n/**\n * True when a `sourcesAdd` rejection is a duplicate-URL conflict (the source is\n * already registered) — the only error the publish flow recovers from by looking\n * the existing row up. Every other failure (auth, 5xx, network) must propagate.\n */\nexport function isDupSourceError(err: unknown): boolean {\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();\n return /\\b409\\b|conflict|duplicate|already exists|already registered|unique/.test(msg);\n}\n\n/**\n * Register + sync the source, then publish its curated/declared candidates —\n * the store-side steps shared by both publish front-ends. Git side-effects (the\n * sidecar push, or the library commit+push) happen in the caller *before* this;\n * this function is purely store interaction.\n *\n * The sidecar front-end passes `sidecar` (so `sourcesAdd` carries the sidecar\n * pin); the library front-end omits it (the source repo IS the manifest host).\n * `assetName`, when set, narrows publication to the single candidate of that\n * name. Fatal store states (`sourcesAdd` non-dup failure) surface; sync failures\n * and empty candidate sets `process.exit(1)` with the same messages as before.\n */\nexport async function publishToStore(opts: {\n sourceUrl: string;\n ref: string;\n sidecar?: { url: string; ref: string };\n manifest: SkPublishManifest;\n assetName?: string;\n client: PublisherClient;\n}): Promise<{ published: string[] }> {\n const { sourceUrl, ref, sidecar, manifest, assetName, client: pub } = opts;\n\n let sourceId: string;\n try {\n const added = await pub.sourcesAdd({\n url: sourceUrl,\n ref,\n ...(sidecar ? { sidecarUrl: sidecar.url, sidecarRef: sidecar.ref } : {}),\n // Publish under the manifest's declared namespace; the store resolves a\n // claimed Publisher when it differs from the caller's login, else defaults\n // to `@<username>`. Omitted when the manifest carries no publisher.\n ...(manifest.publisher ? { namespace: manifest.publisher } : {}),\n });\n sourceId = added.id;\n } catch (err) {\n // Only a duplicate-url conflict is recoverable (source already registered);\n // auth/5xx/network failures must surface, not silently reuse a stale row.\n if (!isDupSourceError(err)) throw err;\n const rows = await pub.sourcesList();\n const found = rows.find((r) => r.url === sourceUrl);\n if (!found) {\n throw new Error(\n `Source ${sourceUrl} looked already-registered but no owned row matched: ` +\n `${err instanceof Error ? err.message : String(err)}`,\n );\n }\n sourceId = found.id;\n }\n\n const { jobId } = await pub.sourceSync(sourceId);\n const job = await pollJob(pub, jobId);\n if (job.status === \"failed\" || job.status === \"cancelled\") {\n const failed = (job.items ?? []).filter((i) => i.status === \"failed\");\n for (const i of failed) logErr(`sync: ${i.label}: ${i.error ?? \"failed\"}`);\n logErr(`Source sync ${job.status}.`);\n process.exit(1);\n }\n // A still-`running` job means the poll deadline was hit — do NOT proceed on an\n // unfinished sync (it would read incomplete candidates).\n if (job.status === \"running\") {\n logErr(\"Source sync timed out before completing — re-run `publish`, or check the store.\");\n process.exit(1);\n }\n\n let candidates = matchCandidatesToManifest(await pub.sourceCandidates(sourceId), manifest);\n if (assetName) candidates = candidates.filter((c) => c.name === assetName);\n if (candidates.length === 0) {\n logWarn(\"No candidates discovered — check the manifest and the source ref.\");\n process.exit(1);\n }\n\n const published: string[] = [];\n for (const c of candidates) {\n try {\n const preview = await pub.assetPreview(c.id);\n const res = await pub.assetPublish(c.id, { ref, files: preview.discoveredFiles });\n // Publish is async — wait for the job so we only report refs that actually\n // landed, not ones whose import is still in flight or about to fail.\n if (res.jobId) {\n const pubJob = await pollJob(pub, res.jobId);\n if (pubJob.status !== \"succeeded\") {\n const errs = (pubJob.items ?? [])\n .filter((i) => i.status === \"failed\")\n .map((i) => i.error)\n .filter(Boolean);\n logWarn(\n `Publish of ${c.kind}:${c.name} did not succeed (${pubJob.status})` +\n (errs.length ? `: ${errs.join(\"; \")}` : \"\"),\n );\n continue;\n }\n }\n published.push(refFor(c.kind, preview.candidate.publisherNamespace, c.name, c.version));\n } catch (err) {\n logWarn(\n `Failed to publish ${c.kind}:${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n logOk(`Published ${published.length} asset(s):`);\n for (const r of published) logInfo(` ${r}`);\n return { published };\n}\n","/**\n * Keycloak Device Authorization Grant (RFC 8628) for the store CLI: a public\n * device-flow client (`skaile-store-cli`) issues a plain realm JWT the store's\n * `AuthGuard` accepts — a CLI can't use the storefront's confidential browser\n * client. Tokens cache at `~/.skaile/auth.json` (0600, shared with `store/cli`);\n * `getAccessToken` refreshes transparently. All targets are env-overridable.\n *\n * @docLink cli/dev-guide#store-auth\n */\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { chmodSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { globalSkaileDir } from \"@skaile/workspaces/core\";\n\n/**\n * A PKCE (RFC 7636) `code_verifier` + its S256 `code_challenge`. Keycloak\n * enforces PKCE on the `skaile-store-cli` device flow (the device-authorization\n * request 400s with \"Missing parameter: code_challenge_method\" otherwise), so\n * every `deviceLogin` mints a fresh pair: the challenge goes on the device-auth\n * request, the verifier on the matching token poll. `base64url` (no padding)\n * per the spec.\n */\nfunction makePkcePair(): { verifier: string; challenge: string } {\n const verifier = randomBytes(32).toString(\"base64url\");\n const challenge = createHash(\"sha256\").update(verifier).digest(\"base64url\");\n return { verifier, challenge };\n}\n\n/** Resolved auth targets — every field has a prod default, all env-overridable. */\nexport interface StoreAuthConfig {\n keycloakUrl: string;\n realm: string;\n clientId: string;\n authFile: string;\n}\n\nfunction trimTrailingSlash(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\n/**\n * Load the auth config. Defaults target the production store\n * (`auth.skaile.ai`, realm `skaile-store`, public client `skaile-store-cli`);\n * override with `SKAILE_KEYCLOAK_URL` / `SKAILE_STORE_REALM` /\n * `SKAILE_STORE_CLI_CLIENT` / `SKAILE_AUTH_FILE` for dev or a preview deploy.\n */\nexport function loadStoreAuthConfig(): StoreAuthConfig {\n return {\n keycloakUrl: trimTrailingSlash(process.env.SKAILE_KEYCLOAK_URL ?? \"https://auth.skaile.ai\"),\n realm: process.env.SKAILE_STORE_REALM ?? \"skaile-store\",\n clientId: process.env.SKAILE_STORE_CLI_CLIENT ?? \"skaile-store-cli\",\n authFile: process.env.SKAILE_AUTH_FILE ?? join(globalSkaileDir(), \"auth.json\"),\n };\n}\n\n/** Keycloak OIDC endpoints derived from the realm base. */\nfunction oidc(config: StoreAuthConfig): { deviceAuth: string; token: string } {\n const base = `${config.keycloakUrl}/realms/${config.realm}/protocol/openid-connect`;\n return { deviceAuth: `${base}/auth/device`, token: `${base}/token` };\n}\n\nexport interface StoredAuth {\n access_token: string;\n refresh_token?: string;\n /** Epoch ms when the access token expires (with a safety margin already applied). */\n expires_at: number;\n}\n\ninterface TokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n}\n\ninterface DeviceAuthResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n interval?: number;\n expires_in: number;\n}\n\n/** Refresh this many ms before real expiry so an in-flight call never 401s. */\nconst EXPIRY_MARGIN_MS = 30_000;\n\n/** Injectable seams so the poll loop is unit-testable without real time or network. */\nexport interface AuthDeps {\n fetchImpl?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n /** Called once with the verification URL + user code (default: write to stderr). */\n onPrompt?: (url: string, userCode: string) => void;\n}\n\nfunction readAuth(config: StoreAuthConfig): StoredAuth | null {\n try {\n const parsed = JSON.parse(readFileSync(config.authFile, \"utf-8\"));\n // Reject a corrupt / hand-edited file rather than treat it as a session.\n if (parsed && typeof parsed.access_token === \"string\") return parsed as StoredAuth;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * The caller's store identity, decoded LOCALLY from the cached token's JWT\n * payload (no network, no signature check — this is an author-side hint, not an\n * authorization decision). Returns `null` when not signed in or the token is\n * unreadable. `githubLogin` is the verified GitHub handle (the preferred\n * publisher namespace); `username` is the Keycloak `preferred_username`.\n */\nexport function getStoreIdentity(\n config: StoreAuthConfig = loadStoreAuthConfig(),\n): { username?: string; githubLogin?: string } | null {\n const auth = readAuth(config);\n if (!auth) return null;\n try {\n const payload = auth.access_token.split(\".\")[1];\n const json = JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf-8\"));\n const username =\n typeof json.preferred_username === \"string\" ? json.preferred_username : undefined;\n const githubLogin = typeof json.github_login === \"string\" ? json.github_login : undefined;\n return username || githubLogin ? { username, githubLogin } : null;\n } catch {\n return null;\n }\n}\n\nfunction writeAuth(config: StoreAuthConfig, auth: StoredAuth): void {\n mkdirSync(dirname(config.authFile), { recursive: true });\n writeFileSync(config.authFile, JSON.stringify(auth, null, 2), { mode: 0o600 });\n chmodSync(config.authFile, 0o600);\n}\n\n/** Remove the cached session (sign out). */\nexport function logout(config: StoreAuthConfig): void {\n try {\n rmSync(config.authFile);\n } catch {\n // already absent — nothing to do\n }\n}\n\n/** True when a cached, well-formed session exists (validity/refresh resolved on use). */\nexport function hasStoredAuth(config: StoreAuthConfig): boolean {\n return readAuth(config) !== null;\n}\n\nfunction tokenToStored(token: TokenResponse): StoredAuth {\n return {\n access_token: token.access_token,\n refresh_token: token.refresh_token,\n expires_at: Date.now() + (token.expires_in ?? 300) * 1000 - EXPIRY_MARGIN_MS,\n };\n}\n\nconst defaultSleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\nfunction defaultPrompt(url: string, userCode: string): void {\n process.stderr.write(\n `\\nTo sign in, open:\\n\\n ${url}\\n\\nand enter the code: ${userCode}\\n\\nWaiting for approval…\\n`,\n );\n}\n\n/**\n * Run the device flow to completion, persisting tokens on success. Prints the\n * verification URL + user code for the operator to approve in a browser.\n */\nexport async function deviceLogin(\n config: StoreAuthConfig,\n deps: AuthDeps = {},\n): Promise<StoredAuth> {\n const fetchImpl = deps.fetchImpl ?? fetch;\n const sleep = deps.sleep ?? defaultSleep;\n const onPrompt = deps.onPrompt ?? defaultPrompt;\n const endpoints = oidc(config);\n const pkce = makePkcePair();\n\n const deviceRes = await fetchImpl(endpoints.deviceAuth, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n client_id: config.clientId,\n scope: \"openid profile\",\n code_challenge: pkce.challenge,\n code_challenge_method: \"S256\",\n }),\n });\n if (!deviceRes.ok) {\n throw new Error(\n `Device authorization request failed (${deviceRes.status}): ${await deviceRes.text()}`,\n );\n }\n const device = (await deviceRes.json()) as DeviceAuthResponse;\n\n onPrompt(device.verification_uri_complete ?? device.verification_uri, device.user_code);\n\n const intervalMs = (device.interval ?? 5) * 1000;\n const deadline = Date.now() + device.expires_in * 1000;\n let waitMs = intervalMs;\n\n while (Date.now() < deadline) {\n await sleep(waitMs);\n const tokenRes = await fetchImpl(endpoints.token, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: device.device_code,\n client_id: config.clientId,\n code_verifier: pkce.verifier,\n }),\n });\n const token = (await tokenRes.json()) as TokenResponse;\n if (tokenRes.ok) {\n const stored = tokenToStored(token);\n writeAuth(config, stored);\n return stored;\n }\n // RFC 8628 §3.5 pending / slow-down handling.\n if (token.error === \"authorization_pending\") continue;\n if (token.error === \"slow_down\") {\n waitMs += 5_000;\n continue;\n }\n throw new Error(`Sign-in failed: ${token.error_description ?? token.error ?? \"unknown error\"}`);\n }\n throw new Error(\"Sign-in timed out before approval.\");\n}\n\n/** Exchange a refresh token for a fresh access token; persist on success. */\nasync function refresh(\n config: StoreAuthConfig,\n refreshToken: string,\n fetchImpl: typeof fetch,\n): Promise<StoredAuth> {\n const res = await fetchImpl(oidc(config).token, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: config.clientId,\n }),\n });\n const token = (await res.json()) as TokenResponse;\n if (!res.ok) {\n throw new Error(\n `Token refresh failed: ${token.error_description ?? token.error ?? res.status}`,\n );\n }\n const stored = tokenToStored(token);\n writeAuth(config, stored);\n return stored;\n}\n\n/**\n * Return a valid access token, refreshing if it is expired (or about to). Throws\n * a clear \"run `skaile store login`\" error when there is no usable session.\n */\nexport async function getAccessToken(\n config: StoreAuthConfig,\n deps: AuthDeps = {},\n): Promise<string> {\n const fetchImpl = deps.fetchImpl ?? fetch;\n const auth = readAuth(config);\n if (!auth) throw new Error(\"Not signed in. Run `skaile store login` first.\");\n if (Date.now() < auth.expires_at) return auth.access_token;\n if (!auth.refresh_token) throw new Error(\"Session expired. Run `skaile store login` again.\");\n try {\n return (await refresh(config, auth.refresh_token, fetchImpl)).access_token;\n } catch {\n throw new Error(\"Session expired and refresh failed. Run `skaile store login` again.\");\n }\n}\n","/**\n * library-index.ts — index a user library's on-disk assets into the shared\n * `asset_definitions` index so `add` / `asset install` / `search --local` can\n * resolve them, plus publisher resolution for a freshly-created asset.\n *\n * A `library create`d asset is bytes on disk only until it is indexed; the\n * index is what every resolution path reads. Indexing reuses the same\n * `LocalCatalogSource.sync()` engine `source add`/`sync` run — a library is\n * scanned + upserted keyed by `library_id = lib.id`.\n *\n * @docLink cli/commands/library\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n isValidPublisher,\n loadSkPublishManifest,\n matchPin,\n parseDep,\n parseFrontmatter,\n PUBLISHER_HINT,\n SKAILE_MANIFEST_FILENAME,\n slugifyAssetName,\n} from \"@skaile/workspaces/core\";\nimport {\n expandManifestFiles,\n librarySymlinkMessage,\n listLibrarySymlinks,\n} from \"@skaile/workspaces/core/publish-manifest\";\nimport {\n type DiscoveredAsset,\n parseManifestFile,\n requiresSyntaxErrors,\n} from \"@skaile/workspaces/discovery\";\nimport {\n assetRootProblem,\n type Library,\n LocalIndex,\n resolveIndexPath,\n stampManifestPublisher,\n upsertManifestAsset,\n} from \"@skaile/workspaces/library\";\nimport { Option } from \"commander\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { logErr, logWarn } from \"../helpers.ts\";\nimport { openLibrary } from \"../open-library.ts\";\nimport { getKindRegistry } from \"../open-registry.ts\";\nimport {\n findAssetManifestFile,\n manifestKindOfFile,\n manifestParseErrorText,\n} from \"../skill-checks.ts\";\nimport { getStoreIdentity } from \"../store-auth.ts\";\nimport { assetEntryRef, refFor } from \"./publish-core.ts\";\n\n/** One malformed `assets[].dependencies` entry of a library's `skaile.manifest.yaml`. */\nexport interface ManifestRequiresProblem {\n /** `kind:name` of the manifest asset that declares the entry. */\n asset: string;\n /** `ManifestRequiresError: invalid requires entry \"<entry>\"` — the text discovery reports. */\n message: string;\n}\n\n/**\n * Check every `assets[].dependencies` entry of `<dir>/skaile.manifest.yaml` with\n * the discovery syntax rule. Reads the raw YAML on purpose: `decodeSkaileManifest`\n * drops a malformed dependency (with a warning) before discovery or the index ever\n * sees it, so only the raw text can say which entry is wrong. Shared by\n * `skaile validate` and `skaile library index`, so both fail with the same message.\n */\nexport function manifestRequiresProblems(dir: string): ManifestRequiresProblem[] {\n const file = path.join(dir, \"skaile.manifest.yaml\");\n let doc: unknown;\n try {\n doc = parseYaml(fs.readFileSync(file, \"utf-8\"));\n } catch {\n return []; // absent / unparsable: reported by the loaders that own that failure\n }\n const assets = (doc as { assets?: unknown } | null)?.assets;\n if (!Array.isArray(assets)) return [];\n const problems: ManifestRequiresProblem[] = [];\n for (const a of assets) {\n if (!a || typeof a !== \"object\") continue;\n const { kind, name, dependencies } = a as Record<string, unknown>;\n if (!Array.isArray(dependencies)) continue;\n const entries = dependencies.map((d) => (typeof d === \"string\" ? d : String(d)));\n for (const message of requiresSyntaxErrors(entries)) {\n problems.push({\n asset: `${String(kind)}:${String(name)}`,\n message: `ManifestRequiresError: ${message}`,\n });\n }\n }\n return problems;\n}\n\n/**\n * `publisher/kind:name` → the versions registered libraries hold, read offline: the library\n * at `dir` itself (its manifest), the assets in the local index (`index.db`) and the manifest\n * of every library the index lists. The index never gets created for this: no `index.db`\n * means only `dir` counts.\n */\nasync function knownAssetVersions(dir: string): Promise<Record<string, string[]>> {\n const known: Record<string, string[]> = {};\n const add = (publisher: string | undefined, kind: string, name: string, version?: string) => {\n if (!publisher) return;\n const key = `${publisher.replace(/^@/, \"\")}/${kind}:${name}`;\n const versions = known[key] ?? [];\n if (version && !versions.includes(version)) versions.push(version);\n known[key] = versions;\n };\n const addManifest = (libPath: string): void => {\n const manifest = loadSkPublishManifest(libPath);\n for (const a of manifest?.assets ?? []) {\n add(a.publisher ?? manifest?.publisher, a.kind, a.name, a.version);\n }\n };\n addManifest(dir);\n const indexPath = resolveIndexPath();\n if (!fs.existsSync(indexPath)) return known;\n const index = new LocalIndex({ indexPath, kindRegistry: getKindRegistry() });\n try {\n for (const def of await index.listAssetDefs())\n add(def.publisher, def.kind, def.name, def.version);\n for (const lib of await index.listSources()) {\n if (path.resolve(lib.path) !== path.resolve(dir) && fs.existsSync(lib.path)) {\n addManifest(lib.path);\n }\n }\n } catch {\n // An unreadable index only narrows what counts as known.\n } finally {\n index.close();\n }\n return known;\n}\n\n/**\n * The `publisher/kind:name` keys of every asset a registered library (and the library at `dir`)\n * holds, read offline as {@link unresolvedManifestDependencies} does: what an agent's\n * `composes[]` refs resolve against besides the library being checked (p415).\n */\nexport async function registeredAssetKeys(dir: string): Promise<Set<string>> {\n return new Set(Object.keys(await knownAssetVersions(dir)));\n}\n\n/** One `assets[].dependencies` entry the offline holder check objects to. */\nexport interface ManifestDependencyProblem {\n /** `kind:name` of the manifest asset that declares the entry. */\n asset: string;\n /** The printed warning line. */\n message: string;\n /** Canonical `kind:@publisher/name` when no registered library holds it at all (a pin problem has none). */\n unheldRef?: string;\n}\n\n/**\n * Every `assets[].dependencies` entry of `<dir>/skaile.manifest.yaml` that no registered library\n * (nor the library itself) holds, or whose `#version` pin matches none of the versions held.\n * Offline: it never asks the store, so a store-only dependency is reported too — the line says\n * what was checked. Entries with invalid syntax are {@link manifestRequiresProblems}' to report.\n */\nexport async function manifestDependencyProblems(\n dir: string,\n): Promise<ManifestDependencyProblem[]> {\n let doc: unknown;\n try {\n doc = parseYaml(fs.readFileSync(path.join(dir, SKAILE_MANIFEST_FILENAME), \"utf-8\"));\n } catch {\n return [];\n }\n const assets = (doc as { assets?: unknown } | null)?.assets;\n if (!Array.isArray(assets)) return [];\n const wanted: Array<{ asset: string; entry: string }> = [];\n for (const a of assets) {\n if (!a || typeof a !== \"object\") continue;\n const { kind, name, dependencies } = a as Record<string, unknown>;\n if (!Array.isArray(dependencies)) continue;\n for (const d of dependencies) {\n const entry = typeof d === \"string\" ? d : String(d);\n if (requiresSyntaxErrors([entry]).length === 0) {\n wanted.push({ asset: `${String(kind)}:${String(name)}`, entry });\n }\n }\n }\n if (wanted.length === 0) return [];\n const known = await knownAssetVersions(dir);\n const out: ManifestDependencyProblem[] = [];\n for (const { asset, entry } of wanted) {\n const dep = parseDep(entry);\n if (!dep.publisher) continue; // the syntax check reports a publisher-less entry\n const versions = known[`${dep.publisher}/${dep.kind}:${dep.name}`];\n const prefix = `${SKAILE_MANIFEST_FILENAME} [assets] — ${asset}: dependency \"${entry}\"`;\n if (!versions) {\n out.push({\n asset,\n unheldRef: `${dep.kind}:@${dep.publisher.replace(/^@/, \"\")}/${dep.name}`,\n message: `${prefix} is not held by any registered library (checked offline: this library and the local index; the store was not asked).`,\n });\n } else if (dep.pin && versions.length > 0 && !versions.some((v) => matchPin(dep.pin, v))) {\n out.push({\n asset,\n message: `${prefix} has no version matching \"${dep.pin}\" in any registered library (held: ${versions.join(\", \")}).`,\n });\n }\n }\n return out;\n}\n\n/** One warning line per entry {@link manifestDependencyProblems} reports. Shared by `skaile validate` and `skaile library index`. */\nexport async function unresolvedManifestDependencies(dir: string): Promise<string[]> {\n return (await manifestDependencyProblems(dir)).map((p) => p.message);\n}\n\n/** The one refusal text for a publisher that fails {@link isValidPublisher}. */\nexport function invalidPublisherMessage(raw: string): string {\n return `Invalid publisher \"${raw}\": ${PUBLISHER_HINT}.`;\n}\n\n/**\n * Validate a publisher typed on the command line (`--publisher`, `library set\n * <lib> publisher=`): strip a leading `@`, and exit 1 with {@link invalidPublisherMessage}\n * when it is not a valid slug. Returns the bare publisher.\n */\nexport function requireValidPublisherOrExit(raw: string): string {\n const bare = raw.trim().replace(/^@/, \"\");\n if (!isValidPublisher(bare)) {\n logErr(invalidPublisherMessage(raw));\n process.exit(1);\n }\n return bare;\n}\n\n/**\n * Every publisher in `<dir>/skaile.manifest.yaml` (top-level and `assets[].publisher`)\n * that is not a valid slug, one message each. Reads the raw YAML like\n * {@link manifestRequiresProblems}. Shared by `skaile validate`, `skaile library index`\n * and the publish plan, so all three refuse a publisher with the same text.\n */\nexport function manifestPublisherProblems(dir: string): string[] {\n let doc: unknown;\n try {\n doc = parseYaml(fs.readFileSync(path.join(dir, SKAILE_MANIFEST_FILENAME), \"utf-8\"));\n } catch {\n return []; // absent / unparsable: reported by the loaders that own that failure\n }\n if (!doc || typeof doc !== \"object\") return [];\n const { publisher, assets } = doc as { publisher?: unknown; assets?: unknown };\n const problems: string[] = [];\n const check = (value: unknown, where: string): void => {\n if (typeof value !== \"string\") return;\n if (!isValidPublisher(value.trim().replace(/^@/, \"\"))) {\n problems.push(`${SKAILE_MANIFEST_FILENAME} ${where} — ${invalidPublisherMessage(value)}`);\n }\n };\n check(publisher, \"[publisher]\");\n if (Array.isArray(assets)) {\n for (const a of assets) {\n if (!a || typeof a !== \"object\") continue;\n const { kind, name, publisher: assetPublisher } = a as Record<string, unknown>;\n check(assetPublisher, `[assets] ${String(kind)}:${String(name)}`);\n }\n }\n return problems;\n}\n\n/**\n * Exit 1 when `<dir>/skaile.manifest.yaml` names a publisher that is not a valid slug\n * ({@link manifestPublisherProblems}); the refusal `library create`, `asset import`,\n * `library index` and the publish plan share. `libName` is the registered library.\n */\nexport function exitOnManifestPublisherProblems(dir: string, libName: string): void {\n const problems = manifestPublisherProblems(dir);\n if (problems.length === 0) return;\n for (const message of problems) logErr(message);\n logErr(\n `Fix the publisher in ${SKAILE_MANIFEST_FILENAME} (\\`skaile library set ${libName} publisher=<name>\\` rewrites the library's own), then re-run.`,\n );\n process.exit(1);\n}\n\n/**\n * Every first-party manifest entry whose asset file names another asset than the entry does: the\n * author renamed the asset in its file (`name:` / flow `id:`) and did not re-run `library index`,\n * so the entry is a ghost ref `add` cannot resolve (p700). One message each; `validate` and the\n * publish plan refuse it, `library index` renames the entry.\n */\nexport function manifestEntryNameProblems(dir: string): string[] {\n const manifest = loadSkPublishManifest(dir);\n if (!manifest || manifest.source) return [];\n const problems: string[] = [];\n for (const entry of manifest.assets ?? []) {\n if (!entry.root || entry.source) continue;\n if (assetRootProblem(dir, entry.root)) continue;\n const file = findAssetManifestFile(path.join(dir, entry.root), entry.kind, entry.name);\n if (!file) continue;\n let parsedName: unknown;\n try {\n const res = parseManifestFile(file, fs.readFileSync(file, \"utf-8\"));\n if (!res.ok) continue;\n parsedName = entry.kind === \"flow\" ? res.data.id : res.data.name;\n } catch {\n continue;\n }\n if (typeof parsedName !== \"string\" || parsedName === \"\" || parsedName === entry.name) continue;\n problems.push(\n `${SKAILE_MANIFEST_FILENAME} [assets] ${entry.kind}:${entry.name} — ${path.relative(dir, file)} now names \"${parsedName}\": the entry is a ref \\`add\\` cannot resolve. Run \\`skaile library index <library>\\` to rename it, or restore the name.`,\n );\n }\n return problems;\n}\n\n/**\n * Every `assets[].root` of `<dir>/skaile.manifest.yaml` that cannot be an asset directory of\n * the library: it leaves the library (`..`, absolute) or crosses a symlink\n * ({@link assetRootProblem}). `add` scans the library directory, so it never finds such an\n * asset, and a published repo holds no files for it (p701). Reads the raw YAML like\n * {@link manifestPublisherProblems}; shared by `validate`, `library index` and the publish plan.\n */\nexport function manifestRootProblems(dir: string): string[] {\n let doc: unknown;\n try {\n doc = parseYaml(fs.readFileSync(path.join(dir, SKAILE_MANIFEST_FILENAME), \"utf-8\"));\n } catch {\n return [];\n }\n if (!doc || typeof doc !== \"object\") return [];\n const { assets } = doc as { assets?: unknown };\n if (!Array.isArray(assets)) return [];\n const problems: string[] = [];\n for (const a of assets) {\n if (!a || typeof a !== \"object\") continue;\n const { kind, name, root, source } = a as Record<string, unknown>;\n if (typeof root !== \"string\" || source !== undefined) continue;\n const problem = assetRootProblem(dir, root);\n if (problem) {\n problems.push(\n `${SKAILE_MANIFEST_FILENAME} [assets] ${String(kind)}:${String(name)} — ${problem}`,\n );\n }\n }\n return problems;\n}\n\n/**\n * Every `files:` entry of a first-party manifest asset that cannot be a file of the library:\n * a path that leaves the library (`..`, absolute: `add` ignores it and a published repo holds no\n * bytes for it, p1403, the `root:` rule of {@link manifestRootProblems}), and a plain path or\n * glob of a `files:`-only entry that names no file (p1201, p1404). One text per entry, shared by\n * `validate`, `library index` and the publish plan. A curated entry (`source:`) lists upstream\n * files and is skipped.\n */\nexport function manifestFilesProblems(dir: string): string[] {\n const manifest = loadSkPublishManifest(dir);\n if (!manifest || manifest.source) return [];\n const problems: string[] = [];\n for (const a of manifest.assets ?? []) {\n if (a.source || !Array.isArray(a.files) || a.files.length === 0) continue;\n const ref = assetEntryRef(a, manifest);\n const patterns = a.files.map((f) => (typeof f === \"string\" ? f : f.path)).filter(Boolean);\n const outside = patterns.filter(\n (p) => path.isAbsolute(p) || p.split(/[\\\\/]+/).includes(\"..\") || /^[a-zA-Z]:/.test(p),\n );\n if (outside.length > 0) {\n problems.push(\n `${SKAILE_MANIFEST_FILENAME} [assets] ${ref} — files: ${outside.join(\", \")} leaves the library: ` +\n \"`add` ignores it and a published repo has no file for it. Remove the entry from the `files:` list or move the file into the library.\",\n );\n continue;\n }\n if (a.root) continue; // the walk of a `root:` entry reports its own missing files\n const { unmatched } = expandManifestFiles(dir, patterns);\n if (unmatched.length > 0) {\n problems.push(\n `${SKAILE_MANIFEST_FILENAME} [assets] ${ref} — files: ${unmatched.join(\", \")} not found. ` +\n \"Fix the `files:` list or drop the entry.\",\n );\n }\n }\n return problems;\n}\n\n/**\n * Exit 1 when {@link manifestRootProblems} or {@link manifestFilesProblems} finds an entry;\n * `verb` names the command that stopped.\n */\nexport function exitOnManifestPathProblems(dir: string, verb: string): void {\n const problems = [...manifestRootProblems(dir), ...manifestFilesProblems(dir)];\n if (problems.length === 0) return;\n for (const message of problems) logErr(message);\n logErr(`Fix or remove the entry in ${SKAILE_MANIFEST_FILENAME}, then re-run \\`${verb}\\`.`);\n process.exit(1);\n}\n\n/**\n * Print the one refusal text ({@link librarySymlinkMessage}) for every symlink a library\n * refuses under `dir` ({@link listLibrarySymlinks}) and return how many there were.\n * `validate`, `library index`, `library publish`, `library init --path` and `asset import`\n * share it (p520).\n */\nexport function reportLibrarySymlinks(\n dir: string,\n opts?: Parameters<typeof listLibrarySymlinks>[1],\n): number {\n const links = listLibrarySymlinks(dir, opts);\n for (const link of links) logErr(librarySymlinkMessage(link));\n return links.length;\n}\n\n/**\n * Exit 1 when the library at `dir` holds any symlink (`git add -A` would commit it, and a\n * consumer's clone gets no files for it); `verb` names the command that stopped.\n */\nexport function exitOnLibrarySymlinks(dir: string, verb: string): void {\n const count = reportLibrarySymlinks(dir, { wholeTree: true });\n if (count === 0) return;\n logErr(`${count} symlink(s) in ${dir}: remove them, then re-run \\`${verb}\\`.`);\n process.exit(1);\n}\n\n/** Discovery result surfaced by {@link indexLibrary}. */\nexport interface IndexLibraryResult {\n /** Assets discovered on disk under the library root. */\n assetsFound: number;\n /** Assets upserted into `asset_definitions`. */\n assetsUpdated: number;\n /** Fatal per-asset errors (never advisories). */\n errors: string[];\n /** The entries of `errors` that name a manifest file the indexer could not parse. */\n unparsable: string[];\n}\n\n/**\n * The line `skaile validate` prints for a manifest file that cannot be parsed\n * (`<file> [<kind>] — parse error: <cause and fix>`, p1206), `undefined` when `rel` (relative to\n * the library at `libPath`) parses or is no file.\n */\nexport function manifestParseFailureLine(libPath: string, rel: string): string | undefined {\n const file = path.join(libPath, rel);\n try {\n if (!fs.statSync(file).isFile()) return undefined;\n const res = parseManifestFile(file, fs.readFileSync(file, \"utf-8\"));\n if (res.ok) return undefined;\n const kind = manifestKindOfFile(file) ?? \"asset\";\n return `${rel.split(path.sep).join(\"/\")} [${kind}] — ${manifestParseErrorText(res.reason)}`;\n } catch {\n return undefined;\n }\n}\n\n/**\n * One index error as the user reads it. The indexer reports a file it cannot parse as\n * `<path>: ManifestSchemaError: failed to parse manifest file <file>`; the text is the line\n * `skaile validate` prints for the same file ({@link manifestParseFailureLine}).\n */\nfunction parseFailureText(libPath: string, error: string): string {\n const m = /^(.*): ManifestSchemaError: failed to parse manifest file (.+)$/.exec(error);\n if (!m) return error;\n for (const rel of [m[1], path.join(m[1], m[2]), m[2]]) {\n const line = manifestParseFailureLine(libPath, rel);\n if (line) return line;\n }\n return error;\n}\n\n/**\n * Index a library's assets into the shared `asset_definitions` index.\n *\n * Runs `LocalCatalogSource.sync()` against the library's `path` keyed by\n * `library_id = lib.id`. Pass an already-open {@link LocalIndex} (e.g. the one\n * `openLibraryManager()` holds) to reuse the single connection — the caller then\n * owns closing it. With no `index` a fresh handle is opened and closed here.\n * `exclude` leaves matching discovered assets out of the index (`library index`\n * uses it for assets it refused to write into the manifest).\n * Returns the sync counters so a caller can report `Indexed N asset(s)`.\n */\nexport async function indexLibrary(\n lib: Library,\n index?: LocalIndex,\n opts: { exclude?: (asset: DiscoveredAsset) => boolean } = {},\n): Promise<IndexLibraryResult> {\n const { LocalCatalogSource } = await import(\"@skaile/workspaces/library\");\n const own = index ?? (await openLibrary());\n try {\n const source = new LocalCatalogSource(own, lib.id, lib.path, getKindRegistry());\n const res = await source.sync({ exclude: opts.exclude });\n if (res.pruned.length > 0) {\n // The index keeps one row per ref, so the rows this sync removed may be the\n // copy another library still holds (a library re-published a ref under a new\n // publisher). Put them back from that library's own directory.\n const lost = new Set(res.pruned);\n for (const other of await own.listSources()) {\n if (other.id === lib.id || other.backend !== \"local\" || !other.path) continue;\n if (!fs.existsSync(other.path)) continue;\n await new LocalCatalogSource(own, other.id, other.path, getKindRegistry()).sync({\n only: lost,\n });\n }\n }\n // A file that could not be parsed reads as `validate` says it, not as a class name (p1206).\n const unparsable: string[] = [];\n const errors = res.errors.map((e) => {\n const text = parseFailureText(lib.path, e);\n if (text !== e) unparsable.push(text);\n return text;\n });\n return {\n assetsFound: res.assetsFound,\n assetsUpdated: res.assetsUpdated,\n errors,\n unparsable,\n };\n } finally {\n if (!index) own.close();\n }\n}\n\n/** Where {@link resolveLibraryPublisherDetailed} found the publisher. */\nexport type LibraryPublisherSource = \"flag\" | \"manifest\" | \"identity\" | \"library-name\";\n\n/**\n * Resolve the publisher for an asset created inside a library. Never throws.\n *\n * Fallback chain (first hit wins):\n * 1. `opts.publisher` (an explicit `--publisher`),\n * 2. the library manifest's top-level `publisher` (`skaile.manifest.yaml`),\n * 3. the author's verified store identity (`githubLogin`, else `username`)\n * when signed in — the publisher they can actually publish under,\n * 4. the kebab-cased library name (e.g. `My Lib` → `my-lib`) as a last resort.\n *\n * The publisher is never derived from where the asset sits in the library:\n * every asset inherits the library's publisher unless it sets its own.\n *\n * Identity beats the library name because the library name is almost never a\n * namespace the author can publish; stamping it led to publishes that only\n * failed at the store. Passed in (not read here) to keep this pure + testable.\n *\n * @param lib - The target library.\n * @param opts - Optional explicit `--publisher`.\n * @param storeIdentity - The author's decoded store identity, or null when signed out.\n * @returns The bare publisher and which link of the chain supplied it.\n */\nexport function resolveLibraryPublisherDetailed(\n lib: Pick<Library, \"name\" | \"path\">,\n opts: { publisher?: string },\n storeIdentity?: { username?: string; githubLogin?: string } | null,\n): { publisher: string; source: LibraryPublisherSource } {\n const bare = (p: string) => (p.startsWith(\"@\") ? p.slice(1) : p);\n if (opts.publisher?.trim()) return { publisher: bare(opts.publisher.trim()), source: \"flag\" };\n const declared = loadSkPublishManifest(lib.path)?.publisher?.trim();\n if (declared) return { publisher: bare(declared), source: \"manifest\" };\n // A login is case-insensitive on GitHub, so fold it to the lowercase slug; one that\n // still fails the slug rule falls through to the library name.\n const identity = (storeIdentity?.githubLogin ?? storeIdentity?.username)?.trim().toLowerCase();\n if (identity && isValidPublisher(identity)) return { publisher: identity, source: \"identity\" };\n // slugifyAssetName throws on a name with no [a-z0-9] — keep the chain total. The slug is\n // cut to 39 characters so the fallback always passes the publisher rule.\n try {\n const slug = slugifyAssetName(lib.name).slice(0, 39).replace(/-+$/, \"\");\n return { publisher: slug, source: \"library-name\" };\n } catch {\n return { publisher: \"library\", source: \"library-name\" };\n }\n}\n\n/** {@link resolveLibraryPublisherDetailed} without the provenance. */\nexport function resolveLibraryPublisher(\n lib: Pick<Library, \"name\" | \"path\">,\n opts: { publisher?: string },\n storeIdentity?: { username?: string; githubLogin?: string } | null,\n): string {\n return resolveLibraryPublisherDetailed(lib, opts, storeIdentity).publisher;\n}\n\n/**\n * Warn that an asset's publisher fell back to the library name — the one text\n * `library create`, `asset import`, `library index` and the `init` adopt path\n * share. Prints nothing for any other {@link LibraryPublisherSource}.\n *\n * `hasPublisherFlag` is true for the commands that take `--publisher` (`create`,\n * `asset import`); `init` and `index` do not, so they must not advise it.\n */\nexport function warnLibraryNameFallback(\n libName: string,\n resolved: { publisher: string; source: LibraryPublisherSource },\n hasPublisherFlag = false,\n): void {\n if (resolved.source !== \"library-name\") return;\n const setLater = `\\`skaile library set ${libName} publisher=<name>\\``;\n logWarn(\n `No publisher given and not signed in — using the library name \"${resolved.publisher}\" as the publisher. ` +\n (hasPublisherFlag\n ? `Pass --publisher <name> or run \\`skaile store login\\`; change it later with ${setLater}.`\n : `Run \\`skaile store login\\`, or change it later with ${setLater}.`),\n );\n}\n\n/**\n * Re-serialise a freshly written asset's markdown marker (SKILL.md / AGENT.md /\n * CONTRACT.md / `*.prompt.md`) so `library create` and `asset import` leave the\n * same canonical frontmatter (`version: 0.1.0`, not the scaffold's quoted\n * `version: \"0.1.0\"`). Never adds or changes a key — the publisher lives in the\n * manifest only. A YAML marker (flow / preset) or an unparsable file is left\n * untouched.\n */\nfunction normalizeAssetFrontmatter(assetDir: string): void {\n let markerFile = [\"SKILL.md\", \"AGENT.md\", \"CONTRACT.md\"]\n .map((m) => path.join(assetDir, m))\n .find((f) => fs.existsSync(f));\n if (!markerFile) {\n // Only a `.prompt.md` marker carries asset frontmatter — never a bare `.md`\n // catch-all, which would rewrite (and corrupt) a template's README/CHANGELOG.\n const promptMd = fs.readdirSync(assetDir).find((f) => f.endsWith(\".prompt.md\"));\n if (promptMd) markerFile = path.join(assetDir, promptMd);\n }\n if (!markerFile) return;\n try {\n const { data, body } = parseFrontmatter(fs.readFileSync(markerFile, \"utf8\"));\n const fm = stringifyYaml(data).trimEnd();\n fs.writeFileSync(markerFile, `---\\n${fm}\\n---\\n\\n${body}\\n`, \"utf8\");\n } catch {\n // Non-fatal — the file stays as written.\n }\n}\n\n/** What {@link registerLibraryAsset} needs to know about the asset that just landed in a library. */\nexport interface RegisterLibraryAssetInput {\n kind: string;\n name: string;\n /** Absolute directory of the asset inside the library. */\n assetDir: string;\n /** Version written to the manifest entry and the printed ref. */\n version: string;\n /** Explicit `--publisher`. */\n publisher?: string;\n}\n\n/**\n * Make an asset that was just written into a library consumable — the shared\n * tail of `library create` and `asset import`, so both produce the same\n * manifest entry, frontmatter shape and index rows:\n * 1. resolve the publisher ({@link resolveLibraryPublisherDetailed}); when it\n * came from the library-name fallback, warn once how to set a real one,\n * 2. stamp it into the manifest's top-level `publisher` (first writer wins) —\n * the manifest is the only place a publisher lives; the asset file is\n * left untouched,\n * 3. upsert the manifest `assets[]` entry (`library publish` ships only that\n * inventory),\n * 4. index the library so `add` / `search --local` find the asset at once.\n *\n * @returns the bare publisher and the canonical ref (`kind:@pub/name#version`).\n */\nexport async function registerLibraryAsset(\n lib: Library,\n index: LocalIndex,\n input: RegisterLibraryAssetInput,\n): Promise<{ publisher: string; ref: string }> {\n const { publisher, source } = resolveLibraryPublisherDetailed(\n lib,\n { publisher: input.publisher },\n getStoreIdentity(),\n );\n warnLibraryNameFallback(lib.name, { publisher, source }, true);\n normalizeAssetFrontmatter(input.assetDir);\n stampManifestPublisher(lib.path, publisher);\n upsertManifestAsset(lib.path, {\n kind: input.kind,\n name: input.name,\n root: path.relative(lib.path, input.assetDir) || input.name,\n version: input.version,\n publisher,\n });\n const idx = await indexLibrary(lib, index);\n for (const e of idx.errors) logWarn(e);\n return { publisher, ref: refFor(input.kind, publisher, input.name, input.version) };\n}\n\n/** Where an npm user reads the 4.x → 5.x library upgrade (MIGRATION.md is not in the package). */\nexport const LIBRARY_UPGRADE_DOCS =\n \"https://github.com/skaile-ai/workspaces/blob/main/docs/sections/cli/commands/library.md#upgrading-a-4x-library\";\n\n/** What replaced `DOMAIN.md`: 5.0 removed domains. */\nexport const DOMAIN_REMOVED_HINT = `Domains were removed in 5.0 — delete DOMAIN.md files; group assets with .claude-plugin/marketplace.json. See ${LIBRARY_UPGRADE_DOCS}`;\n\n/** Hidden `--domain <domain>` option: 4.x muscle memory gets {@link DOMAIN_REMOVED_HINT}, not \"unknown option\". */\nexport function removedDomainOption(): Option {\n return new Option(\"--domain <domain>\", \"Removed in 5.0\").hideHelp();\n}\n\n/** Exit 1 with {@link DOMAIN_REMOVED_HINT} when the removed `--domain` option was passed. */\nexport function rejectRemovedDomainOption(opts: { domain?: unknown }): void {\n if (opts.domain === undefined) return;\n logErr(DOMAIN_REMOVED_HINT);\n process.exit(1);\n}\n\n/** Collect the files below `root` whose name satisfies `match`, skipping dot-dirs and `node_modules`. */\nfunction findFiles(root: string, match: (name: string) => boolean): string[] {\n const found: string[] = [];\n const walk = (dir: string): void => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (!entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n walk(path.join(dir, entry.name));\n }\n } else if (match(entry.name)) {\n found.push(path.join(dir, entry.name));\n }\n }\n };\n walk(root);\n return found;\n}\n\n/** Count `DOMAIN.md` files below `root`, skipping dot-dirs and `node_modules`. */\nexport function countDomainFiles(root: string): number {\n return findFiles(root, (name) => name === \"DOMAIN.md\").length;\n}\n\n/**\n * Print ONE warning when `root` still holds `DOMAIN.md` files: since 5.0 they\n * are ignored silently, so without this an author never learns why grouping\n * stopped working. Warning only - never changes an exit code.\n *\n * @returns the number of `DOMAIN.md` files found.\n */\nexport function warnIgnoredDomainFiles(root: string): number {\n const count = countDomainFiles(root);\n if (count > 0) {\n logWarn(\n `${count} DOMAIN.md file(s) are ignored since 5.0 (domains were removed) — delete them; ` +\n `group assets with .claude-plugin/marketplace.json. See ${LIBRARY_UPGRADE_DOCS}`,\n );\n }\n return count;\n}\n\n/**\n * Print ONE warning when `root` still holds `*.bundle.yaml` files: the `bundle`\n * kind is gone (now `preset`), so neither `index` nor `validate` scans them.\n * Warning only - never changes an exit code.\n *\n * @returns the number of `*.bundle.yaml` files found.\n */\nexport function warnLegacyBundleFiles(root: string): number {\n const files = findFiles(root, (name) => name.endsWith(\".bundle.yaml\"));\n if (files.length > 0) {\n const shown = files.slice(0, 5).map((f) => path.relative(root, f) || f);\n const more = files.length > shown.length ? `, +${files.length - shown.length} more` : \"\";\n logWarn(\n `${files.length} *.bundle.yaml file(s) are not scanned (the bundle kind became preset): ${shown.join(\", \")}${more}. ` +\n `Run \\`skaile migrate assets ${root} --write\\` to rename them to *.preset.yaml. See ${LIBRARY_UPGRADE_DOCS}`,\n );\n }\n return files.length;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { buildClaudePluginFiles } from './chunk-A6SMCEEE.js';
1
+ import { buildClaudePluginFiles } from './chunk-QAKUD6QN.js';
2
2
  import { createHash } from 'crypto';
3
3
  import { existsSync } from 'fs';
4
4
  import fs from 'fs/promises';
@@ -266,7 +266,7 @@ async function status(projectDir) {
266
266
  method: "plugin",
267
267
  location: path.relative(projectDir, dir),
268
268
  ...stale ? {
269
- detail: "the skills copy is stale: run skaile integration install --driver claude-code --full"
269
+ detail: "the skills copy is stale: run skaile integration install --harness claude-code --full"
270
270
  } : {}
271
271
  };
272
272
  }
@@ -281,5 +281,5 @@ async function status(projectDir) {
281
281
  }
282
282
 
283
283
  export { disable, enable, install, refreshPluginSkills, status, uninstall };
284
- //# sourceMappingURL=chunk-HU5HVKY7.js.map
285
- //# sourceMappingURL=chunk-HU5HVKY7.js.map
284
+ //# sourceMappingURL=chunk-ASWTQQ7E.js.map
285
+ //# sourceMappingURL=chunk-ASWTQQ7E.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/commands/plugin/claude-code.ts"],"names":["disabled","next","updated","list"],"mappings":"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","file":"chunk-HU5HVKY7.js","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { buildClaudePluginFiles } from \"@skaile/workspaces/workspace-plugin\";\nimport type { HarnessStatus, InstallResult, ToggleResult, UninstallResult } from \"./types.ts\";\n\nconst SKAILE_MCP_NAME = \"skaile-workspace\";\n\nconst MCP_SERVER_ENTRY = {\n command: \"skaile\",\n args: [\"mcp-server\"],\n env: {} as Record<string, string>,\n};\n\ninterface ClaudeSettings {\n plugins?: string[];\n enabledPlugins?: string[];\n disabledPlugins?: string[];\n disabledMcpjsonServers?: string[];\n [k: string]: unknown;\n}\n\ninterface ClaudeMcpFile {\n mcpServers?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\n/**\n * Project-scope MCP file. Claude Code reads `<project>/.mcp.json`; the\n * `.claude/mcp.json` that earlier versions wrote is never read (`claude mcp\n * list` reported \"No MCP servers configured\").\n */\nfunction mcpFilePath(projectDir: string): string {\n return path.join(projectDir, \".mcp.json\");\n}\n\n/** The dead `.claude/mcp.json` of earlier versions; entries in it are removed. */\nfunction legacyMcpFilePath(projectDir: string): string {\n return path.join(projectDir, \".claude\", \"mcp.json\");\n}\n\n/**\n * Drop the skaile entry from an MCP file, deleting the file when nothing is\n * left. Returns whether the file changed.\n */\nasync function removeSkaileMcpEntry(mcpPath: string): Promise<boolean> {\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpPath);\n if (!mcp?.mcpServers || !(SKAILE_MCP_NAME in mcp.mcpServers)) return false;\n const { [SKAILE_MCP_NAME]: _removed, ...rest } = mcp.mcpServers;\n const updated: ClaudeMcpFile = { ...mcp, mcpServers: rest };\n if (Object.keys(rest).length === 0) delete updated.mcpServers;\n if (Object.keys(updated).length === 0) await fs.unlink(mcpPath);\n else await writeJson(mcpPath, updated);\n return true;\n}\n\n/** Absolute path to the generated Claude Code plugin directory. */\nfunction pluginDir(projectDir: string): string {\n return path.join(projectDir, \".claude\", \"plugins\", \"skaile\");\n}\n\nasync function readJsonStrict<T>(p: string): Promise<T | null> {\n let raw: string;\n try {\n raw = await fs.readFile(p, \"utf-8\");\n } catch {\n return null;\n }\n try {\n return JSON.parse(raw) as T;\n } catch (e: unknown) {\n throw new Error(\n `cannot parse ${p}: ${e instanceof Error ? e.message : String(e)}; please fix or remove`,\n );\n }\n}\n\nasync function writeJson(p: string, value: unknown): Promise<void> {\n await fs.mkdir(path.dirname(p), { recursive: true });\n await fs.writeFile(p, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/** Skill folders that are never copied into the plugin: bytecode and dependency trees. */\nconst SKIPPED_IN_SKILL = new Set([\"__pycache__\", \"node_modules\", \".DS_Store\"]);\n\n/**\n * The project's installed skills, name to source folder: the folders with a `SKILL.md` that\n * `skaile add` deployed to `.claude/skills/`, and any under `.skaile/skills/` (the folder an\n * earlier release read; it wins over a deployed copy of the same name).\n */\nasync function installedSkillSources(projectDir: string): Promise<Map<string, string>> {\n const sources = new Map<string, string>();\n for (const root of [\n path.join(projectDir, \".claude\", \"skills\"),\n path.join(projectDir, \".skaile\", \"skills\"),\n ]) {\n for (const name of await fs.readdir(root).catch(() => [] as string[])) {\n const from = path.join(root, name);\n if (existsSync(path.join(from, \"SKILL.md\"))) sources.set(name, from);\n }\n }\n return sources;\n}\n\n/**\n * Fill the plugin's `skills/` with the project's installed skills (p1190). A skill the project\n * no longer has is removed from the plugin, so a repeated install matches the project. A linked\n * skill is copied as files.\n */\nasync function copyInstalledSkills(projectDir: string, skillsDir: string): Promise<void> {\n for (const entry of await fs.readdir(skillsDir).catch(() => [] as string[])) {\n if (entry !== \".gitkeep\")\n await fs.rm(path.join(skillsDir, entry), { recursive: true, force: true });\n }\n for (const [name, from] of await installedSkillSources(projectDir)) {\n await fs.cp(from, path.join(skillsDir, name), {\n recursive: true,\n dereference: true,\n filter: (src) => !SKIPPED_IN_SKILL.has(path.basename(src)),\n });\n }\n}\n\n/** Relative file path to content hash of everything the plugin copy would hold for `dir`. */\nasync function skillDigest(dir: string, rel = \"\"): Promise<string[]> {\n const out: string[] = [];\n for (const entry of (await fs.readdir(path.join(dir, rel)).catch(() => [] as string[])).sort()) {\n if (SKIPPED_IN_SKILL.has(entry)) continue;\n const relPath = path.join(rel, entry);\n const stat = await fs.stat(path.join(dir, relPath)).catch(() => undefined);\n if (!stat) continue;\n if (stat.isDirectory()) out.push(...(await skillDigest(dir, relPath)));\n else {\n const hash = createHash(\"sha256\")\n .update(await fs.readFile(path.join(dir, relPath)))\n .digest(\"hex\");\n out.push(`${relPath}:${hash}`);\n }\n }\n return out;\n}\n\n/**\n * True when the `--full` plugin's `skills/` copy differs from what `copyInstalledSkills` would\n * write now: a skill added, removed or changed since the copy was made (p1350).\n */\nasync function pluginSkillsStale(projectDir: string): Promise<boolean> {\n const skillsDir = path.join(pluginDir(projectDir), \"skills\");\n const expected = await installedSkillSources(projectDir);\n const actual = (await fs.readdir(skillsDir).catch(() => [] as string[])).filter(\n (n) => n !== \".gitkeep\",\n );\n if (actual.length !== expected.size || actual.some((n) => !expected.has(n))) return true;\n for (const [name, from] of expected) {\n const [want, have] = await Promise.all([\n skillDigest(from),\n skillDigest(path.join(skillsDir, name)),\n ]);\n if (want.join(\"\\n\") !== have.join(\"\\n\")) return true;\n }\n return false;\n}\n\n/**\n * Bring the `--full` plugin's skills copy up to date after `add`, `remove`, `install` or\n * `update` changed the project's skills (p1350). Does nothing when the plugin is not installed\n * (the MCP method has no copy) or the copy is current. Returns whether it rewrote the copy.\n */\nexport async function refreshPluginSkills(projectDir: string): Promise<boolean> {\n if ((await detectInstall(projectDir))?.method !== \"plugin\") return false;\n if (!(await pluginSkillsStale(projectDir))) return false;\n await copyInstalledSkills(projectDir, path.join(pluginDir(projectDir), \"skills\"));\n return true;\n}\n\n// ── install ────────────────────────────────────────────────────────────────\n\n/**\n * Install the skaile integration for Claude Code.\n *\n * Two modes:\n * - **mcp** (default) — write project-root `.mcp.json` pointing at `skaile mcp-server`.\n * - **full** (`opts.full`) — generate the `.claude/plugins/skaile/` directory\n * (MCP + lifecycle hooks) and register it in `.claude/settings.json`.\n */\nexport async function install(\n projectDir: string,\n opts?: { full?: boolean },\n): Promise<InstallResult> {\n return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);\n}\n\nasync function installMcp(projectDir: string): Promise<InstallResult> {\n const mcpPath = mcpFilePath(projectDir);\n const existing = (await readJsonStrict<ClaudeMcpFile>(mcpPath)) ?? {};\n const mcpServers = { ...(existing.mcpServers ?? {}) };\n const previous = mcpServers[SKAILE_MCP_NAME];\n const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);\n let warning: string | undefined;\n if (previous && !matches) {\n warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path.relative(projectDir, mcpPath)}`;\n }\n mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;\n await writeJson(mcpPath, { ...existing, mcpServers });\n const migrated = await removeSkaileMcpEntry(legacyMcpFilePath(projectDir));\n return { changed: !matches || migrated, method: \"mcp\", warning };\n}\n\n/**\n * Unlink `p` when it is a symlink (never what it points at), so the install below writes into\n * a real folder of its own instead of through the link into the user's files (`skills/ ->\n * ../../skills` would otherwise have its target cleared).\n */\nasync function dropSymlink(p: string): Promise<void> {\n const stat = await fs.lstat(p).catch(() => undefined);\n if (stat?.isSymbolicLink()) await fs.unlink(p);\n}\n\nasync function installFullPlugin(projectDir: string): Promise<InstallResult> {\n const dir = pluginDir(projectDir);\n await dropSymlink(dir);\n await dropSymlink(path.join(dir, \"skills\"));\n\n // Generate the plugin directory from the in-memory file map.\n for (const [rel, content] of Object.entries(buildClaudePluginFiles())) {\n const dest = path.join(dir, rel);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n await fs.writeFile(dest, content);\n }\n\n await copyInstalledSkills(projectDir, path.join(dir, \"skills\"));\n\n // Register the generated dir in .claude/settings.json#plugins[].\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n const plugins = settings.plugins ?? [];\n if (!plugins.includes(dir)) plugins.push(dir);\n await writeJson(settingsPath, { ...settings, plugins });\n\n return { changed: true, method: \"plugin\" };\n}\n\n// ── uninstall ──────────────────────────────────────────────────────────────\n\nexport async function uninstall(projectDir: string): Promise<UninstallResult> {\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const mcpPath = mcpFilePath(projectDir);\n const dir = pluginDir(projectDir);\n const rel = (p: string): string => path.relative(projectDir, p);\n\n /** Project-relative paths the uninstall changed or deleted, in the order it touched them. */\n const files: string[] = [];\n\n // Remove the generated plugin dir from plugins[] if registered.\n const settings = await readJsonStrict<ClaudeSettings>(settingsPath);\n if (settings && Array.isArray(settings.plugins)) {\n const next = settings.plugins.filter((p) => p !== dir);\n if (next.length !== settings.plugins.length) {\n files.push(rel(settingsPath));\n const updated: ClaudeSettings = { ...settings, plugins: next };\n if (next.length === 0) delete updated.plugins;\n // A settings file that held only the skaile plugin is left empty: delete it.\n if (Object.keys(updated).length === 0) await fs.unlink(settingsPath);\n else await writeJson(settingsPath, updated);\n }\n }\n\n // Delete the generated plugin directory.\n if (existsSync(dir)) {\n await fs.rm(dir, { recursive: true, force: true });\n files.push(rel(dir));\n }\n\n // Remove from .mcp.json — and from the legacy .claude/mcp.json — if present.\n if (await removeSkaileMcpEntry(mcpPath)) files.push(rel(mcpPath));\n const legacyPath = legacyMcpFilePath(projectDir);\n if (await removeSkaileMcpEntry(legacyPath)) files.push(rel(legacyPath));\n\n // Leave no empty `.claude/` or `.claude/plugins/` behind.\n for (const emptyDir of [path.dirname(dir), path.join(projectDir, \".claude\")]) {\n await fs.rmdir(emptyDir).catch(() => undefined);\n }\n\n return { changed: files.length > 0, files };\n}\n\n// ── enable / disable ───────────────────────────────────────────────────────\n\nasync function detectInstall(\n projectDir: string,\n): Promise<{ method: \"plugin\" | \"mcp\"; pluginPath?: string } | null> {\n const dir = pluginDir(projectDir);\n const settings = await readJsonStrict<ClaudeSettings>(\n path.join(projectDir, \".claude\", \"settings.json\"),\n );\n if (\n existsSync(path.join(dir, \".claude-plugin\", \"plugin.json\")) &&\n settings?.plugins?.includes(dir)\n ) {\n return { method: \"plugin\", pluginPath: dir };\n }\n\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpFilePath(projectDir));\n if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {\n return { method: \"mcp\" };\n }\n return null;\n}\n\nexport async function enable(projectDir: string): Promise<ToggleResult> {\n const detected = await detectInstall(projectDir);\n if (!detected) throw new Error(\"plugin not installed for claude-code\");\n\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n\n if (detected.method === \"plugin\") {\n const disabled = settings.disabledPlugins ?? [];\n const next = disabled.filter((p) => p !== detected.pluginPath);\n if (next.length === disabled.length) return { changed: false };\n const updated: ClaudeSettings = { ...settings, disabledPlugins: next };\n if (next.length === 0) delete updated.disabledPlugins;\n await writeJson(settingsPath, updated);\n return { changed: true };\n }\n\n const disabled = settings.disabledMcpjsonServers ?? [];\n const next = disabled.filter((n) => n !== SKAILE_MCP_NAME);\n if (next.length === disabled.length) return { changed: false };\n const updated: ClaudeSettings = { ...settings, disabledMcpjsonServers: next };\n if (next.length === 0) delete updated.disabledMcpjsonServers;\n await writeJson(settingsPath, updated);\n return { changed: true };\n}\n\nexport async function disable(projectDir: string): Promise<ToggleResult> {\n const detected = await detectInstall(projectDir);\n if (!detected) throw new Error(\"plugin not installed for claude-code\");\n\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n\n if (detected.method === \"plugin\") {\n const list = settings.disabledPlugins ?? [];\n if (list.includes(detected.pluginPath as string)) return { changed: false };\n await writeJson(settingsPath, {\n ...settings,\n disabledPlugins: [...list, detected.pluginPath as string],\n });\n return { changed: true };\n }\n\n const list = settings.disabledMcpjsonServers ?? [];\n if (list.includes(SKAILE_MCP_NAME)) return { changed: false };\n await writeJson(settingsPath, {\n ...settings,\n disabledMcpjsonServers: [...list, SKAILE_MCP_NAME],\n });\n return { changed: true };\n}\n\n// ── status ─────────────────────────────────────────────────────────────────\n\nexport async function status(projectDir: string): Promise<HarnessStatus> {\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const mcpPath = mcpFilePath(projectDir);\n const dir = pluginDir(projectDir);\n const settings = await readJsonStrict<ClaudeSettings>(settingsPath);\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpPath);\n\n const pluginInstalled = !!(\n existsSync(path.join(dir, \".claude-plugin\", \"plugin.json\")) && settings?.plugins?.includes(dir)\n );\n const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);\n\n if (!pluginInstalled && !mcpInstalled) {\n return {\n harness: \"claude-code\",\n installed: \"no\",\n enabled: \"n/a\",\n method: \"—\",\n location: \"—\",\n };\n }\n\n if (pluginInstalled) {\n const disabled = settings?.disabledPlugins?.includes(dir) ?? false;\n // The plugin's skills are a copy; `add`, `remove`, `install` and `update` refresh it, but a\n // skill changed by hand since is not in it (p1350).\n const stale = await pluginSkillsStale(projectDir);\n return {\n harness: \"claude-code\",\n installed: \"yes\",\n enabled: disabled ? \"no\" : \"yes\",\n method: \"plugin\",\n location: path.relative(projectDir, dir),\n ...(stale\n ? {\n detail:\n \"the skills copy is stale: run skaile integration install --driver claude-code --full\",\n }\n : {}),\n };\n }\n\n const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;\n return {\n harness: \"claude-code\",\n installed: \"yes\",\n enabled: disabled ? \"no\" : \"yes\",\n method: \"mcp\",\n location: path.relative(projectDir, mcpPath),\n };\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/commands/plugin/claude-code.ts"],"names":["disabled","next","updated","list"],"mappings":"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","file":"chunk-ASWTQQ7E.js","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { buildClaudePluginFiles } from \"@skaile/workspaces/workspace-plugin\";\nimport type { HarnessStatus, InstallResult, ToggleResult, UninstallResult } from \"./types.ts\";\n\nconst SKAILE_MCP_NAME = \"skaile-workspace\";\n\nconst MCP_SERVER_ENTRY = {\n command: \"skaile\",\n args: [\"mcp-server\"],\n env: {} as Record<string, string>,\n};\n\ninterface ClaudeSettings {\n plugins?: string[];\n enabledPlugins?: string[];\n disabledPlugins?: string[];\n disabledMcpjsonServers?: string[];\n [k: string]: unknown;\n}\n\ninterface ClaudeMcpFile {\n mcpServers?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\n/**\n * Project-scope MCP file. Claude Code reads `<project>/.mcp.json`; the\n * `.claude/mcp.json` that earlier versions wrote is never read (`claude mcp\n * list` reported \"No MCP servers configured\").\n */\nfunction mcpFilePath(projectDir: string): string {\n return path.join(projectDir, \".mcp.json\");\n}\n\n/** The dead `.claude/mcp.json` of earlier versions; entries in it are removed. */\nfunction legacyMcpFilePath(projectDir: string): string {\n return path.join(projectDir, \".claude\", \"mcp.json\");\n}\n\n/**\n * Drop the skaile entry from an MCP file, deleting the file when nothing is\n * left. Returns whether the file changed.\n */\nasync function removeSkaileMcpEntry(mcpPath: string): Promise<boolean> {\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpPath);\n if (!mcp?.mcpServers || !(SKAILE_MCP_NAME in mcp.mcpServers)) return false;\n const { [SKAILE_MCP_NAME]: _removed, ...rest } = mcp.mcpServers;\n const updated: ClaudeMcpFile = { ...mcp, mcpServers: rest };\n if (Object.keys(rest).length === 0) delete updated.mcpServers;\n if (Object.keys(updated).length === 0) await fs.unlink(mcpPath);\n else await writeJson(mcpPath, updated);\n return true;\n}\n\n/** Absolute path to the generated Claude Code plugin directory. */\nfunction pluginDir(projectDir: string): string {\n return path.join(projectDir, \".claude\", \"plugins\", \"skaile\");\n}\n\nasync function readJsonStrict<T>(p: string): Promise<T | null> {\n let raw: string;\n try {\n raw = await fs.readFile(p, \"utf-8\");\n } catch {\n return null;\n }\n try {\n return JSON.parse(raw) as T;\n } catch (e: unknown) {\n throw new Error(\n `cannot parse ${p}: ${e instanceof Error ? e.message : String(e)}; please fix or remove`,\n );\n }\n}\n\nasync function writeJson(p: string, value: unknown): Promise<void> {\n await fs.mkdir(path.dirname(p), { recursive: true });\n await fs.writeFile(p, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/** Skill folders that are never copied into the plugin: bytecode and dependency trees. */\nconst SKIPPED_IN_SKILL = new Set([\"__pycache__\", \"node_modules\", \".DS_Store\"]);\n\n/**\n * The project's installed skills, name to source folder: the folders with a `SKILL.md` that\n * `skaile add` deployed to `.claude/skills/`, and any under `.skaile/skills/` (the folder an\n * earlier release read; it wins over a deployed copy of the same name).\n */\nasync function installedSkillSources(projectDir: string): Promise<Map<string, string>> {\n const sources = new Map<string, string>();\n for (const root of [\n path.join(projectDir, \".claude\", \"skills\"),\n path.join(projectDir, \".skaile\", \"skills\"),\n ]) {\n for (const name of await fs.readdir(root).catch(() => [] as string[])) {\n const from = path.join(root, name);\n if (existsSync(path.join(from, \"SKILL.md\"))) sources.set(name, from);\n }\n }\n return sources;\n}\n\n/**\n * Fill the plugin's `skills/` with the project's installed skills (p1190). A skill the project\n * no longer has is removed from the plugin, so a repeated install matches the project. A linked\n * skill is copied as files.\n */\nasync function copyInstalledSkills(projectDir: string, skillsDir: string): Promise<void> {\n for (const entry of await fs.readdir(skillsDir).catch(() => [] as string[])) {\n if (entry !== \".gitkeep\")\n await fs.rm(path.join(skillsDir, entry), { recursive: true, force: true });\n }\n for (const [name, from] of await installedSkillSources(projectDir)) {\n await fs.cp(from, path.join(skillsDir, name), {\n recursive: true,\n dereference: true,\n filter: (src) => !SKIPPED_IN_SKILL.has(path.basename(src)),\n });\n }\n}\n\n/** Relative file path to content hash of everything the plugin copy would hold for `dir`. */\nasync function skillDigest(dir: string, rel = \"\"): Promise<string[]> {\n const out: string[] = [];\n for (const entry of (await fs.readdir(path.join(dir, rel)).catch(() => [] as string[])).sort()) {\n if (SKIPPED_IN_SKILL.has(entry)) continue;\n const relPath = path.join(rel, entry);\n const stat = await fs.stat(path.join(dir, relPath)).catch(() => undefined);\n if (!stat) continue;\n if (stat.isDirectory()) out.push(...(await skillDigest(dir, relPath)));\n else {\n const hash = createHash(\"sha256\")\n .update(await fs.readFile(path.join(dir, relPath)))\n .digest(\"hex\");\n out.push(`${relPath}:${hash}`);\n }\n }\n return out;\n}\n\n/**\n * True when the `--full` plugin's `skills/` copy differs from what `copyInstalledSkills` would\n * write now: a skill added, removed or changed since the copy was made (p1350).\n */\nasync function pluginSkillsStale(projectDir: string): Promise<boolean> {\n const skillsDir = path.join(pluginDir(projectDir), \"skills\");\n const expected = await installedSkillSources(projectDir);\n const actual = (await fs.readdir(skillsDir).catch(() => [] as string[])).filter(\n (n) => n !== \".gitkeep\",\n );\n if (actual.length !== expected.size || actual.some((n) => !expected.has(n))) return true;\n for (const [name, from] of expected) {\n const [want, have] = await Promise.all([\n skillDigest(from),\n skillDigest(path.join(skillsDir, name)),\n ]);\n if (want.join(\"\\n\") !== have.join(\"\\n\")) return true;\n }\n return false;\n}\n\n/**\n * Bring the `--full` plugin's skills copy up to date after `add`, `remove`, `install` or\n * `update` changed the project's skills (p1350). Does nothing when the plugin is not installed\n * (the MCP method has no copy) or the copy is current. Returns whether it rewrote the copy.\n */\nexport async function refreshPluginSkills(projectDir: string): Promise<boolean> {\n if ((await detectInstall(projectDir))?.method !== \"plugin\") return false;\n if (!(await pluginSkillsStale(projectDir))) return false;\n await copyInstalledSkills(projectDir, path.join(pluginDir(projectDir), \"skills\"));\n return true;\n}\n\n// ── install ────────────────────────────────────────────────────────────────\n\n/**\n * Install the skaile integration for Claude Code.\n *\n * Two modes:\n * - **mcp** (default) — write project-root `.mcp.json` pointing at `skaile mcp-server`.\n * - **full** (`opts.full`) — generate the `.claude/plugins/skaile/` directory\n * (MCP + lifecycle hooks) and register it in `.claude/settings.json`.\n */\nexport async function install(\n projectDir: string,\n opts?: { full?: boolean },\n): Promise<InstallResult> {\n return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);\n}\n\nasync function installMcp(projectDir: string): Promise<InstallResult> {\n const mcpPath = mcpFilePath(projectDir);\n const existing = (await readJsonStrict<ClaudeMcpFile>(mcpPath)) ?? {};\n const mcpServers = { ...(existing.mcpServers ?? {}) };\n const previous = mcpServers[SKAILE_MCP_NAME];\n const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);\n let warning: string | undefined;\n if (previous && !matches) {\n warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path.relative(projectDir, mcpPath)}`;\n }\n mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;\n await writeJson(mcpPath, { ...existing, mcpServers });\n const migrated = await removeSkaileMcpEntry(legacyMcpFilePath(projectDir));\n return { changed: !matches || migrated, method: \"mcp\", warning };\n}\n\n/**\n * Unlink `p` when it is a symlink (never what it points at), so the install below writes into\n * a real folder of its own instead of through the link into the user's files (`skills/ ->\n * ../../skills` would otherwise have its target cleared).\n */\nasync function dropSymlink(p: string): Promise<void> {\n const stat = await fs.lstat(p).catch(() => undefined);\n if (stat?.isSymbolicLink()) await fs.unlink(p);\n}\n\nasync function installFullPlugin(projectDir: string): Promise<InstallResult> {\n const dir = pluginDir(projectDir);\n await dropSymlink(dir);\n await dropSymlink(path.join(dir, \"skills\"));\n\n // Generate the plugin directory from the in-memory file map.\n for (const [rel, content] of Object.entries(buildClaudePluginFiles())) {\n const dest = path.join(dir, rel);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n await fs.writeFile(dest, content);\n }\n\n await copyInstalledSkills(projectDir, path.join(dir, \"skills\"));\n\n // Register the generated dir in .claude/settings.json#plugins[].\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n const plugins = settings.plugins ?? [];\n if (!plugins.includes(dir)) plugins.push(dir);\n await writeJson(settingsPath, { ...settings, plugins });\n\n return { changed: true, method: \"plugin\" };\n}\n\n// ── uninstall ──────────────────────────────────────────────────────────────\n\nexport async function uninstall(projectDir: string): Promise<UninstallResult> {\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const mcpPath = mcpFilePath(projectDir);\n const dir = pluginDir(projectDir);\n const rel = (p: string): string => path.relative(projectDir, p);\n\n /** Project-relative paths the uninstall changed or deleted, in the order it touched them. */\n const files: string[] = [];\n\n // Remove the generated plugin dir from plugins[] if registered.\n const settings = await readJsonStrict<ClaudeSettings>(settingsPath);\n if (settings && Array.isArray(settings.plugins)) {\n const next = settings.plugins.filter((p) => p !== dir);\n if (next.length !== settings.plugins.length) {\n files.push(rel(settingsPath));\n const updated: ClaudeSettings = { ...settings, plugins: next };\n if (next.length === 0) delete updated.plugins;\n // A settings file that held only the skaile plugin is left empty: delete it.\n if (Object.keys(updated).length === 0) await fs.unlink(settingsPath);\n else await writeJson(settingsPath, updated);\n }\n }\n\n // Delete the generated plugin directory.\n if (existsSync(dir)) {\n await fs.rm(dir, { recursive: true, force: true });\n files.push(rel(dir));\n }\n\n // Remove from .mcp.json — and from the legacy .claude/mcp.json — if present.\n if (await removeSkaileMcpEntry(mcpPath)) files.push(rel(mcpPath));\n const legacyPath = legacyMcpFilePath(projectDir);\n if (await removeSkaileMcpEntry(legacyPath)) files.push(rel(legacyPath));\n\n // Leave no empty `.claude/` or `.claude/plugins/` behind.\n for (const emptyDir of [path.dirname(dir), path.join(projectDir, \".claude\")]) {\n await fs.rmdir(emptyDir).catch(() => undefined);\n }\n\n return { changed: files.length > 0, files };\n}\n\n// ── enable / disable ───────────────────────────────────────────────────────\n\nasync function detectInstall(\n projectDir: string,\n): Promise<{ method: \"plugin\" | \"mcp\"; pluginPath?: string } | null> {\n const dir = pluginDir(projectDir);\n const settings = await readJsonStrict<ClaudeSettings>(\n path.join(projectDir, \".claude\", \"settings.json\"),\n );\n if (\n existsSync(path.join(dir, \".claude-plugin\", \"plugin.json\")) &&\n settings?.plugins?.includes(dir)\n ) {\n return { method: \"plugin\", pluginPath: dir };\n }\n\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpFilePath(projectDir));\n if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {\n return { method: \"mcp\" };\n }\n return null;\n}\n\nexport async function enable(projectDir: string): Promise<ToggleResult> {\n const detected = await detectInstall(projectDir);\n if (!detected) throw new Error(\"plugin not installed for claude-code\");\n\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n\n if (detected.method === \"plugin\") {\n const disabled = settings.disabledPlugins ?? [];\n const next = disabled.filter((p) => p !== detected.pluginPath);\n if (next.length === disabled.length) return { changed: false };\n const updated: ClaudeSettings = { ...settings, disabledPlugins: next };\n if (next.length === 0) delete updated.disabledPlugins;\n await writeJson(settingsPath, updated);\n return { changed: true };\n }\n\n const disabled = settings.disabledMcpjsonServers ?? [];\n const next = disabled.filter((n) => n !== SKAILE_MCP_NAME);\n if (next.length === disabled.length) return { changed: false };\n const updated: ClaudeSettings = { ...settings, disabledMcpjsonServers: next };\n if (next.length === 0) delete updated.disabledMcpjsonServers;\n await writeJson(settingsPath, updated);\n return { changed: true };\n}\n\nexport async function disable(projectDir: string): Promise<ToggleResult> {\n const detected = await detectInstall(projectDir);\n if (!detected) throw new Error(\"plugin not installed for claude-code\");\n\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n\n if (detected.method === \"plugin\") {\n const list = settings.disabledPlugins ?? [];\n if (list.includes(detected.pluginPath as string)) return { changed: false };\n await writeJson(settingsPath, {\n ...settings,\n disabledPlugins: [...list, detected.pluginPath as string],\n });\n return { changed: true };\n }\n\n const list = settings.disabledMcpjsonServers ?? [];\n if (list.includes(SKAILE_MCP_NAME)) return { changed: false };\n await writeJson(settingsPath, {\n ...settings,\n disabledMcpjsonServers: [...list, SKAILE_MCP_NAME],\n });\n return { changed: true };\n}\n\n// ── status ─────────────────────────────────────────────────────────────────\n\nexport async function status(projectDir: string): Promise<HarnessStatus> {\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const mcpPath = mcpFilePath(projectDir);\n const dir = pluginDir(projectDir);\n const settings = await readJsonStrict<ClaudeSettings>(settingsPath);\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpPath);\n\n const pluginInstalled = !!(\n existsSync(path.join(dir, \".claude-plugin\", \"plugin.json\")) && settings?.plugins?.includes(dir)\n );\n const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);\n\n if (!pluginInstalled && !mcpInstalled) {\n return {\n harness: \"claude-code\",\n installed: \"no\",\n enabled: \"n/a\",\n method: \"—\",\n location: \"—\",\n };\n }\n\n if (pluginInstalled) {\n const disabled = settings?.disabledPlugins?.includes(dir) ?? false;\n // The plugin's skills are a copy; `add`, `remove`, `install` and `update` refresh it, but a\n // skill changed by hand since is not in it (p1350).\n const stale = await pluginSkillsStale(projectDir);\n return {\n harness: \"claude-code\",\n installed: \"yes\",\n enabled: disabled ? \"no\" : \"yes\",\n method: \"plugin\",\n location: path.relative(projectDir, dir),\n ...(stale\n ? {\n detail:\n \"the skills copy is stale: run skaile integration install --harness claude-code --full\",\n }\n : {}),\n };\n }\n\n const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;\n return {\n harness: \"claude-code\",\n installed: \"yes\",\n enabled: disabled ? \"no\" : \"yes\",\n method: \"mcp\",\n location: path.relative(projectDir, mcpPath),\n };\n}\n"]}