memory-journal-mcp 6.1.2 → 6.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -28
- package/dist/{chunk-X4SWFATC.js → chunk-BI4ZNSKA.js} +38 -24
- package/dist/{chunk-HCEWINSB.js → chunk-N6EBIDN7.js} +99 -102
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/tools-WPRY5MJ6.js +2 -0
- package/package.json +10 -1
- package/skills/github-commander/SKILL.md +151 -0
- package/skills/github-commander/config/project-config.example.md +125 -0
- package/skills/github-commander/workflows/code-quality-audit.md +80 -0
- package/skills/github-commander/workflows/full-audit.md +134 -0
- package/skills/github-commander/workflows/issue-triage.md +239 -0
- package/skills/github-commander/workflows/milestone-sprint.md +81 -0
- package/skills/github-commander/workflows/perf-audit.md +142 -0
- package/skills/github-commander/workflows/pr-review.md +123 -0
- package/skills/github-commander/workflows/security-audit.md +170 -0
- package/skills/github-commander/workflows/update-deps.md +109 -0
- package/.dockerignore +0 -139
- package/.gitattributes +0 -20
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -95
- package/.github/ISSUE_TEMPLATE/config.yml +0 -11
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -110
- package/.github/ISSUE_TEMPLATE/question.md +0 -78
- package/.github/aw/actions-lock.json +0 -14
- package/.github/copilot-instructions.md +0 -122
- package/.github/dependabot.yml +0 -93
- package/.github/pull_request_template.md +0 -135
- package/.github/workflows/README.md +0 -133
- package/.github/workflows/agentics-maintenance.yml +0 -141
- package/.github/workflows/auto-release.yml +0 -68
- package/.github/workflows/ci-health-monitor.lock.yml +0 -1121
- package/.github/workflows/ci-health-monitor.md +0 -87
- package/.github/workflows/codeql.yml +0 -41
- package/.github/workflows/dependabot-auto-merge.yml +0 -42
- package/.github/workflows/dependency-maintenance.lock.yml +0 -1182
- package/.github/workflows/dependency-maintenance.md +0 -147
- package/.github/workflows/docker-publish.yml +0 -254
- package/.github/workflows/docs-drift-detector.lock.yml +0 -1142
- package/.github/workflows/docs-drift-detector.md +0 -115
- package/.github/workflows/lint-and-test.yml +0 -60
- package/.github/workflows/publish-npm.yml +0 -85
- package/.github/workflows/secrets-scanning.yml +0 -32
- package/.github/workflows/security-update.yml +0 -127
- package/.gitleaks.toml +0 -9
- package/.prettierignore +0 -21
- package/.prettierrc +0 -33
- package/.scout-ignore +0 -12
- package/.trivyignore +0 -21
- package/CHANGELOG.md +0 -1814
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -263
- package/DOCKER_README.md +0 -331
- package/Dockerfile +0 -128
- package/SECURITY.md +0 -227
- package/UNRELEASED.md +0 -1
- package/dist/tools-T4U5A3X4.js +0 -2
- package/docker-compose.yml +0 -71
- package/docs/README.md +0 -18
- package/docs/agentic-journal-synergy.md +0 -175
- package/docs/copilot-setup.md +0 -72
- package/eslint.config.js +0 -110
- package/mcp-config-example.json +0 -21
- package/playwright.config.ts +0 -35
- package/releases/v2.1.0.md +0 -220
- package/releases/v2.2.0.md +0 -168
- package/releases/v3.0.0.md +0 -237
- package/releases/v3.1.0.md +0 -104
- package/releases/v3.1.1.md +0 -42
- package/releases/v3.1.2.md +0 -40
- package/releases/v3.1.3.md +0 -64
- package/releases/v3.1.4.md +0 -32
- package/releases/v3.1.5.md +0 -44
- package/releases/v4.0.0.md +0 -71
- package/releases/v4.1.0.md +0 -88
- package/releases/v4.2.0.md +0 -90
- package/releases/v4.3.0.md +0 -92
- package/releases/v4.3.1.md +0 -69
- package/releases/v4.4.0.md +0 -120
- package/releases/v4.4.1.md +0 -33
- package/releases/v4.4.2.md +0 -31
- package/releases/v4.5.0.md +0 -116
- package/releases/v5.0.0.md +0 -105
- package/releases/v5.0.1.md +0 -25
- package/releases/v5.1.0.md +0 -83
- package/releases/v5.1.1.md +0 -10
- package/releases/v6.0.0.md +0 -48
- package/releases/v6.0.1.md +0 -36
- package/releases/v6.1.0.md +0 -68
- package/releases/v6.1.1.md +0 -30
- package/releases/v6.1.2.md +0 -23
- package/scripts/generate-server-instructions.ts +0 -306
- package/scripts/server-instructions-function-body.ts +0 -107
- package/scripts/server-instructions-gotchas.ts +0 -45
- package/server.json +0 -42
- package/social-preview.png +0 -0
- package/src/auth/auth-context.ts +0 -78
- package/src/auth/authorization-server-discovery.ts +0 -263
- package/src/auth/errors.ts +0 -215
- package/src/auth/index.ts +0 -58
- package/src/auth/middleware.ts +0 -392
- package/src/auth/oauth-resource-server.ts +0 -170
- package/src/auth/scope-map.ts +0 -46
- package/src/auth/scopes.ts +0 -256
- package/src/auth/token-validator.ts +0 -293
- package/src/auth/transport-agnostic.ts +0 -164
- package/src/auth/types.ts +0 -372
- package/src/cli.ts +0 -279
- package/src/codemode/api-constants.ts +0 -263
- package/src/codemode/api.ts +0 -302
- package/src/codemode/auto-return.ts +0 -65
- package/src/codemode/index.ts +0 -47
- package/src/codemode/sandbox-factory.ts +0 -144
- package/src/codemode/sandbox.ts +0 -220
- package/src/codemode/security.ts +0 -155
- package/src/codemode/types.ts +0 -228
- package/src/codemode/worker-sandbox.ts +0 -277
- package/src/codemode/worker-script.ts +0 -239
- package/src/constants/icons.ts +0 -183
- package/src/constants/server-instructions.md +0 -166
- package/src/constants/server-instructions.ts +0 -514
- package/src/database/adapter-factory.ts +0 -16
- package/src/database/core/entry-columns.ts +0 -10
- package/src/database/core/interfaces.ts +0 -188
- package/src/database/core/schema.ts +0 -152
- package/src/database/sqlite-adapter/backup.ts +0 -167
- package/src/database/sqlite-adapter/entries/crud.ts +0 -233
- package/src/database/sqlite-adapter/entries/importance.ts +0 -76
- package/src/database/sqlite-adapter/entries/index.ts +0 -142
- package/src/database/sqlite-adapter/entries/search.ts +0 -294
- package/src/database/sqlite-adapter/entries/shared.ts +0 -102
- package/src/database/sqlite-adapter/entries/statistics.ts +0 -162
- package/src/database/sqlite-adapter/index.ts +0 -265
- package/src/database/sqlite-adapter/native-connection.ts +0 -301
- package/src/database/sqlite-adapter/relationships.ts +0 -70
- package/src/database/sqlite-adapter/tags.ts +0 -182
- package/src/filtering/tool-filter.ts +0 -312
- package/src/github/github-integration/client.ts +0 -114
- package/src/github/github-integration/index.ts +0 -297
- package/src/github/github-integration/insights.ts +0 -155
- package/src/github/github-integration/issues.ts +0 -213
- package/src/github/github-integration/milestones.ts +0 -262
- package/src/github/github-integration/projects.ts +0 -414
- package/src/github/github-integration/pull-requests.ts +0 -235
- package/src/github/github-integration/repository.ts +0 -110
- package/src/github/github-integration/types.ts +0 -43
- package/src/handlers/prompts/github.ts +0 -210
- package/src/handlers/prompts/index.ts +0 -97
- package/src/handlers/prompts/workflow.ts +0 -361
- package/src/handlers/resources/core/briefing/context-section.ts +0 -182
- package/src/handlers/resources/core/briefing/github-section.ts +0 -354
- package/src/handlers/resources/core/briefing/index.ts +0 -106
- package/src/handlers/resources/core/briefing/user-message.ts +0 -114
- package/src/handlers/resources/core/health.ts +0 -75
- package/src/handlers/resources/core/index.ts +0 -31
- package/src/handlers/resources/core/instructions.ts +0 -45
- package/src/handlers/resources/core/utilities.ts +0 -310
- package/src/handlers/resources/github.ts +0 -340
- package/src/handlers/resources/graph.ts +0 -218
- package/src/handlers/resources/help.ts +0 -410
- package/src/handlers/resources/index.ts +0 -143
- package/src/handlers/resources/shared.ts +0 -219
- package/src/handlers/resources/team.ts +0 -134
- package/src/handlers/resources/templates.ts +0 -334
- package/src/handlers/tools/admin.ts +0 -351
- package/src/handlers/tools/analytics.ts +0 -346
- package/src/handlers/tools/backup.ts +0 -272
- package/src/handlers/tools/codemode.ts +0 -188
- package/src/handlers/tools/core.ts +0 -359
- package/src/handlers/tools/error-fields-mixin.ts +0 -10
- package/src/handlers/tools/export.ts +0 -150
- package/src/handlers/tools/github/copilot-tools.ts +0 -72
- package/src/handlers/tools/github/helpers.ts +0 -125
- package/src/handlers/tools/github/insights-tools.ts +0 -112
- package/src/handlers/tools/github/issue-tools.ts +0 -442
- package/src/handlers/tools/github/kanban-tools.ts +0 -153
- package/src/handlers/tools/github/milestone-tools.ts +0 -371
- package/src/handlers/tools/github/mutation-tools.ts +0 -17
- package/src/handlers/tools/github/read-tools.ts +0 -302
- package/src/handlers/tools/github/schemas.ts +0 -435
- package/src/handlers/tools/github.ts +0 -39
- package/src/handlers/tools/index.ts +0 -255
- package/src/handlers/tools/relationships.ts +0 -390
- package/src/handlers/tools/schemas.ts +0 -165
- package/src/handlers/tools/search.ts +0 -448
- package/src/handlers/tools/team/admin-tools.ts +0 -164
- package/src/handlers/tools/team/analytics-tools.ts +0 -233
- package/src/handlers/tools/team/backup-tools.ts +0 -83
- package/src/handlers/tools/team/core-tools.ts +0 -197
- package/src/handlers/tools/team/export-tools.ts +0 -130
- package/src/handlers/tools/team/helpers.ts +0 -66
- package/src/handlers/tools/team/index.ts +0 -45
- package/src/handlers/tools/team/relationship-tools.ts +0 -219
- package/src/handlers/tools/team/schemas.ts +0 -558
- package/src/handlers/tools/team/search-tools.ts +0 -145
- package/src/handlers/tools/team/vector-tools.ts +0 -261
- package/src/index.ts +0 -57
- package/src/server/mcp-server.ts +0 -446
- package/src/server/registration.ts +0 -141
- package/src/server/scheduler.ts +0 -283
- package/src/transports/http/handlers.ts +0 -78
- package/src/transports/http/index.ts +0 -8
- package/src/transports/http/security.ts +0 -147
- package/src/transports/http/server/index.ts +0 -397
- package/src/transports/http/server/legacy-sse.ts +0 -87
- package/src/transports/http/server/stateful.ts +0 -222
- package/src/transports/http/server/stateless.ts +0 -42
- package/src/transports/http/types.ts +0 -132
- package/src/types/entities.ts +0 -145
- package/src/types/error-types.ts +0 -92
- package/src/types/errors.ts +0 -200
- package/src/types/filtering.ts +0 -55
- package/src/types/github.ts +0 -216
- package/src/types/index.ts +0 -348
- package/src/utils/error-helpers.ts +0 -78
- package/src/utils/errors/error-response-fields.ts +0 -29
- package/src/utils/errors/suggestions.ts +0 -94
- package/src/utils/github-helpers.ts +0 -33
- package/src/utils/logger.ts +0 -107
- package/src/utils/mcp-logger.ts +0 -155
- package/src/utils/progress-utils.ts +0 -100
- package/src/utils/query-helpers.ts +0 -78
- package/src/utils/resource-annotations.ts +0 -75
- package/src/utils/security-utils.ts +0 -198
- package/src/utils/vector-index-helpers.ts +0 -24
- package/src/vector/vector-search-manager.ts +0 -409
- package/src/version.ts +0 -15
- package/test-server/README.md +0 -193
- package/test-server/code-map.md +0 -399
- package/test-server/test-agent-experience.md +0 -213
- package/test-server/test-filter-instructions.mjs +0 -295
- package/test-server/test-instruction-levels.mjs +0 -102
- package/test-server/test-preflight.md +0 -55
- package/test-server/test-prompts.mjs +0 -185
- package/test-server/test-scheduler.mjs +0 -174
- package/test-server/test-tool-annotations.mjs +0 -115
- package/test-server/test-tools-codemode.md +0 -632
- package/test-server/test-tools-codemode2.md +0 -1218
- package/test-server/test-tools-team.md +0 -215
- package/test-server/test-tools.md +0 -429
- package/test-server/test-tools2.md +0 -361
- package/test-server/test-tools3.md +0 -396
- package/test-server/tool-reference.md +0 -231
- package/tests/README.md +0 -54
- package/tests/auth/auth-context.test.ts +0 -162
- package/tests/auth/authorization-server-discovery.test.ts +0 -265
- package/tests/auth/errors.test.ts +0 -170
- package/tests/auth/middleware.test.ts +0 -585
- package/tests/auth/oauth-resource-server.test.ts +0 -173
- package/tests/auth/scope-map.test.ts +0 -66
- package/tests/auth/scopes.test.ts +0 -347
- package/tests/auth/token-validator.test.ts +0 -271
- package/tests/codemode/api.test.ts +0 -396
- package/tests/codemode/auto-return.test.ts +0 -167
- package/tests/codemode/codemode-tool-handlers.test.ts +0 -197
- package/tests/codemode/sandbox-factory.test.ts +0 -152
- package/tests/codemode/sandbox.test.ts +0 -190
- package/tests/codemode/security.test.ts +0 -242
- package/tests/codemode/worker-sandbox.test.ts +0 -106
- package/tests/constants/icons.test.ts +0 -101
- package/tests/constants/server-instructions.test.ts +0 -514
- package/tests/database/crud-workflow-branches.test.ts +0 -418
- package/tests/database/database-branches.test.ts +0 -132
- package/tests/database/entries-auth-branches.test.ts +0 -390
- package/tests/database/native-connection.test.ts +0 -249
- package/tests/database/shared-helpers.test.ts +0 -103
- package/tests/database/sqlite-adapter.bench.ts +0 -63
- package/tests/database/sqlite-adapter.test.ts +0 -690
- package/tests/database/tags.test.ts +0 -134
- package/tests/e2e/README.md +0 -39
- package/tests/e2e/auth.spec.ts +0 -106
- package/tests/e2e/codemode-abuse.spec.ts +0 -75
- package/tests/e2e/health.spec.ts +0 -63
- package/tests/e2e/helpers.ts +0 -139
- package/tests/e2e/oauth-discovery.spec.ts +0 -102
- package/tests/e2e/oauth-scopes.spec.ts +0 -222
- package/tests/e2e/payloads-admin.spec.ts +0 -76
- package/tests/e2e/payloads-analytics.spec.ts +0 -37
- package/tests/e2e/payloads-backup-restore.spec.ts +0 -102
- package/tests/e2e/payloads-backup.spec.ts +0 -44
- package/tests/e2e/payloads-codemode-api.spec.ts +0 -131
- package/tests/e2e/payloads-codemode-readonly.spec.ts +0 -116
- package/tests/e2e/payloads-codemode.spec.ts +0 -116
- package/tests/e2e/payloads-core.spec.ts +0 -82
- package/tests/e2e/payloads-error-contracts.spec.ts +0 -159
- package/tests/e2e/payloads-export.spec.ts +0 -46
- package/tests/e2e/payloads-github-degradation.spec.ts +0 -73
- package/tests/e2e/payloads-github.spec.ts +0 -176
- package/tests/e2e/payloads-relationships.spec.ts +0 -56
- package/tests/e2e/payloads-search.spec.ts +0 -64
- package/tests/e2e/payloads-team-happy.spec.ts +0 -231
- package/tests/e2e/payloads-team.spec.ts +0 -174
- package/tests/e2e/prompts-expanded.spec.ts +0 -137
- package/tests/e2e/prompts.spec.ts +0 -62
- package/tests/e2e/protocols.spec.ts +0 -134
- package/tests/e2e/rate-limiting.spec.ts +0 -291
- package/tests/e2e/resources-briefing-env.spec.ts +0 -106
- package/tests/e2e/resources-complete.spec.ts +0 -180
- package/tests/e2e/resources-expanded.spec.ts +0 -83
- package/tests/e2e/resources-instructions-levels.spec.ts +0 -145
- package/tests/e2e/resources-templates.spec.ts +0 -123
- package/tests/e2e/resources.spec.ts +0 -103
- package/tests/e2e/scheduler.spec.ts +0 -79
- package/tests/e2e/security.spec.ts +0 -112
- package/tests/e2e/session-advanced.spec.ts +0 -152
- package/tests/e2e/sessions.spec.ts +0 -95
- package/tests/e2e/stateless.spec.ts +0 -79
- package/tests/e2e/streaming.spec.ts +0 -176
- package/tests/e2e/tool-filtering-presets.spec.ts +0 -192
- package/tests/e2e/tool-filtering.spec.ts +0 -77
- package/tests/e2e/tools.spec.ts +0 -111
- package/tests/filtering/tool-filter.test.ts +0 -314
- package/tests/github/client-issues-errors.test.ts +0 -433
- package/tests/github/github-integration-branches.test.ts +0 -490
- package/tests/github/github-integration.test.ts +0 -1015
- package/tests/github/github-managers-branches.test.ts +0 -907
- package/tests/github/pull-requests.test.ts +0 -334
- package/tests/handlers/analytics-branches.test.ts +0 -222
- package/tests/handlers/backup-branches.test.ts +0 -270
- package/tests/handlers/briefing-context-section.test.ts +0 -388
- package/tests/handlers/briefing-github-section.test.ts +0 -392
- package/tests/handlers/briefing-user-message.test.ts +0 -405
- package/tests/handlers/codemode-tools.test.ts +0 -85
- package/tests/handlers/copilot-tools.test.ts +0 -126
- package/tests/handlers/error-path-coverage.test.ts +0 -324
- package/tests/handlers/export-tools.test.ts +0 -203
- package/tests/handlers/github-resource-handlers.test.ts +0 -929
- package/tests/handlers/github-tool-handlers.test.ts +0 -1452
- package/tests/handlers/handler-error-branches.test.ts +0 -346
- package/tests/handlers/help-resource.test.ts +0 -92
- package/tests/handlers/prompt-handler-coverage.test.ts +0 -108
- package/tests/handlers/prompt-handlers.test.ts +0 -131
- package/tests/handlers/resource-handler-coverage.test.ts +0 -281
- package/tests/handlers/resource-handlers.test.ts +0 -357
- package/tests/handlers/resource-prompt-branches.test.ts +0 -495
- package/tests/handlers/search-tool-handlers.test.ts +0 -379
- package/tests/handlers/targeted-gap-closure.test.ts +0 -387
- package/tests/handlers/team-admin.test.ts +0 -291
- package/tests/handlers/team-analytics.test.ts +0 -220
- package/tests/handlers/team-core.test.ts +0 -148
- package/tests/handlers/team-data.test.ts +0 -198
- package/tests/handlers/team-relationships.test.ts +0 -271
- package/tests/handlers/team-resource-handlers.test.ts +0 -161
- package/tests/handlers/team-search.test.ts +0 -134
- package/tests/handlers/team-tool-handlers.test.ts +0 -301
- package/tests/handlers/team-vector.test.ts +0 -213
- package/tests/handlers/template-github-branches.test.ts +0 -676
- package/tests/handlers/tool-annotations.test.ts +0 -90
- package/tests/handlers/tool-handler-coverage.test.ts +0 -514
- package/tests/handlers/tool-handlers.test.ts +0 -510
- package/tests/handlers/tool-output-schemas.test.ts +0 -116
- package/tests/handlers/vector-tool-handlers.test.ts +0 -238
- package/tests/security/sql-injection.test.ts +0 -284
- package/tests/server/mcp-server.bench.ts +0 -55
- package/tests/server/mcp-server.test.ts +0 -1326
- package/tests/server/scheduler.test.ts +0 -400
- package/tests/transports/http-legacy-sse.test.ts +0 -275
- package/tests/transports/http-security.test.ts +0 -322
- package/tests/transports/http-stateful.test.ts +0 -487
- package/tests/transports/http-transport-server.test.ts +0 -301
- package/tests/transports/http-transport.test.ts +0 -771
- package/tests/utils/github-helpers.test.ts +0 -58
- package/tests/utils/logger.test.ts +0 -180
- package/tests/utils/mcp-logger.test.ts +0 -211
- package/tests/utils/progress-utils.test.ts +0 -156
- package/tests/utils/query-helpers.test.ts +0 -80
- package/tests/utils/security-utils.test.ts +0 -82
- package/tests/vector/vector-search-branches.test.ts +0 -111
- package/tests/vector/vector-search-manager.test.ts +0 -375
- package/tests/vector/vector-search.bench.ts +0 -48
- package/tsconfig.json +0 -42
- package/tsup.config.ts +0 -19
- package/vitest.config.ts +0 -25
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp — OAuth Resource Server Unit Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for RFC 9728 Protected Resource Metadata.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect } from 'vitest'
|
|
8
|
-
import {
|
|
9
|
-
OAuthResourceServer,
|
|
10
|
-
createOAuthResourceServer,
|
|
11
|
-
} from '../../src/auth/oauth-resource-server.js'
|
|
12
|
-
|
|
13
|
-
describe('OAuthResourceServer', () => {
|
|
14
|
-
const config = {
|
|
15
|
-
resource: 'http://localhost:3000',
|
|
16
|
-
authorizationServers: ['https://auth.example.com'],
|
|
17
|
-
scopesSupported: ['read', 'write', 'admin'],
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
describe('construction', () => {
|
|
21
|
-
it('should create instance with config', () => {
|
|
22
|
-
const server = new OAuthResourceServer(config)
|
|
23
|
-
expect(server).toBeInstanceOf(OAuthResourceServer)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
it('should default bearerMethodsSupported to [header]', () => {
|
|
27
|
-
const server = new OAuthResourceServer(config)
|
|
28
|
-
const metadata = server.getMetadata()
|
|
29
|
-
expect(metadata.bearer_methods_supported).toEqual(['header'])
|
|
30
|
-
})
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
describe('createOAuthResourceServer factory', () => {
|
|
34
|
-
it('should create OAuthResourceServer instance', () => {
|
|
35
|
-
const server = createOAuthResourceServer(config)
|
|
36
|
-
expect(server).toBeInstanceOf(OAuthResourceServer)
|
|
37
|
-
})
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
describe('getMetadata', () => {
|
|
41
|
-
it('should return RFC 9728 compliant metadata', () => {
|
|
42
|
-
const server = new OAuthResourceServer(config)
|
|
43
|
-
const metadata = server.getMetadata()
|
|
44
|
-
|
|
45
|
-
expect(metadata.resource).toBe('http://localhost:3000')
|
|
46
|
-
expect(metadata.authorization_servers).toEqual(['https://auth.example.com'])
|
|
47
|
-
expect(metadata.scopes_supported).toEqual(['read', 'write', 'admin'])
|
|
48
|
-
expect(metadata.bearer_methods_supported).toEqual(['header'])
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('should include signing algorithms', () => {
|
|
52
|
-
const server = new OAuthResourceServer(config)
|
|
53
|
-
const metadata = server.getMetadata()
|
|
54
|
-
|
|
55
|
-
expect(metadata.resource_signing_alg_values_supported).toEqual(['RS256', 'ES256'])
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('should include documentation link', () => {
|
|
59
|
-
const server = new OAuthResourceServer(config)
|
|
60
|
-
const metadata = server.getMetadata()
|
|
61
|
-
|
|
62
|
-
expect(metadata.resource_documentation).toBe('http://localhost:3000/docs')
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('should cache metadata', () => {
|
|
66
|
-
const server = new OAuthResourceServer(config)
|
|
67
|
-
const metadata1 = server.getMetadata()
|
|
68
|
-
const metadata2 = server.getMetadata()
|
|
69
|
-
|
|
70
|
-
expect(metadata1).toBe(metadata2) // Same reference (cached)
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
describe('getWWWAuthenticateHeader', () => {
|
|
75
|
-
it('should return Bearer realm header', () => {
|
|
76
|
-
const server = new OAuthResourceServer(config)
|
|
77
|
-
const header = server.getWWWAuthenticateHeader()
|
|
78
|
-
expect(header).toContain('Bearer realm="http://localhost:3000"')
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('should include error when provided', () => {
|
|
82
|
-
const server = new OAuthResourceServer(config)
|
|
83
|
-
const header = server.getWWWAuthenticateHeader('invalid_token')
|
|
84
|
-
expect(header).toContain('error="invalid_token"')
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('should include error description when provided', () => {
|
|
88
|
-
const server = new OAuthResourceServer(config)
|
|
89
|
-
const header = server.getWWWAuthenticateHeader('invalid_token', 'Token has expired')
|
|
90
|
-
expect(header).toContain('error_description="Token has expired"')
|
|
91
|
-
})
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
describe('accessor methods', () => {
|
|
95
|
-
it('should return resource URI', () => {
|
|
96
|
-
const server = new OAuthResourceServer(config)
|
|
97
|
-
expect(server.getResourceUri()).toBe('http://localhost:3000')
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
it('should return authorization servers', () => {
|
|
101
|
-
const server = new OAuthResourceServer(config)
|
|
102
|
-
expect(server.getAuthorizationServers()).toEqual(['https://auth.example.com'])
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it('should return supported scopes', () => {
|
|
106
|
-
const server = new OAuthResourceServer(config)
|
|
107
|
-
expect(server.getSupportedScopes()).toEqual(['read', 'write', 'admin'])
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('should return well-known path', () => {
|
|
111
|
-
const server = new OAuthResourceServer(config)
|
|
112
|
-
expect(server.getWellKnownPath()).toBe('/.well-known/oauth-protected-resource')
|
|
113
|
-
})
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
describe('isScopeSupported', () => {
|
|
117
|
-
it('should return true for base scopes', () => {
|
|
118
|
-
const server = new OAuthResourceServer(config)
|
|
119
|
-
expect(server.isScopeSupported('read')).toBe(true)
|
|
120
|
-
expect(server.isScopeSupported('write')).toBe(true)
|
|
121
|
-
expect(server.isScopeSupported('admin')).toBe(true)
|
|
122
|
-
expect(server.isScopeSupported('full')).toBe(true)
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
it('should return false for unsupported scopes', () => {
|
|
126
|
-
const server = new OAuthResourceServer(config)
|
|
127
|
-
expect(server.isScopeSupported('unknown')).toBe(false)
|
|
128
|
-
})
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
describe('clearCache', () => {
|
|
132
|
-
it('should clear cached metadata', () => {
|
|
133
|
-
const server = new OAuthResourceServer(config)
|
|
134
|
-
const metadata1 = server.getMetadata()
|
|
135
|
-
server.clearCache()
|
|
136
|
-
const metadata2 = server.getMetadata()
|
|
137
|
-
|
|
138
|
-
// Different references after cache clear
|
|
139
|
-
expect(metadata1).not.toBe(metadata2)
|
|
140
|
-
// But same content
|
|
141
|
-
expect(metadata1).toEqual(metadata2)
|
|
142
|
-
})
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
describe('getMetadataHandler', () => {
|
|
146
|
-
it('should return a function', () => {
|
|
147
|
-
const server = new OAuthResourceServer(config)
|
|
148
|
-
const handler = server.getMetadataHandler()
|
|
149
|
-
expect(typeof handler).toBe('function')
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
it('should serve metadata with correct headers', () => {
|
|
153
|
-
const server = new OAuthResourceServer(config)
|
|
154
|
-
const handler = server.getMetadataHandler()
|
|
155
|
-
|
|
156
|
-
const mockReq = {} as any
|
|
157
|
-
const mockRes = {
|
|
158
|
-
setHeader: vi.fn(),
|
|
159
|
-
json: vi.fn(),
|
|
160
|
-
} as any
|
|
161
|
-
|
|
162
|
-
handler(mockReq, mockRes, vi.fn())
|
|
163
|
-
|
|
164
|
-
expect(mockRes.setHeader).toHaveBeenCalledWith('Content-Type', 'application/json')
|
|
165
|
-
expect(mockRes.setHeader).toHaveBeenCalledWith('Cache-Control', 'public, max-age=3600')
|
|
166
|
-
expect(mockRes.json).toHaveBeenCalled()
|
|
167
|
-
|
|
168
|
-
// Check that it sent the actual metadata
|
|
169
|
-
const metadata = mockRes.json.mock.calls[0][0]
|
|
170
|
-
expect(metadata.resource).toBe(config.resource)
|
|
171
|
-
})
|
|
172
|
-
})
|
|
173
|
-
})
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp — Scope Map Unit Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for the tool-to-scope reverse lookup.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect } from 'vitest'
|
|
8
|
-
import { getRequiredScope, getToolScopeMap } from '../../src/auth/scope-map.js'
|
|
9
|
-
import { TOOL_GROUPS } from '../../src/filtering/tool-filter.js'
|
|
10
|
-
import { TOOL_GROUP_SCOPES } from '../../src/auth/scopes.js'
|
|
11
|
-
import type { ToolGroup } from '../../src/types/index.js'
|
|
12
|
-
|
|
13
|
-
describe('scope-map', () => {
|
|
14
|
-
describe('getRequiredScope', () => {
|
|
15
|
-
it('should return read for core tools', () => {
|
|
16
|
-
const coreTools = TOOL_GROUPS['core']
|
|
17
|
-
if (coreTools && coreTools.length > 0) {
|
|
18
|
-
const firstTool = coreTools[0]!
|
|
19
|
-
expect(getRequiredScope(firstTool)).toBe('read')
|
|
20
|
-
}
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('should return write for github tools', () => {
|
|
24
|
-
const githubTools = TOOL_GROUPS['github']
|
|
25
|
-
if (githubTools && githubTools.length > 0) {
|
|
26
|
-
const firstTool = githubTools[0]!
|
|
27
|
-
expect(getRequiredScope(firstTool)).toBe('write')
|
|
28
|
-
}
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('should return admin for admin tools', () => {
|
|
32
|
-
const adminTools = TOOL_GROUPS['admin']
|
|
33
|
-
if (adminTools && adminTools.length > 0) {
|
|
34
|
-
const firstTool = adminTools[0]!
|
|
35
|
-
expect(getRequiredScope(firstTool)).toBe('admin')
|
|
36
|
-
}
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('should return read as safe default for unknown tools', () => {
|
|
40
|
-
expect(getRequiredScope('nonexistent_tool_xyz')).toBe('read')
|
|
41
|
-
})
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
describe('getToolScopeMap', () => {
|
|
45
|
-
it('should return a ReadonlyMap', () => {
|
|
46
|
-
const map = getToolScopeMap()
|
|
47
|
-
expect(map).toBeInstanceOf(Map)
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('should contain entries for every tool in TOOL_GROUPS', () => {
|
|
51
|
-
const map = getToolScopeMap()
|
|
52
|
-
|
|
53
|
-
for (const [group, tools] of Object.entries(TOOL_GROUPS)) {
|
|
54
|
-
const expectedScope = TOOL_GROUP_SCOPES[group as ToolGroup]
|
|
55
|
-
for (const tool of tools) {
|
|
56
|
-
expect(map.get(tool)).toBe(expectedScope)
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
it('should not be empty', () => {
|
|
62
|
-
const map = getToolScopeMap()
|
|
63
|
-
expect(map.size).toBeGreaterThan(0)
|
|
64
|
-
})
|
|
65
|
-
})
|
|
66
|
-
})
|
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp — OAuth Scopes Unit Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for scope definitions, hierarchy, and enforcement utilities.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect } from 'vitest'
|
|
8
|
-
import {
|
|
9
|
-
SCOPES,
|
|
10
|
-
parseScopes,
|
|
11
|
-
hasScope,
|
|
12
|
-
hasAnyScope,
|
|
13
|
-
hasAllScopes,
|
|
14
|
-
hasAdminScope,
|
|
15
|
-
hasWriteScope,
|
|
16
|
-
hasReadScope,
|
|
17
|
-
isValidScope,
|
|
18
|
-
getScopeForToolGroup,
|
|
19
|
-
getScopeDisplayName,
|
|
20
|
-
getRequiredScopeForGroup,
|
|
21
|
-
getAccessibleToolGroups,
|
|
22
|
-
getAccessibleTools,
|
|
23
|
-
TOOL_GROUP_SCOPES,
|
|
24
|
-
READ_SCOPE_GROUPS,
|
|
25
|
-
WRITE_SCOPE_GROUPS,
|
|
26
|
-
ADMIN_SCOPE_GROUPS,
|
|
27
|
-
} from '../../src/auth/scopes.js'
|
|
28
|
-
|
|
29
|
-
// =============================================================================
|
|
30
|
-
// parseScopes
|
|
31
|
-
// =============================================================================
|
|
32
|
-
|
|
33
|
-
describe('parseScopes', () => {
|
|
34
|
-
it('should parse space-delimited scope string', () => {
|
|
35
|
-
expect(parseScopes('read write admin')).toEqual(['read', 'write', 'admin'])
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
it('should return empty array for empty string', () => {
|
|
39
|
-
expect(parseScopes('')).toEqual([])
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
it('should handle single scope', () => {
|
|
43
|
-
expect(parseScopes('read')).toEqual(['read'])
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('should strip extra whitespace', () => {
|
|
47
|
-
expect(parseScopes(' read write ')).toEqual(['read', 'write'])
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
// =============================================================================
|
|
52
|
-
// hasScope (hierarchy: full ⊃ admin ⊃ write ⊃ read)
|
|
53
|
-
// =============================================================================
|
|
54
|
-
|
|
55
|
-
describe('hasScope', () => {
|
|
56
|
-
it('should return true for direct match', () => {
|
|
57
|
-
expect(hasScope(['read', 'write'], 'read')).toBe(true)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
it('should return false when scope not present', () => {
|
|
61
|
-
expect(hasScope(['read'], 'write')).toBe(false)
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it('should grant all scopes when full is present', () => {
|
|
65
|
-
expect(hasScope(['full'], 'read')).toBe(true)
|
|
66
|
-
expect(hasScope(['full'], 'write')).toBe(true)
|
|
67
|
-
expect(hasScope(['full'], 'admin')).toBe(true)
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
it('should grant read and write when admin is present', () => {
|
|
71
|
-
expect(hasScope(['admin'], 'read')).toBe(true)
|
|
72
|
-
expect(hasScope(['admin'], 'write')).toBe(true)
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
it('should NOT grant admin when only write is present', () => {
|
|
76
|
-
expect(hasScope(['write'], 'admin')).toBe(false)
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
it('should grant read when write is present', () => {
|
|
80
|
-
expect(hasScope(['write'], 'read')).toBe(true)
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('should NOT grant write when only read is present', () => {
|
|
84
|
-
expect(hasScope(['read'], 'write')).toBe(false)
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('should return false for empty scopes', () => {
|
|
88
|
-
expect(hasScope([], 'read')).toBe(false)
|
|
89
|
-
})
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
// =============================================================================
|
|
93
|
-
// hasAnyScope / hasAllScopes
|
|
94
|
-
// =============================================================================
|
|
95
|
-
|
|
96
|
-
describe('hasAnyScope', () => {
|
|
97
|
-
it('should return true if any scope matches', () => {
|
|
98
|
-
expect(hasAnyScope(['read'], ['read', 'write'])).toBe(true)
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
it('should return false if no scopes match', () => {
|
|
102
|
-
expect(hasAnyScope(['read'], ['write', 'admin'])).toBe(false)
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it('should handle hierarchy (full grants any)', () => {
|
|
106
|
-
expect(hasAnyScope(['full'], ['admin'])).toBe(true)
|
|
107
|
-
})
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
describe('hasAllScopes', () => {
|
|
111
|
-
it('should return true if all scopes match', () => {
|
|
112
|
-
expect(hasAllScopes(['read', 'write', 'admin'], ['read', 'write'])).toBe(true)
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
it('should return false if not all scopes match', () => {
|
|
116
|
-
expect(hasAllScopes(['read'], ['read', 'write'])).toBe(false)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('should respect hierarchy for all checks', () => {
|
|
120
|
-
expect(hasAllScopes(['full'], ['read', 'write', 'admin'])).toBe(true)
|
|
121
|
-
})
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
// =============================================================================
|
|
125
|
-
// Convenience scope checks
|
|
126
|
-
// =============================================================================
|
|
127
|
-
|
|
128
|
-
describe('hasAdminScope', () => {
|
|
129
|
-
it('should return true for admin', () => {
|
|
130
|
-
expect(hasAdminScope(['admin'])).toBe(true)
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
it('should return true for full (which includes admin)', () => {
|
|
134
|
-
expect(hasAdminScope(['full'])).toBe(true)
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
it('should return false for write/read only', () => {
|
|
138
|
-
expect(hasAdminScope(['write'])).toBe(false)
|
|
139
|
-
expect(hasAdminScope(['read'])).toBe(false)
|
|
140
|
-
})
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
describe('hasWriteScope', () => {
|
|
144
|
-
it('should return true for write', () => {
|
|
145
|
-
expect(hasWriteScope(['write'])).toBe(true)
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
it('should return true for admin (which includes write)', () => {
|
|
149
|
-
expect(hasWriteScope(['admin'])).toBe(true)
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
it('should return true for full', () => {
|
|
153
|
-
expect(hasWriteScope(['full'])).toBe(true)
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
it('should return false for read only', () => {
|
|
157
|
-
expect(hasWriteScope(['read'])).toBe(false)
|
|
158
|
-
})
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
describe('hasReadScope', () => {
|
|
162
|
-
it('should return true for read', () => {
|
|
163
|
-
expect(hasReadScope(['read'])).toBe(true)
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
it('should return true for write (which includes read)', () => {
|
|
167
|
-
expect(hasReadScope(['write'])).toBe(true)
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
it('should return true for full', () => {
|
|
171
|
-
expect(hasReadScope(['full'])).toBe(true)
|
|
172
|
-
})
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
// =============================================================================
|
|
176
|
-
// isValidScope
|
|
177
|
-
// =============================================================================
|
|
178
|
-
|
|
179
|
-
describe('isValidScope', () => {
|
|
180
|
-
it('should validate base scopes', () => {
|
|
181
|
-
expect(isValidScope('read')).toBe(true)
|
|
182
|
-
expect(isValidScope('write')).toBe(true)
|
|
183
|
-
expect(isValidScope('admin')).toBe(true)
|
|
184
|
-
expect(isValidScope('full')).toBe(true)
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
it('should reject invalid scopes', () => {
|
|
188
|
-
expect(isValidScope('unknown')).toBe(false)
|
|
189
|
-
expect(isValidScope('database:mydb')).toBe(false)
|
|
190
|
-
expect(isValidScope('db:mydb')).toBe(false)
|
|
191
|
-
})
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
// =============================================================================
|
|
195
|
-
// TOOL_GROUP_SCOPES & getScopeForToolGroup
|
|
196
|
-
// =============================================================================
|
|
197
|
-
|
|
198
|
-
describe('TOOL_GROUP_SCOPES', () => {
|
|
199
|
-
it('should map read-only groups to read', () => {
|
|
200
|
-
expect(TOOL_GROUP_SCOPES['core']).toBe(SCOPES.READ)
|
|
201
|
-
expect(TOOL_GROUP_SCOPES['search']).toBe(SCOPES.READ)
|
|
202
|
-
expect(TOOL_GROUP_SCOPES['analytics']).toBe(SCOPES.READ)
|
|
203
|
-
expect(TOOL_GROUP_SCOPES['relationships']).toBe(SCOPES.READ)
|
|
204
|
-
expect(TOOL_GROUP_SCOPES['export']).toBe(SCOPES.READ)
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
it('should map write groups to write', () => {
|
|
208
|
-
expect(TOOL_GROUP_SCOPES['github']).toBe(SCOPES.WRITE)
|
|
209
|
-
expect(TOOL_GROUP_SCOPES['team']).toBe(SCOPES.WRITE)
|
|
210
|
-
})
|
|
211
|
-
|
|
212
|
-
it('should map admin groups to admin', () => {
|
|
213
|
-
expect(TOOL_GROUP_SCOPES['admin']).toBe(SCOPES.ADMIN)
|
|
214
|
-
expect(TOOL_GROUP_SCOPES['backup']).toBe(SCOPES.ADMIN)
|
|
215
|
-
expect(TOOL_GROUP_SCOPES['codemode']).toBe(SCOPES.ADMIN)
|
|
216
|
-
})
|
|
217
|
-
})
|
|
218
|
-
|
|
219
|
-
describe('getScopeForToolGroup', () => {
|
|
220
|
-
it('should return correct scope for each group', () => {
|
|
221
|
-
expect(getScopeForToolGroup('core')).toBe('read')
|
|
222
|
-
expect(getScopeForToolGroup('github')).toBe('write')
|
|
223
|
-
expect(getScopeForToolGroup('admin')).toBe('admin')
|
|
224
|
-
})
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
// =============================================================================
|
|
228
|
-
// Derived group arrays
|
|
229
|
-
// =============================================================================
|
|
230
|
-
|
|
231
|
-
describe('scope group arrays', () => {
|
|
232
|
-
it('READ_SCOPE_GROUPS should contain only read groups', () => {
|
|
233
|
-
expect(READ_SCOPE_GROUPS).toContain('core')
|
|
234
|
-
expect(READ_SCOPE_GROUPS).toContain('search')
|
|
235
|
-
expect(READ_SCOPE_GROUPS).not.toContain('github')
|
|
236
|
-
expect(READ_SCOPE_GROUPS).not.toContain('admin')
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
it('WRITE_SCOPE_GROUPS should contain read + write groups', () => {
|
|
240
|
-
expect(WRITE_SCOPE_GROUPS).toContain('core')
|
|
241
|
-
expect(WRITE_SCOPE_GROUPS).toContain('github')
|
|
242
|
-
expect(WRITE_SCOPE_GROUPS).toContain('team')
|
|
243
|
-
expect(WRITE_SCOPE_GROUPS).not.toContain('admin')
|
|
244
|
-
})
|
|
245
|
-
|
|
246
|
-
it('ADMIN_SCOPE_GROUPS should contain all groups', () => {
|
|
247
|
-
expect(ADMIN_SCOPE_GROUPS).toContain('core')
|
|
248
|
-
expect(ADMIN_SCOPE_GROUPS).toContain('github')
|
|
249
|
-
expect(ADMIN_SCOPE_GROUPS).toContain('admin')
|
|
250
|
-
expect(ADMIN_SCOPE_GROUPS).toContain('codemode')
|
|
251
|
-
})
|
|
252
|
-
})
|
|
253
|
-
|
|
254
|
-
// =============================================================================
|
|
255
|
-
// getRequiredScopeForGroup / getAccessibleToolGroups
|
|
256
|
-
// =============================================================================
|
|
257
|
-
|
|
258
|
-
describe('getRequiredScopeForGroup', () => {
|
|
259
|
-
it('should return read for read-only groups', () => {
|
|
260
|
-
expect(getRequiredScopeForGroup('core')).toBe('read')
|
|
261
|
-
})
|
|
262
|
-
|
|
263
|
-
it('should return write for write groups', () => {
|
|
264
|
-
expect(getRequiredScopeForGroup('github')).toBe('write')
|
|
265
|
-
})
|
|
266
|
-
|
|
267
|
-
it('should return admin for admin groups', () => {
|
|
268
|
-
expect(getRequiredScopeForGroup('admin')).toBe('admin')
|
|
269
|
-
expect(getRequiredScopeForGroup('codemode')).toBe('admin')
|
|
270
|
-
})
|
|
271
|
-
})
|
|
272
|
-
|
|
273
|
-
describe('getAccessibleToolGroups', () => {
|
|
274
|
-
it('should return all groups for full scope', () => {
|
|
275
|
-
const groups = getAccessibleToolGroups(['full'])
|
|
276
|
-
expect(groups).toContain('admin')
|
|
277
|
-
expect(groups).toContain('core')
|
|
278
|
-
expect(groups).toContain('codemode')
|
|
279
|
-
})
|
|
280
|
-
|
|
281
|
-
it('should return all groups for admin scope', () => {
|
|
282
|
-
const groups = getAccessibleToolGroups(['admin'])
|
|
283
|
-
expect(groups).toContain('admin')
|
|
284
|
-
expect(groups).toContain('github')
|
|
285
|
-
expect(groups).toContain('core')
|
|
286
|
-
})
|
|
287
|
-
|
|
288
|
-
it('should return write+read groups for write scope', () => {
|
|
289
|
-
const groups = getAccessibleToolGroups(['write'])
|
|
290
|
-
expect(groups).toContain('core')
|
|
291
|
-
expect(groups).toContain('github')
|
|
292
|
-
expect(groups).not.toContain('admin')
|
|
293
|
-
})
|
|
294
|
-
|
|
295
|
-
it('should return read groups for read scope', () => {
|
|
296
|
-
const groups = getAccessibleToolGroups(['read'])
|
|
297
|
-
expect(groups).toContain('core')
|
|
298
|
-
expect(groups).not.toContain('github')
|
|
299
|
-
expect(groups).not.toContain('admin')
|
|
300
|
-
})
|
|
301
|
-
|
|
302
|
-
it('should return empty for no scopes', () => {
|
|
303
|
-
expect(getAccessibleToolGroups([])).toEqual([])
|
|
304
|
-
})
|
|
305
|
-
})
|
|
306
|
-
|
|
307
|
-
// =============================================================================
|
|
308
|
-
// getAccessibleTools
|
|
309
|
-
// =============================================================================
|
|
310
|
-
|
|
311
|
-
describe('getAccessibleTools', () => {
|
|
312
|
-
it('should return tools for accessible groups', () => {
|
|
313
|
-
const tools = getAccessibleTools(['read'])
|
|
314
|
-
expect(tools.length).toBeGreaterThan(0)
|
|
315
|
-
// Should include core tools
|
|
316
|
-
expect(tools).toContain('create_entry')
|
|
317
|
-
})
|
|
318
|
-
|
|
319
|
-
it('should return all tools for full scope', () => {
|
|
320
|
-
const tools = getAccessibleTools(['full'])
|
|
321
|
-
expect(tools).toContain('create_entry') // core
|
|
322
|
-
expect(tools).toContain('mj_execute_code') // codemode
|
|
323
|
-
})
|
|
324
|
-
|
|
325
|
-
it('should deduplicate tools', () => {
|
|
326
|
-
const tools = getAccessibleTools(['full'])
|
|
327
|
-
const uniqueTools = [...new Set(tools)]
|
|
328
|
-
expect(tools.length).toBe(uniqueTools.length)
|
|
329
|
-
})
|
|
330
|
-
})
|
|
331
|
-
|
|
332
|
-
// =============================================================================
|
|
333
|
-
// getScopeDisplayName
|
|
334
|
-
// =============================================================================
|
|
335
|
-
|
|
336
|
-
describe('getScopeDisplayName', () => {
|
|
337
|
-
it('should return display names for standard scopes', () => {
|
|
338
|
-
expect(getScopeDisplayName('read')).toBe('Read Only')
|
|
339
|
-
expect(getScopeDisplayName('write')).toBe('Read/Write')
|
|
340
|
-
expect(getScopeDisplayName('admin')).toBe('Administrative')
|
|
341
|
-
expect(getScopeDisplayName('full')).toBe('Full Access')
|
|
342
|
-
})
|
|
343
|
-
|
|
344
|
-
it('should return unknown scopes as-is', () => {
|
|
345
|
-
expect(getScopeDisplayName('custom_scope')).toBe('custom_scope')
|
|
346
|
-
})
|
|
347
|
-
})
|