@skaile/workspaces 6.16.0 → 6.17.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 (236) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{agent-file-refresh-76NNFB4W.js → agent-file-refresh-RZWE25KN.js} +33 -33
  3. package/dist/{agent-file-refresh-76NNFB4W.js.map → agent-file-refresh-RZWE25KN.js.map} +1 -1
  4. package/dist/ai-sdk.js +4 -4
  5. package/dist/{asset-feeds-ON7FYHHF.js → asset-feeds-W4A2UFNX.js} +16 -16
  6. package/dist/{asset-feeds-ON7FYHHF.js.map → asset-feeds-W4A2UFNX.js.map} +1 -1
  7. package/dist/asset-manager/catalog-deployer.js +3 -3
  8. package/dist/asset-manager/history.js +3 -3
  9. package/dist/asset-manager/index.js +8 -8
  10. package/dist/asset-manager/installer.js +7 -7
  11. package/dist/asset-manager/renderers.js +4 -4
  12. package/dist/bridge/harnesses/claude-sdk.js +7 -7
  13. package/dist/bridge/harnesses/codex.js +7 -7
  14. package/dist/bridge/harnesses/continue.js +8 -8
  15. package/dist/bridge/harnesses/echo.js +3 -3
  16. package/dist/bridge/harnesses/gemini.js +6 -6
  17. package/dist/bridge/harnesses/goose.js +8 -8
  18. package/dist/bridge/harnesses/omp.js +5 -5
  19. package/dist/bridge/harnesses/opencode.js +9 -9
  20. package/dist/bridge/harnesses/qwen.js +6 -6
  21. package/dist/bridge/index.js +13 -13
  22. package/dist/{chunk-BTMSHGN3.js → chunk-2QNDAGYL.js} +4 -4
  23. package/dist/{chunk-BTMSHGN3.js.map → chunk-2QNDAGYL.js.map} +1 -1
  24. package/dist/{chunk-2ZDZJ7XQ.js → chunk-3O3HWR23.js} +3 -3
  25. package/dist/{chunk-2ZDZJ7XQ.js.map → chunk-3O3HWR23.js.map} +1 -1
  26. package/dist/{chunk-G5SUWZEU.js → chunk-3ZY6W7CL.js} +4 -3
  27. package/dist/chunk-3ZY6W7CL.js.map +1 -0
  28. package/dist/{chunk-2JUCWMIS.js → chunk-4BVE6JTM.js} +9 -9
  29. package/dist/{chunk-2JUCWMIS.js.map → chunk-4BVE6JTM.js.map} +1 -1
  30. package/dist/{chunk-Z23I2JA6.js → chunk-4CVRFWEY.js} +5 -5
  31. package/dist/{chunk-Z23I2JA6.js.map → chunk-4CVRFWEY.js.map} +1 -1
  32. package/dist/{chunk-PPSSDUN6.js → chunk-4YVQGPZ5.js} +3 -3
  33. package/dist/{chunk-PPSSDUN6.js.map → chunk-4YVQGPZ5.js.map} +1 -1
  34. package/dist/{chunk-ETGC2MEM.js → chunk-52HUF3DF.js} +3 -3
  35. package/dist/{chunk-ETGC2MEM.js.map → chunk-52HUF3DF.js.map} +1 -1
  36. package/dist/{chunk-Z7HLX4V2.js → chunk-57B4DG3Y.js} +4 -4
  37. package/dist/{chunk-Z7HLX4V2.js.map → chunk-57B4DG3Y.js.map} +1 -1
  38. package/dist/{chunk-WW22FS74.js → chunk-5L3UCHBK.js} +9 -9
  39. package/dist/{chunk-WW22FS74.js.map → chunk-5L3UCHBK.js.map} +1 -1
  40. package/dist/{chunk-72DYHOO2.js → chunk-6CTRJADR.js} +5 -5
  41. package/dist/{chunk-72DYHOO2.js.map → chunk-6CTRJADR.js.map} +1 -1
  42. package/dist/{chunk-3LAJJURV.js → chunk-6O7KIJUW.js} +5 -5
  43. package/dist/{chunk-3LAJJURV.js.map → chunk-6O7KIJUW.js.map} +1 -1
  44. package/dist/{chunk-EGKCKWWE.js → chunk-6PWQJMHM.js} +3 -3
  45. package/dist/{chunk-EGKCKWWE.js.map → chunk-6PWQJMHM.js.map} +1 -1
  46. package/dist/{chunk-7IW5E6LB.js → chunk-7D46CRUU.js} +12 -12
  47. package/dist/{chunk-7IW5E6LB.js.map → chunk-7D46CRUU.js.map} +1 -1
  48. package/dist/{chunk-IG4YQ7ER.js → chunk-7IKAKXMZ.js} +3 -3
  49. package/dist/{chunk-IG4YQ7ER.js.map → chunk-7IKAKXMZ.js.map} +1 -1
  50. package/dist/{chunk-4ZNKEDYH.js → chunk-AS4SKSXJ.js} +5 -5
  51. package/dist/{chunk-4ZNKEDYH.js.map → chunk-AS4SKSXJ.js.map} +1 -1
  52. package/dist/{chunk-6KV34G6A.js → chunk-AVB7NLO6.js} +6 -6
  53. package/dist/{chunk-6KV34G6A.js.map → chunk-AVB7NLO6.js.map} +1 -1
  54. package/dist/{chunk-MG6QD7GE.js → chunk-DG7OEBLI.js} +6 -6
  55. package/dist/{chunk-MG6QD7GE.js.map → chunk-DG7OEBLI.js.map} +1 -1
  56. package/dist/{chunk-4X5WXQV7.js → chunk-DTIR5W6G.js} +3 -3
  57. package/dist/{chunk-4X5WXQV7.js.map → chunk-DTIR5W6G.js.map} +1 -1
  58. package/dist/{chunk-PRB67LCK.js → chunk-E2VPBB7C.js} +11 -11
  59. package/dist/{chunk-PRB67LCK.js.map → chunk-E2VPBB7C.js.map} +1 -1
  60. package/dist/{chunk-NAQXDTF3.js → chunk-EFCRBVHL.js} +3 -3
  61. package/dist/{chunk-NAQXDTF3.js.map → chunk-EFCRBVHL.js.map} +1 -1
  62. package/dist/{chunk-ZII54C3E.js → chunk-F6EPGAES.js} +122 -50
  63. package/dist/chunk-F6EPGAES.js.map +1 -0
  64. package/dist/{chunk-VFEZUSB6.js → chunk-FURORBXE.js} +4 -4
  65. package/dist/{chunk-VFEZUSB6.js.map → chunk-FURORBXE.js.map} +1 -1
  66. package/dist/{chunk-BRAOB37W.js → chunk-GXW4B5SE.js} +51 -17
  67. package/dist/chunk-GXW4B5SE.js.map +1 -0
  68. package/dist/{chunk-SX54OQQT.js → chunk-HTQLI3OI.js} +4 -4
  69. package/dist/{chunk-SX54OQQT.js.map → chunk-HTQLI3OI.js.map} +1 -1
  70. package/dist/{chunk-TYK752MU.js → chunk-HZU5JW2F.js} +3 -3
  71. package/dist/{chunk-TYK752MU.js.map → chunk-HZU5JW2F.js.map} +1 -1
  72. package/dist/{chunk-NJ6UCY2B.js → chunk-I46MAK4H.js} +3 -3
  73. package/dist/{chunk-NJ6UCY2B.js.map → chunk-I46MAK4H.js.map} +1 -1
  74. package/dist/{chunk-PD42JZWI.js → chunk-K7IV5FY4.js} +2 -2
  75. package/dist/{chunk-PD42JZWI.js.map → chunk-K7IV5FY4.js.map} +1 -1
  76. package/dist/{chunk-2SSG5B24.js → chunk-KNOABDPY.js} +4 -4
  77. package/dist/{chunk-2SSG5B24.js.map → chunk-KNOABDPY.js.map} +1 -1
  78. package/dist/{chunk-P6FJDT35.js → chunk-LZ6C4YMX.js} +3 -3
  79. package/dist/{chunk-P6FJDT35.js.map → chunk-LZ6C4YMX.js.map} +1 -1
  80. package/dist/{chunk-TW5AP6IF.js → chunk-MZEZCRSO.js} +5 -5
  81. package/dist/{chunk-TW5AP6IF.js.map → chunk-MZEZCRSO.js.map} +1 -1
  82. package/dist/{chunk-3UYKT62L.js → chunk-N2XZSIJW.js} +244 -19
  83. package/dist/chunk-N2XZSIJW.js.map +1 -0
  84. package/dist/{chunk-65SOXO7I.js → chunk-NZAUPFIM.js} +11 -11
  85. package/dist/{chunk-65SOXO7I.js.map → chunk-NZAUPFIM.js.map} +1 -1
  86. package/dist/{chunk-OD4N5O7V.js → chunk-OLGQHP4R.js} +3 -3
  87. package/dist/{chunk-OD4N5O7V.js.map → chunk-OLGQHP4R.js.map} +1 -1
  88. package/dist/{chunk-RPRMD7XV.js → chunk-OMV4ROIO.js} +4 -4
  89. package/dist/{chunk-RPRMD7XV.js.map → chunk-OMV4ROIO.js.map} +1 -1
  90. package/dist/{chunk-H3PY5DFL.js → chunk-PC54LSZP.js} +3 -3
  91. package/dist/{chunk-H3PY5DFL.js.map → chunk-PC54LSZP.js.map} +1 -1
  92. package/dist/{chunk-U2WPJHRA.js → chunk-QZS7E3DY.js} +4 -4
  93. package/dist/{chunk-U2WPJHRA.js.map → chunk-QZS7E3DY.js.map} +1 -1
  94. package/dist/{chunk-S3UOZBGE.js → chunk-SOAQP4BI.js} +3 -3
  95. package/dist/{chunk-S3UOZBGE.js.map → chunk-SOAQP4BI.js.map} +1 -1
  96. package/dist/{chunk-FPG36VC4.js → chunk-UIAGUME5.js} +6 -6
  97. package/dist/{chunk-FPG36VC4.js.map → chunk-UIAGUME5.js.map} +1 -1
  98. package/dist/{chunk-NNJQQYHY.js → chunk-URN4G32O.js} +2 -2
  99. package/dist/{chunk-NNJQQYHY.js.map → chunk-URN4G32O.js.map} +1 -1
  100. package/dist/{chunk-CU5WY6HN.js → chunk-VAO3XYN3.js} +3 -3
  101. package/dist/{chunk-CU5WY6HN.js.map → chunk-VAO3XYN3.js.map} +1 -1
  102. package/dist/{chunk-QUIK7L3Z.js → chunk-WNT54WWX.js} +9 -9
  103. package/dist/{chunk-QUIK7L3Z.js.map → chunk-WNT54WWX.js.map} +1 -1
  104. package/dist/{chunk-T65N4CIZ.js → chunk-XHWBSC53.js} +4 -4
  105. package/dist/{chunk-T65N4CIZ.js.map → chunk-XHWBSC53.js.map} +1 -1
  106. package/dist/{chunk-KDRA6FYE.js → chunk-YKN5S7PO.js} +9 -9
  107. package/dist/{chunk-KDRA6FYE.js.map → chunk-YKN5S7PO.js.map} +1 -1
  108. package/dist/{chunk-TVRL3IPZ.js → chunk-ZEUBZV7L.js} +3 -3
  109. package/dist/{chunk-TVRL3IPZ.js.map → chunk-ZEUBZV7L.js.map} +1 -1
  110. package/dist/{chunk-U7P22GEB.js → chunk-ZHI3YMGQ.js} +4 -4
  111. package/dist/{chunk-U7P22GEB.js.map → chunk-ZHI3YMGQ.js.map} +1 -1
  112. package/dist/{chunk-6M44OQKH.js → chunk-ZKLXJV37.js} +9 -9
  113. package/dist/{chunk-6M44OQKH.js.map → chunk-ZKLXJV37.js.map} +1 -1
  114. package/dist/{claude-code-VL6UM7BZ.js → claude-code-K3QSXJ35.js} +4 -4
  115. package/dist/{claude-code-VL6UM7BZ.js.map → claude-code-K3QSXJ35.js.map} +1 -1
  116. package/dist/cli/index.js +115 -90
  117. package/dist/cli/index.js.map +1 -1
  118. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  119. package/dist/cli/src/commands/serve-preflight.d.ts +38 -0
  120. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  121. package/dist/cli/src/commands/serve.d.ts +7 -6
  122. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  123. package/dist/connectors/config.js +2 -2
  124. package/dist/connectors/index.js +16 -16
  125. package/dist/{connectors-7EPJRVLJ.js → connectors-SBV254SC.js} +19 -19
  126. package/dist/{connectors-7EPJRVLJ.js.map → connectors-SBV254SC.js.map} +1 -1
  127. package/dist/core/index.js +3 -3
  128. package/dist/core/runtime-assets.js +2 -2
  129. package/dist/core/src/model-endpoint-config.d.ts +12 -0
  130. package/dist/core/src/model-endpoint-config.d.ts.map +1 -0
  131. package/dist/core/src/workspace-config.d.ts +6 -0
  132. package/dist/core/src/workspace-config.d.ts.map +1 -1
  133. package/dist/core/workspace-config.js +1 -1
  134. package/dist/deploy/index.js +4 -4
  135. package/dist/{ensure-sources-CI3JQJST.js → ensure-sources-URRZB56T.js} +22 -22
  136. package/dist/{ensure-sources-CI3JQJST.js.map → ensure-sources-URRZB56T.js.map} +1 -1
  137. package/dist/factory-assets/connectors/box.js +16 -16
  138. package/dist/factory-assets/connectors/deploy.js +16 -16
  139. package/dist/factory-assets/connectors/devserver.js +16 -16
  140. package/dist/factory-assets/connectors/flow/adapter.js +16 -16
  141. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +2 -2
  142. package/dist/factory-assets/connectors/flow/engine.js +4 -4
  143. package/dist/factory-assets/connectors/flow/run-flow.js +17 -17
  144. package/dist/factory-assets/connectors/flow.js +16 -16
  145. package/dist/factory-assets/connectors/git.js +16 -16
  146. package/dist/factory-assets/connectors/gmail.js +16 -16
  147. package/dist/factory-assets/connectors/googledrive.js +16 -16
  148. package/dist/factory-assets/connectors/local.js +16 -16
  149. package/dist/factory-assets/connectors/mattermost.js +16 -16
  150. package/dist/factory-assets/connectors/memory.js +16 -16
  151. package/dist/factory-assets/connectors/minio.js +16 -16
  152. package/dist/factory-assets/connectors/postgres.js +16 -16
  153. package/dist/factory-assets/connectors/s3.js +16 -16
  154. package/dist/factory-assets/connectors/sharepoint.js +16 -16
  155. package/dist/factory-assets/connectors/sqlite.js +16 -16
  156. package/dist/factory-assets/connectors/static-server.js +16 -16
  157. package/dist/factory-assets/connectors/tunnel.js +16 -16
  158. package/dist/factory-assets/connectors/webdav.js +16 -16
  159. package/dist/factory-assets/connectors/xstate-store.js +16 -16
  160. package/dist/factory-assets/connectors/xstate.js +16 -16
  161. package/dist/{flows-6XQAYQS4.js → flows-YGBWX46B.js} +6 -6
  162. package/dist/{flows-6XQAYQS4.js.map → flows-YGBWX46B.js.map} +1 -1
  163. package/dist/{helpers-26MR5QPO.js → helpers-5FFJORMD.js} +22 -22
  164. package/dist/{helpers-26MR5QPO.js.map → helpers-5FFJORMD.js.map} +1 -1
  165. package/dist/library/index.js +4 -4
  166. package/dist/{library-publish-F3AKF66O.js → library-publish-AW4525ZC.js} +39 -39
  167. package/dist/{library-publish-F3AKF66O.js.map → library-publish-AW4525ZC.js.map} +1 -1
  168. package/dist/model-endpoint/index.js +7 -7
  169. package/dist/model-endpoint/src/server.d.ts.map +1 -1
  170. package/dist/model-endpoint/src/transform.d.ts +49 -0
  171. package/dist/model-endpoint/src/transform.d.ts.map +1 -0
  172. package/dist/model-endpoint/src/types.d.ts +13 -0
  173. package/dist/model-endpoint/src/types.d.ts.map +1 -1
  174. package/dist/{open-library-FVV6GG4I.js → open-library-C254HCNL.js} +25 -25
  175. package/dist/{open-library-FVV6GG4I.js.map → open-library-C254HCNL.js.map} +1 -1
  176. package/dist/{open-registry-VX2BVMS5.js → open-registry-FI6EO2PN.js} +8 -8
  177. package/dist/{open-registry-VX2BVMS5.js.map → open-registry-FI6EO2PN.js.map} +1 -1
  178. package/dist/{paths-PIWSSUUG.js → paths-FYPFJ437.js} +6 -6
  179. package/dist/{paths-PIWSSUUG.js.map → paths-FYPFJ437.js.map} +1 -1
  180. package/dist/plugin-registry/index.js +1 -1
  181. package/dist/plugin-registry/src/context.d.ts +6 -0
  182. package/dist/plugin-registry/src/context.d.ts.map +1 -1
  183. package/dist/plugin-registry/src/index.d.ts +4 -3
  184. package/dist/plugin-registry/src/index.d.ts.map +1 -1
  185. package/dist/plugin-registry/src/internal.d.ts.map +1 -1
  186. package/dist/plugin-registry/src/model-transform.d.ts +15 -0
  187. package/dist/plugin-registry/src/model-transform.d.ts.map +1 -0
  188. package/dist/plugin-registry/src/registry.d.ts +5 -5
  189. package/dist/plugin-registry/src/registry.d.ts.map +1 -1
  190. package/dist/plugin-registry/src/targets.d.ts +17 -2
  191. package/dist/plugin-registry/src/targets.d.ts.map +1 -1
  192. package/dist/{plugin-store-MVTW6G7J.js → plugin-store-ITA3IADY.js} +7 -7
  193. package/dist/{plugin-store-MVTW6G7J.js.map → plugin-store-ITA3IADY.js.map} +1 -1
  194. package/dist/{project-GFQP4TW6.js → project-7XU7YX3Q.js} +35 -35
  195. package/dist/{project-GFQP4TW6.js.map → project-7XU7YX3Q.js.map} +1 -1
  196. package/dist/resolver/index.js +3 -3
  197. package/dist/runner/composition-content.js +5 -5
  198. package/dist/runner/index.js +26 -26
  199. package/dist/runner/src/external-mcp.d.ts +32 -7
  200. package/dist/runner/src/external-mcp.d.ts.map +1 -1
  201. package/dist/runner/src/model-endpoint-discovery.d.ts +18 -0
  202. package/dist/runner/src/model-endpoint-discovery.d.ts.map +1 -1
  203. package/dist/runner/src/serve.d.ts.map +1 -1
  204. package/dist/sdk/asset-manager.js +8 -8
  205. package/dist/sdk/bridge.js +13 -13
  206. package/dist/sdk/core.js +3 -3
  207. package/dist/sdk/flow.js +4 -4
  208. package/dist/sdk/index.js +26 -26
  209. package/dist/sdk/resolver.js +3 -3
  210. package/dist/sdk/runner.js +26 -26
  211. package/dist/sdk/transport/ws/server.js +4 -4
  212. package/dist/sdk/transport/ws.js +4 -4
  213. package/dist/sdk/transport.js +4 -4
  214. package/dist/{serve-preflight-XJS5OZML.js → serve-preflight-A43HQQXD.js} +81 -25
  215. package/dist/serve-preflight-A43HQQXD.js.map +1 -0
  216. package/dist/{setup-BFEBJLYF.js → setup-WD7XTLDA.js} +23 -23
  217. package/dist/{setup-BFEBJLYF.js.map → setup-WD7XTLDA.js.map} +1 -1
  218. package/dist/{skills-OCG7B5CL.js → skills-XH6OG32W.js} +5 -5
  219. package/dist/{skills-OCG7B5CL.js.map → skills-XH6OG32W.js.map} +1 -1
  220. package/dist/{source-P6JPZYWP.js → source-25TTNBDK.js} +37 -37
  221. package/dist/{source-P6JPZYWP.js.map → source-25TTNBDK.js.map} +1 -1
  222. package/dist/{source-manifest-publish-XBFHEURV.js → source-manifest-publish-QJTPZQBN.js} +39 -39
  223. package/dist/{source-manifest-publish-XBFHEURV.js.map → source-manifest-publish-QJTPZQBN.js.map} +1 -1
  224. package/dist/transport/index.js +4 -4
  225. package/dist/transport/ws/server.js +4 -4
  226. package/dist/transport/ws.js +4 -4
  227. package/dist/tui/index.js +26 -26
  228. package/dist/workspace-plugin/adapters/mcp.js +19 -19
  229. package/dist/workspace-plugin/adapters/omp.js +14 -14
  230. package/dist/workspace-plugin/index.js +1 -1
  231. package/package.json +1 -1
  232. package/dist/chunk-3UYKT62L.js.map +0 -1
  233. package/dist/chunk-BRAOB37W.js.map +0 -1
  234. package/dist/chunk-G5SUWZEU.js.map +0 -1
  235. package/dist/chunk-ZII54C3E.js.map +0 -1
  236. package/dist/serve-preflight-XJS5OZML.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../asset-manager/src/composed-blocks.ts","../asset-manager/src/install-agent.ts","../asset-manager/src/installer.ts"],"names":["join","readFileSync","parseYaml","parseFrontmatter","statSync","basename","relative","resolve","existsSync","stringifyYaml"],"mappings":"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","file":"chunk-MG6QD7GE.js","sourcesContent":["/**\n * The prompt blocks an agent bakes into its native agent file besides the convention files: the\n * inline items of `composes:` (rulesets, prompts, personas, contracts, knowledge) and the seeds of\n * memory blocks that nothing stores (`memory.scope: none`).\n *\n * The bytes come from the runner's own content source (`createCompositionContentSource`, the one\n * function `skaile run` resolves a `composes:` ref with: a local path, a lock pin, a registered\n * library, the catalog), so the file holds what a run sends, in `composes:` order. A ref that\n * source cannot resolve throws its `CompositionError`; install reports it and the agent is not\n * rendered. A host-backed memory block is never baked: the host owns its content, only the\n * runner has it.\n */\n\nimport { readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n AgentInstanceConfig,\n AgentPromptMemoryBlock,\n AgentPromptPart,\n LockEntry,\n} from \"@skaile/workspaces/core\";\nimport {\n type CompileManifestEntry,\n CompositionError,\n createCompositionContentSource,\n loadCompileManifestFromDir,\n resolveBinding,\n} from \"@skaile/workspaces/runner/composition-content\";\nimport type { AgentManifest } from \"@skaile/workspaces/types/manifests\";\nimport { loadPromptExtensions } from \"./fragments.js\";\n\nconst stripFrontmatter = (text: string): string =>\n text.replace(/^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n?/, \"\").trim();\n\nconst readRaw = (file: string): string | undefined => {\n try {\n return readFileSync(file, \"utf-8\").trim();\n } catch {\n return undefined;\n }\n};\n\nconst readText = (file: string): string | undefined => {\n try {\n return statSync(file).isFile() ? stripFrontmatter(readFileSync(file, \"utf-8\")) : undefined;\n } catch {\n return undefined;\n }\n};\n\n/** The entries of the agent's `compile_manifest.json`; none when it has none or an older schema. */\nasync function loadCompiledEntries(srcDir: string): Promise<CompileManifestEntry[]> {\n try {\n return (await loadCompileManifestFromDir(srcDir))?.entries ?? [];\n } catch (err) {\n if (err instanceof CompositionError && err.code === \"composition_rebuild_required\") return [];\n throw err;\n }\n}\n\n/** What {@link loadPromptBlocks} found. */\nexport interface PromptBlocks {\n /** The inline `composes:` items, in `composes:` order. */\n composed: AgentPromptPart[];\n /** The memory blocks whose seed is baked (`memory.scope: none`). */\n memory: AgentPromptMemoryBlock[];\n}\n\n/** Files the runner reads through the composition content source (frontmatter stripped). */\nconst CONVENTION_SEEDS = new Set([\"SOUL.md\", \"RULES.md\", \"DUTIES.md\"]);\n\n/**\n * Read the composed inline blocks and the baked memory seeds of an agent for its native file.\n *\n * @param manifest - The agent manifest (`composes`, `memory`).\n * @param srcDir - The agent's source directory: base of local refs and of `memory.blocks[].source`.\n * @param projectDir - The project root (`skaile.lock.yaml`, `.skaile/cache/store`).\n * @param instance - The `skaile.yaml` instance being rendered; `memory.scope: none` bakes the seeds.\n * @param lockAssets - The lock entries the command is about to write. A pin the same command moves\n * (`skaile update`) resolves against them, not against the older lock on disk.\n * @throws `CompositionError` (`@skaile/workspaces/runner/composition-content`) when the runner's\n * content source cannot resolve an inline item; its message names the ref.\n */\nexport async function loadPromptBlocks(\n manifest: AgentManifest,\n srcDir: string,\n projectDir: string,\n instance?: AgentInstanceConfig,\n lockAssets?: Record<string, LockEntry>,\n): Promise<PromptBlocks> {\n const composed: AgentPromptPart[] = [];\n const source = createCompositionContentSource({ agentDir: srcDir, projectDir, lockAssets });\n // An `inline-snapshot` item serves the bytes of `compile_manifest.json`, never its live file,\n // so the file bakes them the way the run reads them. One never compiled has nothing to serve\n // yet (the run asks for `skaile rebuild`): it bakes the source until the install compiles it.\n const compiled = await loadCompiledEntries(srcDir);\n for (const item of manifest.composes ?? []) {\n if (item.kind === \"agent\") continue;\n const binding = resolveBinding(item);\n if (!binding.startsWith(\"inline\")) continue;\n const pinned =\n binding === \"inline-snapshot\"\n ? compiled.find(\n (e) =>\n e.asset_ref === item.ref && e.kind === item.kind && e.binding === \"inline-snapshot\",\n )\n : undefined;\n const content = pinned ? pinned.content : (await source.load(item.ref, item.kind)).content;\n if (content) composed.push({ text: content, source: item.ref });\n }\n\n // Only a seed-only block is baked; a host-backed block shows what the host holds, at run time.\n const memory: AgentPromptMemoryBlock[] = [];\n if (instance?.memory?.scope === \"none\") {\n const composedRefs = new Set(\n (manifest.composes ?? []).map((item) => item.ref.replace(/^\\.\\//, \"\")),\n );\n for (const block of manifest.memory?.blocks ?? []) {\n if (!block.source) continue;\n const file = join(srcDir, block.source);\n // The runner strips frontmatter only from a pinned item (a convention file or a composes ref).\n const pinned =\n CONVENTION_SEEDS.has(block.source.replace(/^\\.\\//, \"\")) ||\n composedRefs.has(block.source.replace(/^\\.\\//, \"\"));\n const seed = pinned ? readText(file) : readRaw(file);\n if (seed === undefined) continue;\n memory.push({\n name: block.name,\n scope: block.scope,\n maxChars: block.max_chars,\n source: block.source,\n content: seed,\n persisted: false,\n });\n }\n }\n return { composed, memory };\n}\n\n/**\n * The loaded prompt extensions as parts that carry their config path, the identity a native file\n * and a run find them by. A missing or empty file is left out, as the runner leaves it out.\n */\nexport function loadPromptExtensionParts(\n paths: readonly string[] | undefined,\n projectDir: string,\n): AgentPromptPart[] {\n const parts: AgentPromptPart[] = [];\n for (const path of paths ?? []) {\n const text = loadPromptExtensions([path], projectDir)[0];\n if (text) parts.push({ text, source: path });\n }\n return parts;\n}\n","/**\n * Agent installation — renders a GitAgent package (agent.yaml + SOUL.md + RULES.md)\n * into the framework-native format (`.claude/agents/<name>.md`, `.omp/agents/<name>/`,\n * `.codex/agents/<name>.toml`) and resolves abilities, contracts, fragments, and\n * prompt extensions from the workspace config along the way.\n *\n * System prompt phases (per agent):\n * 1. extends merge — inherit from parent agent.yaml if manifest.extends is set\n * 2. instance overrides — model / budget / lifecycle of the `skaile.yaml` instance\n * 3. ability refs — read SKILL.md frontmatter of the composed skills\n * 4. contract refs — locate CONTRACT.md files of the composed contracts\n * 5. fragments — resolve framework fragments (agent-mode, handoff, etc.)\n * 6. prompt-extensions — load per-project markdown extensions from skaile.yaml\n *\n * Used by `installer.ts` (the asset-install path, one agent asset under its own\n * name) and `install-instances.ts` (`skaile install`, one rendering per\n * `skaile.yaml` agent instance, named by the instance id). Sub-agents composed as\n * `composes: [{ kind: agent }]` (binding `delegate`, the default) are installed\n * flat (no nesting) in the same deploy directory; `binding: run` sub-agents are\n * host-executed and get no native file.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, join, relative, resolve } from \"node:path\";\nimport type {\n AgentInstanceConfig,\n HarnessName,\n LockEntry,\n SkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport {\n AGENT_INSTANCE_ID_PATTERN,\n HARNESS_TARGETS,\n parseFrontmatter as parseMarkdownFrontmatter,\n parseAssetRefLoose,\n resolveAgentDefinitionDir,\n} from \"@skaile/workspaces/core\";\nimport type { AgentComposeItem, AgentLifecycle } from \"@skaile/workspaces/types/manifests\";\nimport { parse as parseYaml } from \"yaml\";\nimport { loadPromptBlocks, loadPromptExtensionParts } from \"./composed-blocks.js\";\nimport {\n type AbilityRef,\n type ConnectorRef,\n type ContractRef,\n type FragmentContext,\n resolveFragments,\n} from \"./fragments.js\";\nimport { type AgentManifest, type AgentRenderInput, renderAgentToFramework } from \"./renderers.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Source file of the legacy markdown agent form: frontmatter + the system prompt as body. */\nconst AGENT_MD_FILE = \"AGENT.md\";\n\n/** A Claude-style `tools:` value (`\"Read, Grep\"` or a list) as the manifest's `tools.allowed`. */\nfunction toolsFromMarkdown(value: unknown): AgentManifest[\"tools\"] | undefined {\n if (Array.isArray(value)) return { allowed: value.map(String) };\n if (typeof value === \"string\") {\n const allowed = value.split(/[,\\s]+/).filter(Boolean);\n return allowed.length > 0 ? { allowed } : undefined;\n }\n return value && typeof value === \"object\" ? (value as AgentManifest[\"tools\"]) : undefined;\n}\n\n/**\n * The `AGENT.md` form of an agent as a manifest: the frontmatter, with the\n * Claude-style scalar `model:` / `tools:` shapes mapped to the manifest's\n * `model.preferred` / `tools.allowed`, and `metadata.version` read as `version`.\n */\nfunction readAgentMdManifest(agentDir: string): { manifest: AgentManifest; body: string } | null {\n const mdPath = join(agentDir, AGENT_MD_FILE);\n if (!existsSync(mdPath)) return null;\n try {\n const { data, body } = parseMarkdownFrontmatter(readFileSync(mdPath, \"utf-8\"));\n const meta = data.metadata as { version?: unknown } | undefined;\n const manifest: Record<string, unknown> = { ...data };\n if (manifest.version === undefined && meta?.version !== undefined) {\n manifest.version = String(meta.version);\n }\n if (typeof data.model === \"string\") manifest.model = { preferred: data.model };\n if (data.tools !== undefined) manifest.tools = toolsFromMarkdown(data.tools);\n return { manifest: manifest as AgentManifest, body };\n } catch {\n return null;\n }\n}\n\n/**\n * The agent's manifest: `agent.yaml`, else the frontmatter of the legacy\n * `AGENT.md`. `null` when the directory holds neither (or it cannot be parsed).\n */\nexport function readManifest(agentDir: string): AgentManifest | null {\n const yamlPath = join(agentDir, \"agent.yaml\");\n if (!existsSync(yamlPath)) return readAgentMdManifest(agentDir)?.manifest ?? null;\n try {\n return parseYaml(readFileSync(yamlPath, \"utf-8\")) as AgentManifest;\n } catch {\n return null;\n }\n}\n\nfunction readFile(agentDir: string, name: string): string | null {\n const p = join(agentDir, name);\n if (!existsSync(p)) return null;\n try {\n return readFileSync(p, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/**\n * The agent's identity text: `SOUL.md`; for an `AGENT.md` agent the markdown body\n * comes first, so a `SOUL.md` next to it extends the prompt rather than replacing it.\n */\nexport function readSoul(agentDir: string): string | null {\n const soul = readFile(agentDir, \"SOUL.md\");\n if (existsSync(join(agentDir, \"agent.yaml\"))) return soul;\n const body = readAgentMdManifest(agentDir)?.body;\n if (!body) return soul;\n return soul ? `${body}\\n\\n${soul}` : body;\n}\n\n/**\n * A name becomes a file or directory name under the deploy dir; one with a path\n * segment (`../x`, `a/b`) would write outside it. Refused, never sanitized.\n */\nfunction isSafeFileName(name: string): boolean {\n return name.length > 0 && name !== \".\" && name !== \"..\" && !/[\\\\/\\0]/.test(name);\n}\n\n/** Extract YAML frontmatter from a markdown file (content between first two --- delimiters). */\nfunction parseFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n try {\n return (parseYaml(match[1]!) as Record<string, unknown>) ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Merge parent and child agent manifests.\n * Scalars: child wins. Arrays: parent + child, deduplicated (`composes` by\n * kind + ref + slot id, other arrays by value).\n */\nfunction mergeManifests(parent: AgentManifest, child: AgentManifest): AgentManifest {\n const result: AgentManifest = { ...parent };\n for (const [k, val] of Object.entries(child) as [keyof AgentManifest, unknown][]) {\n if (val === undefined) continue;\n const parentVal = result[k as keyof AgentManifest];\n if (k === \"composes\" && Array.isArray(val) && Array.isArray(parentVal)) {\n const merged = new Map<string, AgentComposeItem>();\n for (const item of [...parentVal, ...val] as AgentComposeItem[]) {\n merged.set(`${item.kind}\\u0000${item.ref}\\u0000${item.id ?? \"\"}`, item);\n }\n result.composes = [...merged.values()];\n } else if (Array.isArray(val) && Array.isArray(parentVal)) {\n (result as Record<string, unknown>)[k] = [...new Set([...parentVal, ...val])];\n } else {\n (result as Record<string, unknown>)[k] = val;\n }\n }\n return result;\n}\n\n/** Agent folders whose missing parent was already reported in the current run. */\nconst reportedMissingParents = new Set<string>();\n\n/**\n * Start a new run for the missing-parent warning: an `install`, `add` or `update` calls it first,\n * so one command says it once per agent, and a long-lived process (`serve`, the repl, an\n * embedder) says it again in its next command instead of once per process.\n */\nexport function resetMissingParentWarnings(): void {\n reportedMissingParents.clear();\n}\n\n/** The end both missing-parent lines share; {@link isMissingParentWarning} tells them by it. */\nconst MISSING_PARENT_TAIL = \"installed without the parent's settings.\";\n\n/**\n * The line for an agent whose `extends` parent is not there, or `null` when the agent has no\n * `extends` or the parent holds a manifest. A parent outside the agent's own folder is not part\n * of a store or library copy, so skaile cannot resolve it: the line says so, and what the\n * publisher has to change.\n */\nexport function missingParentWarning(manifest: AgentManifest, srcDir: string): string | null {\n if (!manifest.extends) return null;\n const parentDir = resolve(srcDir, manifest.extends);\n if (readManifest(parentDir)) return null;\n const outside = relative(resolve(srcDir), parentDir).startsWith(\"..\");\n const name = manifest.name ?? basename(srcDir);\n return outside\n ? `agent ${name} extends \"${manifest.extends}\", a parent outside its own folder that this copy does not hold: ${MISSING_PARENT_TAIL} The publisher must ship the parent inside the agent or drop \\`extends\\`.`\n : `agent ${name} extends \"${manifest.extends}\", but no agent.yaml or AGENT.md is there: ${MISSING_PARENT_TAIL}`;\n}\n\n/** True for a line {@link missingParentWarning} returns. */\nexport function isMissingParentWarning(line: string): boolean {\n return line.includes(MISSING_PARENT_TAIL);\n}\n\n/**\n * Phase 1: inherit scalars/arrays from a parent agent when `manifest.extends` is set.\n * Returns the (possibly merged) manifest. A parent that is not there leaves the agent without\n * its inheritance and pushes one {@link missingParentWarning}, once per agent folder and run (see\n * {@link resetMissingParentWarnings}): the install and the instance render of one command both read\n * the same manifest.\n */\nfunction applyExtendsMerge(\n manifest: AgentManifest,\n srcDir: string,\n warnings: string[],\n): AgentManifest {\n if (!manifest.extends) return manifest;\n const parentManifest = readManifest(resolve(srcDir, manifest.extends));\n if (parentManifest) {\n return mergeManifests(parentManifest, manifest);\n }\n if (reportedMissingParents.has(resolve(srcDir))) return manifest;\n reportedMissingParents.add(resolve(srcDir));\n const line = missingParentWarning(manifest, srcDir);\n if (line) warnings.push(line);\n return manifest;\n}\n\n/**\n * Phase 2: apply the instance's overrides to the asset's manifest — the model\n * selector, the turn budget (`budget.max_turns` → `runtime.max_turns`) and the\n * lifecycle. Returns the effective manifest and lifecycle.\n */\nfunction applyInstanceOverrides(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): { manifest: AgentManifest; lifecycle: AgentLifecycle } {\n const lifecycle = instance?.lifecycle ?? manifest.lifecycle ?? \"standing\";\n if (!instance) return { manifest, lifecycle };\n const effective: AgentManifest = { ...manifest, lifecycle };\n if (instance.model) {\n effective.model = { ...manifest.model, ...instance.model } as AgentManifest[\"model\"];\n }\n if (instance.budget?.max_turns !== undefined) {\n effective.runtime = { ...manifest.runtime, max_turns: instance.budget.max_turns };\n }\n return { manifest: effective, lifecycle };\n}\n\n/**\n * The name a composed asset is installed under: the asset name of a canonical\n * ref (`skill:@pub/name#1.0.0` → `name`), else the last path segment\n * (`./skills/name` → `name`).\n */\nfunction composeRefName(ref: string): string {\n const parsed = parseAssetRefLoose(ref);\n if (parsed) return parsed.name;\n const tail = ref.replace(/\\/+$/, \"\").split(\"/\").pop() ?? ref;\n return tail.replace(/^[a-z-]+:/, \"\").replace(/#.*$/, \"\") || ref;\n}\n\n/** Names of the composed items of `kind`, in declaration order, de-duplicated. */\nfunction composedNames(manifest: AgentManifest, kind: string): string[] {\n const names = (manifest.composes ?? [])\n .filter((item) => item.kind === kind)\n .map((item) => composeRefName(item.ref));\n return [...new Set(names)];\n}\n\n/**\n * Names of the agents the agent at `srcDir` calls as `delegate` sub-agents (its `kind: agent`\n * composes whose binding is not `run`). {@link installAgent} renders them next to it as\n * sub-agents, so a caller that renders the same agent on its own must do so as one too.\n */\nexport function delegateNamesOf(srcDir: string): string[] {\n const manifest = readManifest(srcDir);\n const names = (manifest?.composes ?? [])\n .filter((item) => item.kind === \"agent\" && item.binding !== \"run\")\n .map((item) => composeRefName(item.ref));\n return [...new Set(names)];\n}\n\n/**\n * Names of the agents the agent at `srcDir` composes: `run` holds those it calls through\n * `agent.run` (`binding: run`), `delegate` the others (rendered as native sub-agents). An agent\n * named under both bindings is in both.\n */\nexport function composedAgentNamesOf(srcDir: string): { run: string[]; delegate: string[] } {\n const items = (readManifest(srcDir)?.composes ?? []).filter((item) => item.kind === \"agent\");\n const names = (run: boolean): string[] => [\n ...new Set(\n items.filter((item) => (item.binding === \"run\") === run).map((i) => composeRefName(i.ref)),\n ),\n ];\n return { run: names(true), delegate: names(false) };\n}\n\n/**\n * The MCP servers an agent's `mcp-server` slots are bound to: the server the\n * instance's `connectors` map binds the slot id to, else the composed asset's\n * own name (the id its server is rendered under).\n */\nfunction boundMcpServers(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): string[] {\n const names = (manifest.composes ?? [])\n .filter((item) => item.kind === \"mcp-server\")\n .map(\n (item) => (item.id ? instance?.connectors?.[item.id] : undefined) ?? composeRefName(item.ref),\n );\n return [...new Set(names)];\n}\n\n/**\n * The workspace connector ids an agent's `connector` slots are bound to: the connector the\n * instance's `connectors` map binds the slot id to, else the slot id (a slot is usually named\n * after the workspace connector it uses), else the composed asset's own name.\n */\nfunction boundConnectorIds(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): string[] {\n const ids = (manifest.composes ?? [])\n .filter((item) => item.kind === \"connector\")\n .flatMap((item) => {\n const bound = item.id ? instance?.connectors?.[item.id] : undefined;\n return bound ? [bound] : [item.id, composeRefName(item.ref)].filter((s): s is string => !!s);\n });\n return [...new Set(ids)];\n}\n\n/** Phase 3: resolve ability refs — read description from the installed SKILL.md of each composed skill. */\nfunction resolveAbilityRefs(\n manifest: AgentManifest,\n workspaceRoot: string,\n skillsRelDir: string,\n): AbilityRef[] {\n const abilityRefs: AbilityRef[] = [];\n for (const name of composedNames(manifest, \"skill\")) {\n const skillMdPath = join(workspaceRoot, skillsRelDir, name, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n try {\n const fm = parseFrontmatter(readFileSync(skillMdPath, \"utf-8\"));\n const desc = typeof fm.description === \"string\" ? fm.description : undefined;\n if (desc) abilityRefs.push({ name, description: desc });\n } catch {\n // skip unreadable SKILL.md\n }\n }\n return abilityRefs;\n}\n\n/** Phase 4: resolve contract refs — locate the CONTRACT.md of each composed contract in the skills dir. */\nfunction resolveContractRefs(\n manifest: AgentManifest,\n workspaceRoot: string,\n skillsRelDir: string,\n): ContractRef[] {\n const contractRefs: ContractRef[] = [];\n for (const name of composedNames(manifest, \"contract\")) {\n const contractAbsPath = join(workspaceRoot, skillsRelDir, name, \"CONTRACT.md\");\n if (!existsSync(contractAbsPath)) continue;\n contractRefs.push({ name, relativePath: relative(workspaceRoot, contractAbsPath) });\n }\n return contractRefs;\n}\n\n/** A `kind: agent` composition item rendered as its own native sub-agent file. */\nexport interface DelegateSubAgent {\n /** `composes[].ref` as written. */\n ref: string;\n /** Absolute path of the sub-agent's source directory. */\n srcDir: string;\n /** File name: the item's `as`, else the sub-agent's own `name`. */\n name: string;\n /** `composes[].as`, forwarded as the install name override. */\n alias: string | undefined;\n}\n\n/**\n * Phase 5a: the `delegate` sub-agents of an agent — its `kind: agent` items\n * whose binding is not `run` (`delegate` is the default for the harnesses that\n * render native agent files). Catalog refs resolve like `agents.<id>.ref`;\n * anything else is a path relative to the composing agent's directory. An\n * unresolvable item is skipped with a warning.\n */\nfunction resolveDelegates(\n manifest: AgentManifest,\n agentName: string,\n srcDir: string,\n workspaceRoot: string,\n warnings: string[],\n): DelegateSubAgent[] {\n const delegates: DelegateSubAgent[] = [];\n for (const item of manifest.composes ?? []) {\n if (item.kind !== \"agent\" || item.binding === \"run\") continue;\n let subSrc: string | undefined;\n try {\n subSrc =\n item.ref.startsWith(\"agent:\") || item.ref.startsWith(\"ai-assets://\")\n ? resolveAgentDefinitionDir(workspaceRoot, item.ref)\n : resolve(srcDir, item.ref);\n } catch (err) {\n warnings.push(\n `Sub-agent ${item.ref} (from ${agentName}): ${err instanceof Error ? err.message : String(err)}`,\n );\n continue;\n }\n if (!subSrc || !existsSync(subSrc)) {\n warnings.push(`Sub-agent source not found: ${item.ref} (from ${agentName})`);\n continue;\n }\n const sub = readManifest(subSrc);\n const name = item.as ?? sub?.name ?? basename(subSrc);\n // The name is a file name under the deploy dir: refuse anything that is not a plain id.\n if (typeof name !== \"string\" || !AGENT_INSTANCE_ID_PATTERN.test(name)) {\n warnings.push(\n `Sub-agent ${item.ref} (from ${agentName}): name ${JSON.stringify(name)} must match ${AGENT_INSTANCE_ID_PATTERN} — skipped`,\n );\n continue;\n }\n delegates.push({\n ref: item.ref,\n srcDir: subSrc,\n name,\n alias: item.as,\n });\n }\n return delegates;\n}\n\n/**\n * The source folders of the `delegate` sub-agents of the agent at `srcDir`, the sub-agents of\n * those included, each once: the agents {@link installAgent} renders next to it. A sub-agent\n * that cannot be resolved is left out (the render warns about it).\n */\nexport function delegateSourceDirs(srcDir: string, workspaceRoot: string): string[] {\n const found: string[] = [];\n const seen = new Set([resolve(srcDir)]);\n const walk = (dir: string): void => {\n const manifest = readManifest(dir);\n if (!manifest) return;\n const name = manifest.name ?? basename(dir);\n for (const delegate of resolveDelegates(manifest, name, dir, workspaceRoot, [])) {\n const abs = resolve(delegate.srcDir);\n if (seen.has(abs)) continue;\n seen.add(abs);\n found.push(abs);\n walk(abs);\n }\n };\n walk(srcDir);\n return found;\n}\n\n/** Phase 5b: assemble the fragment context from the manifest, workspace config, and resolved refs. */\nfunction buildFragmentContext(\n subAgentNames: string[],\n harness: string,\n skillsRelDir: string,\n wsConfig: SkWorkspaceConfig | undefined,\n abilityRefs: AbilityRef[],\n contractRefs: ContractRef[],\n /** Set for an agent that another agent calls: the connector ids its own slots are bound to. */\n callee?: { subAgent: boolean; connectorIds: string[] },\n): FragmentContext {\n const connectors: ConnectorRef[] = (wsConfig?.connectors ?? [])\n .filter((c) => !callee || callee.connectorIds.includes(c.id))\n .map((c) => ({\n id: c.id,\n driver: c.driver,\n access: c.access ?? \"read-write\",\n }));\n\n const agentsRelDir = HARNESS_TARGETS[harness as HarnessName]?.local.agent ?? \"\";\n\n return {\n framework: harness,\n skillsDir: skillsRelDir,\n agentsDir: agentsRelDir,\n subAgents: subAgentNames,\n ...(callee ? { subAgent: callee.subAgent } : {}),\n connectors,\n abilityRefs,\n contractRefs,\n };\n}\n\n// ── Core installation ─────────────────────────────────────────────────────────\n\n/** What {@link prepareAgentRender} gathers: the render input and the `delegate` sub-agents to install beside it. */\nexport interface PreparedAgentRender {\n input: AgentRenderInput;\n delegates: DelegateSubAgent[];\n}\n\n/**\n * Gather everything the agent's native file is rendered from (phases 1-5 of the header): the\n * one input set `assembleAgent` builds the prompt from. `installAgent` renders it;\n * `skaile run --dry-run --print-prompt` assembles the same set without writing, so the printed\n * prompt and the file body cannot differ.\n *\n * @param warnings - Receives the non-fatal notes of the phases.\n * @returns `null` when the directory is no agent package or the name is no valid file name (a\n * warning says which).\n */\nexport async function prepareAgentRender(\n srcDir: string,\n agentDeployDir: string,\n workspaceRoot: string,\n harness: string,\n skillsRelDir: string,\n nameOverride: string | undefined,\n wsConfig: SkWorkspaceConfig | undefined,\n warnings: string[],\n instance?: AgentInstanceConfig,\n delegated = false,\n assetVersion?: string,\n /** Composed and memory blocks the caller already has (the runner's); skips reading them. */\n resolved?: Pick<AgentRenderInput, \"composed\" | \"memory\">,\n /** The lock entries the command is about to write; composed pins resolve against them. */\n lockAssets?: Record<string, LockEntry>,\n): Promise<PreparedAgentRender | null> {\n const rawManifest = readManifest(srcDir);\n const initialManifest =\n rawManifest && assetVersion && !rawManifest.version\n ? { ...rawManifest, version: assetVersion }\n : rawManifest;\n if (!initialManifest) {\n warnings.push(`${srcDir} has no agent.yaml or AGENT.md — skipping (not an agent package)`);\n return null;\n }\n\n // Phase 1: extends merge — inherit scalars/arrays from parent agent\n // Phase 2: instance overrides — model / budget / lifecycle\n const { manifest, lifecycle } = applyInstanceOverrides(\n applyExtendsMerge(initialManifest, srcDir, warnings),\n instance,\n );\n\n const agentName = nameOverride ?? manifest.name ?? basename(srcDir);\n if (typeof agentName !== \"string\" || !isSafeFileName(agentName)) {\n warnings.push(\n `${srcDir}: agent name ${JSON.stringify(agentName)} is not a valid file name (no path separators) — skipping`,\n );\n return null;\n }\n\n // Phase 3: resolve ability refs — read description from installed SKILL.md files\n const abilityRefs = resolveAbilityRefs(manifest, workspaceRoot, skillsRelDir);\n\n // Phase 4: resolve contract refs — locate CONTRACT.md files in the skills dir\n const contractRefs = resolveContractRefs(manifest, workspaceRoot, skillsRelDir);\n\n // Phase 5: delegate sub-agents, fragment context, framework fragments + prompt extensions\n const delegates = resolveDelegates(manifest, agentName, srcDir, workspaceRoot, warnings);\n // A `role`, and a `delegate` sub-agent, is called by another agent: it is told so, and sees\n // only the connectors it composes.\n const subAgent = lifecycle === \"role\" || delegated;\n const fragmentCtx = buildFragmentContext(\n delegates.map((d) => d.name),\n harness,\n skillsRelDir,\n wsConfig,\n abilityRefs,\n contractRefs,\n subAgent ? { subAgent, connectorIds: boundConnectorIds(manifest, instance) } : undefined,\n );\n\n const frameworkFragments = resolveFragments(\n fragmentCtx,\n wsConfig?.agent?.fragments,\n workspaceRoot,\n );\n const promptExtensions = loadPromptExtensionParts(\n wsConfig?.agent?.[\"prompt-extensions\"],\n workspaceRoot,\n );\n\n // Composed inline blocks and memory seeds are baked into the file like the convention files,\n // so the file holds what `skaile run` sends (one assembler, ADR 0018).\n const blocks =\n resolved ?? (await loadPromptBlocks(manifest, srcDir, workspaceRoot, instance, lockAssets));\n\n const input: AgentRenderInput = {\n manifest,\n soul: readSoul(srcDir),\n rules: readFile(srcDir, \"RULES.md\"),\n duties: readFile(srcDir, \"DUTIES.md\"),\n agentName,\n agentDeployDir,\n workspaceRoot,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n composed: blocks.composed,\n memory: blocks.memory,\n lifecycle,\n skills: composedNames(manifest, \"skill\"),\n mcpServers: boundMcpServers(manifest, instance),\n srcDir,\n };\n\n return { input, delegates };\n}\n\n/**\n * Install a single GitAgent source directory using the appropriate renderer.\n *\n * When `includeSubAgents` is `true`, recursively installs the `delegate`\n * sub-agents (`composes: [{ kind: agent }]`) as separate flat agents in the\n * same deploy directory (no nesting). Tracks visited directories to prevent\n * infinite loops in sub-agent cycles.\n *\n * @param srcDir - Absolute path to the GitAgent source directory (contains `agent.yaml`).\n * @param agentDeployDir - Absolute path to the framework's agent deploy directory.\n * @param workspaceRoot - Absolute path to the workspace root.\n * @param harness - Agent framework ID used to select the renderer.\n * @param skillsRelDir - Relative path to the installed skills dir (e.g. `\".claude/skills\"`).\n * @param nameOverride - Override name for the installed agent. Defaults to `manifest.name`;\n * an instance render passes the instance id.\n * @param includeSubAgents - When `true`, recursively install `delegate` sub-agents.\n * @param visited - Set of resolved source paths already processed (cycle guard).\n * @param wsConfig - Workspace config from `skaile.yaml` (fragments, connectors, extensions).\n * @param log - Optional logger callback for progress messages.\n * @param instance - The `skaile.yaml` instance being rendered; its model / budget / lifecycle\n * override the asset's and its `connectors` map binds the `mcp-server` slots.\n * @returns Object with `created` file paths (every rendered file), `changed` (the subset whose\n * bytes differ from what was deployed before) and `warnings` list.\n * @docLink packages/asset-manager/concepts#install-agent\n */\nexport async function installAgent(\n srcDir: string,\n agentDeployDir: string,\n workspaceRoot: string,\n harness: string,\n /** Relative path to the installed skills dir (e.g. \".claude/skills\") */\n skillsRelDir: string,\n nameOverride: string | undefined,\n includeSubAgents: boolean,\n visited: Set<string>,\n wsConfig: SkWorkspaceConfig | undefined,\n log?: (msg: string) => void,\n instance?: AgentInstanceConfig,\n /** `true` for a `delegate` sub-agent rendered for the agent that calls it. */\n delegated = false,\n /**\n * The version the lock and `info` give the asset. A manifest that declares none (an `AGENT.md`\n * agent without `metadata.version`) takes it, so the rendered `agent.yaml` names the version\n * the lock holds.\n */\n assetVersion?: string,\n /** The lock entries the command is about to write; composed pins resolve against them. */\n lockAssets?: Record<string, LockEntry>,\n): Promise<{ created: string[]; changed: string[]; warnings: string[] }> {\n const created: string[] = [];\n const changed: string[] = [];\n const warnings: string[] = [];\n\n const realSrc = resolve(srcDir);\n if (visited.has(realSrc)) return { created, changed, warnings };\n visited.add(realSrc);\n\n const prepared = await prepareAgentRender(\n srcDir,\n agentDeployDir,\n workspaceRoot,\n harness,\n skillsRelDir,\n nameOverride,\n wsConfig,\n warnings,\n instance,\n delegated,\n assetVersion,\n undefined,\n lockAssets,\n );\n if (!prepared) return { created, changed, warnings };\n const { input, delegates } = prepared;\n log?.(`Installing git-agent: ${input.agentName} (${harness})`);\n\n const result = renderAgentToFramework(input, harness, log);\n created.push(...result.created);\n changed.push(...result.changed);\n warnings.push(...result.warnings);\n\n // Recursively install delegate sub-agents as flat top-level agents\n if (includeSubAgents) {\n for (const delegate of delegates) {\n const sub = await installAgent(\n delegate.srcDir,\n agentDeployDir,\n workspaceRoot,\n harness,\n skillsRelDir,\n delegate.alias, // undefined → the sub-agent's own name from its agent.yaml\n includeSubAgents,\n visited,\n wsConfig,\n log,\n undefined,\n true,\n undefined,\n lockAssets,\n );\n created.push(...sub.created);\n changed.push(...sub.changed);\n warnings.push(...sub.warnings);\n }\n }\n\n return { created, changed, warnings };\n}\n","/**\n * Asset deployment — copies assets into framework dirs by default (self-contained,\n * cache-safe, portable); `--link` opts into a symlink for the local-path dev loop.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport {\n cpSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n mkdtempSync,\n readdirSync,\n readlinkSync,\n renameSync,\n rmSync,\n statSync,\n symlinkSync,\n type Stats,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { basename, dirname, join, normalize, relative, resolve, sep } from \"node:path\";\nimport type {\n AgentInstanceConfig,\n AgentPromptSectionsInput,\n AiComponent,\n AssembledAgent,\n CatalogEntry,\n HarnessName,\n LockEntry,\n SkWorkspaceConfig,\n SourceDeclaration,\n} from \"@skaile/workspaces/core\";\nimport {\n agentSourceCacheDir,\n applyPatch,\n assembleAgent,\n assetRefToStr,\n computeHash,\n HARNESS_TARGETS,\n deployedBase,\n deployedDir,\n deployedPaths,\n globalSkaileDir,\n harnessNameForHarnessId,\n isDeployed,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport {\n isEnvFileName,\n isLibraryManifestAtAssetRoot,\n isNonAssetDir,\n isNonAssetFile,\n isSecretFileName,\n librarySymlinkMessage,\n listAssetFiles,\n listSecretFiles,\n listSkippedSymlinks,\n} from \"@skaile/workspaces/core/publish-manifest\";\nimport {\n AGENT_BODY_PLACEHOLDER,\n CONTRACT_BODY_PLACEHOLDER,\n FLOW_NODE_INSTRUCTION_PLACEHOLDER,\n PRESET_ITEM_PLACEHOLDER_REF,\n PROMPT_BODY_PLACEHOLDER,\n SKILL_BODY_PLACEHOLDER,\n SKILL_DESCRIPTION_PLACEHOLDER,\n SKILL_DESCRIPTION_PLACEHOLDER_PREFIX,\n} from \"@skaile/workspaces/types/manifests\";\nimport type { IAssetKindProvider, IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport { CompositionError } from \"@skaile/workspaces/runner/composition-content\";\nimport { isMap, isSeq, parseDocument, stringify as stringifyYaml } from \"yaml\";\nimport {\n composedAgentNamesOf,\n type DelegateSubAgent,\n delegateNamesOf,\n installAgent,\n prepareAgentRender,\n readManifest,\n readSoul,\n} from \"./install-agent.js\";\nimport {\n agentPromptInput,\n CODEX_IDENTITY_DIR,\n harnessTargetSupportsAgents,\n type Log,\n} from \"./renderers.js\";\n\nexport type { Log } from \"./renderers.js\";\n\nconst noop: Log = () => {};\n\n/**\n * The printable canonical ref of a resolved entry — `kind:@publisher/name#version`,\n * the one ref grammar the CLI shows. An entry whose `publisher` is a clone key\n * carries the real ref in `canonicalRef`; with neither a `canonicalRef` nor a\n * publisher there is nothing to namespace it by, so it falls back to `kind:name`.\n */\nexport function canonicalEntryRef(entry: CatalogEntry): string {\n if (entry.canonicalRef) return entry.canonicalRef;\n const publisher = entry.publisher?.replace(/^@/, \"\");\n if (!publisher) return `${entry.kind}:${entry.name}`;\n return assetRefToStr({\n kind: entry.kind,\n name: entry.name,\n publisher,\n pin: entry.version || undefined,\n });\n}\n\n// ── Filesystem helpers ────────────────────────────────────────────────────────\n\nfunction clearDest(dest: string): void {\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n } catch {}\n}\n\n/**\n * A credential file (not an `.env*` file, which stays the owner's local file) inside a deployed\n * copy: releases before 5.17 deployed these (`.npmrc`, `id_rsa`, `token.json`, ...), a deploy now\n * withholds them (p1040). A re-deploy deletes the leftover and `check` reports it as extra, so a\n * leaked credential is not kept for good.\n */\nfunction isLeakedSecret(name: string): boolean {\n return isSecretFileName(name) && !isEnvFileName(name);\n}\n\n/**\n * Empty a deployed asset directory before a copy deploy, but keep what is not part of an\n * asset (`.env`, `.venv/`, `__pycache__/`, `*.pyc`, ...): those are the owner's local files, the\n * lock never covers them, so a re-deploy must not delete them. Anything else — including a\n * symlink — goes. A `dest` that is a symlink or a file is removed whole.\n */\nfunction clearDeployedAsset(dest: string): void {\n let s: ReturnType<typeof lstatSync>;\n try {\n s = lstatSync(dest);\n } catch {\n return;\n }\n if (!s.isDirectory()) {\n clearDest(dest);\n return;\n }\n const empty = (dir: string): boolean => {\n let kept = false;\n for (const e of readdirSync(dir, { withFileTypes: true })) {\n const path = join(dir, e.name);\n if (e.isDirectory()) {\n if (isNonAssetDir(e.name, dir === dest)) kept = true;\n else if (!empty(path)) kept = true;\n else rmSync(path, { recursive: true, force: true });\n } else if (e.isFile() && isNonAssetFile(e.name) && !isLeakedSecret(e.name)) {\n kept = true;\n } else {\n rmSync(path, { force: true });\n }\n }\n return !kept;\n };\n try {\n empty(dest);\n } catch {\n clearDest(dest);\n }\n}\n\n/**\n * The harness component directory a kind installs into — the provider's\n * `installTarget` — or `undefined` for composition-only kinds (connector,\n * mcp-server, knowledge, persona, ruleset, preset) and unregistered kinds.\n * The registry is the only authority: there is no static list of deployable kinds.\n */\nexport function installTargetOf(\n registry: IAssetKindRegistry,\n kind: string,\n): AiComponent | undefined {\n return registry.getProvider(kind)?.installTarget;\n}\n\n/**\n * The manifest file of a resolved entry. `source` is normally the manifest file\n * itself; a directory source is searched for the provider's manifest.\n * `undefined` when `source` is a directory holding none.\n */\nfunction manifestFileOf(provider: IAssetKindProvider, source: string): string | undefined {\n if (!statSync(source).isDirectory()) return source;\n const hit = readdirSync(source).find((f) => provider.matchesPath(f));\n return hit ? join(source, hit) : undefined;\n}\n\n/**\n * A resolved entry ready to deploy: a {@link CatalogEntry} that may carry the\n * asset's authoritative file list.\n */\nexport interface DeployableEntry extends CatalogEntry {\n /**\n * Asset files relative to the manifest's directory. Set for store-staged\n * assets, whose verified pointer (not the provider's default filter) defines\n * what the asset is — a manifest-mode publish may list files the default filter\n * would not pick. Absent → the provider's `defaultFileFilter`.\n */\n files?: readonly string[];\n}\n\n/**\n * Throw when the asset's own folder holds a symlink the library would refuse. A lone manifest\n * file shares its directory with other assets, so only an asset that owns its directory (several\n * files, or a directory named after it) is checked.\n */\nfunction assertNoSymlinks(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n manifestPath: string | null | undefined,\n): void {\n let root = entry.source;\n if (manifestPath) {\n const filter = provider.defaultFileFilter(manifestPath);\n const files = entry.files ?? filter.files;\n if (files.length <= 1 && basename(filter.assetRoot) !== entry.name) return;\n root = filter.assetRoot;\n }\n const [rel] = listSkippedSymlinks(root);\n if (rel === undefined) return;\n const link = join(root, rel);\n throw new Error(\n `${canonicalEntryRef(entry)}: ${librarySymlinkMessage({ path: join(basename(root), rel), target: readlinkSync(link) })} Nothing was added.`,\n );\n}\n\n/**\n * Refuse, before anything is written, every entry whose own folder holds a symlink (p743).\n * `add`, `install` and `update` call this ahead of the first deploy and ahead of the removal of\n * stale assets, so `Nothing was added` is true: a refusal in the middle of {@link deployAll}\n * would leave the copies of the entries before it behind. Composition-only kinds, entries that a\n * `--link` deploy symlinks (no copy) and entries without a readable source are skipped. An agent\n * counts too: it is rendered, but its source is copied into the agent cache.\n */\nexport function assertNoLibrarySymlinks(\n entries: readonly DeployableEntry[],\n registry: IAssetKindRegistry,\n repositories: Record<string, SourceDeclaration> = {},\n link = false,\n): void {\n for (const entry of entries) {\n const provider = registry.getProvider(entry.kind);\n if (!provider?.installTarget) continue;\n if (link) {\n const decl = entry.publisher ? repositories[entry.publisher] : undefined;\n if (decl?.path != null && decl.factory !== true) continue;\n }\n let manifestPath: string | undefined;\n try {\n manifestPath = manifestFileOf(provider, entry.source);\n } catch {\n continue;\n }\n assertNoSymlinks(provider, entry, manifestPath);\n }\n}\n\n/**\n * Copy an asset into `dest`: the entry's explicit `files` when it has them, else\n * exactly the files the provider's `defaultFileFilter` selects (the same set the\n * store publishes and hashes). A directory source without a recognisable\n * manifest is copied whole.\n */\nfunction copyAsset(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n dest: string,\n onSecretFile?: (entry: DeployableEntry, path: string) => void,\n): void {\n const source = entry.source;\n const manifestPath = manifestFileOf(provider, source);\n // A library holds plain files: a symlink in the asset's folder refuses the deploy, as `library\n // index`, `validate` and the publish plan refuse the library (p743). Nothing is cleared or copied.\n assertNoSymlinks(provider, entry, manifestPath);\n clearDeployedAsset(dest);\n if (!manifestPath) {\n // Same ignore list as the content hash: leftovers and symlinks are not part of the asset.\n cpSync(source, dest, {\n recursive: true,\n filter: (src) => {\n if (src === source) return true;\n const name = basename(src);\n const stat = lstatSync(src);\n if (stat.isSymbolicLink()) return false;\n if (isLibraryManifestAtAssetRoot(relative(source, src))) return false;\n // A directory is only left out by name; a file by `isNonAssetFile`: a folder called\n // `credentials` or `build.log` is an ordinary folder.\n if (\n stat.isDirectory() ? isNonAssetDir(name, dirname(src) === source) : isNonAssetFile(name)\n ) {\n if (stat.isFile() && isSecretFileName(name)) {\n onSecretFile?.(entry, join(basename(source), relative(source, src)));\n }\n return false;\n }\n return true;\n },\n });\n return;\n }\n const filter = provider.defaultFileFilter(manifestPath);\n const assetRoot = filter.assetRoot;\n const files = entry.files ?? filter.files;\n mkdirSync(dest, { recursive: true });\n for (const rel of files) {\n const target = join(dest, rel);\n mkdirSync(dirname(target), { recursive: true });\n cpSync(join(assetRoot, rel), target);\n }\n // A lone manifest file shares its directory with other assets: only an asset that owns its\n // directory (several files, or a directory named after it) can say which secrets it drops.\n if (files.length > 1 || basename(assetRoot) === entry.name) {\n if (onSecretFile) {\n for (const rel of listSecretFiles(assetRoot))\n onSecretFile(entry, join(basename(assetRoot), rel));\n }\n }\n}\n\n/**\n * Whether the source file is executable but its deployed copy is not: the bytes match, yet the\n * copy shows as a mode change in `git status`, so a repeat install writes it again (p1657).\n */\nfunction execBitLost(source: string, deployed: string): boolean {\n try {\n return (lstatSync(source).mode & 0o111) !== 0 && (lstatSync(deployed).mode & 0o100) === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Symlink an asset (the `--link` dev-loop). A multi-file asset, or one living in\n * a directory named after it, links its whole directory; a lone manifest file\n * links into `dest/`.\n */\nfunction symlinkAsset(\n provider: IAssetKindProvider,\n source: string,\n dest: string,\n name: string,\n): void {\n clearDest(dest);\n mkdirSync(dirname(dest), { recursive: true });\n const manifestPath = manifestFileOf(provider, source);\n if (!manifestPath) {\n symlinkSync(resolve(source), dest);\n return;\n }\n const { assetRoot, files } = provider.defaultFileFilter(manifestPath);\n if (files.length > 1 || basename(assetRoot) === name) {\n symlinkSync(resolve(assetRoot), dest);\n } else {\n mkdirSync(dest, { recursive: true });\n symlinkSync(resolve(manifestPath), join(dest, basename(manifestPath)));\n }\n}\n\n/** What differs between a deployed asset directory and the bytes a deploy of the entry writes. */\nexport interface DeployedDrift {\n /** Deployed files (relative to the deployed asset directory) whose bytes differ from the source. */\n modified: string[];\n /** Files in the deployed asset directory that the asset does not ship. */\n extra: string[];\n}\n\n/**\n * Compare the deployed copy of `entry` with the bytes a copy deploy writes from its source: the\n * same file set {@link copyAsset} copies, so a tool leftover (`__pycache__/`, `.env`) in the\n * deployed directory is not drift. `null` when there is nothing to compare: a kind that is\n * not copied into a harness directory (composition-only, or an agent, which is rendered), no\n * deployed directory, a symlinked deploy (`--link`) or an unreadable source.\n */\nexport function deployedAssetDrift(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\">,\n): DeployedDrift | null {\n const provider = opts.registry.getProvider(entry.kind);\n const component = provider?.installTarget;\n if (!provider || !component || component === \"agent\") return null;\n const dest = deployedDir(\n component,\n entry.name,\n opts.harness ?? \"claude-code\",\n opts.global ?? false,\n opts.cwd,\n );\n try {\n const deployed = lstatSync(dest);\n if (deployed.isSymbolicLink() || !deployed.isDirectory()) return null;\n const manifestPath = manifestFileOf(provider, entry.source);\n const filter = manifestPath ? provider.defaultFileFilter(manifestPath) : undefined;\n const assetRoot = filter ? filter.assetRoot : entry.source;\n const files = filter ? (entry.files ?? filter.files) : listAssetFiles(entry.source);\n const modified: string[] = [];\n for (const rel of files) {\n const deployedFile = join(dest, rel);\n if (!existsSync(deployedFile)) continue;\n if (computeHash(join(assetRoot, rel)) !== computeHash(deployedFile)) modified.push(rel);\n }\n const expected = new Set(files);\n const extra = [\n ...listAssetFiles(dest),\n ...listSecretFiles(dest).filter((rel) => isLeakedSecret(basename(rel))),\n ].filter((rel) => !expected.has(rel));\n return { modified, extra };\n } catch {\n return null;\n }\n}\n\n/**\n * Whether the deployed copy of `entry` is what a deploy would write, so the deploy skips it.\n * `current`: the manifest, every companion file and the file set match (or the manifest cannot be\n * compared). `stale`: something differs, a deploy rewrites the copy. `missing`: no manifest file\n * in the deployed directory. A companion that is a symlink in the source is no part of the copy\n * (a library holds plain files, `check` ignores it), so it never makes an intact copy stale\n * (p1857). The caller has checked that the entry is a copied kind and its directory exists.\n */\nfunction deployedCopyState(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\">,\n): \"current\" | \"stale\" | \"missing\" {\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component) return \"missing\";\n const dest = deployedDir(\n component,\n entry.name,\n opts.harness ?? \"claude-code\",\n opts.global ?? false,\n opts.cwd,\n );\n const manifestName = basename(entry.source);\n const deployedManifest = join(dest, manifestName);\n // isDeployed() only lstats the dir, so a present-but-empty dir (manifest file deleted) reads as\n // deployed. A missing manifest must never count as \"already deployed\".\n // (existsSync follows symlinks, so for symlinked installs the manifest resolves through to the\n // live source and the hash check below still skips them.)\n if (!existsSync(deployedManifest)) return \"missing\";\n let manifestUnchanged: boolean;\n try {\n manifestUnchanged =\n computeHash(entry.source) === computeHash(deployedManifest) &&\n !execBitLost(entry.source, deployedManifest);\n } catch {\n // Deployed manifest unreadable (e.g. agent rendered to a different path) - skip\n return \"current\";\n }\n // Every other file the deploy writes must be present and identical too - the manifest alone\n // misses a deleted or stale companion (`.gitignore`, `resources/`, `scripts/`) the copy would\n // restore. A companion that cannot be compared counts as changed, so it is healed, not skipped.\n const srcRoot = dirname(entry.source);\n const companionsUnchanged = (entry.files ?? [])\n .filter((rel) => rel !== manifestName)\n .every((rel) => {\n const deployed = join(dest, rel);\n try {\n if (lstatSync(join(srcRoot, rel)).isSymbolicLink()) return true;\n return (\n existsSync(deployed) &&\n computeHash(join(srcRoot, rel)) === computeHash(deployed) &&\n !execBitLost(join(srcRoot, rel), deployed)\n );\n } catch {\n return false;\n }\n });\n // A file the asset does not ship (a stray `extra.txt`) is drift too: the copy clears the\n // directory, so a repeat install restores the asset exactly.\n const strayFiles = deployedAssetDrift(entry, opts)?.extra.length ?? 0;\n return manifestUnchanged && companionsUnchanged && strayFiles === 0 ? \"current\" : \"stale\";\n}\n\n/**\n * The entries a deploy would write: those without a current deployed copy. An intact copy\n * stays as it is, so a library change that does not reach it (a symlink added next to the\n * files) stops no `install` or `update` (p1857).\n */\nexport function entriesNeedingDeploy<T extends DeployableEntry>(\n entries: readonly T[],\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\" | \"link\">,\n): T[] {\n return entries.filter((entry) => {\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component || component === \"agent\") return true;\n const harness = opts.harness ?? \"claude-code\";\n const global = opts.global ?? false;\n if (!isDeployed(component, entry.name, harness, global, opts.cwd)) return true;\n try {\n const dest = deployedDir(component, entry.name, harness, global, opts.cwd);\n if (lstatSync(dest).isSymbolicLink() && opts.link !== true) return true;\n } catch {\n return true;\n }\n return deployedCopyState(entry, { ...opts, harness, global }) !== \"current\";\n });\n}\n\n// ── Deploy options ───────────────────────────────────────────────────────────\n\n/**\n * Options controlling where and how assets are deployed.\n *\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport interface DeployOptions {\n /** Asset-kind registry — decides, per kind, the harness install target and file set. */\n registry: IAssetKindRegistry;\n /** Agent framework to target (determines framework-specific directory layout). Defaults to `\"claude-code\"`. */\n harness?: HarnessName;\n /** When `true`, deploy into the global Skaile cache rather than a project workspace. */\n global?: boolean;\n /** Absolute path to the workspace root. Defaults to `process.cwd()`. */\n cwd?: string;\n /**\n * Opt into a symlink (the author dev-loop) instead of a copy — honoured only\n * when the source has a real local path. Machine-local / not for committing;\n * for store/factory sources (no stable local path) it is a no-op (still copy).\n */\n link?: boolean;\n /**\n * Called once per secret file ({@link isSecretFileName}: `.env*`, private keys, credential\n * files) inside an asset's own directory that a copy deploy leaves out (secrets are never part\n * of an asset), with the path relative to the asset directory's parent.\n */\n onSecretFile?: (entry: DeployableEntry, path: string) => void;\n /**\n * The lock's record of an agent's `../` compose folders: project-relative paths under\n * `.skaile/cache/agents/<agent>/composes/` with sha256. While a record exists the cached\n * folders keep exactly those bytes: a deploy does not copy the library's newer ones (only\n * {@link DeployOptions.refreshComposed} does, p1511).\n */\n lockedComposed?: (agent: string) => ReadonlyArray<{ path: string; sha256: string }> | undefined;\n /** Copy every `../` compose folder from its source again, whatever the lock records (`update`, `add`). */\n refreshComposed?: boolean;\n /**\n * The lock entries the command is about to write. An agent's composed pins resolve against them\n * when it is rendered, so a pin `update` moves does not fail on the older lock still on disk.\n */\n lockAssets?: Record<string, LockEntry>;\n /**\n * Called once per `../` compose folder the lock records but neither the cached copy nor the\n * source holds any more: the source moved on and only `update` moves the lock to it.\n */\n onComposedDrift?: (entry: DeployableEntry, ref: string) => void;\n /**\n * Names of the agents an instance of `skaile.yaml` binds (project scope). The instance's file\n * (`.claude/agents/<instance id>.md`) is their rendering, so no file named after the asset is\n * written for them.\n */\n instanceBoundAgents?: ReadonlySet<string>;\n /**\n * Whether the lock already holds the agent `name`. A skipped asset-named rendering counts as a\n * change only for an agent the lock does not hold yet, so `add` and a first `install` still\n * report it.\n */\n agentLocked?: (name: string) => boolean;\n}\n\n/**\n * Keep the agent's source (`agent.yaml`, `SOUL.md`, …) under\n * `<project>/.skaile/cache/agents/<name>/`, the one place `agents.<id>.ref:\n * agent:@pub/name` resolves an added library / source / store agent from: the\n * deployed copy is a rendering (`.claude/agents/<name>.md`) that has lost the\n * composition, triggers and slots an instance needs. An `AGENT.md` agent is stored\n * in the `agent.yaml` + `SOUL.md` form so every instance consumer reads one shape.\n * A failure is logged, never fatal: the rendered agent is deployed either way.\n */\nfunction materializeAgentSource(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n srcDir: string,\n workspaceRoot: string,\n log: Log,\n opts: DeployOptions,\n): void {\n const dest = join(agentSourceCacheDir(workspaceRoot), entry.name);\n // `skaile rebuild` (or the compile an earlier add/install made) pins the composition in\n // `compile_manifest.json`; the copy below clears the folder, the pin is put back after it.\n // The CLI recompiles a pin whose content the source no longer serves (p413, p1310).\n const pinFile = join(dest, COMPILE_PIN_FILENAME);\n const pin = existsSync(pinFile) ? readFileSync(pinFile) : undefined;\n // The cached `../` compose folders are locked: set them aside so the copy below does not\n // clear them, and put back what the lock still describes (p1511).\n const composesDir = join(dest, \"composes\");\n const keptDir = existsSync(composesDir)\n ? join(agentSourceCacheDir(workspaceRoot), `.${entry.name}.composes-kept`)\n : undefined;\n if (keptDir) {\n rmSync(keptDir, { recursive: true, force: true });\n renameSync(composesDir, keptDir);\n }\n // `bundleParentComposes` settles the kept folders (puts back or replaces each); only after it\n // ran are the leftovers safe to delete. Any earlier exit puts the locked bytes back.\n let bundled = false;\n try {\n copyAsset(provider, entry, dest);\n if (!existsSync(join(dest, \"agent.yaml\"))) {\n const manifest = readManifest(srcDir);\n if (!manifest) return;\n writeFileSync(\n join(dest, \"agent.yaml\"),\n stringifyYaml({ ...manifest, name: manifest.name ?? entry.name }),\n \"utf8\",\n );\n const soul = readSoul(srcDir);\n if (soul) writeFileSync(join(dest, \"SOUL.md\"), `${soul}\\n`, \"utf8\");\n }\n bundleParentComposes(dest, srcDir, { entry, workspaceRoot, keptDir, opts });\n bundled = true;\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n log(` warn: could not keep the source of agent ${entry.name}: ${reason}`);\n } finally {\n if (keptDir) {\n if (bundled || restoreKeptComposes(keptDir, composesDir)) {\n rmSync(keptDir, { recursive: true, force: true });\n }\n }\n if (pin && existsSync(dest) && !existsSync(pinFile)) writeFileSync(pinFile, pin);\n }\n}\n\n/**\n * Put the compose folders set aside by {@link materializeAgentSource} back under `composes/`\n * after a copy that did not finish, so the bytes the lock records are not lost (p1511). A folder\n * the failed run already placed there is left as it is. Returns `false` when a folder could not be moved back, so the caller keeps the set-aside copy.\n */\nfunction restoreKeptComposes(keptDir: string, composesDir: string): boolean {\n try {\n mkdirSync(composesDir, { recursive: true });\n for (const name of readdirSync(keptDir)) {\n const target = join(composesDir, name);\n if (!existsSync(target)) renameSync(join(keptDir, name), target);\n }\n return true;\n } catch {\n // the kept copy stays on disk next to the cache folder if it cannot be moved back\n return false;\n }\n}\n\n/** Name of the compile pin `skaile rebuild` writes (`COMPILE_MANIFEST_FILENAME` of the runner, which this layer cannot import). */\nconst COMPILE_PIN_FILENAME = \"compile_manifest.json\";\n\n/** Relative path → sha256 of the files of a compose folder (or of a lone file, under the key `\"\"`). */\nfunction composeRows(root: string): Map<string, string> {\n const out = new Map<string, string>();\n let top: Stats;\n try {\n top = lstatSync(root);\n } catch {\n return out;\n }\n if (top.isSymbolicLink()) return out;\n if (top.isFile()) {\n out.set(\"\", computeHash(root));\n return out;\n }\n const walk = (dir: string, rel: string): void => {\n for (const name of readdirSync(dir).sort()) {\n const abs = join(dir, name);\n const stat = lstatSync(abs);\n const here = rel ? `${rel}/${name}` : name;\n if (stat.isSymbolicLink()) continue;\n if (stat.isDirectory()) {\n if (!isNonAssetDir(name, rel === \"\")) walk(abs, here);\n } else if (stat.isFile() && !isNonAssetFile(name)) {\n out.set(here, computeHash(abs));\n }\n }\n };\n walk(root, \"\");\n return out;\n}\n\nfunction sameRows(a: ReadonlyMap<string, string>, b: ReadonlyMap<string, string>): boolean {\n if (a.size !== b.size) return false;\n for (const [k, v] of a) if (b.get(k) !== v) return false;\n return true;\n}\n\n/** The rows of the lock record that lie under `targetRel` (project-relative, POSIX), keyed like {@link composeRows}. */\nfunction lockedRowsUnder(\n record: ReadonlyArray<{ path: string; sha256: string }> | undefined,\n targetRel: string,\n): Map<string, string> | undefined {\n if (!record) return undefined;\n const rows = new Map<string, string>();\n for (const f of record) {\n if (f.path === targetRel) rows.set(\"\", f.sha256);\n else if (f.path.startsWith(`${targetRel}/`))\n rows.set(f.path.slice(targetRel.length + 1), f.sha256);\n }\n return rows.size > 0 ? rows : undefined;\n}\n\n/** The `../` compose folders of an agent source: the cache folder name each one is copied to, its ref and its source folder. */\nfunction outerComposeFolders(\n srcDir: string,\n refs: readonly string[],\n): Array<{ ref: string; name: string; from: string }> {\n const taken = new Map<string, string>();\n const out: Array<{ ref: string; name: string; from: string }> = [];\n for (const ref of refs) {\n if (!normalize(ref).startsWith(\"..\")) continue;\n const from = resolve(srcDir, ref);\n let name = basename(from);\n for (let n = 2; taken.has(name) && taken.get(name) !== from; n++) {\n name = `${basename(from)}-${n}`;\n }\n taken.set(name, from);\n out.push({ ref, name, from });\n }\n return out;\n}\n\n/**\n * The files (project-relative, with sha256) the `../` compose folders of the agent source at\n * `srcDir` would occupy in the project cache now: what a copy of the source would record in the\n * lock. `outdated` compares them with `LockEntry.composed` (p1511).\n */\nexport function sourceComposedFiles(\n srcDir: string,\n agentName: string,\n workspaceRoot: string,\n): Array<{ path: string; sha256: string }> {\n const refs = (readManifest(srcDir)?.composes ?? []).map((c) => c.ref);\n const out: Array<{ path: string; sha256: string }> = [];\n for (const { name, from } of outerComposeFolders(srcDir, refs)) {\n if (!existsSync(from)) continue;\n const base = join(agentSourceCacheDir(workspaceRoot), agentName, \"composes\", name);\n for (const [rel, sha256] of composeRows(from)) {\n out.push({\n path: relative(workspaceRoot, rel ? join(base, rel) : base)\n .split(sep)\n .join(\"/\"),\n sha256,\n });\n }\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/** The files (project-relative, with sha256) the project cache holds for the `../` compose folders of agent `agentName`. */\nexport function cachedComposedFiles(\n agentName: string,\n workspaceRoot: string,\n): Array<{ path: string; sha256: string }> {\n const dir = join(agentSourceCacheDir(workspaceRoot), agentName, \"composes\");\n return [...composeRows(dir)]\n .map(([rel, sha256]) => ({\n path: relative(workspaceRoot, join(dir, rel)).split(sep).join(\"/\"),\n sha256,\n }))\n .sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/**\n * The `../` compose folders of the agent `entry` that a deploy with `opts.lockedComposed` would\n * report as drift ({@link DeployOptions.onComposedDrift}): the lock records the folder, the cache\n * no longer holds those bytes, and the source does not either. Reads only; nothing is written.\n * `install --locked` asks it before it deploys anything (p1642).\n *\n * @returns The `composes:` refs of the drifted folders (`../shared-rules/extra`).\n */\nexport function composedDriftRefs(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"cwd\" | \"lockedComposed\">,\n): string[] {\n const workspaceRoot = opts.cwd ?? process.cwd();\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n const refs = (readManifest(srcDir)?.composes ?? []).map((c) => c.ref);\n const record = opts.lockedComposed?.(entry.name);\n const composesDir = join(agentSourceCacheDir(workspaceRoot), entry.name, \"composes\");\n const out: string[] = [];\n for (const { ref, name, from } of outerComposeFolders(srcDir, refs)) {\n const target = join(composesDir, name);\n const locked = lockedRowsUnder(record, relative(workspaceRoot, target).split(sep).join(\"/\"));\n const keptRows = existsSync(target) ? composeRows(target) : undefined;\n if (locked && keptRows && sameRows(keptRows, locked)) continue;\n if (!existsSync(from)) {\n if (locked) out.push(ref);\n continue;\n }\n if (locked && !sameRows(composeRows(from), locked)) out.push(ref);\n }\n return out;\n}\n\n/**\n * A `composes:` ref that climbs out of the agent folder (`../shared-rules/x`) names a folder\n * that does not exist beside the cache copy (`.skaile/cache/agents/<name>/`), so `skaile run`\n * could not serve it. Copy each such folder from the source into `composes/<name>/` and point\n * the ref there, as the omp rendering does (p1312).\n *\n * The folder is part of the lock (p1511): once the lock records its files, a deploy keeps the\n * cached copy while it still holds those bytes, writes the source's copy back only when it\n * holds them too, and otherwise reports the drift. Only `refreshComposed` (`update`, `add`)\n * copies the source's current bytes.\n */\nfunction bundleParentComposes(\n dest: string,\n srcDir: string,\n ctx: {\n entry: DeployableEntry;\n workspaceRoot: string;\n /** The previous `composes/` folder, set aside before the copy cleared the cache dir. */\n keptDir: string | undefined;\n opts: DeployOptions;\n },\n): void {\n const file = join(dest, \"agent.yaml\");\n const doc = parseDocument(readFileSync(file, \"utf8\"));\n const composes = doc.get(\"composes\");\n if (!isSeq(composes)) return;\n const record = ctx.opts.refreshComposed ? undefined : ctx.opts.lockedComposed?.(ctx.entry.name);\n const taken = new Map<string, string>();\n let changed = false;\n for (const item of composes.items) {\n if (!isMap(item)) continue;\n const ref = item.get(\"ref\");\n if (typeof ref !== \"string\" || !normalize(ref).startsWith(\"..\")) continue;\n const from = resolve(srcDir, ref);\n let name = basename(from);\n for (let n = 2; taken.has(name) && taken.get(name) !== from; n++) {\n name = `${basename(from)}-${n}`;\n }\n const target = join(dest, \"composes\", name);\n const targetRel = relative(ctx.workspaceRoot, target).split(sep).join(\"/\");\n const locked = lockedRowsUnder(record, targetRel);\n const kept = ctx.keptDir ? join(ctx.keptDir, name) : undefined;\n const keptRows = kept && existsSync(kept) ? composeRows(kept) : undefined;\n let how: \"copy\" | \"keep\" | \"drift\" | \"skip\";\n if (locked && keptRows && sameRows(keptRows, locked)) how = \"keep\";\n else if (!existsSync(from)) how = locked ? \"drift\" : \"skip\";\n else if (!locked || sameRows(composeRows(from), locked)) how = \"copy\";\n else how = \"drift\";\n taken.set(name, from);\n if (how === \"skip\") continue;\n rmSync(target, { recursive: true, force: true });\n mkdirSync(dirname(target), { recursive: true });\n if (how === \"copy\") {\n cpSync(from, target, {\n recursive: true,\n filter: (src) => {\n if (src === from) return true;\n const stat = lstatSync(src);\n if (stat.isSymbolicLink()) return false;\n return stat.isDirectory()\n ? !isNonAssetDir(basename(src), dirname(src) === from)\n : !isNonAssetFile(basename(src));\n },\n });\n } else {\n // `keep` puts the locked bytes back; `drift` leaves what the cache held (hand edits\n // included) and says that only `update` moves the lock to the source.\n if (kept && existsSync(kept)) renameSync(kept, target);\n if (how === \"drift\") ctx.opts.onComposedDrift?.(ctx.entry, ref);\n }\n item.set(\"ref\", `./composes/${name}`);\n changed = true;\n }\n if (changed) writeFileSync(file, doc.toString(), \"utf8\");\n}\n\n// ── Deploy / remove ──────────────────────────────────────────────────────────\n\n/**\n * Deploy a single asset to the framework-specific directory.\n *\n * Copies by default — self-contained, cache-safe, and portable, so a deployed\n * asset survives a `cache clean` of its source and a committed `.claude/` stays\n * machine-independent. `opts.link` opts into a symlink (the live dev-loop), but\n * only when the source has a real local path; store/factory sources (no stable\n * local path) ignore it and still copy. Agents are rendered via the enriched\n * `installAgent` path which resolves abilities, contracts, and framework\n * fragments before writing the native agent file.\n *\n * @param entry - Catalog entry describing the asset to deploy.\n * @param repositories - Repository declarations from `skaile.yaml` (used to\n * determine whether the source is a local path or a remote clone).\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns `true` when the asset was deployed successfully.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport async function deployAsset(\n entry: DeployableEntry,\n repositories: Record<string, SourceDeclaration>,\n opts: DeployOptions,\n log: Log = noop,\n): Promise<boolean> {\n return (await deployEntry(entry, repositories, opts, log)).deployed;\n}\n\n/**\n * {@link deployAsset} plus whether the deploy altered anything on disk. A copied asset always\n * counts as changed; an agent is re-rendered every time but counts as changed only when a\n * rendered file's bytes differ from the deployed one (an unchanged agent is left untouched).\n */\nasync function deployEntry(\n entry: DeployableEntry,\n repositories: Record<string, SourceDeclaration>,\n opts: DeployOptions,\n log: Log,\n /** `true` when {@link deployAll} already kept this agent's source under `.skaile/cache/agents/`. */\n sourceKept = false,\n /** `true` when another agent deployed in this call composes this one as a `delegate` sub-agent. */\n delegated = false,\n /** `true` when every agent of this call that composes this one does so as a `binding: run` role. */\n runRole = false,\n): Promise<{ deployed: boolean; changed: boolean }> {\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // Composition-only kinds (no `installTarget`) never land in a harness dir:\n // they are fetched + verified into the store cache and composed at session start.\n const provider = opts.registry.getProvider(entry.kind);\n const component = provider?.installTarget;\n if (!provider || !component) return { deployed: true, changed: false };\n\n // Agents need framework-specific rendering via the enriched installAgent path\n if (component === \"agent\") {\n const workspaceRoot = cwd ?? process.cwd();\n const agentDeployDir = deployedBase(component, harness as HarnessName, globalInstall, cwd);\n const targetMap = HARNESS_TARGETS[harness as HarnessName];\n const skillsRelDir = targetMap?.local.skill ?? \"\";\n const wsConfig = resolveSkWorkspaceConfig(workspaceRoot);\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n // One native file per instance: an agent that an instance binds is rendered under the\n // instance id, and a `binding: run` role gets no native file at all (a native sub-agent would\n // be a second way to call it). The asset-named file is written only for the rest. The agent's\n // source is still kept for the instance render and for `run`.\n if (\n !globalInstall &&\n harnessTargetSupportsAgents(harness) &&\n (opts.instanceBoundAgents?.has(entry.name) || runRole)\n ) {\n if (!sourceKept) materializeAgentSource(provider, entry, srcDir, workspaceRoot, log, opts);\n return { deployed: true, changed: !(opts.agentLocked?.(entry.name) ?? false) };\n }\n // A symlink at a path the render writes is the user's own wiring: replace the link, never\n // write through it into the file or folder it points at (p1060).\n for (const held of deployedPaths(component, entry.name, harness, globalInstall, cwd)) {\n try {\n if (lstatSync(held).isSymbolicLink()) unlinkSync(held);\n } catch {\n // nothing there\n }\n }\n // A composed item the runner's loader cannot resolve: the file would miss text a run sends.\n // Fail the deploy with one line naming the agent and the ref, as the instance render does,\n // before this agent's file is written.\n const result = await installAgent(\n srcDir,\n agentDeployDir,\n workspaceRoot,\n harness,\n skillsRelDir,\n entry.name,\n /* includeSubAgents */ true,\n new Set<string>(),\n wsConfig,\n log,\n undefined,\n delegated,\n entry.version,\n opts.lockAssets,\n ).catch((err: unknown) => {\n if (!(err instanceof CompositionError)) throw err;\n throw new Error(`agent ${entry.name}: ${err.message}`, { cause: err });\n });\n for (const w of result.warnings) log(` warn: ${w}`);\n if (result.created.length > 0) {\n let changed = result.changed.length > 0;\n // An `AGENT.md` agent used to deploy raw into `<base>/<name>/AGENT.md`, which no\n // harness but omp (whose rendering is that directory) reads: drop the stale copy.\n const staleRawCopy = join(agentDeployDir, entry.name);\n if (harness !== \"omp\" && existsSync(staleRawCopy)) {\n clearDest(staleRawCopy);\n changed = true;\n }\n if (!globalInstall && !sourceKept) {\n materializeAgentSource(provider, entry, srcDir, workspaceRoot, log, opts);\n }\n return { deployed: true, changed };\n }\n // Fall through to raw deploy if renderer produces no files (unsupported framework, etc.)\n }\n\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n mkdirSync(dirname(dest), { recursive: true });\n\n // Symlink only on explicit opt-in AND when the source has a real local path.\n // Factory sources have a `path` (the bundled dir under node_modules, replaced\n // on every upgrade) but no stable dev-loop, so they always copy. Default copy\n // keeps deploys cache-safe and portable.\n const repoDecl = entry.publisher ? repositories[entry.publisher] : undefined;\n const hasLocalPath = repoDecl?.path != null && repoDecl.factory !== true;\n\n if (opts.link === true && hasLocalPath) {\n symlinkAsset(provider, entry.source, dest, entry.name);\n log(` symlink ${entry.kind}:${entry.name}`);\n } else {\n copyAsset(provider, entry, dest, opts.onSecretFile);\n log(` copy ${entry.kind}:${entry.name}`);\n }\n return { deployed: true, changed: true };\n}\n\n/**\n * Deploy all resolved assets, applying patches where configured.\n *\n * Already-deployed assets are skipped unless their deployed manifest content differs\n * from the source. This handles copies that have gone stale after a source update.\n * In copy mode (the default, `!opts.link`) an existing **symlink** dest is healed:\n * it is removed and re-deployed as a real copy, so an old/legacy symlink deploy is\n * silently upgraded. With `opts.link` an existing symlink is left alone.\n *\n * @param resolved - Catalog entries to deploy (output of `resolveAll`).\n * @param repositories - Repository declarations from `skaile.yaml`.\n * @param patches - Map of `kind:name` → patch file path for patch application.\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns Canonical refs (`kind:@publisher/name[#version]`; bare `kind:name`\n * when the entry carries no publisher) of the assets newly deployed in this call.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport async function deployAll(\n resolved: DeployableEntry[],\n repositories: Record<string, SourceDeclaration>,\n patches: Record<string, string>,\n opts: DeployOptions,\n log: Log = noop,\n): Promise<string[]> {\n // Before any copy: a symlink in a later entry must not leave the earlier ones behind (p743).\n assertNoLibrarySymlinks(\n entriesNeedingDeploy(resolved, opts),\n opts.registry,\n repositories,\n opts.link === true,\n );\n const deployed: string[] = [];\n const deployedAt: Array<[number, string]> = [];\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // An agent is rendered from its composed skills (`## Installed Abilities`), contracts and\n // delegate sub-agents, which `deployAll` deploys in this same call: render the agents last, with\n // every agent's source already kept, so one pass writes the file a later `install` would write.\n const isAgent = (entry: DeployableEntry): boolean =>\n installTargetOf(opts.registry, entry.kind) === \"agent\";\n const keptSources = new Set<DeployableEntry>();\n if (!globalInstall) {\n for (const entry of resolved.filter(isAgent)) {\n const provider = opts.registry.getProvider(entry.kind);\n if (!provider) continue;\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n materializeAgentSource(provider, entry, srcDir, cwd ?? process.cwd(), noop, opts);\n keptSources.add(entry);\n }\n }\n\n // `resolved` lists an asset before what it requires, so the agents go in reverse: a delegate\n // sub-agent is rendered by its own entry before its composer renders it again. Both renders\n // must write the same bytes, so an agent that another agent of this call delegates to is\n // rendered as a sub-agent by its own entry too (else the two writes alternate, and the file\n // is reported as changed on every run).\n const agentsLast = resolved.filter(isAgent).reverse();\n const delegatedNames = new Set<string>();\n // Agents another agent of this call composes only as `binding: run` roles: they run through\n // `agent.run`, so no native sub-agent file is written for them.\n const runNames = new Set<string>();\n for (const entry of agentsLast) {\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n for (const name of delegateNamesOf(srcDir)) delegatedNames.add(name);\n for (const name of composedAgentNamesOf(srcDir).run) runNames.add(name);\n }\n for (const entry of [...resolved.filter((e) => !isAgent(e)), ...agentsLast]) {\n // Skip composition-only kinds (no `installTarget`) — they live in the store\n // cache and are composed at session start, never copied into a harness dir.\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component) continue;\n\n const ref = `${entry.kind}:${entry.name}`;\n\n // Agents are compiled artifacts: always re-rendered, never skipped on a manifest hash\n // (and a stale raw `<name>/AGENT.md` copy of the old layout must be replaced, not kept).\n if (component !== \"agent\" && isDeployed(component, entry.name, harness, globalInstall, cwd)) {\n // Heal: in copy mode an existing symlink dest is left to fall through to a\n // real copy below (cache-safe + portable) - bypass the hash skip entirely.\n // With --link a symlink dest is intentional, so it takes the normal skip path.\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n let destIsSymlink = false;\n try {\n destIsSymlink = lstatSync(dest).isSymbolicLink();\n } catch {}\n const healSymlink = destIsSymlink && opts.link !== true;\n // Surface the one-time symlink->copy migration so an author who relied on a\n // live symlink dev-loop knows why edits stopped reflecting.\n if (healSymlink) log(` healed symlink → copy: ${ref} (use --link for the dev-loop)`);\n if (!healSymlink) {\n const state = deployedCopyState(entry, { ...opts, harness, global: globalInstall, cwd });\n if (state === \"current\") {\n log(` already deployed: ${ref}`);\n continue;\n }\n if (state === \"stale\") log(` updating: ${ref} (content changed)`);\n }\n }\n\n // An agent is re-rendered every time; it is reported as deployed only when a rendered file\n // changed, so a repeat install leaves it (and the report) alone.\n const { changed } = await deployEntry(\n entry,\n repositories,\n opts,\n log,\n keptSources.has(entry),\n isAgent(entry) && delegatedNames.has(entry.name),\n isAgent(entry) && runNames.has(entry.name) && !delegatedNames.has(entry.name),\n );\n if (changed) deployedAt.push([resolved.indexOf(entry), canonicalEntryRef(entry)]);\n\n // Apply patch if configured\n const patchFile = patches[ref];\n if (patchFile && existsSync(patchFile)) {\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n if (applyPatch(dest, patchFile)) {\n log(` patched ${ref}`);\n } else {\n log(` patch failed for ${ref}`);\n }\n }\n }\n\n // Report in the order the assets were resolved, not the order they were rendered.\n deployed.push(...deployedAt.sort((a, b) => a[0] - b[0]).map(([, ref]) => ref));\n return deployed;\n}\n\n/**\n * Run `deploy` for each target harness in turn (the deploys write one tree, so they do not run\n * together) and return the refs deployed, each once.\n */\nexport async function deployEach<T>(\n targets: readonly T[],\n deploy: (target: T) => Promise<string[]>,\n): Promise<string[]> {\n const deployed = new Set<string>();\n for (const target of targets) for (const ref of await deploy(target)) deployed.add(ref);\n return [...deployed];\n}\n\n/** The agent prompt {@link assembleAgentPrompt} built. */\nexport interface AssembledAgentPrompt extends AssembledAgent {\n /** The instance id the prompt is for (the name of the native file). */\n agentName: string;\n /** The `delegate` sub-agents the install renders as native files next to this agent's. */\n delegates: DelegateSubAgent[];\n}\n\n/**\n * The prompt of one agent, built by the same `assembleAgent` and from the same input set the\n * install renderers bake into the native agent file. `skaile run --dry-run --print-prompt` prints\n * its `sentPrompt`. Writes nothing.\n *\n * The composed blocks and memory blocks of the input may come from the runner\n * (`opts.resolved`): the run resolves them with its own loader, so the printed prompt is what a\n * run sends even where the install path could not read an item.\n *\n * @param opts.srcDir - The agent's source directory.\n * @param opts.projectDir - The project root.\n * @param opts.harness - Harness id of the run; picks the carriers and the skills dir the abilities are read from (a harness without a native agent format reads the claude-code layout).\n * @param opts.instanceId - Instance id the file is named after (default: the agent's own name).\n * @param opts.instance - The `skaile.yaml` instance being rendered.\n * @param opts.resolved - Composed and memory blocks as the runner resolved them; replaces what the install loader read.\n * @param opts.delegated - The agent is a `delegate` sub-agent rendered for the agent that calls it.\n * @param opts.nativeFile - Text of the native agent file the harness reads (or a function of the agent's file name that reads it); `stale` names the blocks it holds with other text than the inputs give now.\n * @param opts.lockAssets - The lock entries the command is about to write; composed pins resolve against them, not against the lock on disk.\n * @returns `null` when `srcDir` is no agent package.\n */\nexport async function assembleAgentPrompt(opts: {\n srcDir: string;\n projectDir: string;\n harness: string;\n instanceId?: string;\n instance?: AgentInstanceConfig;\n wsConfig?: SkWorkspaceConfig;\n resolved?: Pick<AgentPromptSectionsInput, \"composed\" | \"memory\">;\n delegated?: boolean;\n nativeFile?: string | ((agentName: string) => string | undefined);\n lockAssets?: Record<string, LockEntry>;\n}): Promise<AssembledAgentPrompt | null> {\n const target = harnessNameForHarnessId(opts.harness) ?? \"claude-code\";\n const prepared = await prepareAgentRender(\n opts.srcDir,\n deployedBase(\"agent\", target, false, opts.projectDir),\n opts.projectDir,\n target,\n HARNESS_TARGETS[target]?.local.skill ?? \"\",\n opts.instanceId,\n opts.wsConfig ?? resolveSkWorkspaceConfig(opts.projectDir),\n [],\n opts.instance,\n opts.delegated ?? false,\n undefined,\n opts.resolved,\n opts.lockAssets,\n );\n if (!prepared) return null;\n const input = agentPromptInput(prepared.input);\n const nativeFile =\n typeof opts.nativeFile === \"function\"\n ? opts.nativeFile(prepared.input.agentName)\n : opts.nativeFile;\n const assembled = assembleAgent(opts.resolved ? { ...input, ...opts.resolved } : input, {\n harness: opts.harness,\n ...(nativeFile !== undefined ? { nativeFile } : {}),\n });\n return { ...assembled, agentName: prepared.input.agentName, delegates: prepared.delegates };\n}\n\n/**\n * Unified diff from a deployed agent to its source, `-` lines in the deployed copy only and `+`\n * lines in the source only. An agent is a rendering, not a copy, so the source is rendered the way\n * {@link deployAsset} renders it (same renderer, same workspace context) into a scratch directory\n * and that is compared with what the harness holds: `<name>.md` for claude-code, `<name>.toml`\n * plus the `skaile-agents/<name>.md` identity for codex, the `<name>/` directory for omp.\n *\n * @param entry - The agent's catalog entry (`source` is its `agent.yaml` / `AGENT.md`).\n * @param opts - Deployment target options (must match the options used at install time).\n * @param instance - Compare the rendering of one agent instance of `skaile.yaml` (named by its id,\n * with its settings) instead of the one named after the asset (p925).\n * @returns `null` when none of the agent's rendered files is deployed, else the diff text\n * (`\"\"` when the deployed agent matches its source).\n * @throws When `diff(1)` itself fails (exit status other than 0/1).\n */\nexport async function diffDeployedAgent(\n entry: DeployableEntry,\n opts: DeployOptions,\n instance?: { id: string; srcDir: string; config: AgentInstanceConfig },\n): Promise<string | null> {\n const harness = opts.harness ?? \"claude-code\";\n const workspaceRoot = opts.cwd ?? process.cwd();\n const deployedAgents = deployedBase(\"agent\", harness, opts.global ?? false, opts.cwd);\n const scratch = mkdtempSync(join(tmpdir(), \"skaile-diff-agent-\"));\n try {\n const renderedAgents = join(scratch, \"agents\");\n const srcDir =\n instance?.srcDir ??\n (statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source));\n // An instance renders the way `install` renders it: named by its id, with its own settings.\n const rendered = await installAgent(\n srcDir,\n renderedAgents,\n workspaceRoot,\n harness,\n HARNESS_TARGETS[harness]?.local.skill ?? \"\",\n instance?.id ?? entry.name,\n /* includeSubAgents */ instance !== undefined,\n new Set<string>(),\n resolveSkWorkspaceConfig(workspaceRoot),\n undefined,\n instance?.config,\n false,\n entry.version,\n );\n if (rendered.created.length === 0) return null;\n\n // Each rendered top-level item pairs with the deployed item of the same name.\n const pairs: Array<[from: string, to: string]> = [];\n for (const [renderedRoot, deployedRoot] of [\n [renderedAgents, deployedAgents],\n [join(scratch, CODEX_IDENTITY_DIR), join(dirname(deployedAgents), CODEX_IDENTITY_DIR)],\n ] as const) {\n if (!existsSync(renderedRoot)) continue;\n for (const item of readdirSync(renderedRoot)) {\n pairs.push([join(deployedRoot, item), join(renderedRoot, item)]);\n }\n }\n if (!pairs.some(([from]) => existsSync(from))) return null;\n\n const diffs: string[] = [];\n for (const [from, to] of pairs) {\n const r = spawnSync(\"diff\", [\"-ruN\", from, to], { encoding: \"utf8\" });\n if (r.status === 1) diffs.push(r.stdout);\n else if (r.status !== 0) {\n throw new Error(\n `diff failed for agent:${entry.name}: ${r.stderr || r.error?.message || \"unknown error\"}`,\n );\n }\n }\n return diffs.join(\"\").split(`${scratch}${sep}`).join(`rendered${sep}`);\n } finally {\n rmSync(scratch, { recursive: true, force: true });\n }\n}\n\n/** The file that remembers the old `~/.omp/<dir>/<name>` folders a sweep decided are not skaile's. */\nfunction keptLegacyFile(): string {\n return join(globalSkaileDir(), \"kept-omp-copies.json\");\n}\n\n/** The old omp folders skaile never deletes (kept by an earlier run: it did not write them). */\nexport function readKeptLegacyCopies(): Set<string> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(keptLegacyFile(), \"utf-8\"));\n return new Set(Array.isArray(parsed) ? parsed.filter((v) => typeof v === \"string\") : []);\n } catch {\n return new Set();\n }\n}\n\nexport function writeKeptLegacyCopies(paths: Set<string>): void {\n mkdirSync(dirname(keptLegacyFile()), { recursive: true });\n writeFileSync(keptLegacyFile(), `${JSON.stringify([...paths].sort(), null, 2)}\\n`);\n}\n\n/**\n * Remove a deployed asset from the framework directory.\n *\n * Removes symlinks with `unlink`; removes copied directories with `rm -rf`.\n *\n * @param kind - Asset kind (`skill`, `agent`, `prompt`, `flow`, `contract`).\n * @param name - Asset name as registered in the catalog.\n * @param opts - Deployment target options (must match the options used at install time).\n * @returns `true` if the asset existed and was removed; `false` if it was not deployed.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function removeAsset(kind: string, name: string, opts: DeployOptions): boolean {\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // Composition-only kinds have no harness dir — never resolve (and delete) one.\n const component = installTargetOf(opts.registry, kind);\n if (!component) return false;\n let removed = false;\n // Before 5.13.0 an omp global install wrote to `~/.omp/<skills|agents|…>/`, a place omp does\n // not read (it reads `~/.omp/agent/…`). Removing the asset removes that dead copy too.\n // A flow lives under `~/.skaile` in both layouts: nothing to add.\n // A folder an earlier sweep kept (skaile did not write it) is never deleted.\n const kept = globalInstall ? readKeptLegacyCopies() : new Set<string>();\n const legacyOmp =\n globalInstall && harness === \"omp\" && component !== \"flow\"\n ? deployedPaths(component, name, \"omp\", false, homedir()).filter((p) => !kept.has(p))\n : [];\n for (const dest of [\n ...deployedPaths(component, name, harness, globalInstall, cwd),\n ...legacyOmp,\n ]) {\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n removed = true;\n } catch {\n // not deployed at this path\n }\n }\n if (component === \"agent\") {\n // The Codex identity file and the kept source live beside the deployed agent.\n const agentDir = deployedBase(component, harness, globalInstall, cwd);\n const extras = [join(dirname(agentDir), CODEX_IDENTITY_DIR, `${name}.md`)];\n if (!globalInstall) extras.push(join(agentSourceCacheDir(cwd ?? process.cwd()), name));\n for (const extra of extras) {\n if (existsSync(extra)) {\n rmSync(extra, { recursive: true, force: true });\n removed = true;\n }\n }\n }\n return removed;\n}\n\n// ── Scaffold ─────────────────────────────────────────────────────────────────\n\n/** Markdown-marker scaffold (SKILL.md / CONTRACT.md / `*.prompt.md`); `body` is the kind's placeholder. */\nfunction markdownTemplate(name: string, description: string, body: string): string {\n // JSON.stringify yields a valid YAML double-quoted scalar, so any\n // user-supplied description (colons, quotes, `#`) survives the round-trip.\n return `---\nname: \"${name}\"\ndescription: ${JSON.stringify(description)}\nmetadata:\n version: \"0.1.0\"\n---\n\n# ${name}\n\n${body}\n`;\n}\n\n/** `agent.yaml` (spec 0.2) scaffold; the system prompt lives in the `SOUL.md` next to it. */\nfunction agentTemplate(name: string, description: string): string {\n return `spec_version: \"0.2\"\nname: \"${name}\"\nversion: 0.1.0\ndescription: ${JSON.stringify(description)}\nlifecycle: standing\n`;\n}\n\nfunction soulTemplate(name: string): string {\n return `# ${name}\n\n${AGENT_BODY_PLACEHOLDER}\n`;\n}\n\nfunction presetTemplate(name: string, description: string): string {\n return `name: ${name}\ndescription: ${JSON.stringify(description)}\nversion: 0.1.0\nitems:\n - ref: ${PRESET_ITEM_PLACEHOLDER_REF}\n`;\n}\n\n/**\n * `<name>.flow.yaml` scaffold: a strict v2 flow (`schemaVersion: 2`) with one example `agent` node\n * and no edges. The instruction is a placeholder the checks of `validate` / `index` / the plan\n * refuse until the author replaces it, like every other scaffold.\n */\nfunction flowTemplate(name: string, description: string): string {\n return `schemaVersion: 2\nid: \"${name}\"\nversion: \"0.1.0\"\nname: \"${name}\"\ndescription: ${JSON.stringify(description)}\n\n# One node per step; join steps with edges (\\`type: flow\\`). Rename or replace the example node.\nnodes:\n - id: example\n label: Example step\n description: Replace this node with the first step of the flow.\n run:\n kind: agent\n instruction: ${JSON.stringify(FLOW_NODE_INSTRUCTION_PLACEHOLDER)}\n\nedges: []\n`;\n}\n\n/** Asset kinds {@link createScaffold} has a real template for. */\nexport const SCAFFOLD_KINDS = [\"skill\", \"agent\", \"prompt\", \"flow\", \"preset\", \"contract\"] as const;\n\n/** Options for {@link createScaffold}. */\nexport interface ScaffoldOptions {\n /**\n * Description written into the manifest. Omitted: every kind gets a\n * `TODO:` placeholder that `skaile validate` rejects until it is replaced.\n */\n description?: string;\n}\n\n/**\n * Create a minimal scaffold directory for a new asset.\n *\n * Writes the appropriate manifest file (`SKILL.md`, `agent.yaml` + `SOUL.md`, `CONTRACT.md`,\n * `<name>.preset.yaml`, `<name>.flow.yaml`, or `<name>.prompt.md`) inside a\n * new `<destDir>/<name>/` directory.\n *\n * @param name - Asset name (also used as the directory name).\n * @param kind - Asset kind: `skill` | `agent` | `preset` | `flow` | `prompt` | `contract`.\n * @param destDir - Parent directory to create the asset in.\n * @param opts - Optional scaffold content ({@link ScaffoldOptions}).\n * @returns `{ ok: true, path }` on success, `{ ok: false, path: errorMessage }` if the\n * directory already exists or `kind` is not one of {@link SCAFFOLD_KINDS}\n * (`Cannot scaffold kind \"<kind>\". Expected: ...`); nothing is created then.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function createScaffold(\n name: string,\n kind: string,\n destDir: string,\n opts: ScaffoldOptions = {},\n): { ok: boolean; path: string } {\n if (!(SCAFFOLD_KINDS as readonly string[]).includes(kind)) {\n return {\n ok: false,\n path: `Cannot scaffold kind \"${kind}\". Expected: ${SCAFFOLD_KINDS.join(\", \")}.`,\n };\n }\n const dest = join(destDir, name);\n if (existsSync(dest)) {\n return { ok: false, path: `Directory '${name}' already exists in ${destDir}` };\n }\n mkdirSync(dest, { recursive: true });\n\n const mdDescription =\n opts.description ??\n ([\"agent\", \"contract\", \"prompt\", \"flow\", \"preset\"].includes(kind)\n ? `${SKILL_DESCRIPTION_PLACEHOLDER_PREFIX} describe this ${kind}.`\n : SKILL_DESCRIPTION_PLACEHOLDER);\n\n if (kind === \"preset\") {\n writeFileSync(join(dest, `${name}.preset.yaml`), presetTemplate(name, mdDescription), \"utf8\");\n } else if (kind === \"flow\") {\n writeFileSync(join(dest, `${name}.flow.yaml`), flowTemplate(name, mdDescription), \"utf8\");\n } else if (kind === \"prompt\") {\n writeFileSync(\n join(dest, `${name}.prompt.md`),\n markdownTemplate(name, mdDescription, PROMPT_BODY_PLACEHOLDER),\n \"utf8\",\n );\n } else if (kind === \"agent\") {\n writeFileSync(join(dest, \"agent.yaml\"), agentTemplate(name, mdDescription), \"utf8\");\n writeFileSync(join(dest, \"SOUL.md\"), soulTemplate(name), \"utf8\");\n } else if (kind === \"contract\") {\n writeFileSync(\n join(dest, \"CONTRACT.md\"),\n markdownTemplate(name, mdDescription, CONTRACT_BODY_PLACEHOLDER),\n \"utf8\",\n );\n } else {\n writeFileSync(\n join(dest, \"SKILL.md\"),\n markdownTemplate(name, mdDescription, SKILL_BODY_PLACEHOLDER),\n \"utf8\",\n );\n }\n\n return { ok: true, path: dest };\n}\n"]}
