@bevel-software/platform-core-backend 0.26.0 → 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 +17 -0
- package/agent-guide/conventions.md +8 -0
- package/agent-guide/html-views.md +83 -0
- package/agent-guide/new-knowledge-base.md +24 -0
- package/agent-guide/tool-manuals.md +10 -0
- package/dist/assets.d.ts +19 -0
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +26 -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/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 +54 -3
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +26 -0
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +100 -8
- 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 +8 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +1 -0
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +11 -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 +6 -0
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +8 -0
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/index.d.ts +1 -1
- package/dist/modules/agent-guide/index.d.ts.map +1 -1
- package/dist/modules/agent-guide/index.js +1 -1
- package/dist/modules/agent-guide/index.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +5 -0
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +19 -2
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +19 -19
- 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 +28 -1
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +64 -8
- 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/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/settings/deployment-settings.service.d.ts +34 -0
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +134 -1
- 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/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +50 -32
- 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.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +14 -5
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.d.ts +6 -2
- package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
- package/dist/modules/tool-registry/description-length.js +27 -5
- package/dist/modules/tool-registry/description-length.js.map +1 -1
- package/dist/modules/tool-registry/guide-first.d.ts +4 -0
- package/dist/modules/tool-registry/guide-first.d.ts.map +1 -1
- package/dist/modules/tool-registry/guide-first.js +9 -1
- package/dist/modules/tool-registry/guide-first.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +53 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js +97 -68
- package/dist/modules/workflow/agent-tools/change-request-read.tools.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 +124 -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 +72 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +172 -36
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- 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/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.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +2 -1
- 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.service.d.ts +183 -15
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +805 -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 +3 -13
- package/dist/modules/workspace/startup/steps/seed-tree.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 +59 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +443 -65
- 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 +73 -1
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +86 -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/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/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 +5 -3
- package/src/__tests__/packaged-assets-ship.test.ts +16 -4
- package/src/assets.ts +28 -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/create-core-server.ts +67 -3
- package/src/core/create-core-services.ts +140 -6
- 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.service.test.ts +19 -0
- package/src/modules/access/access-control.interface.ts +13 -0
- package/src/modules/access/access-control.service.ts +16 -0
- package/src/modules/access/directory-sync-bot.ts +1 -1
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +58 -0
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +19 -1
- package/src/modules/agent-guide/agent-guide.ts +9 -0
- package/src/modules/agent-guide/index.ts +1 -0
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +14 -0
- package/src/modules/agent-instructions/compose.ts +17 -2
- package/src/modules/agent-instructions/shared-file-rules.ts +19 -19
- 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__/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 +3 -1
- package/src/modules/mcp/__tests__/mcp.service.test.ts +23 -13
- package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +81 -12
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
- 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 +25 -2
- 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/settings/__tests__/deployment-settings.service.test.ts +150 -1
- package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
- package/src/modules/settings/deployment-settings.service.ts +131 -1
- package/src/modules/settings/repository-source.ts +4 -4
- package/src/modules/skills/__tests__/skills.tools.description.test.ts +5 -1
- package/src/modules/skills/skills.tools.ts +55 -35
- 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/tool-manuals.tools.ts +15 -5
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +14 -1
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +23 -10
- package/src/modules/tool-registry/description-length.ts +34 -7
- package/src/modules/tool-registry/guide-first.ts +8 -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.tools.test.ts +41 -5
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +127 -2
- package/src/modules/workflow/agent-tools/change-request-read.tools.ts +157 -122
- package/src/modules/workflow/agent-tools/workflow.tools.ts +129 -35
- package/src/modules/workflow/file-lock.service.ts +67 -5
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -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/git.service.ts +176 -38
- package/src/modules/workflow/git/node-git-runner.ts +82 -7
- 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/review-workflow.service.ts +2 -1
- package/src/modules/workflow/sanitize-error.ts +50 -0
- package/src/modules/workflow/workflow.service.ts +879 -112
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
- 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.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.branch-errors.test.ts +44 -1
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +409 -12
- 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/seed-tree.ts +3 -12
- 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 +492 -63
- 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 +108 -11
- package/src/shared/git.contract.ts +8 -1
- 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
|
@@ -47,6 +47,12 @@ describe('isAlwaysWritable', () => {
|
|
|
47
47
|
['POST', '/api/workspace/w1/access/batch'],
|
|
48
48
|
['POST', '/api/workspace/w1/workflow/locks/heartbeat'],
|
|
49
49
|
['POST', '/api/events/s1/focus'],
|
|
50
|
+
// The Atlassian connector's VIEW mint: it signs a token, changes nothing.
|
|
51
|
+
['POST', '/api/embed/token'],
|
|
52
|
+
// The embed's lock signals, like the app's heartbeat: a held lock kept
|
|
53
|
+
// or let go, no content changed.
|
|
54
|
+
['POST', '/api/embed/heartbeat'],
|
|
55
|
+
['POST', '/api/embed/cancel'],
|
|
50
56
|
])('lets %s %s through', (method, path) => {
|
|
51
57
|
expect(isAlwaysWritable(method, path)).toBe(true);
|
|
52
58
|
});
|
|
@@ -59,6 +65,13 @@ describe('isAlwaysWritable', () => {
|
|
|
59
65
|
['POST', '/api/workspace/w1/workflow/locks'],
|
|
60
66
|
['POST', '/api/plugins'],
|
|
61
67
|
['POST', '/api/admin/groups'],
|
|
68
|
+
// The embed's own edits stay refused like every other write — taking the
|
|
69
|
+
// lock included, since it is the first step of a save.
|
|
70
|
+
['POST', '/api/embed/save'],
|
|
71
|
+
['POST', '/api/embed/propose'],
|
|
72
|
+
['POST', '/api/embed/lock'],
|
|
73
|
+
['POST', '/api/embed/token/extra'],
|
|
74
|
+
['POST', '/api/embed/heartbeat/extra'],
|
|
62
75
|
// A look-alike of an allowed path is not that path.
|
|
63
76
|
['POST', '/api/admin/accountsx'],
|
|
64
77
|
['POST', '/api/workspace/w1/access/batch/extra'],
|
|
@@ -48,6 +48,12 @@ const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
|
|
|
48
48
|
* - Account administration: the way an admin brings the number of people
|
|
49
49
|
* down. Erasing an account with `removeFromAccess` commits to the
|
|
50
50
|
* knowledge base, and that commit is part of the same act.
|
|
51
|
+
* - The embed mint: `POST /api/embed/token` signs a short-lived VIEW
|
|
52
|
+
* token for the Atlassian connector and changes nothing; the embed's
|
|
53
|
+
* own edit routes stay refused. Its lock heartbeat and cancel stay open
|
|
54
|
+
* for the same reason the app's heartbeat does: a held lock is kept or
|
|
55
|
+
* let go, and no content changes — refusing them would have an editor
|
|
56
|
+
* read the refusal as "your access was withdrawn".
|
|
51
57
|
* - The tool surface: every tool call is judged by the tool layer itself,
|
|
52
58
|
* which knows a read tool from a write tool (see `toolHandler`); the MCP
|
|
53
59
|
* endpoint only relays to it.
|
|
@@ -76,6 +82,9 @@ const ALWAYS_WRITABLE: readonly RegExp[] = [
|
|
|
76
82
|
/^\/api\/workspace\/[^/]+\/workflow\/locks\/heartbeat$/,
|
|
77
83
|
/^\/api\/events\/[^/]+\/focus$/,
|
|
78
84
|
/^\/api\/tools\/preview$/,
|
|
85
|
+
/^\/api\/embed\/token$/,
|
|
86
|
+
/^\/api\/embed\/heartbeat$/,
|
|
87
|
+
/^\/api\/embed\/cancel$/,
|
|
79
88
|
];
|
|
80
89
|
|
|
81
90
|
/**
|
|
@@ -108,24 +108,53 @@ export class PushNeedsAgentResolutionError extends WorkflowDomainError {
|
|
|
108
108
|
readonly path: string,
|
|
109
109
|
readonly originalDetail: string,
|
|
110
110
|
readonly recoveryDetail: string,
|
|
111
|
+
/**
|
|
112
|
+
* Why the push did not land. `diverged`: the remote moved and the
|
|
113
|
+
* cooperative rebase could not reconcile. `refused`: the host turned the
|
|
114
|
+
* push away for any other reason (an outage, credentials, a dropped
|
|
115
|
+
* connection) — nothing to reconcile, the next push of the branch carries
|
|
116
|
+
* the commits. The opening clause is the same either way.
|
|
117
|
+
*/
|
|
118
|
+
readonly cause: 'diverged' | 'refused' = 'diverged',
|
|
111
119
|
) {
|
|
112
120
|
super(
|
|
113
121
|
`Saved locally on "${branch}" but couldn't share with the team automatically — ` +
|
|
114
|
-
|
|
115
|
-
|
|
122
|
+
(cause === 'refused'
|
|
123
|
+
? `the repository host refused the push; the next save on this branch will try sharing it again.`
|
|
124
|
+
: `the remote diverged on "${path}" and the cooperative rebase couldn't reconcile. ` +
|
|
125
|
+
`The agent will resolve this.`),
|
|
116
126
|
409,
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
originalDetail,
|
|
122
|
-
recoveryDetail,
|
|
123
|
-
},
|
|
127
|
+
// The two details are raw git output — stderr can quote a credentialed
|
|
128
|
+
// URL, server paths, the host's own error page. They stay on the error
|
|
129
|
+
// for the server log and never enter the payload the browser receives.
|
|
130
|
+
{ kind: 'push-needs-resolution', branch, path },
|
|
124
131
|
);
|
|
125
132
|
this.name = 'PushNeedsAgentResolutionError';
|
|
126
133
|
}
|
|
127
134
|
}
|
|
128
135
|
|
|
136
|
+
/**
|
|
137
|
+
* The repository host refused to delete a branch (an outage, a protection
|
|
138
|
+
* rule, a dropped connection). Deletion pushes FIRST and deletes locally only
|
|
139
|
+
* once the host agreed, so the branch is still there — locally and remotely —
|
|
140
|
+
* and the person can try again later. Unlike a refused write there is nothing
|
|
141
|
+
* to keep "saved locally": a deleted branch has no later push to carry it.
|
|
142
|
+
*
|
|
143
|
+
* `detail` is the raw git failure, for the server log only; it never enters
|
|
144
|
+
* the message or the payload.
|
|
145
|
+
*/
|
|
146
|
+
export class BranchDeleteRefusedError extends WorkflowDomainError {
|
|
147
|
+
readonly kind = 'branch-delete-refused' as const;
|
|
148
|
+
constructor(readonly branchName: string, readonly detail: string) {
|
|
149
|
+
super(
|
|
150
|
+
`The repository host refused to delete "${branchName}"; it is still there. Try again later.`,
|
|
151
|
+
409,
|
|
152
|
+
{ kind: 'branch-delete-refused', branchName },
|
|
153
|
+
);
|
|
154
|
+
this.name = 'BranchDeleteRefusedError';
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
129
158
|
/**
|
|
130
159
|
* Refreshing a workspace from origin (`GitService.pull`) hit a rebase
|
|
131
160
|
* conflict: the workspace carries local commits origin doesn't have, origin
|
|
@@ -221,8 +250,18 @@ const STRINGIFIED_ABSENT_VALUES = new Set(['undefined', 'null']);
|
|
|
221
250
|
* nothing", which is the one case where naming the branch back is impossible.
|
|
222
251
|
*/
|
|
223
252
|
export function assertBranchProvided(branch: unknown): asserts branch is string {
|
|
224
|
-
if (
|
|
225
|
-
|
|
253
|
+
if (!branchProvided(branch)) throw new BranchRequiredError();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* The same question as {@link assertBranchProvided}, answered rather than
|
|
258
|
+
* thrown — for a caller that must know whether the branch refusal is the one
|
|
259
|
+
* this call is going to get, without being the one to raise it. The generic
|
|
260
|
+
* argument check asks it so that refusal keeps coming first.
|
|
261
|
+
*/
|
|
262
|
+
export function branchProvided(branch: unknown): branch is string {
|
|
263
|
+
if (typeof branch !== 'string' || branch.length === 0) return false;
|
|
264
|
+
return !STRINGIFIED_ABSENT_VALUES.has(branch);
|
|
226
265
|
}
|
|
227
266
|
|
|
228
267
|
/**
|
|
@@ -245,6 +284,23 @@ export class BranchNotFoundError extends WorkflowDomainError {
|
|
|
245
284
|
}
|
|
246
285
|
}
|
|
247
286
|
|
|
287
|
+
/**
|
|
288
|
+
* A tool that defaults its branch was called without one, and the deployment
|
|
289
|
+
* has no default branch configured to fall back on. Not `BranchRequiredError`:
|
|
290
|
+
* the tool's schema says the branch is optional, so "you must pass one" would
|
|
291
|
+
* misdescribe the call — the caller did nothing wrong, the deployment is not
|
|
292
|
+
* set up. 503 with kind `default-branch-unset`; passing a branch works.
|
|
293
|
+
*/
|
|
294
|
+
export class DefaultBranchUnsetError extends WorkflowDomainError {
|
|
295
|
+
readonly kind = 'default-branch-unset' as const;
|
|
296
|
+
constructor() {
|
|
297
|
+
super('This deployment has no default branch configured: pass `branch` to name the one to use.', 503, {
|
|
298
|
+
kind: 'default-branch-unset',
|
|
299
|
+
});
|
|
300
|
+
this.name = 'DefaultBranchUnsetError';
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
248
304
|
/**
|
|
249
305
|
* The clone's branch no longer exists on origin: the fetch that refreshes
|
|
250
306
|
* `refs/remotes/origin/<branch>` found no such ref. Distinct from an
|
|
@@ -330,6 +386,47 @@ export class WorkflowValidationError extends WorkflowDomainError {
|
|
|
330
386
|
}
|
|
331
387
|
}
|
|
332
388
|
|
|
389
|
+
/**
|
|
390
|
+
* An agent's `delete_branch` refused, for a reason a person can act on. The
|
|
391
|
+
* `reason` is the discriminator a caller branches on; the message says what
|
|
392
|
+
* to do about it. Nothing was deleted.
|
|
393
|
+
*
|
|
394
|
+
* - `open-change-request` (409) — a request is open from or into the branch;
|
|
395
|
+
* `number` names it. Withdrawing or declining it is a person's action, in
|
|
396
|
+
* the app.
|
|
397
|
+
* - `unmerged-commits` (409) — `unmergedCommits` commits would be lost;
|
|
398
|
+
* `discardUnmerged` is the deliberate way past it.
|
|
399
|
+
* - `saves-landing` (409) — the branch's checkout still has saves waiting to
|
|
400
|
+
* be committed or a file held for editing. Clears itself within seconds.
|
|
401
|
+
* - `state-unconfirmed` (503) — the shared repository could not be fetched,
|
|
402
|
+
* so the branch's current state is unknown.
|
|
403
|
+
*/
|
|
404
|
+
export type BranchDeleteBlockedReason =
|
|
405
|
+
| 'open-change-request'
|
|
406
|
+
| 'unmerged-commits'
|
|
407
|
+
| 'saves-landing'
|
|
408
|
+
| 'state-unconfirmed';
|
|
409
|
+
|
|
410
|
+
export class BranchDeleteBlockedError extends WorkflowDomainError {
|
|
411
|
+
readonly kind = 'branch-delete-blocked' as const;
|
|
412
|
+
constructor(
|
|
413
|
+
readonly reason: BranchDeleteBlockedReason,
|
|
414
|
+
readonly branchName: string,
|
|
415
|
+
message: string,
|
|
416
|
+
extra: Record<string, unknown> = {},
|
|
417
|
+
) {
|
|
418
|
+
// `extra` first: it adds detail, and can never contradict the kind,
|
|
419
|
+
// reason or branch the status and fields above were chosen for.
|
|
420
|
+
super(message, reason === 'state-unconfirmed' ? 503 : 409, {
|
|
421
|
+
...extra,
|
|
422
|
+
kind: 'branch-delete-blocked',
|
|
423
|
+
reason,
|
|
424
|
+
branchName,
|
|
425
|
+
});
|
|
426
|
+
this.name = 'BranchDeleteBlockedError';
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
333
430
|
/**
|
|
334
431
|
* The commit an applied change request records is in the clone but is NOT
|
|
335
432
|
* that request's own merge commit — no second parent (not a merge), no first
|
|
@@ -70,8 +70,15 @@ export interface GitCredentials {
|
|
|
70
70
|
* failure here is not the call's failure: git runs with the token in
|
|
71
71
|
* hand, and the host says what it thinks of it. Absent for a credential
|
|
72
72
|
* that does not expire.
|
|
73
|
+
*
|
|
74
|
+
* `refused` is the runner reporting that the host just refused the
|
|
75
|
+
* credential in hand: whatever is held is dead, however much time the
|
|
76
|
+
* clock says it has left, and a fresh one is asked for now, past whatever
|
|
77
|
+
* the provider remembers about a recent failure. The failure is thrown to
|
|
78
|
+
* the caller; what `token` answers afterwards is what the runner judges
|
|
79
|
+
* by — a credential that could not be replaced is not offered again.
|
|
73
80
|
*/
|
|
74
|
-
prepare?(): Promise<void>;
|
|
81
|
+
prepare?(opts?: { refused?: boolean }): Promise<void>;
|
|
75
82
|
}
|
|
76
83
|
|
|
77
84
|
/** The username git is given when a deployment names none. */
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isUtf8 } from 'node:buffer';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The one rule for "is this text": no NUL byte AND valid UTF-8. A NUL-free
|
|
5
|
+
* file that does not decode as UTF-8 is still binary — the decode would be
|
|
6
|
+
* lossy, so text written back could never round-trip the original bytes.
|
|
7
|
+
* Checked on the raw bytes, so a large binary is refused without allocating
|
|
8
|
+
* its decoded string first. Every reader that has to decide "text to render
|
|
9
|
+
* or edit, or bytes to copy as they are" — the fallback text reader, the
|
|
10
|
+
* access-rule writer, the template seeder, the starter packs — reads the
|
|
11
|
+
* policy from here, so a file one treats as text another never treats as
|
|
12
|
+
* bytes.
|
|
13
|
+
*/
|
|
14
|
+
export function isTextBytes(bytes: Buffer): boolean {
|
|
15
|
+
return !bytes.includes(0) && isUtf8(bytes);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** The bytes as text when they ARE text by {@link isTextBytes} (BOM kept), else null. */
|
|
19
|
+
export function utf8Text(bytes: Buffer): string | null {
|
|
20
|
+
return isTextBytes(bytes) ? bytes.toString('utf8') : null;
|
|
21
|
+
}
|
|
@@ -11,6 +11,7 @@ const settings: TenantHostSettings = {
|
|
|
11
11
|
trustProxy: '1',
|
|
12
12
|
workspacesRoot: path.resolve('/srv/hexis/workspaces'),
|
|
13
13
|
kbTemplateDir: '/srv/hexis/template',
|
|
14
|
+
starterPacksDir: '/srv/hexis/starter-packs',
|
|
14
15
|
gitTimeoutMs: 120_000,
|
|
15
16
|
updateCheckEnabled: false,
|
|
16
17
|
masterKey: 'a-master-key-that-is-long-enough-to-count-as-random',
|
|
@@ -3,7 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { resolveDatabaseUrl, type TenantConfig } from '../core-config.js';
|
|
4
4
|
import { DEFAULT_DB_SCHEMA, assertSchemaName } from '../modules/database/connection.js';
|
|
5
5
|
import { DEFAULT_GIT_TIMEOUT_MS } from '../modules/workflow/git/node-git-runner.js';
|
|
6
|
-
import { defaultKbTemplateDir } from '../assets.js';
|
|
6
|
+
import { defaultKbTemplateDir, defaultStarterPacksDir } from '../assets.js';
|
|
7
7
|
import { DEFAULT_GIT_USERNAME } from '../shared/git.contract.js';
|
|
8
8
|
import { deriveTenantSecrets } from './tenant-secrets.js';
|
|
9
9
|
import { loopbackTenantBaseUrl } from './tenant-host.js';
|
|
@@ -22,6 +22,7 @@ export interface TenantHostSettings {
|
|
|
22
22
|
/** Each tenant's workspaces live under `<workspacesRoot>/<slug>`; its backups, spills and caches beside them. */
|
|
23
23
|
readonly workspacesRoot: string;
|
|
24
24
|
readonly kbTemplateDir: string;
|
|
25
|
+
readonly starterPacksDir: string;
|
|
25
26
|
readonly gitTimeoutMs: number;
|
|
26
27
|
readonly updateCheckEnabled: boolean;
|
|
27
28
|
/** See `tenant-secrets.ts`. */
|
|
@@ -169,6 +170,11 @@ export function tenantConfigFrom(record: TenantRecord, settings: TenantHostSetti
|
|
|
169
170
|
jwtSecret: secrets.jwtSecret,
|
|
170
171
|
secretsEncKey: secrets.secretsEncKey,
|
|
171
172
|
internalTokenSecret: secrets.internalTokenSecret,
|
|
173
|
+
// No shared-secret mint on a tenant of a host: the Atlassian connector
|
|
174
|
+
// is pointed at a deployment, not at one knowledge base inside a host,
|
|
175
|
+
// and a secret derived per tenant would be a credential nobody issued.
|
|
176
|
+
// The MCP App needs none of it — it mints through the MCP session.
|
|
177
|
+
embedSharedSecret: '',
|
|
172
178
|
adminEmail,
|
|
173
179
|
adminPassword,
|
|
174
180
|
loginPasswordEnabled,
|
|
@@ -182,6 +188,7 @@ export function tenantConfigFrom(record: TenantRecord, settings: TenantHostSetti
|
|
|
182
188
|
gitUsername,
|
|
183
189
|
gitToken: (record.gitToken ?? '').trim(),
|
|
184
190
|
kbTemplateDir: settings.kbTemplateDir,
|
|
191
|
+
starterPacksDir: settings.starterPacksDir,
|
|
185
192
|
updateCheckEnabled: settings.updateCheckEnabled,
|
|
186
193
|
allowedEmailDomains,
|
|
187
194
|
trustProxy: settings.trustProxy,
|
|
@@ -261,7 +268,7 @@ const MAX_TIMER_MS = 2_147_483_647;
|
|
|
261
268
|
* The host's settings from the environment: the same variables a
|
|
262
269
|
* single-tenant deployment reads for these facts (`DATABASE_URL` and the
|
|
263
270
|
* `POSTGRES_*` parts, `PORT`, `TRUST_PROXY`, `WORKSPACES_ROOT`,
|
|
264
|
-
* `KB_TEMPLATE_DIR`, `GIT_TIMEOUT_MS`, …), plus the three that only a host
|
|
271
|
+
* `KB_TEMPLATE_DIR`, `STARTER_PACKS_DIR`, `GIT_TIMEOUT_MS`, …), plus the three that only a host
|
|
265
272
|
* has: `TENANTS_FILE`, `TENANT_MASTER_KEY` and `TENANT_IDLE_MINUTES`.
|
|
266
273
|
*/
|
|
267
274
|
export function tenantHostEnv(env: NodeJS.ProcessEnv = process.env): TenantHostEnv {
|
|
@@ -286,6 +293,7 @@ export function tenantHostEnv(env: NodeJS.ProcessEnv = process.env): TenantHostE
|
|
|
286
293
|
trustProxy: (env.TRUST_PROXY || (domain ? '1' : '')).trim(),
|
|
287
294
|
workspacesRoot,
|
|
288
295
|
kbTemplateDir: env.KB_TEMPLATE_DIR || defaultKbTemplateDir(),
|
|
296
|
+
starterPacksDir: env.STARTER_PACKS_DIR || defaultStarterPacksDir(),
|
|
289
297
|
gitTimeoutMs:
|
|
290
298
|
Number.isFinite(gitTimeout) && gitTimeout > 0 && gitTimeout <= MAX_TIMER_MS ? gitTimeout : DEFAULT_GIT_TIMEOUT_MS,
|
|
291
299
|
updateCheckEnabled: (env.UPDATE_CHECK ?? 'true').trim().toLowerCase() !== 'false',
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Starter packs
|
|
2
|
+
|
|
3
|
+
After the first-run storage step, a new knowledge base's admin is asked
|
|
4
|
+
"What does your team do?". Each answer is one folder here: the pages and the
|
|
5
|
+
team plugin it adds to the knowledge base, in one commit on the default branch,
|
|
6
|
+
authored by the admin who chose it. "Skip, I'll start from scratch" adds
|
|
7
|
+
nothing. Either way the choice is recorded (the `starterPack` deployment
|
|
8
|
+
setting) and the question is not asked again.
|
|
9
|
+
|
|
10
|
+
The code is `src/modules/onboarding/` (`starter-packs.ts` reads and validates
|
|
11
|
+
the packs, `starter-pack.service.ts` applies one).
|
|
12
|
+
|
|
13
|
+
## Layout
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
<id>/
|
|
17
|
+
pack.yaml
|
|
18
|
+
KnowledgeBase/… pages
|
|
19
|
+
Plugins/<plugin-name>/… a team plugin
|
|
20
|
+
Skills/… shared skills (optional)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`pack.yaml`:
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
id: sales # the folder's name: lowercase letters, digits, hyphens
|
|
27
|
+
name: Sales # the chip's label
|
|
28
|
+
description: One line about what the pack adds.
|
|
29
|
+
order: 2 # chip order: engineering 1, sales 2, support 3, operations 4, general 99
|
|
30
|
+
firstPagePrompt: | # replaces the generic "write your first page" request for this team
|
|
31
|
+
Using our Hexis knowledge base, fill in …
|
|
32
|
+
suggestedPages: [About us, Customers, Pricing, Objections, Glossary] # named in the agent's first-run note
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
A folder whose `pack.yaml` is missing or does not validate is skipped with a
|
|
36
|
+
warning in the log; the others are still offered. `none` is reserved for the
|
|
37
|
+
skip.
|
|
38
|
+
|
|
39
|
+
`KnowledgeBase/`, `Plugins/` and `Skills/` use the default layout's names and
|
|
40
|
+
are written under the names the deployment chose for those folders. Text files
|
|
41
|
+
may use the layout placeholders (`{{knowledgeBaseDir}}`, `{{skillsDir}}`,
|
|
42
|
+
`{{pluginsDir}}` and `{{agentsFile}}`, the agent guide's file name). Anything
|
|
43
|
+
else in a pack folder (like this README) is never copied. Dot-files are never
|
|
44
|
+
copied.
|
|
45
|
+
|
|
46
|
+
Pages are short tasks rather than finished documents: a heading, a line or two
|
|
47
|
+
of placeholders, and "Ask your agent: _…_". While a page still holds exactly
|
|
48
|
+
what the pack wrote it does not count as written, so the "Write your first
|
|
49
|
+
page" step and the agent's first-run note stay open until someone fills one in.
|
|
50
|
+
|
|
51
|
+
## Plugins
|
|
52
|
+
|
|
53
|
+
A plugin uses Hexis's normal plugin layout: `plugin.json` (optional; one is
|
|
54
|
+
written for the folder name when absent), `skills/<skill>/SKILL.md`, and the
|
|
55
|
+
licence and provenance of anything vendored (`LICENSE`, `SOURCE.md`) inside the
|
|
56
|
+
plugin folder, so they travel with the skills. Skill names must be unique
|
|
57
|
+
across all packs.
|
|
58
|
+
|
|
59
|
+
When the pack is applied, the plugin's `access.md` is the pack's own (if it
|
|
60
|
+
ships one) with the admin who applied it added under `read`, `write` and
|
|
61
|
+
`owner`, the way "Create a plugin" makes a plugin its creator's. Without one,
|
|
62
|
+
the admin gets the access.md "Create a plugin" writes. A plugin whose folder
|
|
63
|
+
(or manifest name) already exists in the knowledge base is left alone entirely.
|
|
64
|
+
|
|
65
|
+
## Applying
|
|
66
|
+
|
|
67
|
+
Only paths that do not exist yet are written, judged with every path's lock
|
|
68
|
+
held, so a pack never overwrites a page. All of it lands as one commit through
|
|
69
|
+
the platform's batch write (`LockingFilesystem.writeFiles`), under the write
|
|
70
|
+
rules of the default branch, which an admin passes.
|
|
71
|
+
|
|
72
|
+
## Your own packs
|
|
73
|
+
|
|
74
|
+
A distribution can offer its own set by pointing `STARTER_PACKS_DIR` at a
|
|
75
|
+
folder in this format. A folder with no valid pack in it means the question is
|
|
76
|
+
never asked.
|
|
77
|
+
|
|
78
|
+
## Vendored skills
|
|
79
|
+
|
|
80
|
+
Most packs carry skills adapted from open-source projects. Each plugin's
|
|
81
|
+
`SOURCE.md` names the repository, the commit and what was changed; its
|
|
82
|
+
`LICENSE` is the project's own. Both ship inside the plugin folder, so the
|
|
83
|
+
licence travels with the skills wherever the plugin is copied. (The generated
|
|
84
|
+
`THIRD-PARTY-NOTICES.md` covers npm dependencies only; vendored content is
|
|
85
|
+
attributed here, in the plugin.)
|
|
86
|
+
|
|
87
|
+
To refresh a plugin's skills from a newer upstream commit:
|
|
88
|
+
|
|
89
|
+
1. Clone the upstream repository outside this one, at the commit you want, and
|
|
90
|
+
record it: `git clone --depth 1 <repo> /tmp/upstream && git -C /tmp/upstream rev-parse HEAD`.
|
|
91
|
+
2. Diff the upstream skills against the commit named in `SOURCE.md`
|
|
92
|
+
(`git -C /tmp/upstream diff <old-sha> -- <skill folders>` after fetching the
|
|
93
|
+
old commit) and carry the changes into the adapted files by hand. The
|
|
94
|
+
adaptation notes in `SOURCE.md` say what was removed and why — keep it removed.
|
|
95
|
+
3. Copy the upstream `LICENSE` again if it changed, and update the commit and
|
|
96
|
+
notes in `SOURCE.md`.
|
|
97
|
+
4. Check every `SKILL.md` still has `name` and `description` frontmatter, that
|
|
98
|
+
skill names stay unique across all packs, and that nothing points at the
|
|
99
|
+
upstream project's own install (paths into `~/.claude/skills/…`, its setup
|
|
100
|
+
or binaries). Then run the backend's tests: the loader test reads every
|
|
101
|
+
packaged pack.
|
|
102
|
+
|
|
103
|
+
Nothing here fetches at build or test time; the packs are files in the repository.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# About us
|
|
2
|
+
|
|
3
|
+
What we build, for whom, and why, in a few sentences anyone on the team could repeat.
|
|
4
|
+
|
|
5
|
+
- **What we build:** _one sentence a new engineer would understand_
|
|
6
|
+
- **Who uses it:** _our customers or users, and what they rely on it for_
|
|
7
|
+
- **The team:** _who works on what, and who to ask about each part_
|
|
8
|
+
|
|
9
|
+
Ask your agent: _Draft this from our repository's README_
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
The main parts of the system and how they fit together, at the level a new engineer needs on day one.
|
|
4
|
+
|
|
5
|
+
- **Components:** _the services, apps and libraries, one line each_
|
|
6
|
+
- **How they talk:** _APIs, queues and events between them_
|
|
7
|
+
- **Where data lives:** _databases and stores, and what each one holds_
|
|
8
|
+
|
|
9
|
+
Ask your agent: _Draft this from our repository's README and code_
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Glossary
|
|
2
|
+
|
|
3
|
+
The words, acronyms and code names the engineering team uses, so a new person and their agent understand them.
|
|
4
|
+
|
|
5
|
+
- **Terms and acronyms:** _each with one line on what it means here_
|
|
6
|
+
- **Code names:** _projects, services and environments, and what they are_
|
|
7
|
+
- **Easily confused:** _pairs of words that sound alike but mean different things here_
|
|
8
|
+
|
|
9
|
+
Ask your agent: _Pull the terms from our repository, docs and recent pull requests_
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# How we ship
|
|
2
|
+
|
|
3
|
+
How a change gets from an idea to production, so nobody has to ask twice.
|
|
4
|
+
|
|
5
|
+
- **From idea to plan:** _where ideas are written down and who signs off on a plan_
|
|
6
|
+
- **Review and merge:** _branching, who reviews, what has to pass before merging_
|
|
7
|
+
- **Release:** _how and when we deploy, how we roll back, who is on call_
|
|
8
|
+
|
|
9
|
+
Ask your agent: _Draft this from our CI configuration and contributing guide_
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Garry Tan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Source
|
|
2
|
+
|
|
3
|
+
The skills in this plugin are adapted from gstack, Garry Tan's set of Claude Code skills.
|
|
4
|
+
|
|
5
|
+
- Repository: https://github.com/garrytan/gstack
|
|
6
|
+
- Commit: `db745675bdf9f575276db2dcd132d3c047218a12` (v1.91.33.0)
|
|
7
|
+
- License: MIT, in `LICENSE` beside this file (Copyright (c) 2026 Garry Tan)
|
|
8
|
+
|
|
9
|
+
Skills taken: `office-hours`, `plan-ceo-review`, `plan-eng-review` and `review`. Their method is gstack's — the forcing questions, the premise challenge and alternatives, the review modes and sections, the cognitive patterns, the error and rescue map, the test coverage diagram, the pre-landing checklist and the fix-first heuristic — and much of the wording is too. `office-hours/sections/phase-2a-startup-diagnostic.md` and `phase-2b-builder-brainstorm.md` are gstack's text with only the question-tool references removed, and `review/checklist.md` is gstack's checklist with the specialist-reviewer column and one suppression removed.
|
|
10
|
+
|
|
11
|
+
Adapted for Hexis. gstack's skills are generated from templates and run inside a gstack install: every one starts with a preamble that calls gstack's own scripts (`~/.claude/skills/gstack/bin/…`: update checks, telemetry, session state, learnings, question preferences, review logs, a "brain" cache) and reads files gstack's `./setup` installs. None of that exists outside gstack, so each `SKILL.md` here was rewritten from its template as instructions that stand on their own:
|
|
12
|
+
|
|
13
|
+
- dropped the preamble, telemetry, learnings capture and search, question tuning, the review log and readiness dashboard, the brain cache and write-back, plan-mode gates and the self-check against generated sections;
|
|
14
|
+
- dropped the optional outside-voice review through the Codex CLI and the "Aside" browser research (web research now uses whatever search the agent has, with the same privacy rule), and office-hours' visual mockups, which need gstack's design binary;
|
|
15
|
+
- dropped office-hours' builder profile and founder-resources closing, and review's Greptile triage, parallel specialist reviewers, exploratory QA, slop scan and adversarial pass, all of which run gstack tooling;
|
|
16
|
+
- design docs, CEO plans and reviews are saved as pages in the Hexis knowledge base instead of `~/.gstack/projects/`, and earlier designs are found there;
|
|
17
|
+
- the long generated `review-sections.md` of each plan review was condensed into its `SKILL.md`;
|
|
18
|
+
- `allowed-tools` lists naming Claude Code's tools were removed, since Hexis matches that field against the tools in its own catalog.
|
|
19
|
+
|
|
20
|
+
Not taken: `ship`, whose core steps (the review readiness gate, `gstack-version-bump`, `gstack-evidence`, `gstack-review-read`) are gstack scripts installed by its setup; and `retro`, whose metrics come from gstack's `gstack-retro-metrics` and `gstack-global-discover` programs.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
# THIS BLOCK (the frontmatter) governs this access.md FILE only: who may
|
|
3
|
+
# see it and who may change it. `read: everyone` here means every signed-in
|
|
4
|
+
# person can see that the plugin exists. It admits nobody.
|
|
5
|
+
read:
|
|
6
|
+
- everyone
|
|
7
|
+
---
|
|
8
|
+
# THIS BLOCK (the body) governs the PLUGIN FOLDER - its skills, tools and
|
|
9
|
+
# manifest. A starter plugin is for the whole team, so everyone may use it
|
|
10
|
+
# and admins change it. To narrow it, replace `everyone` under `read:` with a
|
|
11
|
+
# role from roles.yaml (as `role/<Name>`, so a group of the same name can
|
|
12
|
+
# never stand in for it), a group from groups.yaml, or a person as
|
|
13
|
+
# `Name <email>`. Keep this block pure YAML; explanations go in `#` lines.
|
|
14
|
+
read:
|
|
15
|
+
- everyone
|
|
16
|
+
write:
|
|
17
|
+
- role/Admin
|
|
18
|
+
owner:
|
|
19
|
+
- role/Admin
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "engineering-starter",
|
|
4
|
+
"displayName": "Engineering starter",
|
|
5
|
+
"description": "Think an idea through before building it, pressure-test a plan's scope, lock a plan's architecture and tests, and review a diff before it lands.",
|
|
6
|
+
"version": "1.0.0",
|
|
7
|
+
"author": {
|
|
8
|
+
"name": "Garry Tan (gstack), adapted for Hexis by Bevel"
|
|
9
|
+
}
|
|
10
|
+
}
|