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,291 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E Tests: Rate Limiting
|
|
3
|
-
*
|
|
4
|
-
* Tests the built-in rate limiter by launching a server with a very
|
|
5
|
-
* low rate limit and verifying 429 behavior, Retry-After headers,
|
|
6
|
-
* and health endpoint exemption.
|
|
7
|
-
*
|
|
8
|
-
* Uses a dedicated server on port 3103 with MCP_RATE_LIMIT_MAX=5.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { test, expect } from '@playwright/test'
|
|
12
|
-
import { startServer, stopServer } from './helpers.js'
|
|
13
|
-
|
|
14
|
-
const RATE_PORT = 3103
|
|
15
|
-
const RATE_BASE = `http://localhost:${RATE_PORT}`
|
|
16
|
-
|
|
17
|
-
test.describe('Rate Limiting', () => {
|
|
18
|
-
test.beforeAll(async () => {
|
|
19
|
-
await startServer(RATE_PORT, [], 'rate-limit')
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
test.afterAll(() => {
|
|
23
|
-
stopServer(RATE_PORT)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
test('should return 429 after exceeding rate limit', async () => {
|
|
27
|
-
// The server on this port uses the default env MCP_RATE_LIMIT_MAX=10000.
|
|
28
|
-
// We need to override it. Since startServer doesn't pass MCP_RATE_LIMIT_MAX
|
|
29
|
-
// for rate limit tests (checked in the helper), we use direct fetch with
|
|
30
|
-
// a tight burst.
|
|
31
|
-
|
|
32
|
-
// Actually, let's stop the default server and start one with low limit
|
|
33
|
-
stopServer(RATE_PORT)
|
|
34
|
-
|
|
35
|
-
// Start with explicit low rate limit via env override
|
|
36
|
-
const { spawn } = await import('node:child_process')
|
|
37
|
-
const { setTimeout: delay } = await import('node:timers/promises')
|
|
38
|
-
|
|
39
|
-
const serverProcess = spawn(
|
|
40
|
-
'node',
|
|
41
|
-
[
|
|
42
|
-
'dist/cli.js',
|
|
43
|
-
'--transport',
|
|
44
|
-
'http',
|
|
45
|
-
'--port',
|
|
46
|
-
String(RATE_PORT),
|
|
47
|
-
'--db',
|
|
48
|
-
'./.test-output/e2e/test-e2e-rate-limit.db',
|
|
49
|
-
],
|
|
50
|
-
{
|
|
51
|
-
cwd: process.cwd(),
|
|
52
|
-
stdio: 'pipe',
|
|
53
|
-
env: {
|
|
54
|
-
...process.env,
|
|
55
|
-
MCP_RATE_LIMIT_MAX: '5',
|
|
56
|
-
},
|
|
57
|
-
}
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
// Wait for server to start
|
|
61
|
-
for (let i = 0; i < 30; i++) {
|
|
62
|
-
try {
|
|
63
|
-
const res = await fetch(`${RATE_BASE}/health`)
|
|
64
|
-
if (res.ok) break
|
|
65
|
-
} catch {
|
|
66
|
-
// Not ready
|
|
67
|
-
}
|
|
68
|
-
await delay(500)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
// Send 5 requests (within limit)
|
|
73
|
-
for (let i = 0; i < 5; i++) {
|
|
74
|
-
const res = await fetch(`${RATE_BASE}/mcp`, {
|
|
75
|
-
method: 'POST',
|
|
76
|
-
headers: {
|
|
77
|
-
'Content-Type': 'application/json',
|
|
78
|
-
Accept: 'application/json, text/event-stream',
|
|
79
|
-
},
|
|
80
|
-
body: JSON.stringify({
|
|
81
|
-
jsonrpc: '2.0',
|
|
82
|
-
id: i + 1,
|
|
83
|
-
method: 'initialize',
|
|
84
|
-
params: {
|
|
85
|
-
protocolVersion: '2025-03-26',
|
|
86
|
-
capabilities: {},
|
|
87
|
-
clientInfo: { name: 'rate-test', version: '1.0' },
|
|
88
|
-
},
|
|
89
|
-
}),
|
|
90
|
-
})
|
|
91
|
-
// These should succeed (200 or 400 for non-init, but not 429)
|
|
92
|
-
expect(res.status).not.toBe(429)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// 6th request should be rate-limited
|
|
96
|
-
const limitedResponse = await fetch(`${RATE_BASE}/mcp`, {
|
|
97
|
-
method: 'POST',
|
|
98
|
-
headers: {
|
|
99
|
-
'Content-Type': 'application/json',
|
|
100
|
-
Accept: 'application/json, text/event-stream',
|
|
101
|
-
},
|
|
102
|
-
body: JSON.stringify({
|
|
103
|
-
jsonrpc: '2.0',
|
|
104
|
-
id: 99,
|
|
105
|
-
method: 'initialize',
|
|
106
|
-
params: {
|
|
107
|
-
protocolVersion: '2025-03-26',
|
|
108
|
-
capabilities: {},
|
|
109
|
-
clientInfo: { name: 'rate-test', version: '1.0' },
|
|
110
|
-
},
|
|
111
|
-
}),
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
expect(limitedResponse.status).toBe(429)
|
|
115
|
-
} finally {
|
|
116
|
-
serverProcess.kill('SIGTERM')
|
|
117
|
-
}
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
test('should include Retry-After header on 429', async () => {
|
|
121
|
-
const { spawn } = await import('node:child_process')
|
|
122
|
-
const { setTimeout: delay } = await import('node:timers/promises')
|
|
123
|
-
|
|
124
|
-
const serverProcess = spawn(
|
|
125
|
-
'node',
|
|
126
|
-
[
|
|
127
|
-
'dist/cli.js',
|
|
128
|
-
'--transport',
|
|
129
|
-
'http',
|
|
130
|
-
'--port',
|
|
131
|
-
String(RATE_PORT),
|
|
132
|
-
'--db',
|
|
133
|
-
'./.test-output/e2e/test-e2e-rate-retry.db',
|
|
134
|
-
],
|
|
135
|
-
{
|
|
136
|
-
cwd: process.cwd(),
|
|
137
|
-
stdio: 'pipe',
|
|
138
|
-
env: {
|
|
139
|
-
...process.env,
|
|
140
|
-
MCP_RATE_LIMIT_MAX: '3',
|
|
141
|
-
},
|
|
142
|
-
}
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
for (let i = 0; i < 30; i++) {
|
|
146
|
-
try {
|
|
147
|
-
const res = await fetch(`${RATE_BASE}/health`)
|
|
148
|
-
if (res.ok) break
|
|
149
|
-
} catch {
|
|
150
|
-
// Not ready
|
|
151
|
-
}
|
|
152
|
-
await delay(500)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
try {
|
|
156
|
-
// Exhaust the limit
|
|
157
|
-
for (let i = 0; i < 3; i++) {
|
|
158
|
-
await fetch(`${RATE_BASE}/mcp`, {
|
|
159
|
-
method: 'POST',
|
|
160
|
-
headers: {
|
|
161
|
-
'Content-Type': 'application/json',
|
|
162
|
-
Accept: 'application/json, text/event-stream',
|
|
163
|
-
},
|
|
164
|
-
body: JSON.stringify({
|
|
165
|
-
jsonrpc: '2.0',
|
|
166
|
-
id: i + 1,
|
|
167
|
-
method: 'initialize',
|
|
168
|
-
params: {
|
|
169
|
-
protocolVersion: '2025-03-26',
|
|
170
|
-
capabilities: {},
|
|
171
|
-
clientInfo: { name: 'retry-test', version: '1.0' },
|
|
172
|
-
},
|
|
173
|
-
}),
|
|
174
|
-
})
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Next request should be 429 with Retry-After
|
|
178
|
-
const response = await fetch(`${RATE_BASE}/mcp`, {
|
|
179
|
-
method: 'POST',
|
|
180
|
-
headers: {
|
|
181
|
-
'Content-Type': 'application/json',
|
|
182
|
-
Accept: 'application/json, text/event-stream',
|
|
183
|
-
},
|
|
184
|
-
body: JSON.stringify({
|
|
185
|
-
jsonrpc: '2.0',
|
|
186
|
-
id: 99,
|
|
187
|
-
method: 'initialize',
|
|
188
|
-
params: {
|
|
189
|
-
protocolVersion: '2025-03-26',
|
|
190
|
-
capabilities: {},
|
|
191
|
-
clientInfo: { name: 'retry-test', version: '1.0' },
|
|
192
|
-
},
|
|
193
|
-
}),
|
|
194
|
-
})
|
|
195
|
-
|
|
196
|
-
expect(response.status).toBe(429)
|
|
197
|
-
const retryAfter = response.headers.get('retry-after')
|
|
198
|
-
expect(retryAfter).toBeDefined()
|
|
199
|
-
expect(Number(retryAfter)).toBeGreaterThan(0)
|
|
200
|
-
} finally {
|
|
201
|
-
serverProcess.kill('SIGTERM')
|
|
202
|
-
}
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
test('should exempt /health from rate limiting', async () => {
|
|
206
|
-
const { spawn } = await import('node:child_process')
|
|
207
|
-
const { setTimeout: delay } = await import('node:timers/promises')
|
|
208
|
-
|
|
209
|
-
const serverProcess = spawn(
|
|
210
|
-
'node',
|
|
211
|
-
[
|
|
212
|
-
'dist/cli.js',
|
|
213
|
-
'--transport',
|
|
214
|
-
'http',
|
|
215
|
-
'--port',
|
|
216
|
-
String(RATE_PORT),
|
|
217
|
-
'--db',
|
|
218
|
-
'./.test-output/e2e/test-e2e-rate-health.db',
|
|
219
|
-
],
|
|
220
|
-
{
|
|
221
|
-
cwd: process.cwd(),
|
|
222
|
-
stdio: 'pipe',
|
|
223
|
-
env: {
|
|
224
|
-
...process.env,
|
|
225
|
-
MCP_RATE_LIMIT_MAX: '2',
|
|
226
|
-
},
|
|
227
|
-
}
|
|
228
|
-
)
|
|
229
|
-
|
|
230
|
-
for (let i = 0; i < 30; i++) {
|
|
231
|
-
try {
|
|
232
|
-
const res = await fetch(`${RATE_BASE}/health`)
|
|
233
|
-
if (res.ok) break
|
|
234
|
-
} catch {
|
|
235
|
-
// Not ready
|
|
236
|
-
}
|
|
237
|
-
await delay(500)
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
try {
|
|
241
|
-
// Exhaust rate limit
|
|
242
|
-
for (let i = 0; i < 2; i++) {
|
|
243
|
-
await fetch(`${RATE_BASE}/mcp`, {
|
|
244
|
-
method: 'POST',
|
|
245
|
-
headers: {
|
|
246
|
-
'Content-Type': 'application/json',
|
|
247
|
-
Accept: 'application/json, text/event-stream',
|
|
248
|
-
},
|
|
249
|
-
body: JSON.stringify({
|
|
250
|
-
jsonrpc: '2.0',
|
|
251
|
-
id: i + 1,
|
|
252
|
-
method: 'initialize',
|
|
253
|
-
params: {
|
|
254
|
-
protocolVersion: '2025-03-26',
|
|
255
|
-
capabilities: {},
|
|
256
|
-
clientInfo: { name: 'health-test', version: '1.0' },
|
|
257
|
-
},
|
|
258
|
-
}),
|
|
259
|
-
})
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// /health should still work
|
|
263
|
-
const healthResponse = await fetch(`${RATE_BASE}/health`)
|
|
264
|
-
expect(healthResponse.status).toBe(200)
|
|
265
|
-
const body = await healthResponse.json()
|
|
266
|
-
expect(body).toHaveProperty('status', 'healthy')
|
|
267
|
-
|
|
268
|
-
// But /mcp should be 429
|
|
269
|
-
const mcpResponse = await fetch(`${RATE_BASE}/mcp`, {
|
|
270
|
-
method: 'POST',
|
|
271
|
-
headers: {
|
|
272
|
-
'Content-Type': 'application/json',
|
|
273
|
-
Accept: 'application/json, text/event-stream',
|
|
274
|
-
},
|
|
275
|
-
body: JSON.stringify({
|
|
276
|
-
jsonrpc: '2.0',
|
|
277
|
-
id: 99,
|
|
278
|
-
method: 'initialize',
|
|
279
|
-
params: {
|
|
280
|
-
protocolVersion: '2025-03-26',
|
|
281
|
-
capabilities: {},
|
|
282
|
-
clientInfo: { name: 'health-test', version: '1.0' },
|
|
283
|
-
},
|
|
284
|
-
}),
|
|
285
|
-
})
|
|
286
|
-
expect(mcpResponse.status).toBe(429)
|
|
287
|
-
} finally {
|
|
288
|
-
serverProcess.kill('SIGTERM')
|
|
289
|
-
}
|
|
290
|
-
})
|
|
291
|
-
})
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E Tests: Briefing Environment Variable Overrides
|
|
3
|
-
*
|
|
4
|
-
* Verifies that the memory://briefing template actually responds
|
|
5
|
-
* to environment configurations like BRIEFING_ENTRY_COUNT,
|
|
6
|
-
* BRIEFING_INCLUDE_TEAM, etc.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { test, expect } from '@playwright/test'
|
|
10
|
-
import type { Client } from '@modelcontextprotocol/sdk/client/index.js'
|
|
11
|
-
import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js'
|
|
12
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'
|
|
13
|
-
import { spawn, type ChildProcess } from 'node:child_process'
|
|
14
|
-
import { setTimeout as delay } from 'node:timers/promises'
|
|
15
|
-
|
|
16
|
-
const BRIEFING_PORT = 3112
|
|
17
|
-
const BRIEFING_BASE = `http://localhost:${BRIEFING_PORT}`
|
|
18
|
-
|
|
19
|
-
test.describe.configure({ mode: 'serial' })
|
|
20
|
-
|
|
21
|
-
test.describe('Resources: Briefing Environment Configurations', () => {
|
|
22
|
-
let client: Client
|
|
23
|
-
let serverProcess: ChildProcess
|
|
24
|
-
|
|
25
|
-
test.beforeAll(async () => {
|
|
26
|
-
// Start server with specific config and team db
|
|
27
|
-
serverProcess = spawn(
|
|
28
|
-
'node',
|
|
29
|
-
[
|
|
30
|
-
'dist/cli.js',
|
|
31
|
-
'--transport',
|
|
32
|
-
'http',
|
|
33
|
-
'--port',
|
|
34
|
-
String(BRIEFING_PORT),
|
|
35
|
-
'--db',
|
|
36
|
-
'./.test-output/e2e/test-briefing.db',
|
|
37
|
-
],
|
|
38
|
-
{
|
|
39
|
-
cwd: process.cwd(),
|
|
40
|
-
stdio: 'pipe',
|
|
41
|
-
env: {
|
|
42
|
-
...process.env,
|
|
43
|
-
MCP_RATE_LIMIT_MAX: '10000',
|
|
44
|
-
BRIEFING_ENTRY_COUNT: '2', // Only 2 entries max
|
|
45
|
-
BRIEFING_INCLUDE_TEAM: 'true', // Force inclusion
|
|
46
|
-
BRIEFING_COPILOT_REVIEWS: 'true', // Adds copilot block
|
|
47
|
-
TEAM_DB_PATH: './.test-output/e2e/test-briefing-team.db',
|
|
48
|
-
},
|
|
49
|
-
}
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
for (let i = 0; i < 30; i++) {
|
|
53
|
-
try {
|
|
54
|
-
const res = await fetch(`${BRIEFING_BASE}/health`)
|
|
55
|
-
if (res.ok) break
|
|
56
|
-
} catch {}
|
|
57
|
-
await delay(500)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const transport = new StreamableHTTPClientTransport(new URL(`${BRIEFING_BASE}/mcp`))
|
|
61
|
-
client = new McpClient({ name: 'briefing-test', version: '1.0' }, { capabilities: {} })
|
|
62
|
-
await client.connect(transport)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
test.afterAll(async () => {
|
|
66
|
-
if (client) {
|
|
67
|
-
await client.close()
|
|
68
|
-
}
|
|
69
|
-
if (serverProcess) {
|
|
70
|
-
serverProcess.kill('SIGTERM')
|
|
71
|
-
}
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
test('memory://briefing dynamically generates based on ENV limits', async () => {
|
|
75
|
-
// Create 3 entries to exceed the limit of 2
|
|
76
|
-
for (let i = 1; i <= 3; i++) {
|
|
77
|
-
const resp = await client.callTool({
|
|
78
|
-
name: 'create_entry',
|
|
79
|
-
arguments: { content: `Briefing test code ${i}`, entry_type: 'test_entry' },
|
|
80
|
-
})
|
|
81
|
-
expect(resp.isError).toBeUndefined()
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Also create a team entry to test inclusion
|
|
85
|
-
const t_resp = await client.callTool({
|
|
86
|
-
name: 'team_create_entry',
|
|
87
|
-
arguments: { content: 'Team insight', entry_type: 'test_entry' },
|
|
88
|
-
})
|
|
89
|
-
expect(t_resp.isError).toBeUndefined()
|
|
90
|
-
|
|
91
|
-
const response = await client.readResource({ uri: 'memory://briefing' })
|
|
92
|
-
|
|
93
|
-
expect(response.contents).toBeDefined()
|
|
94
|
-
const contentText = response.contents[0]!.text as string
|
|
95
|
-
|
|
96
|
-
// The briefing resource yields JSON format
|
|
97
|
-
const briefingObj = JSON.parse(contentText)
|
|
98
|
-
|
|
99
|
-
// Assert entry limit of 2 is respected
|
|
100
|
-
expect(briefingObj.journal.latestEntries.length).toBe(2)
|
|
101
|
-
// Assert team block is populated
|
|
102
|
-
expect(briefingObj.teamContext).toBeDefined()
|
|
103
|
-
expect(briefingObj.teamLatestEntries.length).toBeGreaterThan(0)
|
|
104
|
-
expect(briefingObj.teamLatestEntries[0].preview).toContain('insight')
|
|
105
|
-
})
|
|
106
|
-
})
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E Tests: Complete Resource Coverage
|
|
3
|
-
*
|
|
4
|
-
* Tests 13 resources not covered by resources.spec.ts or resources-expanded.spec.ts:
|
|
5
|
-
* help (index + per-group + gotchas), rules, workflows, skills,
|
|
6
|
-
* github (status, insights, milestones), graph/actions, actions/recent,
|
|
7
|
-
* and team (recent, statistics).
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { test, expect } from '@playwright/test'
|
|
11
|
-
import { createClient } from './helpers.js'
|
|
12
|
-
import type { Client } from '@modelcontextprotocol/sdk/client/index.js'
|
|
13
|
-
|
|
14
|
-
test.describe.configure({ mode: 'serial' })
|
|
15
|
-
|
|
16
|
-
test.describe('E2E Resource Reads: Complete Coverage', () => {
|
|
17
|
-
let client: Client
|
|
18
|
-
|
|
19
|
-
test.beforeAll(async () => {
|
|
20
|
-
client = await createClient()
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
test.afterAll(async () => {
|
|
24
|
-
await client.close()
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
// --- Help resources ---
|
|
28
|
-
test('should read memory://help (tool group index)', async () => {
|
|
29
|
-
const response = await client.readResource({ uri: 'memory://help' })
|
|
30
|
-
|
|
31
|
-
expect(response.contents).toBeDefined()
|
|
32
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
33
|
-
|
|
34
|
-
const text = response.contents[0]!.text as string
|
|
35
|
-
const parsed = JSON.parse(text)
|
|
36
|
-
expect(parsed).toHaveProperty('groups')
|
|
37
|
-
expect(Array.isArray(parsed.groups)).toBe(true)
|
|
38
|
-
expect(parsed.groups.length).toBeGreaterThanOrEqual(10)
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
test('should read memory://help/core (per-group tool details)', async () => {
|
|
42
|
-
const response = await client.readResource({ uri: 'memory://help/core' })
|
|
43
|
-
|
|
44
|
-
expect(response.contents).toBeDefined()
|
|
45
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
46
|
-
|
|
47
|
-
const text = response.contents[0]!.text as string
|
|
48
|
-
const parsed = JSON.parse(text)
|
|
49
|
-
expect(parsed).toHaveProperty('group', 'core')
|
|
50
|
-
expect(parsed).toHaveProperty('tools')
|
|
51
|
-
expect(Array.isArray(parsed.tools)).toBe(true)
|
|
52
|
-
expect(parsed.tools.length).toBeGreaterThanOrEqual(5)
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
test('should read memory://help/gotchas (field notes)', async () => {
|
|
56
|
-
const response = await client.readResource({ uri: 'memory://help/gotchas' })
|
|
57
|
-
|
|
58
|
-
expect(response.contents).toBeDefined()
|
|
59
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
60
|
-
|
|
61
|
-
const text = response.contents[0]!.text as string
|
|
62
|
-
// Gotchas content should be a non-trivial text block
|
|
63
|
-
expect(text.length).toBeGreaterThan(50)
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
// --- Configuration-dependent resources (unconfigured in test env) ---
|
|
67
|
-
test('should read memory://rules (unconfigured)', async () => {
|
|
68
|
-
const response = await client.readResource({ uri: 'memory://rules' })
|
|
69
|
-
|
|
70
|
-
expect(response.contents).toBeDefined()
|
|
71
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
72
|
-
|
|
73
|
-
const text = response.contents[0]!.text as string
|
|
74
|
-
const parsed = JSON.parse(text)
|
|
75
|
-
expect(parsed).toHaveProperty('configured', false)
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
test('should read memory://workflows (unconfigured)', async () => {
|
|
79
|
-
const response = await client.readResource({ uri: 'memory://workflows' })
|
|
80
|
-
|
|
81
|
-
expect(response.contents).toBeDefined()
|
|
82
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
83
|
-
|
|
84
|
-
const text = response.contents[0]!.text as string
|
|
85
|
-
const parsed = JSON.parse(text)
|
|
86
|
-
expect(parsed).toHaveProperty('configured', false)
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
test('should read memory://skills (unconfigured)', async () => {
|
|
90
|
-
const response = await client.readResource({ uri: 'memory://skills' })
|
|
91
|
-
|
|
92
|
-
expect(response.contents).toBeDefined()
|
|
93
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
94
|
-
|
|
95
|
-
const text = response.contents[0]!.text as string
|
|
96
|
-
const parsed = JSON.parse(text)
|
|
97
|
-
// Without SKILLS_DIR_PATH, should return { configured: false } or empty skills
|
|
98
|
-
expect(typeof parsed).toBe('object')
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
// --- GitHub resources (no token in test env) ---
|
|
102
|
-
test('should read memory://github/status', async () => {
|
|
103
|
-
const response = await client.readResource({ uri: 'memory://github/status' })
|
|
104
|
-
|
|
105
|
-
expect(response.contents).toBeDefined()
|
|
106
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
107
|
-
|
|
108
|
-
const text = response.contents[0]!.text as string
|
|
109
|
-
// May return error or partial data without token — either is valid
|
|
110
|
-
expect(typeof text).toBe('string')
|
|
111
|
-
expect(text.length).toBeGreaterThan(0)
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
test('should read memory://github/insights', async () => {
|
|
115
|
-
const response = await client.readResource({ uri: 'memory://github/insights' })
|
|
116
|
-
|
|
117
|
-
expect(response.contents).toBeDefined()
|
|
118
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
119
|
-
|
|
120
|
-
const text = response.contents[0]!.text as string
|
|
121
|
-
expect(typeof text).toBe('string')
|
|
122
|
-
expect(text.length).toBeGreaterThan(0)
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
test('should read memory://github/milestones', async () => {
|
|
126
|
-
const response = await client.readResource({ uri: 'memory://github/milestones' })
|
|
127
|
-
|
|
128
|
-
expect(response.contents).toBeDefined()
|
|
129
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
130
|
-
|
|
131
|
-
const text = response.contents[0]!.text as string
|
|
132
|
-
expect(typeof text).toBe('string')
|
|
133
|
-
expect(text.length).toBeGreaterThan(0)
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
// --- Graph resources ---
|
|
137
|
-
test('should read memory://graph/actions', async () => {
|
|
138
|
-
const response = await client.readResource({ uri: 'memory://graph/actions' })
|
|
139
|
-
|
|
140
|
-
expect(response.contents).toBeDefined()
|
|
141
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
142
|
-
|
|
143
|
-
const text = response.contents[0]!.text as string
|
|
144
|
-
expect(typeof text).toBe('string')
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
test('should read memory://actions/recent', async () => {
|
|
148
|
-
const response = await client.readResource({ uri: 'memory://actions/recent' })
|
|
149
|
-
|
|
150
|
-
expect(response.contents).toBeDefined()
|
|
151
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
152
|
-
|
|
153
|
-
const text = response.contents[0]!.text as string
|
|
154
|
-
expect(typeof text).toBe('string')
|
|
155
|
-
})
|
|
156
|
-
|
|
157
|
-
// --- Team resources (no TEAM_DB_PATH in test env) ---
|
|
158
|
-
test('should read memory://team/recent', async () => {
|
|
159
|
-
const response = await client.readResource({ uri: 'memory://team/recent' })
|
|
160
|
-
|
|
161
|
-
expect(response.contents).toBeDefined()
|
|
162
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
163
|
-
|
|
164
|
-
const text = response.contents[0]!.text as string
|
|
165
|
-
const parsed = JSON.parse(text)
|
|
166
|
-
// Without team DB, should return a not-configured indicator
|
|
167
|
-
expect(typeof parsed).toBe('object')
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
test('should read memory://team/statistics', async () => {
|
|
171
|
-
const response = await client.readResource({ uri: 'memory://team/statistics' })
|
|
172
|
-
|
|
173
|
-
expect(response.contents).toBeDefined()
|
|
174
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
175
|
-
|
|
176
|
-
const text = response.contents[0]!.text as string
|
|
177
|
-
const parsed = JSON.parse(text)
|
|
178
|
-
expect(typeof parsed).toBe('object')
|
|
179
|
-
})
|
|
180
|
-
})
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E Tests: Expanded Resource Reads via SDK Client
|
|
3
|
-
*
|
|
4
|
-
* Covers resources not tested by resources.spec.ts:
|
|
5
|
-
* memory://instructions, memory://significant, memory://graph/recent,
|
|
6
|
-
* memory://tags, and unknown resource URI error handling.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { test, expect } from '@playwright/test'
|
|
10
|
-
import { createClient } from './helpers.js'
|
|
11
|
-
import type { Client } from '@modelcontextprotocol/sdk/client/index.js'
|
|
12
|
-
|
|
13
|
-
test.describe.configure({ mode: 'serial' })
|
|
14
|
-
|
|
15
|
-
test.describe('E2E Resource Reads: Expanded', () => {
|
|
16
|
-
let client: Client
|
|
17
|
-
|
|
18
|
-
test.beforeAll(async () => {
|
|
19
|
-
client = await createClient()
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
test.afterAll(async () => {
|
|
23
|
-
await client.close()
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
test('should read memory://instructions resource', async () => {
|
|
27
|
-
const response = await client.readResource({ uri: 'memory://instructions' })
|
|
28
|
-
|
|
29
|
-
expect(response.contents).toBeDefined()
|
|
30
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
31
|
-
|
|
32
|
-
const text = response.contents[0]!.text as string
|
|
33
|
-
// Instructions should be a substantial text block
|
|
34
|
-
expect(text.length).toBeGreaterThan(100)
|
|
35
|
-
// Should mention memory journal or MCP
|
|
36
|
-
expect(text.toLowerCase()).toMatch(/memory|journal|mcp/)
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
test('should read memory://significant resource', async () => {
|
|
40
|
-
const response = await client.readResource({ uri: 'memory://significant' })
|
|
41
|
-
|
|
42
|
-
expect(response.contents).toBeDefined()
|
|
43
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
44
|
-
|
|
45
|
-
const text = response.contents[0]!.text as string
|
|
46
|
-
const parsed = JSON.parse(text)
|
|
47
|
-
// Should return a valid structure (may be empty if no significant entries)
|
|
48
|
-
expect(typeof parsed).toBe('object')
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
test('should read memory://graph/recent resource', async () => {
|
|
52
|
-
const response = await client.readResource({ uri: 'memory://graph/recent' })
|
|
53
|
-
|
|
54
|
-
expect(response.contents).toBeDefined()
|
|
55
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
56
|
-
|
|
57
|
-
const text = response.contents[0]!.text as string
|
|
58
|
-
// Should be a Mermaid diagram or empty structure
|
|
59
|
-
expect(typeof text).toBe('string')
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
test('should read memory://tags resource', async () => {
|
|
63
|
-
const response = await client.readResource({ uri: 'memory://tags' })
|
|
64
|
-
|
|
65
|
-
expect(response.contents).toBeDefined()
|
|
66
|
-
expect(response.contents.length).toBeGreaterThan(0)
|
|
67
|
-
|
|
68
|
-
const text = response.contents[0]!.text as string
|
|
69
|
-
const parsed = JSON.parse(text)
|
|
70
|
-
expect(parsed).toHaveProperty('tags')
|
|
71
|
-
expect(Array.isArray(parsed.tags)).toBe(true)
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
test('should handle unknown resource URI gracefully', async () => {
|
|
75
|
-
try {
|
|
76
|
-
await client.readResource({ uri: 'memory://nonexistent-resource-uri' })
|
|
77
|
-
// If it doesn't throw, it should still return a valid structure
|
|
78
|
-
} catch (error) {
|
|
79
|
-
// Expected: MCP SDK throws for unknown resources
|
|
80
|
-
expect(error).toBeDefined()
|
|
81
|
-
}
|
|
82
|
-
})
|
|
83
|
-
})
|