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,346 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Handler Error Branches Coverage Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for remaining uncovered branches in:
|
|
5
|
-
* - search.ts: FTS fallback for invalid queries, semantic_search error handling
|
|
6
|
-
* - relationships.ts: depth parameter traversal branches
|
|
7
|
-
* - export.ts: markdown format branch
|
|
8
|
-
* - index.ts: callTool with progress context, unknown tool error
|
|
9
|
-
* - admin.ts: get_vector_index_stats without vector manager
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest'
|
|
13
|
-
import { callTool, getTools } from '../../src/handlers/tools/index.js'
|
|
14
|
-
import { DatabaseAdapter } from '../../src/database/sqlite-adapter/index.js'
|
|
15
|
-
import type { VectorSearchManager } from '../../src/vector/vector-search-manager.js'
|
|
16
|
-
|
|
17
|
-
function createMockVector(overrides: Partial<Record<string, unknown>> = {}): VectorSearchManager {
|
|
18
|
-
const defaults = {
|
|
19
|
-
isInitialized: vi.fn().mockReturnValue(true),
|
|
20
|
-
initialize: vi.fn().mockResolvedValue(undefined),
|
|
21
|
-
search: vi.fn().mockResolvedValue([]),
|
|
22
|
-
addEntry: vi.fn().mockResolvedValue(true),
|
|
23
|
-
removeEntry: vi.fn().mockResolvedValue(true),
|
|
24
|
-
rebuildIndex: vi.fn().mockResolvedValue(5),
|
|
25
|
-
getStats: vi.fn().mockReturnValue({
|
|
26
|
-
itemCount: 10,
|
|
27
|
-
modelName: 'Xenova/all-MiniLM-L6-v2',
|
|
28
|
-
dimensions: 384,
|
|
29
|
-
}),
|
|
30
|
-
generateEmbedding: vi.fn().mockResolvedValue(new Array(384).fill(0)),
|
|
31
|
-
}
|
|
32
|
-
return { ...defaults, ...overrides } as unknown as VectorSearchManager
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
describe('Handler Error Branches', () => {
|
|
36
|
-
let db: DatabaseAdapter
|
|
37
|
-
const testDbPath = './test-handler-branches.db'
|
|
38
|
-
|
|
39
|
-
beforeAll(async () => {
|
|
40
|
-
db = new DatabaseAdapter(testDbPath)
|
|
41
|
-
await db.initialize()
|
|
42
|
-
|
|
43
|
-
// Seed some test data
|
|
44
|
-
db.createEntry({ content: 'Branch test entry one', tags: ['branch-test'] })
|
|
45
|
-
db.createEntry({ content: 'Branch test entry two', tags: ['branch-test', 'second'] })
|
|
46
|
-
db.createEntry({ content: 'Export markdown test entry', tags: ['export-test'] })
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
afterAll(() => {
|
|
50
|
-
db.close()
|
|
51
|
-
try {
|
|
52
|
-
const fs = require('node:fs')
|
|
53
|
-
if (fs.existsSync(testDbPath)) fs.unlinkSync(testDbPath)
|
|
54
|
-
} catch {
|
|
55
|
-
// cleanup
|
|
56
|
-
}
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
// ========================================================================
|
|
60
|
-
// search.ts — FTS fallback for invalid/unbalanced queries
|
|
61
|
-
// ========================================================================
|
|
62
|
-
|
|
63
|
-
describe('search_entries — FTS fallback', () => {
|
|
64
|
-
it('should fall back to LIKE when query has unbalanced quotes', async () => {
|
|
65
|
-
const result = (await callTool('search_entries', { query: '"unbalanced' }, db)) as {
|
|
66
|
-
entries: unknown[]
|
|
67
|
-
count: number
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Should not throw, should return results (possibly empty)
|
|
71
|
-
expect(result.entries).toBeDefined()
|
|
72
|
-
expect(Array.isArray(result.entries)).toBe(true)
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
it('should handle empty query gracefully', async () => {
|
|
76
|
-
const result = (await callTool('search_entries', { query: '' }, db)) as {
|
|
77
|
-
entries: unknown[]
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
expect(result.entries).toBeDefined()
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
// ========================================================================
|
|
85
|
-
// search.ts — semantic_search error when vector manager throws
|
|
86
|
-
// ========================================================================
|
|
87
|
-
|
|
88
|
-
describe('semantic_search — error handling', () => {
|
|
89
|
-
it('should return error when vector manager search throws', async () => {
|
|
90
|
-
const badVector = createMockVector({
|
|
91
|
-
search: vi.fn().mockRejectedValue(new Error('Embedding model failed')),
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
const result = (await callTool(
|
|
95
|
-
'semantic_search',
|
|
96
|
-
{ query: 'test search' },
|
|
97
|
-
db,
|
|
98
|
-
badVector
|
|
99
|
-
)) as { error?: string; entries?: unknown[] }
|
|
100
|
-
|
|
101
|
-
expect(result.error).toBeDefined()
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('should return hint when no results found and hint_on_empty is true', async () => {
|
|
105
|
-
const emptyVector = createMockVector({
|
|
106
|
-
search: vi.fn().mockResolvedValue([]),
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
const result = (await callTool(
|
|
110
|
-
'semantic_search',
|
|
111
|
-
{ query: 'extremely_unlikely_term_xyz', hint_on_empty: true },
|
|
112
|
-
db,
|
|
113
|
-
emptyVector
|
|
114
|
-
)) as { entries: unknown[]; hint?: string }
|
|
115
|
-
|
|
116
|
-
expect(result.entries).toHaveLength(0)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('should not return hint when hint_on_empty is false', async () => {
|
|
120
|
-
const emptyVector = createMockVector({
|
|
121
|
-
search: vi.fn().mockResolvedValue([]),
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
const result = (await callTool(
|
|
125
|
-
'semantic_search',
|
|
126
|
-
{ query: 'xyz_no_result', hint_on_empty: false },
|
|
127
|
-
db,
|
|
128
|
-
emptyVector
|
|
129
|
-
)) as { entries: unknown[]; hint?: string }
|
|
130
|
-
|
|
131
|
-
expect(result.entries).toHaveLength(0)
|
|
132
|
-
expect(result.hint).toBeUndefined()
|
|
133
|
-
})
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
// ========================================================================
|
|
137
|
-
// relationships.ts — depth parameter traversal
|
|
138
|
-
// ========================================================================
|
|
139
|
-
|
|
140
|
-
describe('visualize_relationships — depth variations', () => {
|
|
141
|
-
it('should accept depth=1', async () => {
|
|
142
|
-
const e1 = db.createEntry({ content: 'Depth test A' })
|
|
143
|
-
const e2 = db.createEntry({ content: 'Depth test B' })
|
|
144
|
-
|
|
145
|
-
await callTool(
|
|
146
|
-
'link_entries',
|
|
147
|
-
{ from_entry_id: e1.id, to_entry_id: e2.id, relationship_type: 'references' },
|
|
148
|
-
db
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
const result = (await callTool(
|
|
152
|
-
'visualize_relationships',
|
|
153
|
-
{ entry_id: e1.id, depth: 1 },
|
|
154
|
-
db
|
|
155
|
-
)) as { entry_count: number; mermaid: string | null }
|
|
156
|
-
|
|
157
|
-
expect(result.entry_count).toBeGreaterThanOrEqual(1)
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
it('should accept depth=3', async () => {
|
|
161
|
-
const result = (await callTool(
|
|
162
|
-
'visualize_relationships',
|
|
163
|
-
{ depth: 3, limit: 5 },
|
|
164
|
-
db
|
|
165
|
-
)) as { entry_count: number }
|
|
166
|
-
|
|
167
|
-
expect(result.entry_count).toBeGreaterThanOrEqual(0)
|
|
168
|
-
})
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
// ========================================================================
|
|
172
|
-
// export.ts — markdown format branch
|
|
173
|
-
// ========================================================================
|
|
174
|
-
|
|
175
|
-
describe('export_entries — markdown format', () => {
|
|
176
|
-
it('should export entries in markdown format', async () => {
|
|
177
|
-
const result = (await callTool(
|
|
178
|
-
'export_entries',
|
|
179
|
-
{ format: 'markdown', limit: 5 },
|
|
180
|
-
db
|
|
181
|
-
)) as { format: string; content: string }
|
|
182
|
-
|
|
183
|
-
expect(result.format).toBe('markdown')
|
|
184
|
-
expect(typeof result.content).toBe('string')
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
it('should export with entry_types filter', async () => {
|
|
188
|
-
const result = (await callTool(
|
|
189
|
-
'export_entries',
|
|
190
|
-
{ format: 'json', entry_types: ['personal_reflection'], limit: 10 },
|
|
191
|
-
db
|
|
192
|
-
)) as { format: string; entries: unknown[] }
|
|
193
|
-
|
|
194
|
-
expect(result.format).toBe('json')
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
it('should export with tags filter', async () => {
|
|
198
|
-
const result = (await callTool(
|
|
199
|
-
'export_entries',
|
|
200
|
-
{ format: 'json', tags: ['export-test'], limit: 10 },
|
|
201
|
-
db
|
|
202
|
-
)) as { format: string; entries: unknown[] }
|
|
203
|
-
|
|
204
|
-
expect(result.format).toBe('json')
|
|
205
|
-
})
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
// ========================================================================
|
|
209
|
-
// index.ts — callTool with progress context
|
|
210
|
-
// ========================================================================
|
|
211
|
-
|
|
212
|
-
describe('callTool — progress context path', () => {
|
|
213
|
-
it('should handle progress context and rebuild fresh tool definitions', async () => {
|
|
214
|
-
const mockProgress = {
|
|
215
|
-
progressToken: 'test-token',
|
|
216
|
-
sendProgress: vi.fn(),
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// test_simple is a trivial tool that always works
|
|
220
|
-
const result = (await callTool(
|
|
221
|
-
'test_simple',
|
|
222
|
-
{ message: 'Progress test' },
|
|
223
|
-
db,
|
|
224
|
-
undefined,
|
|
225
|
-
undefined,
|
|
226
|
-
undefined,
|
|
227
|
-
mockProgress
|
|
228
|
-
)) as { message: string }
|
|
229
|
-
|
|
230
|
-
expect(result.message).toContain('Progress test')
|
|
231
|
-
})
|
|
232
|
-
})
|
|
233
|
-
|
|
234
|
-
// ========================================================================
|
|
235
|
-
// index.ts — unknown tool error
|
|
236
|
-
// ========================================================================
|
|
237
|
-
|
|
238
|
-
describe('callTool — unknown tool', () => {
|
|
239
|
-
it('should reject with Error for unknown tool name', async () => {
|
|
240
|
-
await expect(callTool('nonexistent_tool_xyz', {}, db)).rejects.toThrow(
|
|
241
|
-
'Unknown tool: nonexistent_tool_xyz'
|
|
242
|
-
)
|
|
243
|
-
})
|
|
244
|
-
})
|
|
245
|
-
|
|
246
|
-
// ========================================================================
|
|
247
|
-
// index.ts — getTools with tool filter
|
|
248
|
-
// ========================================================================
|
|
249
|
-
|
|
250
|
-
describe('getTools — icon mapping', () => {
|
|
251
|
-
it('should return icons for all known tool groups', () => {
|
|
252
|
-
const tools = getTools(db, null)
|
|
253
|
-
|
|
254
|
-
// Every registered tool should have icons (since all groups are in the iconMap)
|
|
255
|
-
for (const tool of tools) {
|
|
256
|
-
expect(tool.icons).toBeDefined()
|
|
257
|
-
}
|
|
258
|
-
})
|
|
259
|
-
})
|
|
260
|
-
|
|
261
|
-
// ========================================================================
|
|
262
|
-
// admin.ts — get_vector_index_stats without vector manager
|
|
263
|
-
// ========================================================================
|
|
264
|
-
|
|
265
|
-
describe('get_vector_index_stats — no vector manager', () => {
|
|
266
|
-
it('should return error when vector manager is not available', async () => {
|
|
267
|
-
const result = (await callTool('get_vector_index_stats', {}, db)) as { error: string }
|
|
268
|
-
|
|
269
|
-
expect(result.error).toContain('not available')
|
|
270
|
-
})
|
|
271
|
-
})
|
|
272
|
-
|
|
273
|
-
// ========================================================================
|
|
274
|
-
// admin.ts — get_vector_index_stats with vector manager
|
|
275
|
-
// ========================================================================
|
|
276
|
-
|
|
277
|
-
describe('get_vector_index_stats — with vector manager', () => {
|
|
278
|
-
it('should return stats from vector manager', async () => {
|
|
279
|
-
const vectorManager = createMockVector()
|
|
280
|
-
|
|
281
|
-
const result = (await callTool('get_vector_index_stats', {}, db, vectorManager)) as {
|
|
282
|
-
success: boolean
|
|
283
|
-
available: boolean
|
|
284
|
-
itemCount: number
|
|
285
|
-
modelName: string
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
expect(result.success).toBe(true)
|
|
289
|
-
expect(result.available).toBe(true)
|
|
290
|
-
expect(result.itemCount).toBe(10)
|
|
291
|
-
expect(result.modelName).toBe('Xenova/all-MiniLM-L6-v2')
|
|
292
|
-
})
|
|
293
|
-
})
|
|
294
|
-
|
|
295
|
-
// ========================================================================
|
|
296
|
-
// search.ts — search_by_date_range with all optional filters
|
|
297
|
-
// ========================================================================
|
|
298
|
-
|
|
299
|
-
describe('search_by_date_range — full filter coverage', () => {
|
|
300
|
-
it('should filter by tags', async () => {
|
|
301
|
-
const today = new Date().toISOString().split('T')[0]!
|
|
302
|
-
const result = (await callTool(
|
|
303
|
-
'search_by_date_range',
|
|
304
|
-
{
|
|
305
|
-
start_date: '2020-01-01',
|
|
306
|
-
end_date: today,
|
|
307
|
-
tags: ['branch-test'],
|
|
308
|
-
},
|
|
309
|
-
db
|
|
310
|
-
)) as { entries: unknown[]; count: number }
|
|
311
|
-
|
|
312
|
-
expect(result.entries).toBeDefined()
|
|
313
|
-
expect(result.count).toBeGreaterThan(0)
|
|
314
|
-
})
|
|
315
|
-
|
|
316
|
-
it('should filter by entry_type', async () => {
|
|
317
|
-
const today = new Date().toISOString().split('T')[0]!
|
|
318
|
-
const result = (await callTool(
|
|
319
|
-
'search_by_date_range',
|
|
320
|
-
{
|
|
321
|
-
start_date: '2020-01-01',
|
|
322
|
-
end_date: today,
|
|
323
|
-
entry_type: 'personal_reflection',
|
|
324
|
-
},
|
|
325
|
-
db
|
|
326
|
-
)) as { entries: unknown[] }
|
|
327
|
-
|
|
328
|
-
expect(result.entries).toBeDefined()
|
|
329
|
-
})
|
|
330
|
-
|
|
331
|
-
it('should filter by is_personal', async () => {
|
|
332
|
-
const today = new Date().toISOString().split('T')[0]!
|
|
333
|
-
const result = (await callTool(
|
|
334
|
-
'search_by_date_range',
|
|
335
|
-
{
|
|
336
|
-
start_date: '2020-01-01',
|
|
337
|
-
end_date: today,
|
|
338
|
-
is_personal: true,
|
|
339
|
-
},
|
|
340
|
-
db
|
|
341
|
-
)) as { entries: unknown[] }
|
|
342
|
-
|
|
343
|
-
expect(result.entries).toBeDefined()
|
|
344
|
-
})
|
|
345
|
-
})
|
|
346
|
-
})
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
|
2
|
-
import { getHelpResourceDefinitions } from '../../src/handlers/resources/help.js'
|
|
3
|
-
import { DatabaseAdapter } from '../../src/database/sqlite-adapter/index.js'
|
|
4
|
-
import type { ResourceContext } from '../../src/handlers/resources/shared.js'
|
|
5
|
-
import * as fs from 'fs'
|
|
6
|
-
|
|
7
|
-
describe('Help Resource Handlers', () => {
|
|
8
|
-
let db: DatabaseAdapter
|
|
9
|
-
|
|
10
|
-
beforeAll(async () => {
|
|
11
|
-
const dbPath = './test-help-resource.db'
|
|
12
|
-
if (fs.existsSync(dbPath)) fs.unlinkSync(dbPath)
|
|
13
|
-
db = new DatabaseAdapter(dbPath)
|
|
14
|
-
await db.initialize()
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
afterAll(() => {
|
|
18
|
-
db.close()
|
|
19
|
-
const dbPath = './test-help-resource.db'
|
|
20
|
-
if (fs.existsSync(dbPath)) fs.unlinkSync(dbPath)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
const getContext = (): ResourceContext => ({ db })
|
|
24
|
-
|
|
25
|
-
it('should generate memory://help listing all groups', async () => {
|
|
26
|
-
const defs = getHelpResourceDefinitions()
|
|
27
|
-
const rootHelp = defs.find((d) => d.uri === 'memory://help')
|
|
28
|
-
expect(rootHelp).toBeDefined()
|
|
29
|
-
|
|
30
|
-
const result = (await rootHelp!.handler('memory://help', getContext())) as any
|
|
31
|
-
expect(result.data.totalGroups).toBeGreaterThan(0)
|
|
32
|
-
expect(result.data.groups.some((g: any) => g.name === 'core')).toBe(true)
|
|
33
|
-
expect(result.data.groups.some((g: any) => g.name === 'search')).toBe(true)
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('should generate memory://help/{group} for a valid group', async () => {
|
|
37
|
-
const defs = getHelpResourceDefinitions()
|
|
38
|
-
const groupHelp = defs.find((d) => d.uri === 'memory://help/{group}')
|
|
39
|
-
expect(groupHelp).toBeDefined()
|
|
40
|
-
|
|
41
|
-
const result = (await groupHelp!.handler('memory://help/core', getContext())) as any
|
|
42
|
-
expect(result.data.group).toBe('core')
|
|
43
|
-
expect(result.data.tools.length).toBeGreaterThan(0)
|
|
44
|
-
expect(result.data.tools.some((t: any) => t.name === 'create_entry')).toBe(true)
|
|
45
|
-
|
|
46
|
-
// Check that parameters are extracted with correct types and required flags
|
|
47
|
-
const createEntry = result.data.tools.find((t: any) => t.name === 'create_entry')
|
|
48
|
-
expect(createEntry.parameters).toBeDefined()
|
|
49
|
-
|
|
50
|
-
// content is z.string() — required
|
|
51
|
-
const contentParam = createEntry.parameters.find((p: any) => p.name === 'content')
|
|
52
|
-
expect(contentParam).toBeDefined()
|
|
53
|
-
expect(contentParam.type).toBe('string')
|
|
54
|
-
expect(contentParam.required).toBe(true)
|
|
55
|
-
|
|
56
|
-
// tags is z.array(z.string()).optional() — not required
|
|
57
|
-
const tagsParam = createEntry.parameters.find((p: any) => p.name === 'tags')
|
|
58
|
-
expect(tagsParam).toBeDefined()
|
|
59
|
-
expect(tagsParam.type).toBe('array')
|
|
60
|
-
expect(tagsParam.required).toBe(false)
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it('should return error for invalid group in memory://help/{group}', async () => {
|
|
64
|
-
const defs = getHelpResourceDefinitions()
|
|
65
|
-
const groupHelp = defs.find((d) => d.uri === 'memory://help/{group}')
|
|
66
|
-
|
|
67
|
-
const result = (await groupHelp!.handler(
|
|
68
|
-
'memory://help/invalid_group_name',
|
|
69
|
-
getContext()
|
|
70
|
-
)) as any
|
|
71
|
-
expect(result.data.error).toContain('not found')
|
|
72
|
-
expect(result.data.availableGroups).toBeDefined()
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
it('should return error for malformed URI in memory://help/{group}', async () => {
|
|
76
|
-
const defs = getHelpResourceDefinitions()
|
|
77
|
-
const groupHelp = defs.find((d) => d.uri === 'memory://help/{group}')
|
|
78
|
-
|
|
79
|
-
const result = (await groupHelp!.handler('memory://help/', getContext())) as any
|
|
80
|
-
expect(result.data.error).toContain('Invalid group')
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('should generate memory://help/gotchas', async () => {
|
|
84
|
-
const defs = getHelpResourceDefinitions()
|
|
85
|
-
const gotchasHelp = defs.find((d) => d.uri === 'memory://help/gotchas')
|
|
86
|
-
expect(gotchasHelp).toBeDefined()
|
|
87
|
-
|
|
88
|
-
const result = (await gotchasHelp!.handler('memory://help/gotchas', getContext())) as any
|
|
89
|
-
expect(result.data).toContain('# memory-journal-mcp — Field Notes &')
|
|
90
|
-
expect(gotchasHelp!.mimeType).toBe('text/markdown')
|
|
91
|
-
})
|
|
92
|
-
})
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Prompt Handler Coverage Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for handlers/prompts/index.ts uncovered paths:
|
|
5
|
-
* - execQuery with empty result set
|
|
6
|
-
* - execQuery with multi-row results
|
|
7
|
-
* - getPrompt with unknown name (throws)
|
|
8
|
-
* - getPrompts listing
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
|
12
|
-
import { DatabaseAdapter } from '../../src/database/sqlite-adapter/index.js'
|
|
13
|
-
import { execQuery, getPrompts, getPrompt } from '../../src/handlers/prompts/index.js'
|
|
14
|
-
|
|
15
|
-
describe('Prompt Handlers - Coverage', () => {
|
|
16
|
-
let db: DatabaseAdapter
|
|
17
|
-
const testDbPath = './test-prompts-cov.db'
|
|
18
|
-
|
|
19
|
-
beforeAll(async () => {
|
|
20
|
-
db = new DatabaseAdapter(testDbPath)
|
|
21
|
-
await db.initialize()
|
|
22
|
-
// Seed entries for query tests
|
|
23
|
-
db.createEntry({ content: 'Prompt test entry 1', tags: ['prompt-test'] })
|
|
24
|
-
db.createEntry({ content: 'Prompt test entry 2', tags: ['prompt-test'] })
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
afterAll(() => {
|
|
28
|
-
db.close()
|
|
29
|
-
try {
|
|
30
|
-
const fs = require('node:fs')
|
|
31
|
-
if (fs.existsSync(testDbPath)) fs.unlinkSync(testDbPath)
|
|
32
|
-
} catch {
|
|
33
|
-
// Ignore cleanup errors
|
|
34
|
-
}
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
// ========================================================================
|
|
38
|
-
// execQuery
|
|
39
|
-
// ========================================================================
|
|
40
|
-
|
|
41
|
-
describe('execQuery', () => {
|
|
42
|
-
it('should return rows for a valid query', () => {
|
|
43
|
-
const rows = execQuery(db, 'SELECT id, content FROM memory_journal LIMIT 2')
|
|
44
|
-
expect(rows.length).toBe(2)
|
|
45
|
-
expect(rows[0]).toHaveProperty('id')
|
|
46
|
-
expect(rows[0]).toHaveProperty('content')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('should return empty array for no-match query', () => {
|
|
50
|
-
const rows = execQuery(
|
|
51
|
-
db,
|
|
52
|
-
"SELECT id FROM memory_journal WHERE content = 'nonexistent_xyz_12345'"
|
|
53
|
-
)
|
|
54
|
-
expect(rows).toEqual([])
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('should handle parameterized queries', () => {
|
|
58
|
-
const rows = execQuery(
|
|
59
|
-
db,
|
|
60
|
-
'SELECT id, content FROM memory_journal WHERE content LIKE ?',
|
|
61
|
-
['%Prompt test%']
|
|
62
|
-
)
|
|
63
|
-
expect(rows.length).toBe(2)
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it('should return empty array for query that returns no columns', () => {
|
|
67
|
-
const rows = execQuery(db, 'SELECT id FROM memory_journal WHERE id = -1')
|
|
68
|
-
expect(rows).toEqual([])
|
|
69
|
-
})
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
// ========================================================================
|
|
73
|
-
// getPrompts
|
|
74
|
-
// ========================================================================
|
|
75
|
-
|
|
76
|
-
describe('getPrompts', () => {
|
|
77
|
-
it('should return all prompt definitions', () => {
|
|
78
|
-
const prompts = getPrompts()
|
|
79
|
-
expect(prompts.length).toBeGreaterThan(0)
|
|
80
|
-
|
|
81
|
-
for (const p of prompts) {
|
|
82
|
-
const prompt = p as { name: string; description: string }
|
|
83
|
-
expect(typeof prompt.name).toBe('string')
|
|
84
|
-
expect(typeof prompt.description).toBe('string')
|
|
85
|
-
}
|
|
86
|
-
})
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
// ========================================================================
|
|
90
|
-
// getPrompt
|
|
91
|
-
// ========================================================================
|
|
92
|
-
|
|
93
|
-
describe('getPrompt', () => {
|
|
94
|
-
it('should throw for unknown prompt name', () => {
|
|
95
|
-
expect(() => getPrompt('nonexistent_prompt', {}, db)).toThrow(
|
|
96
|
-
'Prompt not found: nonexistent_prompt'
|
|
97
|
-
)
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
it('should return messages for a valid prompt', () => {
|
|
101
|
-
const prompts = getPrompts()
|
|
102
|
-
const firstName = (prompts[0] as { name: string }).name
|
|
103
|
-
const result = getPrompt(firstName, {}, db)
|
|
104
|
-
expect(result.messages).toBeDefined()
|
|
105
|
-
expect(result.messages.length).toBeGreaterThan(0)
|
|
106
|
-
})
|
|
107
|
-
})
|
|
108
|
-
})
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Prompt Handler Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests the prompt listing and execution handlers.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
|
8
|
-
import { getPrompts, getPrompt } from '../../src/handlers/prompts/index.js'
|
|
9
|
-
import { DatabaseAdapter } from '../../src/database/sqlite-adapter/index.js'
|
|
10
|
-
|
|
11
|
-
describe('Prompt Handlers', () => {
|
|
12
|
-
let db: DatabaseAdapter
|
|
13
|
-
const testDbPath = './test-prompts.db'
|
|
14
|
-
|
|
15
|
-
beforeAll(async () => {
|
|
16
|
-
db = new DatabaseAdapter(testDbPath)
|
|
17
|
-
await db.initialize()
|
|
18
|
-
// Seed some data for prompts that read from the DB
|
|
19
|
-
db.createEntry({ content: 'Test entry for prompts', tags: ['test-tag'] })
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
afterAll(() => {
|
|
23
|
-
db.close()
|
|
24
|
-
try {
|
|
25
|
-
const fs = require('node:fs')
|
|
26
|
-
if (fs.existsSync(testDbPath)) {
|
|
27
|
-
fs.unlinkSync(testDbPath)
|
|
28
|
-
}
|
|
29
|
-
} catch {
|
|
30
|
-
// Ignore cleanup errors
|
|
31
|
-
}
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
// ========================================================================
|
|
35
|
-
// getPrompts
|
|
36
|
-
// ========================================================================
|
|
37
|
-
|
|
38
|
-
describe('getPrompts', () => {
|
|
39
|
-
it('should return an array of prompt definitions', () => {
|
|
40
|
-
const prompts = getPrompts()
|
|
41
|
-
expect(Array.isArray(prompts)).toBe(true)
|
|
42
|
-
expect(prompts.length).toBeGreaterThan(0)
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('should have name and description on each prompt', () => {
|
|
46
|
-
const prompts = getPrompts()
|
|
47
|
-
for (const prompt of prompts) {
|
|
48
|
-
const p = prompt as { name: string; description: string }
|
|
49
|
-
expect(typeof p.name).toBe('string')
|
|
50
|
-
expect(p.name.length).toBeGreaterThan(0)
|
|
51
|
-
expect(typeof p.description).toBe('string')
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it('should include known prompt names', () => {
|
|
56
|
-
const prompts = getPrompts()
|
|
57
|
-
const names = prompts.map((p) => (p as { name: string }).name)
|
|
58
|
-
|
|
59
|
-
// At least some expected prompts should be present
|
|
60
|
-
expect(names.length).toBeGreaterThan(5)
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
// ========================================================================
|
|
65
|
-
// getPrompt
|
|
66
|
-
// ========================================================================
|
|
67
|
-
|
|
68
|
-
describe('getPrompt', () => {
|
|
69
|
-
it('should return messages for each known prompt', () => {
|
|
70
|
-
const prompts = getPrompts()
|
|
71
|
-
const names = prompts.map((p) => (p as { name: string }).name)
|
|
72
|
-
|
|
73
|
-
for (const name of names) {
|
|
74
|
-
const result = getPrompt(name, {}, db)
|
|
75
|
-
expect(result.messages).toBeDefined()
|
|
76
|
-
expect(Array.isArray(result.messages)).toBe(true)
|
|
77
|
-
expect(result.messages.length).toBeGreaterThan(0)
|
|
78
|
-
|
|
79
|
-
// Each message should have role and content
|
|
80
|
-
for (const msg of result.messages) {
|
|
81
|
-
expect(msg.role).toBeDefined()
|
|
82
|
-
expect(msg.content).toBeDefined()
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('should throw for unknown prompt name', () => {
|
|
88
|
-
expect(() => getPrompt('nonexistent_prompt_xyz', {}, db)).toThrow()
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
it('should return messages for analyze-period with date arguments', () => {
|
|
92
|
-
const today = new Date().toISOString().split('T')[0]!
|
|
93
|
-
const result = getPrompt('analyze-period', { start_date: today, end_date: today }, db)
|
|
94
|
-
|
|
95
|
-
expect(result.messages).toBeDefined()
|
|
96
|
-
expect(result.messages.length).toBeGreaterThan(0)
|
|
97
|
-
const text = (result.messages[0]?.content as { text: string }).text
|
|
98
|
-
expect(text).toContain(today)
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
it('should return messages for find-related with query argument', () => {
|
|
102
|
-
const result = getPrompt('find-related', { query: 'test' }, db)
|
|
103
|
-
|
|
104
|
-
expect(result.messages).toBeDefined()
|
|
105
|
-
expect(result.messages.length).toBeGreaterThan(0)
|
|
106
|
-
const text = (result.messages[0]?.content as { text: string }).text
|
|
107
|
-
expect(text).toContain('test')
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('should return messages for get-context-bundle prompt', () => {
|
|
111
|
-
const result = getPrompt('get-context-bundle', {}, db)
|
|
112
|
-
|
|
113
|
-
expect(result.messages).toBeDefined()
|
|
114
|
-
expect(result.messages.length).toBeGreaterThan(0)
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
it('should return messages for goal-tracker prompt', () => {
|
|
118
|
-
const result = getPrompt('goal-tracker', {}, db)
|
|
119
|
-
|
|
120
|
-
expect(result.messages).toBeDefined()
|
|
121
|
-
expect(result.messages.length).toBeGreaterThan(0)
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('should return messages for prepare-retro with days argument', () => {
|
|
125
|
-
const result = getPrompt('prepare-retro', { days: '14' }, db)
|
|
126
|
-
|
|
127
|
-
expect(result.messages).toBeDefined()
|
|
128
|
-
expect(result.messages.length).toBeGreaterThan(0)
|
|
129
|
-
})
|
|
130
|
-
})
|
|
131
|
-
})
|