@bevel-software/platform-core-backend 0.14.0 → 0.15.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/THIRD-PARTY-NOTICES.md +6 -6
- package/dist/core/catalog-cache-invalidation.d.ts +29 -0
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -0
- package/dist/core/catalog-cache-invalidation.js +71 -0
- package/dist/core/catalog-cache-invalidation.js.map +1 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +99 -8
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +18 -1
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +96 -43
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +18 -6
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +26 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +213 -71
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +59 -7
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +51 -1
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +95 -1
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/access-model/group-files.d.ts.map +1 -1
- package/dist/modules/access-model/group-files.js +4 -1
- package/dist/modules/access-model/group-files.js.map +1 -1
- package/dist/modules/access-model/plugin-principals.d.ts +49 -0
- package/dist/modules/access-model/plugin-principals.d.ts.map +1 -0
- package/dist/modules/access-model/plugin-principals.js +125 -0
- package/dist/modules/access-model/plugin-principals.js.map +1 -0
- package/dist/modules/database/core-schema.d.ts +326 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +52 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +6 -0
- package/dist/modules/kb-sync/index.d.ts.map +1 -0
- package/dist/modules/kb-sync/index.js +5 -0
- package/dist/modules/kb-sync/index.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +77 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.interface.js +2 -0
- package/dist/modules/kb-sync/kb-sync.interface.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.routes.d.ts +70 -0
- package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.routes.js +135 -0
- package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.service.d.ts +45 -0
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.service.js +183 -0
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -0
- package/dist/modules/kb-sync/sync-auth.d.ts +59 -0
- package/dist/modules/kb-sync/sync-auth.d.ts.map +1 -0
- package/dist/modules/kb-sync/sync-auth.js +62 -0
- package/dist/modules/kb-sync/sync-auth.js.map +1 -0
- package/dist/modules/kb-sync/sync-payload.d.ts +32 -0
- package/dist/modules/kb-sync/sync-payload.d.ts.map +1 -0
- package/dist/modules/kb-sync/sync-payload.js +105 -0
- package/dist/modules/kb-sync/sync-payload.js.map +1 -0
- package/dist/modules/marketplace/git-http.routes.d.ts +42 -0
- package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/git-http.routes.js +190 -0
- package/dist/modules/marketplace/git-http.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +23 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +59 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts +59 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.js +96 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +99 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +147 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts +47 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.js +228 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +109 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.js +172 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -0
- package/dist/modules/marketplace/github-facade/index.d.ts +6 -0
- package/dist/modules/marketplace/github-facade/index.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/index.js +6 -0
- package/dist/modules/marketplace/github-facade/index.js.map +1 -0
- package/dist/modules/marketplace/index.d.ts +4 -0
- package/dist/modules/marketplace/index.d.ts.map +1 -0
- package/dist/modules/marketplace/index.js +4 -0
- package/dist/modules/marketplace/index.js.map +1 -0
- package/dist/modules/marketplace/marketplace-repo.service.d.ts +122 -0
- package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -0
- package/dist/modules/marketplace/marketplace-repo.service.js +300 -0
- package/dist/modules/marketplace/marketplace-repo.service.js.map +1 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +4 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +14 -8
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +13 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-state.d.ts +13 -2
- package/dist/modules/mcp/oauth/oauth-state.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-state.js +3 -1
- package/dist/modules/mcp/oauth/oauth-state.js.map +1 -1
- package/dist/modules/plugins/compile/compile-marketplace.d.ts +97 -0
- package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -0
- package/dist/modules/plugins/compile/compile-marketplace.js +240 -0
- package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +66 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +132 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +37 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +135 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +45 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js +147 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +37 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.js +107 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -0
- package/dist/modules/plugins/discovery/native.source.d.ts +15 -0
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/native.source.js +102 -0
- package/dist/modules/plugins/discovery/native.source.js.map +1 -0
- package/dist/modules/plugins/discovery/plugin-source.d.ts +96 -0
- package/dist/modules/plugins/discovery/plugin-source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/plugin-source.js +2 -0
- package/dist/modules/plugins/discovery/plugin-source.js.map +1 -0
- package/dist/modules/plugins/index.d.ts +10 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +8 -0
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +66 -0
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-links.js +160 -0
- package/dist/modules/plugins/plugin-links.js.map +1 -0
- package/dist/modules/plugins/plugin-links.service.d.ts +114 -0
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-links.service.js +304 -0
- package/dist/modules/plugins/plugin-links.service.js.map +1 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts +39 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +152 -52
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +69 -0
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-rename.service.js +245 -0
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -0
- package/dist/modules/plugins/plugins.contract.d.ts +27 -1
- package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +7 -1
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +120 -12
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +50 -3
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +108 -47
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +9 -0
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +82 -2
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +26 -0
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +9 -1
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/index.d.ts +1 -0
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +1 -0
- package/dist/modules/skills/index.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -4
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +38 -0
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -0
- package/dist/modules/skills/skill-access-requests.routes.js +168 -0
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -0
- package/dist/modules/skills/skills.contract.d.ts +31 -0
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +28 -3
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +42 -3
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -0
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +83 -22
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +18 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js +2 -1
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +13 -4
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +26 -9
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +36 -0
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +130 -92
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +6 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +18 -25
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +40 -2
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +227 -54
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +6 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +8 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +52 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +242 -9
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +35 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +121 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -0
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +46 -2
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +112 -25
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +9 -9
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +33 -0
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +110 -16
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +20 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +29 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/fs-errors.d.ts +8 -0
- package/dist/shared/fs-errors.d.ts.map +1 -0
- package/dist/shared/fs-errors.js +11 -0
- package/dist/shared/fs-errors.js.map +1 -0
- package/dist/shared/fs-walk.d.ts +20 -6
- package/dist/shared/fs-walk.d.ts.map +1 -1
- package/dist/shared/fs-walk.js +35 -27
- package/dist/shared/fs-walk.js.map +1 -1
- package/dist/shared/kb-walk.d.ts +52 -0
- package/dist/shared/kb-walk.d.ts.map +1 -0
- package/dist/shared/kb-walk.js +76 -0
- package/dist/shared/kb-walk.js.map +1 -0
- package/dist/shared/path-order.d.ts +18 -0
- package/dist/shared/path-order.d.ts.map +1 -0
- package/dist/shared/path-order.js +35 -0
- package/dist/shared/path-order.js.map +1 -0
- package/dist/shared/ttl-cache.d.ts +28 -1
- package/dist/shared/ttl-cache.d.ts.map +1 -1
- package/dist/shared/ttl-cache.js +33 -1
- package/dist/shared/ttl-cache.js.map +1 -1
- package/kb-template/.bevelignore +1 -1
- package/kb-template/AGENTS.md +95 -30
- package/kb-template/Skills/.gitkeep +0 -0
- package/migrations/0005_github_facade.sql +25 -0
- package/migrations/meta/0005_snapshot.json +1717 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +6 -6
- package/src/__tests__/kb-layout-config.test.ts +110 -0
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +146 -0
- package/src/core/catalog-cache-invalidation.ts +92 -0
- package/src/core/create-core-server.ts +123 -7
- package/src/core/create-core-services.ts +162 -41
- package/src/modules/access/__tests__/access-control.invalidate-race.test.ts +86 -0
- package/src/modules/access/__tests__/access-control.service.test.ts +19 -3
- package/src/modules/access/__tests__/access-plugin-principals.test.ts +368 -0
- package/src/modules/access/__tests__/groups-admin.service.test.ts +8 -0
- package/src/modules/access/access-control.interface.ts +20 -9
- package/src/modules/access/access-control.service.ts +240 -78
- package/src/modules/access/access.routes.ts +96 -14
- package/src/modules/access-model/__tests__/access-grammar.test.ts +18 -0
- package/src/modules/access-model/__tests__/plugin-token-canonical.test.ts +40 -0
- package/src/modules/access-model/access-grammar.ts +114 -2
- package/src/modules/access-model/group-files.ts +4 -0
- package/src/modules/access-model/plugin-principals.ts +137 -0
- package/src/modules/database/core-schema.ts +54 -0
- package/src/modules/kb-sync/__tests__/kb-sync.routes.test.ts +297 -0
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +295 -0
- package/src/modules/kb-sync/__tests__/sync-auth.test.ts +118 -0
- package/src/modules/kb-sync/__tests__/sync-payload.test.ts +148 -0
- package/src/modules/kb-sync/index.ts +19 -0
- package/src/modules/kb-sync/kb-sync.interface.ts +79 -0
- package/src/modules/kb-sync/kb-sync.routes.ts +197 -0
- package/src/modules/kb-sync/kb-sync.service.ts +201 -0
- package/src/modules/kb-sync/sync-auth.ts +118 -0
- package/src/modules/kb-sync/sync-payload.ts +143 -0
- package/src/modules/marketplace/__tests__/github-facade.test.ts +443 -0
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +179 -0
- package/src/modules/marketplace/git-http.routes.ts +193 -0
- package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +78 -0
- package/src/modules/marketplace/github-facade/github-facade-codes.store.ts +145 -0
- package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +208 -0
- package/src/modules/marketplace/github-facade/github-facade.routes.ts +268 -0
- package/src/modules/marketplace/github-facade/github-facade.service.ts +221 -0
- package/src/modules/marketplace/github-facade/index.ts +25 -0
- package/src/modules/marketplace/index.ts +3 -0
- package/src/modules/marketplace/marketplace-repo.service.ts +337 -0
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +3 -0
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +24 -2
- package/src/modules/mcp/oauth/oauth-state.ts +15 -3
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +163 -0
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +294 -0
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +56 -12
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +287 -0
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +205 -5
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +394 -0
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +80 -33
- package/src/modules/plugins/compile/compile-marketplace.ts +403 -0
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +150 -0
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +329 -0
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +140 -0
- package/src/modules/plugins/discovery/bundle-dialect/registry.ts +175 -0
- package/src/modules/plugins/discovery/kb-plugin-source.ts +114 -0
- package/src/modules/plugins/discovery/native.source.ts +122 -0
- package/src/modules/plugins/discovery/plugin-source.ts +99 -0
- package/src/modules/plugins/index.ts +10 -0
- package/src/modules/plugins/plugin-links.service.ts +363 -0
- package/src/modules/plugins/plugin-links.ts +184 -0
- package/src/modules/plugins/plugin-provision.service.ts +160 -54
- package/src/modules/plugins/plugin-rename.service.ts +298 -0
- package/src/modules/plugins/plugins.contract.ts +28 -1
- package/src/modules/plugins/plugins.routes.ts +128 -11
- package/src/modules/plugins/plugins.service.ts +106 -53
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +57 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +77 -0
- package/src/modules/settings/deployment-settings.service.ts +95 -2
- package/src/modules/settings/setup.routes.ts +24 -0
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +128 -0
- package/src/modules/skills/__tests__/skills.service.test.ts +85 -0
- package/src/modules/skills/index.ts +1 -0
- package/src/modules/skills/pending-skills.service.ts +7 -5
- package/src/modules/skills/skill-access-requests.routes.ts +199 -0
- package/src/modules/skills/skills.contract.ts +32 -0
- package/src/modules/skills/skills.routes.ts +59 -3
- package/src/modules/skills/skills.service.ts +84 -22
- package/src/modules/tool-auth/external-api-key.interface.ts +20 -1
- package/src/modules/tool-auth/external-api-key.service.ts +31 -13
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +24 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +154 -88
- package/src/modules/tool-manuals/tool-manuals.service.ts +14 -23
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +1 -1
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +1 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +2 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +119 -2
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +437 -0
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +3 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +47 -4
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +253 -0
- package/src/modules/workflow/git/git.service.ts +239 -56
- package/src/modules/workflow/git/pull-request.service.ts +9 -0
- package/src/modules/workflow/workflow.service.ts +260 -9
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +6 -7
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +93 -0
- package/src/modules/workspace/__tests__/workspace.service.missing-branch.test.ts +28 -0
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +42 -12
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +219 -4
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +129 -0
- package/src/modules/workspace/startup/steps/seed-tree.ts +44 -2
- package/src/modules/workspace/startup/steps/template-files.step.ts +131 -27
- package/src/modules/workspace/workspace.routes.ts +9 -17
- package/src/modules/workspace/workspace.service.ts +107 -16
- package/src/shared/__tests__/filename.test.ts +0 -0
- package/src/shared/__tests__/fs-walk.test.ts +22 -1
- package/src/shared/__tests__/kb-walk.test.ts +107 -0
- package/src/shared/__tests__/path-order.test.ts +24 -0
- package/src/shared/__tests__/ttl-cache.test.ts +55 -0
- package/src/shared/domain-errors.ts +29 -0
- package/src/shared/fs-errors.ts +10 -0
- package/src/shared/fs-walk.ts +38 -23
- package/src/shared/kb-walk.ts +95 -0
- package/src/shared/path-order.ts +33 -0
- package/src/shared/ttl-cache.ts +33 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { SkillSummary } from '../../skills/skills.contract.js';
|
|
2
|
+
import type { LinkMembership } from '../plugin-links.js';
|
|
3
|
+
import type { DiscoveredPlugin } from '../discovery/plugin-source.js';
|
|
4
|
+
/**
|
|
5
|
+
* The compiler: SOURCE layout in, DISTRIBUTION layout out.
|
|
6
|
+
*
|
|
7
|
+
* Source is what lives in the knowledge base — shared skills under
|
|
8
|
+
* `Skills/`, plugin folders under `Plugins/` whose manifests LINK to them.
|
|
9
|
+
* Distribution is what an agent installs: a marketplace of self-contained
|
|
10
|
+
* plugins, each physically holding its skills (Claude Code refuses paths
|
|
11
|
+
* that escape a plugin's directory, and symlinks are out), in the vendor
|
|
12
|
+
* layouts the clients read today — `.claude-plugin/plugin.json`,
|
|
13
|
+
* `.codex-plugin/plugin.json`, `.mcp.json` — beside the Agent Plugins
|
|
14
|
+
* `plugin.json` and `mcp.json`.
|
|
15
|
+
*
|
|
16
|
+
* What comes out, for one caller:
|
|
17
|
+
*
|
|
18
|
+
* .claude-plugin/marketplace.json Claude Code's catalogue
|
|
19
|
+
* .agents/plugins/marketplace.json Codex's catalogue, every entry
|
|
20
|
+
* INSTALLED_BY_DEFAULT
|
|
21
|
+
* plugins/<slug>/… one per plugin the caller may read
|
|
22
|
+
* anything of: inline + linked skills,
|
|
23
|
+
* the portable half of mcp.json
|
|
24
|
+
* plugins/skills-and-knowledge/… every readable skill no plugin above
|
|
25
|
+
* ships — how a standalone skill, or one
|
|
26
|
+
* only in plugins the caller cannot see,
|
|
27
|
+
* is still one install away — plus the
|
|
28
|
+
* knowledge base's own MCP endpoint
|
|
29
|
+
* plugins/hexis-all/… a bundle whose only content is a
|
|
30
|
+
* dependency on every plugin above —
|
|
31
|
+
* Claude Code installs them all from
|
|
32
|
+
* one `claude plugin install`
|
|
33
|
+
* skills/<name>/… every readable skill once, flat, for
|
|
34
|
+
* `npx skills add <url> --all`
|
|
35
|
+
* README.md names the source commit
|
|
36
|
+
*
|
|
37
|
+
* FAIL CLOSED, per file: a skill is copied only when `readable` says yes for
|
|
38
|
+
* its SKILL.md — the same per-path verdict the catalog filters on — so the
|
|
39
|
+
* compiled tree for a caller holds exactly what that caller may read, and
|
|
40
|
+
* nothing about a skill they may not. Plugins with nothing readable are
|
|
41
|
+
* left out entirely. `access.md` and `.bevelignore` never ship; neither do
|
|
42
|
+
* the hexis-only `.tool` manuals (no other client can run them), nor an
|
|
43
|
+
* `mcp.json` header carrying a `${VAR}` vault reference (the extension block
|
|
44
|
+
* that resolves it is ours, and a header a client would send verbatim must
|
|
45
|
+
* not name a secret it cannot expand).
|
|
46
|
+
*
|
|
47
|
+
* A pure function of its inputs — it reads the KB tree it is pointed at and
|
|
48
|
+
* returns a virtual tree; writing it somewhere (a git namespace, a folder, a
|
|
49
|
+
* remote) is the sink's business.
|
|
50
|
+
*/
|
|
51
|
+
export interface MarketplaceOptions {
|
|
52
|
+
/** The marketplace's name — a slug the clients key it on. */
|
|
53
|
+
name: string;
|
|
54
|
+
/** Shown as the marketplace owner. */
|
|
55
|
+
owner: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
/** The default-branch commit the tree was compiled from; also the bundle's version. */
|
|
58
|
+
sourceCommit: string;
|
|
59
|
+
/** The name of the one-install bundle plugin. */
|
|
60
|
+
bundleName?: string;
|
|
61
|
+
/** The name of the leftovers plugin holding skills no other plugin ships. */
|
|
62
|
+
skillsPluginName?: string;
|
|
63
|
+
/**
|
|
64
|
+
* This deployment's hosted MCP endpoint — the knowledge base as a tool.
|
|
65
|
+
* Shipped in the leftovers plugin's `mcp.json` so an agent that installs
|
|
66
|
+
* from the marketplace can read the knowledge its skills refer to. URL only,
|
|
67
|
+
* never a credential: the endpoint challenges with OAuth metadata, and the
|
|
68
|
+
* client signs the person in on first use.
|
|
69
|
+
*/
|
|
70
|
+
knowledgeBaseMcp?: {
|
|
71
|
+
name: string;
|
|
72
|
+
url: string;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export interface CompileInput {
|
|
76
|
+
/** Absolute path of the KB checkout (the folder holding `Plugins/`, `Skills/`, …). */
|
|
77
|
+
kbRoot: string;
|
|
78
|
+
/** The released catalog, UNFILTERED — `readable` does the filtering. */
|
|
79
|
+
skills: SkillSummary[];
|
|
80
|
+
/** The plugins as the configured source discovered them (manifests and servers already parsed). */
|
|
81
|
+
plugins: DiscoveredPlugin[];
|
|
82
|
+
/** Which plugins hold which skills, from the link index. */
|
|
83
|
+
membership: LinkMembership;
|
|
84
|
+
/** The caller's read verdict on a repo-relative path (`<skillFolder>/SKILL.md`). */
|
|
85
|
+
readable: (repoPath: string) => Promise<boolean>;
|
|
86
|
+
options: MarketplaceOptions;
|
|
87
|
+
}
|
|
88
|
+
export interface VirtualTree {
|
|
89
|
+
/** repo-relative POSIX path → file bytes. */
|
|
90
|
+
files: Map<string, Buffer>;
|
|
91
|
+
/** What was left out and why — name clashes, unparsable manifests. */
|
|
92
|
+
warnings: string[];
|
|
93
|
+
/** The plugin slugs the tree carries, in marketplace order. */
|
|
94
|
+
plugins: string[];
|
|
95
|
+
}
|
|
96
|
+
export declare function compileMarketplace(input: CompileInput): Promise<VirtualTree>;
|
|
97
|
+
//# sourceMappingURL=compile-marketplace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-marketplace.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugins/compile/compile-marketplace.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AAED,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,mGAAmG;IACnG,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,4DAA4D;IAC5D,UAAU,EAAE,cAAc,CAAC;IAC3B,oFAAoF;IACpF,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAQD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAmNlF"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { PLUGIN_MANIFEST_FILE, PLUGIN_MCP_FILE, PLUGIN_MANIFEST_SCHEMA, PLUGIN_MCP_SCHEMA, pluginManifestName, } from '@bevel-software/platform-shared';
|
|
4
|
+
import { walkFiles } from '../../../shared/fs-walk.js';
|
|
5
|
+
import { containsVariableReference } from '../../../shared/variable-refs.js';
|
|
6
|
+
import { judgeMcpServerEntry } from '../../tool-manuals/mcp-json-discovery.js';
|
|
7
|
+
const BUNDLE_NAME = 'hexis-all';
|
|
8
|
+
const SKILLS_PLUGIN_NAME = 'skills-and-knowledge';
|
|
9
|
+
/** Slugs the compiler emits itself; a real plugin may not take them. */
|
|
10
|
+
const RESERVED_SLUGS = new Set([BUNDLE_NAME, SKILLS_PLUGIN_NAME]);
|
|
11
|
+
const NEVER_SHIPPED = new Set(['access.md', '.bevelignore']);
|
|
12
|
+
export async function compileMarketplace(input) {
|
|
13
|
+
const { kbRoot, skills, plugins, membership, readable, options } = input;
|
|
14
|
+
const files = new Map();
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const put = (rel, content) => files.set(rel, typeof content === 'string' ? Buffer.from(content, 'utf-8') : content);
|
|
17
|
+
// One verdict per skill, resolved once: every plugin below reads from it. A
|
|
18
|
+
// RETIRED skill (its governance lifecycle) stays in the catalog for its
|
|
19
|
+
// owners but never ships — retiring is how a skill leaves every agent.
|
|
20
|
+
const readableSkills = new Map();
|
|
21
|
+
for (const s of skills) {
|
|
22
|
+
if (s.lifecycle === 'retired')
|
|
23
|
+
continue;
|
|
24
|
+
if (await readable(`${s.path}/SKILL.md`))
|
|
25
|
+
readableSkills.set(s.path, s);
|
|
26
|
+
}
|
|
27
|
+
const out = [];
|
|
28
|
+
// 1. Real plugins: inline skills (in the folder) + linked skills (from the
|
|
29
|
+
// manifest), each only if readable. Personal folders are places, not
|
|
30
|
+
// plugins; a plugin the index does not count as existing is not shipped.
|
|
31
|
+
const byName = new Map(plugins.map((p) => [p.name, p]));
|
|
32
|
+
for (const [name, links] of [...membership.byPlugin.entries()].sort(([a], [b]) => a.localeCompare(b))) {
|
|
33
|
+
const plugin = byName.get(name);
|
|
34
|
+
if (!plugin || plugin.personal || !plugin.exists)
|
|
35
|
+
continue;
|
|
36
|
+
const manifest = plugin.manifest;
|
|
37
|
+
const inline = [...readableSkills.values()].filter((s) => s.path.startsWith(`${plugin.folder}/`));
|
|
38
|
+
const linked = links.linkedSkills
|
|
39
|
+
.map((p) => readableSkills.get(p))
|
|
40
|
+
.filter((s) => s !== undefined);
|
|
41
|
+
const dedup = dedupeByName([...inline, ...linked], (s, other) => warnings.push(`${name}: skill "${s.name}" at ${s.path} shares its name with ${other.path} — the second is left out`));
|
|
42
|
+
const mcp = portableMcp(plugin.mcpServers, (name, reason) => warnings.push(`${plugin.folder}: mcp server "${name}" not shipped — ${reason}`));
|
|
43
|
+
if (dedup.length === 0 && mcp === null)
|
|
44
|
+
continue; // nothing this caller may see
|
|
45
|
+
// The plugin's identity IS the marketplace slug. Folded once more here
|
|
46
|
+
// all the same: it becomes a path segment in the compiled tree, and a
|
|
47
|
+
// checked-in manifest is repository content, not trusted input — the
|
|
48
|
+
// folding (`[a-z0-9.-]`, no runs, no leading dots) leaves nothing that
|
|
49
|
+
// can be a separator or a parent reference.
|
|
50
|
+
const slug = pluginManifestName(name);
|
|
51
|
+
if (RESERVED_SLUGS.has(slug)) {
|
|
52
|
+
warnings.push(`${plugin.folder}: manifest name "${slug}" is reserved by the marketplace and cannot be a plugin — plugin skipped`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (out.some((p) => p.slug === slug)) {
|
|
56
|
+
warnings.push(`${plugin.folder}: manifest name "${slug}" is already taken in this marketplace — plugin skipped`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
out.push({
|
|
60
|
+
slug,
|
|
61
|
+
displayName: plugin.displayName,
|
|
62
|
+
description: typeof manifest?.description === 'string' ? manifest.description : undefined,
|
|
63
|
+
version: typeof manifest?.version === 'string' ? manifest.version : undefined,
|
|
64
|
+
skills: dedup,
|
|
65
|
+
folder: plugin.folder,
|
|
66
|
+
mcp: mcp ?? undefined,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// 2. The leftovers plugin: every readable skill that no plugin above ships.
|
|
70
|
+
// Agents install plugins, not loose skills, so a skill in no plugin — or
|
|
71
|
+
// only in plugins this caller cannot see anything of — still has to be one
|
|
72
|
+
// install away. ONE plugin per caller, not one per scope: there is nothing
|
|
73
|
+
// to choose between (the caller may read all of it) and the bundle installs
|
|
74
|
+
// it regardless, so scope plugins would only add names and duplicate what
|
|
75
|
+
// the real plugins already carry.
|
|
76
|
+
// It also carries the knowledge base's own MCP endpoint (URL only — the
|
|
77
|
+
// client's OAuth flow signs the person in), so an agent installing from
|
|
78
|
+
// the marketplace can read the knowledge its skills point at. With the
|
|
79
|
+
// endpoint configured the plugin exists even for a caller with no
|
|
80
|
+
// leftover skill: the knowledge is the point.
|
|
81
|
+
const covered = new Set(out.flatMap((p) => p.skills.map((s) => s.path)));
|
|
82
|
+
const leftovers = [...readableSkills.values()].filter((s) => !covered.has(s.path));
|
|
83
|
+
const kbMcp = options.knowledgeBaseMcp
|
|
84
|
+
? { [options.knowledgeBaseMcp.name]: { type: 'streamable-http', url: options.knowledgeBaseMcp.url } }
|
|
85
|
+
: undefined;
|
|
86
|
+
if (leftovers.length > 0 || kbMcp) {
|
|
87
|
+
const slug = pluginManifestName(options.skillsPluginName ?? SKILLS_PLUGIN_NAME);
|
|
88
|
+
if (out.some((p) => p.slug === slug)) {
|
|
89
|
+
warnings.push(`the skills plugin "${slug}" collides with a plugin's manifest name — standalone skills not shipped`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
out.push({
|
|
93
|
+
slug,
|
|
94
|
+
displayName: 'Skills and knowledge',
|
|
95
|
+
description: kbMcp
|
|
96
|
+
? 'Every skill you may read that no other plugin here ships, and the knowledge base as an MCP server'
|
|
97
|
+
: 'Every skill you may read that no other plugin here ships',
|
|
98
|
+
skills: dedupeByName(leftovers, (s, other) => warnings.push(`${slug}: "${s.name}" at ${s.path} shares its name with ${other.path} — left out`)),
|
|
99
|
+
mcp: kbMcp,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// 3. Materialise every plugin: the three manifests + copied skill folders.
|
|
104
|
+
for (const p of out) {
|
|
105
|
+
const base = `plugins/${p.slug}`;
|
|
106
|
+
const spec = { $schema: PLUGIN_MANIFEST_SCHEMA, name: p.slug };
|
|
107
|
+
if (p.version)
|
|
108
|
+
spec.version = p.version;
|
|
109
|
+
if (p.description)
|
|
110
|
+
spec.description = p.description;
|
|
111
|
+
put(`${base}/${PLUGIN_MANIFEST_FILE}`, `${JSON.stringify(spec, null, 2)}\n`);
|
|
112
|
+
const vendor = { name: p.slug };
|
|
113
|
+
if (p.version)
|
|
114
|
+
vendor.version = p.version;
|
|
115
|
+
vendor.description = p.description ?? p.displayName;
|
|
116
|
+
put(`${base}/.claude-plugin/plugin.json`, `${JSON.stringify(vendor, null, 2)}\n`);
|
|
117
|
+
put(`${base}/.codex-plugin/plugin.json`, `${JSON.stringify(vendor, null, 2)}\n`);
|
|
118
|
+
if (p.mcp) {
|
|
119
|
+
put(`${base}/${PLUGIN_MCP_FILE}`, `${JSON.stringify({ $schema: PLUGIN_MCP_SCHEMA, mcpServers: p.mcp }, null, 2)}\n`);
|
|
120
|
+
put(`${base}/.mcp.json`, `${JSON.stringify({ mcpServers: p.mcp }, null, 2)}\n`);
|
|
121
|
+
}
|
|
122
|
+
for (const s of p.skills) {
|
|
123
|
+
await copySkill(kbRoot, s, `${base}/skills/${s.name}`, put);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// 4. The one-install bundle: a Claude manifest with nothing but dependencies.
|
|
127
|
+
const bundle = pluginManifestName(options.bundleName ?? BUNDLE_NAME);
|
|
128
|
+
const slugs = out.map((p) => p.slug);
|
|
129
|
+
if (slugs.includes(bundle)) {
|
|
130
|
+
// Only reachable with a non-default bundle name that folds to a real
|
|
131
|
+
// plugin's slug: the default is reserved above. Skipping the bundle
|
|
132
|
+
// beats overwriting that plugin's manifests with a dependency list.
|
|
133
|
+
warnings.push(`the bundle name "${bundle}" collides with a plugin's manifest name — no bundle plugin emitted`);
|
|
134
|
+
}
|
|
135
|
+
if (slugs.length > 0 && !slugs.includes(bundle)) {
|
|
136
|
+
const shortSha = options.sourceCommit.slice(0, 12) || '0';
|
|
137
|
+
const description = `Everything in ${options.owner}'s marketplace you may read — one install.`;
|
|
138
|
+
put(`plugins/${bundle}/.claude-plugin/plugin.json`, `${JSON.stringify({ name: bundle, version: `0.0.0-${shortSha}`, description, dependencies: slugs }, null, 2)}\n`);
|
|
139
|
+
put(`plugins/${bundle}/${PLUGIN_MANIFEST_FILE}`, `${JSON.stringify({ $schema: PLUGIN_MANIFEST_SCHEMA, name: bundle, description }, null, 2)}\n`);
|
|
140
|
+
put(`plugins/${bundle}/.codex-plugin/plugin.json`, `${JSON.stringify({ name: bundle, description }, null, 2)}\n`);
|
|
141
|
+
}
|
|
142
|
+
// 5. The flat root skills/ folder, every readable skill once.
|
|
143
|
+
const flat = dedupeByName([...readableSkills.values()].sort((a, b) => a.path.localeCompare(b.path)), (s, other) => warnings.push(`skills/: "${s.name}" at ${s.path} shares its name with ${other.path} — left out`));
|
|
144
|
+
for (const s of flat)
|
|
145
|
+
await copySkill(kbRoot, s, `skills/${s.name}`, put);
|
|
146
|
+
// 6. The two catalogues + a README naming the source.
|
|
147
|
+
const bundleEmitted = slugs.length > 0 && !slugs.includes(bundle);
|
|
148
|
+
const entries = [...out.map((p) => ({ slug: p.slug, description: p.description ?? p.displayName })), ...(bundleEmitted ? [{ slug: bundle, description: 'Everything you may read, one install' }] : [])];
|
|
149
|
+
put('.claude-plugin/marketplace.json', `${JSON.stringify({
|
|
150
|
+
name: options.name,
|
|
151
|
+
owner: { name: options.owner },
|
|
152
|
+
...(options.description ? { description: options.description } : {}),
|
|
153
|
+
plugins: entries.map((e) => ({ name: e.slug, source: `./plugins/${e.slug}`, description: e.description })),
|
|
154
|
+
}, null, 2)}\n`);
|
|
155
|
+
put('.agents/plugins/marketplace.json', `${JSON.stringify({
|
|
156
|
+
name: options.name,
|
|
157
|
+
plugins: entries.map((e) => ({
|
|
158
|
+
name: e.slug,
|
|
159
|
+
source: { source: 'local', path: `./plugins/${e.slug}` },
|
|
160
|
+
policy: { installation: 'INSTALLED_BY_DEFAULT' },
|
|
161
|
+
description: e.description,
|
|
162
|
+
})),
|
|
163
|
+
}, null, 2)}\n`);
|
|
164
|
+
put('README.md', [
|
|
165
|
+
`# ${options.name}`,
|
|
166
|
+
'',
|
|
167
|
+
`Compiled from ${options.owner}'s knowledge base at commit \`${options.sourceCommit}\`.`,
|
|
168
|
+
'This tree is generated: edit the knowledge base, not these files.',
|
|
169
|
+
'',
|
|
170
|
+
`Plugins: ${entries.map((e) => e.slug).join(', ') || 'none'}.`,
|
|
171
|
+
'',
|
|
172
|
+
].join('\n'));
|
|
173
|
+
return { files, warnings, plugins: entries.map((e) => e.slug) };
|
|
174
|
+
}
|
|
175
|
+
// --- helpers ------------------------------------------------------------------
|
|
176
|
+
/** Copy a skill folder (minus what never ships) under `dest`. */
|
|
177
|
+
async function copySkill(kbRoot, skill, dest, put) {
|
|
178
|
+
const abs = path.join(kbRoot, skill.path);
|
|
179
|
+
for (const rel of await walkFiles(abs, (name) => !NEVER_SHIPPED.has(name))) {
|
|
180
|
+
put(`${dest}/${rel}`, await fs.readFile(path.join(abs, rel)));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** First by (name, path) order wins; the loser is reported to `onClash`. */
|
|
184
|
+
function dedupeByName(list, onClash) {
|
|
185
|
+
const sorted = [...list].sort((a, b) => a.name.localeCompare(b.name) || a.path.localeCompare(b.path));
|
|
186
|
+
const seen = new Map();
|
|
187
|
+
const out = [];
|
|
188
|
+
for (const s of sorted) {
|
|
189
|
+
const winner = seen.get(s.name);
|
|
190
|
+
if (winner) {
|
|
191
|
+
if (winner.path !== s.path)
|
|
192
|
+
onClash(s, winner);
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
seen.set(s.name, s);
|
|
196
|
+
out.push(s);
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* The portable half of a plugin's `mcpServers`: every entry the ONE
|
|
202
|
+
* judgement accepts (a name a client can key on, a transport it speaks, the
|
|
203
|
+
* field that transport needs), normalised, minus what a client cannot use —
|
|
204
|
+
* `${VAR}` vault references in a url or a header. Null when there is no
|
|
205
|
+
* server to ship; each server left out is reported with the judgement's
|
|
206
|
+
* reason, so an omission is diagnosable.
|
|
207
|
+
*/
|
|
208
|
+
function portableMcp(servers, leftOut) {
|
|
209
|
+
if (!servers)
|
|
210
|
+
return null;
|
|
211
|
+
const out = {};
|
|
212
|
+
for (const [name, raw] of Object.entries(servers)) {
|
|
213
|
+
const verdict = judgeMcpServerEntry(name, raw);
|
|
214
|
+
if (!verdict.ok) {
|
|
215
|
+
leftOut(name, verdict.reason);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
if (verdict.transport === 'stdio') {
|
|
219
|
+
out[name] = { ...verdict.entry };
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const entry = { type: verdict.entry.type, url: verdict.entry.url };
|
|
223
|
+
if (containsVariableReference(verdict.entry.url)) {
|
|
224
|
+
leftOut(name, 'its url is expanded from the vault, which a client cannot do');
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (verdict.entry.headers) {
|
|
228
|
+
const headers = {};
|
|
229
|
+
for (const [h, v] of Object.entries(verdict.entry.headers)) {
|
|
230
|
+
if (!containsVariableReference(v))
|
|
231
|
+
headers[h] = v;
|
|
232
|
+
}
|
|
233
|
+
if (Object.keys(headers).length > 0)
|
|
234
|
+
entry.headers = headers;
|
|
235
|
+
}
|
|
236
|
+
out[name] = entry;
|
|
237
|
+
}
|
|
238
|
+
return Object.keys(out).length > 0 ? out : null;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=compile-marketplace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-marketplace.js","sourceRoot":"","sources":["../../../../src/modules/plugins/compile/compile-marketplace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
2
|
+
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
3
|
+
import type { ISkillService } from '../../skills/skills.contract.js';
|
|
4
|
+
import type { PluginLinkIndex } from '../plugin-links.js';
|
|
5
|
+
import type { PluginSource } from '../discovery/plugin-source.js';
|
|
6
|
+
import { type VirtualTree } from './compile-marketplace.js';
|
|
7
|
+
/** Whose view of the knowledge base to compile. */
|
|
8
|
+
export type CompileAudience = {
|
|
9
|
+
userEmail: string;
|
|
10
|
+
} | {
|
|
11
|
+
everyone: true;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The compiler wired to the live deployment: the default-branch checkout,
|
|
15
|
+
* the released catalog, the link index, and the access resolver as the read
|
|
16
|
+
* verdict. Every sink — the per-user git endpoint, a public mirror, a local
|
|
17
|
+
* export — asks this for a tree and writes it somewhere.
|
|
18
|
+
*
|
|
19
|
+
* Two audiences: a PERSON (their `canRead` per skill, exactly the catalog's
|
|
20
|
+
* filter) or EVERYONE (only what `read: everyone` reaches cleanly — the
|
|
21
|
+
* public subset a shared mirror may carry). Nothing in between: an audience
|
|
22
|
+
* that is "these three people" would need a union of verdicts nobody has
|
|
23
|
+
* asked for yet.
|
|
24
|
+
*/
|
|
25
|
+
export declare class MarketplaceCompilerService {
|
|
26
|
+
private readonly workspaceService;
|
|
27
|
+
private readonly accessControl;
|
|
28
|
+
private readonly skillService;
|
|
29
|
+
private readonly links;
|
|
30
|
+
private readonly kbDirName;
|
|
31
|
+
private readonly marketplace;
|
|
32
|
+
private readonly source;
|
|
33
|
+
constructor(workspaceService: WorkspaceService, accessControl: IAccessControl, skillService: ISkillService, links: PluginLinkIndex, kbDirName: string, marketplace: {
|
|
34
|
+
name: string;
|
|
35
|
+
owner: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
/** The hosted MCP endpoint to ship in the skills plugin (URL only). */
|
|
38
|
+
knowledgeBaseMcp?: {
|
|
39
|
+
name: string;
|
|
40
|
+
url: string;
|
|
41
|
+
};
|
|
42
|
+
}, source?: PluginSource);
|
|
43
|
+
/**
|
|
44
|
+
* The default-branch commit the next compile would read. Throws when git
|
|
45
|
+
* cannot say: the repo service keys freshness on this value, and a stable
|
|
46
|
+
* placeholder would make every later compile look unnecessary — source
|
|
47
|
+
* changes and access revocations would never reach that caller again.
|
|
48
|
+
*/
|
|
49
|
+
sourceCommit(): Promise<string>;
|
|
50
|
+
compileFor(audience: CompileAudience,
|
|
51
|
+
/** The commit to stamp the tree with, when the caller already read it (the freshness check does). */
|
|
52
|
+
knownCommit?: string): Promise<VirtualTree & {
|
|
53
|
+
sourceCommit: string;
|
|
54
|
+
}>;
|
|
55
|
+
private checkout;
|
|
56
|
+
/**
|
|
57
|
+
* One batch verdict per compile, then a lookup. Fail closed both ways: a
|
|
58
|
+
* path the batch skipped is unreadable, and for the everyone audience a
|
|
59
|
+
* skill is public only when the resolver says `read: everyone` applies
|
|
60
|
+
* cleanly (`restricted: false`).
|
|
61
|
+
*/
|
|
62
|
+
private readPredicate;
|
|
63
|
+
}
|
|
64
|
+
/** The default-branch workspace id compiles run against. */
|
|
65
|
+
export declare function compileWorkspaceId(): string;
|
|
66
|
+
//# sourceMappingURL=marketplace-compiler.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace-compiler.service.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugins/compile/marketplace-compiler.service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIhF,mDAAmD;AACnD,MAAM,MAAM,eAAe,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,CAAC;AAEzE;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAO5B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAZN,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,cAAc,EAC7B,YAAY,EAAE,aAAa,EAC3B,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,uEAAuE;QACvE,gBAAgB,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;KAClD,EACgB,MAAM,GAAE,YAAmC;IAG9D;;;;;OAKG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAW/B,UAAU,CACd,QAAQ,EAAE,eAAe;IACzB,qGAAqG;IACrG,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;YAwCpC,QAAQ;IAKtB;;;;;OAKG;YACW,aAAa;CAyB5B;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
5
|
+
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
6
|
+
import { KbPluginSource } from '../discovery/kb-plugin-source.js';
|
|
7
|
+
import { compileMarketplace } from './compile-marketplace.js';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
/**
|
|
10
|
+
* The compiler wired to the live deployment: the default-branch checkout,
|
|
11
|
+
* the released catalog, the link index, and the access resolver as the read
|
|
12
|
+
* verdict. Every sink — the per-user git endpoint, a public mirror, a local
|
|
13
|
+
* export — asks this for a tree and writes it somewhere.
|
|
14
|
+
*
|
|
15
|
+
* Two audiences: a PERSON (their `canRead` per skill, exactly the catalog's
|
|
16
|
+
* filter) or EVERYONE (only what `read: everyone` reaches cleanly — the
|
|
17
|
+
* public subset a shared mirror may carry). Nothing in between: an audience
|
|
18
|
+
* that is "these three people" would need a union of verdicts nobody has
|
|
19
|
+
* asked for yet.
|
|
20
|
+
*/
|
|
21
|
+
export class MarketplaceCompilerService {
|
|
22
|
+
workspaceService;
|
|
23
|
+
accessControl;
|
|
24
|
+
skillService;
|
|
25
|
+
links;
|
|
26
|
+
kbDirName;
|
|
27
|
+
marketplace;
|
|
28
|
+
source;
|
|
29
|
+
constructor(workspaceService, accessControl, skillService, links, kbDirName, marketplace, source = new KbPluginSource()) {
|
|
30
|
+
this.workspaceService = workspaceService;
|
|
31
|
+
this.accessControl = accessControl;
|
|
32
|
+
this.skillService = skillService;
|
|
33
|
+
this.links = links;
|
|
34
|
+
this.kbDirName = kbDirName;
|
|
35
|
+
this.marketplace = marketplace;
|
|
36
|
+
this.source = source;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The default-branch commit the next compile would read. Throws when git
|
|
40
|
+
* cannot say: the repo service keys freshness on this value, and a stable
|
|
41
|
+
* placeholder would make every later compile look unnecessary — source
|
|
42
|
+
* changes and access revocations would never reach that caller again.
|
|
43
|
+
*/
|
|
44
|
+
async sourceCommit() {
|
|
45
|
+
const { kbRoot } = await this.checkout();
|
|
46
|
+
const { stdout } = await execFileAsync('git', ['-C', kbRoot, 'rev-parse', 'HEAD']);
|
|
47
|
+
const sha = stdout.trim();
|
|
48
|
+
// SHA-1 or SHA-256 object format: any hex object id is a commit.
|
|
49
|
+
if (!/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(sha)) {
|
|
50
|
+
throw new Error(`could not read the default branch's commit (${sha || 'empty'})`);
|
|
51
|
+
}
|
|
52
|
+
return sha;
|
|
53
|
+
}
|
|
54
|
+
async compileFor(audience,
|
|
55
|
+
/** The commit to stamp the tree with, when the caller already read it (the freshness check does). */
|
|
56
|
+
knownCommit) {
|
|
57
|
+
const { wsId, kbRoot } = await this.checkout();
|
|
58
|
+
// Strictness about the commit belongs to the FRESHNESS check (the repo
|
|
59
|
+
// service calls `sourceCommit()` itself and refuses to serve without
|
|
60
|
+
// one). A compile of a checkout git cannot describe still yields a
|
|
61
|
+
// correct tree; only its README and bundle version lose the sha.
|
|
62
|
+
const sourceCommit = knownCommit ?? (await this.sourceCommit().catch(() => 'unknown'));
|
|
63
|
+
// The tree is stamped with the checkout's commit, so every input must be
|
|
64
|
+
// read from that checkout NOW — not from a catalog scanned before the
|
|
65
|
+
// commit landed. The skill catalog, the link index and the access memo
|
|
66
|
+
// are TTL caches that nothing drops on an ordinary write (an MCP
|
|
67
|
+
// `write_files` moves HEAD and invalidates none of them), and the repo
|
|
68
|
+
// service keys freshness on the stamped commit: a tree compiled from a
|
|
69
|
+
// stale catalog under a fresh sha would be "current" until the NEXT
|
|
70
|
+
// commit, with the caller's marketplace frozen on content the knowledge
|
|
71
|
+
// base no longer has. Compiles run once per moved commit per caller, so
|
|
72
|
+
// the rescan is cheap where it matters.
|
|
73
|
+
this.skillService.invalidate();
|
|
74
|
+
this.links.invalidate();
|
|
75
|
+
this.accessControl.invalidate(wsId);
|
|
76
|
+
const skills = await this.skillService.listSkills(undefined);
|
|
77
|
+
const membership = await this.links.membership();
|
|
78
|
+
const { plugins, warnings: discoveryWarnings } = await this.source.discover(kbRoot);
|
|
79
|
+
const readable = await this.readPredicate(wsId, audience, skills.map((s) => `${s.path}/SKILL.md`));
|
|
80
|
+
const tree = await compileMarketplace({
|
|
81
|
+
kbRoot,
|
|
82
|
+
skills,
|
|
83
|
+
plugins,
|
|
84
|
+
membership,
|
|
85
|
+
readable,
|
|
86
|
+
options: { ...this.marketplace, sourceCommit },
|
|
87
|
+
});
|
|
88
|
+
// Discovery's warnings ride with the compile's: a plugin left out for a
|
|
89
|
+
// malformed manifest or an unresolved MCP profile is otherwise an
|
|
90
|
+
// omission nobody can diagnose from the tree alone.
|
|
91
|
+
return { ...tree, warnings: [...discoveryWarnings, ...tree.warnings], sourceCommit };
|
|
92
|
+
}
|
|
93
|
+
// --- internal --------------------------------------------------------------
|
|
94
|
+
async checkout() {
|
|
95
|
+
const wsId = (await this.workspaceService.getOrCreateForBranch(DEFAULT_BRANCH)).id;
|
|
96
|
+
return { wsId, kbRoot: path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName) };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* One batch verdict per compile, then a lookup. Fail closed both ways: a
|
|
100
|
+
* path the batch skipped is unreadable, and for the everyone audience a
|
|
101
|
+
* skill is public only when the resolver says `read: everyone` applies
|
|
102
|
+
* cleanly (`restricted: false`).
|
|
103
|
+
*/
|
|
104
|
+
async readPredicate(wsId, audience, docPaths) {
|
|
105
|
+
if ('userEmail' in audience) {
|
|
106
|
+
const verdicts = docPaths.length
|
|
107
|
+
? await this.accessControl.canReadBatch(wsId, audience.userEmail, docPaths)
|
|
108
|
+
: new Map();
|
|
109
|
+
return async (p) => verdicts.get(p) === true;
|
|
110
|
+
}
|
|
111
|
+
const cache = new Map();
|
|
112
|
+
return async (p) => {
|
|
113
|
+
const hit = cache.get(p);
|
|
114
|
+
if (hit !== undefined)
|
|
115
|
+
return hit;
|
|
116
|
+
let verdict = false;
|
|
117
|
+
try {
|
|
118
|
+
verdict = !(await this.accessControl.eligibleReaders(wsId, p)).restricted;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
verdict = false;
|
|
122
|
+
}
|
|
123
|
+
cache.set(p, verdict);
|
|
124
|
+
return verdict;
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** The default-branch workspace id compiles run against. */
|
|
129
|
+
export function compileWorkspaceId() {
|
|
130
|
+
return workspaceIdForBranch(DEFAULT_BRANCH);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=marketplace-compiler.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace-compiler.service.js","sourceRoot":"","sources":["../../../../src/modules/plugins/compile/marketplace-compiler.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DiscoveredPlugin } from '../plugin-source.js';
|
|
2
|
+
import { type McpRegistry } from './registry.js';
|
|
3
|
+
/**
|
|
4
|
+
* THE DETACHABLE PART — a customer's plugin file format, read as-is:
|
|
5
|
+
*
|
|
6
|
+
* <pluginsRoot>/<scope…>/<plugin>/plugin.bundle.json
|
|
7
|
+
* {
|
|
8
|
+
* "name": "example-plugin", "version": "1.3.1", "description": "…",
|
|
9
|
+
* "mcpProfile": "global",
|
|
10
|
+
* "interface": { "displayName": "Example Plugin", "category": "…" },
|
|
11
|
+
* "sourceSkillRoots": [ "skills/departments/engineering/shared/<cluster>" ]
|
|
12
|
+
* }
|
|
13
|
+
*
|
|
14
|
+
* A bundle is a LIST OF SKILL PATHS plus a pointer into an MCP registry —
|
|
15
|
+
* which is exactly the native model's "a plugin links skills" with different
|
|
16
|
+
* field names. So the reader maps:
|
|
17
|
+
*
|
|
18
|
+
* sourceSkillRoots → linkedRoots (a root is a skill or a folder of skills)
|
|
19
|
+
* mcpProfile → mcpServers (expanded through the registry)
|
|
20
|
+
* name/version/desc → a synthesised manifest
|
|
21
|
+
* interface.displayName → the plugin's display name
|
|
22
|
+
*
|
|
23
|
+
* The walker (`kb-plugin-source.ts`) calls this for every folder holding a
|
|
24
|
+
* bundle file; this reads the file and decides nothing else. READ-ONLY by
|
|
25
|
+
* construction: nothing in this directory writes. A bundle's links are plain
|
|
26
|
+
* references (`linksAreManaged: false`): no principal grant is written or
|
|
27
|
+
* checked, the skills' own scopes decide readability.
|
|
28
|
+
*
|
|
29
|
+
* Deleting the dialect later = this directory, the one `else if` in the
|
|
30
|
+
* walker that calls it, and the walker's registry load.
|
|
31
|
+
*/
|
|
32
|
+
export declare const BUNDLE_FILE = "plugin.bundle.json";
|
|
33
|
+
export declare const DEFAULT_REGISTRY_PATH = "configs/mcp/registry.json";
|
|
34
|
+
/** The registry, when the repository has one; a missing file is null, a broken one warns. */
|
|
35
|
+
export declare function loadRegistry(kbRoot: string, warnings: string[]): Promise<McpRegistry | null>;
|
|
36
|
+
export declare function readBundlePlugin(dir: string, folder: string, relFolder: string, registry: McpRegistry | null, warnings: string[], unreadable: string[]): Promise<DiscoveredPlugin | null>;
|
|
37
|
+
//# sourceMappingURL=bundle.source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.source.d.ts","sourceRoot":"","sources":["../../../../../src/modules/plugins/discovery/bundle-dialect/bundle.source.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAEjE,6FAA6F;AAC7F,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAgBlG;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA0ElC"}
|