@skaile/workspaces 6.15.0 → 6.16.1
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.
- package/CHANGELOG.md +79 -0
- package/dist/agent-file-refresh-VRD2SNJW.js +89 -0
- package/dist/agent-file-refresh-VRD2SNJW.js.map +1 -0
- package/dist/ai-sdk.js +8 -7
- package/dist/ai-sdk.js.map +1 -1
- package/dist/{asset-feeds-PM7FKHJP.js → asset-feeds-ON7FYHHF.js} +25 -23
- package/dist/asset-feeds-ON7FYHHF.js.map +1 -0
- package/dist/asset-manager/catalog-deployer.js +8 -7
- package/dist/asset-manager/history.js +7 -6
- package/dist/asset-manager/index.js +17 -15
- package/dist/asset-manager/installer.js +16 -9
- package/dist/asset-manager/renderers.js +8 -8
- package/dist/asset-manager/src/add-remove/add.d.ts +134 -0
- package/dist/asset-manager/src/add-remove/add.d.ts.map +1 -0
- package/dist/asset-manager/src/add-remove/remove.d.ts +329 -0
- package/dist/asset-manager/src/add-remove/remove.d.ts.map +1 -0
- package/dist/asset-manager/src/agent-render.d.ts +116 -0
- package/dist/asset-manager/src/agent-render.d.ts.map +1 -0
- package/dist/asset-manager/src/composed-blocks.d.ts +40 -0
- package/dist/asset-manager/src/composed-blocks.d.ts.map +1 -0
- package/dist/asset-manager/src/config/core.d.ts +297 -0
- package/dist/asset-manager/src/config/core.d.ts.map +1 -0
- package/dist/asset-manager/src/config/edit.d.ts +161 -0
- package/dist/asset-manager/src/config/edit.d.ts.map +1 -0
- package/dist/asset-manager/src/index.d.ts +31 -2961
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/install/clone-commit-fetcher.d.ts +11 -0
- package/dist/asset-manager/src/install/clone-commit-fetcher.d.ts.map +1 -0
- package/dist/asset-manager/src/install/install.d.ts +151 -0
- package/dist/asset-manager/src/install/install.d.ts.map +1 -0
- package/dist/asset-manager/src/install/restore.d.ts +76 -0
- package/dist/asset-manager/src/install/restore.d.ts.map +1 -0
- package/dist/asset-manager/src/install-agent.d.ts +52 -4
- package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
- package/dist/asset-manager/src/install-instances.d.ts +70 -2
- package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts +54 -4
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/asset-manager/src/lock/copies.d.ts +156 -0
- package/dist/asset-manager/src/lock/copies.d.ts.map +1 -0
- package/dist/asset-manager/src/lock/library.d.ts +261 -0
- package/dist/asset-manager/src/lock/library.d.ts.map +1 -0
- package/dist/asset-manager/src/mcp-render.d.ts +86 -0
- package/dist/asset-manager/src/mcp-render.d.ts.map +1 -0
- package/dist/asset-manager/src/omp-sweep.d.ts +25 -0
- package/dist/asset-manager/src/omp-sweep.d.ts.map +1 -0
- package/dist/asset-manager/src/read/diff.d.ts +109 -0
- package/dist/asset-manager/src/read/diff.d.ts.map +1 -0
- package/dist/asset-manager/src/read/doctor.d.ts +116 -0
- package/dist/asset-manager/src/read/doctor.d.ts.map +1 -0
- package/dist/asset-manager/src/read/gaps.d.ts +120 -0
- package/dist/asset-manager/src/read/gaps.d.ts.map +1 -0
- package/dist/asset-manager/src/read/graph.d.ts +69 -0
- package/dist/asset-manager/src/read/graph.d.ts.map +1 -0
- package/dist/asset-manager/src/read/outdated.d.ts +152 -0
- package/dist/asset-manager/src/read/outdated.d.ts.map +1 -0
- package/dist/asset-manager/src/read/state.d.ts +265 -0
- package/dist/asset-manager/src/read/state.d.ts.map +1 -0
- package/dist/asset-manager/src/renderers.d.ts +11 -1
- package/dist/asset-manager/src/renderers.d.ts.map +1 -1
- package/dist/asset-manager/src/resolve/guards.d.ts +167 -0
- package/dist/asset-manager/src/resolve/guards.d.ts.map +1 -0
- package/dist/asset-manager/src/resolve/scan.d.ts +222 -0
- package/dist/asset-manager/src/resolve/scan.d.ts.map +1 -0
- package/dist/asset-manager/src/resolve/stores.d.ts +176 -0
- package/dist/asset-manager/src/resolve/stores.d.ts.map +1 -0
- package/dist/asset-manager/src/shared/files.d.ts +42 -0
- package/dist/asset-manager/src/shared/files.d.ts.map +1 -0
- package/dist/asset-manager/src/shared/library-hooks.d.ts +16 -0
- package/dist/asset-manager/src/shared/library-hooks.d.ts.map +1 -0
- package/dist/asset-manager/src/shared/library.d.ts +96 -0
- package/dist/asset-manager/src/shared/library.d.ts.map +1 -0
- package/dist/asset-manager/src/shared/refs.d.ts +101 -0
- package/dist/asset-manager/src/shared/refs.d.ts.map +1 -0
- package/dist/asset-manager/src/shared/types.d.ts +399 -0
- package/dist/asset-manager/src/shared/types.d.ts.map +1 -0
- package/dist/bridge/harnesses/claude-sdk.js +11 -17
- package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
- package/dist/bridge/harnesses/codex.js +10 -10
- package/dist/bridge/harnesses/continue.js +12 -16
- package/dist/bridge/harnesses/continue.js.map +1 -1
- package/dist/bridge/harnesses/echo.js +3 -8
- package/dist/bridge/harnesses/echo.js.map +1 -1
- package/dist/bridge/harnesses/gemini.js +5 -5
- package/dist/bridge/harnesses/goose.js +13 -17
- package/dist/bridge/harnesses/goose.js.map +1 -1
- package/dist/bridge/harnesses/omp.js +5 -11
- package/dist/bridge/harnesses/omp.js.map +1 -1
- package/dist/bridge/harnesses/opencode.js +13 -17
- package/dist/bridge/harnesses/opencode.js.map +1 -1
- package/dist/bridge/harnesses/qwen.js +6 -11
- package/dist/bridge/harnesses/qwen.js.map +1 -1
- package/dist/bridge/index.js +16 -16
- package/dist/bridge/src/codex/managed-harness.d.ts.map +1 -1
- package/dist/bridge/src/driver-contract.d.ts +72 -0
- package/dist/bridge/src/driver-contract.d.ts.map +1 -0
- package/dist/bridge/src/harness-model-check.d.ts +1 -1
- package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/_subprocess-cli.d.ts +8 -0
- package/dist/bridge/src/harnesses/_subprocess-cli.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/codex.d.ts +2 -0
- package/dist/bridge/src/harnesses/codex.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/continue.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/echo.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/goose.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -1
- package/dist/bridge/src/index.d.ts +2 -0
- package/dist/bridge/src/index.d.ts.map +1 -1
- package/dist/bridge/src/preflight.d.ts +114 -0
- package/dist/bridge/src/preflight.d.ts.map +1 -0
- package/dist/bridge/src/registry.d.ts +12 -0
- package/dist/bridge/src/registry.d.ts.map +1 -1
- package/dist/{chunk-MUQBP2BK.js → chunk-2JUCWMIS.js} +8808 -8337
- package/dist/chunk-2JUCWMIS.js.map +1 -0
- package/dist/{chunk-VS6XC5JE.js → chunk-2MTRRK37.js} +3 -3
- package/dist/{chunk-VS6XC5JE.js.map → chunk-2MTRRK37.js.map} +1 -1
- package/dist/chunk-2PJYJPDE.js +3 -0
- package/dist/chunk-2PJYJPDE.js.map +1 -0
- package/dist/{chunk-J7FEWDRQ.js → chunk-2SSG5B24.js} +4 -4
- package/dist/{chunk-J7FEWDRQ.js.map → chunk-2SSG5B24.js.map} +1 -1
- package/dist/{chunk-WDG5IVEA.js → chunk-2ZDZJ7XQ.js} +3 -3
- package/dist/{chunk-WDG5IVEA.js.map → chunk-2ZDZJ7XQ.js.map} +1 -1
- package/dist/{chunk-V2VDTQ7A.js → chunk-3A7JUOY2.js} +3 -3
- package/dist/{chunk-V2VDTQ7A.js.map → chunk-3A7JUOY2.js.map} +1 -1
- package/dist/{chunk-R7422XD4.js → chunk-3CRZJR7E.js} +20 -14
- package/dist/chunk-3CRZJR7E.js.map +1 -0
- package/dist/chunk-3LAJJURV.js +26 -0
- package/dist/chunk-3LAJJURV.js.map +1 -0
- package/dist/{chunk-FJJEC6O2.js → chunk-3UYKT62L.js} +5 -5
- package/dist/{chunk-FJJEC6O2.js.map → chunk-3UYKT62L.js.map} +1 -1
- package/dist/{chunk-HCIXCCUH.js → chunk-4X5WXQV7.js} +4 -4
- package/dist/{chunk-HCIXCCUH.js.map → chunk-4X5WXQV7.js.map} +1 -1
- package/dist/chunk-4ZNKEDYH.js +887 -0
- package/dist/chunk-4ZNKEDYH.js.map +1 -0
- package/dist/{chunk-OIWFXUZB.js → chunk-6M44OQKH.js} +40 -44
- package/dist/chunk-6M44OQKH.js.map +1 -0
- package/dist/{chunk-SXRN27TU.js → chunk-72DYHOO2.js} +24 -25
- package/dist/chunk-72DYHOO2.js.map +1 -0
- package/dist/{chunk-BNLXZXZN.js → chunk-BRAOB37W.js} +97 -47
- package/dist/chunk-BRAOB37W.js.map +1 -0
- package/dist/{chunk-ZLDAPZIX.js → chunk-BTMSHGN3.js} +4 -4
- package/dist/{chunk-ZLDAPZIX.js.map → chunk-BTMSHGN3.js.map} +1 -1
- package/dist/{chunk-7K73MCI6.js → chunk-CU5WY6HN.js} +3 -3
- package/dist/{chunk-7K73MCI6.js.map → chunk-CU5WY6HN.js.map} +1 -1
- package/dist/{chunk-CG63XGVV.js → chunk-EGKCKWWE.js} +3 -3
- package/dist/{chunk-CG63XGVV.js.map → chunk-EGKCKWWE.js.map} +1 -1
- package/dist/{chunk-CJO3XKO7.js → chunk-ETGC2MEM.js} +4 -4
- package/dist/{chunk-CJO3XKO7.js.map → chunk-ETGC2MEM.js.map} +1 -1
- package/dist/{chunk-PFBPESW7.js → chunk-FPG36VC4.js} +8 -13
- package/dist/chunk-FPG36VC4.js.map +1 -0
- package/dist/{chunk-SBAUZ7XH.js → chunk-H3PY5DFL.js} +4 -4
- package/dist/{chunk-SBAUZ7XH.js.map → chunk-H3PY5DFL.js.map} +1 -1
- package/dist/{chunk-7HRZACI4.js → chunk-HW4BDJPC.js} +17 -6
- package/dist/chunk-HW4BDJPC.js.map +1 -0
- package/dist/{chunk-7VBD5XUM.js → chunk-IG4YQ7ER.js} +32 -90
- package/dist/chunk-IG4YQ7ER.js.map +1 -0
- package/dist/{chunk-YDMZWVZN.js → chunk-K4763755.js} +8 -8
- package/dist/{chunk-YDMZWVZN.js.map → chunk-K4763755.js.map} +1 -1
- package/dist/{chunk-6WIZC6GM.js → chunk-KDRA6FYE.js} +120 -211
- package/dist/chunk-KDRA6FYE.js.map +1 -0
- package/dist/{chunk-KOI7QFDH.js → chunk-M7XIYHWB.js} +3 -3
- package/dist/{chunk-KOI7QFDH.js.map → chunk-M7XIYHWB.js.map} +1 -1
- package/dist/{chunk-7LJUK5JK.js → chunk-MG6QD7GE.js} +201 -43
- package/dist/chunk-MG6QD7GE.js.map +1 -0
- package/dist/{chunk-CWUHUL6W.js → chunk-NAQXDTF3.js} +3 -3
- package/dist/{chunk-CWUHUL6W.js.map → chunk-NAQXDTF3.js.map} +1 -1
- package/dist/{chunk-JIZ35OOU.js → chunk-NJ6UCY2B.js} +3 -3
- package/dist/{chunk-JIZ35OOU.js.map → chunk-NJ6UCY2B.js.map} +1 -1
- package/dist/{chunk-A3G3FHGB.js → chunk-NNJQQYHY.js} +2 -2
- package/dist/{chunk-A3G3FHGB.js.map → chunk-NNJQQYHY.js.map} +1 -1
- package/dist/{chunk-TYRAEMWE.js → chunk-OD4N5O7V.js} +4 -4
- package/dist/{chunk-TYRAEMWE.js.map → chunk-OD4N5O7V.js.map} +1 -1
- package/dist/{chunk-LBJCOEXH.js → chunk-P6FJDT35.js} +27 -7
- package/dist/chunk-P6FJDT35.js.map +1 -0
- package/dist/{chunk-IOXFT5D7.js → chunk-PD42JZWI.js} +3 -3
- package/dist/{chunk-IOXFT5D7.js.map → chunk-PD42JZWI.js.map} +1 -1
- package/dist/{chunk-MS2IXLTC.js → chunk-PMXTBWFD.js} +27 -7
- package/dist/chunk-PMXTBWFD.js.map +1 -0
- package/dist/{chunk-O74SRQ3W.js → chunk-PPSSDUN6.js} +3 -3
- package/dist/{chunk-O74SRQ3W.js.map → chunk-PPSSDUN6.js.map} +1 -1
- package/dist/{chunk-IYXOSBQ4.js → chunk-PRB67LCK.js} +126 -17
- package/dist/chunk-PRB67LCK.js.map +1 -0
- package/dist/{chunk-6VQW2X2F.js → chunk-QUIK7L3Z.js} +9 -9
- package/dist/{chunk-6VQW2X2F.js.map → chunk-QUIK7L3Z.js.map} +1 -1
- package/dist/{chunk-DRUAQ7IY.js → chunk-QUPZKTF3.js} +9 -8
- package/dist/chunk-QUPZKTF3.js.map +1 -0
- package/dist/{chunk-7FXOOUOC.js → chunk-RPRMD7XV.js} +27 -11
- package/dist/chunk-RPRMD7XV.js.map +1 -0
- package/dist/{chunk-U7EJB6LY.js → chunk-S3UOZBGE.js} +20 -3
- package/dist/chunk-S3UOZBGE.js.map +1 -0
- package/dist/{chunk-LQWOU7S2.js → chunk-SFBLZOV5.js} +3 -3
- package/dist/{chunk-LQWOU7S2.js.map → chunk-SFBLZOV5.js.map} +1 -1
- package/dist/{chunk-XPSZIBPU.js → chunk-SMCG4PMP.js} +43 -48
- package/dist/chunk-SMCG4PMP.js.map +1 -0
- package/dist/{chunk-EB2LKPI6.js → chunk-SMFZ5YGN.js} +4 -4
- package/dist/{chunk-EB2LKPI6.js.map → chunk-SMFZ5YGN.js.map} +1 -1
- package/dist/{chunk-IRIWNKQS.js → chunk-SX54OQQT.js} +4 -4
- package/dist/{chunk-IRIWNKQS.js.map → chunk-SX54OQQT.js.map} +1 -1
- package/dist/{chunk-2PVYDAFN.js → chunk-T65N4CIZ.js} +3 -3
- package/dist/{chunk-2PVYDAFN.js.map → chunk-T65N4CIZ.js.map} +1 -1
- package/dist/{chunk-C5ZCREBI.js → chunk-TVRL3IPZ.js} +3 -3
- package/dist/{chunk-C5ZCREBI.js.map → chunk-TVRL3IPZ.js.map} +1 -1
- package/dist/{chunk-RKTEHX2S.js → chunk-TW5AP6IF.js} +5 -5
- package/dist/{chunk-RKTEHX2S.js.map → chunk-TW5AP6IF.js.map} +1 -1
- package/dist/{chunk-EMIOFJQJ.js → chunk-TYK752MU.js} +3 -3
- package/dist/{chunk-EMIOFJQJ.js.map → chunk-TYK752MU.js.map} +1 -1
- package/dist/{chunk-HPQ2WDYC.js → chunk-U2WPJHRA.js} +5 -5
- package/dist/{chunk-HPQ2WDYC.js.map → chunk-U2WPJHRA.js.map} +1 -1
- package/dist/{chunk-YLKOCMU7.js → chunk-U6UFPOEK.js} +326 -1058
- package/dist/chunk-U6UFPOEK.js.map +1 -0
- package/dist/{chunk-MEU2HHGV.js → chunk-U7P22GEB.js} +386 -46
- package/dist/chunk-U7P22GEB.js.map +1 -0
- package/dist/{chunk-AEFDFCS2.js → chunk-VFEZUSB6.js} +4 -4
- package/dist/{chunk-AEFDFCS2.js.map → chunk-VFEZUSB6.js.map} +1 -1
- package/dist/{chunk-A4VKIVGB.js → chunk-WW22FS74.js} +75 -67
- package/dist/chunk-WW22FS74.js.map +1 -0
- package/dist/{chunk-72PPC4SC.js → chunk-Z23I2JA6.js} +6 -6
- package/dist/{chunk-72PPC4SC.js.map → chunk-Z23I2JA6.js.map} +1 -1
- package/dist/{chunk-KIFAU62K.js → chunk-Z7HLX4V2.js} +4 -4
- package/dist/{chunk-KIFAU62K.js.map → chunk-Z7HLX4V2.js.map} +1 -1
- package/dist/{chunk-CVUMZTNO.js → chunk-ZQPBYLCS.js} +4 -4
- package/dist/{chunk-CVUMZTNO.js.map → chunk-ZQPBYLCS.js.map} +1 -1
- package/dist/{claude-code-5QYXWC5H.js → claude-code-VL6UM7BZ.js} +4 -4
- package/dist/{claude-code-5QYXWC5H.js.map → claude-code-VL6UM7BZ.js.map} +1 -1
- package/dist/cli/index.js +491 -298
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/agent-file-refresh.d.ts +25 -0
- package/dist/cli/src/agent-file-refresh.d.ts.map +1 -0
- package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/catalog.d.ts +9 -2
- package/dist/cli/src/commands/catalog.d.ts.map +1 -1
- package/dist/cli/src/commands/config.d.ts.map +1 -1
- package/dist/cli/src/commands/harness.d.ts +1 -1
- package/dist/cli/src/commands/harness.d.ts.map +1 -1
- package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/library-index.d.ts +5 -7
- package/dist/cli/src/commands/library-index.d.ts.map +1 -1
- package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
- package/dist/cli/src/commands/preset-export.d.ts.map +1 -1
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/cli/src/commands/run.d.ts.map +1 -1
- package/dist/cli/src/commands/serve-preflight.d.ts +27 -48
- package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
- package/dist/cli/src/commands/serve.d.ts.map +1 -1
- package/dist/cli/src/commands/source.d.ts +6 -9
- package/dist/cli/src/commands/source.d.ts.map +1 -1
- package/dist/cli/src/commands/validate.d.ts +6 -0
- package/dist/cli/src/commands/validate.d.ts.map +1 -1
- package/dist/cli/src/config-checks.d.ts.map +1 -1
- package/dist/cli/src/harness-error.d.ts +11 -9
- package/dist/cli/src/harness-error.d.ts.map +1 -1
- package/dist/cli/src/skill-checks.d.ts +48 -74
- package/dist/cli/src/skill-checks.d.ts.map +1 -1
- package/dist/connectors/config.js +5 -5
- package/dist/connectors/index.js +19 -19
- package/dist/{connectors-DLXW27NQ.js → connectors-7EPJRVLJ.js} +22 -22
- package/dist/{connectors-DLXW27NQ.js.map → connectors-7EPJRVLJ.js.map} +1 -1
- package/dist/core/index.js +7 -6
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/publish-manifest.js +3 -3
- package/dist/core/ref.js +1 -1
- package/dist/core/runtime-assets.js +5 -5
- package/dist/core/src/agent-prompt-sections.d.ts +96 -4
- package/dist/core/src/agent-prompt-sections.d.ts.map +1 -1
- package/dist/core/src/check-asset.d.ts +115 -0
- package/dist/core/src/check-asset.d.ts.map +1 -0
- package/dist/core/src/harness-model.d.ts +20 -0
- package/dist/core/src/harness-model.d.ts.map +1 -0
- package/dist/core/src/index.d.ts +10 -6
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts +12 -10
- package/dist/core/src/lock.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +42 -11
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/publish-manifest.d.ts +17 -0
- package/dist/core/src/publish-manifest.d.ts.map +1 -1
- package/dist/core/src/repo-identity.d.ts +41 -0
- package/dist/core/src/repo-identity.d.ts.map +1 -0
- package/dist/core/src/repo-manager.d.ts +3 -9
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/walker.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +4 -4
- package/dist/deploy/index.js +7 -6
- package/dist/deploy/index.js.map +1 -1
- package/dist/discovery/index.js +5 -5
- package/dist/discovery/src/source-config.d.ts.map +1 -1
- package/dist/{ensure-sources-I7GCXPXK.js → ensure-sources-CI3JQJST.js} +30 -28
- package/dist/ensure-sources-CI3JQJST.js.map +1 -0
- package/dist/factory-assets/connectors/box.js +19 -19
- package/dist/factory-assets/connectors/deploy.js +19 -19
- package/dist/factory-assets/connectors/devserver.js +19 -19
- package/dist/factory-assets/connectors/flow/adapter.js +19 -19
- package/dist/factory-assets/connectors/flow/engine.js +8 -7
- package/dist/factory-assets/connectors/flow/run-flow.js +21 -21
- package/dist/factory-assets/connectors/flow.js +19 -19
- package/dist/factory-assets/connectors/git.js +19 -19
- package/dist/factory-assets/connectors/gmail.js +19 -19
- package/dist/factory-assets/connectors/googledrive.js +19 -19
- package/dist/factory-assets/connectors/local.js +19 -19
- package/dist/factory-assets/connectors/mattermost.js +19 -19
- package/dist/factory-assets/connectors/memory.js +19 -19
- package/dist/factory-assets/connectors/minio.js +19 -19
- package/dist/factory-assets/connectors/postgres.js +19 -19
- package/dist/factory-assets/connectors/s3.js +19 -19
- package/dist/factory-assets/connectors/sharepoint.js +19 -19
- package/dist/factory-assets/connectors/sqlite.js +19 -19
- package/dist/factory-assets/connectors/static-server.js +19 -19
- package/dist/factory-assets/connectors/tunnel.js +19 -19
- package/dist/factory-assets/connectors/webdav.js +19 -19
- package/dist/factory-assets/connectors/xstate-store.js +19 -19
- package/dist/factory-assets/connectors/xstate.js +19 -19
- package/dist/{flows-J64L5MGJ.js → flows-6XQAYQS4.js} +12 -11
- package/dist/{flows-J64L5MGJ.js.map → flows-6XQAYQS4.js.map} +1 -1
- package/dist/{helpers-U75UGGH5.js → helpers-26MR5QPO.js} +30 -28
- package/dist/{helpers-U75UGGH5.js.map → helpers-26MR5QPO.js.map} +1 -1
- package/dist/library/index.js +10 -10
- package/dist/library/install.js +4 -4
- package/dist/library/src/index.d.ts +1 -1
- package/dist/library/src/index.d.ts.map +1 -1
- package/dist/library/src/local/db.d.ts.map +1 -1
- package/dist/library/src/local/library-manager.d.ts.map +1 -1
- package/dist/library/src/local/library.d.ts.map +1 -1
- package/dist/library/src/local/schema.d.ts +19 -0
- package/dist/library/src/local/schema.d.ts.map +1 -1
- package/dist/library/src/user-library.d.ts +18 -0
- package/dist/library/src/user-library.d.ts.map +1 -1
- package/dist/{library-publish-57422ULT.js → library-publish-YHYGA6G5.js} +71 -65
- package/dist/library-publish-YHYGA6G5.js.map +1 -0
- package/dist/model-endpoint/index.js +10 -9
- package/dist/{open-library-EVUKLOV7.js → open-library-FVV6GG4I.js} +33 -31
- package/dist/{open-library-EVUKLOV7.js.map → open-library-FVV6GG4I.js.map} +1 -1
- package/dist/{open-registry-4HNCWOCN.js → open-registry-VX2BVMS5.js} +16 -16
- package/dist/{open-registry-4HNCWOCN.js.map → open-registry-VX2BVMS5.js.map} +1 -1
- package/dist/{paths-PXBWY532.js → paths-PIWSSUUG.js} +10 -9
- package/dist/{paths-PXBWY532.js.map → paths-PIWSSUUG.js.map} +1 -1
- package/dist/{plugin-store-ZC3EGZ3D.js → plugin-store-MVTW6G7J.js} +10 -9
- package/dist/{plugin-store-ZC3EGZ3D.js.map → plugin-store-MVTW6G7J.js.map} +1 -1
- package/dist/{project-HB7OYPEF.js → project-BOAHGBMI.js} +47 -45
- package/dist/{project-HB7OYPEF.js.map → project-BOAHGBMI.js.map} +1 -1
- package/dist/resolver/index.js +8 -7
- package/dist/runner/composition-content.d.ts +2 -0
- package/dist/runner/composition-content.js +29 -0
- package/dist/runner/composition-content.js.map +1 -0
- package/dist/runner/index.js +37 -36
- package/dist/runner/src/composition/content-entry.d.ts +15 -0
- package/dist/runner/src/composition/content-entry.d.ts.map +1 -0
- package/dist/runner/src/composition/content-source.d.ts +7 -0
- package/dist/runner/src/composition/content-source.d.ts.map +1 -1
- package/dist/runner/src/composition/dry-run.d.ts +5 -1
- package/dist/runner/src/composition/dry-run.d.ts.map +1 -1
- package/dist/runner/src/composition/index.d.ts +1 -1
- package/dist/runner/src/composition/index.d.ts.map +1 -1
- package/dist/runner/src/composition/prompt-sections.d.ts +47 -20
- package/dist/runner/src/composition/prompt-sections.d.ts.map +1 -1
- package/dist/runner/src/external-mcp.d.ts +32 -7
- package/dist/runner/src/external-mcp.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +3 -8
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +17 -15
- package/dist/sdk/bridge.js +16 -16
- package/dist/sdk/core.js +7 -6
- package/dist/sdk/flow.js +8 -7
- package/dist/sdk/index.js +37 -36
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +8 -7
- package/dist/sdk/runner.js +37 -36
- package/dist/sdk/transport/ws/server.js +8 -7
- package/dist/sdk/transport/ws.js +8 -7
- package/dist/sdk/transport.js +8 -7
- package/dist/serve-preflight-XJS5OZML.js +138 -0
- package/dist/serve-preflight-XJS5OZML.js.map +1 -0
- package/dist/{setup-2XV6T53V.js → setup-BFEBJLYF.js} +31 -29
- package/dist/setup-BFEBJLYF.js.map +1 -0
- package/dist/{skills-5D4KDVPJ.js → skills-OCG7B5CL.js} +13 -12
- package/dist/{skills-5D4KDVPJ.js.map → skills-OCG7B5CL.js.map} +1 -1
- package/dist/source-J2MJIHDS.js +93 -0
- package/dist/{source-VXE3RSSA.js.map → source-J2MJIHDS.js.map} +1 -1
- package/dist/{source-manifest-publish-IIVQLM67.js → source-manifest-publish-6MYDXCKZ.js} +51 -49
- package/dist/source-manifest-publish-6MYDXCKZ.js.map +1 -0
- package/dist/transport/index.js +8 -7
- package/dist/transport/ws/server.js +8 -7
- package/dist/transport/ws.js +8 -7
- package/dist/tui/index.js +37 -36
- package/dist/tui/index.js.map +1 -1
- package/dist/types/src/runtime.d.ts +6 -0
- package/dist/types/src/runtime.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +26 -26
- package/dist/workspace-plugin/adapters/omp.js +14 -14
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +7 -1
- package/dist/asset-feeds-PM7FKHJP.js.map +0 -1
- package/dist/chunk-2RVEYDQK.js +0 -110
- package/dist/chunk-2RVEYDQK.js.map +0 -1
- package/dist/chunk-6WIZC6GM.js.map +0 -1
- package/dist/chunk-7FXOOUOC.js.map +0 -1
- package/dist/chunk-7HRZACI4.js.map +0 -1
- package/dist/chunk-7LJUK5JK.js.map +0 -1
- package/dist/chunk-7VBD5XUM.js.map +0 -1
- package/dist/chunk-A4VKIVGB.js.map +0 -1
- package/dist/chunk-BNLXZXZN.js.map +0 -1
- package/dist/chunk-DRUAQ7IY.js.map +0 -1
- package/dist/chunk-IYXOSBQ4.js.map +0 -1
- package/dist/chunk-LBJCOEXH.js.map +0 -1
- package/dist/chunk-MEU2HHGV.js.map +0 -1
- package/dist/chunk-MS2IXLTC.js.map +0 -1
- package/dist/chunk-MUQBP2BK.js.map +0 -1
- package/dist/chunk-OIWFXUZB.js.map +0 -1
- package/dist/chunk-PFBPESW7.js.map +0 -1
- package/dist/chunk-R7422XD4.js.map +0 -1
- package/dist/chunk-SXRN27TU.js.map +0 -1
- package/dist/chunk-U7EJB6LY.js.map +0 -1
- package/dist/chunk-XPSZIBPU.js.map +0 -1
- package/dist/chunk-YLKOCMU7.js.map +0 -1
- package/dist/cli/src/commands/harness-preflight.d.ts +0 -40
- package/dist/cli/src/commands/harness-preflight.d.ts.map +0 -1
- package/dist/ensure-sources-I7GCXPXK.js.map +0 -1
- package/dist/library-publish-57422ULT.js.map +0 -1
- package/dist/serve-preflight-YY3YC6GH.js +0 -61
- package/dist/serve-preflight-YY3YC6GH.js.map +0 -1
- package/dist/setup-2XV6T53V.js.map +0 -1
- package/dist/source-VXE3RSSA.js +0 -91
- package/dist/source-manifest-publish-IIVQLM67.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../core/src/asset-roots.ts","../core/src/lock.ts","../core/src/manifest-yaml-editor.ts","../core/src/conformance.ts","../core/src/check-asset.ts","../core/src/patch.ts","../core/src/provider-registry-files.ts","../core/src/settings.ts","../core/src/package-manager.ts","../core/src/harness-sdk.ts","../core/src/bind.ts","../core/src/harness-model.ts","../core/src/agent-prompt-sections.ts","../core/src/workspace-yaml-editor.ts"],"names":["join","existsSync","path","readFileSync","parseDocument","isMap","writeFileSync","isScalar","dirname","basename","resolve","mkdirSync","stringify","SKAILE_DIR","realpathSync","fileURLToPath","Document","isSeq"],"mappings":"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","file":"chunk-U7P22GEB.js","sourcesContent":["/**\n * asset-roots.ts — the single definition of *where* skaile-owned content lives.\n *\n * The policy sits in `core/` rather than next to either of its callers because\n * both layers that need it already depend on `core/`: the CLI's discovery\n * surfaces (`flow list`, completions, skill walking) and the flow connector's\n * resolution surfaces under `factory-assets/` (`resume`, sub-flow targets,\n * `serve`). Keeping it in `cli/` instead would force a `factory-assets → cli`\n * import, which is a real module cycle — and duplicating it there is exactly\n * how the two lists drifted apart in the first place.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { globalSkaileDir } from \"./cache-paths.js\";\nimport { SUPPORTED_HARNESSES } from \"./harness-targets.js\";\nimport { factoryAssetRoots } from \"./runtime-assets.js\";\nimport { deployedBase } from \"./store.js\";\n\n/**\n * The library checkouts directory before any environment override — the value\n * `getConfigDefaults()` reports as the *default*, which must stay independent of\n * `SKAILE_LIBRARIES_DIR` so a config file can still be seen to override it.\n * Callers that want the effective directory want {@link resolveLibraryDir}.\n *\n * @docLink packages/core/concepts#discovery\n */\nexport function defaultLibraryDir(): string {\n return join(globalSkaileDir(), \"libraries\");\n}\n\n/**\n * Resolve the active library checkouts directory.\n *\n * `SKAILE_LIBRARIES_DIR` overrides the default `$SKAILE_HOME/libraries`\n * (`~/.skaile/libraries` when `SKAILE_HOME` is unset).\n *\n * @docLink packages/core/concepts#discovery\n */\nexport function resolveLibraryDir(): string {\n if (process.env.SKAILE_LIBRARIES_DIR) return resolve(process.env.SKAILE_LIBRARIES_DIR);\n return defaultLibraryDir();\n}\n\n/** Folder name, under the library checkouts directory, that `skaile install` fills. */\nexport const GLOBAL_INSTALL_DIR_NAME = \"installed\";\n\n/**\n * The folder a global pointer-only install (`skaile install kind:@pub/name#ver`)\n * writes asset bytes into: `<libraries dir>/installed`. It holds store assets,\n * not authored ones, so it must never be adopted as an owner library.\n */\nexport function globalInstallDir(): string {\n return join(resolveLibraryDir(), GLOBAL_INSTALL_DIR_NAME);\n}\n\n/**\n * The skaile-owned install roots for one scope — the parent of the directory\n * `skaile install` / `skaile add` deploy flows into.\n *\n * Derived through `deployedBase`, the same function the installer calls, so\n * discovery cannot drift from where the bytes land. Every harness target maps\n * `flow` to the same `.skaile/flows`, so the three results collapse in the\n * caller's `Set`.\n */\nfunction installRoots(globalInstall: boolean, projectDir: string): string[] {\n return SUPPORTED_HARNESSES.map((target) =>\n dirname(deployedBase(\"flow\", target, globalInstall, projectDir)),\n );\n}\n\n/**\n * All content roots that skill / flow discovery should walk, in priority order,\n * filtered to those that exist on disk and de-duplicated.\n *\n * Four layers, in this order:\n * 1. The project-local install root `<projectDir>/.skaile/`, where\n * `skaile install` / `skaile add` deploy flows.\n * 2. The first-party `factory-assets/` roots from the shared `factoryAssetRoots()`\n * helper — the `SKAILE_FACTORY_ASSETS_DIR` override layer (when set) ahead of\n * the bundled tree (in-repo source in dev, `dist/factory-assets/` after\n * install). No monorepo special-case.\n * 3. The user-library dir `~/.skaile/libraries/`.\n * 4. The user-global install root `~/.skaile/`.\n *\n * Order is significant: `findSkills` / flow discovery dedupe first-root-wins, so\n * the env override shadows the bundled tree on a name clash. The project-local\n * install root leads because `deployAll` applies `patches:` to the deployed copy\n * — that copy, not the factory original, is the project's effective flow.\n *\n * Only `flow` installs into skaile's own `.skaile/` tree; every other asset kind\n * installs into the harness's directory (`.claude/`, `.omp/`, `.codex/`), which\n * the harness reads natively and skaile deliberately does not enumerate. So the\n * roots below are exactly the skaile-owned ones — an invariant asserted by\n * `cli/tests/installed-asset-roots.test.ts`.\n *\n * This is the discovery surface used by `findSkills`, flow discovery, and the\n * completion resolvers; flow *resolution* walks these same roots behind\n * `flowLookupRoots`, which only prepends the project's own `ai-assets/` tree.\n *\n * @param projectDir - Project directory whose local install root to include\n * (default: `process.cwd()`).\n * @docLink packages/core/concepts#discovery\n */\nexport function aiResourceRoots(projectDir: string = process.cwd()): string[] {\n const roots: string[] = [\n ...installRoots(false, projectDir),\n ...factoryAssetRoots(),\n // resolveLibraryDir honors SKAILE_LIBRARIES_DIR (the authoring side does too),\n // so a custom-dir library is visible to discovery instead of being missed.\n resolveLibraryDir(),\n ...installRoots(true, projectDir),\n ];\n return [...new Set(roots)].filter((r) => existsSync(r));\n}\n\n/**\n * The content roots of what one project has: the flows `skaile install` / `skaile add` deployed\n * into `<projectDir>/.skaile/`, plus the first-party `factory-assets/` layers the product ships\n * (the `SKAILE_FACTORY_ASSETS_DIR` override and the bundled tree). Filtered to those that exist.\n *\n * Unlike {@link aiResourceRoots} it leaves out `~/.skaile/libraries/` and the user-global\n * `~/.skaile/` root. The global root holds `cache/` (every source clone on the machine), so\n * walking it listed flows no project declared. `flow list` and `skaile run <id>` read this\n * set, so a flow that runs for you also runs for a teammate with the same `skaile.yaml` (p1353).\n *\n * @param projectDir - Project directory whose local install root to include\n * (default: `process.cwd()`).\n */\nexport function projectAssetRoots(projectDir: string = process.cwd()): string[] {\n const roots: string[] = [...installRoots(false, projectDir), ...factoryAssetRoots()];\n return [...new Set(roots)].filter((r) => existsSync(r));\n}\n","/**\n * Lock file I/O and integrity verification (schema v5).\n *\n * The lock file (skaile.lock.yaml) captures the complete resolved state: every\n * asset keyed by its canonical ref `<kind>:@<publisher>/<name>#<version>`, the\n * upstream source + commit it resolved from, a per-file + composite content\n * hash for drift detection, and whether an `overrides[]` entry pinned it. A\n * top-level `sources:` block records every contributing source URL at each\n * commit an asset resolved from (one row per URL and commit). A library-origin\n * entry names its library by a stable `id` (schema 5) next to its display name.\n *\n * Old v1 lockfiles (`lockfile_version: 1`, `repositories:`) are rejected with a\n * clear regenerate-from-scratch error.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { isMap, isScalar, parseDocument, stringify, visit } from \"yaml\";\nimport type {\n LockEntry,\n LockFile,\n LockLibraryOrigin,\n LockPluginEntry,\n LockSourceEntry,\n} from \"./models.js\";\nimport { parseAssetRefLoose } from \"./models.js\";\nimport { compositeSha256, sha256Hex } from \"./publish-manifest.js\";\nimport { resolveWorkspacesPackageRoot } from \"./runtime-assets.js\";\nimport type { ProvenanceCandidate } from \"./walker.js\";\n\n/**\n * Canonical git URL identity for the bundled factory source. Never fetched: the bytes live\n * inside the package (`factory-assets/`). In memory a factory asset is locked as this URL at\n * the all-zero commit; `skaile.lock.yaml` on disk says {@link LOCK_FACTORY_URL} instead.\n */\nexport const FACTORY_SOURCE_URL = \"https://github.com/skaile-ai/ai-assets\";\n\n/**\n * The source `url` a factory asset carries in `skaile.lock.yaml`. Its `commit` is the\n * `@skaile/workspaces` version whose bundled tree holds the bytes, since the factory source\n * has no git commit of its own (p1755).\n */\nexport const LOCK_FACTORY_URL = \"factory\";\n\n/** The commit a factory asset carries in memory: the bundled tree has none. */\nconst FACTORY_MEMORY_COMMIT = \"0\".repeat(40);\n\nfunction repoUrlKey(url: string): string {\n return url\n .trim()\n .replace(/^git@([^:]+):/, \"https://$1/\")\n .replace(/^[a-z]+:\\/\\//i, \"\")\n .replace(/\\/+$/, \"\")\n .replace(/\\.git$/i, \"\")\n .replace(/\\/+$/, \"\")\n .toLowerCase();\n}\n\nconst FACTORY_URL_KEY = repoUrlKey(FACTORY_SOURCE_URL);\n\n/** Identity of a `sources:` row: the URL as spelled and the commit (one row per pair). */\nfunction sourceRowKey(row: LockSourceEntry): string {\n return `${row.url}\\n${row.commit}`;\n}\n\n/** `sources:` order: by URL, then commit. */\nfunction compareSourceRows(a: LockSourceEntry, b: LockSourceEntry): number {\n return a.url.localeCompare(b.url) || a.commit.localeCompare(b.commit);\n}\n\nlet factoryVersionCache: string | undefined;\n\n/** Version of the `@skaile/workspaces` package whose bundled factory tree this process uses. */\nfunction factoryBundleVersion(): string {\n if (factoryVersionCache !== undefined) return factoryVersionCache;\n let version = \"unknown\";\n const root = resolveWorkspacesPackageRoot();\n if (root) {\n try {\n const pkg = JSON.parse(readFileSync(join(root, \"package.json\"), \"utf8\")) as {\n version?: unknown;\n };\n if (typeof pkg.version === \"string\" && pkg.version !== \"\") version = pkg.version;\n } catch {\n // No readable package.json: the version stays \"unknown\".\n }\n }\n factoryVersionCache = version;\n return version;\n}\n\n/**\n * True for the in-memory source of a bundled factory asset: the ai-assets URL at the all-zero\n * commit. A declared `skaile-ai/ai-assets` source has the same URL but a real commit, so it is\n * a different origin.\n */\nexport function isFactoryMemorySource(\n source: { url: string; commit: string } | undefined,\n): boolean {\n return (\n source !== undefined &&\n repoUrlKey(source.url) === FACTORY_URL_KEY &&\n source.commit === FACTORY_MEMORY_COMMIT\n );\n}\n\n/**\n * `lock` as written to disk: every factory asset (the ai-assets URL at the all-zero commit)\n * names `factory` and the version of the bundled tree instead (p1755). A source row of that\n * URL at the all-zero commit becomes the one `factory` row; a row of the same URL that a store\n * asset needs stays.\n *\n * A factory asset whose `sha256` the lock on disk already holds keeps the commit written there:\n * a CLI version change alone does not rewrite the lock, so a team on mixed versions does not\n * flip it on every `install`. Only a content change takes the running version.\n *\n * @param prevAssets - The `assets:` map of the lock on disk, as parsed (any shape), or `undefined`.\n */\nfunction lockToDisk(lock: LockFile, prevAssets?: unknown): LockFile {\n const version = factoryBundleVersion();\n const prev =\n prevAssets && typeof prevAssets === \"object\" ? (prevAssets as Record<string, unknown>) : {};\n let anyFactory = false;\n const assets: Record<string, LockEntry> = {};\n for (const [key, entry] of Object.entries(lock.assets)) {\n if (isFactoryMemorySource(entry.source)) {\n anyFactory = true;\n const before = prev[key] as\n | { sha256?: unknown; source?: { url?: unknown; commit?: unknown } }\n | undefined;\n const keep =\n before?.source?.url === LOCK_FACTORY_URL &&\n typeof before.source.commit === \"string\" &&\n before.source.commit !== \"\" &&\n before.sha256 === entry.sha256\n ? before.source.commit\n : version;\n assets[key] = { ...entry, source: { url: LOCK_FACTORY_URL, commit: keep } };\n } else {\n assets[key] = entry;\n }\n }\n const hasMemoryRow = lock.sources.some((s) => isFactoryMemorySource(s));\n if (!anyFactory && !hasMemoryRow) return lock;\n const rows = new Map<string, LockSourceEntry>();\n for (const s of lock.sources) if (!isFactoryMemorySource(s)) rows.set(sourceRowKey(s), s);\n for (const s of sourcesOfAssets(assets))\n if (!rows.has(sourceRowKey(s))) rows.set(sourceRowKey(s), s);\n return {\n ...lock,\n assets,\n sources: [...rows.values()].sort(compareSourceRows),\n };\n}\n\n/** Inverse of {@link lockToDisk}: a `factory` source is the ai-assets URL at the all-zero commit. */\nfunction lockFromDisk(lock: LockFile): LockFile {\n const assets: Record<string, LockEntry> = {};\n let any = false;\n for (const [key, entry] of Object.entries(lock.assets ?? {})) {\n if (entry.source?.url === LOCK_FACTORY_URL) {\n any = true;\n assets[key] = {\n ...entry,\n source: { url: FACTORY_SOURCE_URL, commit: FACTORY_MEMORY_COMMIT },\n };\n } else {\n assets[key] = entry;\n }\n }\n const sources = Array.isArray(lock.sources) ? lock.sources : [];\n if (!any && !sources.some((s) => s.url === LOCK_FACTORY_URL)) return lock;\n const rows = new Map<string, LockSourceEntry>();\n const rowKeyOf = (s: LockSourceEntry): string => `${repoUrlKey(s.url)}\\n${s.commit}`;\n for (const s of sources) {\n if (s.url !== LOCK_FACTORY_URL) rows.set(rowKeyOf(s), s);\n }\n const factoryRow = { url: FACTORY_SOURCE_URL, commit: FACTORY_MEMORY_COMMIT };\n if (!rows.has(rowKeyOf(factoryRow))) rows.set(rowKeyOf(factoryRow), factoryRow);\n return {\n ...lock,\n assets,\n sources: [...rows.values()].sort(compareSourceRows),\n };\n}\n\n/**\n * The `schema_version` every lock is written with, whatever origins it holds. A lock read with\n * the older `3` or `4` loads unchanged and is rewritten as `5` by the next `add` / `install` /\n * `update` (the in-place upgrade: every entry keeps its bytes, hashes and commit).\n */\nexport const LOCK_SCHEMA_VERSION = 5;\n\n/** The `schema_version` values {@link readLock} accepts. */\nconst READABLE_LOCK_SCHEMAS: readonly unknown[] = [3, 4, 5];\n\n// ── Lock file I/O ────────────────────────────────────────────────────────────\n\n/**\n * Deep copy of `value` with every object's keys in sorted order (arrays keep their order: a\n * `files` list or a `sources` list is sorted by the code that builds it). Equal content then\n * serializes to equal bytes, whichever code path (`add`, `install`, `update`) built the lock.\n */\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value).sort()) {\n const v = (value as Record<string, unknown>)[key];\n if (v !== undefined) out[key] = canonicalize(v);\n }\n return out;\n }\n return value;\n}\n\n/** Lock YAML in canonical order: the version and timestamp first, then every key sorted. */\nfunction stringifyLock(data: LockFile | Record<string, unknown>): string {\n const { schema_version, locked_at, ...rest } = data as Record<string, unknown>;\n const head: Record<string, unknown> = {};\n if (schema_version !== undefined) head.schema_version = schema_version;\n if (locked_at !== undefined) head.locked_at = locked_at;\n return stringify(\n { ...head, ...(canonicalize(rest) as Record<string, unknown>) },\n { lineWidth: 120 },\n );\n}\n\n/**\n * A lock file that is not valid YAML, or whose root is not a mapping. One line, the shape every\n * config parse error has (`<file> — parse error: <reason> at line N`). A lock that cannot be\n * read is not \"no lock\": reading it as empty lets `update` overwrite it and `outdated` call\n * every asset unlocked (p1892).\n */\nexport class LockParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LockParseError\";\n }\n}\n\nconst LOCK_PARSE_HINT = \"Restore it from git, or delete it and run `skaile install`.\";\n\nfunction lockParseError(label: string, reason: string, line?: number): LockParseError {\n const where = line === undefined ? \"\" : ` at line ${line}`;\n return new LockParseError(`${label} — parse error: ${reason}${where}. ${LOCK_PARSE_HINT}`);\n}\n\n/**\n * Parse lock YAML with every `commit` and `sha256` value read as the text written in the file.\n * A sha made only of digits (`0000…0001`, `1111…`) parses as a YAML number, which loses its\n * leading zeros and digits and later fails with an error about `slice`; `stringify` quotes\n * such a string on write, a hand edit or another tool may not (p1295).\n */\nfunction parseLockYaml(text: string, label = \"skaile.lock.yaml\"): unknown {\n const doc = parseDocument(text);\n // `parseDocument` collects errors instead of throwing: a lock with git conflict markers or a\n // duplicate key must not read as an empty lock.\n const first = doc.errors[0];\n if (first) {\n const reason = (first.message.split(\"\\n\")[0] ?? \"\")\n .replace(/ at line \\d+, column \\d+:?$/, \"\")\n .replace(/:$/, \"\");\n throw lockParseError(label, reason, first.linePos?.[0]?.line);\n }\n if (text.trim() !== \"\" && doc.contents !== null && !isMap(doc.contents)) {\n throw lockParseError(label, \"the file must be a mapping at the top level\");\n }\n visit(doc, {\n Pair(_key, pair) {\n // `commit` (a git sha) and `sha256` (a hex digest) are always text, never a number.\n if (!isScalar(pair.key) || (pair.key.value !== \"commit\" && pair.key.value !== \"sha256\"))\n return;\n const value = pair.value;\n if (!isScalar(value) || typeof value.value === \"string\" || value.value === null) return;\n if (typeof value.source === \"string\") value.value = value.source;\n },\n });\n return doc.toJS();\n}\n\n/**\n * Serialize a `LockFile` to YAML (keys in canonical sorted order) and write it to disk, unless\n * the file already holds the same content apart from `locked_at` and key order. An unchanged\n * lock keeps its bytes (and its `locked_at`), so a no-op `install`, also the first one after\n * `add`, does not dirty a committed lock.\n *\n * @param lockPath - Absolute path to write the lock file (e.g. `skaile.lock.yaml`)\n * @param data - Lock file data to serialize\n * @returns `true` when the file was written, `false` when it already matched\n * @docLink packages/core/api-reference#write-lock\n */\nexport function writeLock(lockPath: string, data: LockFile): boolean {\n let onDisk: Record<string, unknown> | null = null;\n if (existsSync(lockPath)) {\n // A lock that does not parse is never overwritten: it may hold the only record of what was\n // locked (a merge conflict, a hand edit). The error names the line (p1892).\n onDisk = parseLockYaml(readFileSync(lockPath, \"utf8\"), basename(lockPath)) as Record<\n string,\n unknown\n > | null;\n }\n // The in-place upgrade: a lock read as schema 3 or 4 is written as 5 by whichever command writes it first.\n const next = stringifyLock(\n lockToDisk({ ...data, schema_version: LOCK_SCHEMA_VERSION }, onDisk?.assets),\n );\n if (onDisk && typeof onDisk === \"object\" && typeof onDisk.locked_at === \"string\") {\n try {\n if (stringifyLock({ ...onDisk, locked_at: data.locked_at }) === next) return false;\n } catch {\n // Unserializable lock: rewrite it.\n }\n }\n writeFileSync(lockPath, next);\n return true;\n}\n\n/**\n * Read and parse a lock file from disk.\n *\n * @param lockPath - Absolute path to the lock file\n * @returns Parsed `LockFile`, or `null` if the file is missing or empty\n * @throws {LockParseError} When the file is not valid YAML or its root is not a mapping (p1892).\n * @throws When the file is a legacy v1 lock — the shape changed and it must be regenerated.\n * @docLink packages/core/api-reference#read-lock\n */\nexport function readLock(lockPath: string): LockFile | null {\n if (!existsSync(lockPath)) return null;\n const raw = parseLockYaml(readFileSync(lockPath, \"utf8\"), basename(lockPath));\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n if (!READABLE_LOCK_SCHEMAS.includes(r.schema_version)) {\n throw new Error(\n \"outdated lockfile schema detected — the lockfile shape changed. \" +\n \"Regenerate: `rm skaile.lock.yaml && skaile install`.\",\n );\n }\n return lockFromDisk(r as unknown as LockFile);\n}\n\n/**\n * Refuse a lock whose `commit` or `sha256` is not hex text (a hand edit, a merge gone wrong):\n * one line naming the entry, instead of a failure deep in the restore. An empty entry\n * `sha256` is a library entry without a recorded hash and passes.\n *\n * @throws `skaile.lock.yaml: commit of <ref> is not a git sha` (or the `sha256` form).\n */\nexport function assertLockHashes(lock: LockFile): void {\n const isHex = (value: unknown): boolean =>\n typeof value === \"string\" && /^[0-9a-f]+$/i.test(value);\n // A path source has no commit: an absent or empty one is not a hand-edited value.\n const badCommit = (value: unknown): boolean =>\n value !== undefined && value !== \"\" && !isHex(value);\n for (const [ref, entry] of Object.entries(lock.assets)) {\n if (entry.source && badCommit(entry.source.commit)) {\n throw new Error(`skaile.lock.yaml: commit of ${ref} is not a git sha`);\n }\n const files = entry.files ?? [];\n const hasHash = entry.sha256 !== undefined && entry.sha256 !== \"\";\n if ((hasHash && !isHex(entry.sha256)) || files.some((f) => !isHex(f.sha256))) {\n throw new Error(`skaile.lock.yaml: sha256 of ${ref} is not a hex digest`);\n }\n }\n for (const source of lock.sources ?? []) {\n if (badCommit(source.commit)) {\n throw new Error(`skaile.lock.yaml: commit of ${source.url} is not a git sha`);\n }\n }\n}\n\n// ── Hashing ──────────────────────────────────────────────────────────────────\n\n/**\n * Compute the SHA-256 hash of a file's content (hex digest, no prefix).\n *\n * @param filePath - Absolute path to the file\n * @returns Hex-encoded SHA-256 hash string\n * @docLink packages/core/api-reference#compute-hash\n */\nexport function computeHash(filePath: string): string {\n return sha256Hex(readFileSync(filePath));\n}\n\n// ── Lock file construction ───────────────────────────────────────────────────\n\n/** One asset resolved from a registered library, as input to {@link buildLibraryLockEntries}. */\nexport interface LibraryLockInput {\n kind: string;\n /** Bare publisher (no `@` scope sigil). */\n publisher: string;\n name: string;\n /** Library-side origin: library name, version and (when indexed) content hash. */\n library: LockLibraryOrigin;\n /**\n * What the asset requires, as sorted, version-less `kind:@publisher/name`, as the library\n * lists it (`metadata.requires` and manifest `dependencies:`). The deployed copy cannot say\n * a manifest `dependencies:` entry, so `remove` reads it here once the library is gone.\n */\n requires?: string[];\n}\n\n/**\n * Build library-origin lock entries keyed by canonical ref\n * `<kind>:@<publisher>/<name>#<library version>`.\n *\n * A library is a local authoring place, not a git source: the entry carries no\n * `source` / `files`, only the `library` marker `installLocked` restores from.\n *\n * @param inputs - Assets resolved from libraries.\n * @returns Lock entries ready to merge into a `LockFile.assets` map.\n */\nexport function buildLibraryLockEntries(inputs: LibraryLockInput[]): Record<string, LockEntry> {\n const assets: Record<string, LockEntry> = {};\n for (const i of inputs) {\n const key = `${i.kind}:@${i.publisher}/${i.name}#${i.library.version}`;\n const library: LockLibraryOrigin = { name: i.library.name, version: i.library.version };\n if (i.library.id) library.id = i.library.id;\n if (i.library.sha256) library.sha256 = i.library.sha256;\n if (i.library.url) library.url = i.library.url;\n if (i.library.installed) library.installed = i.library.installed;\n assets[key] = {\n sha256: i.library.sha256 ?? \"\",\n files: [],\n override_applied: false,\n library,\n ...(i.requires && i.requires.length > 0 ? { requires: i.requires } : {}),\n };\n }\n return assets;\n}\n\n/**\n * Build a v5 `LockFile` from the resolver's output.\n *\n * Assets are keyed by canonical ref `<kind>:@<publisher>/<name>#<version>`; the\n * top-level `sources:` block lists every contributing source URL pinned to its\n * resolved commit. Library-origin assets (see {@link buildLibraryLockEntries})\n * are merged into `assets` but never contribute a `sources:` row.\n *\n * @param resolved - Resolved provenance candidates (the resolver's `resolved` array).\n * @param overridesApplied - Canonical refs that an `overrides[]` entry pinned.\n * @param libraryAssets - Library-origin entries to merge in (optional).\n * @returns Complete `LockFile` ready for serialization (always `schema_version` 5).\n * @docLink packages/core/api-reference#build-lock-file\n */\nexport function buildLockFile(\n resolved: ProvenanceCandidate[],\n overridesApplied: Set<string>,\n libraryAssets: Record<string, LockEntry> = {},\n): LockFile {\n const assets: Record<string, LockEntry> = {};\n\n for (const c of resolved) {\n const canonicalRef = `${c.kind}:@${c.publisher}/${c.name}#${c.version}`;\n assets[canonicalRef] = {\n sha256: c.sha256,\n source: { url: c.sourceUrl, commit: c.commit },\n files: c.files,\n override_applied: overridesApplied.has(canonicalRef),\n ...lockRequires(c),\n ...(c.storeUrl ? { origin: \"store\" as const, store: c.storeUrl } : {}),\n };\n }\n return {\n // One schema version whatever the origins: a source-only lock used to flip between 3 and 4\n // when a library-origin entry came or went. CLIs that predate library origin gate on `=== 3`\n // and reject a 4 with the regenerate hint instead of crashing on `entry.source.url`.\n schema_version: LOCK_SCHEMA_VERSION,\n locked_at: new Date().toISOString(),\n assets: { ...assets, ...libraryAssets },\n sources: sourcesOfAssets(assets),\n };\n}\n\n/**\n * The `requires:` of the lock entry of a store candidate: its catalog row's requirements as\n * sorted, version-less `kind:@publisher/name` (a requirement without a publisher takes the\n * candidate's). `{}` when the store listed none.\n */\nfunction lockRequires(c: ProvenanceCandidate): Pick<LockEntry, \"requires\"> {\n const refs = new Set<string>();\n for (const dep of c.storeRequires ?? []) {\n // A bare `kind:name` inherits the declaring asset's publisher.\n const bare = /^([^:@#/\\s]+):([^@#/\\s][^#\\s]*)(#.*)?$/.exec(dep);\n const ref = parseAssetRefLoose(\n bare ? `${bare[1]}:@${c.publisher}/${bare[2]}${bare[3] ?? \"\"}` : dep,\n );\n if (!ref) continue;\n refs.add(`${ref.kind}:@${(ref.publisher ?? c.publisher).replace(/^@/, \"\")}/${ref.name}`);\n }\n return refs.size > 0 ? { requires: [...refs].sort() } : {};\n}\n\n/**\n * The top-level `sources:` list for a set of locked assets: one row per source URL and commit a\n * source asset points at (a store asset only for a URL no source asset points at), sorted by URL,\n * then commit (schema 5; schema 4 held one row per URL). Every entry keeps its own commit, so `add` (which merges into the previous lock) and `install` (which\n * rebuilds the lock from every declared asset) write the same rows whatever order the assets\n * arrived in, and assets of one repository locked at different commits are each backed by a row.\n */\nfunction sourcesOfAssets(assets: Record<string, LockEntry>): LockSourceEntry[] {\n const byRow = new Map<string, LockSourceEntry>();\n // A source asset is restored from the row's clone at its commit, so it sets a row. A store\n // asset carries its own commit and is fetched file by file: it sets a row only for a URL no\n // source asset points at.\n const entries = Object.values(assets).filter((e) => e.source);\n const sourceUrls = new Set(entries.filter((e) => e.origin !== \"store\").map((e) => e.source?.url));\n for (const entry of entries) {\n const source = entry.source as { url: string; commit: string };\n if (entry.origin === \"store\" && sourceUrls.has(source.url)) continue;\n const row = { url: source.url, commit: source.commit };\n const key = sourceRowKey(row);\n if (!byRow.has(key)) byRow.set(key, row);\n }\n return [...byRow.values()].sort(compareSourceRows);\n}\n\n/**\n * The `sources:` rows a clone has to match: those a source-origin asset points at, at that\n * commit. A row only store assets point at has no clone to pin: each store asset restores from\n * its own recorded commit, and a registered clone of that repo is the user's.\n */\nexport function cloneBackedSources(lock: LockFile): LockSourceEntry[] {\n const rows = new Set<string>();\n for (const entry of Object.values(lock.assets)) {\n if (entry.source && entry.origin !== \"store\") rows.add(sourceRowKey(entry.source));\n }\n return lock.sources.filter((s) => rows.has(sourceRowKey(s)));\n}\n\n/**\n * `lock` with the `sources:` row of every source URL an asset still points at re-derived from\n * the assets that remain, the way {@link buildLockFile} does. Call after dropping assets: a row\n * that kept the commit of a removed asset would differ from the one the next `install` builds,\n * and that `install` would rewrite a clean lock (p790). A source no asset points at keeps its\n * row, except the URLs in `droppedUrls` (the sources the removed assets pointed at): `install`\n * builds no row for a repo none of its assets uses, so `remove` of the last asset of a repo\n * drops it too.\n */\nexport function resyncLockSources(lock: LockFile, droppedUrls: Iterable<string> = []): LockFile {\n const live = sourcesOfAssets(lock.assets);\n const liveUrls = new Set(live.map((s) => s.url));\n const dropped = new Set(droppedUrls);\n const kept = lock.sources.filter((s) => !liveUrls.has(s.url) && !dropped.has(s.url));\n return {\n ...lock,\n sources: [...kept, ...live].sort(compareSourceRows),\n };\n}\n\n/**\n * Merge a freshly built lock into the previous one: a superset write that never\n * drops existing entries or the reconciler's `plugins` slice.\n *\n * A fresh entry (any origin: source, store or library) supersedes older entries\n * of the same kind/publisher/name (a different pinned version or commit), else\n * both versions would stay locked.\n *\n * @param prev - The lock currently on disk, or `null` when there is none.\n * @param fresh - The lock built for this install.\n */\nexport function mergeLockFile(prev: LockFile | null, fresh: LockFile): LockFile {\n if (!prev) return fresh;\n const assets = { ...prev.assets };\n for (const key of Object.keys(fresh.assets)) {\n const freshId = identityOfLockKey(key);\n if (!freshId) continue;\n for (const old of Object.keys(assets)) {\n if (identityOfLockKey(old) === freshId) delete assets[old];\n }\n }\n const presets = mergePresetRefs(prev.presets, fresh.presets);\n const mergedAssets = { ...assets, ...fresh.assets };\n // A source an asset still points at gets the rows its assets name (one per commit); a source\n // no asset points at keeps its previous row.\n const live = sourcesOfAssets(mergedAssets);\n const liveUrls = new Set(live.map((s) => s.url));\n const unused = new Map<string, LockSourceEntry>();\n for (const s of [...prev.sources, ...fresh.sources]) {\n if (!liveUrls.has(s.url)) unused.set(sourceRowKey(s), s);\n }\n return {\n ...fresh,\n assets: mergedAssets,\n sources: [...unused.values(), ...live].sort(compareSourceRows),\n // buildLockFile never emits a plugins slice — preserve the reconciler's.\n plugins: prev.plugins,\n presets,\n };\n}\n\n/**\n * Union of two `LockFile.presets` lists, one entry per preset identity (a fresh ref\n * supersedes an older version of the same preset), sorted; `undefined` when empty.\n */\nfunction mergePresetRefs(\n prev: string[] | undefined,\n fresh: string[] | undefined,\n): string[] | undefined {\n const byIdentity = new Map<string, string>();\n for (const ref of [...(prev ?? []), ...(fresh ?? [])]) {\n byIdentity.set(identityOfLockKey(ref) ?? ref, ref);\n }\n return byIdentity.size > 0 ? [...byIdentity.values()].sort() : undefined;\n}\n\n/** `kind:publisher/name` of a canonical lock key, or `undefined` when it does not parse. */\nfunction identityOfLockKey(key: string): string | undefined {\n const ref = parseAssetRefLoose(key);\n return ref ? `${ref.kind}:${ref.publisher}/${ref.name}` : undefined;\n}\n\n// ── Plugins slice ────────────────────────────────────────────────────────────\n\n/** Absolute path to a project's lock file. */\nfunction lockPathFor(projectDir: string): string {\n return join(projectDir, \"skaile.lock.yaml\");\n}\n\n/**\n * Read the `plugins` slice from a project's `skaile.lock.yaml`.\n *\n * Total — never throws on a missing/unparseable/legacy lock file (returns\n * `undefined`). The plugin-store reconciler folds this into its reconcile-hash\n * so a lock edit invalidates the hash even without a manifest change.\n *\n * @param projectDir - Project root containing `skaile.lock.yaml`\n * @returns The `plugins` record, or `undefined` when absent\n */\nexport function readPluginsLockSlice(\n projectDir: string,\n): Record<string, LockPluginEntry> | undefined {\n try {\n return readLock(lockPathFor(projectDir))?.plugins;\n } catch {\n // Legacy v1 lock — no usable plugins slice.\n return undefined;\n }\n}\n\n/**\n * Merge a `plugins` slice into a project's `skaile.lock.yaml`, preserving all\n * other fields. Creates a minimal v3 lock file when none exists (or the\n * existing one is an outdated schema that can't be read).\n *\n * @param projectDir - Project root containing `skaile.lock.yaml`\n * @param slice - The `plugins` record to persist\n */\nexport function writePluginsLockSlice(\n projectDir: string,\n slice: Record<string, LockPluginEntry>,\n): void {\n const lockPath = lockPathFor(projectDir);\n let existing: LockFile | null = null;\n try {\n existing = readLock(lockPath);\n } catch {\n existing = null; // outdated schema — overwrite with a fresh v3 shell\n }\n const next: LockFile = existing ?? {\n schema_version: 3,\n locked_at: new Date().toISOString(),\n assets: {},\n sources: [],\n };\n next.plugins = slice;\n writeLock(lockPath, next);\n}\n\n// ── Verification ─────────────────────────────────────────────────────────────\n\n/**\n * Result of verifying a lock file against the current repository state.\n * @docLink packages/core/api-reference#verify-result\n */\nexport interface VerifyResult {\n /** `true` when no drift or missing assets were found. */\n ok: boolean;\n /** Canonical refs whose content hash no longer matches. */\n drifted: string[];\n /** Canonical refs whose files cannot be found on disk. */\n missing: string[];\n}\n\n/**\n * Verify a v2 lock file against the current on-disk source clones.\n *\n * For each locked asset, resolve its source clone directory via `resolveCloneDir`\n * (URL → on-disk path), re-hash the recorded files, and compare the recomputed\n * composite against the locked `sha256`. Reports assets whose hash changed\n * (`drifted`) and assets whose files are missing (`missing`).\n *\n * @param lock - Previously generated v2 `LockFile`.\n * @param resolveCloneDir - Maps a source URL to its on-disk clone root (or null).\n * @returns `VerifyResult` indicating drift and missing assets.\n * @docLink packages/core/api-reference#verify-lock\n */\nexport function verifyLock(\n lock: LockFile,\n resolveCloneDir: (sourceUrl: string, entry: LockEntry) => string | null,\n): VerifyResult {\n const drifted: string[] = [];\n const missing: string[] = [];\n\n for (const [ref, entry] of Object.entries(lock.assets)) {\n // Library-origin entries have no clone to re-hash; installLocked verifies them\n // against the library itself.\n if (!entry.source) continue;\n const state = verifyLockEntry(entry, resolveCloneDir(entry.source.url, entry));\n if (state === \"missing\") missing.push(ref);\n else if (state === \"drifted\") drifted.push(ref);\n }\n\n return { ok: drifted.length === 0 && missing.length === 0, drifted, missing };\n}\n\n/**\n * Whether `cloneDir` (a source clone, a bundled tree, or `null` when there is none) holds the\n * files a source-origin lock entry lists with the bytes it recorded: `missing` when the\n * directory is absent or a listed file is, `drifted` when the rolled-up hash differs.\n */\nexport function verifyLockEntry(\n entry: LockEntry,\n cloneDir: string | null,\n): \"ok\" | \"drifted\" | \"missing\" {\n if (!cloneDir) return \"missing\";\n const recomputed: Array<{ path: string; sha256: string }> = [];\n for (const f of entry.files) {\n const abs = join(cloneDir, f.path);\n if (!existsSync(abs)) return \"missing\";\n recomputed.push({ path: f.path, sha256: computeHash(abs) });\n }\n return compositeSha256(recomputed) === entry.sha256 ? \"ok\" : \"drifted\";\n}\n","/**\n * Comment-preserving editor for `skaile.manifest.yaml` files.\n *\n * The publication counterpart to {@link WorkspaceYamlEditor}: it owns the\n * `publisher` / `version` / `assets[]` accessors that used to sit on the\n * workspace editor before the 2026-06-03 manifest/workspace file split. Uses the\n * `yaml` library's Document AST so untouched sections stay byte-identical.\n *\n * Usage:\n *\n * import { ManifestYamlEditor } from '@skaile/workspaces/core'\n *\n * const editor = ManifestYamlEditor.load('/project/skaile.manifest.yaml')\n * editor.setPublisher('skaile-ai')\n * editor.setAsset({ kind: 'skill', name: 'audit', root: 'skills/audit' })\n * editor.save()\n */\n\nimport { existsSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { Document, isMap, isScalar, isSeq, parseDocument, type YAMLMap } from \"yaml\";\nimport { ASSET_KEY_ORDER, type AssetEntry, orderedAsset } from \"./publish-manifest.js\";\n\n/** Matches `encodeSkaileManifest`, so editor-written files wrap like encoded ones. */\nconst STRINGIFY_OPTIONS = { lineWidth: 120 };\n\n/**\n * Comment-preserving editor for `skaile.manifest.yaml` files.\n * Create with `ManifestYamlEditor.load(filePath)` or `ManifestYamlEditor.create(filePath)`.\n * @docLink packages/core/publish-manifest#manifest-yaml-editor\n */\nexport class ManifestYamlEditor {\n readonly path: string;\n private doc: Document;\n\n private constructor(path: string, doc: Document) {\n this.path = path;\n this.doc = doc;\n }\n\n /** Load an existing skaile.manifest.yaml file. */\n static load(filePath: string): ManifestYamlEditor {\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n const raw = readFileSync(filePath, \"utf-8\");\n return new ManifestYamlEditor(filePath, parseDocument(raw));\n }\n\n /** Create a new empty document (for use when no file exists yet). */\n static create(filePath: string): ManifestYamlEditor {\n return new ManifestYamlEditor(filePath, new Document({}));\n }\n\n /**\n * Why this document cannot be edited safely, or `undefined` when it can. Editing\n * a document that failed to parse would clobber what the author wrote.\n */\n problem(): string | undefined {\n const { errors, contents } = this.doc;\n if (errors.length > 0) return errors[0]?.message;\n if (contents != null && !isMap(contents)) return \"the root must be a mapping\";\n return undefined;\n }\n\n /**\n * Write the document back to disk, preserving comments and formatting. The file is replaced in\n * one step, so a process that reads it while another saves never sees a half-written manifest.\n */\n save(): void {\n const target = existsSync(this.path) ? realpathSync(this.path) : this.path;\n const tmp = `${target}.${process.pid}.tmp`;\n writeFileSync(tmp, this.toString());\n try {\n renameSync(tmp, target);\n } catch (err) {\n rmSync(tmp, { force: true });\n throw err;\n }\n }\n\n /** Return the serialized YAML string without writing to disk. */\n toString(): string {\n return this.doc.toString(STRINGIFY_OPTIONS);\n }\n\n // ── Publisher / version / repo-level defaults ───────────────────────────────\n\n /** Get the `publisher:` field. */\n getPublisher(): string | undefined {\n const v = this.doc.get(\"publisher\");\n return v != null ? String(v) : undefined;\n }\n\n /** Set the `publisher:` field. A newly added key goes first, where the canonical encoding puts it. */\n setPublisher(p: string): void {\n if (!this.doc.has(\"publisher\") && isMap(this.doc.contents)) {\n this.doc.contents.items.unshift(this.doc.createPair(\"publisher\", p));\n return;\n }\n this.doc.set(\"publisher\", p);\n }\n\n /** Get the `version:` field. */\n getVersion(): string | undefined {\n const v = this.doc.get(\"version\");\n return v != null ? String(v) : undefined;\n }\n\n /** Set the `version:` field. */\n setVersion(v: string): void {\n this.doc.set(\"version\", v);\n }\n\n /** Get the repo-level `license:` default. */\n getLicense(): string | undefined {\n const v = this.doc.get(\"license\");\n return v != null ? String(v) : undefined;\n }\n\n /** Set the repo-level `license:` default. */\n setLicense(v: string): void {\n this.doc.set(\"license\", v);\n }\n\n /** Get the repo-level `homepage:` default. */\n getHomepage(): string | undefined {\n const v = this.doc.get(\"homepage\");\n return v != null ? String(v) : undefined;\n }\n\n /** Set the repo-level `homepage:` default. */\n setHomepage(v: string): void {\n this.doc.set(\"homepage\", v);\n }\n\n // ── Assets ──────────────────────────────────────────────────────────────────\n\n /** Get all `assets:` entries. */\n getAssets(): AssetEntry[] {\n const node = this.doc.get(\"assets\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as AssetEntry[];\n }\n\n /** Declare an empty `assets:` inventory when the document has none. */\n ensureAssets(): void {\n if (!this.doc.has(\"assets\")) this.doc.set(\"assets\", this.doc.createNode([]));\n }\n\n /**\n * Add or update an asset entry, matched by `kind` + `name`. An update rewrites\n * only the fields that changed, so comments on the entry survive; a new field\n * lands at its canonical position, where `encodeSkaileManifest` would put it.\n */\n setAsset(entry: AssetEntry): void {\n const node = this.doc.get(\"assets\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"assets\", this.doc.createNode([orderedAsset(entry)]));\n return;\n }\n for (const item of node.items) {\n if (!isMap(item) || item.get(\"kind\") !== entry.kind || item.get(\"name\") !== entry.name) {\n continue;\n }\n const current = item.toJSON() as Record<string, unknown>;\n const next = orderedAsset(entry);\n for (const key of Object.keys(current)) {\n if (!(key in next)) item.delete(key);\n }\n for (const [key, value] of Object.entries(next)) {\n if (isDeepStrictEqual(current[key], value)) continue;\n if (item.has(key)) item.set(key, this.doc.createNode(value));\n else insertAtCanonicalPosition(item, this.doc.createPair(key, value));\n }\n return;\n }\n // An empty `assets: []` would otherwise force every entry into flow style.\n if (node.items.length === 0) node.flow = false;\n node.add(this.doc.createNode(orderedAsset(entry)));\n }\n\n /** Remove an asset entry by kind + name. Returns true when removed. */\n removeAsset(kind: string, name: string): boolean {\n const node = this.doc.get(\"assets\", true);\n if (!node || !isSeq(node)) return false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (\n isMap(item) &&\n (item as YAMLMap).get(\"kind\") === kind &&\n (item as YAMLMap).get(\"name\") === name\n ) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Rename the entry `kind` + `from` to `to` in place (position, comments and every other\n * field stay). Returns true when renamed.\n */\n renameAsset(kind: string, from: string, to: string): boolean {\n const node = this.doc.get(\"assets\", true);\n if (!node || !isSeq(node)) return false;\n for (const item of node.items) {\n if (isMap(item) && item.get(\"kind\") === kind && item.get(\"name\") === from) {\n item.set(\"name\", to);\n return true;\n }\n }\n return false;\n }\n}\n\n/** Position of `key` in the canonical asset key order; unknown keys sort last. */\nfunction assetKeyRank(key: unknown): number {\n const i = ASSET_KEY_ORDER.indexOf(String(isScalar(key) ? key.value : key) as never);\n return i < 0 ? ASSET_KEY_ORDER.length : i;\n}\n\n/** Insert `pair` before the first existing key that sorts after it. */\nfunction insertAtCanonicalPosition(item: YAMLMap, pair: YAMLMap[\"items\"][number]): void {\n const rank = assetKeyRank(pair.key);\n const at = item.items.findIndex((p) => assetKeyRank(p.key) > rank);\n if (at < 0) item.items.push(pair);\n else item.items.splice(at, 0, pair);\n}\n","/**\n * Agent Skills (agentskills.io) open-standard conformance lint for SKILL.md\n * frontmatter — pure, advisory, never a hard gate.\n * See devlog: 2026-06-21-agentskills-conformance-shipped.\n * @docLink core/conformance\n */\n\n/** A single agentskills.io conformance finding. */\nexport interface ConformanceFinding {\n /** `error` = hard standard violation; `warn` = portability risk. */\n level: \"error\" | \"warn\";\n /** Frontmatter field the finding concerns (e.g. \"name\", \"metadata.tags\"). */\n field: string;\n /** Human-readable, ready to print after a file path. */\n message: string;\n}\n\n/** Options for {@link checkAgentSkillConformance}. */\nexport interface ConformanceOptions {\n /**\n * Parent directory name, for the standard's `name === <dir>` rule.\n * Omit to skip that check (e.g. when validating a detached frontmatter blob).\n */\n dirName?: string;\n}\n\n// Standard limits — see https://agentskills.io/specification.\nconst NAME_MAX = 64;\nconst DESCRIPTION_MAX = 1024;\nconst COMPATIBILITY_MAX = 500;\n\n/** True for the structured `metadata` values the skaile manifest schema itself defines. */\nfunction isSkaileMetadataShape(key: string, value: unknown): boolean {\n if (key === \"tags\" || key === \"requires\") {\n return Array.isArray(value) && value.every((v) => typeof v === \"string\");\n }\n if (key === \"prerequisites\") {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n }\n return false;\n}\n\n/**\n * Check a SKILL.md frontmatter object against the Agent Skills open standard.\n * Returns findings only — the caller maps severity to exit codes.\n *\n * @param frontmatter Parsed SKILL.md YAML frontmatter.\n * @param opts Optional context (`dirName` enables the name==dir rule).\n * @returns Zero or more {@link ConformanceFinding}s.\n */\nexport function checkAgentSkillConformance(\n frontmatter: Record<string, unknown>,\n opts: ConformanceOptions = {},\n): ConformanceFinding[] {\n const out: ConformanceFinding[] = [];\n const name = frontmatter.name;\n\n if (typeof name === \"string\") {\n if (name.length > NAME_MAX) {\n out.push({\n level: \"error\",\n field: \"name\",\n message: `name is ${name.length} chars (standard max ${NAME_MAX})`,\n });\n }\n if (opts.dirName !== undefined && name !== opts.dirName) {\n out.push({\n level: \"warn\",\n field: \"name\",\n message: `name \"${name}\" does not match parent directory \"${opts.dirName}\" (standard requires equality)`,\n });\n }\n }\n\n const description = frontmatter.description;\n if (typeof description === \"string\" && description.length > DESCRIPTION_MAX) {\n out.push({\n level: \"error\",\n field: \"description\",\n message: `description is ${description.length} chars (standard max ${DESCRIPTION_MAX})`,\n });\n }\n\n const compatibility = frontmatter.compatibility;\n if (typeof compatibility === \"string\" && compatibility.length > COMPATIBILITY_MAX) {\n out.push({\n level: \"error\",\n field: \"compatibility\",\n message: `compatibility is ${compatibility.length} chars (standard max ${COMPATIBILITY_MAX})`,\n });\n }\n\n // The standard defines metadata as a string→string map. skaile nests values here by design:\n // `tags` and `requires` are arrays of strings and `prerequisites` is an object (the resolver\n // format), as the manifest schema requires (p1027). Those are not findings; any other\n // non-string value is a portability WARN, never an error, never rewritten.\n const metadata = frontmatter.metadata;\n if (metadata !== undefined && typeof metadata === \"object\" && metadata !== null) {\n for (const [k, v] of Object.entries(metadata as Record<string, unknown>)) {\n if (typeof v === \"string\" || isSkaileMetadataShape(k, v)) continue;\n out.push({\n level: \"warn\",\n field: `metadata.${k}`,\n message: `metadata.${k} is ${Array.isArray(v) ? \"an array\" : typeof v}, not a string — non-portable to strict skills-ref consumers`,\n });\n }\n }\n\n const allowedTools = frontmatter[\"allowed-tools\"];\n if (allowedTools !== undefined && typeof allowedTools !== \"string\") {\n out.push({\n level: \"warn\",\n field: \"allowed-tools\",\n message: \"allowed-tools must be a space-separated string\",\n });\n }\n\n return out;\n}\n","/**\n * The one per-asset check pipeline behind `library create`, `asset import`, `asset migrate`,\n * `skaile validate`, `library publish` (plan and `--dry-run`) and `library index`.\n *\n * A command names itself and gets back what fails the asset and what only warns. It never\n * keeps a check list of its own: {@link CHECK_SETS} is the table of which stages run for which\n * command, so the same asset gets the same verdict in all six (ADR 0013).\n *\n * The stages that need only core data run here (identity, untouched scaffold, agentskills.io\n * conformance). The stages that need the kind registry, the semver rule of the indexer or the\n * flow and agent definition parsers come in as {@link CheckDeps}: they live in layers above core.\n *\n * @docLink packages/core/concepts#check-asset\n */\n\nimport {\n FLOW_DESCRIPTION_PLACEHOLDER,\n FLOW_NODE_INSTRUCTION_PLACEHOLDER,\n isScaffoldBody,\n PRESET_DESCRIPTION_PLACEHOLDER,\n PRESET_ITEM_PLACEHOLDER_REF,\n SKILL_DESCRIPTION_PLACEHOLDER_PREFIX,\n} from \"@skaile/workspaces/types/manifests\";\nimport { checkAgentSkillConformance } from \"./conformance.js\";\nimport { ASSET_NAME_HINT, isValidAssetName, parseAssetRef, parsePublisher } from \"./models.js\";\n\n/** The commands that read an asset and give a verdict on it. */\nexport type AssetCommand = \"create\" | \"import\" | \"migrate\" | \"validate\" | \"publish\" | \"index\";\n\n/**\n * One step of the pipeline. Run in this order:\n * - `identity`: the asset name (or flow id) and the `publisher:` of the manifest;\n * - `file`: the manifest file name against the identity (a flow id must match its file);\n * - `version`: the declared version is semver;\n * - `schema`: the kind's manifest schema;\n * - `scaffold`: the untouched `library create` content (placeholder description, body, node, item);\n * - `references`: the refs the asset names (`requires:`, preset items);\n * - `definition`: the engine's own parser (flow definition, agent definition and files);\n * - `conformance`: agentskills.io findings and keys nothing reads.\n */\nexport type CheckStage =\n | \"identity\"\n | \"file\"\n | \"version\"\n | \"schema\"\n | \"scaffold\"\n | \"references\"\n | \"definition\"\n | \"conformance\";\n\n/**\n * The check set of every command. All six run every stage: a passing `validate` means the asset\n * can be published, `library index` keeps out what `validate` fails, and `create`, `import` and\n * `migrate` refuse what none of them would accept. A command that must skip a stage is a visible\n * difference in this table, not a second list in the command.\n */\nconst ALL_STAGES: readonly CheckStage[] = [\n \"identity\",\n \"file\",\n \"version\",\n \"schema\",\n \"scaffold\",\n \"references\",\n \"definition\",\n \"conformance\",\n];\n\nexport const CHECK_SETS: Readonly<Record<AssetCommand, readonly CheckStage[]>> = {\n create: ALL_STAGES,\n import: ALL_STAGES,\n migrate: ALL_STAGES,\n validate: ALL_STAGES,\n publish: ALL_STAGES,\n index: ALL_STAGES,\n};\n\n/** One finding, printed as `<file> [<tag>] — <text>`. */\nexport interface AssetFinding {\n /** `skill conformance` for agentskills.io findings, else the asset kind. */\n tag: string;\n text: string;\n /** Stable code of the refusal, when it has one (`invalid_publisher`, `scaffold_placeholder`). */\n code?: string;\n /** What to write instead, when the finding has one fix. */\n fix?: string;\n /** `true` for an agentskills.io conformance finding (`--strict-conformance` escalates these). */\n conformance?: boolean;\n /** `true` for the untouched `library create` content: an error in every command. */\n scaffoldBody?: true;\n /**\n * Set on a `requires:` entry no registered library holds: the canonical\n * `kind:@publisher/name` the publish plan asks the store about.\n */\n unheldRef?: string;\n}\n\n/** What {@link checkAsset} returns: what fails the asset, and what only warns. */\nexport interface AssetCheckResult {\n /** Findings that fail the asset in every command: exit 1, the asset is not written or published. */\n errors: AssetFinding[];\n /** Findings printed as warnings; exit code unchanged (`strictConformance` escalates conformance ones). */\n warnings: AssetFinding[];\n}\n\n/** The asset the pipeline looks at. */\nexport interface CheckInput {\n kind: string;\n /** Parsed manifest (frontmatter for markdown kinds, the document for YAML). */\n parsed: Record<string, unknown>;\n /** The markdown body after the frontmatter (`undefined` for YAML kinds). */\n body: string | undefined;\n /** The manifest's parent folder name (enables the skill name == dir rule). */\n dirName: string;\n /** Base name of the manifest file. */\n fileName?: string;\n /** The manifest text, to show a yaml-number version as the author wrote it. */\n rawText?: string;\n}\n\n/** What a stage supplied by a layer above core returns: errors only, or errors and warnings. */\nexport type StageFindings = AssetFinding[] | { errors: AssetFinding[]; warnings: AssetFinding[] };\n\n/** A stage implemented above core. */\nexport type StageFn = (input: CheckInput) => StageFindings;\n\n/** The stages core cannot implement: the registry, semver rule and definition parsers live above it. */\nexport type CheckDeps = Partial<\n Record<Exclude<CheckStage, \"identity\" | \"scaffold\" | \"conformance\">, StageFn>\n>;\n\n/** Options of {@link checkAsset}. */\nexport interface CheckOptions {\n /** `--strict-conformance`: agentskills.io findings are errors, not warnings. */\n strictConformance?: boolean;\n}\n\n/** Frontmatter keys older docs mention that no release reads, for any kind (`validate` names them). */\nconst UNUSED_KEYS = [\"reads_from\", \"writes_to\"] as const;\n\n/** A finding of the asset kind with no extra fields. */\nfunction finding(kind: string, text: string, extra: Partial<AssetFinding> = {}): AssetFinding {\n return { tag: kind, text, ...extra };\n}\n\n/**\n * The asset name (flow: id) against the one name rule, and the `publisher:` of the manifest\n * against the one publisher grammar ({@link parsePublisher}): a leading `@` is dropped, anything\n * else that is not a bare slug (an empty string, a number, uppercase, a slash) is refused with\n * the sentence every other publisher input gets. A `publisher:` with no value is no publisher.\n */\nexport function identityFindings(input: CheckInput): AssetFinding[] {\n const { kind, parsed } = input;\n const out: AssetFinding[] = [];\n let publisher: string | undefined;\n if (parsed.publisher !== undefined && parsed.publisher !== null) {\n const res = parsePublisher(parsed.publisher);\n if (res.ok) publisher = res.publisher;\n else out.push(finding(kind, res.message, { code: res.code, fix: res.fix }));\n }\n const identity = kind === \"flow\" ? parsed.id : parsed.name;\n if (typeof identity !== \"string\" || identity.length === 0) return out;\n if (publisher !== undefined) {\n try {\n parseAssetRef(`${kind}:@${publisher}/${identity}`);\n } catch (e) {\n out.push(\n finding(kind, e instanceof Error ? e.message : String(e), { code: \"invalid_asset_name\" }),\n );\n }\n } else if (!isValidAssetName(identity)) {\n out.push(\n finding(\n kind,\n `invalid asset ${kind === \"flow\" ? \"id\" : \"name\"} \"${identity}\" — ${ASSET_NAME_HINT}`,\n { code: \"invalid_asset_name\" },\n ),\n );\n }\n return out;\n}\n\n/**\n * The untouched `library create flow` / `library create preset` content: a flow with no nodes\n * and the example preset item can never be consumed, so they fail like the `TODO:` description\n * of every other kind. Also matches the generic descriptions older releases scaffolded.\n */\nfunction scaffoldDefinitionErrors(kind: string, parsed: Record<string, unknown>): string[] {\n const out: string[] = [];\n if (kind === \"flow\") {\n if (parsed.description === FLOW_DESCRIPTION_PLACEHOLDER) {\n out.push(\"description is still the scaffold placeholder; say what the flow does\");\n }\n if (parsed.nodes === undefined) {\n out.push(\"nodes is missing; a flow needs at least one node\");\n } else if (Array.isArray(parsed.nodes) && parsed.nodes.length === 0) {\n out.push(\"nodes is still the scaffold placeholder (nodes: []); add the flow's nodes\");\n } else if (Array.isArray(parsed.nodes)) {\n // The example node `library create flow` writes: its instruction is the author's to write.\n for (const node of parsed.nodes) {\n if (typeof node !== \"object\" || node === null || !(\"run\" in node)) continue;\n const run = node.run;\n if (typeof run !== \"object\" || run === null || !(\"instruction\" in run)) continue;\n if (run.instruction === FLOW_NODE_INSTRUCTION_PLACEHOLDER) {\n const id = \"id\" in node ? String(node.id) : \"?\";\n out.push(\n `node \"${id}\" instruction is still the scaffold placeholder; say what the step does`,\n );\n }\n }\n }\n }\n if (kind === \"preset\") {\n if (parsed.description === PRESET_DESCRIPTION_PLACEHOLDER) {\n out.push(\n `description is still the scaffold placeholder (\"${PRESET_DESCRIPTION_PLACEHOLDER}\"); say what the preset does`,\n );\n }\n const items = Array.isArray(parsed.items) ? parsed.items : [];\n const placeholderItem = items.some((item) => {\n const ref = typeof item === \"string\" ? item : (item as { ref?: unknown } | null)?.ref;\n return typeof ref === \"string\" && ref.trim() === PRESET_ITEM_PLACEHOLDER_REF;\n });\n if (placeholderItem) {\n out.push(\n `item ${PRESET_ITEM_PLACEHOLDER_REF} is still the scaffold placeholder; replace it with the preset's real items`,\n );\n }\n }\n return out;\n}\n\n/**\n * Everything `library create` writes for the author to replace, for all six scaffolded kinds:\n * the `TODO:` description (the skill schema says it too, in the same words), the untouched\n * flow nodes and preset item, and the placeholder body. An error in every command: a passing\n * check means the asset can be published.\n */\nfunction scaffoldFindings(input: CheckInput): AssetFinding[] {\n const { kind, parsed, body } = input;\n const out: AssetFinding[] = [];\n const scaffold = (text: string, extra: Partial<AssetFinding> = {}): void => {\n out.push(finding(kind, text, { code: \"scaffold_placeholder\", ...extra }));\n };\n const description = parsed.description;\n if (\n kind !== \"skill\" &&\n typeof description === \"string\" &&\n description.trim().startsWith(SKILL_DESCRIPTION_PLACEHOLDER_PREFIX)\n ) {\n scaffold(\n `description: description is still the scaffold placeholder (${SKILL_DESCRIPTION_PLACEHOLDER_PREFIX} …) — say what the ${kind} does and when to use it`,\n );\n }\n for (const text of scaffoldDefinitionErrors(kind, parsed)) scaffold(text);\n if (isScaffoldBody(kind, body)) {\n const noun = kind === \"skill\" ? \"skill prompt\" : kind;\n scaffold(`body is still the scaffold placeholder; write the ${noun}`, { scaffoldBody: true });\n }\n return out;\n}\n\n/** agentskills.io findings (skills only) and keys no release reads (every kind): warnings. */\nfunction conformanceFindings(input: CheckInput): AssetFinding[] {\n const { kind, parsed, dirName } = input;\n const out: AssetFinding[] = [];\n if (kind === \"skill\") {\n for (const f of checkAgentSkillConformance(parsed, { dirName })) {\n out.push({\n tag: \"skill conformance\",\n text: `${f.field}: ${f.message}`,\n code: \"skill_conformance\",\n conformance: true,\n });\n }\n }\n // Keys no release reads: the file passes the schema (it is loose) but the key does nothing.\n for (const key of UNUSED_KEYS) {\n if (key in parsed) {\n out.push(\n finding(\n kind,\n `${key}: unknown key; nothing in skaile reads it, so it has no effect. Remove it`,\n { code: \"unused_key\", conformance: false },\n ),\n );\n }\n }\n return out;\n}\n\n/**\n * Run the check set of `command` over one asset.\n *\n * @param command The command asking; selects the stages from {@link CHECK_SETS}.\n * @param input The parsed manifest and where it lives.\n * @param deps The stages implemented above core (registry schema, semver, definition parsers).\n * A stage with no implementation finds nothing.\n * @param opts `strictConformance` makes the agentskills.io findings errors.\n */\nexport function checkAsset(\n command: AssetCommand,\n input: CheckInput,\n deps: CheckDeps,\n opts: CheckOptions = {},\n): AssetCheckResult {\n const errors: AssetFinding[] = [];\n const warnings: AssetFinding[] = [];\n const take = (found: StageFindings | undefined): void => {\n if (found === undefined) return;\n if (Array.isArray(found)) {\n errors.push(...found);\n } else {\n errors.push(...found.errors);\n warnings.push(...found.warnings);\n }\n };\n for (const stage of CHECK_SETS[command]) {\n switch (stage) {\n case \"identity\":\n errors.push(...identityFindings(input));\n break;\n case \"scaffold\":\n errors.push(...scaffoldFindings(input));\n break;\n case \"conformance\":\n warnings.push(...conformanceFindings(input));\n break;\n default:\n take(deps[stage]?.(input));\n }\n }\n if (!opts.strictConformance) return { errors, warnings };\n const escalated = warnings.filter((f) => f.conformance);\n return {\n errors: [...errors, ...escalated],\n warnings: warnings.filter((f) => !f.conformance),\n };\n}\n\n/**\n * Folders `skaile validate` never walks (`.git`, dependencies, build output, per-project state and\n * the harness copies `skaile add` deploys). One list for the walk and for every path a command\n * accepts inside a library, so a path one command takes is read by the others.\n */\nexport const VALIDATE_SKIP_DIRS: ReadonlySet<string> = new Set([\n \"node_modules\",\n \"dist\",\n \".git\",\n \".skaile\",\n \"__pycache__\",\n \".claude\",\n \".codex\",\n \".omp\",\n]);\n\n/**\n * Why a path inside a library cannot hold an asset: one of its folders is one `validate` and\n * `library index` skip, so the asset would be listed but never checked (p14). `undefined` for a\n * path the tools read.\n *\n * @param rel Path relative to the library root (`/` or the platform separator).\n */\nexport function assetPathProblem(rel: string): string | undefined {\n const hit = rel.split(/[\\\\/]+/).find((segment) => VALIDATE_SKIP_DIRS.has(segment));\n if (hit === undefined) return undefined;\n return `\"${hit}\" is a folder validate and library index skip (${[...VALIDATE_SKIP_DIRS].join(\", \")}): an asset in it would never be checked. Choose another folder.`;\n}\n","/**\n * Patch operations — extract, generate, apply patches for skill improvement.\n *\n * Patches allow editing deployed assets from remote repos and contributing\n * changes back upstream via PR.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { CatalogEntry } from \"./models.js\";\n\n/**\n * Copy an asset's source directory into a patch working directory for editing.\n *\n * @param entry - The catalog entry to extract\n * @param patchDir - Base directory where extracted copies are placed\n * @returns Absolute path to the extracted copy (`<patchDir>/<kind>-<name>`)\n * @docLink packages/core/api-reference#extract-for-patch\n */\nexport function extractForPatch(entry: CatalogEntry, patchDir: string): string {\n const ref = `${entry.kind}-${entry.name}`;\n const dest = join(patchDir, ref);\n mkdirSync(dest, { recursive: true });\n\n // Copy the asset's source directory (or file) to the patch dir\n const sourceDir = dirname(entry.source);\n const sourceName = basename(entry.source);\n\n // If source is a file in a directory (e.g., skills/overview/SKILL.md), copy the whole dir\n if (existsSync(sourceDir)) {\n cpSync(sourceDir, dest, { recursive: true });\n }\n\n return dest;\n}\n\n/**\n * Generate a unified diff between an original and patched directory using `diff -ruN`.\n *\n * @param originalDir - Unmodified copy of the asset directory\n * @param patchedDir - Modified copy of the asset directory\n * @returns Patch content string, or `null` if there are no differences (or on error)\n * @docLink packages/core/api-reference#generate-patch\n */\nexport function generatePatch(originalDir: string, patchedDir: string): string | null {\n const r = spawnSync(\"diff\", [\"-ruN\", originalDir, patchedDir], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n // diff returns 0 if no differences, 1 if differences, 2 on error\n if (r.status === 0) return null; // no differences\n if (r.status === 1) return r.stdout;\n return null; // error\n}\n\n/**\n * Apply a unified diff patch file to a directory using `patch -p1`.\n *\n * @param targetDir - Directory to apply the patch to\n * @param patchFile - Path to the `.patch` file\n * @returns `true` on success, `false` if the patch file is missing or the command fails\n * @docLink packages/core/api-reference#apply-patch\n */\nexport function applyPatch(targetDir: string, patchFile: string): boolean {\n if (!existsSync(patchFile)) return false;\n const r = spawnSync(\"patch\", [\"-p1\", \"-d\", targetDir, \"-i\", patchFile], {\n stdio: \"pipe\",\n });\n return r.status === 0;\n}\n\n/**\n * Return the paths of all `.patch` files in a directory.\n *\n * @param patchDir - Directory to scan for `.patch` files\n * @returns Array of absolute paths; empty array when `patchDir` does not exist\n * @docLink packages/core/api-reference#list-patches\n */\nexport function listPatches(patchDir: string): string[] {\n if (!existsSync(patchDir)) return [];\n return readdirSync(patchDir)\n .filter((f) => f.endsWith(\".patch\"))\n .map((f) => join(patchDir, f));\n}\n\n/**\n * Write patch content to a file, creating parent directories as needed.\n *\n * @param patchPath - Destination file path (including `.patch` extension)\n * @param content - Unified diff content to write\n * @docLink packages/core/api-reference#save-patch\n */\nexport function savePatch(patchPath: string, content: string): void {\n mkdirSync(dirname(patchPath), { recursive: true });\n writeFileSync(patchPath, content, \"utf8\");\n}\n\n/**\n * Read the content of a patch file.\n *\n * @param patchPath - Path to the `.patch` file\n * @returns File content as a string, or `null` if the file does not exist\n * @docLink packages/core/api-reference#read-patch\n */\nexport function readPatch(patchPath: string): string | null {\n if (!existsSync(patchPath)) return null;\n return readFileSync(patchPath, \"utf8\");\n}\n","/**\n * Reading and writing `providers.yml` — the two on-disk layers of the AI\n * provider registry (§1.5).\n *\n * `~/.skaile/providers.yml` is the default home for endpoint definitions;\n * `<workspace>/.skaile/providers.yml` overrides it per project and is\n * gitignored by `skaile init`. Higher layers (CLI/runtime overrides and the\n * control-plane session layer) never touch disk — callers pass them to\n * {@link loadProviderRegistry} as extra layers.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.5, §2.1\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse, stringify } from \"yaml\";\nimport { globalSkaileDir } from \"./cache-paths.js\";\nimport {\n type AIProviderDiagnostic,\n type AIProviderRegistryDocument,\n type AIProviderRegistryLayer,\n type AIProviderRegistryPatch,\n type AIProviderRegistrySource,\n type MergedAIProviderRegistry,\n mergeRegistries,\n validateMergedRegistry,\n validateRegistry,\n} from \"./provider-registry.js\";\n\n/** The registry filename in both layers. */\nexport const PROVIDERS_FILENAME = \"providers.yml\";\n\nconst SKAILE_DIR = \".skaile\";\n\n/** `~/.skaile/providers.yml` — honours `$SKAILE_HOME`. */\nexport function userProviderRegistryPath(): string {\n return join(globalSkaileDir(), PROVIDERS_FILENAME);\n}\n\n/** `<projectDir>/.skaile/providers.yml`. */\nexport function workspaceProviderRegistryPath(projectDir: string): string {\n return join(resolve(projectDir), SKAILE_DIR, PROVIDERS_FILENAME);\n}\n\n/** One loaded registry file. */\nexport interface ProviderRegistryFile {\n /** Layer the file feeds. */\n layer: \"user\" | \"workspace\";\n path: string;\n exists: boolean;\n /**\n * The layer this file contributes. Entries may be partial: a file that names\n * `base_url` alone overrides that one field (§1.5). Empty when the file is\n * absent or every entry was malformed.\n */\n document: AIProviderRegistryDocument;\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Read one registry file as **one layer** of the §1.5 stack. A missing file is\n * not an error — it is an empty layer. A malformed one yields diagnostics,\n * never an exception.\n *\n * Only the checks that stand on their own run here (types, URLs, the\n * credential grammar, literal secrets); whether an entry is *complete* is\n * decided on the merged registry by {@link loadProviderRegistry}, because the\n * layer below may be the one that names its `kind`.\n */\nexport function loadProviderRegistryFile(\n filePath: string,\n layer: \"user\" | \"workspace\",\n): ProviderRegistryFile {\n const empty: AIProviderRegistryDocument = { version: 1, providers: {} };\n if (!existsSync(filePath)) {\n return { layer, path: filePath, exists: false, document: empty, diagnostics: [] };\n }\n let raw: unknown;\n try {\n raw = parse(readFileSync(filePath, \"utf-8\"));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n layer,\n path: filePath,\n exists: true,\n document: empty,\n diagnostics: [\n {\n code: \"yaml_parse_error\",\n severity: \"error\",\n path: \"\",\n message: `${filePath}: ${message}`,\n },\n ],\n };\n }\n const { document, diagnostics } = validateRegistry(raw, { source: filePath, layer });\n return { layer, path: filePath, exists: true, document, diagnostics };\n}\n\n/**\n * Write a registry document, creating `.skaile/` when needed.\n *\n * The document is serialized verbatim: the file holds references, never\n * secrets, so there is nothing to redact — and {@link validateRegistry} is the\n * gate that keeps it that way. Callers validate before writing.\n *\n * @returns the path written.\n */\nexport function saveProviderRegistryFile(\n filePath: string,\n document: AIProviderRegistryDocument,\n): string {\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, stringify({ version: 1, providers: document.providers }));\n return filePath;\n}\n\n/** Options for {@link loadProviderRegistry}. */\nexport interface LoadProviderRegistryOptions {\n /** Workspace whose `.skaile/providers.yml` is layered on top of the user file. */\n projectDir?: string;\n /**\n * Layers that do not come from these two files — the catalog layer from\n * `bridge/src/provider-catalog.ts`, CLI/runtime overrides, and the\n * control-plane session layer. Precedence follows each layer's id, not this\n * array's order.\n */\n extraLayers?: AIProviderRegistryLayer[];\n}\n\n/** The merged registry plus the files it came from. */\nexport interface LoadedProviderRegistry {\n /** Merged and gated: every entry here is complete. */\n registry: MergedAIProviderRegistry;\n /**\n * The same merge **before** the gate: every configured entry, complete or\n * not, as the layers left it. This is what a caller that has to see the\n * configured entries in order to build another layer reads — the catalog\n * layer expands the presets these entries name, and an entry whose `kind`\n * comes from its preset is still incomplete here, so it is absent from\n * `registry`.\n */\n patches: AIProviderRegistryPatch;\n files: ProviderRegistryFile[];\n /**\n * Every file's diagnostics in layer order, then the merge's own — an entry\n * no layer completed is reported here, naming the files that fed it.\n */\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Load `~/.skaile/providers.yml` and, when a project directory is given,\n * `<projectDir>/.skaile/providers.yml`, then merge them with any extra layers\n * per §1.5 and gate the result.\n *\n * Merge *then* validate: each file is read as a patch, so a workspace entry\n * that sets one field of an entry the user file defines is applied over it\n * rather than dropped for being incomplete on its own.\n */\nexport function loadProviderRegistry(\n options: LoadProviderRegistryOptions = {},\n): LoadedProviderRegistry {\n const files: ProviderRegistryFile[] = [\n loadProviderRegistryFile(userProviderRegistryPath(), \"user\"),\n ];\n if (options.projectDir) {\n files.push(\n loadProviderRegistryFile(workspaceProviderRegistryPath(options.projectDir), \"workspace\"),\n );\n }\n\n const layers: AIProviderRegistryLayer[] = files.map((file) => ({\n layer: file.layer,\n providers: file.document.providers,\n }));\n const extraLayers = options.extraLayers ?? [];\n const merged = mergeRegistries([...layers, ...extraLayers]);\n const sources: AIProviderRegistrySource[] = [\n ...files.map((file) => ({ label: file.path, providers: file.document.providers })),\n ...extraLayers.map((layer) => ({ label: `${layer.layer} layer`, providers: layer.providers })),\n ];\n const { registry, diagnostics } = validateMergedRegistry(merged, { sources });\n\n return {\n registry,\n patches: merged.providers,\n files,\n diagnostics: [...files.flatMap((file) => file.diagnostics), ...diagnostics],\n };\n}\n","/**\n * User-layer runtime settings.\n *\n * SkaileSettings represents the personal, machine-specific overrides stored in\n * .skaile/settings.json (gitignored). Project-level defaults (framework, agent\n * definition, resource connections, hooks) belong in skaile.yaml via SkWorkspaceConfig.\n *\n * Resolution order (highest priority first):\n * 1. CLI flags / API overrides\n * 2. `PREFERRED_MODEL`\n * 3. .skaile/settings.json (project-local, walking upward)\n * 4. ~/.skaile/settings.json (user global)\n * 5. skaile.yaml defaults: (via resolveSkWorkspaceConfig — no duplicate YAML parser)\n * 6. Built-in SETTINGS_DEFAULTS\n *\n * `harness` is the exception: `skaile.yaml` alone owns the harness of a project,\n * so a settings file's `harness` applies only when `skaile.yaml` names none.\n *\n * Endpoints and credentials are NOT here: they are AI provider registry\n * entries in `~/.skaile/providers.yml` (`provider-registry-files.ts`). A\n * settings file that still carries the old `apiKeys{}` map is rejected on\n * load with the `skaile providers add` command that replaces it.\n */\n\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { globalSkaileDir } from \"./cache-paths.js\";\nimport { DEFAULT_HARNESS_ID } from \"./framework.js\";\nimport { type HarnessName, harnessNameForHarnessId } from \"./harness-targets.js\";\nimport { resolveSkWorkspaceConfig, type SkWorkspaceConfig } from \"./workspace-config.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * Personal runtime settings — stored in .skaile/settings.json (gitignored).\n * Contains only user-specific overrides: credentials, preferred model/harness.\n *\n * Project-level config (framework, resources, hooks, agent definition) lives\n * in skaile.yaml as SkWorkspaceConfig. App-specific fields (e.g. voice)\n * are added by forge-common-backend via AppSettings.\n * @docLink packages/core/settings#skaile-settings\n */\nexport interface SkaileSettings {\n /** Active model selector — `\"<providerId>/<modelId>\"`, a bare model id, or `\"@role\"`. */\n model?: string;\n /** Bridge harness to use: \"omp\", \"claude-sdk\", or \"codex\". */\n harness?: string;\n /**\n * Model role aliases (§9.8), sourced from `skaile.yaml` `roles:`. Consumed\n * by `parseModelRef` when a selector is `@role`.\n */\n roles?: Record<string, string>;\n /** Framework install path overrides. Normally derived from skaile.yaml defaults. */\n skillsDir?: string;\n /** Override for the agents directory. Normally derived from skaile.yaml defaults. */\n agentsDir?: string;\n /** Override for the prompts directory. Normally derived from skaile.yaml defaults. */\n promptsDir?: string;\n /** AI Asset Store API URL (default: https://store.skaile.ai) */\n storeUrl?: string;\n /** JWT access token for the AI Asset Store */\n storeJwt?: string;\n /** Refresh token for JWT renewal */\n storeRefreshToken?: string;\n}\n\n/**\n * Built-in default settings. Lowest-priority layer in resolveSettings().\n * Override via .skaile/settings.json, ~/.skaile/settings.json, or env vars.\n *\n * `model` is deliberately absent. A hardcoded default here is not a floor a\n * consumer can opt out of: because `loadSettings` and `resolveSettings` spread\n * these defaults *under* every other layer, deleting `model` from a settings\n * file does not unset it — the built-in comes back. A caller therefore cannot\n * express \"no model configured\" and cannot route an unconfigured session to its\n * own per-harness default; it silently inherits whichever id was pinned here,\n * however stale. Leaving it unset lets each harness apply its own current\n * default (omp omits `--model`; claude-sdk falls back to the `sonnet` rolling\n * alias), which is the one that ages correctly.\n *\n * @docLink packages/core/settings#settings-defaults\n */\nexport const SETTINGS_DEFAULTS: SkaileSettings = {\n harness: DEFAULT_HARNESS_ID,\n};\n\n// ── Legacy field mapping ───────────────────────────────────────────────────\n\nconst LEGACY_FIELD_MAP: Record<string, keyof SkaileSettings> = {\n defaultModel: \"model\",\n defaultAgentType: \"harness\",\n // Pre-6.0 spelling of `harness`; read for one major, then removed.\n driver: \"harness\",\n};\n\n/**\n * The one settings.json field that is neither renamed nor carried: `apiKeys{}`\n * put literal secrets in a file the runtime cannot rotate, scope or audit.\n * Registry entries reference a credential (`credential.ref: env:NAME`), and a\n * file that still has the field is rejected — silently dropping it would start\n * the session without the keys the operator believes are configured.\n */\nconst APIKEYS_REJECTION =\n \"settings.json: `apiKeys` is no longer read — endpoints and credentials are AI provider \" +\n \"registry entries in ~/.skaile/providers.yml. Run `skaile providers add <id> --preset \" +\n \"<preset> --credential env:NAME` for each provider, then delete the field.\";\n\n/**\n * Rename legacy field names in a raw parsed settings object to their current equivalents.\n * Maps `defaultModel` → `model`, `defaultAgentType` → `harness` and the pre-6.0\n * `driver` → `harness` (an explicit `harness` in the same file wins). A present\n * `apiKeys` key (even an empty map) throws with the command that replaces it.\n *\n * @param raw - Raw object from JSON.parse of a settings file\n * @returns Settings with legacy keys renamed to current ones\n * @docLink packages/core/settings#map-legacy-fields\n */\nexport function mapLegacyFields(raw: Record<string, unknown>): SkaileSettings {\n if (\"apiKeys\" in raw) throw new Error(APIKEYS_REJECTION);\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw)) {\n const mapped = LEGACY_FIELD_MAP[key];\n if (mapped) {\n if (!(mapped in result) || result[mapped] == null) result[mapped] = value;\n } else {\n result[key] = value;\n }\n }\n return result as SkaileSettings;\n}\n\n// ── Paths ──────────────────────────────────────────────────────────────────\n\nconst SKAILE_DIR = \".skaile\";\nconst SETTINGS_FILE = \"settings.json\";\n\n/**\n * Return the path to the user-global settings file: `$SKAILE_HOME/settings.json`\n * (`~/.skaile/settings.json` when `SKAILE_HOME` is unset).\n * @docLink packages/core/settings#global-settings-path\n */\nexport function globalSettingsPath(): string {\n return path.join(globalSkaileDir(), SETTINGS_FILE);\n}\n\n/**\n * Return the path to the project-local settings file: `<projectDir>/.skaile/settings.json`.\n *\n * @param projectDir - Absolute path to the project root\n * @returns Absolute path to the project settings file\n * @docLink packages/core/settings#project-settings-path\n */\nexport function projectSettingsPath(projectDir: string): string {\n return path.join(projectDir, SKAILE_DIR, SETTINGS_FILE);\n}\n\n// ── I/O ────────────────────────────────────────────────────────────────────\n\n/**\n * Read and parse one settings JSON file. `undefined` when the file is missing\n * or not JSON — those are the cases a layer may skip. What it must not skip is\n * a rejected field, which `mapLegacyFields` throws for outside this guard.\n */\nfunction readSettingsJson(filePath: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Load and parse one settings JSON file — exactly the keys it holds, no\n * built-in defaults merged in. Returns `{}` if the file does not exist or\n * cannot be parsed; throws when it carries a rejected field (`apiKeys`).\n *\n * A caller that reads a file in order to write it back (`config set`, the\n * setup wizard) must not persist a default the user never typed: a `harness`\n * merged in here once landed in `.skaile/settings.json` and pinned the harness\n * of the project. {@link resolveSettings} is the reader that adds defaults.\n *\n * @param filePath - Absolute path to a settings.json file\n * @returns The settings the file holds\n * @docLink packages/core/settings#load-settings\n */\nexport async function loadSettings(filePath: string): Promise<SkaileSettings> {\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(await fsp.readFile(filePath, \"utf-8\"));\n } catch {\n return {};\n }\n return mapLegacyFields(raw);\n}\n\n/**\n * Persist settings to a JSON file, creating parent directories as needed.\n *\n * @param settings - Settings object to serialize\n * @param filePath - Absolute path to write the settings.json file\n * @docLink packages/core/settings#save-settings\n */\nexport async function saveSettings(settings: SkaileSettings, filePath: string): Promise<void> {\n await fsp.mkdir(path.dirname(filePath), { recursive: true });\n await fsp.writeFile(filePath, JSON.stringify(settings, null, 2), \"utf-8\");\n}\n\n/**\n * Walk upward from `projectDir` (max 10 levels) and collect all\n * `.skaile/settings.json` paths found along the way.\n * Results are ordered nearest-to-root first.\n *\n * @param projectDir - Starting directory for the upward walk\n * @returns Array of absolute paths to settings files found\n * @docLink packages/core/settings#walk-for-settings\n */\nexport function walkForSettings(projectDir: string): string[] {\n const found: string[] = [];\n let dir = path.resolve(projectDir);\n const root = path.parse(dir).root;\n for (let i = 0; i < 10; i++) {\n const candidate = path.join(dir, SKAILE_DIR, SETTINGS_FILE);\n if (fs.existsSync(candidate)) found.push(candidate);\n const parent = path.dirname(dir);\n if (parent === dir || parent === root) break;\n dir = parent;\n }\n return found;\n}\n\n// ── Resolution ─────────────────────────────────────────────────────────────\n\nfunction mergeSettings(base: SkaileSettings, source: Partial<SkaileSettings>): SkaileSettings {\n const result: SkaileSettings = { ...base };\n for (const [key, value] of Object.entries(source) as [keyof SkaileSettings, unknown][]) {\n if (value === undefined || value === null || value === \"\") continue;\n if (key === \"roles\" && typeof value === \"object\") {\n // Per-key merge: a project that redefines `smol` must not have to\n // restate the roles its user-scope config already provides.\n result[key] = { ...result[key], ...(value as Record<string, string>) };\n } else {\n Object.assign(result, { [key]: value });\n }\n }\n return result;\n}\n\n/**\n * Derive a SkaileSettings-compatible layer from `skaile.yaml` — the default\n * profile's selection plus the workspace `roles:` table.\n *\n * A `skaile.yaml` that still defines a provider or an endpoint is a parse\n * error, and that one error is re-thrown rather than swallowed: silently\n * resolving an empty layer would start the session against the wrong model\n * instead of printing the command that fixes the file.\n */\nfunction settingsFromWorkspaceConfig(projectDir: string): SkaileSettings {\n let ws: SkWorkspaceConfig;\n try {\n ws = resolveSkWorkspaceConfig(projectDir);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"skaile migrate providers\")) throw error;\n return {};\n }\n const result: SkaileSettings = {};\n if (ws.roles && Object.keys(ws.roles).length > 0) result.roles = ws.roles;\n const p = ws.agent_config?.default;\n if (!p) return result;\n if (p.harness) result.harness = p.harness;\n if (p.model) result.model = p.model;\n if (p.skills_dir) result.skillsDir = p.skills_dir;\n if (p.agents_dir) result.agentsDir = p.agents_dir;\n if (p.prompts_dir) result.promptsDir = p.prompts_dir;\n return result;\n}\n\n// ── Migration ──────────────────────────────────────────────────────────────\n\nconst _migrated = new Set<string>();\n\n/**\n * One-time migration from old config locations to .skaile/settings.json.\n * Does not delete old files — user can do that manually.\n * @docLink packages/core/settings#migrate-settings\n */\nexport async function migrateSettings(projectDir: string): Promise<void> {\n const resolved = path.resolve(projectDir);\n if (_migrated.has(resolved)) return;\n\n const targetPath = projectSettingsPath(resolved);\n if (fs.existsSync(targetPath)) {\n _migrated.add(resolved);\n return;\n }\n\n // Old locations: data/settings.json (forge-project), .cf/settings.json\n // (forge-concept), .skaile/config.json (old SkailConfig).\n const sources = [\n path.join(resolved, \"data\", \"settings.json\"),\n path.join(resolved, \".cf\", \"settings.json\"),\n path.join(resolved, \".skaile\", \"config.json\"),\n ]\n .map(readSettingsJson)\n .filter((raw): raw is Record<string, unknown> => raw !== undefined);\n\n if (sources.length > 0) {\n let merged: SkaileSettings = {};\n for (const source of sources) {\n merged = mergeSettings(merged, mapLegacyFields(source));\n }\n await saveSettings(merged, targetPath);\n }\n\n _migrated.add(resolved);\n}\n\n/** Where an effective setting came from: a file path, `PREFERRED_MODEL`, or `built-in default`. */\nexport type SettingsSources = Partial<Record<keyof SkaileSettings, string>>;\n\n/** Fold `source` into `acc`, recording `origin` for each scalar key it sets. */\nfunction foldLayer(\n acc: { settings: SkaileSettings; sources: SettingsSources },\n source: Partial<SkaileSettings>,\n origin: string,\n): void {\n for (const [key, value] of Object.entries(source) as [keyof SkaileSettings, unknown][]) {\n if (value === undefined || value === null || value === \"\") continue;\n if (key !== \"roles\") acc.sources[key] = origin;\n }\n acc.settings = mergeSettings(acc.settings, source);\n}\n\n/**\n * Merge the layers a user or project actually configured — `skaile.yaml`\n * agent_config defaults < `~/.skaile/settings.json` < `.skaile/settings.json`\n * (walking upward, farthest first) — without {@link SETTINGS_DEFAULTS}, so a\n * field is present only when something set it. `sources` names the file that\n * set each key.\n *\n * `harness` is the exception to that order: `skaile.yaml` alone owns the\n * harness a project runs on. A personal settings file names a harness only for\n * a project whose `skaile.yaml` names none, so a `harness` in\n * `.skaile/settings.json` never moves the project to another harness.\n */\nfunction configuredSettingsLayers(projectDir: string): {\n settings: SkaileSettings;\n sources: SettingsSources;\n} {\n const acc = { settings: {} as SkaileSettings, sources: {} as SettingsSources };\n\n // Layer: workspace config defaults (skaile.yaml via resolveSkWorkspaceConfig)\n const yamlLayer = settingsFromWorkspaceConfig(projectDir);\n foldLayer(acc, yamlLayer, path.join(path.resolve(projectDir), \"skaile.yaml\"));\n const projectHarness = yamlLayer.harness;\n\n // Layer: user global settings\n const globalPath = globalSettingsPath();\n const globalRaw = readSettingsJson(globalPath);\n if (globalRaw) foldLayer(acc, mapLegacyFields(globalRaw), globalPath);\n\n // Layer: project-local .skaile/settings.json (walking upward, farthest first)\n const settingsFiles = walkForSettings(projectDir);\n for (const filePath of settingsFiles.reverse()) {\n if (path.resolve(filePath) === path.resolve(globalPath)) continue;\n const raw = readSettingsJson(filePath);\n if (raw) foldLayer(acc, mapLegacyFields(raw), filePath);\n }\n\n if (projectHarness) {\n acc.settings.harness = projectHarness;\n acc.sources.harness = path.join(path.resolve(projectDir), \"skaile.yaml\");\n }\n return acc;\n}\n\n/**\n * The {@link HarnessName} the project is configured for — the harness whose\n * install dirs `skaile config show` reports under \"Resolved Paths\". Resolves\n * `harness` through the same layers as {@link resolveSettings}, but without the\n * built-in `omp` default: `undefined` means nothing configured a (known)\n * harness, and the caller picks its own fallback.\n *\n * @param projectDir - Root directory of the project being operated on\n * @returns The configured target, or `undefined` when none is configured\n * @docLink packages/core/settings#resolve-configured-harness-target\n */\nexport function resolveConfiguredHarnessName(projectDir: string): HarnessName | undefined {\n return harnessNameForHarnessId(configuredSettingsLayers(projectDir).settings.harness);\n}\n\n/**\n * Resolve effective settings through the priority chain:\n * overrides > env vars (PREFERRED_MODEL) >\n * .skaile/settings.json (walks upward) > ~/.skaile/settings.json >\n * skaile.yaml agent_config defaults > SETTINGS_DEFAULTS. `harness` is the\n * exception: a `skaile.yaml` harness beats both settings files.\n *\n * @param projectDir - Root directory of the project being operated on\n * @param overrides - Optional top-priority overrides (CLI flags, API body)\n * @returns Merged effective settings\n * @docLink packages/core/settings#resolve-settings\n */\nexport async function resolveSettings(\n projectDir: string,\n overrides?: Partial<SkaileSettings>,\n): Promise<SkaileSettings> {\n return (await resolveSettingsWithSources(projectDir, overrides)).settings;\n}\n\n/**\n * {@link resolveSettings} plus the origin of every scalar key: the file path\n * that set it, `PREFERRED_MODEL`, `command line`, or `built-in default`.\n * Backs `skaile config show`.\n */\nexport async function resolveSettingsWithSources(\n projectDir: string,\n overrides?: Partial<SkaileSettings>,\n): Promise<{ settings: SkaileSettings; sources: SettingsSources }> {\n await migrateSettings(projectDir);\n\n const layers = configuredSettingsLayers(projectDir);\n // Base: built-in defaults under every configured layer\n const acc = {\n settings: { ...SETTINGS_DEFAULTS } as SkaileSettings,\n sources: {} as SettingsSources,\n };\n for (const key of Object.keys(SETTINGS_DEFAULTS) as (keyof SkaileSettings)[]) {\n acc.sources[key] = \"built-in default\";\n }\n foldLayer(acc, layers.settings, \"\");\n Object.assign(acc.sources, layers.sources);\n\n // Layer: environment variable model override\n if (process.env.PREFERRED_MODEL) {\n acc.settings.model = process.env.PREFERRED_MODEL;\n acc.sources.model = \"PREFERRED_MODEL\";\n }\n\n // Layer: explicit overrides\n if (overrides) foldLayer(acc, overrides, \"command line\");\n\n return acc;\n}\n\n// ── API key helpers ────────────────────────────────────────────────────────\n\n/**\n * Return a masked version of an API key for safe logging.\n * Shows only the last four characters (e.g. `'****abc1'`).\n *\n * @param key - Raw API key to mask\n * @returns Masked key string, or empty string if key is falsy\n * @docLink packages/core/settings#mask-api-key\n */\nexport function maskApiKey(key: string): string {\n return key ? `****${key.slice(-4)}` : \"\";\n}\n","/**\n * Which package manager a project (or this skaile install) uses, and the\n * command that adds a package with it. Messages that tell a user to install an\n * optional SDK print this command, so an npm user is never told to run `bun add`.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** Package managers whose lockfile marks a project. */\nexport type PackageManager = \"bun\" | \"npm\" | \"pnpm\" | \"yarn\";\n\nconst LOCKFILES: [file: string, manager: PackageManager][] = [\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"],\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n];\n\n/** The manager named by `npm_config_user_agent` (set by `npx`, `bunx`, `pnpm dlx`, scripts). */\nfunction managerFromUserAgent(): PackageManager | undefined {\n const name = process.env.npm_config_user_agent?.split(\"/\")[0];\n return name === \"bun\" || name === \"npm\" || name === \"pnpm\" || name === \"yarn\" ? name : undefined;\n}\n\n/** The manager whose global store holds this skaile install, judged by its path. */\nfunction managerFromInstallPath(): PackageManager | undefined {\n let here: string;\n try {\n here = fileURLToPath(import.meta.url);\n } catch {\n return undefined;\n }\n if (/[\\\\/]\\.bun[\\\\/]/.test(here)) return \"bun\";\n if (/[\\\\/]pnpm[\\\\/]/.test(here) || /[\\\\/]\\.pnpm[\\\\/]/.test(here)) return \"pnpm\";\n if (/[\\\\/]\\.?yarn[\\\\/]/.test(here)) return \"yarn\";\n return undefined;\n}\n\n/**\n * The package manager of the project at `projectDir`: the one whose lockfile is\n * there, else the one that launched this process (`npx`/`bunx`), else the one\n * whose global store holds skaile, else Bun when this process runs under Bun,\n * else npm.\n */\nexport function detectPackageManager(projectDir: string): PackageManager {\n for (const [file, manager] of LOCKFILES) {\n if (existsSync(join(projectDir, file))) return manager;\n }\n return (\n managerFromUserAgent() ??\n managerFromInstallPath() ??\n ((globalThis as { Bun?: unknown }).Bun !== undefined ? \"bun\" : \"npm\")\n );\n}\n\n/** The command that adds `pkg` to a project managed by `manager`. */\nexport function installCommand(manager: PackageManager, pkg: string): string {\n switch (manager) {\n case \"bun\":\n return `bun add ${pkg}`;\n case \"pnpm\":\n return `pnpm add ${pkg}`;\n case \"yarn\":\n return `yarn add ${pkg}`;\n default:\n return `npm i ${pkg}`;\n }\n}\n\n/** The add command for `pkg` in the project at `projectDir` (default: the current directory). */\nexport function installCommandFor(pkg: string, projectDir: string = process.cwd()): string {\n return installCommand(detectPackageManager(projectDir), pkg);\n}\n","/**\n * Where a harness harness finds its optional SDK (`@anthropic-ai/claude-agent-sdk`,\n * `@openai/codex-sdk`). The project's `node_modules` comes first, so the\n * `npm i <sdk>` a tutorial tells the user to run in the project is enough; the SDK\n * next to the skaile install itself is the fallback. A failure names both places.\n */\n\nimport { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { installCommandFor } from \"./package-manager.js\";\n\n/** Conditions tried, in order, when a package's `exports` map has nested objects. */\nconst EXPORT_CONDITIONS = [\"import\", \"node\", \"default\"];\n\n/**\n * The package directory `skaile` runs from (the nearest ancestor of this file with a\n * `package.json`), or `null` when it cannot be told (a compiled binary).\n */\nexport function skaileInstallDir(): string | null {\n try {\n let dir = path.dirname(realpathSync(fileURLToPath(import.meta.url)));\n for (;;) {\n if (existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n } catch {\n return null;\n }\n}\n\n/** The package directory of `pkg` in the nearest `node_modules` at or above `startDir`, or `null`. */\nexport function findProjectPackageDir(pkg: string, startDir: string): string | null {\n let dir = path.resolve(startDir);\n for (;;) {\n const candidate = path.join(dir, \"node_modules\", pkg);\n if (existsSync(path.join(candidate, \"package.json\"))) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nfunction pickCondition(target: unknown): string | null {\n if (typeof target === \"string\") return target;\n if (Array.isArray(target)) {\n for (const item of target) {\n const found = pickCondition(item);\n if (found) return found;\n }\n return null;\n }\n if (target && typeof target === \"object\") {\n for (const condition of EXPORT_CONDITIONS) {\n const found = pickCondition((target as Record<string, unknown>)[condition]);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * The file `import(\"<pkg>\")` (or `import(\"<pkg>/<subpath>\")`) loads from the package at\n * `pkgDir`, or `null` when none can be told. A subpath is matched against the `exports`\n * map: an exact key (`./api/x`) first, then a single-`*` pattern (`./api/*`).\n */\nexport function packageEntry(pkgDir: string, subpath?: string): string | null {\n let manifest: { exports?: unknown; module?: string; main?: string };\n try {\n manifest = JSON.parse(readFileSync(path.join(pkgDir, \"package.json\"), \"utf8\"));\n } catch {\n return null;\n }\n const exp = manifest.exports;\n let rel: string | null = null;\n if (subpath !== undefined) {\n if (!exp || typeof exp !== \"object\" || Array.isArray(exp)) return null;\n const map = exp as Record<string, unknown>;\n const key = `./${subpath}`;\n if (key in map) {\n rel = pickCondition(map[key]);\n } else {\n for (const [pattern, target] of Object.entries(map)) {\n const star = pattern.indexOf(\"*\");\n if (star === -1) continue;\n const head = pattern.slice(0, star);\n const tail = pattern.slice(star + 1);\n if (key.length < head.length + tail.length) continue;\n if (!key.startsWith(head) || !key.endsWith(tail)) continue;\n const matched = key.slice(head.length, key.length - tail.length);\n const picked = pickCondition(target);\n rel = picked ? picked.replaceAll(\"*\", matched) : null;\n break;\n }\n }\n } else if (exp !== undefined) {\n const root =\n exp && typeof exp === \"object\" && !Array.isArray(exp) && \".\" in exp\n ? (exp as Record<string, unknown>)[\".\"]\n : exp;\n rel = pickCondition(root);\n } else {\n rel = manifest.module ?? manifest.main ?? \"index.js\";\n }\n if (!rel) return null;\n const file = path.resolve(pkgDir, rel);\n return existsSync(file) ? file : null;\n}\n\nconst loaded = new Map<string, Promise<unknown>>();\n\n/** One-line description of where the SDK was looked for. */\nexport function sdkLookupPlaces(projectDir: string): string {\n const home = skaileInstallDir();\n const project = path.join(path.resolve(projectDir), \"node_modules\");\n return home ? `${project} and next to skaile (${home})` : `${project} and next to skaile`;\n}\n\n/** The error a harness throws when its SDK is in neither place. One line, names both places. */\nexport function harnessSdkMissingError(\n label: string,\n pkg: string,\n projectDir: string,\n cause?: unknown,\n): Error {\n const detail =\n cause instanceof Error && cause.message ? ` (load failed: ${firstLine(cause.message)})` : \"\";\n return new Error(\n `${label} not installed${detail}. Looked in ${sdkLookupPlaces(projectDir)}. Run: ${installCommandFor(pkg, projectDir)}`,\n );\n}\n\nfunction firstLine(text: string): string {\n return text.split(\"\\n\", 1)[0]?.trim() ?? \"\";\n}\n\n/**\n * Load a harness SDK: from the project's `node_modules` first, then through `fallback`\n * (the literal `import(\"<pkg>\")` at the call site, which resolves next to the skaile\n * install and keeps the SDK visible to bundlers).\n *\n * @param pkg - npm name of the SDK.\n * @param projectDir - Project directory the harness runs for.\n * @param fallback - The `import(\"<pkg>\")` that resolves from the skaile install.\n * @throws {Error} One line naming both places the SDK was looked for.\n */\nexport async function loadHarnessSdk<T>(\n pkg: string,\n projectDir: string,\n fallback: () => Promise<T>,\n label: string = pkg,\n): Promise<T> {\n return loadFromProject(pkg, undefined, projectDir, fallback, label);\n}\n\n/**\n * Like {@link loadHarnessSdk}, for a subpath export of the SDK (`import(\"<pkg>/<subpath>\")`).\n *\n * @param subpath - Subpath without the leading `./` (for example `api/anthropic-messages`).\n */\nexport async function loadHarnessSdkSubpath<T>(\n pkg: string,\n subpath: string,\n projectDir: string,\n fallback: () => Promise<T>,\n label: string = pkg,\n): Promise<T> {\n return loadFromProject(pkg, subpath, projectDir, fallback, label);\n}\n\nasync function loadFromProject<T>(\n pkg: string,\n subpath: string | undefined,\n projectDir: string,\n fallback: () => Promise<T>,\n label: string,\n): Promise<T> {\n let cause: unknown;\n const dir = findProjectPackageDir(pkg, projectDir);\n const entry = dir ? packageEntry(dir, subpath) : null;\n if (entry) {\n let pending = loaded.get(entry);\n if (!pending) {\n pending = import(/* @vite-ignore */ pathToFileURL(entry).href);\n loaded.set(entry, pending);\n }\n try {\n return (await pending) as T;\n } catch (err) {\n loaded.delete(entry);\n cause = err;\n }\n }\n try {\n return await fallback();\n } catch (err) {\n throw harnessSdkMissingError(label, pkg, projectDir, cause ?? (dir ? err : undefined));\n }\n}\n","/**\n * One bind helper for every TCP server skaile starts (the WebSocket server and the model\n * endpoint). A port rule fixed in one server only came back twice (p842, p1006), so the busy-port\n * probe and the \"already in use\" error live here.\n */\n\nimport { connect, type Server } from \"node:net\";\n\nconst WILDCARD_HOSTS = [\"0.0.0.0\", \"::\", \"::0\", \"0:0:0:0:0:0:0:0\"];\n\n/** How long one connect probe waits before the address counts as free. */\nconst PROBE_TIMEOUT_MS = 1000;\n\n/**\n * The addresses a client may dial for a server bound to `host:port`: both loopback addresses\n * (a client on this machine uses either) plus the chosen host unless it is a wildcard. A bind to\n * a specific address can succeed next to a listener on another address or on a wildcard (macOS\n * allows it; Linux allows it across address families), while the other process keeps answering\n * clients on the address we think is ours (p842, p1006).\n */\nexport function probeHosts(host: string | undefined): string[] {\n const hosts = [\"127.0.0.1\", \"::1\"];\n if (host && !WILDCARD_HOSTS.includes(host) && !hosts.includes(host)) hosts.push(host);\n return hosts;\n}\n\n/**\n * Whether something accepts a TCP connection on `host:port`. Only a completed connect counts;\n * a refusal, an address this machine lacks (no IPv6), a timeout or any other error means nobody\n * listens there, and the real bind decides.\n */\nexport function connectProbe(\n port: number,\n host: string,\n timeoutMs = PROBE_TIMEOUT_MS,\n): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n const socket = connect({ port, host });\n const done = (held: boolean) => {\n socket.destroy();\n resolve(held);\n };\n socket.setTimeout(timeoutMs, () => done(false));\n socket.once(\"connect\", () => done(true));\n socket.once(\"error\", () => done(false));\n });\n}\n\n/**\n * Whether another process holds `port` on 127.0.0.1, on ::1 or on `host`. A fixed port only: port\n * 0 asks the OS for a free one and needs no probe.\n */\nexport async function portIsHeld(port: number, host?: string): Promise<boolean> {\n if (port === 0) return false;\n const results = await Promise.all(probeHosts(host).map((h) => connectProbe(port, h)));\n return results.some(Boolean);\n}\n\n/**\n * Whether a bind to `host:port` needed the old wildcard probe.\n *\n * @deprecated Kept for 5.18.x callers. {@link listenWithProbe} now always connect-probes\n * (`127.0.0.1`, `::1` and the host) on every platform; use {@link portIsHeld}.\n */\nexport function needsWildcardProbe(\n host: string | undefined,\n port: number,\n platform: NodeJS.Platform,\n): boolean {\n if (!host || port === 0 || platform !== \"darwin\") return false;\n return !WILDCARD_HOSTS.includes(host);\n}\n\n/**\n * Whether another process holds `port`.\n *\n * @deprecated Kept for 5.18.x callers. It connect-probes `127.0.0.1` and `::1` (a listener on\n * `::`, `0.0.0.0` or a loopback address answers there); use {@link portIsHeld}.\n */\nexport function holdsWildcard(port: number): Promise<boolean> {\n return portIsHeld(port);\n}\n\n/**\n * Bind `server` to `port` (on `host` when given) after probing the port by connect. Resolves once\n * listening. Rejects with the server's own error, or with an `EADDRINUSE` error when another\n * process holds the port, also when only the probe saw it.\n *\n * @param server - Any `net.Server` (an `http.Server` included), not yet listening.\n * @param _platform - Ignored (5.18.x took the platform for the wildcard probe); the probe runs everywhere.\n */\nexport async function listenWithProbe(\n server: Server,\n port: number,\n host?: string,\n _platform?: NodeJS.Platform,\n): Promise<void> {\n if (await portIsHeld(port, host)) {\n throw Object.assign(new Error(\"port probe\"), { code: \"EADDRINUSE\" });\n }\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n const onBound = () => {\n server.off(\"error\", reject);\n resolve();\n };\n if (host) server.listen(port, host, onBound);\n else server.listen(port, onBound);\n });\n}\n","/**\n * The one place the Claude model alias map is applied.\n *\n * The aliases a manifest or an `agents:` instance writes (`sonnet`, `opus`, `haiku`, `inherit`)\n * name a model of the Claude harness only. Any other harness would send the alias to its own\n * provider as a model id, so it starts on its own default instead. The agent renderers (the model\n * of a native agent file), the runner (the model of a live session) and the CLI (`run`, `repl`)\n * all go through {@link modelForHarness}; nothing else reads {@link ANTHROPIC_MODEL_ALIASES}.\n */\n\nimport { ANTHROPIC_MODEL_ALIASES } from \"@skaile/workspaces/types/manifests\";\nimport { harnessNameForHarnessId } from \"./harness-targets.js\";\n\n/**\n * A model name the manifest or an `agents:` instance prefers, as the harness can take it.\n * The Claude harness (`claude-sdk`, target `claude-code`) keeps every value; any other harness\n * gets `undefined` for a Claude alias and every other selector unchanged.\n *\n * @param preferred - `model.preferred` (or one `model.fallback` entry).\n * @param harness - Harness id (`claude-sdk`, `codex`, `omp`, …) or target name; no value is the Claude harness.\n * @returns The model to use, or `undefined` when the harness starts on its own default.\n */\nexport function modelForHarness(\n preferred: string | undefined,\n harness: string | undefined,\n): string | undefined {\n if (!preferred) return undefined;\n if (harness === undefined || harnessNameForHarnessId(harness) === \"claude-code\") return preferred;\n return (ANTHROPIC_MODEL_ALIASES as readonly string[]).includes(preferred) ? undefined : preferred;\n}\n","import { type HarnessName, harnessNameForHarnessId } from \"./harness-targets.js\";\n\n/**\n * The one system-prompt assembler for an agent definition. The install\n * renderers (`asset-manager`, bake the prompt into `.claude/agents/<name>.md`\n * and friends), the runner (`createAgentSession`, assembles the live system\n * prompt) and `skaile run --dry-run --print-prompt` all build the agent part\n * of the prompt through {@link assembleAgent}, which wraps\n * {@link buildAgentPromptSections}, so they can never disagree on order or text.\n *\n * Order — fixed here and nowhere else:\n *\n * 1. soul — identity and values\n * 2. memory — `<MEMORY>` block, one framed `<block>` per memory block\n * 3. fragments — framework fragments (agent-mode, handoff, …)\n * 4. constraints — `## Constraints` (RULES)\n * 5. duties — `## Duties`\n * 6. abilities — `## Installed Abilities`\n * 7. contracts — `## Contracts`\n * 8. composed — inline blocks from `composes:`\n * 9. extensions — per-project prompt-extensions\n *\n * Pure: no I/O. Callers hand in text they already loaded.\n */\n\n/** Section ids in the order the builder emits them. */\nexport const AGENT_PROMPT_SECTION_ORDER = [\n \"soul\",\n \"memory\",\n \"fragments\",\n \"constraints\",\n \"duties\",\n \"abilities\",\n \"contracts\",\n \"composed\",\n \"extensions\",\n] as const;\n\nexport type AgentPromptSectionId = (typeof AGENT_PROMPT_SECTION_ORDER)[number];\n\n/** A piece of prompt text, optionally with a label for breakdowns (`source`). */\nexport type AgentPromptPart = string | { text: string; source?: string };\n\n/** One memory block as rendered in `<MEMORY>`. */\nexport interface AgentPromptMemoryBlock {\n name: string;\n /** Convention file the block is seeded from (`SOUL.md`). A block seeded from `SOUL.md` carries the soul. */\n source?: string;\n /** `instance` | `user` | `workspace`. */\n scope: string;\n /** Hard cap on the rendered content (characters). */\n maxChars: number;\n /** Current block content: what the host holds, or the seed when the host holds nothing. */\n content: string;\n /**\n * `false` when nothing is stored for the block (`memory.scope: none`): the seed is all there is,\n * so the native file may bake it. Absent or `true`: the host owns the content, the file never\n * holds it.\n */\n persisted?: boolean;\n}\n\nexport interface AgentPromptAbility {\n /** Slash-command name. */\n name: string;\n description: string;\n}\n\nexport interface AgentPromptContract {\n name: string;\n /** Path relative to the workspace root. */\n relativePath: string;\n}\n\n/** Everything the builder can place; every part is optional. */\nexport interface AgentPromptSectionsInput {\n soul?: string | null;\n memory?: readonly AgentPromptMemoryBlock[];\n frameworkFragments?: readonly AgentPromptPart[];\n /** RULES text; rendered under `## Constraints`. */\n constraints?: string | null;\n /** DUTIES text; rendered under `## Duties`. */\n duties?: string | null;\n abilities?: readonly AgentPromptAbility[];\n contracts?: readonly AgentPromptContract[];\n /** Inline blocks composed through `composes:`. */\n composed?: readonly AgentPromptPart[];\n promptExtensions?: readonly AgentPromptPart[];\n}\n\n/** One rendered, non-empty section. Multi-entry ids (fragments, composed, extensions) repeat. */\nexport interface AgentPromptSection {\n id: AgentPromptSectionId;\n text: string;\n /** Label of the contributing part, when it had one. */\n source?: string;\n}\n\n/**\n * Render one memory block's content, capped at `maxChars` (the cap bounds the\n * content; the frame is extra). Exported so hosts that edit blocks can preview\n * exactly what the agent will see.\n */\nexport function capMemoryContent(content: string, maxChars: number): string {\n const text = content.trim();\n return text.length > maxChars ? text.slice(0, maxChars).trimEnd() : text;\n}\n\n/** One framed `<block>` of `<MEMORY>`, or `undefined` when the block has no content. */\nfunction renderMemoryBlock(block: AgentPromptMemoryBlock): string | undefined {\n const content = capMemoryContent(block.content, block.maxChars);\n if (!content) return undefined;\n return `<block name=\"${block.name}\" scope=\"${block.scope}\">\\n${content}\\n</block>`;\n}\n\n/**\n * The `<MEMORY>` block for the given memory blocks, or `undefined` when none\n * has content. Each block is framed `<block name=… scope=…>` and capped at its\n * own `maxChars`.\n */\nexport function renderMemorySection(blocks: readonly AgentPromptMemoryBlock[]): string | undefined {\n const framed: string[] = [];\n for (const block of blocks) {\n const text = renderMemoryBlock(block);\n if (text) framed.push(text);\n }\n if (framed.length === 0) return undefined;\n return `<MEMORY>\\n${framed.join(\"\\n\")}\\n</MEMORY>`;\n}\n\n/**\n * The identity line of a composed block or prompt extension: a comment that names its section and\n * its ref (or path). The model sees a comment, the runner finds the block by it.\n */\nfunction partMarker(id: AgentPromptSectionId, source: string): string {\n return `<!-- skaile:${id} ${JSON.stringify(source).replace(/>/g, \"\\\\u003e\")} -->`;\n}\n\nconst partText = (part: AgentPromptPart): string => (typeof part === \"string\" ? part : part.text);\nconst partSource = (part: AgentPromptPart): string | undefined =>\n typeof part === \"string\" ? undefined : part.source;\n\n/**\n * Build the agent part of a system prompt as an ordered list of sections.\n * Empty parts are dropped. Join `section.text` with the caller's separator\n * (`\\n\\n` in the install renderers, the `---` rule in the runner).\n */\nexport function buildAgentPromptSections(input: AgentPromptSectionsInput): AgentPromptSection[] {\n const sections: AgentPromptSection[] = [];\n const push = (id: AgentPromptSectionId, text: string | undefined, source?: string): void => {\n if (!text) return;\n sections.push(source ? { id, text, source } : { id, text });\n };\n const pushParts = (id: AgentPromptSectionId, parts: readonly AgentPromptPart[] | undefined) => {\n for (const part of parts ?? []) {\n const text = partText(part);\n if (!text.trim()) continue;\n const source = partSource(part);\n // A part with a source carries its identity in the text (a comment line), so a native\n // file that holds an older copy is told from one that does not hold the part at all.\n push(id, source ? `${partMarker(id, source)}\\n${text}` : text, source);\n }\n };\n\n push(\"soul\", input.soul?.trim());\n push(\"memory\", renderMemorySection(input.memory ?? []));\n pushParts(\"fragments\", input.frameworkFragments);\n if (input.constraints?.trim())\n push(\"constraints\", `## Constraints\\n\\n${input.constraints.trim()}`);\n if (input.duties?.trim()) push(\"duties\", `## Duties\\n\\n${input.duties.trim()}`);\n\n if (input.abilities && input.abilities.length > 0) {\n const lines = [\"## Installed Abilities\", \"\"];\n for (const a of input.abilities) lines.push(`- \\`/${a.name}\\` — ${a.description}`);\n push(\"abilities\", lines.join(\"\\n\"));\n }\n\n if (input.contracts && input.contracts.length > 0) {\n const lines = [\n \"## Contracts\",\n \"\",\n \"Read the relevant contract before acting on constrained tasks:\",\n \"\",\n ];\n for (const c of input.contracts) lines.push(`- \\`${c.relativePath}\\``);\n push(\"contracts\", lines.join(\"\\n\"));\n }\n\n pushParts(\"composed\", input.composed);\n pushParts(\"extensions\", input.promptExtensions);\n return sections;\n}\n\n// ── The assembler ─────────────────────────────────────────────────────────────\n\n/**\n * How one section reaches a harness's main session.\n *\n * - `file`: the native agent file carries it; the runner never adds it.\n * - `file-or-runner`: the native file carries it (baked at install); the runner adds it\n * only when the file does not hold its exact text (a file from before, a host-backed\n * memory block, no file at all).\n * - `runner`: only the runner adds it at session start.\n * - `none`: no part of the main session carries it (it is in the rendered file, which\n * the harness reads for sub-agents only, or in no file).\n */\nexport type AgentPromptCarrier = \"file\" | \"file-or-runner\" | \"runner\" | \"none\";\n\n/** The harness groups that differ in what they carry. `other` is every harness without a native agent file. */\nexport type AgentPromptCarrierHarness = HarnessName | \"other\";\n\nconst allSections = (\n carrier: AgentPromptCarrier,\n): Record<AgentPromptSectionId, AgentPromptCarrier> =>\n Object.fromEntries(AGENT_PROMPT_SECTION_ORDER.map((id) => [id, carrier])) as Record<\n AgentPromptSectionId,\n AgentPromptCarrier\n >;\n\n/**\n * Which part of a main session carries each section, per harness. The harness docs table\n * (`docs/sections/bridge/harnesses.md`) is generated from this and a test fails when the two\n * drift; the dry-run column of `skaile run --dry-run` reads it too.\n *\n * `claude-code` and `codex` read the native file in the main session. `omp` reads only\n * `RULES.md` from its agent dir (not `SOUL.md`, not the rendered file), so the runner adds the\n * rest it has; the rendered `.omp/agents/<name>.md` serves omp's sub-agent listing.\n */\nexport const AGENT_PROMPT_CARRIERS: Record<\n AgentPromptCarrierHarness,\n Record<AgentPromptSectionId, AgentPromptCarrier>\n> = {\n \"claude-code\": {\n ...allSections(\"file\"),\n memory: \"file-or-runner\",\n duties: \"file-or-runner\",\n composed: \"file-or-runner\",\n extensions: \"file-or-runner\",\n },\n codex: {\n ...allSections(\"file\"),\n memory: \"file-or-runner\",\n duties: \"file-or-runner\",\n composed: \"file-or-runner\",\n extensions: \"file-or-runner\",\n },\n omp: {\n soul: \"runner\",\n memory: \"runner\",\n fragments: \"none\",\n constraints: \"file\",\n duties: \"runner\",\n abilities: \"none\",\n contracts: \"none\",\n composed: \"runner\",\n extensions: \"runner\",\n },\n other: {\n soul: \"none\",\n memory: \"runner\",\n fragments: \"none\",\n constraints: \"none\",\n duties: \"runner\",\n abilities: \"none\",\n contracts: \"none\",\n composed: \"runner\",\n extensions: \"runner\",\n },\n};\n\n/** The carrier group of a harness id (`claude-sdk`, `claude-code`, `codex`, `omp`, anything else); no id is `claude-code`. */\nexport function agentPromptCarrierHarness(harness?: string): AgentPromptCarrierHarness {\n if (harness === undefined) return \"claude-code\";\n return harnessNameForHarnessId(harness) ?? \"other\";\n}\n\n/** Options of {@link assembleAgent}. */\nexport interface AssembleAgentOptions {\n /** Harness id or target name; decides which sections the runner adds ({@link AGENT_PROMPT_CARRIERS}). */\n harness?: string;\n /** Text of the native agent file the harness reads, when there is one; the runner skips what it holds. */\n nativeFile?: string;\n}\n\n/** A block the native file holds, but with other text than the run resolves now (`skaile install` re-renders it). */\nexport interface StalePromptBlock {\n section: AgentPromptSectionId;\n /** What the notice names: `composed block ./rules.md`, `memory block notes`, `duties`. */\n label: string;\n}\n\n/** The result of {@link assembleAgent}. */\nexport interface AssembledAgent {\n /** Every non-empty section, in the fixed order. */\n sections: AgentPromptSection[];\n /**\n * The assembled agent prompt: `sections` joined with a blank line. The native agent file body is\n * this text plus a final newline; `skaile run --dry-run --print-prompt` prints it.\n */\n systemPrompt: string;\n /**\n * The part of the prompt the given harness is sent: `systemPrompt` without the sections its\n * carrier column marks `not sent` ({@link AGENT_PROMPT_CARRIERS}).\n */\n sentPrompt: string;\n /** Carrier of each section id for the harness. */\n carriers: Record<AgentPromptSectionId, AgentPromptCarrier>;\n /** The sections the runner adds to the live system prompt on top of the native file. */\n runnerSections: AgentPromptSection[];\n /**\n * Blocks the native file holds with other text than this input. The runner does not add a second\n * copy (the file is sent as it is); the caller prints one notice per entry.\n */\n stale: StalePromptBlock[];\n}\n\nconst isSoulSeed = (block: AgentPromptMemoryBlock): boolean =>\n block.source?.replace(/^\\.\\//, \"\") === \"SOUL.md\";\n\n/**\n * Assemble the agent prompt from one input set. The install renderers call it for the text\n * they bake, the runner for what it adds live, the CLI for `--print-prompt`.\n *\n * A memory block seeded from `SOUL.md` already carries the soul, so the soul section is left out\n * (never twice). A block of the native file is found by its identity (a memory block by its name,\n * the duties by their heading, a composed block or extension by its comment line), not by its\n * text: a block the file holds with other text is reported in `stale`, never added a second time.\n * Pure: no I/O.\n */\nexport function assembleAgent(\n input: AgentPromptSectionsInput,\n options: AssembleAgentOptions = {},\n): AssembledAgent {\n const memory = input.memory ?? [];\n const effective: AgentPromptSectionsInput = memory.some(isSoulSeed)\n ? { ...input, soul: null }\n : input;\n const sections = buildAgentPromptSections(effective);\n const carriers = AGENT_PROMPT_CARRIERS[agentPromptCarrierHarness(options.harness)];\n const nativeFile = options.nativeFile;\n const stale: StalePromptBlock[] = [];\n const holds = (text: string): boolean => nativeFile !== undefined && nativeFile.includes(text);\n const holdsIdentity = (identity: string): boolean =>\n nativeFile !== undefined &&\n (identity === DUTIES_HEADING ? /^## Duties$/m.test(nativeFile) : nativeFile.includes(identity));\n\n // A memory block the file holds verbatim is not repeated; one it holds with other text is stale.\n const liveMemory =\n carriers.memory === \"file-or-runner\"\n ? memory.filter((block) => {\n const text = renderMemoryBlock(block);\n if (text === undefined || holds(text)) return false;\n // Only a seed-only block is baked, so only its older copy is stale; the content of a\n // host-backed block is live and always the runner's.\n if (block.persisted === false && holdsIdentity(`<block name=\"${block.name}\" `)) {\n stale.push({ section: \"memory\", label: `memory block ${block.name}` });\n return false;\n }\n return true;\n })\n : memory;\n const live = buildAgentPromptSections({ ...effective, memory: liveMemory });\n const runnerSections = live.filter((section) => {\n const carrier = carriers[section.id];\n if (carrier === \"runner\") return true;\n if (carrier !== \"file-or-runner\") return false;\n if (section.id === \"memory\") return true;\n if (holds(section.text)) return false;\n const identity =\n section.id === \"duties\"\n ? DUTIES_HEADING\n : section.source && (section.id === \"composed\" || section.id === \"extensions\")\n ? section.text.split(\"\\n\", 1)[0]\n : undefined;\n if (identity !== undefined && holdsIdentity(identity)) {\n const label =\n section.id === \"duties\"\n ? \"duties\"\n : `${section.id === \"composed\" ? \"composed block\" : \"prompt extension\"} ${section.source}`;\n stale.push({ section: section.id, label });\n return false;\n }\n return true;\n });\n\n const systemPrompt = sections.map((s) => s.text).join(\"\\n\\n\");\n return {\n sections,\n systemPrompt,\n sentPrompt: sections\n .filter((section) => carriers[section.id] !== \"none\")\n .map((s) => s.text)\n .join(\"\\n\\n\"),\n carriers,\n runnerSections,\n stale,\n };\n}\n\nconst DUTIES_HEADING = \"## Duties\";\n\n/** Wording of one carrier in the docs table and the dry-run column. */\nexport const AGENT_PROMPT_CARRIER_LABELS: Record<AgentPromptCarrier, string> = {\n file: \"native file\",\n \"file-or-runner\": \"native file (runner adds it when the file lacks it)\",\n runner: \"runner only\",\n none: \"not sent\",\n};\n\nconst SECTION_LABELS: Record<AgentPromptSectionId, string> = {\n soul: \"Soul (`SOUL.md`)\",\n memory: \"Memory seeds (`<MEMORY>`)\",\n fragments: \"Framework fragments\",\n constraints: \"`## Constraints` (`RULES.md`)\",\n duties: \"`## Duties` (`DUTIES.md`)\",\n abilities: \"`## Installed Abilities`\",\n contracts: \"`## Contracts`\",\n composed: \"Composed inline blocks (rulesets, knowledge, `composes:`)\",\n extensions: \"Prompt extensions (`agent.prompt-extensions`)\",\n};\n\n/**\n * The markdown table of {@link AGENT_PROMPT_CARRIERS}: one row per section in the fixed order, one\n * column per harness group. `docs/sections/bridge/harnesses.md` holds exactly this text between its\n * `carriers:start` and `carriers:end` markers.\n */\nexport function renderAgentPromptCarrierTable(): string {\n const groups: readonly AgentPromptCarrierHarness[] = [\"claude-code\", \"codex\", \"omp\", \"other\"];\n const head = [\"Section\", ...groups.map((g) => (g === \"other\" ? \"other harnesses\" : `\\`${g}\\``))];\n const rows = AGENT_PROMPT_SECTION_ORDER.map((id) => [\n SECTION_LABELS[id],\n ...groups.map((g) => AGENT_PROMPT_CARRIER_LABELS[AGENT_PROMPT_CARRIERS[g][id]]),\n ]);\n const line = (cells: readonly string[]): string => `| ${cells.join(\" | \")} |`;\n return [line(head), line(head.map(() => \"---\")), ...rows.map(line)].join(\"\\n\");\n}\n","/**\n * Comment-preserving editor for skaile.yaml files.\n *\n * Uses the `yaml` library's Document API to parse into an AST that retains\n * comments, blank lines, and formatting. Mutations are applied to the AST\n * and serialized back — untouched sections remain byte-identical.\n *\n * Usage:\n *\n * import { WorkspaceYamlEditor } from '@skaile/workspaces/core'\n *\n * const editor = WorkspaceYamlEditor.load('/project/skaile.yaml')\n * editor.setAgentConfig('default', { harness: 'claude-sdk', model: 'claude-sonnet-4-6' })\n * editor.setSource({ url: 'https://github.com/skaile-ai/ai-assets' })\n * editor.save()\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport {\n Document,\n isMap,\n isScalar,\n isSeq,\n parseDocument,\n type Scalar,\n type YAMLMap,\n type YAMLSeq,\n} from \"yaml\";\nimport { yamlQuotingHint } from \"./manifest.js\";\nimport type {\n AgentConfigProfile,\n ConnectorDeclaration,\n McpServerDeclaration,\n OverrideEntry,\n SourceEntry,\n StoreEntry,\n} from \"./workspace-config.js\";\nimport { ConfigParseError, parseSourceEntries, valueShapeError } from \"./workspace-config.js\";\n\n/**\n * Append `value` to `node`. A sequence that `remove` emptied is the flow form `[]`; adding to it\n * would print the item as an indented JSON-style block, so it turns into a block sequence first\n * (p1690). A non-empty flow sequence a user wrote by hand keeps its style.\n */\nfunction appendToSeq(node: YAMLSeq, value: unknown): void {\n if (node.items.length === 0) node.flow = false;\n node.add(value);\n}\n\n/**\n * Comment-preserving editor for `skaile.yaml` files.\n * Uses the `yaml` library's Document AST so untouched sections remain byte-identical.\n * Create with `WorkspaceYamlEditor.load(filePath)` or `WorkspaceYamlEditor.create(filePath)`.\n * @docLink packages/core/workspace-config#workspace-yaml-editor\n */\nexport class WorkspaceYamlEditor {\n readonly path: string;\n private doc: Document;\n\n private constructor(path: string, doc: Document) {\n this.path = path;\n this.doc = doc;\n }\n\n /**\n * Load an existing skaile.yaml file.\n *\n * @throws {Error} `<file> — parse error: <reason>` (one line, the one every other command\n * prints) when the file does not parse. A document with errors cannot be written back, so\n * it is never handed out: `source add` used to crash in `save()` and `source list` read it\n * as empty (p1421).\n */\n static load(filePath: string): WorkspaceYamlEditor {\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n const raw = readFileSync(filePath, \"utf-8\");\n const doc = parseDocument(raw);\n const first = doc.errors[0];\n if (first) {\n const reason = (first.message.split(\"\\n\")[0] ?? \"\").replace(/:$/, \"\");\n const hint = yamlQuotingHint(reason, raw);\n throw new ConfigParseError(\n `${basename(filePath)} — parse error: ${reason}${hint ? `.${hint}` : \"\"}`,\n );\n }\n // A root that is no mapping (`- a`) or a `dependencies:`/`sources:` of the wrong shape is\n // refused with the line `check` prints, never edited or called empty (p1421, p1620).\n const label = basename(filePath);\n if (doc.contents !== null && !isMap(doc.contents)) {\n throw new ConfigParseError(\n `${label} — parse error: skaile.yaml must be a mapping at the top level.`,\n );\n }\n const wrongShape = valueShapeError((doc.toJS() ?? {}) as Record<string, unknown>);\n if (wrongShape) throw new ConfigParseError(`${label} — parse error: ${wrongShape.message}`);\n return new WorkspaceYamlEditor(filePath, doc);\n }\n\n /** Create a new empty document (for use when no file exists yet). */\n static create(filePath: string): WorkspaceYamlEditor {\n const doc = new Document({});\n return new WorkspaceYamlEditor(filePath, doc);\n }\n\n /** Write the document back to disk, preserving comments and formatting. */\n save(): void {\n writeFileSync(this.path, this.doc.toString());\n }\n\n /** Return the serialized YAML string without writing to disk. */\n toString(): string {\n return this.doc.toString();\n }\n\n // ── Scalar fields ──────────────────────────────────────────────────────────\n\n /** Get a top-level scalar field (name, description). */\n get(key: \"name\" | \"description\"): string | undefined {\n const val = this.doc.get(key);\n return val != null ? String(val) : undefined;\n }\n\n /** Set a top-level scalar field. */\n set(key: \"name\" | \"description\", value: string): void {\n this.doc.set(key, value);\n }\n\n // ── Agent config ──────────────────────────────────────────────────────────\n\n /**\n * Get an agent config profile by name (usually \"default\").\n * Reads from `agent-config` (canonical YAML key).\n */\n getAgentConfig(profile = \"default\"): AgentConfigProfile | undefined {\n const section = this._getAgentConfigSection();\n if (!section) return undefined;\n const node = section.get(profile, true);\n // `.toJSON()` — a YAMLMap's own properties are AST internals, not the\n // profile's fields, so returning the node would make every read undefined.\n if (!isMap(node)) return undefined;\n const profileJson = node.toJSON() as AgentConfigProfile & { driver?: unknown };\n // Pre-6.0 `driver` key: surface it as `harness` (the file is only\n // rewritten by `setAgentConfig` / `skaile migrate harness`).\n const { driver, ...rest } = profileJson;\n if (driver === undefined) return profileJson;\n return rest.harness === undefined && typeof driver === \"string\"\n ? { ...rest, harness: driver }\n : rest;\n }\n\n /**\n * Set fields on an agent config profile. Merges with existing values —\n * only the provided fields are overwritten.\n */\n setAgentConfig(profile: string, values: Partial<AgentConfigProfile>): void {\n let section = this._getAgentConfigSection();\n if (!section) {\n // `createNode` — `doc.set(key, plainObject)` stores the object itself,\n // which is not a YAMLMap, and every later `section.get`/`set` would\n // throw on it.\n this.doc.set(\"agent-config\", this.doc.createNode({ [profile]: {} }));\n section = this._getAgentConfigSection();\n if (!section) throw new Error(\"failed to create the agent-config section\");\n }\n\n const existing = section.get(profile, true);\n if (!existing || !isMap(existing)) {\n section.set(profile, { ...values });\n return;\n }\n\n // Editing a profile migrates its pre-6.0 `driver` key in place: the value moves to\n // `harness` (keeping position and comments), or is dropped when `harness` already exists.\n const driverPair = existing.items.find((p) => isScalar(p.key) && p.key.value === \"driver\");\n if (driverPair) {\n if (existing.has(\"harness\")) existing.delete(\"driver\");\n else (driverPair.key as Scalar).value = \"harness\";\n }\n\n for (const [k, v] of Object.entries(values)) {\n if (v === undefined) continue;\n existing.set(k, v);\n }\n }\n\n /**\n * Delete a field from an agent config profile.\n */\n deleteAgentConfigField(profile: string, field: string): void {\n const section = this._getAgentConfigSection();\n if (!section) return;\n const profileNode = section.get(profile, true);\n if (isMap(profileNode)) {\n profileNode.delete(field);\n }\n }\n\n private _getAgentConfigSection(): YAMLMap | undefined {\n // Try canonical 'agent-config' first, then 'agent_config'\n const node = this.doc.get(\"agent-config\", true) ?? this.doc.get(\"agent_config\", true);\n return isMap(node) ? (node as YAMLMap) : undefined;\n }\n\n // ── Connectors ─────────────────────────────────────────────────────────────\n\n /** Get all connectors. */\n getConnectors(): ConnectorDeclaration[] {\n const node = this.doc.get(\"connectors\", true) ?? this.doc.get(\"data_resources\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as ConnectorDeclaration[];\n }\n\n /** Add or update a connector by id. */\n setConnector(connector: ConnectorDeclaration): void {\n const key = \"connectors\";\n const node = this.doc.get(key, true);\n\n if (!node || !isSeq(node)) {\n this.doc.set(key, this.doc.createNode([connector]));\n return;\n }\n\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"id\") === connector.id) {\n node.set(i, this.doc.createNode(connector));\n found = true;\n break;\n }\n }\n\n if (!found) {\n appendToSeq(node, this.doc.createNode(connector));\n }\n }\n\n /** Remove a connector by id. */\n removeConnector(id: string): boolean {\n const key = this.doc.has(\"connectors\") ? \"connectors\" : \"data_resources\";\n const node = this.doc.get(key, true);\n if (!node || !isSeq(node)) return false;\n\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"id\") === id) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── MCP servers ────────────────────────────────────────────────────────────\n\n /**\n * Add or replace an mcp server entry, matched by `id`.\n * Mirrors {@link setConnector}: an existing entry with the same `id` is\n * replaced in place; otherwise the declaration is appended.\n */\n setMcpServer(mcp: McpServerDeclaration): void {\n const key = \"mcp_servers\";\n const node = this.doc.get(key, true);\n\n if (!node || !isSeq(node)) {\n this.doc.set(key, this.doc.createNode([mcp]));\n return;\n }\n\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"id\") === mcp.id) {\n node.set(i, this.doc.createNode(mcp));\n found = true;\n break;\n }\n }\n\n if (!found) {\n appendToSeq(node, this.doc.createNode(mcp));\n }\n }\n\n // ── Dependencies ───────────────────────────────────────────────────────────\n\n /**\n * Append a dependency ref to `dependencies:`, deduped by exact ref string.\n *\n * @param ref - Canonical dependency ref (e.g. `skill:@skaile-ai/foo#1.0.0`).\n * @returns `true` when the ref was newly added, `false` when it was already present.\n */\n addDependency(ref: string): boolean {\n const node = this.doc.get(\"dependencies\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"dependencies\", this.doc.createNode([ref]));\n return true;\n }\n for (const item of node.items) {\n const cur = item != null && typeof item === \"object\" && \"value\" in item ? item.value : item;\n if (cur === ref) return false;\n }\n appendToSeq(node, this.doc.createNode(ref));\n return true;\n }\n\n // ── Plugins ────────────────────────────────────────────────────────────────\n\n /** Get all `plugins:` specifiers. */\n getPlugins(): string[] {\n const node = this.doc.get(\"plugins\", true);\n if (!isSeq(node)) return [];\n const out: string[] = [];\n for (const item of node.items) {\n const cur = item != null && typeof item === \"object\" && \"value\" in item ? item.value : item;\n if (typeof cur === \"string\") out.push(cur);\n }\n return out;\n }\n\n /**\n * Add a plugin specifier to `plugins:`, deduped by package name.\n * If an entry with the same package name exists it is replaced (so a version\n * bump re-pins in place); otherwise the spec is appended.\n *\n * @param spec - npm specifier, e.g. `\"@skaile/provider-fly@^0.1.0\"`.\n * @param nameOf - Extracts the package name from a spec (caller passes `parseSpec`-derived names).\n * @returns `true` when an existing entry was replaced, `false` when appended.\n */\n addPlugin(spec: string, nameOf: (s: string) => string): boolean {\n const node = this.doc.get(\"plugins\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"plugins\", this.doc.createNode([spec]));\n return false;\n }\n\n const wantName = nameOf(spec);\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n const cur = item != null && typeof item === \"object\" && \"value\" in item ? item.value : item;\n if (typeof cur === \"string\" && nameOf(cur) === wantName) {\n node.set(i, this.doc.createNode(spec));\n return true;\n }\n }\n appendToSeq(node, this.doc.createNode(spec));\n return false;\n }\n\n /**\n * Remove the `plugins:` entry whose package name matches `name`.\n *\n * @param name - Package name to remove (e.g. `\"@skaile/provider-fly\"`).\n * @param nameOf - Extracts the package name from a spec.\n * @returns `true` when an entry was removed.\n */\n removePlugin(name: string, nameOf: (s: string) => string): boolean {\n const node = this.doc.get(\"plugins\", true);\n if (!node || !isSeq(node)) return false;\n\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n const cur = item != null && typeof item === \"object\" && \"value\" in item ? item.value : item;\n if (typeof cur === \"string\" && nameOf(cur) === name) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Sources ────────────────────────────────────────────────────────────────\n\n /**\n * Get all source entries (`{url, pin?}`).\n * @throws {SourceEntryError} When an item has no `url:` (see {@link parseSourceEntries}).\n */\n getSources(): SourceEntry[] {\n const node = this.doc.get(\"sources\", true);\n if (!isSeq(node)) return [];\n const raw = node.toJSON() as unknown[];\n parseSourceEntries(raw);\n return raw as SourceEntry[];\n }\n\n /**\n * Add or update a source entry, matched by `url`.\n * If an entry with the same url exists, it is replaced.\n */\n setSource(entry: SourceEntry): void {\n const node = this.doc.get(\"sources\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"sources\", this.doc.createNode([entry]));\n return;\n }\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"url\") === entry.url) {\n node.set(i, this.doc.createNode(entry));\n found = true;\n break;\n }\n }\n if (!found) appendToSeq(node, this.doc.createNode(entry));\n }\n\n /** Remove a source entry by url. Returns true when an entry was removed. */\n removeSource(url: string): boolean {\n const node = this.doc.get(\"sources\", true);\n if (!node || !isSeq(node)) return false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"url\") === url) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Stores ─────────────────────────────────────────────────────────────────\n\n /** Get all store entries (`{url}`). */\n getStores(): StoreEntry[] {\n const node = this.doc.get(\"stores\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as StoreEntry[];\n }\n\n /** Add or update a store entry, matched by `url`. */\n setStore(entry: StoreEntry): void {\n const node = this.doc.get(\"stores\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"stores\", this.doc.createNode([entry]));\n return;\n }\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"url\") === entry.url) {\n node.set(i, this.doc.createNode(entry));\n found = true;\n break;\n }\n }\n if (!found) appendToSeq(node, this.doc.createNode(entry));\n }\n\n /** Remove a store entry by url. Returns true when an entry was removed. */\n removeStore(url: string): boolean {\n const node = this.doc.get(\"stores\", true);\n if (!node || !isSeq(node)) return false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"url\") === url) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Overrides ────────────────────────────────────────────────────────────────\n\n /** Get all override entries (`{ref, source, reason}`). */\n getOverrides(): OverrideEntry[] {\n const node = this.doc.get(\"overrides\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as OverrideEntry[];\n }\n\n /** Add or update an override entry, matched by `ref`. */\n setOverride(entry: OverrideEntry): void {\n const node = this.doc.get(\"overrides\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"overrides\", this.doc.createNode([entry]));\n return;\n }\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"ref\") === entry.ref) {\n node.set(i, this.doc.createNode(entry));\n found = true;\n break;\n }\n }\n if (!found) appendToSeq(node, this.doc.createNode(entry));\n }\n\n /** Remove an override entry by ref. Returns true when an entry was removed. */\n removeOverride(ref: string): boolean {\n const node = this.doc.get(\"overrides\", true);\n if (!node || !isSeq(node)) return false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"ref\") === ref) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Raw access (escape hatch) ─────────────────────────────────────────────\n\n /** Get the underlying yaml Document for advanced manipulation. */\n get document(): Document {\n return this.doc;\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { harnessSessionConfigHome, removeSessionConfigFile, writeSessionConfigFile } from './chunk-NBAGV6L2.js';
|
|
2
|
-
import { selectableEntries, isStockCatalogEndpoint, resolveRegistryBinding, harnessModelSelector, entrySurface, entryBaseUrl, entryModelIds, versionedAnthropicBaseUrl } from './chunk-
|
|
3
|
-
import { providerCredentialEnvName } from './chunk-
|
|
2
|
+
import { selectableEntries, isStockCatalogEndpoint, resolveRegistryBinding, harnessModelSelector, entrySurface, entryBaseUrl, entryModelIds, versionedAnthropicBaseUrl } from './chunk-PPSSDUN6.js';
|
|
3
|
+
import { providerCredentialEnvName } from './chunk-S3UOZBGE.js';
|
|
4
4
|
import { join } from 'path';
|
|
5
5
|
|
|
6
6
|
var OPENCODE_NPM_PACKAGE = {
|
|
@@ -84,5 +84,5 @@ function materializeOpenCodeConfig(session, config) {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
export { materializeOpenCodeConfig };
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
87
|
+
//# sourceMappingURL=chunk-VFEZUSB6.js.map
|
|
88
|
+
//# sourceMappingURL=chunk-VFEZUSB6.js.map
|