@bevel-software/platform-core-backend 0.25.2 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-guide/access-control.md +251 -0
- package/agent-guide/conventions.md +35 -0
- package/agent-guide/directory-structure.md +145 -0
- package/agent-guide/finding-things.md +7 -0
- package/agent-guide/html-views.md +83 -0
- package/agent-guide/introduction.md +27 -0
- package/agent-guide/new-knowledge-base.md +24 -0
- package/agent-guide/skills.md +47 -0
- package/agent-guide/tool-manuals.md +227 -0
- package/agent-guide/where-a-new-file-goes.md +36 -0
- package/dist/assets.d.ts +26 -0
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +35 -2
- package/dist/assets.js.map +1 -1
- package/dist/core/catalog-revision.d.ts +19 -1
- package/dist/core/catalog-revision.d.ts.map +1 -1
- package/dist/core/catalog-revision.js +14 -3
- package/dist/core/catalog-revision.js.map +1 -1
- package/dist/core/core-ports.d.ts +11 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +5 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +65 -3
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +35 -0
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +114 -12
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +16 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +18 -1
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +21 -0
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +22 -1
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +17 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +2 -0
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +27 -0
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.js +1 -1
- package/dist/modules/access/directory-sync-bot.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +145 -0
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -0
- package/dist/modules/agent-guide/agent-guide.js +199 -0
- package/dist/modules/agent-guide/agent-guide.js.map +1 -0
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +24 -0
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -0
- package/dist/modules/agent-guide/agent-guide.tools.js +100 -0
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +4 -0
- package/dist/modules/agent-guide/index.d.ts.map +1 -0
- package/dist/modules/agent-guide/index.js +4 -0
- package/dist/modules/agent-guide/index.js.map +1 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +3 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +3 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +14 -6
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +28 -8
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/index.d.ts +1 -1
- package/dist/modules/agent-instructions/index.d.ts.map +1 -1
- package/dist/modules/agent-instructions/index.js +1 -1
- package/dist/modules/agent-instructions/index.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +10 -50
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +51 -104
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/audit/agent-audit.service.d.ts +21 -2
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +43 -2
- package/dist/modules/audit/agent-audit.service.js.map +1 -1
- package/dist/modules/audit/agent-connection.routes.d.ts +34 -0
- package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -0
- package/dist/modules/audit/agent-connection.routes.js +38 -0
- package/dist/modules/audit/agent-connection.routes.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +24 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -1
- package/dist/modules/audit/audit.contract.js.map +1 -1
- package/dist/modules/audit/index.d.ts +1 -0
- package/dist/modules/audit/index.d.ts.map +1 -1
- package/dist/modules/audit/index.js +1 -0
- package/dist/modules/audit/index.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +10 -3
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.middleware.d.ts +7 -0
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +1 -1
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +11 -3
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +96 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +32 -3
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/embed/account-link.service.d.ts +42 -0
- package/dist/modules/embed/account-link.service.d.ts.map +1 -0
- package/dist/modules/embed/account-link.service.js +50 -0
- package/dist/modules/embed/account-link.service.js.map +1 -0
- package/dist/modules/embed/embed-link.d.ts +58 -0
- package/dist/modules/embed/embed-link.d.ts.map +1 -0
- package/dist/modules/embed/embed-link.js +160 -0
- package/dist/modules/embed/embed-link.js.map +1 -0
- package/dist/modules/embed/embed.errors.d.ts +30 -0
- package/dist/modules/embed/embed.errors.d.ts.map +1 -0
- package/dist/modules/embed/embed.errors.js +42 -0
- package/dist/modules/embed/embed.errors.js.map +1 -0
- package/dist/modules/embed/embed.interface.d.ts +204 -0
- package/dist/modules/embed/embed.interface.d.ts.map +1 -0
- package/dist/modules/embed/embed.interface.js +2 -0
- package/dist/modules/embed/embed.interface.js.map +1 -0
- package/dist/modules/embed/embed.routes.d.ts +59 -0
- package/dist/modules/embed/embed.routes.d.ts.map +1 -0
- package/dist/modules/embed/embed.routes.js +343 -0
- package/dist/modules/embed/embed.routes.js.map +1 -0
- package/dist/modules/embed/embed.service.d.ts +169 -0
- package/dist/modules/embed/embed.service.d.ts.map +1 -0
- package/dist/modules/embed/embed.service.js +627 -0
- package/dist/modules/embed/embed.service.js.map +1 -0
- package/dist/modules/embed/embed.tools.d.ts +51 -0
- package/dist/modules/embed/embed.tools.d.ts.map +1 -0
- package/dist/modules/embed/embed.tools.js +170 -0
- package/dist/modules/embed/embed.tools.js.map +1 -0
- package/dist/modules/embed/mcp-app.d.ts +64 -0
- package/dist/modules/embed/mcp-app.d.ts.map +1 -0
- package/dist/modules/embed/mcp-app.js +147 -0
- package/dist/modules/embed/mcp-app.js.map +1 -0
- package/dist/modules/embed/mcp-app.routes.d.ts +21 -0
- package/dist/modules/embed/mcp-app.routes.d.ts.map +1 -0
- package/dist/modules/embed/mcp-app.routes.js +36 -0
- package/dist/modules/embed/mcp-app.routes.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +15 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
- package/dist/modules/github-app/github-app.connection.js +34 -3
- package/dist/modules/github-app/github-app.connection.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts +65 -0
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +300 -0
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +5 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +6 -0
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +2 -1
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +57 -3
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +177 -24
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +32 -4
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/tool-schema-guard.d.ts +105 -0
- package/dist/modules/mcp/tool-schema-guard.d.ts.map +1 -0
- package/dist/modules/mcp/tool-schema-guard.js +171 -0
- package/dist/modules/mcp/tool-schema-guard.js.map +1 -0
- package/dist/modules/onboarding/onboarding.contract.d.ts +80 -0
- package/dist/modules/onboarding/onboarding.contract.d.ts.map +1 -0
- package/dist/modules/onboarding/onboarding.contract.js +7 -0
- package/dist/modules/onboarding/onboarding.contract.js.map +1 -0
- package/dist/modules/onboarding/onboarding.routes.d.ts +18 -0
- package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -0
- package/dist/modules/onboarding/onboarding.routes.js +81 -0
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -0
- package/dist/modules/onboarding/starter-pack.service.d.ts +213 -0
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -0
- package/dist/modules/onboarding/starter-pack.service.js +492 -0
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -0
- package/dist/modules/onboarding/starter-packs.d.ts +78 -0
- package/dist/modules/onboarding/starter-packs.d.ts.map +1 -0
- package/dist/modules/onboarding/starter-packs.js +156 -0
- package/dist/modules/onboarding/starter-packs.js.map +1 -0
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +19 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +18 -1
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +0 -36
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +31 -0
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.tools.d.ts +36 -2
- package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.tools.js +71 -14
- package/dist/modules/plugins/plugins.tools.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +34 -7
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +148 -54
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/repository-source.d.ts +1 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -1
- package/dist/modules/settings/repository-source.js +3 -3
- package/dist/modules/settings/repository-source.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +3 -6
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +103 -43
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts +10 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.js +11 -3
- package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +8 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +24 -2
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +59 -2
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +9 -4
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/index.d.ts +28 -1
- package/dist/modules/tool-helpers/index.d.ts.map +1 -1
- package/dist/modules/tool-helpers/index.js +28 -1
- package/dist/modules/tool-helpers/index.js.map +1 -1
- package/dist/modules/tool-helpers/route-argument-check.d.ts +10 -0
- package/dist/modules/tool-helpers/route-argument-check.d.ts.map +1 -0
- package/dist/modules/tool-helpers/route-argument-check.js +132 -0
- package/dist/modules/tool-helpers/route-argument-check.js.map +1 -0
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts +89 -0
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -0
- package/dist/modules/tool-helpers/route-tool-schemas.js +113 -0
- package/dist/modules/tool-helpers/route-tool-schemas.js.map +1 -0
- package/dist/modules/tool-helpers/tool-def.d.ts +71 -0
- package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +70 -6
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +46 -6
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +157 -8
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +9 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +23 -4
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +14 -0
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +7 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +77 -38
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.d.ts +20 -16
- package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
- package/dist/modules/tool-registry/description-length.js +50 -30
- package/dist/modules/tool-registry/description-length.js.map +1 -1
- package/dist/modules/tool-registry/guide-first.d.ts +27 -0
- package/dist/modules/tool-registry/guide-first.d.ts.map +1 -0
- package/dist/modules/tool-registry/guide-first.js +40 -0
- package/dist/modules/tool-registry/guide-first.js.map +1 -0
- package/dist/modules/tool-registry/tool-registry.d.ts +6 -0
- package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -1
- package/dist/modules/tool-registry/tool-registry.js +9 -2
- package/dist/modules/tool-registry/tool-registry.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +449 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js +481 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +126 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js +611 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +12 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js +5 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +8 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +133 -37
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +29 -5
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +62 -5
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +282 -14
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +627 -126
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/merge-commit.d.ts +73 -0
- package/dist/modules/workflow/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/workflow/git/merge-commit.js +89 -0
- package/dist/modules/workflow/git/merge-commit.js.map +1 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts +15 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +78 -6
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +94 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +332 -37
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +15 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +25 -1
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts +6 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.js +23 -6
- package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
- package/dist/modules/workflow/recovery-bot.js +1 -1
- package/dist/modules/workflow/recovery-bot.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +35 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +180 -13
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/sanitize-error.d.ts +16 -0
- package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
- package/dist/modules/workflow/sanitize-error.js +45 -0
- package/dist/modules/workflow/sanitize-error.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts +6 -2
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +7 -2
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +187 -15
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +808 -106
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-download.builder.d.ts +105 -0
- package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.builder.js +238 -0
- package/dist/modules/workspace/agent-download.builder.js.map +1 -0
- package/dist/modules/workspace/agent-download.routes.d.ts +77 -0
- package/dist/modules/workspace/agent-download.routes.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.routes.js +156 -0
- package/dist/modules/workspace/agent-download.routes.js.map +1 -0
- package/dist/modules/workspace/agent-download.store.d.ts +225 -0
- package/dist/modules/workspace/agent-download.store.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.store.js +423 -0
- package/dist/modules/workspace/agent-download.store.js.map +1 -0
- package/dist/modules/workspace/agent-upload.store.d.ts +10 -1
- package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
- package/dist/modules/workspace/agent-upload.store.js +16 -6
- package/dist/modules/workspace/agent-upload.store.js.map +1 -1
- package/dist/modules/workspace/file-readers/raw-mime.d.ts +6 -0
- package/dist/modules/workspace/file-readers/raw-mime.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/raw-mime.js +38 -0
- package/dist/modules/workspace/file-readers/raw-mime.js.map +1 -0
- package/dist/modules/workspace/file-readers/text-reader.d.ts +5 -5
- package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/text-reader.js +5 -8
- package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
- package/dist/modules/workspace/first-run.d.ts +111 -0
- package/dist/modules/workspace/first-run.d.ts.map +1 -0
- package/dist/modules/workspace/first-run.js +181 -0
- package/dist/modules/workspace/first-run.js.map +1 -0
- package/dist/modules/workspace/move-links.d.ts +92 -0
- package/dist/modules/workspace/move-links.d.ts.map +1 -0
- package/dist/modules/workspace/move-links.js +173 -0
- package/dist/modules/workspace/move-links.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 +24 -39
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +58 -52
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +209 -223
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +5 -3
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +5 -3
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +63 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +75 -2
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +197 -24
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +68 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +642 -71
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/write-access/write-access.d.ts.map +1 -1
- package/dist/modules/write-access/write-access.js +9 -0
- package/dist/modules/write-access/write-access.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +84 -1
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +100 -12
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +10 -1
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/hidden-tools.d.ts +44 -0
- package/dist/shared/hidden-tools.d.ts.map +1 -0
- package/dist/shared/hidden-tools.js +13 -0
- package/dist/shared/hidden-tools.js.map +1 -0
- package/dist/shared/utf8-text.d.ts +15 -0
- package/dist/shared/utf8-text.d.ts.map +1 -0
- package/dist/shared/utf8-text.js +20 -0
- package/dist/shared/utf8-text.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +2 -1
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
- package/dist/tenancy/static-tenant-source.js +9 -2
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/kb-template/.bevelignore +0 -5
- package/mcp-app/page.html +349 -0
- package/migrations/0017_atlassian_account_links.sql +37 -0
- package/migrations/meta/0017_snapshot.json +2396 -0
- package/migrations/meta/_journal.json +8 -1
- package/package.json +6 -3
- package/src/__tests__/kb-layout-config.test.ts +10 -100
- package/src/__tests__/packaged-assets-ship.test.ts +66 -0
- package/src/assets.ts +38 -2
- package/src/core/__tests__/catalog-revision.test.ts +40 -0
- package/src/core/__tests__/gated-boot.test.ts +1 -0
- package/src/core/__tests__/lifecycle.test.ts +14 -0
- package/src/core/catalog-revision.ts +15 -2
- package/src/core/core-ports.ts +11 -0
- package/src/core/create-core-server.ts +78 -3
- package/src/core/create-core-services.ts +168 -10
- package/src/core/lifecycle.ts +28 -2
- package/src/core-config.ts +24 -1
- package/src/index.ts +2 -2
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +58 -0
- package/src/modules/access/__tests__/access-control.platform-restore.test.ts +8 -7
- package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
- package/src/modules/access/__tests__/access-personal-plugin.test.ts +1 -18
- package/src/modules/access/access-control.interface.ts +28 -0
- package/src/modules/access/access-control.service.ts +37 -0
- package/src/modules/access/directory-sync-bot.ts +1 -1
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +386 -0
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +207 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +122 -0
- package/src/modules/agent-guide/agent-guide.ts +300 -0
- package/src/modules/agent-guide/index.ts +22 -0
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +39 -118
- package/src/modules/agent-instructions/agent-instructions.routes.ts +3 -2
- package/src/modules/agent-instructions/compose.ts +26 -8
- package/src/modules/agent-instructions/index.ts +0 -3
- package/src/modules/agent-instructions/shared-file-rules.ts +50 -112
- package/src/modules/audit/__tests__/agent-audit.service.test.ts +64 -4
- package/src/modules/audit/__tests__/agent-connection.routes.test.ts +102 -0
- package/src/modules/audit/agent-audit.service.ts +58 -3
- package/src/modules/audit/agent-connection.routes.ts +56 -0
- package/src/modules/audit/audit.contract.ts +26 -0
- package/src/modules/audit/index.ts +1 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +5 -3
- package/src/modules/auth/account.routes.ts +10 -3
- package/src/modules/auth/auth.middleware.ts +1 -1
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +18 -2
- package/src/modules/code-mode/code-mode.tool.ts +13 -2
- package/src/modules/database/core-schema.ts +33 -3
- package/src/modules/embed/__tests__/account-links.migration.test.ts +98 -0
- package/src/modules/embed/__tests__/embed-link.test.ts +122 -0
- package/src/modules/embed/__tests__/embed.routes.test.ts +362 -0
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +193 -0
- package/src/modules/embed/__tests__/embed.service.test.ts +805 -0
- package/src/modules/embed/__tests__/embed.tools.test.ts +304 -0
- package/src/modules/embed/__tests__/mcp-app.test.ts +207 -0
- package/src/modules/embed/account-link.service.ts +76 -0
- package/src/modules/embed/embed-link.ts +180 -0
- package/src/modules/embed/embed.errors.ts +43 -0
- package/src/modules/embed/embed.interface.ts +203 -0
- package/src/modules/embed/embed.routes.ts +363 -0
- package/src/modules/embed/embed.service.ts +705 -0
- package/src/modules/embed/embed.tools.ts +206 -0
- package/src/modules/embed/mcp-app.routes.ts +41 -0
- package/src/modules/embed/mcp-app.ts +173 -0
- package/src/modules/github-app/__tests__/github-app.test.ts +76 -0
- package/src/modules/github-app/github-app.connection.ts +38 -4
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +304 -0
- package/src/modules/kb-fs/locking-filesystem.ts +287 -0
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +35 -0
- package/src/modules/kb-sync/kb-sync.interface.ts +2 -0
- package/src/modules/kb-sync/kb-sync.service.ts +6 -0
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +68 -11
- package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +14 -3
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +37 -2
- package/src/modules/mcp/__tests__/mcp.app.e2e.test.ts +200 -0
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +252 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +42 -24
- package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
- package/src/modules/mcp/__tests__/tool-schema-guard.test.ts +266 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +218 -31
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
- package/src/modules/mcp/tool-schema-guard.ts +196 -0
- package/src/modules/onboarding/__tests__/onboarding.routes.test.ts +163 -0
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +635 -0
- package/src/modules/onboarding/__tests__/starter-packs.test.ts +169 -0
- package/src/modules/onboarding/onboarding.contract.ts +85 -0
- package/src/modules/onboarding/onboarding.routes.ts +85 -0
- package/src/modules/onboarding/starter-pack.service.ts +580 -0
- package/src/modules/onboarding/starter-packs.ts +182 -0
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +177 -4
- package/src/modules/plugins/index.ts +1 -0
- package/src/modules/plugins/plugin-provision.service.ts +22 -1
- package/src/modules/plugins/plugins.routes.ts +29 -0
- package/src/modules/plugins/plugins.tools.ts +75 -15
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +176 -56
- package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
- package/src/modules/settings/deployment-settings.service.ts +144 -55
- package/src/modules/settings/repository-source.ts +4 -4
- package/src/modules/settings/setup.routes.ts +3 -6
- package/src/modules/skills/__tests__/skills.tools.description.test.ts +95 -0
- package/src/modules/skills/skills.tools.ts +112 -46
- package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +32 -0
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +65 -0
- package/src/modules/tool-auth/connection-key-rejection.ts +13 -3
- package/src/modules/tool-auth/external-api-key.interface.ts +9 -0
- package/src/modules/tool-auth/external-api-key.service.ts +61 -4
- package/src/modules/tool-auth/tool-auth.middleware.ts +13 -4
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +502 -0
- package/src/modules/tool-helpers/__tests__/route-argument-check.test.ts +337 -0
- package/src/modules/tool-helpers/index.ts +34 -1
- package/src/modules/tool-helpers/route-argument-check.ts +149 -0
- package/src/modules/tool-helpers/route-tool-schemas.ts +171 -0
- package/src/modules/tool-helpers/tool-def.ts +132 -7
- package/src/modules/tool-helpers/tool-handler.ts +196 -8
- package/src/modules/tool-helpers/tool.contract.ts +9 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +57 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +73 -4
- package/src/modules/tool-manuals/tool-manuals.contract.ts +24 -4
- package/src/modules/tool-manuals/tool-manuals.service.ts +17 -0
- package/src/modules/tool-manuals/tool-manuals.tools.ts +86 -38
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +173 -0
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +81 -66
- package/src/modules/tool-registry/description-length.ts +57 -32
- package/src/modules/tool-registry/guide-first.ts +41 -0
- package/src/modules/tool-registry/tool-registry.ts +9 -2
- package/src/modules/workflow/__tests__/apply-failure.test.ts +6 -1
- package/src/modules/workflow/__tests__/file-lock.service.deletion-gate.test.ts +104 -0
- package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +66 -0
- package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +31 -2
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +110 -6
- package/src/modules/workflow/__tests__/sanitize-error.test.ts +89 -1
- package/src/modules/workflow/__tests__/workflow.routes.push-refused.test.ts +202 -0
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +6 -6
- package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +1026 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +468 -10
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +4 -0
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +54 -2
- package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +705 -0
- package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +1554 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +150 -4
- package/src/modules/workflow/agent-tools/change-request-read-shape.ts +712 -0
- package/src/modules/workflow/agent-tools/change-request-read.tools.ts +759 -0
- package/src/modules/workflow/agent-tools/change-request-summary.ts +5 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +137 -35
- package/src/modules/workflow/file-lock.service.ts +67 -5
- package/src/modules/workflow/git/__tests__/git.service.appliedChange.test.ts +285 -0
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -0
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +334 -0
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +48 -1
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +231 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +72 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +24 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +620 -1
- package/src/modules/workflow/git/git.service.ts +714 -133
- package/src/modules/workflow/git/merge-commit.ts +88 -0
- package/src/modules/workflow/git/node-git-runner.ts +82 -7
- package/src/modules/workflow/git/pull-request.service.ts +380 -54
- package/src/modules/workflow/pending-commits.service.ts +29 -1
- package/src/modules/workflow/pending-commits.worker.ts +24 -6
- package/src/modules/workflow/recovery-bot.ts +1 -1
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +7 -1
- package/src/modules/workflow/review-workflow/__tests__/merge-records-own-commit.test.ts +407 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +191 -12
- package/src/modules/workflow/sanitize-error.ts +50 -0
- package/src/modules/workflow/workflow.routes.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +886 -112
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +4 -3
- package/src/modules/workspace/__tests__/first-run.test.ts +234 -0
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +5 -2
- package/src/modules/workspace/__tests__/md-links.test.ts +353 -0
- package/src/modules/workspace/__tests__/move-links.test.ts +261 -0
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +219 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -0
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +102 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +52 -5
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +190 -0
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +21 -10
- package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +8 -4
- package/src/modules/workspace/__tests__/workspace.service.test.ts +50 -8
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +33 -55
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +44 -1
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +664 -34
- package/src/modules/workspace/agent-download.builder.ts +308 -0
- package/src/modules/workspace/agent-download.routes.ts +183 -0
- package/src/modules/workspace/agent-download.store.ts +533 -0
- package/src/modules/workspace/agent-upload.store.ts +23 -7
- package/src/modules/workspace/file-readers/raw-mime.ts +40 -0
- package/src/modules/workspace/file-readers/text-reader.ts +5 -8
- package/src/modules/workspace/first-run.ts +222 -0
- package/src/modules/workspace/move-links.ts +237 -0
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +191 -489
- package/src/modules/workspace/startup/steps/seed-tree.ts +23 -38
- package/src/modules/workspace/startup/steps/template-files.step.ts +217 -249
- package/src/modules/workspace/startup/steps/template-source.ts +5 -3
- package/src/modules/workspace/workspace.routes.ts +64 -22
- package/src/modules/workspace/workspace.service.ts +202 -25
- package/src/modules/workspace/workspace.tools.ts +707 -68
- package/src/modules/write-access/__tests__/write-access.test.ts +13 -0
- package/src/modules/write-access/write-access.ts +9 -0
- package/src/shared/domain-errors.ts +123 -11
- package/src/shared/git.contract.ts +8 -1
- package/src/shared/hidden-tools.ts +45 -0
- package/src/shared/utf8-text.ts +21 -0
- package/src/tenancy/__tests__/static-tenant-source.test.ts +1 -0
- package/src/tenancy/static-tenant-source.ts +10 -2
- package/starter-packs/README.md +103 -0
- package/starter-packs/engineering/KnowledgeBase/About us.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/Architecture.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/How we ship.md +9 -0
- package/starter-packs/engineering/Plugins/engineering-starter/LICENSE +21 -0
- package/starter-packs/engineering/Plugins/engineering-starter/SOURCE.md +20 -0
- package/starter-packs/engineering/Plugins/engineering-starter/access.md +19 -0
- package/starter-packs/engineering/Plugins/engineering-starter/plugin.json +10 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/SKILL.md +171 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2a-startup-diagnostic.md +157 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2b-builder-brainstorm.md +39 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-ceo-review/SKILL.md +144 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-eng-review/SKILL.md +144 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/review/SKILL.md +80 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/review/checklist.md +184 -0
- package/starter-packs/engineering/pack.yaml +11 -0
- package/starter-packs/general/KnowledgeBase/About us.md +9 -0
- package/starter-packs/general/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/general/KnowledgeBase/How we work.md +9 -0
- package/starter-packs/general/Plugins/general-starter/LICENSE +202 -0
- package/starter-packs/general/Plugins/general-starter/SOURCE.md +10 -0
- package/starter-packs/general/Plugins/general-starter/access.md +19 -0
- package/starter-packs/general/Plugins/general-starter/plugin.json +10 -0
- package/starter-packs/general/Plugins/general-starter/skills/memory-management/SKILL.md +332 -0
- package/starter-packs/general/Plugins/general-starter/skills/productivity-start/SKILL.md +163 -0
- package/starter-packs/general/Plugins/general-starter/skills/productivity-update/SKILL.md +167 -0
- package/starter-packs/general/Plugins/general-starter/skills/task-management/SKILL.md +83 -0
- package/starter-packs/general/pack.yaml +10 -0
- package/starter-packs/operations/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/operations/KnowledgeBase/How we work.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Processes.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Tools we use.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Vendors.md +9 -0
- package/starter-packs/operations/Plugins/operations-starter/LICENSE +202 -0
- package/starter-packs/operations/Plugins/operations-starter/SOURCE.md +10 -0
- package/starter-packs/operations/Plugins/operations-starter/access.md +19 -0
- package/starter-packs/operations/Plugins/operations-starter/plugin.json +10 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/capacity-plan/SKILL.md +111 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/change-request/SKILL.md +119 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/compliance-tracking/SKILL.md +44 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/process-doc/SKILL.md +80 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/process-optimization/SKILL.md +39 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/risk-assessment/SKILL.md +40 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/runbook/SKILL.md +85 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/status-report/SKILL.md +75 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/vendor-review/SKILL.md +102 -0
- package/starter-packs/operations/pack.yaml +12 -0
- package/starter-packs/sales/KnowledgeBase/About us.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Customers.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/sales/KnowledgeBase/How we sell.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Objections.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Pricing.md +9 -0
- package/starter-packs/sales/Plugins/sales-starter/LICENSE +202 -0
- package/starter-packs/sales/Plugins/sales-starter/SOURCE.md +10 -0
- package/starter-packs/sales/Plugins/sales-starter/access.md +19 -0
- package/starter-packs/sales/Plugins/sales-starter/plugin.json +10 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-context/SKILL.md +94 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-plan/SKILL.md +95 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-research/SKILL.md +99 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-tiering/SKILL.md +101 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/call-prep/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/call-summary/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/close-plan/SKILL.md +106 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/competitive-intelligence/SKILL.md +102 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/create-an-asset/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/crm-hygiene-check/SKILL.md +103 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/customer-health/SKILL.md +108 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/customer-voice/SKILL.md +94 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/daily-briefing/SKILL.md +61 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-advance-gap/SKILL.md +102 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-review/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-signals/SKILL.md +96 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-slip-scenario/SKILL.md +104 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/draft-outreach/SKILL.md +116 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/end-of-day/SKILL.md +114 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/expansion-whitespace/SKILL.md +97 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/forecast/SKILL.md +100 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/handle-objection/SKILL.md +93 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/inbox-sweep/SKILL.md +114 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/lead-triage/SKILL.md +106 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/log-activity/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/pipeline-review/SKILL.md +97 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/renewal-radar/SKILL.md +95 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/rep-context/SKILL.md +90 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/route-lead/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/sales-setup/SKILL.md +200 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/schedule-meeting/SKILL.md +99 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/stakeholder-map/SKILL.md +107 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/team-pipeline/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/update-opportunity/SKILL.md +112 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/weekly-wrap/SKILL.md +90 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/win-loss-review/SKILL.md +88 -0
- package/starter-packs/sales/pack.yaml +13 -0
- package/starter-packs/support/KnowledgeBase/Escalations.md +9 -0
- package/starter-packs/support/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/support/KnowledgeBase/Known issues.md +9 -0
- package/starter-packs/support/KnowledgeBase/Products.md +9 -0
- package/starter-packs/support/KnowledgeBase/Tone of voice.md +9 -0
- package/starter-packs/support/Plugins/support-starter/LICENSE +202 -0
- package/starter-packs/support/Plugins/support-starter/SOURCE.md +10 -0
- package/starter-packs/support/Plugins/support-starter/access.md +19 -0
- package/starter-packs/support/Plugins/support-starter/plugin.json +10 -0
- package/starter-packs/support/Plugins/support-starter/skills/customer-escalation/SKILL.md +246 -0
- package/starter-packs/support/Plugins/support-starter/skills/customer-research/SKILL.md +250 -0
- package/starter-packs/support/Plugins/support-starter/skills/draft-response/SKILL.md +416 -0
- package/starter-packs/support/Plugins/support-starter/skills/kb-article/SKILL.md +350 -0
- package/starter-packs/support/Plugins/support-starter/skills/ticket-triage/SKILL.md +273 -0
- package/starter-packs/support/pack.yaml +12 -0
- package/kb-template/AGENTS.md +0 -730
|
@@ -7,7 +7,6 @@ import os from 'node:os';
|
|
|
7
7
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
8
8
|
import { AccessControlService } from '../access-control.service.js';
|
|
9
9
|
import { personalAccessMd, pluginAccessMd } from '../../plugins/plugin-provision.service.js';
|
|
10
|
-
import { defaultKbTemplateDir } from '../../../assets.js';
|
|
11
10
|
import { closePersonalSpaceRules } from '../../workspace/startup/steps/personal-spaces.step.js';
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -17,10 +16,7 @@ import { closePersonalSpaceRules } from '../../workspace/startup/steps/personal-
|
|
|
17
16
|
* - a personal space must stay private even after an administrator opens
|
|
18
17
|
* the repository root with `read: everyone` (the usual way to let a new
|
|
19
18
|
* joiner read anything), while its owner keeps reading it — and Admin,
|
|
20
|
-
* who reads everything else, does not
|
|
21
|
-
* - the managed AGENTS.md must be readable by every signed-in person even
|
|
22
|
-
* when the root grants read to nobody, because agents are told to read
|
|
23
|
-
* it before their first action.
|
|
19
|
+
* who reads everything else, does not.
|
|
24
20
|
*/
|
|
25
21
|
|
|
26
22
|
const KB_DIR = 'knowledge-base';
|
|
@@ -137,17 +133,4 @@ describe('the seeded access templates, resolved', () => {
|
|
|
137
133
|
expect(await svc.canRead(workspaceId, 'admin@x.io', skill)).toBe(false);
|
|
138
134
|
});
|
|
139
135
|
|
|
140
|
-
it('the packaged AGENTS.md is readable by a non-admin even when the root grants read to nobody', async () => {
|
|
141
|
-
const template = await fs.readFile(path.join(defaultKbTemplateDir(), 'AGENTS.md'), 'utf8');
|
|
142
|
-
const svc = await makeService({
|
|
143
|
-
'roles.yaml': ROLES_YAML,
|
|
144
|
-
'access.md': '---\nowner:\n - Admin\n---\nwrite:\n - Admin\n',
|
|
145
|
-
'AGENTS.md': template,
|
|
146
|
-
'KnowledgeBase/Notes.md': '# Notes\n',
|
|
147
|
-
});
|
|
148
|
-
const bob = await svc.canReadBatch(workspaceId, 'bob@x.io', ['AGENTS.md', 'KnowledgeBase/Notes.md']);
|
|
149
|
-
expect(bob.get('AGENTS.md')).toBe(true);
|
|
150
|
-
// The grant is the FILE's own, not a widening of the root.
|
|
151
|
-
expect(bob.get('KnowledgeBase/Notes.md')).toBe(false);
|
|
152
|
-
});
|
|
153
136
|
});
|
|
@@ -263,6 +263,19 @@ export interface IAccessControl {
|
|
|
263
263
|
relativePath: string,
|
|
264
264
|
): Promise<boolean>;
|
|
265
265
|
|
|
266
|
+
/**
|
|
267
|
+
* Batched `canDownload` — one config load per call, the same resolution
|
|
268
|
+
* as the single form, each path's own frontmatter `download:` rules
|
|
269
|
+
* included. A folder download judges every file it would pack through
|
|
270
|
+
* this, so a folder of a thousand files costs one model load, not a
|
|
271
|
+
* thousand.
|
|
272
|
+
*/
|
|
273
|
+
canDownloadBatch(
|
|
274
|
+
workspaceId: string,
|
|
275
|
+
userEmail: string,
|
|
276
|
+
relativePaths: string[],
|
|
277
|
+
): Promise<Map<string, boolean>>;
|
|
278
|
+
|
|
266
279
|
/**
|
|
267
280
|
* True iff `userEmail` is an `owner` of `relativePath` per the current
|
|
268
281
|
* access tree, resolved from the `owner:` lists alone (the `write` /
|
|
@@ -631,6 +644,21 @@ export interface IAccessControl {
|
|
|
631
644
|
relativePaths: string[],
|
|
632
645
|
): Promise<Map<string, boolean> | null>;
|
|
633
646
|
|
|
647
|
+
/**
|
|
648
|
+
* Batched variant of `canReadAtRef`, with the same null-semantics (the whole
|
|
649
|
+
* call returns null when the ref or its `roles.yaml` can't be resolved, and
|
|
650
|
+
* the caller must read that as deny). One access-tree load and one
|
|
651
|
+
* `git cat-file --batch` for the path set, the way `canWriteBatchAtRef`
|
|
652
|
+
* does it — a change request with forty files would otherwise cost forty
|
|
653
|
+
* single-path lookups to decide which of them its reader may see.
|
|
654
|
+
*/
|
|
655
|
+
canReadBatchAtRef(
|
|
656
|
+
workspaceId: string,
|
|
657
|
+
ref: string,
|
|
658
|
+
userEmail: string,
|
|
659
|
+
relativePaths: string[],
|
|
660
|
+
): Promise<Map<string, boolean> | null>;
|
|
661
|
+
|
|
634
662
|
/**
|
|
635
663
|
* The set of principals with `write` on this path as of `ref`. Used by PR
|
|
636
664
|
* reviewer routing and the per-file approval UI rendered against the PR
|
|
@@ -1581,6 +1581,22 @@ export class AccessControlService implements IAccessControl {
|
|
|
1581
1581
|
return hasPermissionResolved(model, 'download', userEmail, relativePath, own);
|
|
1582
1582
|
}
|
|
1583
1583
|
|
|
1584
|
+
async canDownloadBatch(
|
|
1585
|
+
workspaceId: string,
|
|
1586
|
+
userEmail: string,
|
|
1587
|
+
relativePaths: string[],
|
|
1588
|
+
): Promise<Map<string, boolean>> {
|
|
1589
|
+
const model = await this.loadModel(workspaceId);
|
|
1590
|
+
const repoDir = await this.repoDir(workspaceId);
|
|
1591
|
+
// Parallel own-entries reads, memoized — same shape as `canWriteBatch`.
|
|
1592
|
+
const owns = await Promise.all(relativePaths.map((p) => this.cachedOwnEntries(workspaceId, repoDir, p)));
|
|
1593
|
+
const result = new Map<string, boolean>();
|
|
1594
|
+
relativePaths.forEach((p, i) => {
|
|
1595
|
+
result.set(p, hasPermissionResolved(model, 'download', userEmail, p, owns[i]));
|
|
1596
|
+
});
|
|
1597
|
+
return result;
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1584
1600
|
async canOwnerBatch(
|
|
1585
1601
|
workspaceId: string,
|
|
1586
1602
|
userEmail: string,
|
|
@@ -2103,6 +2119,27 @@ export class AccessControlService implements IAccessControl {
|
|
|
2103
2119
|
return result;
|
|
2104
2120
|
}
|
|
2105
2121
|
|
|
2122
|
+
async canReadBatchAtRef(
|
|
2123
|
+
workspaceId: string,
|
|
2124
|
+
ref: string,
|
|
2125
|
+
userEmail: string,
|
|
2126
|
+
relativePaths: string[],
|
|
2127
|
+
): Promise<Map<string, boolean> | null> {
|
|
2128
|
+
// No shortcut for an empty path set: the null-semantics are the contract,
|
|
2129
|
+
// so an unresolvable ref must answer null however many paths were asked
|
|
2130
|
+
// about. Returning an empty map early would tell a caller the ref resolved.
|
|
2131
|
+
const loaded = await this.loadModelAtRef(workspaceId, ref);
|
|
2132
|
+
if (!loaded) return null;
|
|
2133
|
+
const repoDir = await this.repoDir(workspaceId);
|
|
2134
|
+
// One `git cat-file --batch` for the whole set — see canWriteBatchAtRef.
|
|
2135
|
+
const owns = await this.readOwnEntriesAtRefBatch(repoDir, loaded.resolvedRef, relativePaths);
|
|
2136
|
+
const result = new Map<string, boolean>();
|
|
2137
|
+
for (const p of relativePaths) {
|
|
2138
|
+
result.set(p, canReadResolved(loaded.model, userEmail, p, owns.get(p) ?? null));
|
|
2139
|
+
}
|
|
2140
|
+
return result;
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2106
2143
|
async eligibleWritersAtRef(
|
|
2107
2144
|
workspaceId: string,
|
|
2108
2145
|
ref: string,
|
|
@@ -35,7 +35,7 @@ export async function ensureDirectorySyncBot(db: Database): Promise<AuthUser> {
|
|
|
35
35
|
.returning();
|
|
36
36
|
if (inserted.length > 0) {
|
|
37
37
|
const row = inserted[0];
|
|
38
|
-
log.info(`created sync-bot user id=${row.id}
|
|
38
|
+
log.info(`created sync-bot user id=${row.id}`);
|
|
39
39
|
return { id: row.id, email: row.email, name: row.name, avatarUrl: row.avatarUrl ?? undefined };
|
|
40
40
|
}
|
|
41
41
|
const [row] = await db
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { mergeGroupsIntoRoles, parseRolesYaml } from '../../access-model/access-grammar.js';
|
|
4
|
+
import { sharedFileRulesSection } from '../../agent-instructions/shared-file-rules.js';
|
|
5
|
+
import {
|
|
6
|
+
CORE_SECTION_IDS,
|
|
7
|
+
PLATFORM_GUIDE_SEPARATOR,
|
|
8
|
+
WORKING_WITH_FILES_SECTION_ID,
|
|
9
|
+
agentGuideSections,
|
|
10
|
+
composeAgentGuide,
|
|
11
|
+
coreAgentGuideSections,
|
|
12
|
+
isAgentGuidePath,
|
|
13
|
+
isManagedGuide,
|
|
14
|
+
joinGuideSections,
|
|
15
|
+
withPlatformGuideAppended,
|
|
16
|
+
type AgentGuideSection,
|
|
17
|
+
} from '../agent-guide.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The guide is text the code owns, composed from sections when an agent asks
|
|
21
|
+
* for it. What is pinned here: that every section is there and in order, that
|
|
22
|
+
* the layout's names are rendered into it, that a distribution's hook shapes
|
|
23
|
+
* it, and what the guide says on the points agents have actually got wrong.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/** The section of `guide` whose heading line starts with `heading`, up to the next heading of the same or a higher level. */
|
|
27
|
+
function section(guide: string, heading: string): string {
|
|
28
|
+
const lines = guide.split('\n');
|
|
29
|
+
const at = lines.findIndex((line) => line.startsWith(heading));
|
|
30
|
+
expect(at, `the guide has no "${heading}" section`).toBeGreaterThan(-1);
|
|
31
|
+
const level = /^#+/.exec(heading)![0].length;
|
|
32
|
+
const body: string[] = [];
|
|
33
|
+
for (const line of lines.slice(at + 1)) {
|
|
34
|
+
if (new RegExp(`^#{1,${level}} `).test(line)) break;
|
|
35
|
+
body.push(line);
|
|
36
|
+
}
|
|
37
|
+
return body.join('\n');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
describe('the guide is composed from the platform\'s sections', () => {
|
|
41
|
+
it('carries every core section, in order, the shared rules computed in their place', async () => {
|
|
42
|
+
const sections = await coreAgentGuideSections(DEFAULT_KB_LAYOUT);
|
|
43
|
+
expect(sections.map((s) => s.id)).toEqual(CORE_SECTION_IDS);
|
|
44
|
+
const rules = sections.find((s) => s.id === WORKING_WITH_FILES_SECTION_ID)!;
|
|
45
|
+
expect(rules.body).toBe(sharedFileRulesSection(DEFAULT_KB_LAYOUT));
|
|
46
|
+
expect(rules.literal).toBe(true);
|
|
47
|
+
// Every file section begins with its heading, so the guide reads as one document.
|
|
48
|
+
for (const s of sections) {
|
|
49
|
+
if (s.id === 'introduction') expect(s.body.startsWith('# Knowledge base')).toBe(true);
|
|
50
|
+
else expect(s.body.startsWith('## '), s.id).toBe(true);
|
|
51
|
+
}
|
|
52
|
+
// The order of the composed guide is the order of the sections — pinned
|
|
53
|
+
// exactly above by the id list, and by the join test below, which equates
|
|
54
|
+
// the composed guide with the sections joined.
|
|
55
|
+
const guide = await composeAgentGuide(DEFAULT_KB_LAYOUT);
|
|
56
|
+
expect(guide.endsWith('\n')).toBe(true);
|
|
57
|
+
expect(guide.endsWith('\n\n')).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('renders the deployment\'s own root names and leaves no placeholder behind', async () => {
|
|
61
|
+
const guide = await composeAgentGuide({ knowledgeBaseDir: 'Docs', skillsDir: 'Abilities', pluginsDir: 'Extensions' });
|
|
62
|
+
expect(guide).toContain('Extensions/<Plugin>/plugin.json');
|
|
63
|
+
expect(guide).toContain('`Docs/`');
|
|
64
|
+
expect(guide).toContain('`Abilities/`');
|
|
65
|
+
expect(guide).not.toContain('{{');
|
|
66
|
+
expect(guide).not.toContain('KnowledgeBase/');
|
|
67
|
+
// The shared rules are rendered once, by the code that builds them, and
|
|
68
|
+
// never passed through the renderer again: a folder literally named like a
|
|
69
|
+
// placeholder comes out as the folder it is.
|
|
70
|
+
const odd = await composeAgentGuide({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: '{{skillsDir}}', skillsDir: 'Playbooks' });
|
|
71
|
+
expect(odd).toContain(sharedFileRulesSection({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: '{{skillsDir}}', skillsDir: 'Playbooks' }));
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('says it is served, not written, and names the one file it is read as', async () => {
|
|
75
|
+
const intro = section(await composeAgentGuide(DEFAULT_KB_LAYOUT), '# Knowledge base').replace(/\n> ?/g, ' ');
|
|
76
|
+
expect(intro).toContain('**This guide is served by the platform.**');
|
|
77
|
+
expect(intro).toContain('`get_agent_guide` returns it, whole or one section at a time');
|
|
78
|
+
expect(intro).toContain('`read_file` on `AGENTS.md` at the repository root');
|
|
79
|
+
expect(intro).toContain('`grep` searches it there too');
|
|
80
|
+
expect(intro).toContain('never write this text into it');
|
|
81
|
+
// The old header, which proved a file on disk was the platform's, is gone
|
|
82
|
+
// from the served text — or every read would look like a stale copy.
|
|
83
|
+
expect(isManagedGuide(await composeAgentGuide(DEFAULT_KB_LAYOUT))).toBe(false);
|
|
84
|
+
// One name on every deployment: a name saved for the written guide changes nothing.
|
|
85
|
+
const stale = await composeAgentGuide({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
|
|
86
|
+
expect(stale).not.toContain('HEXIS.md');
|
|
87
|
+
expect(stale).toBe(await composeAgentGuide(DEFAULT_KB_LAYOUT));
|
|
88
|
+
// And points at the preamble first, before the platform mechanics.
|
|
89
|
+
const guide = await composeAgentGuide(DEFAULT_KB_LAYOUT);
|
|
90
|
+
expect(guide.indexOf('mcp-description.md')).toBeLessThan(guide.indexOf('## Directory Structure'));
|
|
91
|
+
// One line ending throughout, whatever the checkout wrote the files with.
|
|
92
|
+
expect(guide).not.toContain('\r');
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('serves the guide as sections with titles, the whole being the sections joined', async () => {
|
|
96
|
+
const sections = await agentGuideSections(DEFAULT_KB_LAYOUT);
|
|
97
|
+
expect(sections.map((s) => s.id)).toEqual(CORE_SECTION_IDS);
|
|
98
|
+
expect(sections.find((s) => s.id === 'introduction')!.title).toBe('Knowledge base');
|
|
99
|
+
expect(sections.find((s) => s.id === 'where-a-new-file-goes')!.title).toBe('Where a new file goes');
|
|
100
|
+
expect(sections.find((s) => s.id === 'skills')!.title).toContain('Skills (`Skills/');
|
|
101
|
+
expect(joinGuideSections(sections)).toBe(await composeAgentGuide(DEFAULT_KB_LAYOUT));
|
|
102
|
+
// A heading closed with its own run of `#` is titled without it, and a
|
|
103
|
+
// section that opens with no heading is titled by its id.
|
|
104
|
+
const added = await agentGuideSections(DEFAULT_KB_LAYOUT, (all) => [
|
|
105
|
+
...all,
|
|
106
|
+
{ id: 'custom', body: '## Custom ##\n\nX.\n' },
|
|
107
|
+
{ id: 'bare', body: 'No heading here.\n' },
|
|
108
|
+
]);
|
|
109
|
+
expect(added.find((s) => s.id === 'custom')!.title).toBe('Custom');
|
|
110
|
+
expect(added.find((s) => s.id === 'bare')!.title).toBe('bare');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* A distribution's hook sees the sections and returns the sections. The
|
|
115
|
+
* three things it can do — append, replace by id, drop — each with its
|
|
116
|
+
* placeholders rendered like core's own, and the computed section left as
|
|
117
|
+
* it was built.
|
|
118
|
+
*/
|
|
119
|
+
it('lets a distribution append, replace and drop sections by id, rendering its text like core\'s', async () => {
|
|
120
|
+
const hook = (sections: readonly AgentGuideSection[]) => [
|
|
121
|
+
...sections
|
|
122
|
+
.filter((s) => s.id !== 'conventions')
|
|
123
|
+
.map((s) => (s.id === 'finding-things' ? { ...s, body: '## Finding things\n\nAsk the graph.\n' } : s)),
|
|
124
|
+
{ id: 'knowledge-graph', body: '## Knowledge graph\n\nNodes live under `{{knowledgeBaseDir}}/<Ontology>/Knowledge/`.\n' },
|
|
125
|
+
];
|
|
126
|
+
const guide = await composeAgentGuide({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: 'Docs' }, hook);
|
|
127
|
+
expect(guide).not.toContain('## Conventions');
|
|
128
|
+
expect(section(guide, '## Finding things')).toContain('Ask the graph.');
|
|
129
|
+
expect(section(guide, '## Finding things')).not.toContain('grep');
|
|
130
|
+
expect(guide.trimEnd().endsWith('Nodes live under `Docs/<Ontology>/Knowledge/`.')).toBe(true);
|
|
131
|
+
expect(guide).toContain(sharedFileRulesSection({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: 'Docs' }));
|
|
132
|
+
// An async hook is awaited, and the layout it is handed is the resolved one.
|
|
133
|
+
const seen: string[] = [];
|
|
134
|
+
await composeAgentGuide({ knowledgeBaseDir: ' Docs ', skillsDir: 'Skills', pluginsDir: 'Plugins' }, async (sections, layout) => {
|
|
135
|
+
seen.push(layout.knowledgeBaseDir, layout.agentsFile);
|
|
136
|
+
return sections;
|
|
137
|
+
});
|
|
138
|
+
expect(seen).toEqual(['Docs', 'AGENTS.md']);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('refuses a hook that drops or empties the shared file rules, which every file tool points at', async () => {
|
|
142
|
+
await expect(
|
|
143
|
+
composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) => sections.filter((s) => s.id !== WORKING_WITH_FILES_SECTION_ID)),
|
|
144
|
+
).rejects.toThrow(/dropped the "working-with-files" section/);
|
|
145
|
+
// Handing it back with nothing in it is the same loss: judged on the
|
|
146
|
+
// text that would be served, so whitespace counts as nothing.
|
|
147
|
+
for (const body of ['', ' \n\n']) {
|
|
148
|
+
await expect(
|
|
149
|
+
composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) =>
|
|
150
|
+
sections.map((s) => (s.id === WORKING_WITH_FILES_SECTION_ID ? { id: s.id, body } : s)),
|
|
151
|
+
),
|
|
152
|
+
).rejects.toThrow(/emptied the "working-with-files" section/);
|
|
153
|
+
}
|
|
154
|
+
// The id twice, one empty and one with the rules: judged over every
|
|
155
|
+
// section under the id, so the one with text satisfies it.
|
|
156
|
+
const twice = await composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) => [
|
|
157
|
+
{ id: WORKING_WITH_FILES_SECTION_ID, body: '' },
|
|
158
|
+
...sections,
|
|
159
|
+
]);
|
|
160
|
+
expect(twice).toContain(sharedFileRulesSection(DEFAULT_KB_LAYOUT));
|
|
161
|
+
// Replacing it under the same id is the hook's right.
|
|
162
|
+
const replaced = await composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) =>
|
|
163
|
+
sections.map((s) => (s.id === WORKING_WITH_FILES_SECTION_ID ? { id: s.id, body: '## Working with files\n\nOurs.\n' } : s)),
|
|
164
|
+
);
|
|
165
|
+
expect(section(replaced, '## Working with files')).toContain('Ours.');
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('names the checkout folder this deployment uses, so the paths it shows are the paths the tools take', async () => {
|
|
169
|
+
const guide = await composeAgentGuide(DEFAULT_KB_LAYOUT, undefined, { kbDirName: 'repo' });
|
|
170
|
+
expect(guide).toContain('repository as the `repo/` folder');
|
|
171
|
+
expect(guide).toContain('`repo/KnowledgeBase/Foo.md`');
|
|
172
|
+
expect(guide).not.toContain('knowledge-base/');
|
|
173
|
+
expect(guide).not.toContain('{{kbDirName}}');
|
|
174
|
+
// Core's own default when none is given.
|
|
175
|
+
expect(await composeAgentGuide(DEFAULT_KB_LAYOUT)).toContain('`knowledge-base/KnowledgeBase/Foo.md`');
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('puts the knowledge base\'s own file first, then a separator, then the guide — and nothing before the guide when the file is empty', () => {
|
|
179
|
+
const joined = withPlatformGuideAppended('# Acme\r\n\r\nWrite tickets in the present tense.\r\n\r\n', 'THE GUIDE\n');
|
|
180
|
+
expect(joined).toBe(`# Acme\n\nWrite tickets in the present tense.\n\n${PLATFORM_GUIDE_SEPARATOR}\n\nTHE GUIDE\n`);
|
|
181
|
+
expect(PLATFORM_GUIDE_SEPARATOR.startsWith('---\n')).toBe(true);
|
|
182
|
+
// A file with nothing in it has nothing to put first.
|
|
183
|
+
expect(withPlatformGuideAppended('', 'THE GUIDE\n')).toBe('THE GUIDE\n');
|
|
184
|
+
expect(withPlatformGuideAppended('\n\n', 'THE GUIDE\n')).toBe('THE GUIDE\n');
|
|
185
|
+
// Their whitespace is markdown and stays: indentation is code, two
|
|
186
|
+
// trailing spaces are a hard break.
|
|
187
|
+
expect(withPlatformGuideAppended(' code\nline \nnext\n', 'THE GUIDE\n')).toBe(
|
|
188
|
+
` code\nline \nnext\n\n${PLATFORM_GUIDE_SEPARATOR}\n\nTHE GUIDE\n`,
|
|
189
|
+
);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('answers at AGENTS.md in the repository root, and nowhere else', () => {
|
|
193
|
+
expect(isAgentGuidePath('AGENTS.md')).toBe(true);
|
|
194
|
+
expect(isAgentGuidePath('/AGENTS.md')).toBe(true);
|
|
195
|
+
expect(isAgentGuidePath('Handbook/AGENTS.md')).toBe(false);
|
|
196
|
+
expect(isAgentGuidePath('agents.md')).toBe(false);
|
|
197
|
+
expect(isAgentGuidePath('HEXIS.md')).toBe(false);
|
|
198
|
+
expect(isAgentGuidePath('')).toBe(false);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('recognises a copy an earlier release wrote to disk by its header line, and nothing else', () => {
|
|
202
|
+
// The header as every release wrote it: a blockquote under the title.
|
|
203
|
+
expect(isManagedGuide('# Knowledge base\n\n> **This file is managed by the platform.** It lives at…\n')).toBe(true);
|
|
204
|
+
expect(isManagedGuide('# Company Knowledge graph\n\nThis is a git-backed knowledge graph.\n\n> **This file is managed by the platform.** Every server restart\n> replaces it.\n')).toBe(true);
|
|
205
|
+
expect(isManagedGuide('# Acme conventions\n\nThis file is managed by us.\n')).toBe(false);
|
|
206
|
+
// The organisation's own note that QUOTES the platform's sentence in its
|
|
207
|
+
// body is theirs: the sentence is not in a header blockquote near the top.
|
|
208
|
+
expect(isManagedGuide('# On the old guide\n\nThe platform used to write a file that opened with **This file is managed by the platform.** and refreshed it.\n')).toBe(false);
|
|
209
|
+
const deep = `# Notes\n${'\n'.repeat(20)}> **This file is managed by the platform.** (quoted from the old guide)\n`;
|
|
210
|
+
expect(isManagedGuide(deep)).toBe(false);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* What the guide says on the points agents have got wrong. Pinned on the
|
|
216
|
+
* served text, so a section that is dropped or rewritten fails here rather
|
|
217
|
+
* than in a deployment.
|
|
218
|
+
*/
|
|
219
|
+
describe('what the guide tells an agent', () => {
|
|
220
|
+
/**
|
|
221
|
+
* The placement rule. A tester's agent filed a ticket into a plugin folder
|
|
222
|
+
* and explained itself: it had found no convention saying where tickets go,
|
|
223
|
+
* and Plugins was where it already held write rights.
|
|
224
|
+
*/
|
|
225
|
+
it('says where a new file goes, named for the deployment\'s roots', async () => {
|
|
226
|
+
const guide = await composeAgentGuide({ knowledgeBaseDir: 'Docs', skillsDir: 'Abilities', pluginsDir: 'Extensions' });
|
|
227
|
+
const placement = section(guide, '## Where a new file goes');
|
|
228
|
+
expect(placement).toContain('`Docs/`');
|
|
229
|
+
expect(placement).toContain('`Abilities/`');
|
|
230
|
+
expect(placement).toContain('Extensions/<Plugin>/skills/<skill>/SKILL.md');
|
|
231
|
+
expect(placement).toContain('Extensions/<Plugin>/software.bevel.hexis/tools/');
|
|
232
|
+
for (const kind of ['notes', 'reports', 'tickets', 'mcp.json', 'plugin.json']) {
|
|
233
|
+
expect(placement, kind).toContain(kind);
|
|
234
|
+
}
|
|
235
|
+
expect(placement).toMatch(/never holds a document/);
|
|
236
|
+
expect(placement).toMatch(/\bask\b/);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* The personal plugin, where the placement rule was being read backwards.
|
|
241
|
+
* Nothing under the plugins root is in the knowledge graph, and a personal
|
|
242
|
+
* plugin is readable only by its owner — so a note filed there is never found
|
|
243
|
+
* as knowledge again, by anyone. Agents asked to "save this for me" were
|
|
244
|
+
* taking "a personal space" as the place to put it.
|
|
245
|
+
*/
|
|
246
|
+
it('says a personal plugin holds only skills and tools, and what to do when a user wants a note private', async () => {
|
|
247
|
+
const guide = await composeAgentGuide({ knowledgeBaseDir: 'Docs', skillsDir: 'Abilities', pluginsDir: 'Extensions' });
|
|
248
|
+
const placement = section(guide, '## Where a new file goes').replace(/\s+/g, ' ');
|
|
249
|
+
expect(placement).toContain("A personal plugin holds only its owner's skills and tools");
|
|
250
|
+
expect(placement).toContain('Extensions/personal-<id>/');
|
|
251
|
+
// A skill's own bundled files are part of the skill and stay welcome, so the
|
|
252
|
+
// rule does not deter an agent from writing a COMPLETE skill.
|
|
253
|
+
expect(placement).toContain("each skill's own bundled files");
|
|
254
|
+
expect(placement).toContain("inside that skill's folder included");
|
|
255
|
+
expect(placement).toContain('never a note or any other document');
|
|
256
|
+
// A private request gets a question and the restrictable folder, in the
|
|
257
|
+
// deployment's own root name.
|
|
258
|
+
expect(placement).toContain('ask where under `Docs/` it should go');
|
|
259
|
+
expect(placement).toContain('restricted so only they can read it');
|
|
260
|
+
// And when the user insists, the agent declines, says why, and offers again.
|
|
261
|
+
expect(placement).toContain('If they insist on the personal plugin, decline');
|
|
262
|
+
expect(placement).toContain('sits outside the knowledge graph, where it is never found as knowledge again');
|
|
263
|
+
expect(placement).toContain('offer a place under `Docs/` once more');
|
|
264
|
+
// Nothing tells the agent to move or flag documents already filed there.
|
|
265
|
+
expect(placement).not.toMatch(/\bmove (them|it|any)\b/);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Every agent-facing mention of the folder calls it the "personal plugin" —
|
|
270
|
+
* the name the app itself shows. The three phrases the guide used instead are
|
|
271
|
+
* what an agent matched "keep this private" against, so they are pinned out
|
|
272
|
+
* of the WHOLE guide rather than out of one section.
|
|
273
|
+
*/
|
|
274
|
+
it('calls the folder the "personal plugin" everywhere, and no longer a "space"', async () => {
|
|
275
|
+
for (const layout of [DEFAULT_KB_LAYOUT, { knowledgeBaseDir: 'Docs', skillsDir: 'Abilities', pluginsDir: 'Extensions' }]) {
|
|
276
|
+
const guide = await composeAgentGuide(layout);
|
|
277
|
+
for (const retired of ['personal space', 'private space', 'own space']) {
|
|
278
|
+
expect(guide, retired).not.toContain(retired);
|
|
279
|
+
}
|
|
280
|
+
const plugins = 'pluginsDir' in layout ? layout.pluginsDir : DEFAULT_KB_LAYOUT.pluginsDir;
|
|
281
|
+
// The four places that introduce it: the `my_plugin` bullet, the sentence
|
|
282
|
+
// on moving a skill, the placement rule, and the `everyone` note.
|
|
283
|
+
const prose = guide.replace(/\s+/g, ' ');
|
|
284
|
+
expect(prose).toContain("`my_plugin` — your user's personal plugin, holding their own skills and tools");
|
|
285
|
+
expect(prose).toContain('A skill moves from a personal plugin into a shared plugin by moving its folder.');
|
|
286
|
+
expect(prose).toContain("A person's private skill goes in their personal plugin");
|
|
287
|
+
expect(prose).toContain(
|
|
288
|
+
`A person's personal plugin (\`${plugins}/personal-<id>/\`) grants its owner access and denies \`everyone\` outright`,
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
it('says that roles are pre-set and a "new role" is usually a group', async () => {
|
|
294
|
+
const prose = section(await composeAgentGuide(DEFAULT_KB_LAYOUT), '### Roles are pre-set').replace(/\s+/g, ' ');
|
|
295
|
+
expect(prose).toContain('A role in `roles.yaml` is an app role');
|
|
296
|
+
expect(prose).toContain('**Agents never create roles.**');
|
|
297
|
+
expect(prose).toContain('**Is it really a group?**');
|
|
298
|
+
expect(prose).toContain('**What to do instead.**');
|
|
299
|
+
expect(prose).toContain('add people to existing roles, and use a GROUP for a task- or team-scoped set of people');
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it('describes delete_branch where it says what an agent does with branches', async () => {
|
|
303
|
+
const text = section(await composeAgentGuide(DEFAULT_KB_LAYOUT), '### An agent proposes and syncs; a person merges');
|
|
304
|
+
const prose = text.replace(/\s+/g, ' ');
|
|
305
|
+
expect(prose).toContain('`delete_branch`');
|
|
306
|
+
expect(prose).toContain('Only its author');
|
|
307
|
+
expect(prose).toContain('`dryRun: true`');
|
|
308
|
+
expect(prose).toContain('`discardUnmerged: true`');
|
|
309
|
+
expect(prose).toContain('that proposes nothing is closed by the delete');
|
|
310
|
+
expect(prose).toContain('its author can withdraw it, or an Admin can decline it, in the app');
|
|
311
|
+
expect(prose).toContain('`lastCommit`');
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it('documents giving a role to a group, with an example that parses as a valid roles.yaml', async () => {
|
|
315
|
+
const text = section(await composeAgentGuide(DEFAULT_KB_LAYOUT), '### Giving a role to a group');
|
|
316
|
+
const prose = text.replace(/\s+/g, ' ');
|
|
317
|
+
expect(prose).toContain('`- group:<Name>`');
|
|
318
|
+
expect(prose).toContain('case- and whitespace-insensitively against the active group source');
|
|
319
|
+
expect(prose).toContain('validation error');
|
|
320
|
+
expect(prose).toContain("removes the role's contribution for everyone in the group");
|
|
321
|
+
expect(prose).toContain('`deny role/Reviewer`');
|
|
322
|
+
expect(prose).toContain('A group under `Admin` makes every member a full admin');
|
|
323
|
+
// A change request cannot carry a roles.yaml edit, so the guide says who
|
|
324
|
+
// changes roles and where, and never walks an agent through drafting one.
|
|
325
|
+
expect(prose).toContain('Only an Admin changes `roles.yaml`');
|
|
326
|
+
expect(prose).toContain('Do not propose one');
|
|
327
|
+
for (const tool of ['create_branch', 'commit_change', 'open_change_request']) {
|
|
328
|
+
expect(prose).not.toContain(`\`${tool}\``);
|
|
329
|
+
}
|
|
330
|
+
const example = /```yaml\n([\s\S]*?)```/.exec(text)?.[1] ?? '';
|
|
331
|
+
expect(example).toContain('- group:Platform Team');
|
|
332
|
+
const parsed = parseRolesYaml(example);
|
|
333
|
+
expect(parsed.ok).toBe(true);
|
|
334
|
+
if (!parsed.ok) return;
|
|
335
|
+
const groups = new Map([['platform team', { displayName: 'Platform Team', emails: new Set(['pat@example.com']) }]]);
|
|
336
|
+
expect(mergeGroupsIntoRoles(parsed.index, groups, 'groups.yaml')).toEqual([]);
|
|
337
|
+
expect(parsed.index.byEmail.get('pat@example.com')?.has('reviewer')).toBe(true);
|
|
338
|
+
expect(parsed.index.byEmail.get('pat@example.com')?.has('role/admin')).toBe(false);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* The HTML views section: what an agent writing a live page is told about the
|
|
344
|
+
* frame. Its link rules are pinned against the renderer by core-frontend's
|
|
345
|
+
* `htmlViewsGuide.test.ts`, which reads the same file; what is pinned here is
|
|
346
|
+
* that it is served like every other section and that a distribution may
|
|
347
|
+
* reshape it.
|
|
348
|
+
*/
|
|
349
|
+
describe('the HTML views section', () => {
|
|
350
|
+
it('is served on its own, inside the whole guide, titled "HTML views"', async () => {
|
|
351
|
+
const sections = await agentGuideSections(DEFAULT_KB_LAYOUT);
|
|
352
|
+
const html = sections.find((s) => s.id === 'html-views')!;
|
|
353
|
+
expect(html.title).toBe('HTML views');
|
|
354
|
+
expect(html.body).not.toContain('{{');
|
|
355
|
+
expect(await composeAgentGuide(DEFAULT_KB_LAYOUT)).toContain(html.body);
|
|
356
|
+
// After the tool manuals, before the conventions.
|
|
357
|
+
const ids = sections.map((s) => s.id);
|
|
358
|
+
expect(ids.indexOf('html-views')).toBe(ids.indexOf('tool-manuals') + 1);
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it('describes the frame, the two members core puts on window.bevel, and a fragment that scrolls the page', async () => {
|
|
362
|
+
const text = section(await composeAgentGuide(DEFAULT_KB_LAYOUT), '## HTML views').replace(/\s+/g, ' ');
|
|
363
|
+
expect(text).toContain('**No network.**');
|
|
364
|
+
expect(text).toContain('**Inline scripts and styles only.**');
|
|
365
|
+
expect(text).toContain('**Scripts run as ES modules**');
|
|
366
|
+
expect(text).toContain('**No browser storage.**');
|
|
367
|
+
expect(text).toContain('**No host navigation.**');
|
|
368
|
+
expect(text).toContain('`window.bevel.openNode(href)`');
|
|
369
|
+
expect(text).toContain('`window.bevel.navigate(href)`');
|
|
370
|
+
expect(text).toContain('A distribution may add data members of its own to `window.bevel`');
|
|
371
|
+
expect(text).toContain('**A bare fragment scrolls the page.**');
|
|
372
|
+
// Rendered for the deployment's layout like every other section.
|
|
373
|
+
const docs = section(await composeAgentGuide({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: 'Docs' }), '## HTML views');
|
|
374
|
+
expect(docs).toContain('/workspace/main/Docs/Alice.md');
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it('lets a distribution replace the section or drop it', async () => {
|
|
378
|
+
const replaced = await composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) =>
|
|
379
|
+
sections.map((s) => (s.id === 'html-views' ? { id: s.id, body: '## HTML views\n\nOurs, graph-aware.\n' } : s)),
|
|
380
|
+
);
|
|
381
|
+
expect(section(replaced, '## HTML views').trim()).toBe('Ours, graph-aware.');
|
|
382
|
+
const dropped = await agentGuideSections(DEFAULT_KB_LAYOUT, (sections) => sections.filter((s) => s.id !== 'html-views'));
|
|
383
|
+
expect(dropped.map((s) => s.id)).not.toContain('html-views');
|
|
384
|
+
expect(joinGuideSections(dropped)).not.toContain('## HTML views');
|
|
385
|
+
});
|
|
386
|
+
});
|