1
+ {"version":3,"sources":["../asset-manager/src/composed-blocks.ts","../asset-manager/src/install-agent.ts","../asset-manager/src/installer.ts"],"names":["join","readFileSync","parseYaml","parseFrontmatter","statSync","basename","relative","resolve","existsSync","stringifyYaml"],"mappings":"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","file":"chunk-DG7OEBLI.js","sourcesContent":["/**\n * The prompt blocks an agent bakes into its native agent file besides the convention files: the\n * inline items of `composes:` (rulesets, prompts, personas, contracts, knowledge) and the seeds of\n * memory blocks that nothing stores (`memory.scope: none`).\n *\n * The bytes come from the runner's own content source (`createCompositionContentSource`, the one\n * function `skaile run` resolves a `composes:` ref with: a local path, a lock pin, a registered\n * library, the catalog), so the file holds what a run sends, in `composes:` order. A ref that\n * source cannot resolve throws its `CompositionError`; install reports it and the agent is not\n * rendered. A host-backed memory block is never baked: the host owns its content, only the\n * runner has it.\n */\n\nimport { readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n AgentInstanceConfig,\n AgentPromptMemoryBlock,\n AgentPromptPart,\n LockEntry,\n} from \"@skaile/workspaces/core\";\nimport {\n type CompileManifestEntry,\n CompositionError,\n createCompositionContentSource,\n loadCompileManifestFromDir,\n resolveBinding,\n} from \"@skaile/workspaces/runner/composition-content\";\nimport type { AgentManifest } from \"@skaile/workspaces/types/manifests\";\nimport { loadPromptExtensions } from \"./fragments.js\";\n\nconst stripFrontmatter = (text: string): string =>\n text.replace(/^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n?/, \"\").trim();\n\nconst readRaw = (file: string): string | undefined => {\n try {\n return readFileSync(file, \"utf-8\").trim();\n } catch {\n return undefined;\n }\n};\n\nconst readText = (file: string): string | undefined => {\n try {\n return statSync(file).isFile() ? stripFrontmatter(readFileSync(file, \"utf-8\")) : undefined;\n } catch {\n return undefined;\n }\n};\n\n/** The entries of the agent's `compile_manifest.json`; none when it has none or an older schema. */\nasync function loadCompiledEntries(srcDir: string): Promise<CompileManifestEntry[]> {\n try {\n return (await loadCompileManifestFromDir(srcDir))?.entries ?? [];\n } catch (err) {\n if (err instanceof CompositionError && err.code === \"composition_rebuild_required\") return [];\n throw err;\n }\n}\n\n/** What {@link loadPromptBlocks} found. */\nexport interface PromptBlocks {\n /** The inline `composes:` items, in `composes:` order. */\n composed: AgentPromptPart[];\n /** The memory blocks whose seed is baked (`memory.scope: none`). */\n memory: AgentPromptMemoryBlock[];\n}\n\n/** Files the runner reads through the composition content source (frontmatter stripped). */\nconst CONVENTION_SEEDS = new Set([\"SOUL.md\", \"RULES.md\", \"DUTIES.md\"]);\n\n/**\n * Read the composed inline blocks and the baked memory seeds of an agent for its native file.\n *\n * @param manifest - The agent manifest (`composes`, `memory`).\n * @param srcDir - The agent's source directory: base of local refs and of `memory.blocks[].source`.\n * @param projectDir - The project root (`skaile.lock.yaml`, `.skaile/cache/store`).\n * @param instance - The `skaile.yaml` instance being rendered; `memory.scope: none` bakes the seeds.\n * @param lockAssets - The lock entries the command is about to write. A pin the same command moves\n * (`skaile update`) resolves against them, not against the older lock on disk.\n * @throws `CompositionError` (`@skaile/workspaces/runner/composition-content`) when the runner's\n * content source cannot resolve an inline item; its message names the ref.\n */\nexport async function loadPromptBlocks(\n manifest: AgentManifest,\n srcDir: string,\n projectDir: string,\n instance?: AgentInstanceConfig,\n lockAssets?: Record<string, LockEntry>,\n): Promise<PromptBlocks> {\n const composed: AgentPromptPart[] = [];\n const source = createCompositionContentSource({ agentDir: srcDir, projectDir, lockAssets });\n // An `inline-snapshot` item serves the bytes of `compile_manifest.json`, never its live file,\n // so the file bakes them the way the run reads them. One never compiled has nothing to serve\n // yet (the run asks for `skaile rebuild`): it bakes the source until the install compiles it.\n const compiled = await loadCompiledEntries(srcDir);\n for (const item of manifest.composes ?? []) {\n if (item.kind === \"agent\") continue;\n const binding = resolveBinding(item);\n if (!binding.startsWith(\"inline\")) continue;\n const pinned =\n binding === \"inline-snapshot\"\n ? compiled.find(\n (e) =>\n e.asset_ref === item.ref && e.kind === item.kind && e.binding === \"inline-snapshot\",\n )\n : undefined;\n const content = pinned ? pinned.content : (await source.load(item.ref, item.kind)).content;\n if (content) composed.push({ text: content, source: item.ref });\n }\n\n // Only a seed-only block is baked; a host-backed block shows what the host holds, at run time.\n const memory: AgentPromptMemoryBlock[] = [];\n if (instance?.memory?.scope === \"none\") {\n const composedRefs = new Set(\n (manifest.composes ?? []).map((item) => item.ref.replace(/^\\.\\//, \"\")),\n );\n for (const block of manifest.memory?.blocks ?? []) {\n if (!block.source) continue;\n const file = join(srcDir, block.source);\n // The runner strips frontmatter only from a pinned item (a convention file or a composes ref).\n const pinned =\n CONVENTION_SEEDS.has(block.source.replace(/^\\.\\//, \"\")) ||\n composedRefs.has(block.source.replace(/^\\.\\//, \"\"));\n const seed = pinned ? readText(file) : readRaw(file);\n if (seed === undefined) continue;\n memory.push({\n name: block.name,\n scope: block.scope,\n maxChars: block.max_chars,\n source: block.source,\n content: seed,\n persisted: false,\n });\n }\n }\n return { composed, memory };\n}\n\n/**\n * The loaded prompt extensions as parts that carry their config path, the identity a native file\n * and a run find them by. A missing or empty file is left out, as the runner leaves it out.\n */\nexport function loadPromptExtensionParts(\n paths: readonly string[] | undefined,\n projectDir: string,\n): AgentPromptPart[] {\n const parts: AgentPromptPart[] = [];\n for (const path of paths ?? []) {\n const text = loadPromptExtensions([path], projectDir)[0];\n if (text) parts.push({ text, source: path });\n }\n return parts;\n}\n","/**\n * Agent installation — renders a GitAgent package (agent.yaml + SOUL.md + RULES.md)\n * into the framework-native format (`.claude/agents/<name>.md`, `.omp/agents/<name>/`,\n * `.codex/agents/<name>.toml`) and resolves abilities, contracts, fragments, and\n * prompt extensions from the workspace config along the way.\n *\n * System prompt phases (per agent):\n * 1. extends merge — inherit from parent agent.yaml if manifest.extends is set\n * 2. instance overrides — model / budget / lifecycle of the `skaile.yaml` instance\n * 3. ability refs — read SKILL.md frontmatter of the composed skills\n * 4. contract refs — locate CONTRACT.md files of the composed contracts\n * 5. fragments — resolve framework fragments (agent-mode, handoff, etc.)\n * 6. prompt-extensions — load per-project markdown extensions from skaile.yaml\n *\n * Used by `installer.ts` (the asset-install path, one agent asset under its own\n * name) and `install-instances.ts` (`skaile install`, one rendering per\n * `skaile.yaml` agent instance, named by the instance id). Sub-agents composed as\n * `composes: [{ kind: agent }]` (binding `delegate`, the default) are installed\n * flat (no nesting) in the same deploy directory; `binding: run` sub-agents are\n * host-executed and get no native file.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, join, relative, resolve } from \"node:path\";\nimport type {\n AgentInstanceConfig,\n HarnessName,\n LockEntry,\n SkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport {\n AGENT_INSTANCE_ID_PATTERN,\n HARNESS_TARGETS,\n parseFrontmatter as parseMarkdownFrontmatter,\n parseAssetRefLoose,\n resolveAgentDefinitionDir,\n} from \"@skaile/workspaces/core\";\nimport type { AgentComposeItem, AgentLifecycle } from \"@skaile/workspaces/types/manifests\";\nimport { parse as parseYaml } from \"yaml\";\nimport { loadPromptBlocks, loadPromptExtensionParts } from \"./composed-blocks.js\";\nimport {\n type AbilityRef,\n type ConnectorRef,\n type ContractRef,\n type FragmentContext,\n resolveFragments,\n} from \"./fragments.js\";\nimport { type AgentManifest, type AgentRenderInput, renderAgentToFramework } from \"./renderers.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Source file of the legacy markdown agent form: frontmatter + the system prompt as body. */\nconst AGENT_MD_FILE = \"AGENT.md\";\n\n/** A Claude-style `tools:` value (`\"Read, Grep\"` or a list) as the manifest's `tools.allowed`. */\nfunction toolsFromMarkdown(value: unknown): AgentManifest[\"tools\"] | undefined {\n if (Array.isArray(value)) return { allowed: value.map(String) };\n if (typeof value === \"string\") {\n const allowed = value.split(/[,\\s]+/).filter(Boolean);\n return allowed.length > 0 ? { allowed } : undefined;\n }\n return value && typeof value === \"object\" ? (value as AgentManifest[\"tools\"]) : undefined;\n}\n\n/**\n * The `AGENT.md` form of an agent as a manifest: the frontmatter, with the\n * Claude-style scalar `model:` / `tools:` shapes mapped to the manifest's\n * `model.preferred` / `tools.allowed`, and `metadata.version` read as `version`.\n */\nfunction readAgentMdManifest(agentDir: string): { manifest: AgentManifest; body: string } | null {\n const mdPath = join(agentDir, AGENT_MD_FILE);\n if (!existsSync(mdPath)) return null;\n try {\n const { data, body } = parseMarkdownFrontmatter(readFileSync(mdPath, \"utf-8\"));\n const meta = data.metadata as { version?: unknown } | undefined;\n const manifest: Record<string, unknown> = { ...data };\n if (manifest.version === undefined && meta?.version !== undefined) {\n manifest.version = String(meta.version);\n }\n if (typeof data.model === \"string\") manifest.model = { preferred: data.model };\n if (data.tools !== undefined) manifest.tools = toolsFromMarkdown(data.tools);\n return { manifest: manifest as AgentManifest, body };\n } catch {\n return null;\n }\n}\n\n/**\n * The agent's manifest: `agent.yaml`, else the frontmatter of the legacy\n * `AGENT.md`. `null` when the directory holds neither (or it cannot be parsed).\n */\nexport function readManifest(agentDir: string): AgentManifest | null {\n const yamlPath = join(agentDir, \"agent.yaml\");\n if (!existsSync(yamlPath)) return readAgentMdManifest(agentDir)?.manifest ?? null;\n try {\n return parseYaml(readFileSync(yamlPath, \"utf-8\")) as AgentManifest;\n } catch {\n return null;\n }\n}\n\nfunction readFile(agentDir: string, name: string): string | null {\n const p = join(agentDir, name);\n if (!existsSync(p)) return null;\n try {\n return readFileSync(p, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/**\n * The agent's identity text: `SOUL.md`; for an `AGENT.md` agent the markdown body\n * comes first, so a `SOUL.md` next to it extends the prompt rather than replacing it.\n */\nexport function readSoul(agentDir: string): string | null {\n const soul = readFile(agentDir, \"SOUL.md\");\n if (existsSync(join(agentDir, \"agent.yaml\"))) return soul;\n const body = readAgentMdManifest(agentDir)?.body;\n if (!body) return soul;\n return soul ? `${body}\\n\\n${soul}` : body;\n}\n\n/**\n * A name becomes a file or directory name under the deploy dir; one with a path\n * segment (`../x`, `a/b`) would write outside it. Refused, never sanitized.\n */\nfunction isSafeFileName(name: string): boolean {\n return name.length > 0 && name !== \".\" && name !== \"..\" && !/[\\\\/\\0]/.test(name);\n}\n\n/** Extract YAML frontmatter from a markdown file (content between first two --- delimiters). */\nfunction parseFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n try {\n return (parseYaml(match[1]!) as Record<string, unknown>) ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Merge parent and child agent manifests.\n * Scalars: child wins. Arrays: parent + child, deduplicated (`composes` by\n * kind + ref + slot id, other arrays by value).\n */\nfunction mergeManifests(parent: AgentManifest, child: AgentManifest): AgentManifest {\n const result: AgentManifest = { ...parent };\n for (const [k, val] of Object.entries(child) as [keyof AgentManifest, unknown][]) {\n if (val === undefined) continue;\n const parentVal = result[k as keyof AgentManifest];\n if (k === \"composes\" && Array.isArray(val) && Array.isArray(parentVal)) {\n const merged = new Map<string, AgentComposeItem>();\n for (const item of [...parentVal, ...val] as AgentComposeItem[]) {\n merged.set(`${item.kind}\\u0000${item.ref}\\u0000${item.id ?? \"\"}`, item);\n }\n result.composes = [...merged.values()];\n } else if (Array.isArray(val) && Array.isArray(parentVal)) {\n (result as Record<string, unknown>)[k] = [...new Set([...parentVal, ...val])];\n } else {\n (result as Record<string, unknown>)[k] = val;\n }\n }\n return result;\n}\n\n/** Agent folders whose missing parent was already reported in the current run. */\nconst reportedMissingParents = new Set<string>();\n\n/**\n * Start a new run for the missing-parent warning: an `install`, `add` or `update` calls it first,\n * so one command says it once per agent, and a long-lived process (`serve`, the repl, an\n * embedder) says it again in its next command instead of once per process.\n */\nexport function resetMissingParentWarnings(): void {\n reportedMissingParents.clear();\n}\n\n/** The end both missing-parent lines share; {@link isMissingParentWarning} tells them by it. */\nconst MISSING_PARENT_TAIL = \"installed without the parent's settings.\";\n\n/**\n * The line for an agent whose `extends` parent is not there, or `null` when the agent has no\n * `extends` or the parent holds a manifest. A parent outside the agent's own folder is not part\n * of a store or library copy, so skaile cannot resolve it: the line says so, and what the\n * publisher has to change.\n */\nexport function missingParentWarning(manifest: AgentManifest, srcDir: string): string | null {\n if (!manifest.extends) return null;\n const parentDir = resolve(srcDir, manifest.extends);\n if (readManifest(parentDir)) return null;\n const outside = relative(resolve(srcDir), parentDir).startsWith(\"..\");\n const name = manifest.name ?? basename(srcDir);\n return outside\n ? `agent ${name} extends \"${manifest.extends}\", a parent outside its own folder that this copy does not hold: ${MISSING_PARENT_TAIL} The publisher must ship the parent inside the agent or drop \\`extends\\`.`\n : `agent ${name} extends \"${manifest.extends}\", but no agent.yaml or AGENT.md is there: ${MISSING_PARENT_TAIL}`;\n}\n\n/** True for a line {@link missingParentWarning} returns. */\nexport function isMissingParentWarning(line: string): boolean {\n return line.includes(MISSING_PARENT_TAIL);\n}\n\n/**\n * Phase 1: inherit scalars/arrays from a parent agent when `manifest.extends` is set.\n * Returns the (possibly merged) manifest. A parent that is not there leaves the agent without\n * its inheritance and pushes one {@link missingParentWarning}, once per agent folder and run (see\n * {@link resetMissingParentWarnings}): the install and the instance render of one command both read\n * the same manifest.\n */\nfunction applyExtendsMerge(\n manifest: AgentManifest,\n srcDir: string,\n warnings: string[],\n): AgentManifest {\n if (!manifest.extends) return manifest;\n const parentManifest = readManifest(resolve(srcDir, manifest.extends));\n if (parentManifest) {\n return mergeManifests(parentManifest, manifest);\n }\n if (reportedMissingParents.has(resolve(srcDir))) return manifest;\n reportedMissingParents.add(resolve(srcDir));\n const line = missingParentWarning(manifest, srcDir);\n if (line) warnings.push(line);\n return manifest;\n}\n\n/**\n * Phase 2: apply the instance's overrides to the asset's manifest — the model\n * selector, the turn budget (`budget.max_turns` → `runtime.max_turns`) and the\n * lifecycle. Returns the effective manifest and lifecycle.\n */\nfunction applyInstanceOverrides(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): { manifest: AgentManifest; lifecycle: AgentLifecycle } {\n const lifecycle = instance?.lifecycle ?? manifest.lifecycle ?? \"standing\";\n if (!instance) return { manifest, lifecycle };\n const effective: AgentManifest = { ...manifest, lifecycle };\n if (instance.model) {\n effective.model = { ...manifest.model, ...instance.model } as AgentManifest[\"model\"];\n }\n if (instance.budget?.max_turns !== undefined) {\n effective.runtime = { ...manifest.runtime, max_turns: instance.budget.max_turns };\n }\n return { manifest: effective, lifecycle };\n}\n\n/**\n * The name a composed asset is installed under: the asset name of a canonical\n * ref (`skill:@pub/name#1.0.0` → `name`), else the last path segment\n * (`./skills/name` → `name`).\n */\nfunction composeRefName(ref: string): string {\n const parsed = parseAssetRefLoose(ref);\n if (parsed) return parsed.name;\n const tail = ref.replace(/\\/+$/, \"\").split(\"/\").pop() ?? ref;\n return tail.replace(/^[a-z-]+:/, \"\").replace(/#.*$/, \"\") || ref;\n}\n\n/** Names of the composed items of `kind`, in declaration order, de-duplicated. */\nfunction composedNames(manifest: AgentManifest, kind: string): string[] {\n const names = (manifest.composes ?? [])\n .filter((item) => item.kind === kind)\n .map((item) => composeRefName(item.ref));\n return [...new Set(names)];\n}\n\n/**\n * Names of the agents the agent at `srcDir` calls as `delegate` sub-agents (its `kind: agent`\n * composes whose binding is not `run`). {@link installAgent} renders them next to it as\n * sub-agents, so a caller that renders the same agent on its own must do so as one too.\n */\nexport function delegateNamesOf(srcDir: string): string[] {\n const manifest = readManifest(srcDir);\n const names = (manifest?.composes ?? [])\n .filter((item) => item.kind === \"agent\" && item.binding !== \"run\")\n .map((item) => composeRefName(item.ref));\n return [...new Set(names)];\n}\n\n/**\n * Names of the agents the agent at `srcDir` composes: `run` holds those it calls through\n * `agent.run` (`binding: run`), `delegate` the others (rendered as native sub-agents). An agent\n * named under both bindings is in both.\n */\nexport function composedAgentNamesOf(srcDir: string): { run: string[]; delegate: string[] } {\n const items = (readManifest(srcDir)?.composes ?? []).filter((item) => item.kind === \"agent\");\n const names = (run: boolean): string[] => [\n ...new Set(\n items.filter((item) => (item.binding === \"run\") === run).map((i) => composeRefName(i.ref)),\n ),\n ];\n return { run: names(true), delegate: names(false) };\n}\n\n/**\n * The MCP servers an agent's `mcp-server` slots are bound to: the server the\n * instance's `connectors` map binds the slot id to, else the composed asset's\n * own name (the id its server is rendered under).\n */\nfunction boundMcpServers(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): string[] {\n const names = (manifest.composes ?? [])\n .filter((item) => item.kind === \"mcp-server\")\n .map(\n (item) => (item.id ? instance?.connectors?.[item.id] : undefined) ?? composeRefName(item.ref),\n );\n return [...new Set(names)];\n}\n\n/**\n * The workspace connector ids an agent's `connector` slots are bound to: the connector the\n * instance's `connectors` map binds the slot id to, else the slot id (a slot is usually named\n * after the workspace connector it uses), else the composed asset's own name.\n */\nfunction boundConnectorIds(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): string[] {\n const ids = (manifest.composes ?? [])\n .filter((item) => item.kind === \"connector\")\n .flatMap((item) => {\n const bound = item.id ? instance?.connectors?.[item.id] : undefined;\n return bound ? [bound] : [item.id, composeRefName(item.ref)].filter((s): s is string => !!s);\n });\n return [...new Set(ids)];\n}\n\n/** Phase 3: resolve ability refs — read description from the installed SKILL.md of each composed skill. */\nfunction resolveAbilityRefs(\n manifest: AgentManifest,\n workspaceRoot: string,\n skillsRelDir: string,\n): AbilityRef[] {\n const abilityRefs: AbilityRef[] = [];\n for (const name of composedNames(manifest, \"skill\")) {\n const skillMdPath = join(workspaceRoot, skillsRelDir, name, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n try {\n const fm = parseFrontmatter(readFileSync(skillMdPath, \"utf-8\"));\n const desc = typeof fm.description === \"string\" ? fm.description : undefined;\n if (desc) abilityRefs.push({ name, description: desc });\n } catch {\n // skip unreadable SKILL.md\n }\n }\n return abilityRefs;\n}\n\n/** Phase 4: resolve contract refs — locate the CONTRACT.md of each composed contract in the skills dir. */\nfunction resolveContractRefs(\n manifest: AgentManifest,\n workspaceRoot: string,\n skillsRelDir: string,\n): ContractRef[] {\n const contractRefs: ContractRef[] = [];\n for (const name of composedNames(manifest, \"contract\")) {\n const contractAbsPath = join(workspaceRoot, skillsRelDir, name, \"CONTRACT.md\");\n if (!existsSync(contractAbsPath)) continue;\n contractRefs.push({ name, relativePath: relative(workspaceRoot, contractAbsPath) });\n }\n return contractRefs;\n}\n\n/** A `kind: agent` composition item rendered as its own native sub-agent file. */\nexport interface DelegateSubAgent {\n /** `composes[].ref` as written. */\n ref: string;\n /** Absolute path of the sub-agent's source directory. */\n srcDir: string;\n /** File name: the item's `as`, else the sub-agent's own `name`. */\n name: string;\n /** `composes[].as`, forwarded as the install name override. */\n alias: string | undefined;\n}\n\n/**\n * Phase 5a: the `delegate` sub-agents of an agent — its `kind: agent` items\n * whose binding is not `run` (`delegate` is the default for the harnesses that\n * render native agent files). Catalog refs resolve like `agents.<id>.ref`;\n * anything else is a path relative to the composing agent's directory. An\n * unresolvable item is skipped with a warning.\n */\nfunction resolveDelegates(\n manifest: AgentManifest,\n agentName: string,\n srcDir: string,\n workspaceRoot: string,\n warnings: string[],\n): DelegateSubAgent[] {\n const delegates: DelegateSubAgent[] = [];\n for (const item of manifest.composes ?? []) {\n if (item.kind !== \"agent\" || item.binding === \"run\") continue;\n let subSrc: string | undefined;\n try {\n subSrc =\n item.ref.startsWith(\"agent:\") || item.ref.startsWith(\"ai-assets://\")\n ? resolveAgentDefinitionDir(workspaceRoot, item.ref)\n : resolve(srcDir, item.ref);\n } catch (err) {\n warnings.push(\n `Sub-agent ${item.ref} (from ${agentName}): ${err instanceof Error ? err.message : String(err)}`,\n );\n continue;\n }\n if (!subSrc || !existsSync(subSrc)) {\n warnings.push(`Sub-agent source not found: ${item.ref} (from ${agentName})`);\n continue;\n }\n const sub = readManifest(subSrc);\n const name = item.as ?? sub?.name ?? basename(subSrc);\n // The name is a file name under the deploy dir: refuse anything that is not a plain id.\n if (typeof name !== \"string\" || !AGENT_INSTANCE_ID_PATTERN.test(name)) {\n warnings.push(\n `Sub-agent ${item.ref} (from ${agentName}): name ${JSON.stringify(name)} must match ${AGENT_INSTANCE_ID_PATTERN} — skipped`,\n );\n continue;\n }\n delegates.push({\n ref: item.ref,\n srcDir: subSrc,\n name,\n alias: item.as,\n });\n }\n return delegates;\n}\n\n/**\n * The source folders of the `delegate` sub-agents of the agent at `srcDir`, the sub-agents of\n * those included, each once: the agents {@link installAgent} renders next to it. A sub-agent\n * that cannot be resolved is left out (the render warns about it).\n */\nexport function delegateSourceDirs(srcDir: string, workspaceRoot: string): string[] {\n const found: string[] = [];\n const seen = new Set([resolve(srcDir)]);\n const walk = (dir: string): void => {\n const manifest = readManifest(dir);\n if (!manifest) return;\n const name = manifest.name ?? basename(dir);\n for (const delegate of resolveDelegates(manifest, name, dir, workspaceRoot, [])) {\n const abs = resolve(delegate.srcDir);\n if (seen.has(abs)) continue;\n seen.add(abs);\n found.push(abs);\n walk(abs);\n }\n };\n walk(srcDir);\n return found;\n}\n\n/** Phase 5b: assemble the fragment context from the manifest, workspace config, and resolved refs. */\nfunction buildFragmentContext(\n subAgentNames: string[],\n harness: string,\n skillsRelDir: string,\n wsConfig: SkWorkspaceConfig | undefined,\n abilityRefs: AbilityRef[],\n contractRefs: ContractRef[],\n /** Set for an agent that another agent calls: the connector ids its own slots are bound to. */\n callee?: { subAgent: boolean; connectorIds: string[] },\n): FragmentContext {\n const connectors: ConnectorRef[] = (wsConfig?.connectors ?? [])\n .filter((c) => !callee || callee.connectorIds.includes(c.id))\n .map((c) => ({\n id: c.id,\n driver: c.driver,\n access: c.access ?? \"read-write\",\n }));\n\n const agentsRelDir = HARNESS_TARGETS[harness as HarnessName]?.local.agent ?? \"\";\n\n return {\n framework: harness,\n skillsDir: skillsRelDir,\n agentsDir: agentsRelDir,\n subAgents: subAgentNames,\n ...(callee ? { subAgent: callee.subAgent } : {}),\n connectors,\n abilityRefs,\n contractRefs,\n };\n}\n\n// ── Core installation ─────────────────────────────────────────────────────────\n\n/** What {@link prepareAgentRender} gathers: the render input and the `delegate` sub-agents to install beside it. */\nexport interface PreparedAgentRender {\n input: AgentRenderInput;\n delegates: DelegateSubAgent[];\n}\n\n/**\n * Gather everything the agent's native file is rendered from (phases 1-5 of the header): the\n * one input set `assembleAgent` builds the prompt from. `installAgent` renders it;\n * `skaile run --dry-run --print-prompt` assembles the same set without writing, so the printed\n * prompt and the file body cannot differ.\n *\n * @param warnings - Receives the non-fatal notes of the phases.\n * @returns `null` when the directory is no agent package or the name is no valid file name (a\n * warning says which).\n */\nexport async function prepareAgentRender(\n srcDir: string,\n agentDeployDir: string,\n workspaceRoot: string,\n harness: string,\n skillsRelDir: string,\n nameOverride: string | undefined,\n wsConfig: SkWorkspaceConfig | undefined,\n warnings: string[],\n instance?: AgentInstanceConfig,\n delegated = false,\n assetVersion?: string,\n /** Composed and memory blocks the caller already has (the runner's); skips reading them. */\n resolved?: Pick<AgentRenderInput, \"composed\" | \"memory\">,\n /** The lock entries the command is about to write; composed pins resolve against them. */\n lockAssets?: Record<string, LockEntry>,\n): Promise<PreparedAgentRender | null> {\n const rawManifest = readManifest(srcDir);\n const initialManifest =\n rawManifest && assetVersion && !rawManifest.version\n ? { ...rawManifest, version: assetVersion }\n : rawManifest;\n if (!initialManifest) {\n warnings.push(`${srcDir} has no agent.yaml or AGENT.md — skipping (not an agent package)`);\n return null;\n }\n\n // Phase 1: extends merge — inherit scalars/arrays from parent agent\n // Phase 2: instance overrides — model / budget / lifecycle\n const { manifest, lifecycle } = applyInstanceOverrides(\n applyExtendsMerge(initialManifest, srcDir, warnings),\n instance,\n );\n\n const agentName = nameOverride ?? manifest.name ?? basename(srcDir);\n if (typeof agentName !== \"string\" || !isSafeFileName(agentName)) {\n warnings.push(\n `${srcDir}: agent name ${JSON.stringify(agentName)} is not a valid file name (no path separators) — skipping`,\n );\n return null;\n }\n\n // Phase 3: resolve ability refs — read description from installed SKILL.md files\n const abilityRefs = resolveAbilityRefs(manifest, workspaceRoot, skillsRelDir);\n\n // Phase 4: resolve contract refs — locate CONTRACT.md files in the skills dir\n const contractRefs = resolveContractRefs(manifest, workspaceRoot, skillsRelDir);\n\n // Phase 5: delegate sub-agents, fragment context, framework fragments + prompt extensions\n const delegates = resolveDelegates(manifest, agentName, srcDir, workspaceRoot, warnings);\n // A `role`, and a `delegate` sub-agent, is called by another agent: it is told so, and sees\n // only the connectors it composes.\n const subAgent = lifecycle === \"role\" || delegated;\n const fragmentCtx = buildFragmentContext(\n delegates.map((d) => d.name),\n harness,\n skillsRelDir,\n wsConfig,\n abilityRefs,\n contractRefs,\n subAgent ? { subAgent, connectorIds: boundConnectorIds(manifest, instance) } : undefined,\n );\n\n const frameworkFragments = resolveFragments(\n fragmentCtx,\n wsConfig?.agent?.fragments,\n workspaceRoot,\n );\n const promptExtensions = loadPromptExtensionParts(\n wsConfig?.agent?.[\"prompt-extensions\"],\n workspaceRoot,\n );\n\n // Composed inline blocks and memory seeds are baked into the file like the convention files,\n // so the file holds what `skaile run` sends (one assembler, ADR 0018).\n const blocks =\n resolved ?? (await loadPromptBlocks(manifest, srcDir, workspaceRoot, instance, lockAssets));\n\n const input: AgentRenderInput = {\n manifest,\n soul: readSoul(srcDir),\n rules: readFile(srcDir, \"RULES.md\"),\n duties: readFile(srcDir, \"DUTIES.md\"),\n agentName,\n agentDeployDir,\n workspaceRoot,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n composed: blocks.composed,\n memory: blocks.memory,\n lifecycle,\n skills: composedNames(manifest, \"skill\"),\n mcpServers: boundMcpServers(manifest, instance),\n srcDir,\n };\n\n return { input, delegates };\n}\n\n/**\n * Install a single GitAgent source directory using the appropriate renderer.\n *\n * When `includeSubAgents` is `true`, recursively installs the `delegate`\n * sub-agents (`composes: [{ kind: agent }]`) as separate flat agents in the\n * same deploy directory (no nesting). Tracks visited directories to prevent\n * infinite loops in sub-agent cycles.\n *\n * @param srcDir - Absolute path to the GitAgent source directory (contains `agent.yaml`).\n * @param agentDeployDir - Absolute path to the framework's agent deploy directory.\n * @param workspaceRoot - Absolute path to the workspace root.\n * @param harness - Agent framework ID used to select the renderer.\n * @param skillsRelDir - Relative path to the installed skills dir (e.g. `\".claude/skills\"`).\n * @param nameOverride - Override name for the installed agent. Defaults to `manifest.name`;\n * an instance render passes the instance id.\n * @param includeSubAgents - When `true`, recursively install `delegate` sub-agents.\n * @param visited - Set of resolved source paths already processed (cycle guard).\n * @param wsConfig - Workspace config from `skaile.yaml` (fragments, connectors, extensions).\n * @param log - Optional logger callback for progress messages.\n * @param instance - The `skaile.yaml` instance being rendered; its model / budget / lifecycle\n * override the asset's and its `connectors` map binds the `mcp-server` slots.\n * @returns Object with `created` file paths (every rendered file), `changed` (the subset whose\n * bytes differ from what was deployed before) and `warnings` list.\n * @docLink packages/asset-manager/concepts#install-agent\n */\nexport async function installAgent(\n srcDir: string,\n agentDeployDir: string,\n workspaceRoot: string,\n harness: string,\n /** Relative path to the installed skills dir (e.g. \".claude/skills\") */\n skillsRelDir: string,\n nameOverride: string | undefined,\n includeSubAgents: boolean,\n visited: Set<string>,\n wsConfig: SkWorkspaceConfig | undefined,\n log?: (msg: string) => void,\n instance?: AgentInstanceConfig,\n /** `true` for a `delegate` sub-agent rendered for the agent that calls it. */\n delegated = false,\n /**\n * The version the lock and `info` give the asset. A manifest that declares none (an `AGENT.md`\n * agent without `metadata.version`) takes it, so the rendered `agent.yaml` names the version\n * the lock holds.\n */\n assetVersion?: string,\n /** The lock entries the command is about to write; composed pins resolve against them. */\n lockAssets?: Record<string, LockEntry>,\n): Promise<{ created: string[]; changed: string[]; warnings: string[] }> {\n const created: string[] = [];\n const changed: string[] = [];\n const warnings: string[] = [];\n\n const realSrc = resolve(srcDir);\n if (visited.has(realSrc)) return { created, changed, warnings };\n visited.add(realSrc);\n\n const prepared = await prepareAgentRender(\n srcDir,\n agentDeployDir,\n workspaceRoot,\n harness,\n skillsRelDir,\n nameOverride,\n wsConfig,\n warnings,\n instance,\n delegated,\n assetVersion,\n undefined,\n lockAssets,\n );\n if (!prepared) return { created, changed, warnings };\n const { input, delegates } = prepared;\n log?.(`Installing git-agent: ${input.agentName} (${harness})`);\n\n const result = renderAgentToFramework(input, harness, log);\n created.push(...result.created);\n changed.push(...result.changed);\n warnings.push(...result.warnings);\n\n // Recursively install delegate sub-agents as flat top-level agents\n if (includeSubAgents) {\n for (const delegate of delegates) {\n const sub = await installAgent(\n delegate.srcDir,\n agentDeployDir,\n workspaceRoot,\n harness,\n skillsRelDir,\n delegate.alias, // undefined → the sub-agent's own name from its agent.yaml\n includeSubAgents,\n visited,\n wsConfig,\n log,\n undefined,\n true,\n undefined,\n lockAssets,\n );\n created.push(...sub.created);\n changed.push(...sub.changed);\n warnings.push(...sub.warnings);\n }\n }\n\n return { created, changed, warnings };\n}\n","/**\n * Asset deployment — copies assets into framework dirs by default (self-contained,\n * cache-safe, portable); `--link` opts into a symlink for the local-path dev loop.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport {\n cpSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n mkdtempSync,\n readdirSync,\n readlinkSync,\n renameSync,\n rmSync,\n statSync,\n symlinkSync,\n type Stats,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { basename, dirname, join, normalize, relative, resolve, sep } from \"node:path\";\nimport type {\n AgentInstanceConfig,\n AgentPromptSectionsInput,\n AiComponent,\n AssembledAgent,\n CatalogEntry,\n HarnessName,\n LockEntry,\n SkWorkspaceConfig,\n SourceDeclaration,\n} from \"@skaile/workspaces/core\";\nimport {\n agentSourceCacheDir,\n applyPatch,\n assembleAgent,\n assetRefToStr,\n computeHash,\n HARNESS_TARGETS,\n deployedBase,\n deployedDir,\n deployedPaths,\n globalSkaileDir,\n harnessNameForHarnessId,\n isDeployed,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport {\n isEnvFileName,\n isLibraryManifestAtAssetRoot,\n isNonAssetDir,\n isNonAssetFile,\n isSecretFileName,\n librarySymlinkMessage,\n listAssetFiles,\n listSecretFiles,\n listSkippedSymlinks,\n} from \"@skaile/workspaces/core/publish-manifest\";\nimport {\n AGENT_BODY_PLACEHOLDER,\n CONTRACT_BODY_PLACEHOLDER,\n FLOW_NODE_INSTRUCTION_PLACEHOLDER,\n PRESET_ITEM_PLACEHOLDER_REF,\n PROMPT_BODY_PLACEHOLDER,\n SKILL_BODY_PLACEHOLDER,\n SKILL_DESCRIPTION_PLACEHOLDER,\n SKILL_DESCRIPTION_PLACEHOLDER_PREFIX,\n} from \"@skaile/workspaces/types/manifests\";\nimport type { IAssetKindProvider, IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport { CompositionError } from \"@skaile/workspaces/runner/composition-content\";\nimport { isMap, isSeq, parseDocument, stringify as stringifyYaml } from \"yaml\";\nimport {\n composedAgentNamesOf,\n type DelegateSubAgent,\n delegateNamesOf,\n installAgent,\n prepareAgentRender,\n readManifest,\n readSoul,\n} from \"./install-agent.js\";\nimport {\n agentPromptInput,\n CODEX_IDENTITY_DIR,\n harnessTargetSupportsAgents,\n type Log,\n} from \"./renderers.js\";\n\nexport type { Log } from \"./renderers.js\";\n\nconst noop: Log = () => {};\n\n/**\n * The printable canonical ref of a resolved entry — `kind:@publisher/name#version`,\n * the one ref grammar the CLI shows. An entry whose `publisher` is a clone key\n * carries the real ref in `canonicalRef`; with neither a `canonicalRef` nor a\n * publisher there is nothing to namespace it by, so it falls back to `kind:name`.\n */\nexport function canonicalEntryRef(entry: CatalogEntry): string {\n if (entry.canonicalRef) return entry.canonicalRef;\n const publisher = entry.publisher?.replace(/^@/, \"\");\n if (!publisher) return `${entry.kind}:${entry.name}`;\n return assetRefToStr({\n kind: entry.kind,\n name: entry.name,\n publisher,\n pin: entry.version || undefined,\n });\n}\n\n// ── Filesystem helpers ────────────────────────────────────────────────────────\n\nfunction clearDest(dest: string): void {\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n } catch {}\n}\n\n/**\n * A credential file (not an `.env*` file, which stays the owner's local file) inside a deployed\n * copy: releases before 5.17 deployed these (`.npmrc`, `id_rsa`, `token.json`, ...), a deploy now\n * withholds them (p1040). A re-deploy deletes the leftover and `check` reports it as extra, so a\n * leaked credential is not kept for good.\n */\nfunction isLeakedSecret(name: string): boolean {\n return isSecretFileName(name) && !isEnvFileName(name);\n}\n\n/**\n * Empty a deployed asset directory before a copy deploy, but keep what is not part of an\n * asset (`.env`, `.venv/`, `__pycache__/`, `*.pyc`, ...): those are the owner's local files, the\n * lock never covers them, so a re-deploy must not delete them. Anything else — including a\n * symlink — goes. A `dest` that is a symlink or a file is removed whole.\n */\nfunction clearDeployedAsset(dest: string): void {\n let s: ReturnType<typeof lstatSync>;\n try {\n s = lstatSync(dest);\n } catch {\n return;\n }\n if (!s.isDirectory()) {\n clearDest(dest);\n return;\n }\n const empty = (dir: string): boolean => {\n let kept = false;\n for (const e of readdirSync(dir, { withFileTypes: true })) {\n const path = join(dir, e.name);\n if (e.isDirectory()) {\n if (isNonAssetDir(e.name, dir === dest)) kept = true;\n else if (!empty(path)) kept = true;\n else rmSync(path, { recursive: true, force: true });\n } else if (e.isFile() && isNonAssetFile(e.name) && !isLeakedSecret(e.name)) {\n kept = true;\n } else {\n rmSync(path, { force: true });\n }\n }\n return !kept;\n };\n try {\n empty(dest);\n } catch {\n clearDest(dest);\n }\n}\n\n/**\n * The harness component directory a kind installs into — the provider's\n * `installTarget` — or `undefined` for composition-only kinds (connector,\n * mcp-server, knowledge, persona, ruleset, preset) and unregistered kinds.\n * The registry is the only authority: there is no static list of deployable kinds.\n */\nexport function installTargetOf(\n registry: IAssetKindRegistry,\n kind: string,\n): AiComponent | undefined {\n return registry.getProvider(kind)?.installTarget;\n}\n\n/**\n * The manifest file of a resolved entry. `source` is normally the manifest file\n * itself; a directory source is searched for the provider's manifest.\n * `undefined` when `source` is a directory holding none.\n */\nfunction manifestFileOf(provider: IAssetKindProvider, source: string): string | undefined {\n if (!statSync(source).isDirectory()) return source;\n const hit = readdirSync(source).find((f) => provider.matchesPath(f));\n return hit ? join(source, hit) : undefined;\n}\n\n/**\n * A resolved entry ready to deploy: a {@link CatalogEntry} that may carry the\n * asset's authoritative file list.\n */\nexport interface DeployableEntry extends CatalogEntry {\n /**\n * Asset files relative to the manifest's directory. Set for store-staged\n * assets, whose verified pointer (not the provider's default filter) defines\n * what the asset is — a manifest-mode publish may list files the default filter\n * would not pick. Absent → the provider's `defaultFileFilter`.\n */\n files?: readonly string[];\n}\n\n/**\n * Throw when the asset's own folder holds a symlink the library would refuse. A lone manifest\n * file shares its directory with other assets, so only an asset that owns its directory (several\n * files, or a directory named after it) is checked.\n */\nfunction assertNoSymlinks(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n manifestPath: string | null | undefined,\n): void {\n let root = entry.source;\n if (manifestPath) {\n const filter = provider.defaultFileFilter(manifestPath);\n const files = entry.files ?? filter.files;\n if (files.length <= 1 && basename(filter.assetRoot) !== entry.name) return;\n root = filter.assetRoot;\n }\n const [rel] = listSkippedSymlinks(root);\n if (rel === undefined) return;\n const link = join(root, rel);\n throw new Error(\n `${canonicalEntryRef(entry)}: ${librarySymlinkMessage({ path: join(basename(root), rel), target: readlinkSync(link) })} Nothing was added.`,\n );\n}\n\n/**\n * Refuse, before anything is written, every entry whose own folder holds a symlink (p743).\n * `add`, `install` and `update` call this ahead of the first deploy and ahead of the removal of\n * stale assets, so `Nothing was added` is true: a refusal in the middle of {@link deployAll}\n * would leave the copies of the entries before it behind. Composition-only kinds, entries that a\n * `--link` deploy symlinks (no copy) and entries without a readable source are skipped. An agent\n * counts too: it is rendered, but its source is copied into the agent cache.\n */\nexport function assertNoLibrarySymlinks(\n entries: readonly DeployableEntry[],\n registry: IAssetKindRegistry,\n repositories: Record<string, SourceDeclaration> = {},\n link = false,\n): void {\n for (const entry of entries) {\n const provider = registry.getProvider(entry.kind);\n if (!provider?.installTarget) continue;\n if (link) {\n const decl = entry.publisher ? repositories[entry.publisher] : undefined;\n if (decl?.path != null && decl.factory !== true) continue;\n }\n let manifestPath: string | undefined;\n try {\n manifestPath = manifestFileOf(provider, entry.source);\n } catch {\n continue;\n }\n assertNoSymlinks(provider, entry, manifestPath);\n }\n}\n\n/**\n * Copy an asset into `dest`: the entry's explicit `files` when it has them, else\n * exactly the files the provider's `defaultFileFilter` selects (the same set the\n * store publishes and hashes). A directory source without a recognisable\n * manifest is copied whole.\n */\nfunction copyAsset(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n dest: string,\n onSecretFile?: (entry: DeployableEntry, path: string) => void,\n): void {\n const source = entry.source;\n const manifestPath = manifestFileOf(provider, source);\n // A library holds plain files: a symlink in the asset's folder refuses the deploy, as `library\n // index`, `validate` and the publish plan refuse the library (p743). Nothing is cleared or copied.\n assertNoSymlinks(provider, entry, manifestPath);\n clearDeployedAsset(dest);\n if (!manifestPath) {\n // Same ignore list as the content hash: leftovers and symlinks are not part of the asset.\n cpSync(source, dest, {\n recursive: true,\n filter: (src) => {\n if (src === source) return true;\n const name = basename(src);\n const stat = lstatSync(src);\n if (stat.isSymbolicLink()) return false;\n if (isLibraryManifestAtAssetRoot(relative(source, src))) return false;\n // A directory is only left out by name; a file by `isNonAssetFile`: a folder called\n // `credentials` or `build.log` is an ordinary folder.\n if (\n stat.isDirectory() ? isNonAssetDir(name, dirname(src) === source) : isNonAssetFile(name)\n ) {\n if (stat.isFile() && isSecretFileName(name)) {\n onSecretFile?.(entry, join(basename(source), relative(source, src)));\n }\n return false;\n }\n return true;\n },\n });\n return;\n }\n const filter = provider.defaultFileFilter(manifestPath);\n const assetRoot = filter.assetRoot;\n const files = entry.files ?? filter.files;\n mkdirSync(dest, { recursive: true });\n for (const rel of files) {\n const target = join(dest, rel);\n mkdirSync(dirname(target), { recursive: true });\n cpSync(join(assetRoot, rel), target);\n }\n // A lone manifest file shares its directory with other assets: only an asset that owns its\n // directory (several files, or a directory named after it) can say which secrets it drops.\n if (files.length > 1 || basename(assetRoot) === entry.name) {\n if (onSecretFile) {\n for (const rel of listSecretFiles(assetRoot))\n onSecretFile(entry, join(basename(assetRoot), rel));\n }\n }\n}\n\n/**\n * Whether the source file is executable but its deployed copy is not: the bytes match, yet the\n * copy shows as a mode change in `git status`, so a repeat install writes it again (p1657).\n */\nfunction execBitLost(source: string, deployed: string): boolean {\n try {\n return (lstatSync(source).mode & 0o111) !== 0 && (lstatSync(deployed).mode & 0o100) === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Symlink an asset (the `--link` dev-loop). A multi-file asset, or one living in\n * a directory named after it, links its whole directory; a lone manifest file\n * links into `dest/`.\n */\nfunction symlinkAsset(\n provider: IAssetKindProvider,\n source: string,\n dest: string,\n name: string,\n): void {\n clearDest(dest);\n mkdirSync(dirname(dest), { recursive: true });\n const manifestPath = manifestFileOf(provider, source);\n if (!manifestPath) {\n symlinkSync(resolve(source), dest);\n return;\n }\n const { assetRoot, files } = provider.defaultFileFilter(manifestPath);\n if (files.length > 1 || basename(assetRoot) === name) {\n symlinkSync(resolve(assetRoot), dest);\n } else {\n mkdirSync(dest, { recursive: true });\n symlinkSync(resolve(manifestPath), join(dest, basename(manifestPath)));\n }\n}\n\n/** What differs between a deployed asset directory and the bytes a deploy of the entry writes. */\nexport interface DeployedDrift {\n /** Deployed files (relative to the deployed asset directory) whose bytes differ from the source. */\n modified: string[];\n /** Files in the deployed asset directory that the asset does not ship. */\n extra: string[];\n}\n\n/**\n * Compare the deployed copy of `entry` with the bytes a copy deploy writes from its source: the\n * same file set {@link copyAsset} copies, so a tool leftover (`__pycache__/`, `.env`) in the\n * deployed directory is not drift. `null` when there is nothing to compare: a kind that is\n * not copied into a harness directory (composition-only, or an agent, which is rendered), no\n * deployed directory, a symlinked deploy (`--link`) or an unreadable source.\n */\nexport function deployedAssetDrift(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\">,\n): DeployedDrift | null {\n const provider = opts.registry.getProvider(entry.kind);\n const component = provider?.installTarget;\n if (!provider || !component || component === \"agent\") return null;\n const dest = deployedDir(\n component,\n entry.name,\n opts.harness ?? \"claude-code\",\n opts.global ?? false,\n opts.cwd,\n );\n try {\n const deployed = lstatSync(dest);\n if (deployed.isSymbolicLink() || !deployed.isDirectory()) return null;\n const manifestPath = manifestFileOf(provider, entry.source);\n const filter = manifestPath ? provider.defaultFileFilter(manifestPath) : undefined;\n const assetRoot = filter ? filter.assetRoot : entry.source;\n const files = filter ? (entry.files ?? filter.files) : listAssetFiles(entry.source);\n const modified: string[] = [];\n for (const rel of files) {\n const deployedFile = join(dest, rel);\n if (!existsSync(deployedFile)) continue;\n if (computeHash(join(assetRoot, rel)) !== computeHash(deployedFile)) modified.push(rel);\n }\n const expected = new Set(files);\n const extra = [\n ...listAssetFiles(dest),\n ...listSecretFiles(dest).filter((rel) => isLeakedSecret(basename(rel))),\n ].filter((rel) => !expected.has(rel));\n return { modified, extra };\n } catch {\n return null;\n }\n}\n\n/**\n * Whether the deployed copy of `entry` is what a deploy would write, so the deploy skips it.\n * `current`: the manifest, every companion file and the file set match (or the manifest cannot be\n * compared). `stale`: something differs, a deploy rewrites the copy. `missing`: no manifest file\n * in the deployed directory. A companion that is a symlink in the source is no part of the copy\n * (a library holds plain files, `check` ignores it), so it never makes an intact copy stale\n * (p1857). The caller has checked that the entry is a copied kind and its directory exists.\n */\nfunction deployedCopyState(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\">,\n): \"current\" | \"stale\" | \"missing\" {\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component) return \"missing\";\n const dest = deployedDir(\n component,\n entry.name,\n opts.harness ?? \"claude-code\",\n opts.global ?? false,\n opts.cwd,\n );\n const manifestName = basename(entry.source);\n const deployedManifest = join(dest, manifestName);\n // isDeployed() only lstats the dir, so a present-but-empty dir (manifest file deleted) reads as\n // deployed. A missing manifest must never count as \"already deployed\".\n // (existsSync follows symlinks, so for symlinked installs the manifest resolves through to the\n // live source and the hash check below still skips them.)\n if (!existsSync(deployedManifest)) return \"missing\";\n let manifestUnchanged: boolean;\n try {\n manifestUnchanged =\n computeHash(entry.source) === computeHash(deployedManifest) &&\n !execBitLost(entry.source, deployedManifest);\n } catch {\n // Deployed manifest unreadable (e.g. agent rendered to a different path) - skip\n return \"current\";\n }\n // Every other file the deploy writes must be present and identical too - the manifest alone\n // misses a deleted or stale companion (`.gitignore`, `resources/`, `scripts/`) the copy would\n // restore. A companion that cannot be compared counts as changed, so it is healed, not skipped.\n const srcRoot = dirname(entry.source);\n const companionsUnchanged = (entry.files ?? [])\n .filter((rel) => rel !== manifestName)\n .every((rel) => {\n const deployed = join(dest, rel);\n try {\n if (lstatSync(join(srcRoot, rel)).isSymbolicLink()) return true;\n return (\n existsSync(deployed) &&\n computeHash(join(srcRoot, rel)) === computeHash(deployed) &&\n !execBitLost(join(srcRoot, rel), deployed)\n );\n } catch {\n return false;\n }\n });\n // A file the asset does not ship (a stray `extra.txt`) is drift too: the copy clears the\n // directory, so a repeat install restores the asset exactly.\n const strayFiles = deployedAssetDrift(entry, opts)?.extra.length ?? 0;\n return manifestUnchanged && companionsUnchanged && strayFiles === 0 ? \"current\" : \"stale\";\n}\n\n/**\n * The entries a deploy would write: those without a current deployed copy. An intact copy\n * stays as it is, so a library change that does not reach it (a symlink added next to the\n * files) stops no `install` or `update` (p1857).\n */\nexport function entriesNeedingDeploy<T extends DeployableEntry>(\n entries: readonly T[],\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\" | \"link\">,\n): T[] {\n return entries.filter((entry) => {\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component || component === \"agent\") return true;\n const harness = opts.harness ?? \"claude-code\";\n const global = opts.global ?? false;\n if (!isDeployed(component, entry.name, harness, global, opts.cwd)) return true;\n try {\n const dest = deployedDir(component, entry.name, harness, global, opts.cwd);\n if (lstatSync(dest).isSymbolicLink() && opts.link !== true) return true;\n } catch {\n return true;\n }\n return deployedCopyState(entry, { ...opts, harness, global }) !== \"current\";\n });\n}\n\n// ── Deploy options ───────────────────────────────────────────────────────────\n\n/**\n * Options controlling where and how assets are deployed.\n *\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport interface DeployOptions {\n /** Asset-kind registry — decides, per kind, the harness install target and file set. */\n registry: IAssetKindRegistry;\n /** Agent framework to target (determines framework-specific directory layout). Defaults to `\"claude-code\"`. */\n harness?: HarnessName;\n /** When `true`, deploy into the global Skaile cache rather than a project workspace. */\n global?: boolean;\n /** Absolute path to the workspace root. Defaults to `process.cwd()`. */\n cwd?: string;\n /**\n * Opt into a symlink (the author dev-loop) instead of a copy — honoured only\n * when the source has a real local path. Machine-local / not for committing;\n * for store/factory sources (no stable local path) it is a no-op (still copy).\n */\n link?: boolean;\n /**\n * Called once per secret file ({@link isSecretFileName}: `.env*`, private keys, credential\n * files) inside an asset's own directory that a copy deploy leaves out (secrets are never part\n * of an asset), with the path relative to the asset directory's parent.\n */\n onSecretFile?: (entry: DeployableEntry, path: string) => void;\n /**\n * The lock's record of an agent's `../` compose folders: project-relative paths under\n * `.skaile/cache/agents/<agent>/composes/` with sha256. While a record exists the cached\n * folders keep exactly those bytes: a deploy does not copy the library's newer ones (only\n * {@link DeployOptions.refreshComposed} does, p1511).\n */\n lockedComposed?: (agent: string) => ReadonlyArray<{ path: string; sha256: string }> | undefined;\n /** Copy every `../` compose folder from its source again, whatever the lock records (`update`, `add`). */\n refreshComposed?: boolean;\n /**\n * The lock entries the command is about to write. An agent's composed pins resolve against them\n * when it is rendered, so a pin `update` moves does not fail on the older lock still on disk.\n */\n lockAssets?: Record<string, LockEntry>;\n /**\n * Called once per `../` compose folder the lock records but neither the cached copy nor the\n * source holds any more: the source moved on and only `update` moves the lock to it.\n */\n onComposedDrift?: (entry: DeployableEntry, ref: string) => void;\n /**\n * Names of the agents an instance of `skaile.yaml` binds (project scope). The instance's file\n * (`.claude/agents/<instance id>.md`) is their rendering, so no file named after the asset is\n * written for them.\n */\n instanceBoundAgents?: ReadonlySet<string>;\n /**\n * Whether the lock already holds the agent `name`. A skipped asset-named rendering counts as a\n * change only for an agent the lock does not hold yet, so `add` and a first `install` still\n * report it.\n */\n agentLocked?: (name: string) => boolean;\n}\n\n/**\n * Keep the agent's source (`agent.yaml`, `SOUL.md`, …) under\n * `<project>/.skaile/cache/agents/<name>/`, the one place `agents.<id>.ref:\n * agent:@pub/name` resolves an added library / source / store agent from: the\n * deployed copy is a rendering (`.claude/agents/<name>.md`) that has lost the\n * composition, triggers and slots an instance needs. An `AGENT.md` agent is stored\n * in the `agent.yaml` + `SOUL.md` form so every instance consumer reads one shape.\n * A failure is logged, never fatal: the rendered agent is deployed either way.\n */\nfunction materializeAgentSource(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n srcDir: string,\n workspaceRoot: string,\n log: Log,\n opts: DeployOptions,\n): void {\n const dest = join(agentSourceCacheDir(workspaceRoot), entry.name);\n // `skaile rebuild` (or the compile an earlier add/install made) pins the composition in\n // `compile_manifest.json`; the copy below clears the folder, the pin is put back after it.\n // The CLI recompiles a pin whose content the source no longer serves (p413, p1310).\n const pinFile = join(dest, COMPILE_PIN_FILENAME);\n const pin = existsSync(pinFile) ? readFileSync(pinFile) : undefined;\n // The cached `../` compose folders are locked: set them aside so the copy below does not\n // clear them, and put back what the lock still describes (p1511).\n const composesDir = join(dest, \"composes\");\n const keptDir = existsSync(composesDir)\n ? join(agentSourceCacheDir(workspaceRoot), `.${entry.name}.composes-kept`)\n : undefined;\n if (keptDir) {\n rmSync(keptDir, { recursive: true, force: true });\n renameSync(composesDir, keptDir);\n }\n // `bundleParentComposes` settles the kept folders (puts back or replaces each); only after it\n // ran are the leftovers safe to delete. Any earlier exit puts the locked bytes back.\n let bundled = false;\n try {\n copyAsset(provider, entry, dest);\n if (!existsSync(join(dest, \"agent.yaml\"))) {\n const manifest = readManifest(srcDir);\n if (!manifest) return;\n writeFileSync(\n join(dest, \"agent.yaml\"),\n stringifyYaml({ ...manifest, name: manifest.name ?? entry.name }),\n \"utf8\",\n );\n const soul = readSoul(srcDir);\n if (soul) writeFileSync(join(dest, \"SOUL.md\"), `${soul}\\n`, \"utf8\");\n }\n bundleParentComposes(dest, srcDir, { entry, workspaceRoot, keptDir, opts });\n bundled = true;\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n log(` warn: could not keep the source of agent ${entry.name}: ${reason}`);\n } finally {\n if (keptDir) {\n if (bundled || restoreKeptComposes(keptDir, composesDir)) {\n rmSync(keptDir, { recursive: true, force: true });\n }\n }\n if (pin && existsSync(dest) && !existsSync(pinFile)) writeFileSync(pinFile, pin);\n }\n}\n\n/**\n * Put the compose folders set aside by {@link materializeAgentSource} back under `composes/`\n * after a copy that did not finish, so the bytes the lock records are not lost (p1511). A folder\n * the failed run already placed there is left as it is. Returns `false` when a folder could not be moved back, so the caller keeps the set-aside copy.\n */\nfunction restoreKeptComposes(keptDir: string, composesDir: string): boolean {\n try {\n mkdirSync(composesDir, { recursive: true });\n for (const name of readdirSync(keptDir)) {\n const target = join(composesDir, name);\n if (!existsSync(target)) renameSync(join(keptDir, name), target);\n }\n return true;\n } catch {\n // the kept copy stays on disk next to the cache folder if it cannot be moved back\n return false;\n }\n}\n\n/** Name of the compile pin `skaile rebuild` writes (`COMPILE_MANIFEST_FILENAME` of the runner, which this layer cannot import). */\nconst COMPILE_PIN_FILENAME = \"compile_manifest.json\";\n\n/** Relative path → sha256 of the files of a compose folder (or of a lone file, under the key `\"\"`). */\nfunction composeRows(root: string): Map<string, string> {\n const out = new Map<string, string>();\n let top: Stats;\n try {\n top = lstatSync(root);\n } catch {\n return out;\n }\n if (top.isSymbolicLink()) return out;\n if (top.isFile()) {\n out.set(\"\", computeHash(root));\n return out;\n }\n const walk = (dir: string, rel: string): void => {\n for (const name of readdirSync(dir).sort()) {\n const abs = join(dir, name);\n const stat = lstatSync(abs);\n const here = rel ? `${rel}/${name}` : name;\n if (stat.isSymbolicLink()) continue;\n if (stat.isDirectory()) {\n if (!isNonAssetDir(name, rel === \"\")) walk(abs, here);\n } else if (stat.isFile() && !isNonAssetFile(name)) {\n out.set(here, computeHash(abs));\n }\n }\n };\n walk(root, \"\");\n return out;\n}\n\nfunction sameRows(a: ReadonlyMap<string, string>, b: ReadonlyMap<string, string>): boolean {\n if (a.size !== b.size) return false;\n for (const [k, v] of a) if (b.get(k) !== v) return false;\n return true;\n}\n\n/** The rows of the lock record that lie under `targetRel` (project-relative, POSIX), keyed like {@link composeRows}. */\nfunction lockedRowsUnder(\n record: ReadonlyArray<{ path: string; sha256: string }> | undefined,\n targetRel: string,\n): Map<string, string> | undefined {\n if (!record) return undefined;\n const rows = new Map<string, string>();\n for (const f of record) {\n if (f.path === targetRel) rows.set(\"\", f.sha256);\n else if (f.path.startsWith(`${targetRel}/`))\n rows.set(f.path.slice(targetRel.length + 1), f.sha256);\n }\n return rows.size > 0 ? rows : undefined;\n}\n\n/** The `../` compose folders of an agent source: the cache folder name each one is copied to, its ref and its source folder. */\nfunction outerComposeFolders(\n srcDir: string,\n refs: readonly string[],\n): Array<{ ref: string; name: string; from: string }> {\n const taken = new Map<string, string>();\n const out: Array<{ ref: string; name: string; from: string }> = [];\n for (const ref of refs) {\n if (!normalize(ref).startsWith(\"..\")) continue;\n const from = resolve(srcDir, ref);\n let name = basename(from);\n for (let n = 2; taken.has(name) && taken.get(name) !== from; n++) {\n name = `${basename(from)}-${n}`;\n }\n taken.set(name, from);\n out.push({ ref, name, from });\n }\n return out;\n}\n\n/**\n * The files (project-relative, with sha256) the `../` compose folders of the agent source at\n * `srcDir` would occupy in the project cache now: what a copy of the source would record in the\n * lock. `outdated` compares them with `LockEntry.composed` (p1511).\n */\nexport function sourceComposedFiles(\n srcDir: string,\n agentName: string,\n workspaceRoot: string,\n): Array<{ path: string; sha256: string }> {\n const refs = (readManifest(srcDir)?.composes ?? []).map((c) => c.ref);\n const out: Array<{ path: string; sha256: string }> = [];\n for (const { name, from } of outerComposeFolders(srcDir, refs)) {\n if (!existsSync(from)) continue;\n const base = join(agentSourceCacheDir(workspaceRoot), agentName, \"composes\", name);\n for (const [rel, sha256] of composeRows(from)) {\n out.push({\n path: relative(workspaceRoot, rel ? join(base, rel) : base)\n .split(sep)\n .join(\"/\"),\n sha256,\n });\n }\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/** The files (project-relative, with sha256) the project cache holds for the `../` compose folders of agent `agentName`. */\nexport function cachedComposedFiles(\n agentName: string,\n workspaceRoot: string,\n): Array<{ path: string; sha256: string }> {\n const dir = join(agentSourceCacheDir(workspaceRoot), agentName, \"composes\");\n return [...composeRows(dir)]\n .map(([rel, sha256]) => ({\n path: relative(workspaceRoot, join(dir, rel)).split(sep).join(\"/\"),\n sha256,\n }))\n .sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/**\n * The `../` compose folders of the agent `entry` that a deploy with `opts.lockedComposed` would\n * report as drift ({@link DeployOptions.onComposedDrift}): the lock records the folder, the cache\n * no longer holds those bytes, and the source does not either. Reads only; nothing is written.\n * `install --locked` asks it before it deploys anything (p1642).\n *\n * @returns The `composes:` refs of the drifted folders (`../shared-rules/extra`).\n */\nexport function composedDriftRefs(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"cwd\" | \"lockedComposed\">,\n): string[] {\n const workspaceRoot = opts.cwd ?? process.cwd();\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n const refs = (readManifest(srcDir)?.composes ?? []).map((c) => c.ref);\n const record = opts.lockedComposed?.(entry.name);\n const composesDir = join(agentSourceCacheDir(workspaceRoot), entry.name, \"composes\");\n const out: string[] = [];\n for (const { ref, name, from } of outerComposeFolders(srcDir, refs)) {\n const target = join(composesDir, name);\n const locked = lockedRowsUnder(record, relative(workspaceRoot, target).split(sep).join(\"/\"));\n const keptRows = existsSync(target) ? composeRows(target) : undefined;\n if (locked && keptRows && sameRows(keptRows, locked)) continue;\n if (!existsSync(from)) {\n if (locked) out.push(ref);\n continue;\n }\n if (locked && !sameRows(composeRows(from), locked)) out.push(ref);\n }\n return out;\n}\n\n/**\n * A `composes:` ref that climbs out of the agent folder (`../shared-rules/x`) names a folder\n * that does not exist beside the cache copy (`.skaile/cache/agents/<name>/`), so `skaile run`\n * could not serve it. Copy each such folder from the source into `composes/<name>/` and point\n * the ref there, as the omp rendering does (p1312).\n *\n * The folder is part of the lock (p1511): once the lock records its files, a deploy keeps the\n * cached copy while it still holds those bytes, writes the source's copy back only when it\n * holds them too, and otherwise reports the drift. Only `refreshComposed` (`update`, `add`)\n * copies the source's current bytes.\n */\nfunction bundleParentComposes(\n dest: string,\n srcDir: string,\n ctx: {\n entry: DeployableEntry;\n workspaceRoot: string;\n /** The previous `composes/` folder, set aside before the copy cleared the cache dir. */\n keptDir: string | undefined;\n opts: DeployOptions;\n },\n): void {\n const file = join(dest, \"agent.yaml\");\n const doc = parseDocument(readFileSync(file, \"utf8\"));\n const composes = doc.get(\"composes\");\n if (!isSeq(composes)) return;\n const record = ctx.opts.refreshComposed ? undefined : ctx.opts.lockedComposed?.(ctx.entry.name);\n const taken = new Map<string, string>();\n let changed = false;\n for (const item of composes.items) {\n if (!isMap(item)) continue;\n const ref = item.get(\"ref\");\n if (typeof ref !== \"string\" || !normalize(ref).startsWith(\"..\")) continue;\n const from = resolve(srcDir, ref);\n let name = basename(from);\n for (let n = 2; taken.has(name) && taken.get(name) !== from; n++) {\n name = `${basename(from)}-${n}`;\n }\n const target = join(dest, \"composes\", name);\n const targetRel = relative(ctx.workspaceRoot, target).split(sep).join(\"/\");\n const locked = lockedRowsUnder(record, targetRel);\n const kept = ctx.keptDir ? join(ctx.keptDir, name) : undefined;\n const keptRows = kept && existsSync(kept) ? composeRows(kept) : undefined;\n let how: \"copy\" | \"keep\" | \"drift\" | \"skip\";\n if (locked && keptRows && sameRows(keptRows, locked)) how = \"keep\";\n else if (!existsSync(from)) how = locked ? \"drift\" : \"skip\";\n else if (!locked || sameRows(composeRows(from), locked)) how = \"copy\";\n else how = \"drift\";\n taken.set(name, from);\n if (how === \"skip\") continue;\n rmSync(target, { recursive: true, force: true });\n mkdirSync(dirname(target), { recursive: true });\n if (how === \"copy\") {\n cpSync(from, target, {\n recursive: true,\n filter: (src) => {\n if (src === from) return true;\n const stat = lstatSync(src);\n if (stat.isSymbolicLink()) return false;\n return stat.isDirectory()\n ? !isNonAssetDir(basename(src), dirname(src) === from)\n : !isNonAssetFile(basename(src));\n },\n });\n } else {\n // `keep` puts the locked bytes back; `drift` leaves what the cache held (hand edits\n // included) and says that only `update` moves the lock to the source.\n if (kept && existsSync(kept)) renameSync(kept, target);\n if (how === \"drift\") ctx.opts.onComposedDrift?.(ctx.entry, ref);\n }\n item.set(\"ref\", `./composes/${name}`);\n changed = true;\n }\n if (changed) writeFileSync(file, doc.toString(), \"utf8\");\n}\n\n// ── Deploy / remove ──────────────────────────────────────────────────────────\n\n/**\n * Deploy a single asset to the framework-specific directory.\n *\n * Copies by default — self-contained, cache-safe, and portable, so a deployed\n * asset survives a `cache clean` of its source and a committed `.claude/` stays\n * machine-independent. `opts.link` opts into a symlink (the live dev-loop), but\n * only when the source has a real local path; store/factory sources (no stable\n * local path) ignore it and still copy. Agents are rendered via the enriched\n * `installAgent` path which resolves abilities, contracts, and framework\n * fragments before writing the native agent file.\n *\n * @param entry - Catalog entry describing the asset to deploy.\n * @param repositories - Repository declarations from `skaile.yaml` (used to\n * determine whether the source is a local path or a remote clone).\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns `true` when the asset was deployed successfully.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport async function deployAsset(\n entry: DeployableEntry,\n repositories: Record<string, SourceDeclaration>,\n opts: DeployOptions,\n log: Log = noop,\n): Promise<boolean> {\n return (await deployEntry(entry, repositories, opts, log)).deployed;\n}\n\n/**\n * {@link deployAsset} plus whether the deploy altered anything on disk. A copied asset always\n * counts as changed; an agent is re-rendered every time but counts as changed only when a\n * rendered file's bytes differ from the deployed one (an unchanged agent is left untouched).\n */\nasync function deployEntry(\n entry: DeployableEntry,\n repositories: Record<string, SourceDeclaration>,\n opts: DeployOptions,\n log: Log,\n /** `true` when {@link deployAll} already kept this agent's source under `.skaile/cache/agents/`. */\n sourceKept = false,\n /** `true` when another agent deployed in this call composes this one as a `delegate` sub-agent. */\n delegated = false,\n /** `true` when every agent of this call that composes this one does so as a `binding: run` role. */\n runRole = false,\n): Promise<{ deployed: boolean; changed: boolean }> {\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // Composition-only kinds (no `installTarget`) never land in a harness dir:\n // they are fetched + verified into the store cache and composed at session start.\n const provider = opts.registry.getProvider(entry.kind);\n const component = provider?.installTarget;\n if (!provider || !component) return { deployed: true, changed: false };\n\n // Agents need framework-specific rendering via the enriched installAgent path\n if (component === \"agent\") {\n const workspaceRoot = cwd ?? process.cwd();\n const agentDeployDir = deployedBase(component, harness as HarnessName, globalInstall, cwd);\n const targetMap = HARNESS_TARGETS[harness as HarnessName];\n const skillsRelDir = targetMap?.local.skill ?? \"\";\n const wsConfig = resolveSkWorkspaceConfig(workspaceRoot);\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n // One native file per instance: an agent that an instance binds is rendered under the\n // instance id, and a `binding: run` role gets no native file at all (a native sub-agent would\n // be a second way to call it). The asset-named file is written only for the rest. The agent's\n // source is still kept for the instance render and for `run`.\n if (\n !globalInstall &&\n harnessTargetSupportsAgents(harness) &&\n (opts.instanceBoundAgents?.has(entry.name) || runRole)\n ) {\n if (!sourceKept) materializeAgentSource(provider, entry, srcDir, workspaceRoot, log, opts);\n return { deployed: true, changed: !(opts.agentLocked?.(entry.name) ?? false) };\n }\n // A symlink at a path the render writes is the user's own wiring: replace the link, never\n // write through it into the file or folder it points at (p1060).\n for (const held of deployedPaths(component, entry.name, harness, globalInstall, cwd)) {\n try {\n if (lstatSync(held).isSymbolicLink()) unlinkSync(held);\n } catch {\n // nothing there\n }\n }\n // A composed item the runner's loader cannot resolve: the file would miss text a run sends.\n // Fail the deploy with one line naming the agent and the ref, as the instance render does,\n // before this agent's file is written.\n const result = await installAgent(\n srcDir,\n agentDeployDir,\n workspaceRoot,\n harness,\n skillsRelDir,\n entry.name,\n /* includeSubAgents */ true,\n new Set<string>(),\n wsConfig,\n log,\n undefined,\n delegated,\n entry.version,\n opts.lockAssets,\n ).catch((err: unknown) => {\n if (!(err instanceof CompositionError)) throw err;\n throw new Error(`agent ${entry.name}: ${err.message}`, { cause: err });\n });\n for (const w of result.warnings) log(` warn: ${w}`);\n if (result.created.length > 0) {\n let changed = result.changed.length > 0;\n // An `AGENT.md` agent used to deploy raw into `<base>/<name>/AGENT.md`, which no\n // harness but omp (whose rendering is that directory) reads: drop the stale copy.\n const staleRawCopy = join(agentDeployDir, entry.name);\n if (harness !== \"omp\" && existsSync(staleRawCopy)) {\n clearDest(staleRawCopy);\n changed = true;\n }\n if (!globalInstall && !sourceKept) {\n materializeAgentSource(provider, entry, srcDir, workspaceRoot, log, opts);\n }\n return { deployed: true, changed };\n }\n // Fall through to raw deploy if renderer produces no files (unsupported framework, etc.)\n }\n\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n mkdirSync(dirname(dest), { recursive: true });\n\n // Symlink only on explicit opt-in AND when the source has a real local path.\n // Factory sources have a `path` (the bundled dir under node_modules, replaced\n // on every upgrade) but no stable dev-loop, so they always copy. Default copy\n // keeps deploys cache-safe and portable.\n const repoDecl = entry.publisher ? repositories[entry.publisher] : undefined;\n const hasLocalPath = repoDecl?.path != null && repoDecl.factory !== true;\n\n if (opts.link === true && hasLocalPath) {\n symlinkAsset(provider, entry.source, dest, entry.name);\n log(` symlink ${entry.kind}:${entry.name}`);\n } else {\n copyAsset(provider, entry, dest, opts.onSecretFile);\n log(` copy ${entry.kind}:${entry.name}`);\n }\n return { deployed: true, changed: true };\n}\n\n/**\n * Deploy all resolved assets, applying patches where configured.\n *\n * Already-deployed assets are skipped unless their deployed manifest content differs\n * from the source. This handles copies that have gone stale after a source update.\n * In copy mode (the default, `!opts.link`) an existing **symlink** dest is healed:\n * it is removed and re-deployed as a real copy, so an old/legacy symlink deploy is\n * silently upgraded. With `opts.link` an existing symlink is left alone.\n *\n * @param resolved - Catalog entries to deploy (output of `resolveAll`).\n * @param repositories - Repository declarations from `skaile.yaml`.\n * @param patches - Map of `kind:name` → patch file path for patch application.\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns Canonical refs (`kind:@publisher/name[#version]`; bare `kind:name`\n * when the entry carries no publisher) of the assets newly deployed in this call.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport async function deployAll(\n resolved: DeployableEntry[],\n repositories: Record<string, SourceDeclaration>,\n patches: Record<string, string>,\n opts: DeployOptions,\n log: Log = noop,\n): Promise<string[]> {\n // Before any copy: a symlink in a later entry must not leave the earlier ones behind (p743).\n assertNoLibrarySymlinks(\n entriesNeedingDeploy(resolved, opts),\n opts.registry,\n repositories,\n opts.link === true,\n );\n const deployed: string[] = [];\n const deployedAt: Array<[number, string]> = [];\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // An agent is rendered from its composed skills (`## Installed Abilities`), contracts and\n // delegate sub-agents, which `deployAll` deploys in this same call: render the agents last, with\n // every agent's source already kept, so one pass writes the file a later `install` would write.\n const isAgent = (entry: DeployableEntry): boolean =>\n installTargetOf(opts.registry, entry.kind) === \"agent\";\n const keptSources = new Set<DeployableEntry>();\n if (!globalInstall) {\n for (const entry of resolved.filter(isAgent)) {\n const provider = opts.registry.getProvider(entry.kind);\n if (!provider) continue;\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n materializeAgentSource(provider, entry, srcDir, cwd ?? process.cwd(), noop, opts);\n keptSources.add(entry);\n }\n }\n\n // `resolved` lists an asset before what it requires, so the agents go in reverse: a delegate\n // sub-agent is rendered by its own entry before its composer renders it again. Both renders\n // must write the same bytes, so an agent that another agent of this call delegates to is\n // rendered as a sub-agent by its own entry too (else the two writes alternate, and the file\n // is reported as changed on every run).\n const agentsLast = resolved.filter(isAgent).reverse();\n const delegatedNames = new Set<string>();\n // Agents another agent of this call composes only as `binding: run` roles: they run through\n // `agent.run`, so no native sub-agent file is written for them.\n const runNames = new Set<string>();\n for (const entry of agentsLast) {\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n for (const name of delegateNamesOf(srcDir)) delegatedNames.add(name);\n for (const name of composedAgentNamesOf(srcDir).run) runNames.add(name);\n }\n for (const entry of [...resolved.filter((e) => !isAgent(e)), ...agentsLast]) {\n // Skip composition-only kinds (no `installTarget`) — they live in the store\n // cache and are composed at session start, never copied into a harness dir.\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component) continue;\n\n const ref = `${entry.kind}:${entry.name}`;\n\n // Agents are compiled artifacts: always re-rendered, never skipped on a manifest hash\n // (and a stale raw `<name>/AGENT.md` copy of the old layout must be replaced, not kept).\n if (component !== \"agent\" && isDeployed(component, entry.name, harness, globalInstall, cwd)) {\n // Heal: in copy mode an existing symlink dest is left to fall through to a\n // real copy below (cache-safe + portable) - bypass the hash skip entirely.\n // With --link a symlink dest is intentional, so it takes the normal skip path.\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n let destIsSymlink = false;\n try {\n destIsSymlink = lstatSync(dest).isSymbolicLink();\n } catch {}\n const healSymlink = destIsSymlink && opts.link !== true;\n // Surface the one-time symlink->copy migration so an author who relied on a\n // live symlink dev-loop knows why edits stopped reflecting.\n if (healSymlink) log(` healed symlink → copy: ${ref} (use --link for the dev-loop)`);\n if (!healSymlink) {\n const state = deployedCopyState(entry, { ...opts, harness, global: globalInstall, cwd });\n if (state === \"current\") {\n log(` already deployed: ${ref}`);\n continue;\n }\n if (state === \"stale\") log(` updating: ${ref} (content changed)`);\n }\n }\n\n // An agent is re-rendered every time; it is reported as deployed only when a rendered file\n // changed, so a repeat install leaves it (and the report) alone.\n const { changed } = await deployEntry(\n entry,\n repositories,\n opts,\n log,\n keptSources.has(entry),\n isAgent(entry) && delegatedNames.has(entry.name),\n isAgent(entry) && runNames.has(entry.name) && !delegatedNames.has(entry.name),\n );\n if (changed) deployedAt.push([resolved.indexOf(entry), canonicalEntryRef(entry)]);\n\n // Apply patch if configured\n const patchFile = patches[ref];\n if (patchFile && existsSync(patchFile)) {\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n if (applyPatch(dest, patchFile)) {\n log(` patched ${ref}`);\n } else {\n log(` patch failed for ${ref}`);\n }\n }\n }\n\n // Report in the order the assets were resolved, not the order they were rendered.\n deployed.push(...deployedAt.sort((a, b) => a[0] - b[0]).map(([, ref]) => ref));\n return deployed;\n}\n\n/**\n * Run `deploy` for each target harness in turn (the deploys write one tree, so they do not run\n * together) and return the refs deployed, each once.\n */\nexport async function deployEach<T>(\n targets: readonly T[],\n deploy: (target: T) => Promise<string[]>,\n): Promise<string[]> {\n const deployed = new Set<string>();\n for (const target of targets) for (const ref of await deploy(target)) deployed.add(ref);\n return [...deployed];\n}\n\n/** The agent prompt {@link assembleAgentPrompt} built. */\nexport interface AssembledAgentPrompt extends AssembledAgent {\n /** The instance id the prompt is for (the name of the native file). */\n agentName: string;\n /** The `delegate` sub-agents the install renders as native files next to this agent's. */\n delegates: DelegateSubAgent[];\n}\n\n/**\n * The prompt of one agent, built by the same `assembleAgent` and from the same input set the\n * install renderers bake into the native agent file. `skaile run --dry-run --print-prompt` prints\n * its `sentPrompt`. Writes nothing.\n *\n * The composed blocks and memory blocks of the input may come from the runner\n * (`opts.resolved`): the run resolves them with its own loader, so the printed prompt is what a\n * run sends even where the install path could not read an item.\n *\n * @param opts.srcDir - The agent's source directory.\n * @param opts.projectDir - The project root.\n * @param opts.harness - Harness id of the run; picks the carriers and the skills dir the abilities are read from (a harness without a native agent format reads the claude-code layout).\n * @param opts.instanceId - Instance id the file is named after (default: the agent's own name).\n * @param opts.instance - The `skaile.yaml` instance being rendered.\n * @param opts.resolved - Composed and memory blocks as the runner resolved them; replaces what the install loader read.\n * @param opts.delegated - The agent is a `delegate` sub-agent rendered for the agent that calls it.\n * @param opts.nativeFile - Text of the native agent file the harness reads (or a function of the agent's file name that reads it); `stale` names the blocks it holds with other text than the inputs give now.\n * @param opts.lockAssets - The lock entries the command is about to write; composed pins resolve against them, not against the lock on disk.\n * @returns `null` when `srcDir` is no agent package.\n */\nexport async function assembleAgentPrompt(opts: {\n srcDir: string;\n projectDir: string;\n harness: string;\n instanceId?: string;\n instance?: AgentInstanceConfig;\n wsConfig?: SkWorkspaceConfig;\n resolved?: Pick<AgentPromptSectionsInput, \"composed\" | \"memory\">;\n delegated?: boolean;\n nativeFile?: string | ((agentName: string) => string | undefined);\n lockAssets?: Record<string, LockEntry>;\n}): Promise<AssembledAgentPrompt | null> {\n const target = harnessNameForHarnessId(opts.harness) ?? \"claude-code\";\n const prepared = await prepareAgentRender(\n opts.srcDir,\n deployedBase(\"agent\", target, false, opts.projectDir),\n opts.projectDir,\n target,\n HARNESS_TARGETS[target]?.local.skill ?? \"\",\n opts.instanceId,\n opts.wsConfig ?? resolveSkWorkspaceConfig(opts.projectDir),\n [],\n opts.instance,\n opts.delegated ?? false,\n undefined,\n opts.resolved,\n opts.lockAssets,\n );\n if (!prepared) return null;\n const input = agentPromptInput(prepared.input);\n const nativeFile =\n typeof opts.nativeFile === \"function\"\n ? opts.nativeFile(prepared.input.agentName)\n : opts.nativeFile;\n const assembled = assembleAgent(opts.resolved ? { ...input, ...opts.resolved } : input, {\n harness: opts.harness,\n ...(nativeFile !== undefined ? { nativeFile } : {}),\n });\n return { ...assembled, agentName: prepared.input.agentName, delegates: prepared.delegates };\n}\n\n/**\n * Unified diff from a deployed agent to its source, `-` lines in the deployed copy only and `+`\n * lines in the source only. An agent is a rendering, not a copy, so the source is rendered the way\n * {@link deployAsset} renders it (same renderer, same workspace context) into a scratch directory\n * and that is compared with what the harness holds: `<name>.md` for claude-code, `<name>.toml`\n * plus the `skaile-agents/<name>.md` identity for codex, the `<name>/` directory for omp.\n *\n * @param entry - The agent's catalog entry (`source` is its `agent.yaml` / `AGENT.md`).\n * @param opts - Deployment target options (must match the options used at install time).\n * @param instance - Compare the rendering of one agent instance of `skaile.yaml` (named by its id,\n * with its settings) instead of the one named after the asset (p925).\n * @returns `null` when none of the agent's rendered files is deployed, else the diff text\n * (`\"\"` when the deployed agent matches its source).\n * @throws When `diff(1)` itself fails (exit status other than 0/1).\n */\nexport async function diffDeployedAgent(\n entry: DeployableEntry,\n opts: DeployOptions,\n instance?: { id: string; srcDir: string; config: AgentInstanceConfig },\n): Promise<string | null> {\n const harness = opts.harness ?? \"claude-code\";\n const workspaceRoot = opts.cwd ?? process.cwd();\n const deployedAgents = deployedBase(\"agent\", harness, opts.global ?? false, opts.cwd);\n const scratch = mkdtempSync(join(tmpdir(), \"skaile-diff-agent-\"));\n try {\n const renderedAgents = join(scratch, \"agents\");\n const srcDir =\n instance?.srcDir ??\n (statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source));\n // An instance renders the way `install` renders it: named by its id, with its own settings.\n const rendered = await installAgent(\n srcDir,\n renderedAgents,\n workspaceRoot,\n harness,\n HARNESS_TARGETS[harness]?.local.skill ?? \"\",\n instance?.id ?? entry.name,\n /* includeSubAgents */ instance !== undefined,\n new Set<string>(),\n resolveSkWorkspaceConfig(workspaceRoot),\n undefined,\n instance?.config,\n false,\n entry.version,\n );\n if (rendered.created.length === 0) return null;\n\n // Each rendered top-level item pairs with the deployed item of the same name.\n const pairs: Array<[from: string, to: string]> = [];\n for (const [renderedRoot, deployedRoot] of [\n [renderedAgents, deployedAgents],\n [join(scratch, CODEX_IDENTITY_DIR), join(dirname(deployedAgents), CODEX_IDENTITY_DIR)],\n ] as const) {\n if (!existsSync(renderedRoot)) continue;\n for (const item of readdirSync(renderedRoot)) {\n pairs.push([join(deployedRoot, item), join(renderedRoot, item)]);\n }\n }\n if (!pairs.some(([from]) => existsSync(from))) return null;\n\n const diffs: string[] = [];\n for (const [from, to] of pairs) {\n const r = spawnSync(\"diff\", [\"-ruN\", from, to], { encoding: \"utf8\" });\n if (r.status === 1) diffs.push(r.stdout);\n else if (r.status !== 0) {\n throw new Error(\n `diff failed for agent:${entry.name}: ${r.stderr || r.error?.message || \"unknown error\"}`,\n );\n }\n }\n return diffs.join(\"\").split(`${scratch}${sep}`).join(`rendered${sep}`);\n } finally {\n rmSync(scratch, { recursive: true, force: true });\n }\n}\n\n/** The file that remembers the old `~/.omp/<dir>/<name>` folders a sweep decided are not skaile's. */\nfunction keptLegacyFile(): string {\n return join(globalSkaileDir(), \"kept-omp-copies.json\");\n}\n\n/** The old omp folders skaile never deletes (kept by an earlier run: it did not write them). */\nexport function readKeptLegacyCopies(): Set<string> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(keptLegacyFile(), \"utf-8\"));\n return new Set(Array.isArray(parsed) ? parsed.filter((v) => typeof v === \"string\") : []);\n } catch {\n return new Set();\n }\n}\n\nexport function writeKeptLegacyCopies(paths: Set<string>): void {\n mkdirSync(dirname(keptLegacyFile()), { recursive: true });\n writeFileSync(keptLegacyFile(), `${JSON.stringify([...paths].sort(), null, 2)}\\n`);\n}\n\n/**\n * Remove a deployed asset from the framework directory.\n *\n * Removes symlinks with `unlink`; removes copied directories with `rm -rf`.\n *\n * @param kind - Asset kind (`skill`, `agent`, `prompt`, `flow`, `contract`).\n * @param name - Asset name as registered in the catalog.\n * @param opts - Deployment target options (must match the options used at install time).\n * @returns `true` if the asset existed and was removed; `false` if it was not deployed.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function removeAsset(kind: string, name: string, opts: DeployOptions): boolean {\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // Composition-only kinds have no harness dir — never resolve (and delete) one.\n const component = installTargetOf(opts.registry, kind);\n if (!component) return false;\n let removed = false;\n // Before 5.13.0 an omp global install wrote to `~/.omp/<skills|agents|…>/`, a place omp does\n // not read (it reads `~/.omp/agent/…`). Removing the asset removes that dead copy too.\n // A flow lives under `~/.skaile` in both layouts: nothing to add.\n // A folder an earlier sweep kept (skaile did not write it) is never deleted.\n const kept = globalInstall ? readKeptLegacyCopies() : new Set<string>();\n const legacyOmp =\n globalInstall && harness === \"omp\" && component !== \"flow\"\n ? deployedPaths(component, name, \"omp\", false, homedir()).filter((p) => !kept.has(p))\n : [];\n for (const dest of [\n ...deployedPaths(component, name, harness, globalInstall, cwd),\n ...legacyOmp,\n ]) {\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n removed = true;\n } catch {\n // not deployed at this path\n }\n }\n if (component === \"agent\") {\n // The Codex identity file and the kept source live beside the deployed agent.\n const agentDir = deployedBase(component, harness, globalInstall, cwd);\n const extras = [join(dirname(agentDir), CODEX_IDENTITY_DIR, `${name}.md`)];\n if (!globalInstall) extras.push(join(agentSourceCacheDir(cwd ?? process.cwd()), name));\n for (const extra of extras) {\n if (existsSync(extra)) {\n rmSync(extra, { recursive: true, force: true });\n removed = true;\n }\n }\n }\n return removed;\n}\n\n// ── Scaffold ─────────────────────────────────────────────────────────────────\n\n/** Markdown-marker scaffold (SKILL.md / CONTRACT.md / `*.prompt.md`); `body` is the kind's placeholder. */\nfunction markdownTemplate(name: string, description: string, body: string): string {\n // JSON.stringify yields a valid YAML double-quoted scalar, so any\n // user-supplied description (colons, quotes, `#`) survives the round-trip.\n return `---\nname: \"${name}\"\ndescription: ${JSON.stringify(description)}\nmetadata:\n version: \"0.1.0\"\n---\n\n# ${name}\n\n${body}\n`;\n}\n\n/** `agent.yaml` (spec 0.2) scaffold; the system prompt lives in the `SOUL.md` next to it. */\nfunction agentTemplate(name: string, description: string): string {\n return `spec_version: \"0.2\"\nname: \"${name}\"\nversion: 0.1.0\ndescription: ${JSON.stringify(description)}\nlifecycle: standing\n`;\n}\n\nfunction soulTemplate(name: string): string {\n return `# ${name}\n\n${AGENT_BODY_PLACEHOLDER}\n`;\n}\n\nfunction presetTemplate(name: string, description: string): string {\n return `name: ${name}\ndescription: ${JSON.stringify(description)}\nversion: 0.1.0\nitems:\n - ref: ${PRESET_ITEM_PLACEHOLDER_REF}\n`;\n}\n\n/**\n * `<name>.flow.yaml` scaffold: a strict v2 flow (`schemaVersion: 2`) with one example `agent` node\n * and no edges. The instruction is a placeholder the checks of `validate` / `index` / the plan\n * refuse until the author replaces it, like every other scaffold.\n */\nfunction flowTemplate(name: string, description: string): string {\n return `schemaVersion: 2\nid: \"${name}\"\nversion: \"0.1.0\"\nname: \"${name}\"\ndescription: ${JSON.stringify(description)}\n\n# One node per step; join steps with edges (\\`type: flow\\`). Rename or replace the example node.\nnodes:\n - id: example\n label: Example step\n description: Replace this node with the first step of the flow.\n run:\n kind: agent\n instruction: ${JSON.stringify(FLOW_NODE_INSTRUCTION_PLACEHOLDER)}\n\nedges: []\n`;\n}\n\n/** Asset kinds {@link createScaffold} has a real template for. */\nexport const SCAFFOLD_KINDS = [\"skill\", \"agent\", \"prompt\", \"flow\", \"preset\", \"contract\"] as const;\n\n/** Options for {@link createScaffold}. */\nexport interface ScaffoldOptions {\n /**\n * Description written into the manifest. Omitted: every kind gets a\n * `TODO:` placeholder that `skaile validate` rejects until it is replaced.\n */\n description?: string;\n}\n\n/**\n * Create a minimal scaffold directory for a new asset.\n *\n * Writes the appropriate manifest file (`SKILL.md`, `agent.yaml` + `SOUL.md`, `CONTRACT.md`,\n * `<name>.preset.yaml`, `<name>.flow.yaml`, or `<name>.prompt.md`) inside a\n * new `<destDir>/<name>/` directory.\n *\n * @param name - Asset name (also used as the directory name).\n * @param kind - Asset kind: `skill` | `agent` | `preset` | `flow` | `prompt` | `contract`.\n * @param destDir - Parent directory to create the asset in.\n * @param opts - Optional scaffold content ({@link ScaffoldOptions}).\n * @returns `{ ok: true, path }` on success, `{ ok: false, path: errorMessage }` if the\n * directory already exists or `kind` is not one of {@link SCAFFOLD_KINDS}\n * (`Cannot scaffold kind \"<kind>\". Expected: ...`); nothing is created then.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function createScaffold(\n name: string,\n kind: string,\n destDir: string,\n opts: ScaffoldOptions = {},\n): { ok: boolean; path: string } {\n if (!(SCAFFOLD_KINDS as readonly string[]).includes(kind)) {\n return {\n ok: false,\n path: `Cannot scaffold kind \"${kind}\". Expected: ${SCAFFOLD_KINDS.join(\", \")}.`,\n };\n }\n const dest = join(destDir, name);\n if (existsSync(dest)) {\n return { ok: false, path: `Directory '${name}' already exists in ${destDir}` };\n }\n mkdirSync(dest, { recursive: true });\n\n const mdDescription =\n opts.description ??\n ([\"agent\", \"contract\", \"prompt\", \"flow\", \"preset\"].includes(kind)\n ? `${SKILL_DESCRIPTION_PLACEHOLDER_PREFIX} describe this ${kind}.`\n : SKILL_DESCRIPTION_PLACEHOLDER);\n\n if (kind === \"preset\") {\n writeFileSync(join(dest, `${name}.preset.yaml`), presetTemplate(name, mdDescription), \"utf8\");\n } else if (kind === \"flow\") {\n writeFileSync(join(dest, `${name}.flow.yaml`), flowTemplate(name, mdDescription), \"utf8\");\n } else if (kind === \"prompt\") {\n writeFileSync(\n join(dest, `${name}.prompt.md`),\n markdownTemplate(name, mdDescription, PROMPT_BODY_PLACEHOLDER),\n \"utf8\",\n );\n } else if (kind === \"agent\") {\n writeFileSync(join(dest, \"agent.yaml\"), agentTemplate(name, mdDescription), \"utf8\");\n writeFileSync(join(dest, \"SOUL.md\"), soulTemplate(name), \"utf8\");\n } else if (kind === \"contract\") {\n writeFileSync(\n join(dest, \"CONTRACT.md\"),\n markdownTemplate(name, mdDescription, CONTRACT_BODY_PLACEHOLDER),\n \"utf8\",\n );\n } else {\n writeFileSync(\n join(dest, \"SKILL.md\"),\n markdownTemplate(name, mdDescription, SKILL_BODY_PLACEHOLDER),\n \"utf8\",\n );\n }\n\n return { ok: true, path: dest };\n}\n"]}