@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":["../runner/src/composition/errors.ts","../runner/src/mixin-resolver.ts","../runner/src/composition/content-source.ts","../runner/src/composition/types.ts","../runner/src/composition/compile.ts","../runner/src/composition/prompt-sections.ts"],"names":["path","fs","parseYaml","dir","realpathSync","existsSync"],"mappings":"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","file":"chunk-4ZNKEDYH.js","sourcesContent":["/**\n * composition/errors.ts\n *\n * Typed failures of the composition pipeline. Composition never omits an item\n * silently: a ref that cannot be served exactly as pinned ends the session\n * start (or the rebuild) with one of these.\n */\n\n/** Diagnostic code carried by a {@link CompositionError}. */\nexport type CompositionErrorCode =\n | \"composition_asset_missing\"\n | \"composition_conflict\"\n | \"composition_rebuild_required\";\n\n/** Why a {@link CompositionError} was raised (stable, for tests and tooling). */\nexport type CompositionErrorReason =\n /** No content found for the ref (nothing on disk, no lock pin bytes, no catalog hit). */\n | \"missing\"\n /** Several distinct catalog/lock candidates match the ref. */\n | \"ambiguous\"\n /** Bytes on disk differ from the hash the lock or compile manifest recorded. */\n | \"hash_mismatch\"\n /** Sub-agent composition loops back onto an agent already being composed. */\n | \"cycle\"\n /** `compile_manifest.json` has the old schema or is malformed. */\n | \"stale_manifest\"\n /** An `inline-snapshot` item has no compiled bytes. */\n | \"not_compiled\";\n\n/** A locked asset whose pinned version the registered library no longer holds (p1510). */\nexport interface LockedAssetMoved {\n /** Lock key, `kind:@publisher/name#version`. */\n key: string;\n /** Name of the library the lock entry came from. */\n library: string;\n /** Version the library holds now. */\n libraryVersion: string;\n /** Version the lock pins. */\n lockedVersion: string;\n}\n\n/**\n * Thrown by the content source, the compile writer and the resolver. `code`\n * mirrors the `skaile validate` diagnostic of the same name.\n *\n * @docLink packages/runner/capabilities#composition-error\n */\nexport class CompositionError extends Error {\n constructor(\n readonly code: CompositionErrorCode,\n readonly reason: CompositionErrorReason,\n message: string,\n /** The composes ref the failure belongs to, when there is one. */\n readonly ref?: string,\n /** Set when only `skaile update` can serve the ref: the library moved past the locked version. */\n readonly moved?: LockedAssetMoved,\n ) {\n super(message);\n this.name = \"CompositionError\";\n }\n}\n\n/** True for a {@link CompositionError} with the given code (any code when omitted). */\nexport function isCompositionError(\n err: unknown,\n code?: CompositionErrorCode,\n): err is CompositionError {\n return err instanceof CompositionError && (code === undefined || err.code === code);\n}\n","/**\n * mixin-resolver.ts\n *\n * Resolves agent composition mixin refs (persona, ruleset, knowledge) to text\n * for rendering into the agent definition at install time.\n *\n * Three ref forms:\n * Local path — \"./extra-rules.md\" or \"/abs/path/rules.md\"\n * Read directly relative to agentDir (or absolute).\n * Bare name — \"skaile-base\"\n * Resolved from repos as `${defaultKind}:skaile-base`\n * Qualified — \"persona:researcher@ext-repo#v2.0\"\n * Full AssetRef syntax; repo qualifier searches specific repo only.\n *\n * Knowledge bundles (kind=\"knowledge\") resolve to a directory — all *.md files\n * inside are loaded in priority order (same priority-based loadKnowledge logic used by the asset-manager).\n */\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { CatalogEntry } from \"@skaile/workspaces/core\";\nimport { parse as parseYaml } from \"yaml\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\n/**\n * A resolved mixin with its content loaded from disk.\n *\n * @docLink packages/runner/dev-guide#key-conventions\n */\nexport interface ResolvedMixin {\n /** Text content ready for system prompt injection. */\n content: string;\n /** Absolute path to the source file, for debugging. */\n source: string;\n}\n\n/**\n * Pre-built repo catalog map: repoName → CatalogEntry[].\n * Built by the caller (session-builder) from wsConfig.repositories using\n * ensureRepo() + scanRepo() from @skaile/workspaces/core/repo-manager.\n * Local repos are scanned directly; remote repos use the global cache.\n * @docLink packages/runner/dev-guide#key-conventions\n */\nexport type RepoMap = Record<string, CatalogEntry[]>;\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Resolve a single mixin ref to its text content.\n * Returns null if the ref cannot be resolved (missing file or unknown catalog name).\n * Never throws — callers filter nulls.\n * @docLink packages/runner/dev-guide#key-conventions\n */\nexport async function resolveMixin(\n ref: string,\n defaultKind: string,\n agentDir: string,\n repos: RepoMap,\n): Promise<ResolvedMixin | null> {\n // ── Local path ────────────────────────────────────────────────────────────\n if (ref.startsWith(\".\") || ref.startsWith(\"/\")) {\n const absPath = ref.startsWith(\"/\") ? ref : path.join(agentDir, ref);\n if (defaultKind === \"knowledge\") {\n return loadKnowledgeDir(absPath);\n }\n const content = await readFileSafe(absPath);\n if (!content) return null;\n return { content: stripFrontmatter(content).trim(), source: absPath };\n }\n\n // ── Catalog ref ───────────────────────────────────────────────────────────\n const { kind, name, repoQualifier } = parseRef(ref, defaultKind);\n const entry = findInRepos(repos, kind, name, repoQualifier);\n if (!entry) return null;\n\n if (entry.kind === \"knowledge\") {\n // knowledge.yaml source — load the sibling directory\n return loadKnowledgeDir(path.dirname(entry.source));\n }\n\n // persona, ruleset, skill, contract — read manifest file, strip frontmatter\n const raw = await readFileSafe(entry.source);\n if (!raw) return null;\n return { content: stripFrontmatter(raw).trim(), source: entry.source };\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\n/** Read a file, return empty string on any error. */\nasync function readFileSafe(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\n/** Strip YAML frontmatter (--- delimited) from markdown content. */\nexport function stripFrontmatter(text: string): string {\n return text.replace(/^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n?/, \"\");\n}\n\n/**\n * Parse a mixin ref string into kind, name, and optional repo qualifier.\n * Handles: \"skaile-base\", \"persona:skaile-base\", \"ruleset:safety@skaile-ai#v2\"\n */\nfunction parseRef(\n ref: string,\n defaultKind: string,\n): { kind: string; name: string; repoQualifier: string | undefined } {\n let rest = ref.trim();\n let kind = defaultKind;\n\n // Extract kind: prefix\n const colonIdx = rest.indexOf(\":\");\n if (colonIdx !== -1) {\n kind = rest.slice(0, colonIdx).trim();\n rest = rest.slice(colonIdx + 1).trim();\n }\n\n // Extract #pin suffix (drop it — we use whatever's installed)\n const hashIdx = rest.indexOf(\"#\");\n if (hashIdx !== -1) rest = rest.slice(0, hashIdx).trim();\n\n // Extract @repo qualifier\n let repoQualifier: string | undefined;\n const atIdx = rest.indexOf(\"@\");\n if (atIdx !== -1) {\n repoQualifier = rest.slice(atIdx + 1).trim() || undefined;\n rest = rest.slice(0, atIdx).trim();\n }\n\n return { kind, name: rest, repoQualifier };\n}\n\n/** Find a CatalogEntry by kind + name across all repos (or a specific repo). */\nfunction findInRepos(\n repos: RepoMap,\n kind: string,\n name: string,\n repoQualifier: string | undefined,\n): CatalogEntry | undefined {\n const searchRepos = repoQualifier\n ? repos[repoQualifier]\n ? [repos[repoQualifier]]\n : []\n : Object.values(repos);\n\n for (const entries of searchRepos) {\n const found = entries.find((e) => e.kind === kind && e.name === name);\n if (found) return found;\n }\n return undefined;\n}\n\n/**\n * True when `text` is a knowledge `index.yaml` that declares `documents: []` —\n * a valid, empty knowledge base. A missing, unparsable or `documents`-less\n * index is not.\n */\nexport function isEmptyKnowledgeIndex(text: string): boolean {\n if (!text) return false;\n let parsed: unknown;\n try {\n parsed = parseYaml(text);\n } catch {\n return false;\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return false;\n const documents = (parsed as { documents?: unknown }).documents;\n return Array.isArray(documents) && documents.length === 0;\n}\n\n/**\n * Load all *.md files from a knowledge directory, in priority order.\n * Reads index.yaml (same priority-based loadKnowledge format used by the asset-manager) when present.\n * Returns combined content joined with \\n\\n---\\n\\n; an empty-documents index yields the index\n * bytes (see {@link isEmptyKnowledgeIndex}); null when the dir is missing or holds neither.\n */\nexport async function loadKnowledgeDir(dir: string): Promise<ResolvedMixin | null> {\n let entries: string[];\n try {\n entries = (await fs.readdir(dir)).filter((e) => e.endsWith(\".md\"));\n } catch {\n return null;\n }\n\n // Parse index.yaml for priority ordering\n const priorityMap: Record<string, number> = {};\n const indexContent = await readFileSafe(path.join(dir, \"index.yaml\"));\n if (indexContent) {\n const pathMatches = [...indexContent.matchAll(/path:\\s*(\\S+)/g)];\n const priorityMatches = [...indexContent.matchAll(/priority:\\s*(\\d+)/g)];\n pathMatches.forEach((m, i) => {\n const filename = m[1];\n if (!filename) return;\n const priority = priorityMatches[i] ? parseInt(priorityMatches[i][1] ?? \"99\", 10) : 99;\n priorityMap[filename] = priority;\n });\n }\n\n const docs = await Promise.all(\n entries.map(async (filename) => ({\n filename,\n priority: priorityMap[filename] ?? 99,\n content: (await readFileSafe(path.join(dir, filename))).trim(),\n })),\n );\n\n const sorted = docs\n .filter((d) => d.content)\n .sort((a, b) => a.priority - b.priority || a.filename.localeCompare(b.filename));\n\n if (sorted.length === 0) {\n // A dir whose valid index declares no documents is an empty knowledge base,\n // captured as its index bytes. Anything else without content is unresolved.\n return isEmptyKnowledgeIndex(indexContent) ? { content: indexContent, source: dir } : null;\n }\n\n return {\n content: sorted.map((d) => d.content).join(\"\\n\\n---\\n\\n\"),\n source: dir,\n };\n}\n","/**\n * composition/content-source.ts\n *\n * The one place composition bytes come from. A `composes:` ref resolves, in\n * order, through\n *\n * 1. a local path (`./rules.md`, `/abs/RULES.md`, a directory holding the\n * kind's manifest) read straight from disk;\n * 2. the project lock (`skaile.lock.yaml`): a locked asset is served exactly\n * as pinned, from the store cache or the catalog checkout, and its bytes\n * are verified against the per-file hashes the lock recorded — the pin\n * wins over whatever the catalog holds now;\n * 3. the catalog: a discovery scan of the local catalog roots (the\n * `ai-assets/` tree, source clones). Several distinct matches are an\n * error, never a pick.\n *\n * Nothing here touches the network. A ref that cannot be served throws a\n * {@link CompositionError}; an item is never dropped silently.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readdirSync, realpathSync, statSync, writeFileSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n getGlobalCacheDir,\n type LockEntry,\n matchPin,\n readLock,\n resolveSkWorkspaceConfig,\n sameRepo,\n sourceCacheKey,\n} from \"@skaile/workspaces/core\";\nimport { createDefaultKindRegistry, type DiscoveredAsset } from \"@skaile/workspaces/discovery\";\nimport { knowledgeKindProvider, LocalIndex, scanLibraryRoot } from \"@skaile/workspaces/library\";\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport { CompositionError, type LockedAssetMoved } from \"./errors.js\";\nimport { loadKnowledgeDir, resolveMixin, stripFrontmatter } from \"../mixin-resolver.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * One composition asset as the content source served it.\n *\n * @docLink packages/runner/capabilities#composition-asset\n */\nexport interface CompositionAsset {\n /**\n * Where the bytes came from, in a stable spelling: `kind:@publisher/name#version`\n * for a locked or catalog asset, `local:<path>` for a file on disk.\n */\n canonicalRef: string;\n /** Asset kind the item was loaded as. */\n kind: string;\n /** Resolved version; `null` for a local file (identified by its content hash only). */\n version: string | null;\n /** SHA-256 (hex) of `content`. */\n sha256: string;\n /** Prompt-injectable text (frontmatter stripped). */\n content: string;\n /**\n * Absolute path of the primary file (or knowledge directory) the content\n * was read from. Diagnostic and traversal aid; never part of the compile\n * manifest.\n */\n location?: string;\n}\n\n/**\n * Loads composition assets. One instance serves one agent directory (relative\n * refs resolve against it).\n *\n * @docLink packages/runner/capabilities#composition-content-source\n */\nexport interface CompositionContentSource {\n /**\n * Load the asset a `composes:` ref names.\n * @throws {CompositionError} `composition_asset_missing` when nothing serves the ref;\n * `composition_conflict` when several candidates match or locked bytes drifted.\n */\n load(ref: string, kind: string): Promise<CompositionAsset>;\n /** A source for another agent directory (sub-agent traversal), sharing catalog scans. */\n scoped(agentDir: string): CompositionContentSource;\n}\n\n/**\n * Options for {@link createCompositionContentSource}.\n *\n * @docLink packages/runner/capabilities#composition-content-source\n */\nexport interface CompositionContentSourceOpts {\n /** Agent definition directory — base of relative refs. */\n agentDir: string;\n /** Project root — holds `skaile.lock.yaml` and `.skaile/cache/store`. */\n projectDir: string;\n /** Kind registry used to recognise a kind's manifest file. Defaults to the built-in providers plus `knowledge`. */\n registry?: IAssetKindRegistry;\n /**\n * Catalog roots to scan. Defaults to the `ai-assets/` tree above the project,\n * the declared `sources:` clones and the project's source cache.\n */\n catalogRoots?: readonly string[];\n /**\n * The lock entries to resolve pins against, instead of reading `skaile.lock.yaml`. A command\n * that renders before it writes its new lock (`skaile update`) hands over the entries it is\n * about to write.\n */\n lockAssets?: Record<string, LockEntry>;\n}\n\n// ---------------------------------------------------------------------------\n// Ref parsing\n// ---------------------------------------------------------------------------\n\ninterface ParsedRef {\n publisher?: string;\n name: string;\n /** Version pin (`#1.2.3`, `#^1`, legacy `@^1`). */\n pin?: string;\n}\n\n/**\n * Split a catalog ref into publisher, name and pin. Accepts the canonical\n * `kind:@publisher/name#pin`, a bare `@publisher/name` / `name`, and the legacy\n * `@publisher/name@pin` spelling. The `kind:` prefix is dropped: the item's\n * own `kind` is authoritative.\n */\nfunction parseCatalogRef(ref: string): ParsedRef {\n let rest = ref.trim();\n const kindPrefix = /^([a-z][a-z0-9-]*):(?!\\/\\/)/.exec(rest);\n if (kindPrefix) rest = rest.slice(kindPrefix[0].length);\n\n let pin: string | undefined;\n const hash = rest.indexOf(\"#\");\n if (hash !== -1) {\n pin = rest.slice(hash + 1).trim() || undefined;\n rest = rest.slice(0, hash);\n }\n\n const scoped = /^@([^/@]+)\\/([^@]+)(?:@(.+))?$/.exec(rest);\n if (scoped) {\n return { publisher: scoped[1], name: scoped[2], pin: pin ?? scoped[3]?.trim() };\n }\n const at = rest.indexOf(\"@\");\n if (at !== -1) {\n // `name@publisher` (the older mixin spelling).\n return { publisher: rest.slice(at + 1) || undefined, name: rest.slice(0, at), pin };\n }\n return { name: rest, pin };\n}\n\nconst LOCK_KEY_RE = /^([a-z][a-z0-9-]*):@([^/]+)\\/([^#]+)#(.+)$/;\n\nconst barePublisher = (p: string): string => (p.startsWith(\"@\") ? p.slice(1) : p);\n\nconst sha256Of = (text: string | Uint8Array): string =>\n createHash(\"sha256\").update(text).digest(\"hex\");\n\n// ---------------------------------------------------------------------------\n// Catalog scan (shared, lazy, per root)\n// ---------------------------------------------------------------------------\n\ninterface ScannedAsset {\n asset: DiscoveredAsset;\n root: string;\n}\n\nclass CatalogScanner {\n private readonly scans = new Map<string, ScannedAsset[]>();\n private roots: readonly string[] | undefined;\n\n constructor(\n private readonly projectDir: string,\n private readonly registry: IAssetKindRegistry,\n explicitRoots: readonly string[] | undefined,\n ) {\n this.roots = explicitRoots;\n }\n\n /** Every discovered asset of `kind` named `name` under one root (any root, declared or not). */\n findIn(root: string, kind: string, name: string): ScannedAsset[] {\n return this.scan(root).filter((hit) => hit.asset.kind === kind && hit.asset.name === name);\n }\n\n /** Every discovered asset of `kind` named `name`, across all roots. */\n find(kind: string, name: string): ScannedAsset[] {\n const out: ScannedAsset[] = [];\n for (const root of this.resolveRoots()) {\n for (const hit of this.scan(root)) {\n if (hit.asset.kind === kind && hit.asset.name === name) out.push(hit);\n }\n }\n return out;\n }\n\n private scan(root: string): ScannedAsset[] {\n let cached = this.scans.get(root);\n if (!cached) {\n try {\n cached = scanLibraryRoot(root, this.registry).assets.map((asset) => ({ asset, root }));\n } catch {\n cached = [];\n }\n this.scans.set(root, cached);\n }\n return cached;\n }\n\n private resolveRoots(): readonly string[] {\n if (!this.roots) this.roots = defaultCatalogRoots(this.projectDir);\n return this.roots;\n }\n}\n\nfunction defaultCatalogRoots(projectDir: string): string[] {\n const roots = new Set<string>();\n const add = (dir: string | undefined): void => {\n if (!dir || !existsSync(dir)) return;\n try {\n if (statSync(dir).isDirectory()) roots.add(realpathSync(dir));\n } catch {\n // unreadable root — skip\n }\n };\n\n // ai-assets/ above the project (same upward walk agent:<name> resolution uses).\n let dir = path.resolve(projectDir);\n for (let i = 0; i < 8; i++) {\n const candidate = path.join(dir, \"ai-assets\");\n if (existsSync(candidate)) {\n add(candidate);\n break;\n }\n const parent = path.resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n\n // Declared `sources:` clones in the global cache.\n try {\n for (const source of resolveSkWorkspaceConfig(projectDir).sources ?? []) {\n add(path.join(getGlobalCacheDir(), sourceCacheKey(source.url)));\n }\n } catch {\n // an unreadable skaile.yaml must not break composition of local refs\n }\n\n // The project's own source cache (clones / symlinks).\n const projectSources = path.join(projectDir, \".skaile\", \"cache\", \"sources\");\n try {\n for (const entry of readdirSync(projectSources)) add(path.join(projectSources, entry));\n } catch {\n // no project source cache\n }\n return [...roots];\n}\n\n/**\n * Local roots of the registered libraries a library-origin lock entry can come from: the\n * library registered under the recorded name, else (the name is machine-local) one with the\n * recorded remote URL. Empty when none is registered or its folder is gone.\n */\nasync function registeredLibraryRoots(origin: { name: string; url?: string }): Promise<string[]> {\n let index: LocalIndex | undefined;\n try {\n index = new LocalIndex();\n const libraries = await index.listSources();\n const byName = libraries.filter((l) => l.name === origin.name);\n const byUrl =\n byName.length === 0 && origin.url\n ? libraries.filter((l) => {\n const url = (l.backendConfig as { url?: unknown }).url;\n return typeof url === \"string\" && sameRepo(url, origin.url ?? \"\");\n })\n : [];\n return [...byName, ...byUrl].map((l) => l.path).filter((dir) => existsSync(dir));\n } catch {\n return [];\n } finally {\n index?.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Content source\n// ---------------------------------------------------------------------------\n\n/**\n * Create the content source for one agent directory.\n *\n * @param opts - Agent dir, project dir and optional registry / catalog roots.\n * @returns A {@link CompositionContentSource} that resolves local, lock-pinned and catalog refs.\n * @docLink packages/runner/capabilities#composition-content-source\n */\nexport function createCompositionContentSource(\n opts: CompositionContentSourceOpts,\n): CompositionContentSource {\n const registry = opts.registry ?? createDefaultKindRegistry([knowledgeKindProvider]);\n const scanner = new CatalogScanner(opts.projectDir, registry, opts.catalogRoots);\n return new DefaultCompositionContentSource(\n path.resolve(opts.agentDir),\n path.resolve(opts.projectDir),\n registry,\n scanner,\n opts.lockAssets,\n );\n}\n\nclass DefaultCompositionContentSource implements CompositionContentSource {\n private lockLoaded: boolean;\n private lockAssets: Record<string, LockEntry>;\n\n constructor(\n private readonly agentDir: string,\n private readonly projectDir: string,\n private readonly registry: IAssetKindRegistry,\n private readonly scanner: CatalogScanner,\n private readonly givenLock?: Record<string, LockEntry>,\n ) {\n this.lockLoaded = givenLock !== undefined;\n this.lockAssets = givenLock ?? {};\n }\n\n scoped(agentDir: string): CompositionContentSource {\n return new DefaultCompositionContentSource(\n path.resolve(agentDir),\n this.projectDir,\n this.registry,\n this.scanner,\n this.givenLock,\n );\n }\n\n async load(ref: string, kind: string): Promise<CompositionAsset> {\n if (ref.startsWith(\".\") || ref.startsWith(\"/\")) return this.loadLocal(ref, kind);\n const parsed = parseCatalogRef(ref);\n if (!parsed.name) {\n throw new CompositionError(\n \"composition_asset_missing\",\n \"missing\",\n `\"${ref}\" (${kind}): not a resolvable ref`,\n ref,\n );\n }\n const locked = this.lockCandidate(ref, kind, parsed);\n if (locked) return this.loadLocked(ref, kind, locked);\n return this.loadFromCatalog(ref, kind, parsed);\n }\n\n // ── local ────────────────────────────────────────────────────────────────\n\n private async loadLocal(ref: string, kind: string): Promise<CompositionAsset> {\n const absPath = ref.startsWith(\"/\") ? ref : path.join(this.agentDir, ref);\n let target = absPath;\n let resolved = await resolveMixin(ref, kind, this.agentDir, {});\n if (!resolved && kind !== \"knowledge\" && isDirectory(absPath)) {\n const manifest = this.manifestInDir(kind, absPath);\n if (manifest) {\n target = manifest;\n resolved = await resolveMixin(manifest, kind, this.agentDir, {});\n }\n }\n if (!resolved) {\n throw new CompositionError(\n \"composition_asset_missing\",\n \"missing\",\n `\"${ref}\" (${kind}): no content at ${absPath}`,\n ref,\n );\n }\n return {\n canonicalRef: `local:${this.relativeToProject(target)}`,\n kind,\n version: null,\n sha256: sha256Of(resolved.content),\n content: resolved.content,\n location: resolved.source,\n };\n }\n\n private manifestInDir(kind: string, dir: string): string | undefined {\n const provider = this.registry.getProvider(kind);\n for (const name of readdirSync(dir).sort()) {\n const matches = provider ? provider.matchesPath(name) : name === `${kind.toUpperCase()}.md`;\n if (matches && statSync(path.join(dir, name)).isFile()) return path.join(dir, name);\n }\n return undefined;\n }\n\n private relativeToProject(abs: string): string {\n const rel = path.relative(this.projectDir, abs).split(path.sep).join(\"/\");\n return rel.startsWith(\"..\") ? abs : rel;\n }\n\n // ── lock pin ─────────────────────────────────────────────────────────────\n\n private lockCandidate(\n ref: string,\n kind: string,\n parsed: ParsedRef,\n ): { key: string; publisher: string; name: string; version: string; entry: LockEntry } | null {\n if (!this.lockLoaded) {\n this.lockLoaded = true;\n try {\n this.lockAssets = readLock(path.join(this.projectDir, \"skaile.lock.yaml\"))?.assets ?? {};\n } catch (err) {\n throw new CompositionError(\n \"composition_conflict\",\n \"stale_manifest\",\n `skaile.lock.yaml is unreadable: ${err instanceof Error ? err.message : String(err)}`,\n ref,\n );\n }\n }\n const matches: Array<{\n key: string;\n publisher: string;\n name: string;\n version: string;\n entry: LockEntry;\n }> = [];\n for (const [key, entry] of Object.entries(this.lockAssets)) {\n const m = LOCK_KEY_RE.exec(key);\n if (!m || m[1] !== kind || m[3] !== parsed.name) continue;\n if (parsed.publisher && barePublisher(parsed.publisher) !== m[2]) continue;\n if (parsed.pin && !matchPin(parsed.pin, m[4])) continue;\n matches.push({ key, publisher: m[2], name: m[3], version: m[4], entry });\n }\n if (matches.length > 1) {\n throw new CompositionError(\n \"composition_conflict\",\n \"ambiguous\",\n `\"${ref}\" (${kind}): skaile.lock.yaml pins ${matches.length} matching assets (${matches\n .map((x) => x.key)\n .join(\", \")}) — qualify the ref with a publisher and version`,\n ref,\n );\n }\n return matches[0] ?? null;\n }\n\n private async loadLocked(\n ref: string,\n kind: string,\n pin: { key: string; publisher: string; name: string; version: string; entry: LockEntry },\n ): Promise<CompositionAsset> {\n const { entry } = pin;\n const storeDir = path.join(\n this.projectDir,\n \".skaile\",\n \"cache\",\n \"store\",\n pin.publisher,\n kind,\n pin.name,\n pin.version,\n );\n\n // Lock paths are repo-relative; the asset dir (store cache or checkout) holds them minus\n // the directory prefix they all share.\n const prefix = commonDirPrefix(entry.files.map((f) => f.path));\n const strip = (p: string): string =>\n prefix && p.startsWith(`${prefix}/`) ? p.slice(prefix.length + 1) : p;\n\n // 1. Store cache: the exact pinned bytes, flat under <store>/<pub>/<kind>/<name>/<version>.\n if (isDirectory(storeDir) && entry.files.length > 0) {\n await this.verifyFiles(ref, pin.key, entry, (p) => path.join(storeDir, strip(p)));\n const primary = this.primaryOf(\n kind,\n entry.files.map((f) => f.path),\n );\n return this.readAsset(\n kind,\n pin.key,\n pin.version,\n path.join(storeDir, strip(primary)),\n storeDir,\n );\n }\n\n // 2. A catalog checkout holding the pinned version; a library-origin asset also\n // reads from the registered library its lock entry records (it has no source clone).\n const holdsPin = (h: ScannedAsset): boolean =>\n h.asset.version === pin.version && barePublisher(h.asset.publisher) === pin.publisher;\n let hit = this.scanner.find(kind, pin.name).find(holdsPin);\n if (!hit && entry.library) {\n for (const root of await registeredLibraryRoots(entry.library)) {\n hit = this.scanner.findIn(root, kind, pin.name).find(holdsPin);\n if (hit) break;\n }\n }\n if (!hit) {\n // A source entry keeps its own commit: the shared clone may sit on another one.\n const atCommit = await this.loadAtLockedCommit(ref, kind, pin, strip);\n if (atCommit) return atCommit;\n // The registered library holds the asset at another version: the pinned bytes are gone\n // and only `skaile update` moves the lock to the library's copy (p1510), as for a skill.\n let moved: LockedAssetMoved | undefined;\n if (entry.library) {\n for (const root of await registeredLibraryRoots(entry.library)) {\n const other = this.scanner\n .findIn(root, kind, pin.name)\n .find((h) => barePublisher(h.asset.publisher) === pin.publisher);\n if (other?.asset.version) {\n moved = {\n key: pin.key,\n library: entry.library.name,\n libraryVersion: other.asset.version,\n lockedVersion: pin.version,\n };\n break;\n }\n }\n }\n throw new CompositionError(\n \"composition_asset_missing\",\n \"missing\",\n moved\n ? `\"${ref}\" (${kind}): skaile.lock.yaml pins ${pin.key} but library \"${moved.library}\" is at ${moved.libraryVersion} — run \\`skaile update\\` to move the lock to it`\n : `\"${ref}\" (${kind}): skaile.lock.yaml pins ${pin.key} but no bytes for it are on disk — run \\`skaile install\\``,\n ref,\n moved,\n );\n }\n const assetRoot = hit.asset.fileFilter.assetRoot;\n if (entry.files.length > 0) {\n try {\n await this.verifyFiles(ref, pin.key, entry, (p) => path.join(assetRoot, strip(p)));\n } catch (err) {\n // Same version, other bytes: the clone is on another commit than the entry's own.\n const atCommit = await this.loadAtLockedCommit(ref, kind, pin, strip);\n if (atCommit) return atCommit;\n throw err;\n }\n } else if (entry.library?.sha256 && entry.library.sha256 !== hit.asset.sha256) {\n throw new CompositionError(\n \"composition_conflict\",\n \"hash_mismatch\",\n `\"${ref}\" (${kind}): ${pin.key} was locked from a library at ${entry.library.sha256.slice(0, 12)}… but the catalog now holds ${hit.asset.sha256.slice(0, 12)}…`,\n ref,\n );\n }\n return this.readAsset(kind, pin.key, pin.version, hit.asset.manifestPath, assetRoot);\n }\n\n /**\n * A source-origin entry's bytes at ITS locked commit, read from the git objects of a source\n * clone that holds the commit (the clone's checkout never moves) and staged under the\n * project cache. `null` when the entry is not a source entry or no clone holds the commit; the\n * staged bytes are verified against the lock like any other.\n */\n private async loadAtLockedCommit(\n ref: string,\n kind: string,\n pin: { key: string; publisher: string; name: string; version: string; entry: LockEntry },\n strip: (p: string) => string,\n ): Promise<CompositionAsset | null> {\n const { entry } = pin;\n const source = entry.source;\n if (!source || entry.library || entry.origin === \"store\" || entry.files.length === 0) {\n return null;\n }\n // The value goes to git as an argument: only a full sha, never a ref name, `-` option or zeros.\n if (!/^[0-9a-f]{40}$/.test(source.commit) || /^0+$/.test(source.commit)) return null;\n const clones = [path.join(getGlobalCacheDir(), sourceCacheKey(source.url))];\n const projectSources = path.join(this.projectDir, \".skaile\", \"cache\", \"sources\");\n try {\n for (const e of readdirSync(projectSources)) clones.push(path.join(projectSources, e));\n } catch {\n // no project source cache\n }\n const git = (dir: string, args: string[]) =>\n spawnSync(\"git\", [\"-C\", dir, ...args], {\n stdio: \"pipe\",\n maxBuffer: 256 * 1024 * 1024,\n env: { ...process.env, GIT_TERMINAL_PROMPT: \"0\" },\n });\n const clone = clones.find(\n (dir) =>\n existsSync(dir) && git(dir, [\"cat-file\", \"-e\", `${source.commit}^{commit}`]).status === 0,\n );\n if (!clone) return null;\n const stageDir = path.join(\n this.projectDir,\n \".skaile\",\n \"cache\",\n \"source-commits\",\n source.commit,\n pin.publisher,\n kind,\n pin.name,\n pin.version,\n );\n for (const file of entry.files) {\n const shown = git(clone, [\"show\", `${source.commit}:${file.path}`]);\n if (shown.status !== 0) return null;\n const dest = path.join(stageDir, strip(file.path));\n mkdirSync(path.dirname(dest), { recursive: true });\n writeFileSync(dest, shown.stdout);\n }\n await this.verifyFiles(ref, pin.key, entry, (p) => path.join(stageDir, strip(p)));\n const primary = this.primaryOf(\n kind,\n entry.files.map((f) => f.path),\n );\n return this.readAsset(\n kind,\n pin.key,\n pin.version,\n path.join(stageDir, strip(primary)),\n stageDir,\n );\n }\n\n private async verifyFiles(\n ref: string,\n key: string,\n entry: LockEntry,\n locate: (lockPath: string) => string,\n ): Promise<void> {\n for (const file of entry.files) {\n const abs = locate(file.path);\n let bytes: Uint8Array;\n try {\n bytes = await fs.readFile(abs);\n } catch {\n throw new CompositionError(\n \"composition_asset_missing\",\n \"missing\",\n `\"${ref}\": ${key} lists ${file.path} but ${abs} is missing — run \\`skaile install\\``,\n ref,\n );\n }\n const actual = sha256Of(bytes);\n if (actual !== file.sha256) {\n throw new CompositionError(\n \"composition_conflict\",\n \"hash_mismatch\",\n `\"${ref}\": ${file.path} of ${key} is ${actual.slice(0, 12)}… on disk but skaile.lock.yaml pins ${file.sha256.slice(0, 12)}… — run \\`skaile install\\` to restore it`,\n ref,\n );\n }\n }\n }\n\n private primaryOf(kind: string, paths: readonly string[]): string {\n const provider = this.registry.getProvider(kind);\n const hit = provider ? paths.find((p) => provider.matchesPath(p)) : undefined;\n return hit ?? paths[0] ?? \"\";\n }\n\n // ── catalog ──────────────────────────────────────────────────────────────\n\n private async loadFromCatalog(\n ref: string,\n kind: string,\n parsed: ParsedRef,\n ): Promise<CompositionAsset> {\n const wantPublisher = parsed.publisher ? barePublisher(parsed.publisher) : undefined;\n const candidates = this.scanner\n .find(kind, parsed.name)\n .filter((h) => !wantPublisher || barePublisher(h.asset.publisher) === wantPublisher)\n .filter((h) => matchPin(parsed.pin, h.asset.version));\n\n // The same asset reached through two roots (symlinked clone) is one candidate.\n const distinct = new Map<string, ScannedAsset>();\n for (const c of candidates) {\n distinct.set(`${c.asset.publisher}/${c.asset.name}#${c.asset.version}:${c.asset.sha256}`, c);\n }\n if (distinct.size === 0) {\n throw new CompositionError(\n \"composition_asset_missing\",\n \"missing\",\n `\"${ref}\" (${kind}): not in skaile.lock.yaml and not found in the local catalog`,\n ref,\n );\n }\n if (distinct.size > 1) {\n throw new CompositionError(\n \"composition_conflict\",\n \"ambiguous\",\n `\"${ref}\" (${kind}): ${distinct.size} catalog assets match (${[...distinct.values()]\n .map((c) => `@${barePublisher(c.asset.publisher)}/${c.asset.name}#${c.asset.version}`)\n .join(\", \")}) — qualify the ref with a publisher and version`,\n ref,\n );\n }\n const { asset } = [...distinct.values()][0]!;\n const canonical = `${kind}:@${barePublisher(asset.publisher)}/${asset.name}#${asset.version}`;\n return this.readAsset(\n kind,\n canonical,\n asset.version,\n asset.manifestPath,\n asset.fileFilter.assetRoot,\n );\n }\n\n // ── shared read ──────────────────────────────────────────────────────────\n\n private async readAsset(\n kind: string,\n canonicalRef: string,\n version: string,\n primaryPath: string,\n assetRoot: string,\n ): Promise<CompositionAsset> {\n let content: string;\n let location = primaryPath;\n if (kind === \"knowledge\") {\n const dir =\n path.basename(primaryPath) === \"knowledge.yaml\" ? path.dirname(primaryPath) : assetRoot;\n const loaded = await loadKnowledgeDir(dir);\n if (!loaded) {\n throw new CompositionError(\n \"composition_asset_missing\",\n \"missing\",\n `\"${canonicalRef}\": knowledge directory ${dir} holds no documents`,\n canonicalRef,\n );\n }\n content = loaded.content;\n location = dir;\n } else {\n let raw: string;\n try {\n raw = await fs.readFile(primaryPath, \"utf-8\");\n } catch {\n throw new CompositionError(\n \"composition_asset_missing\",\n \"missing\",\n `\"${canonicalRef}\": ${primaryPath} is not readable`,\n canonicalRef,\n );\n }\n content = stripFrontmatter(raw).trim();\n }\n return { canonicalRef, kind, version, sha256: sha256Of(content), content, location };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isDirectory(p: string): boolean {\n try {\n return statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Longest directory prefix shared by every path (`\"\"` when there is none). */\nfunction commonDirPrefix(paths: readonly string[]): string {\n if (paths.length === 0) return \"\";\n const split = paths.map((p) => p.split(\"/\").slice(0, -1));\n const first = split[0]!;\n let n = first.length;\n for (const parts of split) {\n let i = 0;\n while (i < n && i < parts.length && parts[i] === first[i]) i++;\n n = i;\n }\n return first.slice(0, n).join(\"/\");\n}\n\n/**\n * Hash helper shared by the compile writer and the resolver: the hash a\n * {@link CompositionAsset} / compile entry records for `content`.\n */\nexport function hashContent(content: string): string {\n return sha256Of(content);\n}\n","/**\n * composition/types.ts\n *\n * Shared types for the agent composition module (Task 1.7).\n *\n * Defines the binding system, compile manifest schema, and the\n * resolved composition result that the runner consumes at session start.\n */\n\nimport type { AgentComposeItem, Binding } from \"@skaile/workspaces/types/manifests\";\n\n// ---------------------------------------------------------------------------\n// Re-export from types\n// ---------------------------------------------------------------------------\n\nexport type { AgentComposeItem, Binding };\n\n// ---------------------------------------------------------------------------\n// Kind-to-binding defaults\n// ---------------------------------------------------------------------------\n\n/**\n * Default binding by asset kind.\n *\n * Per the spec: soul -> inline-snapshot, ruleset -> inline-live,\n * everything else (skill, knowledge, connector, etc.) -> discoverable,\n * agent -> delegate (a sub-agent the harness spawns natively; `run` is opt-in).\n * A kind with no entry here has no default: {@link resolveBinding} throws\n * {@link UnknownCompositionKindError} rather than guessing.\n */\nconst KIND_BINDING_DEFAULTS: Record<string, Binding> = {\n soul: \"inline-snapshot\",\n persona: \"inline-snapshot\",\n ruleset: \"inline-live\",\n skill: \"discoverable\",\n knowledge: \"discoverable\",\n connector: \"discoverable\",\n prompt: \"inline-live\",\n flow: \"discoverable\",\n \"mcp-server\": \"discoverable\",\n contract: \"inline-live\",\n agent: \"delegate\",\n};\n\n/**\n * Thrown by {@link resolveBinding} when a composition item has no explicit\n * `binding` and its `kind` has no default. `skaile validate` reports the same\n * condition earlier as `unknown_asset_kind`.\n */\nexport class UnknownCompositionKindError extends Error {\n readonly code = \"unknown_asset_kind\";\n constructor(\n readonly kind: string,\n readonly ref: string,\n ) {\n super(`composes item \"${ref}\" has unknown asset kind \"${kind}\" and no explicit binding`);\n this.name = \"UnknownCompositionKindError\";\n }\n}\n\n/**\n * Resolve the effective binding for a composition item.\n * Uses explicit `binding` if set, otherwise falls back to kind default.\n *\n * @param item - A single entry from an agent manifest's `composes:` list.\n * @returns The effective {@link Binding} — explicit value when set, otherwise\n * the kind-specific default (e.g. `soul` → `inline-snapshot`, `skill` → `discoverable`).\n * @throws {UnknownCompositionKindError} when no `binding` is set and the kind has no default.\n * @docLink packages/runner/capabilities#resolve-binding\n */\nexport function resolveBinding(item: AgentComposeItem): Binding {\n if (item.binding) return item.binding;\n if (!Object.hasOwn(KIND_BINDING_DEFAULTS, item.kind)) {\n throw new UnknownCompositionKindError(item.kind, item.ref);\n }\n return KIND_BINDING_DEFAULTS[item.kind]!;\n}\n\n// ---------------------------------------------------------------------------\n// Compile manifest (written to <agent>/compile_manifest.json)\n// ---------------------------------------------------------------------------\n\n/**\n * Single entry in the agent's `compile_manifest.json`. Records the resolved\n * ref, version, content hash, effective binding and the captured bytes of one\n * composition item at the time of the last `skaile rebuild` run.\n *\n * @docLink packages/runner/capabilities#compile-manifest-entry\n */\nexport interface CompileManifestEntry {\n /** The `composes[].ref` exactly as written in agent.yaml. */\n asset_ref: string;\n /** The item's asset kind. */\n kind: string;\n /** Where the bytes actually came from (`kind:@publisher/name#version` or `local:<path>`). */\n resolved_ref: string;\n /** Resolved version; `null` for a local file. */\n version: string | null;\n /** SHA256 of `content` (recomputed on every read). */\n hash: string;\n /** Effective binding. */\n binding: Binding;\n /** ISO timestamp when this entry was resolved. */\n resolved_at: string;\n /** The captured bytes: what `inline-snapshot` serves and `discoverable` hands out on invocation. */\n content: string;\n}\n\n/**\n * Root structure of `compile_manifest.json` written by `skaile rebuild`.\n * Tracks the prompt version counter and all resolved composition entries.\n * The runner serves `inline-snapshot` and `discoverable` content from these\n * entries and never from the live sources.\n *\n * @docLink packages/runner/capabilities#compile-manifest\n */\nexport interface CompileManifest {\n /** Compile manifest schema version (1 was the hash-only format; it must be rebuilt). */\n schema_version: 2;\n /** Prompt version — bumped on every rebuild */\n prompt_version: number;\n /** Entries for each composition item */\n entries: CompileManifestEntry[];\n /** ISO timestamp of the last rebuild */\n compiled_at: string;\n}\n\n/**\n * The bytes one run of an agent uses for every non-snapshot composition item,\n * captured when the run starts and reused when the run resumes. Stored beside\n * the session's persisted state (`<project>/.skaile/composition-runs/<id>.json`).\n *\n * @docLink packages/runner/capabilities#composition-run-snapshot\n */\nexport interface CompositionRunSnapshot {\n schema_version: 1;\n /** Session id (or run id) the snapshot belongs to. */\n session_id: string;\n /** ISO timestamp of capture. */\n captured_at: string;\n /** Compile `prompt_version` the run started under (`null` when never compiled). */\n prompt_version: number | null;\n /** One entry per resolved item (content items and sub-agent items). */\n items: CompileManifestEntry[];\n}\n\n// ---------------------------------------------------------------------------\n// Resolved composition result (consumed by runner at session start)\n// ---------------------------------------------------------------------------\n\n/**\n * A resolved inline content block for system prompt injection.\n *\n * @docLink packages/runner/capabilities#inline-block\n */\nexport interface InlineBlock {\n /** Source ref for debugging */\n ref: string;\n /** Asset kind */\n kind: string;\n /** The text content to inject */\n content: string;\n /** Binding mode that produced this block */\n binding: \"inline-live\" | \"inline-snapshot\";\n /**\n * True for the agent's own convention files (SOUL.md, RULES.md, DUTIES.md).\n * Harnesses carry those natively (rendered at install), so the runner does\n * not repeat them in the live system prompt.\n */\n implicit?: boolean;\n}\n\n/**\n * A resolved discoverable item (becomes a tool-list entry).\n *\n * @docLink packages/runner/capabilities#discoverable-entry\n */\nexport interface DiscoverableEntry {\n /** Source ref */\n ref: string;\n /** Asset kind */\n kind: string;\n /** Tool name for capability registry */\n name: string;\n /** One-line description */\n description: string;\n /** Full content (loaded on demand when the tool is invoked) */\n content: string;\n}\n\n/**\n * One composition item as resolved for a run — what `skaile run --dry-run`\n * prints and what the run snapshot is built from.\n *\n * @docLink packages/runner/capabilities#resolved-composition-item\n */\nexport interface ResolvedCompositionItem {\n /** `composes[].ref` as written. */\n ref: string;\n kind: string;\n binding: Binding;\n /** Where the bytes came from (`kind:@publisher/name#version` or `local:<path>`). */\n resolvedRef: string;\n version: string | null;\n /** SHA256 of `content`. */\n hash: string;\n content: string;\n /**\n * `compiled` — served from the compile manifest; `run-snapshot` — reused from\n * the run's own capture (resume); `source` — read from the content source now.\n */\n origin: \"compiled\" | \"run-snapshot\" | \"source\";\n}\n\n/**\n * The full result of resolving an agent's composes: field.\n *\n * @docLink packages/runner/capabilities#resolved-composition\n */\nexport interface ResolvedComposition {\n /** Blocks to inline into the system prompt (inline-live + inline-snapshot) */\n inlineBlocks: InlineBlock[];\n /** Items to register as discoverable capabilities */\n discoverableEntries: DiscoverableEntry[];\n /** Every resolved content item, in `composes:` order (sub-agent items carry no content and are absent). */\n items: ResolvedCompositionItem[];\n /** Non-fatal notes */\n warnings: string[];\n}\n","/**\n * composition/compile.ts\n *\n * Implements `skaile rebuild <agent>` — resolves every `composes:` item through\n * the content source, captures kind, resolved ref and bytes, bumps the prompt\n * version and writes `<agent>/compile_manifest.json` (schema 2).\n *\n * The compile manifest is what an agent runs from: `inline-snapshot` serves its\n * bytes and `discoverable` items hand out its bytes on invocation. A later\n * change to a local file or to the catalog changes nothing until the next\n * `skaile rebuild`.\n */\n\nimport { existsSync, realpathSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AgentComposeItem } from \"@skaile/workspaces/types/manifests\";\nimport { BindingSchema } from \"@skaile/workspaces/types/manifests\";\nimport { parse as parseYaml } from \"yaml\";\nimport * as z from \"zod\";\nimport {\n type CompositionAsset,\n type CompositionContentSource,\n hashContent,\n} from \"./content-source.js\";\nimport { CompositionError } from \"./errors.js\";\nimport { type CompileManifest, type CompileManifestEntry, resolveBinding } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/**\n * Filename for the agent compile manifest written by `skaile rebuild`.\n *\n * @docLink packages/runner/capabilities#compile-composition\n */\nexport const COMPILE_MANIFEST_FILENAME = \"compile_manifest.json\";\n\n/** One captured composition item, as stored in `compile_manifest.json` and in run snapshots. */\nexport const CompileManifestEntrySchema = z.object({\n asset_ref: z.string().min(1),\n kind: z.string().min(1),\n resolved_ref: z.string().min(1),\n version: z.string().nullable(),\n hash: z.string().regex(/^[0-9a-f]{64}$/),\n binding: BindingSchema,\n resolved_at: z.string(),\n content: z.string(),\n});\n\nconst CompileManifestSchema = z.object({\n schema_version: z.literal(2),\n prompt_version: z.number().int().nonnegative(),\n compiled_at: z.string(),\n entries: z.array(CompileManifestEntrySchema),\n});\n\n/** Marks the pre-content (hash-only) manifest format. */\nconst StaleSchemaMarker = z.object({ schema_version: z.literal(1) });\n\n/** The slice of a sub-agent's agent.yaml the cycle walk reads. */\nconst NestedAgentComposes = z.object({ composes: z.array(z.unknown()) });\nconst NestedAgentItem = z.object({ kind: z.literal(\"agent\"), ref: z.string() });\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/**\n * Options for {@link compileComposition}.\n *\n * @docLink packages/runner/capabilities#compile-composition\n */\nexport interface CompileOpts {\n /** Path to the agent directory (where agent.yaml and compile_manifest.json live) */\n agentDir: string;\n /** The agent's composes: items (may be empty — an empty composition is valid). */\n items: AgentComposeItem[];\n /** Where composition bytes come from. */\n source: CompositionContentSource;\n}\n\n/**\n * Result returned by {@link compileComposition}.\n *\n * @docLink packages/runner/capabilities#compile-composition\n */\nexport interface CompileResult {\n /** The written compile manifest */\n manifest: CompileManifest;\n /** Path to the written file */\n manifestPath: string;\n /** Number of entries written (every item resolves or the compile throws) */\n resolvedCount: number;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compile (rebuild) the agent's composition.\n *\n * 1. Resolves ALL items through the content source (any unresolvable item throws)\n * 2. Rejects sub-agent loops (`agent` items that compose their own ancestor)\n * 3. Bumps prompt_version (continuing a schema-1 file's counter)\n * 4. Writes compile_manifest.json atomically\n *\n * @param opts - Compile options including agentDir, items and the content source.\n * @returns A {@link CompileResult} with the written manifest.\n * @throws {CompositionError} `composition_asset_missing` / `composition_conflict` for an item that cannot be served.\n * @docLink packages/runner/capabilities#compile-composition\n */\nexport async function compileComposition(opts: CompileOpts): Promise<CompileResult> {\n const { agentDir, items, source } = opts;\n const manifestPath = path.join(agentDir, COMPILE_MANIFEST_FILENAME);\n\n const nextVersion = (await readPromptVersion(manifestPath)) + 1;\n\n const loaded = new Map<string, CompositionAsset>();\n const entries: CompileManifestEntry[] = [];\n const resolvedAt = new Date().toISOString();\n for (const item of items) {\n const binding = resolveBinding(item);\n const cacheKey = `${item.kind}\\u0000${item.ref}`;\n let asset = loaded.get(cacheKey);\n if (!asset) {\n asset = await source.load(item.ref, item.kind);\n loaded.set(cacheKey, asset);\n }\n entries.push({\n asset_ref: item.ref,\n kind: item.kind,\n resolved_ref: asset.canonicalRef,\n version: asset.version,\n hash: asset.sha256,\n binding,\n resolved_at: resolvedAt,\n content: asset.content,\n });\n }\n\n await assertAcyclicSubagents(agentDir, items, source);\n\n const manifest: CompileManifest = {\n schema_version: 2,\n prompt_version: nextVersion,\n entries,\n compiled_at: new Date().toISOString(),\n };\n\n // Write atomically: temp file + rename to avoid corruption on interrupt\n const tmpPath = `${manifestPath}.tmp`;\n await fs.writeFile(tmpPath, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf-8\");\n await fs.rename(tmpPath, manifestPath);\n\n return { manifest, manifestPath, resolvedCount: entries.length };\n}\n\n/**\n * Whether `<agentDir>/compile_manifest.json` already pins exactly what {@link compileComposition}\n * would write now: one entry per item, in order, with the ref, kind and binding of the item and\n * the hash of the bytes the content source serves today. `skaile add`/`install`/`update` compile\n * an agent only when this is `false`, so a pin that `skaile rebuild` wrote survives an install\n * and a changed lock revision gets a fresh pin (p413, p1310).\n *\n * @returns `false` when there is no pin, it is stale-schema or malformed, or any item differs.\n * @throws {CompositionError} `composition_asset_missing` / `composition_conflict` for an item the content source cannot serve.\n */\nexport async function isCompilePinCurrent(opts: CompileOpts): Promise<boolean> {\n let pinned: CompileManifest | undefined;\n try {\n pinned = await loadCompileManifestFromDir(opts.agentDir);\n } catch {\n return false;\n }\n if (!pinned || pinned.entries.length !== opts.items.length) return false;\n for (const [i, item] of opts.items.entries()) {\n const entry = pinned.entries[i]!;\n if (entry.asset_ref !== item.ref || entry.kind !== item.kind) return false;\n if (entry.binding !== resolveBinding(item)) return false;\n const asset = await opts.source.load(item.ref, item.kind);\n if (asset.sha256 !== entry.hash) return false;\n }\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Reading\n// ---------------------------------------------------------------------------\n\n/**\n * Load an existing compile_manifest.json.\n *\n * @param manifestPath - Absolute path to the manifest file.\n * @returns The parsed {@link CompileManifest}, or `undefined` when the file does not exist.\n * @throws {CompositionError} `composition_rebuild_required` for a schema-1 artifact or a malformed\n * file; `composition_conflict` when an entry's `hash` no longer matches its `content`.\n * @docLink packages/runner/capabilities#load-compile-manifest\n */\nexport async function loadCompileManifest(\n manifestPath: string,\n): Promise<CompileManifest | undefined> {\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, \"utf-8\");\n } catch {\n return undefined;\n }\n\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch {\n throw new CompositionError(\n \"composition_rebuild_required\",\n \"stale_manifest\",\n `${manifestPath} is not valid JSON — run \\`skaile rebuild\\``,\n );\n }\n if (StaleSchemaMarker.safeParse(json).success) {\n throw new CompositionError(\n \"composition_rebuild_required\",\n \"stale_manifest\",\n `${manifestPath} is a schema-1 compile manifest (hashes only, no captured content) — run \\`skaile rebuild\\``,\n );\n }\n const parsed = CompileManifestSchema.safeParse(json);\n if (!parsed.success) {\n throw new CompositionError(\n \"composition_rebuild_required\",\n \"stale_manifest\",\n `${manifestPath} is malformed (${parsed.error.issues[0]?.path.join(\".\") || \"root\"}: ${parsed.error.issues[0]?.message}) — run \\`skaile rebuild\\``,\n );\n }\n for (const entry of parsed.data.entries) {\n const actual = hashContent(entry.content);\n if (actual !== entry.hash) {\n throw new CompositionError(\n \"composition_conflict\",\n \"hash_mismatch\",\n `${manifestPath}: captured content of \"${entry.asset_ref}\" (${entry.kind}) hashes to ${actual.slice(0, 12)}… but the manifest records ${entry.hash.slice(0, 12)}… — the file was edited; run \\`skaile rebuild\\``,\n entry.asset_ref,\n );\n }\n }\n return parsed.data as CompileManifest;\n}\n\n/**\n * Load compile manifest from an agent directory, reading the file from\n * `<agentDir>/compile_manifest.json`.\n *\n * @param agentDir - Absolute path to the agent definition directory.\n * @returns The parsed {@link CompileManifest} or `undefined` when the file does not exist.\n * @throws {CompositionError} see {@link loadCompileManifest}.\n * @docLink packages/runner/capabilities#load-compile-manifest-from-dir\n */\nexport async function loadCompileManifestFromDir(\n agentDir: string,\n): Promise<CompileManifest | undefined> {\n return loadCompileManifest(path.join(agentDir, COMPILE_MANIFEST_FILENAME));\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** The `prompt_version` of whatever schema the existing file is in (0 when absent/unreadable). */\nasync function readPromptVersion(manifestPath: string): Promise<number> {\n try {\n const parsed = JSON.parse(await fs.readFile(manifestPath, \"utf-8\"));\n return typeof parsed?.prompt_version === \"number\" ? parsed.prompt_version : 0;\n } catch {\n return 0;\n }\n}\n\nconst identityOf = (file: string): string => {\n try {\n return realpathSync(file);\n } catch {\n return file;\n }\n};\n\n/**\n * Walk `kind: agent` items depth-first; an agent that (transitively) composes\n * itself would spawn forever, so it is a `composition_conflict`.\n */\nasync function assertAcyclicSubagents(\n agentDir: string,\n items: readonly AgentComposeItem[],\n source: CompositionContentSource,\n): Promise<void> {\n const manifestFile = path.join(agentDir, \"agent.yaml\");\n const root = existsSync(manifestFile) ? identityOf(manifestFile) : identityOf(agentDir);\n\n const visit = async (\n children: readonly { kind: string; ref: string }[],\n src: CompositionContentSource,\n chain: readonly string[],\n ): Promise<void> => {\n for (const item of children) {\n if (item.kind !== \"agent\") continue;\n const asset = await src.load(item.ref, \"agent\");\n const identity = asset.location ? identityOf(asset.location) : asset.canonicalRef;\n if (chain.includes(identity)) {\n throw new CompositionError(\n \"composition_conflict\",\n \"cycle\",\n `\"${item.ref}\" (agent): sub-agent composition loops (${[...chain, identity]\n .map((p) => path.basename(path.dirname(p)) || p)\n .join(\" → \")})`,\n item.ref,\n );\n }\n const nested = NestedAgentComposes.safeParse(parseYamlSafe(asset.content));\n if (!nested.success || !asset.location) continue;\n const subagents = nested.data.composes.flatMap((c) => {\n const parsedItem = NestedAgentItem.safeParse(c);\n return parsedItem.success ? [parsedItem.data] : [];\n });\n if (subagents.length === 0) continue;\n await visit(subagents, src.scoped(path.dirname(asset.location)), [...chain, identity]);\n }\n };\n\n await visit(items, source, [root]);\n}\n\nfunction parseYamlSafe(text: string): unknown {\n try {\n return parseYaml(text);\n } catch {\n return null;\n }\n}\n","/**\n * composition/prompt-sections.ts\n *\n * The agent part of the runner's live system prompt. It comes from the same\n * `assembleAgent` the install renderers bake the native agent file with, so\n * the two cannot disagree on order or text:\n * soul → `<MEMORY>` → fragments → constraints → duties → abilities → contracts\n * → composed → extensions.\n *\n * The runner adds only what the harness's native file does not carry\n * (`AGENT_PROMPT_CARRIERS` in core). Under claude-code and codex the file holds the\n * soul, constraints, composed blocks, memory seeds, duties and extensions, so the runner\n * adds a section only when the file lacks its exact text (a host-backed memory block, a file\n * rendered before the section was baked, no file). omp reads only `RULES.md` from its agent dir\n * and no `SOUL.md`, so for omp the runner adds the soul, memory, duties, composed blocks and\n * extensions itself.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport {\n type AgentPromptSection,\n type AgentPromptSectionsInput,\n type AssembledAgent,\n assembleAgent,\n HARNESS_TARGETS,\n harnessNameForHarnessId,\n} from \"@skaile/workspaces/core\";\nimport type { ResolvedAgentInstance } from \"./resolve-instance.js\";\n\n/** A loaded `agent.prompt-extensions` entry. */\nexport interface PromptExtensionPart {\n value: string;\n /** Path the extension was loaded from. */\n source: string;\n}\n\n/** Options of {@link buildRunnerAgentSections}. */\nexport interface BuildRunnerAgentSectionsOptions {\n /** Harness id of the session; decides what its native file carries. Default: a harness that reads the native file. */\n harness?: string;\n /** Text of the native agent file the harness reads (`.claude/agents/<id>.md`), when there is one. */\n nativeFile?: string;\n}\n\n/**\n * The one input set of the agent prompt, from what {@link resolveAgentInstance} resolved: the\n * install path bakes it into the native file, `skaile run` sends it, `--print-prompt` prints it.\n *\n * @param resolved - The resolved instance, or `null` when the session has no agent definition.\n * @param promptExtensions - Loaded `agent.prompt-extensions`, in declared order.\n */\nexport function agentPromptInput(\n resolved: ResolvedAgentInstance | null,\n promptExtensions: readonly PromptExtensionPart[],\n): AgentPromptSectionsInput {\n const blocks = resolved?.inlineBlocks ?? [];\n const joined = (kind: string): string =>\n blocks\n .filter((block) => block.implicit && block.kind === kind)\n .map((block) => block.content.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n return {\n soul: joined(\"soul\"),\n memory: resolved?.memoryBlocks ?? [],\n duties: joined(\"prompt\"),\n composed: blocks\n .filter((block) => !block.implicit)\n .map((block) => ({ text: block.content, source: block.ref })),\n promptExtensions: promptExtensions.map((e) => ({ text: e.value, source: e.source })),\n };\n}\n\n/**\n * Assemble the agent prompt of a run.\n *\n * @param resolved - The resolved instance, or `null` when the session has no agent definition.\n * @param promptExtensions - Loaded `agent.prompt-extensions`, in declared order.\n * @param options - Harness and native file text.\n */\nexport function assembleRunnerAgent(\n resolved: ResolvedAgentInstance | null,\n promptExtensions: readonly PromptExtensionPart[],\n options: BuildRunnerAgentSectionsOptions = {},\n): AssembledAgent {\n return assembleAgent(agentPromptInput(resolved, promptExtensions), options);\n}\n\n/**\n * Build the agent sections of the live system prompt.\n *\n * @param resolved - The resolved instance, or `null` when the session has no agent definition.\n * @param promptExtensions - Loaded `agent.prompt-extensions`, in declared order.\n * @param options - Harness and native file text.\n * @returns Non-empty sections in the shared order; join `text` with the runner's section separator.\n */\nexport function buildRunnerAgentSections(\n resolved: ResolvedAgentInstance | null,\n promptExtensions: readonly PromptExtensionPart[],\n options: BuildRunnerAgentSectionsOptions = {},\n): AgentPromptSection[] {\n return assembleRunnerAgent(resolved, promptExtensions, options).runnerSections;\n}\n\n/**\n * The path of the native agent file the harness reads for the instance `agentName`, or `undefined`\n * when the harness has none: `.claude/agents/<id>.md` for claude-code and\n * `.codex/skaile-agents/<id>.md` (the identity the codex harness reads) for codex.\n *\n * @param cwd - The harness working directory the native files were rendered into.\n * @param harness - Harness id of the session.\n * @param agentName - The instance id the file is named after.\n */\nexport function nativeAgentFilePath(\n cwd: string,\n harness: string | undefined,\n agentName: string,\n): string | undefined {\n const target = harnessNameForHarnessId(harness);\n if (target === \"claude-code\") {\n return join(cwd, HARNESS_TARGETS[\"claude-code\"].local.agent, `${agentName}.md`);\n }\n if (target === \"codex\") {\n // The codex harness reads `skaile-agents/<id>.md` beside `agents/`.\n return join(\n cwd,\n dirname(HARNESS_TARGETS.codex.local.agent),\n \"skaile-agents\",\n `${agentName}.md`,\n );\n }\n return undefined;\n}\n\n/**\n * The text of the native agent file ({@link nativeAgentFilePath}), or `undefined` when the harness\n * has none or the file is not there.\n */\nexport function readNativeAgentFile(\n cwd: string,\n harness: string | undefined,\n agentName: string,\n): string | undefined {\n const file = nativeAgentFilePath(cwd, harness, agentName);\n if (!file) return undefined;\n try {\n return readFileSync(file, \"utf-8\");\n } catch {\n return undefined;\n }\n}\n"]}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { registeredAssetKeys, unresolvedManifestDependencies, warnIgnoredDomainFiles, warnLegacyBundleFiles, removedDomainOption, rejectRemovedDomainOption, reportLibrarySymlinks, composeRefContext, rootSkillExtraAssetProblems, readOnlyLibraryAt, assetEntryRef, manifestPublisherProblems, manifestRootProblems, manifestFilesProblems, manifestEntryNameProblems, manifestRequiresProblems, checkAssetFile, findEntryManifestFile, declaredVersion, invalidSemverText, manifestVersionMismatchMessage,
|
|
2
|
-
import { getKindRegistry } from './chunk-
|
|
3
|
-
import { logErr, logInfo, logWarn, logOk, checkAgentInstances, connectorErrorLines, unknownKeyWarnings, unknownHarnessErrors, connectorMountPathChecks, unknownConnectorDriverErrors } from './chunk-
|
|
4
|
-
import { validateFlowVersions } from './chunk-
|
|
5
|
-
import { loadFlow } from './chunk-
|
|
1
|
+
import { registeredAssetKeys, unresolvedManifestDependencies, warnIgnoredDomainFiles, warnLegacyBundleFiles, removedDomainOption, rejectRemovedDomainOption, MANIFEST_GLOBS, reportLibrarySymlinks, composeRefContext, rootSkillExtraAssetProblems, readOnlyLibraryAt, assetEntryRef, manifestPublisherProblems, manifestRootProblems, manifestFilesProblems, manifestEntryNameProblems, manifestRequiresProblems, checkAssetFile, findEntryManifestFile, declaredVersion, invalidSemverText, manifestVersionMismatchMessage, manifestParseErrorText, runAssetChecks, DEFAULT_VERSION } from './chunk-KDRA6FYE.js';
|
|
2
|
+
import { getKindRegistry } from './chunk-U2WPJHRA.js';
|
|
3
|
+
import { logErr, logInfo, logWarn, logOk, checkAgentInstances, connectorErrorLines, unknownKeyWarnings, unknownHarnessErrors, connectorMountPathChecks, unknownConnectorDriverErrors } from './chunk-WW22FS74.js';
|
|
4
|
+
import { validateFlowVersions } from './chunk-M7XIYHWB.js';
|
|
5
|
+
import { loadFlow } from './chunk-2ZDZJ7XQ.js';
|
|
6
6
|
import { flowSkillVersionPins } from './chunk-7RGTAEG6.js';
|
|
7
|
-
import { missingRootAssets, assertManifestEditable, scanUnlistedAssets, UNLISTED_SCAN_SKIP_DIRS } from './chunk-
|
|
8
|
-
import { parseManifestFile } from './chunk-
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
7
|
+
import { missingRootAssets, assertManifestEditable, scanUnlistedAssets, UNLISTED_SCAN_SKIP_DIRS } from './chunk-RPRMD7XV.js';
|
|
8
|
+
import { parseManifestFile } from './chunk-QUPZKTF3.js';
|
|
9
|
+
import { VALIDATE_SKIP_DIRS } from './chunk-U7P22GEB.js';
|
|
10
|
+
import { decodeSkaileYaml } from './chunk-BRAOB37W.js';
|
|
11
|
+
import { SKAILE_MANIFEST_FILENAME, loadSkPublishManifest, isNonAssetPath } from './chunk-PMXTBWFD.js';
|
|
12
|
+
import { withYamlQuotingHint, readAssetBody } from './chunk-2MTRRK37.js';
|
|
13
|
+
import { parseAssetRef, parsePublisher, isValidAssetName, ASSET_NAME_HINT } from './chunk-HW4BDJPC.js';
|
|
13
14
|
import { execFileSync } from 'child_process';
|
|
14
15
|
import fs from 'fs';
|
|
15
16
|
import path from 'path';
|
|
@@ -17,14 +18,7 @@ import { Command } from 'commander';
|
|
|
17
18
|
import { parse } from 'yaml';
|
|
18
19
|
|
|
19
20
|
var HARNESS_DIRS = /* @__PURE__ */ new Set([".claude", ".codex", ".omp"]);
|
|
20
|
-
var SKIP_DIRS =
|
|
21
|
-
"node_modules",
|
|
22
|
-
"dist",
|
|
23
|
-
".git",
|
|
24
|
-
".skaile",
|
|
25
|
-
"__pycache__",
|
|
26
|
-
...HARNESS_DIRS
|
|
27
|
-
]);
|
|
21
|
+
var SKIP_DIRS = VALIDATE_SKIP_DIRS;
|
|
28
22
|
function findManifestCandidates(rootPath) {
|
|
29
23
|
const candidates = [];
|
|
30
24
|
function walk(dir) {
|
|
@@ -77,29 +71,31 @@ function validateManifestCandidate(c, parsed, body, absRoot, registry, strictCon
|
|
|
77
71
|
let errors = 0;
|
|
78
72
|
let warnings = 0;
|
|
79
73
|
const dirName = path.basename(path.dirname(c.filePath));
|
|
80
|
-
const checked =
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
74
|
+
const checked = runAssetChecks(
|
|
75
|
+
"validate",
|
|
76
|
+
{
|
|
77
|
+
kind: c.kind,
|
|
78
|
+
parsed: parsed ?? {},
|
|
79
|
+
body,
|
|
80
|
+
dirName,
|
|
81
|
+
registry,
|
|
82
|
+
rawText: fs.readFileSync(c.filePath, "utf-8"),
|
|
83
|
+
fileName: path.basename(c.filePath),
|
|
84
|
+
agentFiles: {
|
|
85
|
+
dir: path.dirname(c.filePath),
|
|
86
|
+
libraryRoot: libraryRootOf(absRoot),
|
|
87
|
+
composeRefs
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{ strictConformance }
|
|
89
91
|
);
|
|
90
92
|
for (const f of checked.errors) {
|
|
91
93
|
logErr(`${relPath} [${f.tag}] \u2014 ${f.text}`);
|
|
92
94
|
errors++;
|
|
93
95
|
}
|
|
94
|
-
for (const f of checked.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
logErr(line);
|
|
98
|
-
errors++;
|
|
99
|
-
} else {
|
|
100
|
-
logWarn(line);
|
|
101
|
-
warnings++;
|
|
102
|
-
}
|
|
96
|
+
for (const f of checked.warnings) {
|
|
97
|
+
logWarn(`${relPath} [${f.tag}] \u2014 ${f.text}`);
|
|
98
|
+
warnings++;
|
|
103
99
|
}
|
|
104
100
|
return { errors, warnings };
|
|
105
101
|
}
|
|
@@ -218,9 +214,9 @@ function validateWorkspaceRefs(refFields, relPath) {
|
|
|
218
214
|
for (const [field, ref] of refFields) {
|
|
219
215
|
try {
|
|
220
216
|
const parsedRef = parseAssetRef(ref);
|
|
221
|
-
const publisher = parsedRef.publisher
|
|
222
|
-
if (publisher
|
|
223
|
-
logErr(`${relPath} [${field}] \u2014 ${ref}: ${
|
|
217
|
+
const publisher = parsedRef.publisher === void 0 ? void 0 : parsePublisher(parsedRef.publisher);
|
|
218
|
+
if (publisher && !publisher.ok) {
|
|
219
|
+
logErr(`${relPath} [${field}] \u2014 ${ref}: ${publisher.message}`);
|
|
224
220
|
errors++;
|
|
225
221
|
}
|
|
226
222
|
} catch (e) {
|
|
@@ -376,7 +372,7 @@ async function validatePublishManifestUnlisted(rootPath) {
|
|
|
376
372
|
UNLISTED_SCAN_SKIP_DIRS
|
|
377
373
|
)).filter(
|
|
378
374
|
(u) => !u.registeredAt && !u.parseFailure && // a file that does not parse has its own parse error
|
|
379
|
-
checkAssetFile(u.entry.source, u.entry.kind, registry, absRoot, composeRefs).length === 0
|
|
375
|
+
checkAssetFile("validate", u.entry.source, u.entry.kind, registry, absRoot, composeRefs).length === 0
|
|
380
376
|
);
|
|
381
377
|
for (const u of unlisted) {
|
|
382
378
|
logErr(
|
|
@@ -883,6 +879,6 @@ function makeValidateCommand() {
|
|
|
883
879
|
return cmd;
|
|
884
880
|
}
|
|
885
881
|
|
|
886
|
-
export { makeValidateCommand, scanIdentities };
|
|
887
|
-
//# sourceMappingURL=chunk-
|
|
888
|
-
//# sourceMappingURL=chunk-
|
|
882
|
+
export { findManifestCandidates, makeValidateCommand, scanIdentities };
|
|
883
|
+
//# sourceMappingURL=chunk-6M44OQKH.js.map
|
|
884
|
+
//# sourceMappingURL=chunk-6M44OQKH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../cli/src/commands/validate.ts"],"names":["parseYaml","parsed","a","c"],"mappings":"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","file":"chunk-6M44OQKH.js","sourcesContent":["/**\n * Validate asset versions, changelogs, and manifest schemas across asset repos.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n ASSET_NAME_HINT,\n decodeSkaileYaml,\n isValidAssetName,\n loadSkPublishManifest,\n parseAssetRef,\n parsePublisher,\n SKAILE_MANIFEST_FILENAME,\n readAssetBody,\n VALIDATE_SKIP_DIRS,\n} from \"@skaile/workspaces/core\";\nimport {\n flowSkillVersionPins,\n loadFlow,\n} from \"@skaile/workspaces/factory-assets/connectors/flow/engine\";\nimport { parseManifestFile } from \"@skaile/workspaces/discovery\";\nimport { withYamlQuotingHint } from \"@skaile/workspaces/core/manifest\";\nimport { isNonAssetPath } from \"@skaile/workspaces/core/publish-manifest\";\nimport {\n assertManifestEditable,\n missingRootAssets,\n scanUnlistedAssets,\n UNLISTED_SCAN_SKIP_DIRS,\n} from \"@skaile/workspaces/library\";\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport type { FlowVersionNode } from \"@skaile/workspaces/resolver\";\nimport { validateFlowVersions } from \"@skaile/workspaces/resolver\";\nimport { Command } from \"commander\";\nimport { parse as parseYaml } from \"yaml\";\nimport { type ComposeRefContext, composeRefContext } from \"../agent-checks.ts\";\nimport {\n connectorErrorLines,\n connectorMountPathChecks,\n unknownConnectorDriverErrors,\n unknownHarnessErrors,\n unknownKeyWarnings,\n} from \"../config-checks.ts\";\nimport { logErr, logInfo, logOk, logWarn } from \"../helpers.ts\";\nimport { getKindRegistry } from \"../open-registry.ts\";\nimport {\n checkAssetFile,\n DEFAULT_VERSION,\n declaredVersion,\n findEntryManifestFile,\n invalidSemverText,\n MANIFEST_GLOBS,\n manifestParseErrorText,\n runAssetChecks,\n} from \"../skill-checks.ts\";\nimport {\n manifestEntryNameProblems,\n manifestFilesProblems,\n manifestPublisherProblems,\n manifestRootProblems,\n manifestRequiresProblems,\n readOnlyLibraryAt,\n registeredAssetKeys,\n rejectRemovedDomainOption,\n removedDomainOption,\n reportLibrarySymlinks,\n rootSkillExtraAssetProblems,\n unresolvedManifestDependencies,\n warnIgnoredDomainFiles,\n warnLegacyBundleFiles,\n} from \"./library-index.ts\";\nimport { assetEntryRef, manifestVersionMismatchMessage } from \"./publish-core.ts\";\nimport { checkAgentInstances } from \"./validate-instances.ts\";\n\n// ---------------------------------------------------------------------------\n// Manifest schema validation (skaile validate [path])\n// ---------------------------------------------------------------------------\n\n// The manifest file patterns live in skill-checks.ts (`MANIFEST_GLOBS`): `library index` names\n// the kind of a file it cannot parse with the same table.\n\n/**\n * `.claude`, `.codex` and `.omp` hold the copies `skaile add` deploys for the harnesses (and\n * the harness's own state): a project `validate .` checks what the author owns, not the\n * deployed bytes of an asset published elsewhere (p853).\n */\nconst HARNESS_DIRS: ReadonlySet<string> = new Set([\".claude\", \".codex\", \".omp\"]);\n/** Directories to skip during tree walk: the one list every command that takes a library path reads. */\nconst SKIP_DIRS = VALIDATE_SKIP_DIRS;\n\nexport interface ManifestCandidate {\n filePath: string;\n kind: string;\n}\n\n/** Recursively walk a directory tree and find manifest candidates. */\nexport function findManifestCandidates(rootPath: string): ManifestCandidate[] {\n const candidates: ManifestCandidate[] = [];\n\n function walk(dir: string): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!SKIP_DIRS.has(entry.name)) walk(fullPath);\n } else if (entry.isFile()) {\n for (const glob of MANIFEST_GLOBS) {\n if (glob.pattern.test(fullPath)) {\n candidates.push({ filePath: fullPath, kind: glob.kind });\n break;\n }\n }\n }\n }\n }\n\n walk(rootPath);\n return candidates;\n}\n\n/**\n * Parse a single manifest candidate's bytes with the indexer's own parser\n * (`parseManifestFile`), so a manifest `library index` cannot parse — an empty\n * `SKILL.md`, no frontmatter, invalid YAML — is an error here too. On failure\n * the error is already logged; count it.\n */\nfunction parseManifestCandidate(\n c: ManifestCandidate,\n absRoot: string,\n): { kind: \"value\"; parsed: unknown; body?: string } | { kind: \"error\" } {\n const content = fs.readFileSync(c.filePath, \"utf-8\");\n const res = parseManifestFile(c.filePath, content);\n if (!res.ok) {\n logErr(\n `${path.relative(absRoot, c.filePath)} [${c.kind}] — ${manifestParseErrorText(res.reason)}`,\n );\n return { kind: \"error\" };\n }\n return {\n kind: \"value\",\n parsed: res.data,\n body: readAssetBody(c.filePath, content),\n };\n}\n\n/**\n * The library root a validated path belongs to: the nearest directory at or above `absRoot`\n * that holds a `skaile.yaml`, else `absRoot` itself.\n */\nfunction libraryRootOf(absRoot: string): string {\n for (let dir = absRoot; ; dir = path.dirname(dir)) {\n if (fs.existsSync(path.join(dir, SKAILE_MANIFEST_FILENAME))) return dir;\n if (path.dirname(dir) === dir) return absRoot;\n }\n}\n\n/**\n * Validate a single parsed manifest candidate against identity rules + the kind\n * registry. Returns the error/warning deltas this candidate contributes.\n */\nfunction validateManifestCandidate(\n c: ManifestCandidate,\n parsed: unknown,\n body: string | undefined,\n absRoot: string,\n registry: IAssetKindRegistry,\n strictConformance: boolean,\n composeRefs: ComposeRefContext,\n): { errors: number; warnings: number } {\n const relPath = path.relative(absRoot, c.filePath);\n let errors = 0;\n let warnings = 0;\n\n // The shared per-asset checks (also run by `library index`, the publish plan, `library create`,\n // `asset import` and `asset migrate`): errors fail validate; warnings leave the exit code\n // alone unless --strict-conformance escalates the agentskills.io conformance ones to errors.\n const dirName = path.basename(path.dirname(c.filePath)); // the manifest's folder\n const checked = runAssetChecks(\n \"validate\",\n {\n kind: c.kind,\n parsed: (parsed ?? {}) as Record<string, unknown>,\n body,\n dirName,\n registry,\n rawText: fs.readFileSync(c.filePath, \"utf-8\"),\n fileName: path.basename(c.filePath),\n agentFiles: {\n dir: path.dirname(c.filePath),\n libraryRoot: libraryRootOf(absRoot),\n composeRefs,\n },\n },\n { strictConformance },\n );\n for (const f of checked.errors) {\n logErr(`${relPath} [${f.tag}] — ${f.text}`);\n errors++;\n }\n for (const f of checked.warnings) {\n logWarn(`${relPath} [${f.tag}] — ${f.text}`);\n warnings++;\n }\n\n return { errors, warnings };\n}\n\n/**\n * The `kind:name` identity of every asset manifest under `root`, read quietly: a manifest\n * that does not parse holds no identity (its own validation reports the error).\n */\nexport function scanIdentities(root: string): Set<string> {\n const identities = new Set<string>();\n for (const c of findManifestCandidates(root)) {\n let parsed: unknown;\n try {\n const res = parseManifestFile(c.filePath, fs.readFileSync(c.filePath, \"utf-8\"));\n if (!res.ok) continue;\n parsed = res.data;\n } catch {\n continue;\n }\n if (parsed === null || typeof parsed !== \"object\") continue;\n const identity = (parsed as Record<string, unknown>)[c.kind === \"flow\" ? \"id\" : \"name\"];\n if (typeof identity === \"string\" && identity.length > 0)\n identities.add(`${c.kind}:${identity}`);\n }\n return identities;\n}\n\n/** Validate all manifest files in a directory tree using the kind registry. */\nexport function validateManifests(\n rootPath: string,\n strictConformance: boolean,\n registeredAssets: ReadonlySet<string> = new Set(),\n): { total: number; errors: number; warnings: number } {\n const absRoot = path.resolve(rootPath);\n if (!fs.existsSync(absRoot)) {\n logErr(`Path does not exist: ${absRoot}`);\n return { total: 0, errors: 1, warnings: 0 };\n }\n\n const registry: IAssetKindRegistry = getKindRegistry();\n const candidates = findManifestCandidates(absRoot);\n // Symlinks are refused with the text `library index` and the publish plan print (p520). In a\n // library (a `skaile.manifest.yaml` at the root) any symlink is refused, as `git add -A`\n // would publish it; elsewhere (a project) only those inside an asset folder or aliasing one.\n // A link elsewhere in a project is not refused: the connector real-path check judges a\n // `mountPath` link (p1332).\n const isLibrary = fs.existsSync(path.join(absRoot, SKAILE_MANIFEST_FILENAME));\n // A project's deployed harness folders (`add --link` makes `.claude/skills/x` a link to the\n // project's own `skills/x`) are not sources: they are skipped here as in the manifest walk.\n let errors = reportLibrarySymlinks(absRoot, {\n wholeTree: isLibrary,\n skipDirs: isLibrary ? undefined : HARNESS_DIRS,\n });\n let warnings = 0;\n\n // kind:name → directory of the first manifest seen; a second directory with the same\n // identity cannot be told apart by `add`/`publish` (and `library index` skips it).\n const seenIdentity = new Map<string, string>();\n // `composes:` refs resolve against the assets of the whole library (the scanned tree plus,\n // when `validate` got a sub-directory, its siblings under the enclosing library root) and the\n // registered libraries of its publisher: a ref no library holds fails `skaile add` (p415).\n const libraryRoot = libraryRootOf(absRoot);\n const composeRefs = composeRefContext(\n scanIdentities(libraryRoot),\n registeredAssets,\n loadSkPublishManifest(libraryRoot)?.publisher,\n );\n for (const c of candidates) {\n const parseResult = parseManifestCandidate(c, absRoot);\n if (parseResult.kind === \"error\") {\n errors++;\n continue;\n }\n\n const delta = validateManifestCandidate(\n c,\n parseResult.parsed,\n parseResult.body,\n absRoot,\n registry,\n strictConformance,\n composeRefs,\n );\n errors += delta.errors;\n warnings += delta.warnings;\n const obj = parseResult.parsed as Record<string, unknown> | null;\n const identity = obj && typeof obj === \"object\" ? obj[c.kind === \"flow\" ? \"id\" : \"name\"] : null;\n if (typeof identity === \"string\" && identity.length > 0) {\n const dir = path.dirname(c.filePath);\n const key = `${c.kind}:${identity}`;\n const first = seenIdentity.get(key);\n if (first === undefined) {\n seenIdentity.set(key, dir);\n } else if (first !== dir) {\n logErr(\n `${path.relative(absRoot, c.filePath)} [${c.kind}] — ${key} is also defined in ${path.relative(absRoot, first) || \".\"}; ` +\n \"two directories cannot share a kind and name (`skaile library index` keeps only the first).\",\n );\n errors++;\n }\n }\n }\n\n return { total: candidates.length, errors, warnings };\n}\n\n/** Recursively find every `skaile.yaml` / `*.skaile.yaml` workspace manifest. */\nfunction findWorkspaceManifests(rootPath: string): string[] {\n const out: string[] = [];\n function walk(dir: string): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!SKIP_DIRS.has(entry.name)) walk(full);\n } else if (entry.isFile() && /(^|\\.)skaile\\.yaml$/.test(entry.name)) {\n out.push(full);\n }\n }\n }\n walk(rootPath);\n return out;\n}\n\n/**\n * Validate the dependency refs and asset identities declared in every\n * `skaile.yaml` under a tree. This is the manifest-level mirror of the\n * per-file identity check: it parses each `dependencies[]` /\n * `overrides[].ref` through `parseAssetRef` (the exact code path that produced\n * the original \"publisher required …\" / \"invalid asset name …\" hard error) and\n * checks each `assets[].name` against the canonical name grammar.\n */\n/**\n * Collect every `[field, ref]` pair to validate from a workspace manifest:\n * each string in `dependencies[]` and each `overrides[].ref`.\n */\nfunction collectWorkspaceRefFields(parsed: Record<string, unknown>): Array<[string, string]> {\n const refFields: Array<[string, string]> = [];\n if (Array.isArray(parsed.dependencies)) {\n for (const d of parsed.dependencies) {\n if (typeof d === \"string\") refFields.push([\"dependencies\", d]);\n }\n }\n if (Array.isArray(parsed.overrides)) {\n for (const o of parsed.overrides) {\n const ref = (o as Record<string, unknown>)?.ref;\n if (typeof ref === \"string\") refFields.push([\"overrides.ref\", ref]);\n }\n }\n return refFields;\n}\n\n/** Parse each declared ref through `parseAssetRef`; returns the error count. */\nfunction validateWorkspaceRefs(refFields: Array<[string, string]>, relPath: string): number {\n let errors = 0;\n for (const [field, ref] of refFields) {\n try {\n const parsedRef = parseAssetRef(ref);\n // The library-side slug rule (`library index`, the publish plan) holds for a project's\n // `dependencies:` too: `add` cannot resolve such a ref, so `check` fails on it (p1080).\n const publisher =\n parsedRef.publisher === undefined ? undefined : parsePublisher(parsedRef.publisher);\n if (publisher && !publisher.ok) {\n logErr(`${relPath} [${field}] — ${ref}: ${publisher.message}`);\n errors++;\n }\n } catch (e) {\n logErr(`${relPath} [${field}] — ${e instanceof Error ? e.message : String(e)}`);\n errors++;\n }\n }\n return errors;\n}\n\n/** Validate `assets[].name` against the canonical name/ref grammar. */\nfunction validateWorkspaceAssets(parsed: Record<string, unknown>, relPath: string): number {\n if (!Array.isArray(parsed.assets)) return 0;\n let errors = 0;\n const topPublisher = typeof parsed.publisher === \"string\" ? parsed.publisher : undefined;\n for (const a of parsed.assets) {\n const asset = a as Record<string, unknown>;\n const name = asset?.name;\n const kind = typeof asset?.kind === \"string\" ? asset.kind : \"skill\";\n if (typeof name !== \"string\" || name.length === 0) continue;\n const publisher = typeof asset?.publisher === \"string\" ? asset.publisher : topPublisher;\n if (publisher !== undefined) {\n try {\n parseAssetRef(`${kind}:@${publisher}/${name}`);\n } catch (e) {\n logErr(`${relPath} [assets] — ${e instanceof Error ? e.message : String(e)}`);\n errors++;\n }\n } else if (!isValidAssetName(name)) {\n logErr(`${relPath} [assets] — invalid asset name \"${name}\" — ${ASSET_NAME_HINT}`);\n errors++;\n }\n }\n return errors;\n}\n\nasync function validateWorkspaceManifests(rootPath: string): Promise<{\n total: number;\n errors: number;\n}> {\n const absRoot = path.resolve(rootPath);\n const files = findWorkspaceManifests(absRoot);\n let errors = 0;\n\n for (const file of files) {\n const relPath = path.relative(absRoot, file);\n let parsed: Record<string, unknown>;\n let text = \"\";\n try {\n text = fs.readFileSync(file, \"utf-8\");\n parsed = (parseYaml(text) ?? {}) as Record<string, unknown>;\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n logErr(`${relPath} — parse error: ${withYamlQuotingHint(message, text)}`);\n errors++;\n continue;\n }\n // A root that is no mapping, or a `dependencies:`/`sources:` of the wrong shape, is one\n // parse-error line, as `check` prints it (p1421, p1620).\n const unreadable = decodeSkaileYaml(text).diagnostics.find(\n (d) => d.code === \"non_object_root\" || d.code === \"invalid_value_shape\",\n );\n if (unreadable) {\n logErr(`${relPath} — parse error: ${unreadable.message}`);\n errors++;\n continue;\n }\n\n errors += validateWorkspaceRefs(collectWorkspaceRefFields(parsed), relPath);\n errors += validateWorkspaceAssets(parsed, relPath);\n for (const d of checkAgentInstances(path.dirname(file), parsed)) {\n const line = `${relPath} [agents] — ${d.code}: ${d.path ? `${d.path}: ` : \"\"}${d.message}`;\n if (d.severity === \"error\") {\n logErr(line);\n errors++;\n } else {\n logWarn(line);\n }\n }\n // A connector the runner cannot mount or mounts wrongly: no `driver` (or the old `adapter`\n // spelling), no `id`, a duplicate `id`, an `access` that is neither read-only nor read-write.\n const decoded = decodeSkaileYaml(fs.readFileSync(file, \"utf-8\"));\n for (const line of connectorErrorLines(decoded.diagnostics, relPath)) {\n logErr(line);\n errors++;\n }\n // A `sources:` item with no url or a non-string publisher: `check`, `doctor` and `add` stop\n // on it, so `validate` must not call the file valid (p1620).\n for (const d of decoded.diagnostics) {\n if (d.code !== \"invalid_source_entry\") continue;\n logErr(`${relPath} — parse error: ${d.message}`);\n errors++;\n }\n // A key skaile.yaml no longer accepts (a legacy `provider:`): every command that reads the\n // file stops on it, so `validate` must not call the file valid (p1352).\n for (const d of decoded.diagnostics) {\n if (d.code !== \"legacy_key_rejected\") continue;\n logErr(relPath === \"skaile.yaml\" ? d.message : `${relPath} — ${d.message}`);\n errors++;\n }\n // The 5.x `driver` key of an agent-config profile: still read as `harness` until 7.0\n // (warning); setting both keys is an error. The retired `agent` key is ignored (warning).\n for (const d of decoded.diagnostics) {\n if (\n ![\"deprecated_harness_key\", \"retired_agent_key\", \"harness_key_conflict\"].includes(d.code)\n ) {\n continue;\n }\n const line = `${relPath} [agent-config] — ${d.code}: ${d.message}`;\n if (d.severity === \"error\") {\n logErr(line);\n errors++;\n } else {\n logWarn(line);\n }\n }\n // A mistyped key warns (p1474); a `harness:` no harness registers, plugins included, fails (p1022).\n for (const line of unknownKeyWarnings(decoded.diagnostics, relPath)) logWarn(line);\n for (const line of await unknownHarnessErrors(path.dirname(file), decoded.config, relPath)) {\n logErr(line);\n errors++;\n }\n const mountChecks = connectorMountPathChecks(\n path.dirname(file),\n relPath,\n decoded.config?.connectors ?? [],\n );\n for (const line of mountChecks.errors) {\n logErr(line);\n errors++;\n }\n for (const line of mountChecks.warnings) logWarn(line);\n // A `driver` no catalog entry provides: `serve` cannot mount it either, and stops on the\n // same line.\n for (const line of await unknownConnectorDriverErrors(\n path.dirname(file),\n relPath,\n decoded.config?.connectors ?? [],\n )) {\n logErr(line);\n errors++;\n }\n }\n\n return { total: files.length, errors };\n}\n\n/**\n * Check the library's publication manifest (`skaile.manifest.yaml` at the\n * validated root): every first-party `root:` must still exist. An entry whose\n * directory was deleted would otherwise stay publishable; the fix is\n * `skaile library index <lib>`, which drops it. A reader or source clone refuses `library index`:\n * its owner pushes the folder (or drops the entry), then the clone is refreshed.\n */\nasync function validatePublishManifestRoots(rootPath: string): Promise<number> {\n const absRoot = path.resolve(rootPath);\n const manifest = loadSkPublishManifest(absRoot);\n if (!manifest) return 0;\n // A library that is itself one skill holds that one asset (p2142).\n const extra = rootSkillExtraAssetProblems(absRoot);\n for (const message of extra) logErr(message);\n const missing = missingRootAssets(absRoot, manifest);\n const readOnly = missing.length > 0 ? await readOnlyLibraryAt(absRoot) : undefined;\n for (const a of missing) {\n logErr(\n `${SKAILE_MANIFEST_FILENAME} [assets] — ${assetEntryRef(a, manifest)}: root \"${a.root}\" does not exist. ` +\n (readOnly\n ? `\"${readOnly.name}\" is a read-only clone: ask the owner to push ${a.root}/ or drop the entry from ${SKAILE_MANIFEST_FILENAME}, then run \\`${readOnly.refresh}\\`.`\n : \"Run `skaile library index <library>` to drop the entry, or restore the directory.\"),\n );\n }\n return missing.length + extra.length;\n}\n\n/**\n * An asset directory the library's manifest does not list is an error: `add` refuses it (`not\n * listed in its skaile.manifest.yaml`), the publish plan does not ship it, yet `git add -A`\n * commits its files. The fix is `skaile library index <lib>`, which lists it (p1193). A directory\n * that holds a kind + name the manifest already names elsewhere is the duplicate check's finding.\n * An asset that already fails its own check is not listed here: `library index` refuses it, so\n * \"run `library index`\" would send the author round in a circle; the check line names the real\n * fix (p871).\n */\nasync function validatePublishManifestUnlisted(rootPath: string): Promise<number> {\n const absRoot = path.resolve(rootPath);\n const manifest = loadSkPublishManifest(absRoot);\n if (!manifest) return 0;\n const registry = getKindRegistry();\n const libraryRoot = libraryRootOf(absRoot);\n const composeRefs = composeRefContext(\n scanIdentities(libraryRoot),\n await registeredAssetKeys(libraryRoot),\n manifest.publisher,\n );\n const unlisted = (\n await scanUnlistedAssets(\n absRoot,\n manifest.publisher ?? path.basename(absRoot),\n registry,\n UNLISTED_SCAN_SKIP_DIRS,\n )\n ).filter(\n (u) =>\n !u.registeredAt &&\n !u.parseFailure && // a file that does not parse has its own parse error\n checkAssetFile(\"validate\", u.entry.source, u.entry.kind, registry, absRoot, composeRefs)\n .length === 0,\n );\n for (const u of unlisted) {\n logErr(\n `${path.relative(absRoot, u.entry.source)} [${u.entry.kind}] — ${u.entry.kind}:${u.entry.name} is on disk but not in ${SKAILE_MANIFEST_FILENAME}, so it is not published. ` +\n \"Run `skaile library index <library>` to list it, or delete the directory.\",\n );\n }\n return unlisted.length;\n}\n\n/**\n * Check every `assets[].dependencies` entry of the publication manifest with the\n * same syntax rule (and message) `library index` applies, so a malformed ref\n * fails `validate` instead of being silently dropped by the manifest decoder.\n */\nfunction validatePublishManifestRequires(rootPath: string): number {\n const problems = manifestRequiresProblems(path.resolve(rootPath));\n for (const p of problems) {\n logErr(\n `${SKAILE_MANIFEST_FILENAME} [assets] — ${p.asset}: ${p.message}. ` +\n \"Use the `kind:@<publisher>/name[#version]` form.\",\n );\n }\n return problems.length;\n}\n\n/**\n * Check the publisher of the publication manifest (top-level and every\n * `assets[].publisher`) against the one publisher slug rule `library create`, `library\n * index` and the publish plan apply, with the same message.\n */\nfunction validatePublishManifestPublisherSlugs(rootPath: string): number {\n const problems = manifestPublisherProblems(path.resolve(rootPath));\n for (const message of problems) logErr(message);\n return problems.length;\n}\n\n/**\n * Check every first-party `assets[].root` and `files:` entry of the publication manifest stays\n * inside the library and crosses no symlink ({@link manifestRootProblems},\n * {@link manifestFilesProblems}), the refusal `library index` and the publish plan print too: a\n * path outside the library is never found by `add` (p701, p1403), a missing file is no asset (p1404).\n */\nfunction validatePublishManifestRootPaths(rootPath: string): number {\n const problems = [\n ...manifestRootProblems(path.resolve(rootPath)),\n ...manifestFilesProblems(path.resolve(rootPath)),\n ...manifestEntryNameProblems(path.resolve(rootPath)),\n ];\n for (const message of problems) logErr(message);\n return problems.length;\n}\n\n/**\n * Parse the publication manifest the way `library index` and `library publish` open it, so a\n * `skaile.manifest.yaml` that does not parse fails `validate` too, with the file and line.\n * Without the file there is nothing to check.\n */\nfunction validatePublishManifestParses(rootPath: string): number {\n try {\n assertManifestEditable(path.resolve(rootPath));\n return 0;\n } catch (err) {\n logErr(err instanceof Error ? err.message : String(err));\n return 1;\n }\n}\n\n/**\n * Warn when a first-party `assets[].version` of the publication manifest differs\n * from the version in the asset's own manifest file. The file is the source of\n * truth — `skaile library index` rewrites the entry from it — so a hand-edited\n * manifest version is silently overwritten by the next index. Returns the warning count.\n */\nfunction validatePublishManifestVersions(rootPath: string): number {\n const absRoot = path.resolve(rootPath);\n const manifest = loadSkPublishManifest(absRoot);\n if (!manifest || manifest.source) return 0;\n let warnings = 0;\n for (const a of manifest.assets ?? []) {\n if (a.source || !a.version) continue;\n const file = findEntryManifestFile(absRoot, a);\n if (!file) continue;\n const res = parseManifestFile(file, fs.readFileSync(file, \"utf-8\"));\n if (!res.ok) continue; // reported by the per-file parse check\n const fileVersion = declaredVersion(res.data);\n if (fileVersion === undefined || fileVersion === a.version) continue;\n // A file version that is no semver is reported by the per-file check; it is no version to compare.\n if (invalidSemverText(fileVersion) !== undefined) continue;\n logWarn(\n manifestVersionMismatchMessage(\n assetEntryRef(a, manifest),\n a.version,\n toPosix(path.relative(absRoot, file)),\n fileVersion,\n ),\n );\n warnings++;\n }\n return warnings;\n}\n\n/**\n * Warn when a first-party asset file still carries a `metadata.publisher` that\n * differs from the publisher the manifest resolves for it (`assets[].publisher`,\n * else the top-level `publisher`). The manifest is the only source of an\n * asset's publisher; the file value is ignored by every resolver, so a stale\n * one only misleads the reader. Returns the warning count.\n */\nfunction validatePublishManifestPublishers(rootPath: string): number {\n const absRoot = path.resolve(rootPath);\n const manifest = loadSkPublishManifest(absRoot);\n if (!manifest || manifest.source) return 0;\n const bare = (p: string) => p.trim().replace(/^@/, \"\");\n let warnings = 0;\n for (const a of manifest.assets ?? []) {\n const resolved = a.publisher ?? manifest.publisher;\n if (a.source || !resolved) continue;\n const file = findEntryManifestFile(absRoot, a);\n if (!file) continue;\n const res = parseManifestFile(file, fs.readFileSync(file, \"utf-8\"));\n if (!res.ok) continue; // reported by the per-file parse check\n const meta = (res.data as Record<string, unknown>).metadata;\n const declared =\n meta !== null && typeof meta === \"object\"\n ? (meta as Record<string, unknown>).publisher\n : null;\n if (typeof declared !== \"string\" || bare(declared) === bare(resolved)) continue;\n logWarn(\n `${toPosix(path.relative(absRoot, file))} [publisher] — metadata.publisher \"${bare(declared)}\" differs from ` +\n `the manifest publisher \"${bare(resolved)}\" for ${assetEntryRef(a, manifest)}. The manifest wins and the ` +\n \"file value is ignored: delete `metadata.publisher` from the file, or set the publisher in \" +\n `${SKAILE_MANIFEST_FILENAME}.`,\n );\n warnings++;\n }\n return warnings;\n}\n\n/** Root-relative path prefixes excluded from version/changelog checks. */\nconst EXCLUDED_PATHS = [\"skaileup-shared/\", \"external/\", \"docs/\"];\n\n/** Normalise to forward slashes so prefix and set comparisons work on any OS. */\nfunction toPosix(p: string): string {\n return p.split(path.sep).join(\"/\");\n}\n\n/** True when a root-relative path sits under one of {@link EXCLUDED_PATHS}. */\nfunction isExcludedPath(relPath: string): boolean {\n const rel = toPosix(relPath);\n return EXCLUDED_PATHS.some((prefix) => rel.startsWith(prefix));\n}\n\ninterface AssetVersion {\n kind: \"skill\" | \"agent\" | \"flow\" | \"prompt\" | \"preset\" | \"contract\";\n name: string;\n version: string;\n filePath: string;\n}\n\n/** Manifest candidates whose kind carries a version `validate versions` checks. */\nconst VERSIONED_KINDS: Record<string, true> = {\n skill: true,\n agent: true,\n flow: true,\n prompt: true,\n preset: true,\n contract: true,\n};\n\n/**\n * Read one manifest candidate's identity and version. A manifest without a `version` reads as\n * {@link DEFAULT_VERSION}, as `validate`, `library index` and `add` read it (p1858); an unreadable\n * file has no version.\n */\nfunction readAssetVersion(c: ManifestCandidate): AssetVersion {\n const kind = c.kind as AssetVersion[\"kind\"];\n const fileName = path.basename(c.filePath);\n const dirName = path.basename(path.dirname(c.filePath));\n const content = fs.readFileSync(c.filePath, \"utf-8\");\n if (c.filePath.endsWith(\".md\")) {\n // The version `library index` records (top-level `version`, else `metadata.version`).\n const res = parseManifestFile(c.filePath, content);\n const data = res.ok ? (res.data as Record<string, unknown>) : {};\n const stem = fileName.replace(/\\.prompt\\.md$/, \"\");\n return {\n kind,\n name: typeof data.name === \"string\" ? data.name : kind === \"prompt\" ? stem : dirName,\n version: res.ok ? (declaredVersion(data) ?? DEFAULT_VERSION) : \"\",\n filePath: c.filePath,\n };\n }\n let parsed: Record<string, unknown> | null = null;\n try {\n parsed = parseYaml(content);\n } catch {\n // Reported by the default `skaile validate`; here the asset just has no readable version.\n }\n const version = parsed ? String(parsed.version ?? DEFAULT_VERSION) : \"\";\n if (kind === \"flow\") {\n return {\n kind,\n name: String(parsed?.id ?? fileName.replace(\".flow.yaml\", \"\")),\n version,\n filePath: c.filePath,\n };\n }\n return {\n kind,\n name: String(parsed?.name ?? dirName),\n version,\n filePath: c.filePath,\n };\n}\n\n/**\n * Walk `root` at any depth and collect the version of every skill, agent, flow, prompt,\n * preset and contract — the same tree walk the default `validate` uses, so a library laid out\n * as `<root>/<asset>/SKILL.md` is covered as well as `skills/<asset>/SKILL.md`.\n */\nfunction collectAssetVersions(root: string): AssetVersion[] {\n if (!fs.existsSync(root)) return [];\n const assets: AssetVersion[] = [];\n for (const c of findManifestCandidates(root)) {\n if (!VERSIONED_KINDS[c.kind]) continue;\n // Only the YAML flow form and `agent.yaml` / `AGENT.md` carry a readable version here.\n if (c.filePath.endsWith(\".flow.json\")) continue;\n if (isExcludedPath(path.relative(root, c.filePath))) continue;\n assets.push(readAssetVersion(c));\n }\n return assets;\n}\n\n/** Root-relative posix location of an asset file, for messages. */\nfunction assetLocation(a: AssetVersion, root: string): string {\n return toPosix(path.relative(root, a.filePath));\n}\n\n/**\n * Nearest ancestor directory of `assetRelPath` (root-relative, posix) that\n * holds a `CHANGELOG.md`, walking up from the asset's own directory to and\n * including `root`, never above it. Returns the changelog's root-relative\n * path, or `null` when no ancestor has one.\n */\nfunction findChangelogUnit(assetRelPath: string, root: string): string | null {\n let dir = path.posix.dirname(toPosix(assetRelPath));\n for (;;) {\n const candidate = dir === \".\" ? \"CHANGELOG.md\" : `${dir}/CHANGELOG.md`;\n if (fs.existsSync(path.join(root, candidate))) return candidate;\n if (dir === \".\") return null;\n dir = path.posix.dirname(dir);\n }\n}\n\n/** Outcome of {@link checkChangelogUnits}. All paths are root-relative posix. */\nexport interface ChangelogCheck {\n /** Changelog units whose `CHANGELOG.md` is among the modified files. */\n updated: string[];\n /** Changelog units covering a modified asset whose `CHANGELOG.md` is not modified. */\n stale: string[];\n /** Modified assets with no `CHANGELOG.md` in any ancestor up to the root. */\n orphans: string[];\n}\n\n/**\n * Group the modified asset files by their nearest-ancestor `CHANGELOG.md` and\n * report which units were updated alongside them. Assets under\n * {@link EXCLUDED_PATHS} are ignored.\n *\n * @param modifiedFiles - Changed paths relative to `root`.\n * @param root - The asset root (`ai-assets/`); the walk up never leaves it.\n */\nexport function checkChangelogUnits(modifiedFiles: string[], root: string): ChangelogCheck {\n const modified = new Set(modifiedFiles.map(toPosix));\n const assetPattern = /(SKILL\\.md|agent\\.yaml|\\.flow\\.yaml|\\.prompt\\.md)$/;\n const units = new Set<string>();\n const orphans: string[] = [];\n for (const f of modified) {\n if (!assetPattern.test(f) || isExcludedPath(f)) continue;\n const unit = findChangelogUnit(f, root);\n if (unit) units.add(unit);\n else orphans.push(f);\n }\n const updated = [...units].filter((u) => modified.has(u));\n const stale = [...units].filter((u) => !modified.has(u));\n return { updated, stale, orphans };\n}\n\n/** Extract version from file content using proper YAML parsing */\nfunction extractVersionFromContent(filePath: string, content: string): string | null {\n if (filePath.endsWith(\".yaml\")) {\n const parsed = parseYaml(content);\n return parsed?.version ?? null;\n }\n // SKILL.md / .prompt.md — YAML frontmatter\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) return null;\n const parsed = parseYaml(fmMatch[1]);\n return parsed?.metadata?.version ?? parsed?.version ?? null;\n}\n\n/** Check every asset has a present + semver-valid version. */\nfunction checkAssetVersions(\n assets: AssetVersion[],\n root: string,\n): { errors: number; warnings: number } {\n let errors = 0;\n const warnings = 0;\n for (const a of assets) {\n const location = assetLocation(a, root);\n if (!a.version) {\n logErr(`${a.kind}:${a.name} (${location}) — missing version`);\n errors++;\n continue;\n }\n const invalid = invalidSemverText(a.version);\n if (invalid) {\n logErr(`${a.kind}:${a.name} (${location}) — ${invalid}`);\n errors++;\n }\n }\n return { errors, warnings };\n}\n\n/** In --changed-only mode, warn when a changed asset's version was not bumped. */\nfunction checkVersionBumps(\n assets: AssetVersion[],\n root: string,\n changedByAsset: ReadonlyMap<AssetVersion, readonly string[]>,\n): number {\n let warnings = 0;\n for (const a of assets) {\n if (!a.version) continue; // already flagged above\n // `HEAD:./<path>` is relative to `root` (the cwd), not the repository top level.\n const relPath = toPosix(path.relative(root, a.filePath));\n try {\n const headContent = execFileSync(\"git\", [\"show\", `HEAD:./${relPath}`], {\n cwd: root,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const headVersion = extractVersionFromContent(a.filePath, headContent);\n if (headVersion && headVersion === a.version) {\n logWarn(\n `${a.kind}:${a.name} (${assetLocation(a, root)}) — file changed but version not bumped (${a.version}); ${changedClause(changedByAsset.get(a) ?? [])}`,\n );\n warnings++;\n }\n } catch {\n // New file (no HEAD version) — that's fine\n }\n }\n return warnings;\n}\n\n/**\n * Validate flow node skill-version pins against the discovered skill versions.\n *\n * Flows are read through `loadFlow`, which normalizes legacy v1 documents into\n * the strict v2 shape — reading the authored YAML directly would miss every v2\n * pin, since those ride in `run.assets` rather than `node.data.version`.\n */\nfunction checkFlowVersionPins(\n assets: AssetVersion[],\n root: string,\n): { errors: number; warnings: number } {\n const flows = assets.filter((a) => a.kind === \"flow\");\n const skillVersionMap = new Map<string, string>();\n for (const a of assets.filter((a) => a.kind === \"skill\")) {\n skillVersionMap.set(a.name, a.version);\n }\n\n let errors = 0;\n let warnings = 0;\n for (const f of flows) {\n let pins: FlowVersionNode[];\n try {\n pins = flowSkillVersionPins(loadFlow(f.filePath));\n } catch (err) {\n // An unreadable flow is a gap in the check, not an absence of findings.\n // Report the path, not `f.name`: that id comes from a raw-YAML read that\n // falls back to the filename stem exactly when the file is unusable.\n logWarn(\n `flow:${f.name} (${path.relative(root, f.filePath)}) — could not be read: ` +\n `${err instanceof Error ? err.message : err}`,\n );\n warnings++;\n continue;\n }\n\n if (pins.length === 0) continue;\n const checks = validateFlowVersions(pins, skillVersionMap);\n for (const c of checks.filter((c) => !c.satisfied)) {\n logErr(\n `flow:${f.name} node ${c.nodeId} — wants ${c.requested}, found ${c.actual || \"(none)\"}`,\n );\n errors++;\n }\n }\n return { errors, warnings };\n}\n\n/**\n * Root of a `validate versions` / `validate changelog` run: the explicit `[path]`, else the\n * library the shell is in (the nearest directory at or above the cwd that holds\n * `skaile.manifest.yaml`), else the cwd itself, as plain `validate` reads it. The bundled\n * factory assets are never a default (p1194). Returns `null` after printing an error when\n * the path does not exist, or when the root holds no library (see {@link isCheckableRoot}).\n */\nfunction resolveCheckRoot(pathArg: string | undefined): string | null {\n let root = process.cwd();\n if (pathArg) {\n root = path.resolve(pathArg);\n if (!fs.existsSync(root)) {\n logErr(`Path does not exist: ${root}`);\n return null;\n }\n } else {\n for (let dir = root; ; dir = path.dirname(dir)) {\n if (fs.existsSync(path.join(dir, SKAILE_MANIFEST_FILENAME))) {\n root = dir;\n break;\n }\n if (path.dirname(dir) === dir) break;\n }\n }\n if (!isCheckableRoot(root)) {\n logErr(\n `Nothing to check in ${root}: no ${SKAILE_MANIFEST_FILENAME} and no versioned asset (skill, agent, flow, prompt, contract or preset) found. Run it in a library or pass the library directory.`,\n );\n return null;\n }\n return root;\n}\n\n/** Whether `root` is a library: it holds a library manifest or at least one versioned asset. */\nfunction isCheckableRoot(root: string): boolean {\n return (\n fs.existsSync(path.join(root, SKAILE_MANIFEST_FILENAME)) ||\n collectAssetVersions(root).length > 0\n );\n}\n\n/** `true` when `root` lies inside a git work tree. */\nfunction isInGitWorkTree(root: string): boolean {\n try {\n return (\n execFileSync(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n cwd: root,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim() === \"true\"\n );\n } catch {\n return false;\n }\n}\n\n/** `true` when the git work tree at `root` has at least one commit (`HEAD` resolves). */\nfunction hasCommit(root: string): boolean {\n try {\n execFileSync(\"git\", [\"rev-parse\", \"--verify\", \"--quiet\", \"HEAD\"], {\n cwd: root,\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Run `git diff --name-only --relative <ref>` in `root` and return the changed paths\n * (relative to `root`), plus — with `untracked` — the new files git does not track yet.\n * No git work tree prints `<what> needs a git repository`; any other git failure — a bad\n * ref, no `git` — prints one `git diff failed in <root>: <first stderr line>` line. Both\n * return `null`; git's own usage text never reaches the terminal.\n *\n * @param what The command that needs git, for the message (`--changed-only`, `changelog`).\n */\nfunction changedFiles(\n root: string,\n ref: string,\n what: string,\n opts: { untracked?: boolean } = {},\n): string[] | null {\n if (!isInGitWorkTree(root)) {\n logErr(`${what} needs a git repository: ${root} is not inside a git work tree.`);\n return null;\n }\n if (ref === \"HEAD\" && !hasCommit(root)) {\n logErr(\n `${what} compares with the last commit, and ${root} has no commit yet. Commit the library first (\\`skaile library commit <name>\\`), then run it again.`,\n );\n return null;\n }\n try {\n const out = execFileSync(\n \"git\",\n [\"diff\", \"--name-only\", \"--relative\", \"--end-of-options\", ref],\n {\n cwd: root,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n },\n );\n const changed = out.trim().split(\"\\n\").filter(Boolean);\n if (opts.untracked) {\n // New files git does not track yet (`--others` paths are relative to `root`).\n const fresh = execFileSync(\"git\", [\"ls-files\", \"--others\", \"--exclude-standard\"], {\n cwd: root,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n changed.push(...fresh.trim().split(\"\\n\").filter(Boolean));\n }\n return changed;\n } catch (err) {\n const stderr = err instanceof Error && \"stderr\" in err ? String(err.stderr).trim() : \"\";\n const reason = (stderr || (err instanceof Error ? err.message : String(err))).split(\"\\n\")[0];\n logErr(`git diff failed in ${root}: ${reason}`);\n return null;\n }\n}\n\n/**\n * The directory whose files belong to `a`: the asset's own folder for a skill, agent, contract,\n * or a prompt/flow/preset that sits in a folder named after it — the folder `library create`\n * scaffolds. A single prompt/flow/preset file next to others is its own asset (`null`).\n */\nfunction assetOwnDir(a: AssetVersion): string | null {\n const dir = path.dirname(a.filePath);\n if ([\"skill\", \"agent\", \"contract\"].includes(a.kind) || path.basename(dir) === a.name) return dir;\n return null;\n}\n\n/**\n * The files that make `a` changed, relative to `root` in git order: its asset file, or any file\n * under its folder that a deploy ships (the lock hash covers them, minus the deploy ignore list),\n * among `changedAbs`. Empty when `a` did not change.\n */\nfunction changedPathsOf(a: AssetVersion, changedAbs: ReadonlySet<string>, root: string): string[] {\n const out: string[] = [];\n if (changedAbs.has(a.filePath)) out.push(toPosix(path.relative(root, a.filePath)));\n const dir = assetOwnDir(a);\n if (dir === null) return out;\n for (const f of changedAbs) {\n if (f === a.filePath) continue;\n const rel = path.relative(dir, f);\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) continue;\n if (!isNonAssetPath(toPosix(rel), \"asset-root\")) out.push(toPosix(path.relative(root, f)));\n }\n return out;\n}\n\n/** The changed files of a flagged asset as one clause: `changed: a, b, c (+2 more)`. */\nfunction changedClause(files: readonly string[]): string {\n const shown = files.slice(0, 5).join(\", \");\n return `changed: ${shown}${files.length > 5 ? ` (+${files.length - 5} more)` : \"\"}`;\n}\n\n/** Body of `skaile validate versions` — semver + bump + flow-pin checks. */\nfunction runVersionsCheck(\n pathArg: string | undefined,\n opts: { changedOnly?: boolean; strict?: boolean },\n): void {\n const root = resolveCheckRoot(pathArg);\n if (root === null) {\n process.exit(1);\n return;\n }\n let assets = collectAssetVersions(root);\n const changedByAsset = new Map<AssetVersion, string[]>();\n // A directory with no asset has nothing to check: `Checked 0 assets / All versions valid` would\n // read as a pass, so it fails as `validate` does for a path with no manifests (p1194).\n if (assets.length === 0) {\n logErr(\n `Nothing to check in ${root}: no versioned asset (skill, agent, flow, prompt, contract or preset) found. Pass the library directory.`,\n );\n process.exit(1);\n return;\n }\n\n // Filter to changed files only if requested\n if (opts.changedOnly) {\n const changed = changedFiles(root, \"HEAD\", \"--changed-only\", { untracked: true });\n if (changed === null) {\n process.exit(1);\n return;\n }\n const changedAbs = new Set(changed.map((f) => path.resolve(root, f)));\n for (const a of assets) {\n const files = changedPathsOf(a, changedAbs, root);\n if (files.length > 0) changedByAsset.set(a, files);\n }\n assets = assets.filter((a) => changedByAsset.has(a));\n }\n\n logInfo(`Checking versions in ${root}`);\n const versionCheck = checkAssetVersions(assets, root);\n let errors = versionCheck.errors;\n let warnings = versionCheck.warnings;\n\n // In --changed-only mode, check if version was actually bumped\n if (opts.changedOnly) {\n warnings += checkVersionBumps(assets, root, changedByAsset);\n }\n\n const pinCheck = checkFlowVersionPins(assets, root);\n errors += pinCheck.errors;\n warnings += pinCheck.warnings;\n\n // Summary\n console.log();\n logInfo(`Checked ${assets.length} assets`);\n if (errors === 0 && warnings === 0) {\n logOk(\"All versions valid\");\n } else {\n if (errors > 0) logErr(`${errors} error(s)`);\n if (warnings > 0) logWarn(`${warnings} warning(s)`);\n }\n\n if (errors > 0 || (opts.strict && warnings > 0)) {\n process.exit(1);\n }\n}\n\n/**\n * Creates the `skaile validate` command group.\n *\n * Validates asset manifests, version fields, and changelogs in an asset\n * repository tree. Subcommands: default `validate [path]` (schema check),\n * `versions` (semver + flow pin validation), `changelog` (modified assets\n * must have an updated nearest-ancestor CHANGELOG.md).\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n * @docLink cli/commands/validate#make-validate-command\n */\nexport function makeValidateCommand(): Command {\n const cmd = new Command(\"validate\").description(\n \"Validate asset manifests, versions, and changelogs\",\n );\n\n // Default action: skaile validate [path]\n cmd\n .argument(\"[path]\", \"Path to asset repo or directory to validate\", \".\")\n .option(\n \"--strict-conformance\",\n \"Treat Agent Skills (agentskills.io) standard findings as errors\",\n )\n .action(async (targetPath: string, opts: { strictConformance?: boolean }) => {\n const absPath = path.resolve(targetPath);\n if (fs.existsSync(absPath) && !fs.statSync(absPath).isDirectory()) {\n logErr(`${absPath} is not a directory: nothing to validate. Pass the library directory.`);\n process.exit(1);\n return;\n }\n logInfo(`Validating manifests in ${absPath}`);\n const { total, errors, warnings } = validateManifests(\n absPath,\n opts.strictConformance ?? false,\n await registeredAssetKeys(libraryRootOf(absPath)),\n );\n const ws = await validateWorkspaceManifests(absPath);\n const rootErrors = await validatePublishManifestRoots(absPath);\n const slugErrors = validatePublishManifestPublisherSlugs(absPath);\n const rootPathErrors = validatePublishManifestRootPaths(absPath);\n const parseErrors = validatePublishManifestParses(absPath);\n const requiresErrors = validatePublishManifestRequires(absPath);\n const unlistedErrors = await validatePublishManifestUnlisted(absPath);\n const versionWarnings = validatePublishManifestVersions(absPath);\n const publisherWarnings = validatePublishManifestPublishers(absPath);\n // Advisory and offline: a dependency no registered library holds may live in a\n // library that is not registered on this machine.\n const dependencyProblems = await unresolvedManifestDependencies(absPath);\n for (const w of dependencyProblems) logWarn(w);\n const dependencyWarnings = dependencyProblems.length;\n const totalErrors =\n errors +\n ws.errors +\n rootErrors +\n slugErrors +\n rootPathErrors +\n parseErrors +\n requiresErrors +\n unlistedErrors;\n console.log();\n warnIgnoredDomainFiles(absPath);\n warnLegacyBundleFiles(absPath);\n logInfo(`Scanned ${total} asset manifest(s) and ${ws.total} skaile.yaml file(s)`);\n // Nothing scanned and no library manifest: a directory with nothing in it is not valid,\n // it is not validated (p745).\n if (\n total === 0 &&\n ws.total === 0 &&\n totalErrors === 0 &&\n !fs.existsSync(path.join(absPath, SKAILE_MANIFEST_FILENAME))\n ) {\n logErr(\n `Nothing to validate in ${absPath}: no asset manifest, skaile.yaml or ${SKAILE_MANIFEST_FILENAME} found.`,\n );\n process.exit(1);\n return;\n }\n const totalWarnings = warnings + versionWarnings + publisherWarnings + dependencyWarnings;\n if (totalWarnings > 0) logWarn(`${totalWarnings} warning(s)`);\n if (totalErrors === 0) {\n logOk(\"All manifests valid\");\n } else {\n logErr(`${totalErrors} validation error(s)`);\n process.exit(1);\n }\n });\n\n cmd\n .command(\"versions\")\n .description(\"Check version fields and flow version pins\")\n .argument(\"[path]\", \"Library or asset directory (default: the current library)\")\n .option(\"--changed-only\", \"Only check assets modified since last commit\")\n .option(\"--strict\", \"Exit 1 on warnings (for CI)\")\n .addOption(removedDomainOption())\n .action(\n (\n pathArg: string | undefined,\n opts: { changedOnly?: boolean; strict?: boolean; domain?: string },\n ) => {\n rejectRemovedDomainOption(opts);\n runVersionsCheck(pathArg, opts);\n },\n );\n\n cmd\n .command(\"changelog\")\n .description(\"Check that modified assets have an updated nearest CHANGELOG.md\")\n .argument(\"[path]\", \"Library or asset directory (default: the current library)\")\n .option(\"--base <ref>\", \"Git base ref for diff\", \"HEAD\")\n .action((pathArg: string | undefined, opts: { base: string }) => {\n const root = resolveCheckRoot(pathArg);\n if (root === null) {\n process.exit(1);\n return;\n }\n const modifiedFiles = changedFiles(root, opts.base, \"changelog\");\n if (modifiedFiles === null) {\n process.exit(1);\n return;\n }\n const { updated, stale, orphans } = checkChangelogUnits(modifiedFiles, root);\n\n if (updated.length + stale.length + orphans.length === 0) {\n logOk(\"No modified assets found\");\n return;\n }\n\n for (const unit of updated) logOk(`${unit} updated`);\n for (const unit of stale) logErr(`${unit} not updated (assets were modified)`);\n for (const asset of orphans) {\n logErr(`${asset} — no CHANGELOG.md in any ancestor directory up to the asset root`);\n }\n\n if (stale.length + orphans.length > 0) process.exit(1);\n });\n\n return cmd;\n}\n"]}
|