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,632 +0,0 @@
|
|
|
1
|
-
# Test memory-journal-mcp — Pass 3: Code Mode Foundations
|
|
2
|
-
|
|
3
|
-
Test the Code Mode sandbox (`mj_execute_code`) and exercise core tool groups (CRUD, search, semantics) through the `mj.*` API bridge.
|
|
4
|
-
|
|
5
|
-
**Scope:** 1 tool (`mj_execute_code`), ~55 test scenarios across 6 phases (Phases 16-21) covering sandbox execution, API discoverability, readonly mode, security, core CRUD operations, and search/semantics — all via Code Mode.
|
|
6
|
-
|
|
7
|
-
**Prerequisites:**
|
|
8
|
-
|
|
9
|
-
- Pass 1 must have completed successfully (seed data S1-S12 exists).
|
|
10
|
-
- Code Mode is included in all tool filtering presets by default.
|
|
11
|
-
- Confirm MCP server instructions were auto-received before starting.
|
|
12
|
-
- Use the MCP server directly for all tests — not the terminal or scripts.
|
|
13
|
-
|
|
14
|
-
**Workflow after testing:**
|
|
15
|
-
|
|
16
|
-
1. Create a plan to fix any issues found or potential improvement opportunities, including changes to `server-instructions.md`/`server-instructions.ts` or this file (`test-server/test-tools-codemode.md`).
|
|
17
|
-
2. Use `code-map.md` as a source of truth and ensure fixes comply with `C:\Users\chris\Desktop\adamic\skills\mcp-builder`.
|
|
18
|
-
3. After implementation, update `UNRELEASED.md` and commit without pushing. Then, stop so the user can verify with `npm run lint && npm run typecheck`, `npm run test`, and `npm run test:e2e`.
|
|
19
|
-
4. After user completes verification, re-test fixes with direct MCP calls.
|
|
20
|
-
5. Provide a very brief final summary.
|
|
21
|
-
|
|
22
|
-
> [!IMPORTANT]
|
|
23
|
-
> **Test Session Prerequisites**
|
|
24
|
-
|
|
25
|
-
1. The server instructions are auto-injected by the MCP protocol. Confirm receipt (no need to read `memory://instructions` separately).
|
|
26
|
-
2. Read `memory://briefing` to confirm context loaded (the briefing table confirms receipt).
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Phase 16: Sandbox Basics
|
|
31
|
-
|
|
32
|
-
### 16.1 Simple Expressions
|
|
33
|
-
|
|
34
|
-
| Test | Code | Expected Result |
|
|
35
|
-
| --------------- | -------------------------------- | ----------------------------------------------------------- |
|
|
36
|
-
| Integer return | `return 42;` | `{ success: true, result: 42 }` |
|
|
37
|
-
| String return | `return "hello from code mode";` | `{ success: true, result: "hello from code mode" }` |
|
|
38
|
-
| Object return | `return { a: 1, b: [2, 3] };` | `{ success: true, result: { a: 1, b: [2, 3] } }` |
|
|
39
|
-
| Null return | `return null;` | `{ success: true, result: null }` |
|
|
40
|
-
| No return value | `const x = 1;` | `{ success: true, result: undefined }` (implicit undefined) |
|
|
41
|
-
| Boolean return | `return true;` | `{ success: true, result: true }` |
|
|
42
|
-
|
|
43
|
-
### 16.2 Async & Built-ins
|
|
44
|
-
|
|
45
|
-
| Test | Code | Expected Result |
|
|
46
|
-
| ----------------- | ---------------------------------------------------- | ------------------------------------------- |
|
|
47
|
-
| Async/await | `const x = await Promise.resolve(42); return x;` | `{ success: true, result: 42 }` |
|
|
48
|
-
| JSON built-in | `return JSON.parse('{"test": true}');` | `{ success: true, result: { test: true } }` |
|
|
49
|
-
| Math built-in | `return Math.max(1, 2, 3);` | `{ success: true, result: 3 }` |
|
|
50
|
-
| Array methods | `return [3,1,2].sort();` | `{ success: true, result: [1, 2, 3] }` |
|
|
51
|
-
| Date available | `return typeof Date;` | `{ success: true, result: "function" }` |
|
|
52
|
-
| Map/Set available | `const m = new Map(); m.set("a", 1); return m.size;` | `{ success: true, result: 1 }` |
|
|
53
|
-
| RegExp available | `return /test/.test("testing");` | `{ success: true, result: true }` |
|
|
54
|
-
|
|
55
|
-
### 16.3 Execution Metrics
|
|
56
|
-
|
|
57
|
-
| Test | Code | Expected Result |
|
|
58
|
-
| -------------------- | ----------- | --------------------------------------------------------------------- |
|
|
59
|
-
| Metrics present | `return 1;` | Response has `metrics` with `wallTimeMs`, `cpuTimeMs`, `memoryUsedMb` |
|
|
60
|
-
| wallTimeMs > 0 | `return 1;` | `metrics.wallTimeMs >= 0` (typically > 0) |
|
|
61
|
-
| cpuTimeMs numeric | `return 1;` | `metrics.cpuTimeMs` is a number |
|
|
62
|
-
| memoryUsedMb numeric | `return 1;` | `metrics.memoryUsedMb` is a number |
|
|
63
|
-
|
|
64
|
-
### 16.4 Timeout Handling
|
|
65
|
-
|
|
66
|
-
| Test | Code | Expected Result |
|
|
67
|
-
| ----------------------- | ------------------------------------- | ---------------------------------------------------------- |
|
|
68
|
-
| Custom timeout succeeds | `return "fast";` with `timeout: 5000` | `{ success: true, result: "fast" }` |
|
|
69
|
-
| Infinite loop timeout | `while(true) {}` with `timeout: 2000` | `{ success: false, error: "..." }` with timeout indication |
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Phase 17: API Discoverability
|
|
74
|
-
|
|
75
|
-
### 17.1 Top-Level Help
|
|
76
|
-
|
|
77
|
-
| Test | Code | Expected Result |
|
|
78
|
-
| ------------------------ | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
79
|
-
| mj.help() returns groups | `return await mj.help();` | `groups` array with 9 entries, `totalMethods` > 40, `usage` string |
|
|
80
|
-
| All 9 groups present | `const h = await mj.help(); return h.groups;` | Contains: `core`, `search`, `analytics`, `relationships`, `export`, `admin`, `github`, `backup`, `team` |
|
|
81
|
-
| Correct group count | `const h = await mj.help(); return h.groups.length;` | `9` |
|
|
82
|
-
|
|
83
|
-
### 17.2 Per-Group Help
|
|
84
|
-
|
|
85
|
-
| Test | Code | Expected Result |
|
|
86
|
-
| ---------------- | ----------------------------------- | ------------------------------------------------------- |
|
|
87
|
-
| core.help() | `return await mj.core.help();` | `group: "core"`, `methods` array with core method names |
|
|
88
|
-
| search.help() | `return await mj.search.help();` | `group: "search"`, `methods` array |
|
|
89
|
-
| analytics.help() | `return await mj.analytics.help();` | `group: "analytics"`, `methods` array |
|
|
90
|
-
| github.help() | `return await mj.github.help();` | `group: "github"`, `methods` array |
|
|
91
|
-
| backup.help() | `return await mj.backup.help();` | `group: "backup"`, `methods` array |
|
|
92
|
-
|
|
93
|
-
### 17.3 Aliases & Positional Arguments
|
|
94
|
-
|
|
95
|
-
| Test | Code | Expected Result |
|
|
96
|
-
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
|
|
97
|
-
| Alias: mj.core.recent() | `const r = await mj.core.recent(2); return { count: r.entries?.length ?? r.count };` | Returns entries (alias for `getRecentEntries`) |
|
|
98
|
-
| Alias: mj.core.getRecent() | `const r = await mj.core.getRecent({limit: 2}); return { count: r.entries?.length ?? r.count };` | Returns entries (alias for `getRecentEntries`) |
|
|
99
|
-
| Alias: mj.analytics.stats() | `const s = await mj.analytics.stats(); return typeof s.totalEntries;` | Returns `"number"` (alias for `getStatistics`) |
|
|
100
|
-
| Positional: mj.core.get(id) | `const r = await mj.core.getRecentEntries({limit:1}); const id = r.entries[0].id; const e = await mj.core.get(id); return { hasEntry: !!e };` | Returns the entry (positional for `getEntryById`) |
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## Phase 18: Readonly Mode
|
|
105
|
-
|
|
106
|
-
> [!NOTE]
|
|
107
|
-
> When `readonly: true`, only tools with `readOnlyHint: true` are available. Write tools should be filtered out of the API bridge.
|
|
108
|
-
|
|
109
|
-
### 18.1 Read Operations Succeed
|
|
110
|
-
|
|
111
|
-
| Test | Code (readonly: true) | Expected Result |
|
|
112
|
-
| ------------------ | ------------------------------------------------------------------ | ------------------------------------- |
|
|
113
|
-
| Get recent entries | `return await mj.core.getRecentEntries({limit: 2});` | `{ success: true }`, entries returned |
|
|
114
|
-
| Search entries | `return await mj.search.searchEntries({query: "test", limit: 2});` | `{ success: true }`, search works |
|
|
115
|
-
| Get statistics | `return await mj.analytics.getStatistics({});` | `{ success: true }`, stats returned |
|
|
116
|
-
| Help still works | `return await mj.help();` | Groups and methods listed |
|
|
117
|
-
|
|
118
|
-
### 18.2 Write Operations Blocked
|
|
119
|
-
|
|
120
|
-
| Test | Code (readonly: true) | Expected Result |
|
|
121
|
-
| -------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------- |
|
|
122
|
-
| Create entry blocked | `return await mj.core.createEntry({content: "should fail"});` | ⚠️ Verify: either method doesn't exist (TypeError) or returns error |
|
|
123
|
-
| Update entry blocked | `return await mj.admin.updateEntry({entry_id: 1, content: "fail"});` | ⚠️ Verify: blocked or error |
|
|
124
|
-
| Delete entry blocked | `return await mj.admin.deleteEntry({entry_id: 999999});` | ⚠️ Verify: blocked or error |
|
|
125
|
-
|
|
126
|
-
### 18.3 Default Mode Allows Writes
|
|
127
|
-
|
|
128
|
-
| Test | Code (readonly: false, default) | Expected Result |
|
|
129
|
-
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ |
|
|
130
|
-
| Create works in default | `const r = await mj.core.createEntryMinimal({content: "readonly=false test"}); return { success: r.success, id: r.entry?.id };` | `success: true`, entry created |
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Phase 19: Error Handling & Security
|
|
135
|
-
|
|
136
|
-
### 19.1 Input Validation
|
|
137
|
-
|
|
138
|
-
| Test | Input | Expected Result |
|
|
139
|
-
| --------------- | ----------------------------------- | ------------------------------------------------------------- |
|
|
140
|
-
| Empty code | `code: ""` | `{ success: false, error: "..." }` — pre-execution validation |
|
|
141
|
-
| Whitespace only | `code: " "` (if treated as empty) | Structured error or executes with `undefined` result |
|
|
142
|
-
|
|
143
|
-
### 19.2 Blocked Patterns
|
|
144
|
-
|
|
145
|
-
| Test | Code | Expected Result |
|
|
146
|
-
| -------------------- | ---------------------------- | ---------------------------------------------------- |
|
|
147
|
-
| require() | `require('fs')` | `{ success: false, error: "..." }` — blocked pattern |
|
|
148
|
-
| process.exit | `process.exit(1)` | `{ success: false, error: "..." }` — blocked pattern |
|
|
149
|
-
| eval() | `eval('1+1')` | `{ success: false, error: "..." }` — blocked pattern |
|
|
150
|
-
| import() | `import('fs')` | `{ success: false, error: "..." }` — blocked pattern |
|
|
151
|
-
| Function constructor | `new Function('return 1')()` | `{ success: false, error: "..." }` — blocked pattern |
|
|
152
|
-
| **proto** | `({}).__proto__` | `{ success: false, error: "..." }` — blocked pattern |
|
|
153
|
-
| child_process | `require('child_process')` | `{ success: false, error: "..." }` — blocked pattern |
|
|
154
|
-
|
|
155
|
-
### 19.3 Runtime Errors
|
|
156
|
-
|
|
157
|
-
| Test | Code | Expected Result |
|
|
158
|
-
| -------------------- | ------------------------------------------- | ------------------------------------------------------------ |
|
|
159
|
-
| Syntax error | `{{{` | `{ success: false, error: "..." }` with syntax error message |
|
|
160
|
-
| ReferenceError | `return nonexistentVariable;` | `{ success: false, error: "..." }` with ReferenceError |
|
|
161
|
-
| TypeError in code | `null.foo()` | `{ success: false, error: "..." }` with TypeError |
|
|
162
|
-
| RPC method not found | `return await mj.core.nonexistentMethod();` | `{ success: false }` — method not found in group |
|
|
163
|
-
|
|
164
|
-
### 19.4 Nulled Globals
|
|
165
|
-
|
|
166
|
-
| Test | Code | Expected Result |
|
|
167
|
-
| ----------------------- | --------------------------- | --------------------- |
|
|
168
|
-
| process is undefined | `return typeof process;` | `result: "undefined"` |
|
|
169
|
-
| require is undefined | `return typeof require;` | `result: "undefined"` |
|
|
170
|
-
| setTimeout is undefined | `return typeof setTimeout;` | `result: "undefined"` |
|
|
171
|
-
| globalThis is undefined | `return typeof globalThis;` | `result: "undefined"` |
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
## Phase 20: Core CRUD via Code Mode
|
|
176
|
-
|
|
177
|
-
### 20.1 Create Entry — Full Parameters
|
|
178
|
-
|
|
179
|
-
```javascript
|
|
180
|
-
// Test code:
|
|
181
|
-
const entry = await mj.core.createEntry({
|
|
182
|
-
content: 'CM3 full-params test entry',
|
|
183
|
-
entry_type: 'technical_note',
|
|
184
|
-
tags: ['codemode3-test', 'full-params'],
|
|
185
|
-
pr_number: 99,
|
|
186
|
-
pr_status: 'open',
|
|
187
|
-
workflow_run_id: 555,
|
|
188
|
-
workflow_name: 'test-ci',
|
|
189
|
-
workflow_status: 'completed',
|
|
190
|
-
project_number: 5,
|
|
191
|
-
is_personal: false,
|
|
192
|
-
})
|
|
193
|
-
return {
|
|
194
|
-
success: entry.success,
|
|
195
|
-
id: entry.entry?.id,
|
|
196
|
-
type: entry.entry?.entryType,
|
|
197
|
-
prNumber: entry.entry?.prNumber,
|
|
198
|
-
prStatus: entry.entry?.prStatus,
|
|
199
|
-
workflowRunId: entry.entry?.workflowRunId,
|
|
200
|
-
workflowName: entry.entry?.workflowName,
|
|
201
|
-
workflowStatus: entry.entry?.workflowStatus,
|
|
202
|
-
projectNumber: entry.entry?.projectNumber,
|
|
203
|
-
isPersonal: entry.entry?.isPersonal,
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
| Check | Expected |
|
|
208
|
-
| ---------------- | ------------------ |
|
|
209
|
-
| `success` | `true` |
|
|
210
|
-
| `type` | `"technical_note"` |
|
|
211
|
-
| `prNumber` | `99` |
|
|
212
|
-
| `prStatus` | `"open"` |
|
|
213
|
-
| `workflowRunId` | `555` |
|
|
214
|
-
| `workflowName` | `"test-ci"` |
|
|
215
|
-
| `workflowStatus` | `"completed"` |
|
|
216
|
-
| `projectNumber` | `5` |
|
|
217
|
-
| `isPersonal` | `false` |
|
|
218
|
-
|
|
219
|
-
### 20.2 Create with share_with_team
|
|
220
|
-
|
|
221
|
-
```javascript
|
|
222
|
-
// Test code:
|
|
223
|
-
const entry = await mj.core.createEntry({
|
|
224
|
-
content: 'CM3 shared entry for team verification',
|
|
225
|
-
share_with_team: true,
|
|
226
|
-
tags: ['codemode3-team'],
|
|
227
|
-
})
|
|
228
|
-
return {
|
|
229
|
-
success: entry.success,
|
|
230
|
-
sharedWithTeam: entry.sharedWithTeam,
|
|
231
|
-
author: entry.author,
|
|
232
|
-
entryId: entry.entry?.id,
|
|
233
|
-
}
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
| Check | Expected |
|
|
237
|
-
| ---------------- | ---------------- |
|
|
238
|
-
| `success` | `true` |
|
|
239
|
-
| `sharedWithTeam` | `true` |
|
|
240
|
-
| `author` | Non-empty string |
|
|
241
|
-
|
|
242
|
-
### 20.3 Create Entry — Error Paths
|
|
243
|
-
|
|
244
|
-
| Test | Code | Expected Result |
|
|
245
|
-
| -------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------ |
|
|
246
|
-
| Invalid entry_type | `return await mj.core.createEntry({ content: "test", entry_type: "invalid" });` | `{ success: false, error: "..." }` listing valid types |
|
|
247
|
-
| Invalid significance | `return await mj.core.createEntry({ content: "test", significance_type: "invalid" });` | `{ success: false, error: "..." }` listing valid types |
|
|
248
|
-
| Empty content | `return await mj.core.createEntry({ content: "" });` | `{ success: false, error: "..." }` min length error |
|
|
249
|
-
|
|
250
|
-
### 20.4 Get Entry By ID — Details
|
|
251
|
-
|
|
252
|
-
```javascript
|
|
253
|
-
// Test code:
|
|
254
|
-
const recent = await mj.core.getRecentEntries({ limit: 1 })
|
|
255
|
-
const id = recent.entries[0].id
|
|
256
|
-
const full = await mj.core.getEntryById({ entry_id: id })
|
|
257
|
-
const noRels = await mj.core.getEntryById({ entry_id: id, include_relationships: false })
|
|
258
|
-
return {
|
|
259
|
-
hasEntryType: typeof full.entry?.entryType === 'string',
|
|
260
|
-
hasContent: typeof full.entry?.content === 'string',
|
|
261
|
-
hasTags: Array.isArray(full.entry?.tags),
|
|
262
|
-
fullRelCount: full.entry?.relationships?.length ?? 'none',
|
|
263
|
-
noRelCount: noRels.entry?.relationships?.length ?? 'none',
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
> [!NOTE]
|
|
268
|
-
> The `importance` and `importanceBreakdown` fields are not included in the `getEntryById` code-mode response. Use the direct `get_entry_by_id` tool call to access these computed fields.
|
|
269
|
-
|
|
270
|
-
| Check | Expected |
|
|
271
|
-
| -------------- | --------------------------------------- |
|
|
272
|
-
| `hasEntryType` | `true` |
|
|
273
|
-
| `hasContent` | `true` |
|
|
274
|
-
| `hasTags` | `true` |
|
|
275
|
-
| `fullRelCount` | Number ≥ 0 |
|
|
276
|
-
| `noRelCount` | `"none"` or `0` (relationships omitted) |
|
|
277
|
-
|
|
278
|
-
### 20.5 Update Entry
|
|
279
|
-
|
|
280
|
-
```javascript
|
|
281
|
-
// Test code:
|
|
282
|
-
const created = await mj.core.createEntryMinimal({ content: 'CM3 update test' })
|
|
283
|
-
const id = created.entry.id
|
|
284
|
-
const updated = await mj.admin.updateEntry({
|
|
285
|
-
entry_id: id,
|
|
286
|
-
content: 'CM3 updated content',
|
|
287
|
-
tags: ['codemode3-updated'],
|
|
288
|
-
entry_type: 'bug_fix',
|
|
289
|
-
})
|
|
290
|
-
const verify = await mj.core.getEntryById({ entry_id: id })
|
|
291
|
-
return {
|
|
292
|
-
updateSuccess: updated.success,
|
|
293
|
-
newContent: verify.entry?.content,
|
|
294
|
-
newType: verify.entry?.entryType,
|
|
295
|
-
newTags: verify.entry?.tags,
|
|
296
|
-
}
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
| Check | Expected |
|
|
300
|
-
| --------------- | ----------------------- |
|
|
301
|
-
| `updateSuccess` | `true` |
|
|
302
|
-
| `newContent` | `"CM3 updated content"` |
|
|
303
|
-
| `newType` | `"bug_fix"` |
|
|
304
|
-
| `newTags` | `["codemode3-updated"]` |
|
|
305
|
-
|
|
306
|
-
### 20.6 Update Entry — Error Paths
|
|
307
|
-
|
|
308
|
-
| Test | Code | Expected Result |
|
|
309
|
-
| ------------------ | ---------------------------------------------------------------------------- | ----------------------------------------------------- |
|
|
310
|
-
| Nonexistent ID | `return await mj.admin.updateEntry({ entry_id: 999999, content: "fail" });` | `{ success: false, error: "Entry 999999 not found" }` |
|
|
311
|
-
| Invalid entry_type | `return await mj.admin.updateEntry({ entry_id: 1, entry_type: "invalid" });` | `{ success: false, error: "..." }` |
|
|
312
|
-
|
|
313
|
-
### 20.7 Delete Entry
|
|
314
|
-
|
|
315
|
-
```javascript
|
|
316
|
-
// Test code:
|
|
317
|
-
const created = await mj.core.createEntryMinimal({ content: 'CM3 delete test' })
|
|
318
|
-
const id = created.entry.id
|
|
319
|
-
const soft = await mj.admin.deleteEntry({ entry_id: id, permanent: false })
|
|
320
|
-
const searchAfterSoft = await mj.search.searchEntries({ query: 'CM3 delete test', limit: 5 })
|
|
321
|
-
const hiddenFromSearch = !searchAfterSoft.entries.some((e) => e.id === id)
|
|
322
|
-
const perm = await mj.admin.deleteEntry({ entry_id: id, permanent: true })
|
|
323
|
-
const notFound = await mj.admin.deleteEntry({ entry_id: 999999 })
|
|
324
|
-
return {
|
|
325
|
-
softSuccess: soft.success,
|
|
326
|
-
hiddenFromSearch,
|
|
327
|
-
permSuccess: perm.success,
|
|
328
|
-
notFoundError: notFound.success === false,
|
|
329
|
-
}
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
| Check | Expected |
|
|
333
|
-
| ------------------ | -------- |
|
|
334
|
-
| `softSuccess` | `true` |
|
|
335
|
-
| `hiddenFromSearch` | `true` |
|
|
336
|
-
| `permSuccess` | `true` |
|
|
337
|
-
| `notFoundError` | `true` |
|
|
338
|
-
|
|
339
|
-
### 20.8 Get Recent Entries — Filters
|
|
340
|
-
|
|
341
|
-
| Test | Code | Expected Result |
|
|
342
|
-
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
343
|
-
| is_personal: true | `const r = await mj.core.getRecentEntries({ limit: 5, is_personal: true }); return { count: r.entries.length, allPersonal: r.entries.every(e => e.isPersonal === true) };` | `allPersonal: true` |
|
|
344
|
-
| is_personal: false | `const r = await mj.core.getRecentEntries({ limit: 5, is_personal: false }); return { count: r.entries.length, nonePersonal: r.entries.every(e => e.isPersonal === false) };` | `nonePersonal: true` |
|
|
345
|
-
|
|
346
|
-
### 20.9 test_simple via Code Mode
|
|
347
|
-
|
|
348
|
-
| Test | Code | Expected Result |
|
|
349
|
-
| ---------------- | ----------------------------------------------------------- | ---------------------------------- |
|
|
350
|
-
| Positional alias | `return await mj.core.testSimple({ message: "CM3 test" });` | `{ message: "..." }` echoing input |
|
|
351
|
-
|
|
352
|
-
---
|
|
353
|
-
|
|
354
|
-
## Phase 21: Search & Semantics via Code Mode
|
|
355
|
-
|
|
356
|
-
### 21.1 FTS5 Search Patterns
|
|
357
|
-
|
|
358
|
-
| Test | Code | Expected Result |
|
|
359
|
-
| ------------- | ------------------------------------------------------------------------ | ------------------------ |
|
|
360
|
-
| Basic query | `return await mj.search.searchEntries({ query: "architecture" });` | ≥ 2 results (S1, S11) |
|
|
361
|
-
| Phrase | `return await mj.search.searchEntries({ query: '"error handling"' });` | ≥ 1 result (S2) |
|
|
362
|
-
| Prefix | `return await mj.search.searchEntries({ query: "auth*" });` | ≥ 2 results (S1, S8) |
|
|
363
|
-
| Boolean NOT | `return await mj.search.searchEntries({ query: "deploy NOT staging" });` | Returns S3 but NOT S5 |
|
|
364
|
-
| Boolean OR | `return await mj.search.searchEntries({ query: "deploy OR release" });` | ≥ 2 results (S3, S4, S5) |
|
|
365
|
-
| LIKE fallback | `return await mj.search.searchEntries({ query: "test's" });` | ≥ 1 result (S6) |
|
|
366
|
-
| Special chars | `return await mj.search.searchEntries({ query: "100%" });` | ≥ 1 result (S6) |
|
|
367
|
-
|
|
368
|
-
### 21.2 Search Filters
|
|
369
|
-
|
|
370
|
-
```javascript
|
|
371
|
-
// Test code:
|
|
372
|
-
const byIssue = await mj.search.searchEntries({ issue_number: 44 })
|
|
373
|
-
const byPr = await mj.search.searchEntries({ pr_status: 'merged' })
|
|
374
|
-
const byWorkflow = await mj.search.searchEntries({ workflow_run_id: 12345 })
|
|
375
|
-
const byProject = await mj.search.searchEntries({ project_number: 5 })
|
|
376
|
-
const personal = await mj.search.searchEntries({ query: 'test', is_personal: true })
|
|
377
|
-
return {
|
|
378
|
-
issueResults: byIssue.entries.length,
|
|
379
|
-
prResults: byPr.entries.length,
|
|
380
|
-
workflowResults: byWorkflow.entries.length,
|
|
381
|
-
projectResults: byProject.entries.length,
|
|
382
|
-
personalResults: personal.entries.length,
|
|
383
|
-
allPersonal: personal.entries.every((e) => e.isPersonal === true || e.is_personal === true),
|
|
384
|
-
}
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
| Check | Expected |
|
|
388
|
-
| ----------------- | -------- |
|
|
389
|
-
| `issueResults` | ≥ 1 (S7) |
|
|
390
|
-
| `prResults` | ≥ 1 (S8) |
|
|
391
|
-
| `workflowResults` | ≥ 1 (S9) |
|
|
392
|
-
| `projectResults` | ≥ 1 (S7) |
|
|
393
|
-
| `allPersonal` | `true` |
|
|
394
|
-
|
|
395
|
-
### 21.3 Cross-DB Search
|
|
396
|
-
|
|
397
|
-
```javascript
|
|
398
|
-
// Test code:
|
|
399
|
-
const results = await mj.search.searchEntries({ query: 'architecture', limit: 20 })
|
|
400
|
-
const sources = results.entries.map((e) => e.source)
|
|
401
|
-
return {
|
|
402
|
-
totalResults: results.entries.length,
|
|
403
|
-
hasPersonal: sources.includes('personal'),
|
|
404
|
-
hasTeam: sources.includes('team'),
|
|
405
|
-
}
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
| Check | Expected |
|
|
409
|
-
| -------------- | ------------ |
|
|
410
|
-
| `totalResults` | ≥ 2 |
|
|
411
|
-
| `hasPersonal` | `true` (S1) |
|
|
412
|
-
| `hasTeam` | `true` (S11) |
|
|
413
|
-
|
|
414
|
-
### 21.4 Search by Date Range
|
|
415
|
-
|
|
416
|
-
```javascript
|
|
417
|
-
// Test code:
|
|
418
|
-
const basic = await mj.search.searchByDateRange({
|
|
419
|
-
start_date: '2026-01-01',
|
|
420
|
-
end_date: '2026-12-31',
|
|
421
|
-
})
|
|
422
|
-
const withType = await mj.search.searchByDateRange({
|
|
423
|
-
start_date: '2026-01-01',
|
|
424
|
-
end_date: '2026-12-31',
|
|
425
|
-
entry_type: 'planning',
|
|
426
|
-
})
|
|
427
|
-
const withTags = await mj.search.searchByDateRange({
|
|
428
|
-
start_date: '2026-01-01',
|
|
429
|
-
end_date: '2026-12-31',
|
|
430
|
-
tags: ['deploy'],
|
|
431
|
-
})
|
|
432
|
-
const withPersonal = await mj.search.searchByDateRange({
|
|
433
|
-
start_date: '2026-01-01',
|
|
434
|
-
end_date: '2026-12-31',
|
|
435
|
-
is_personal: true,
|
|
436
|
-
})
|
|
437
|
-
return {
|
|
438
|
-
basicCount: basic.entries.length,
|
|
439
|
-
typeCount: withType.entries.length,
|
|
440
|
-
typeAllPlanning: withType.entries.every((e) => e.entryType === 'planning'),
|
|
441
|
-
tagCount: withTags.entries.length,
|
|
442
|
-
personalCount: withPersonal.entries.length,
|
|
443
|
-
}
|
|
444
|
-
```
|
|
445
|
-
|
|
446
|
-
| Check | Expected |
|
|
447
|
-
| ----------------- | -------------------------------------- |
|
|
448
|
-
| `basicCount` | ≥ 1 |
|
|
449
|
-
| `typeAllPlanning` | `true` (if any planning entries exist) |
|
|
450
|
-
| `tagCount` | ≥ 1 (entries with "deploy" tag) |
|
|
451
|
-
| `personalCount` | ≥ 0 |
|
|
452
|
-
|
|
453
|
-
### 21.5 Search by Date Range — Error Paths
|
|
454
|
-
|
|
455
|
-
| Test | Code | Expected Result |
|
|
456
|
-
| ------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------- |
|
|
457
|
-
| Invalid date format | `return await mj.search.searchByDateRange({ start_date: "Jan 1", end_date: "Jan 31" });` | `{ success: false, error: "..." }` with YYYY-MM-DD hint |
|
|
458
|
-
|
|
459
|
-
### 21.6 Semantic Search
|
|
460
|
-
|
|
461
|
-
```javascript
|
|
462
|
-
// Test code:
|
|
463
|
-
const basic = await mj.search.semanticSearch({ query: 'improving performance' })
|
|
464
|
-
const strict = await mj.search.semanticSearch({
|
|
465
|
-
query: 'performance',
|
|
466
|
-
similarity_threshold: 0.5,
|
|
467
|
-
})
|
|
468
|
-
const personal = await mj.search.semanticSearch({
|
|
469
|
-
query: 'test',
|
|
470
|
-
is_personal: true,
|
|
471
|
-
})
|
|
472
|
-
const noHint = await mj.search.semanticSearch({
|
|
473
|
-
query: 'xyznonexistent',
|
|
474
|
-
hint_on_empty: false,
|
|
475
|
-
})
|
|
476
|
-
const stats = await mj.search.getVectorIndexStats({})
|
|
477
|
-
return {
|
|
478
|
-
basicCount: basic.entries?.length ?? 0,
|
|
479
|
-
strictCount: strict.entries?.length ?? 0,
|
|
480
|
-
strictFewer: (strict.entries?.length ?? 0) <= (basic.entries?.length ?? 0),
|
|
481
|
-
personalFiltered:
|
|
482
|
-
personal.entries?.every((e) => e.isPersonal === true || e.is_personal === true) ?? true,
|
|
483
|
-
noHintHasQualityHint: !!noHint.hint,
|
|
484
|
-
vectorAvailable: stats.available,
|
|
485
|
-
vectorItemCount: stats.itemCount,
|
|
486
|
-
}
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
| Check | Expected |
|
|
490
|
-
| ---------------------- | --------------------------------------- |
|
|
491
|
-
| `basicCount` | ≥ 1 |
|
|
492
|
-
| `strictFewer` | `true` |
|
|
493
|
-
| `noHintHasQualityHint` | `true` (quality gate hint always shown) |
|
|
494
|
-
| `vectorAvailable` | `true` |
|
|
495
|
-
| `vectorItemCount` | Number > 0 |
|
|
496
|
-
|
|
497
|
-
### 21.7 Analytics
|
|
498
|
-
|
|
499
|
-
```javascript
|
|
500
|
-
// Test code:
|
|
501
|
-
const byMonth = await mj.analytics.getStatistics({ group_by: 'month' })
|
|
502
|
-
const byDay = await mj.analytics.getStatistics({ group_by: 'day' })
|
|
503
|
-
const withDates = await mj.analytics.getStatistics({
|
|
504
|
-
start_date: '2026-01-01',
|
|
505
|
-
end_date: '2026-03-01',
|
|
506
|
-
})
|
|
507
|
-
const withProject = await mj.analytics.getStatistics({ project_breakdown: true })
|
|
508
|
-
const insights = await mj.analytics.getCrossProjectInsights({})
|
|
509
|
-
const insightsFiltered = await mj.analytics.getCrossProjectInsights({
|
|
510
|
-
start_date: '2026-01-01',
|
|
511
|
-
end_date: '2026-03-01',
|
|
512
|
-
min_entries: 1,
|
|
513
|
-
})
|
|
514
|
-
return {
|
|
515
|
-
hasDecisionDensity: typeof byMonth.decisionDensity !== 'undefined',
|
|
516
|
-
hasRelComplexity: typeof byMonth.relationshipComplexity !== 'undefined',
|
|
517
|
-
hasActivityTrend: typeof byMonth.activityTrend !== 'undefined',
|
|
518
|
-
hasCausalMetrics: typeof byMonth.causalMetrics !== 'undefined',
|
|
519
|
-
dayPeriodsExist: (byDay.entriesByPeriod?.length ?? 0) >= 0,
|
|
520
|
-
dateFilteredRange: !!withDates.dateRange,
|
|
521
|
-
projectBreakdown: !!withProject.projectBreakdown,
|
|
522
|
-
insightsProjectCount: insights.project_count,
|
|
523
|
-
insightsHasProjects: Array.isArray(insights.projects),
|
|
524
|
-
filteredInsights: insightsFiltered.project_count >= 0,
|
|
525
|
-
}
|
|
526
|
-
```
|
|
527
|
-
|
|
528
|
-
| Check | Expected |
|
|
529
|
-
| --------------------- | -------- |
|
|
530
|
-
| `hasDecisionDensity` | `true` |
|
|
531
|
-
| `hasRelComplexity` | `true` |
|
|
532
|
-
| `hasActivityTrend` | `true` |
|
|
533
|
-
| `hasCausalMetrics` | `true` |
|
|
534
|
-
| `dateFilteredRange` | `true` |
|
|
535
|
-
| `insightsHasProjects` | `true` |
|
|
536
|
-
|
|
537
|
-
### 21.8 Vector Index Management
|
|
538
|
-
|
|
539
|
-
| Test | Code | Expected Result |
|
|
540
|
-
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
|
|
541
|
-
| Rebuild index | `return await mj.admin.rebuildVectorIndex({});` | `{ success: true, entriesIndexed: N }` where N > 0 |
|
|
542
|
-
| Add existing to index | `const r = await mj.core.getRecentEntries({ limit: 1 }); return await mj.admin.addToVectorIndex({ entry_id: r.entries[0].id });` | `{ success: true, entryId: N }` |
|
|
543
|
-
| Add nonexistent | `return await mj.admin.addToVectorIndex({ entry_id: 999999 });` | `{ success: false, error: "..." }` |
|
|
544
|
-
|
|
545
|
-
---
|
|
546
|
-
|
|
547
|
-
## Cleanup
|
|
548
|
-
|
|
549
|
-
After testing, remove test entries created during Phases 18 and 20:
|
|
550
|
-
|
|
551
|
-
| Cleanup Step | Command/Action |
|
|
552
|
-
| -------------------------- | ------------------------------------------------------------- |
|
|
553
|
-
| Delete readonly test entry | `delete_entry(entry_id: <readonly_test_id>, permanent: true)` |
|
|
554
|
-
| Delete full-params entry | `delete_entry(entry_id: <full_params_id>, permanent: true)` |
|
|
555
|
-
| Delete shared entry | `delete_entry(entry_id: <shared_id>, permanent: true)` |
|
|
556
|
-
| Delete update test entry | `delete_entry(entry_id: <update_test_id>, permanent: true)` |
|
|
557
|
-
|
|
558
|
-
---
|
|
559
|
-
|
|
560
|
-
## Test Execution Order
|
|
561
|
-
|
|
562
|
-
1. **Phase 16**: Sandbox Basics (must pass before proceeding)
|
|
563
|
-
2. **Phase 17**: API Discoverability (verifies mj.\* proxy construction)
|
|
564
|
-
3. **Phase 18**: Readonly Mode (verifies write filtering)
|
|
565
|
-
4. **Phase 19**: Error Handling & Security (blocked patterns, runtime errors)
|
|
566
|
-
5. **Phase 20**: Core CRUD via Code Mode (full create, update, delete, error paths)
|
|
567
|
-
6. **Phase 21**: Search & Semantics via Code Mode (FTS5, filters, date range, semantic, analytics)
|
|
568
|
-
|
|
569
|
-
---
|
|
570
|
-
|
|
571
|
-
## Success Criteria
|
|
572
|
-
|
|
573
|
-
### Sandbox Basics (Phase 16)
|
|
574
|
-
|
|
575
|
-
- [ ] Simple expressions return correct types: integer, string, object, null, boolean
|
|
576
|
-
- [ ] Async/await resolves correctly inside sandbox
|
|
577
|
-
- [ ] Built-in constructors available: JSON, Math, Date, Array, Map, Set, RegExp
|
|
578
|
-
- [ ] `metrics` field present with `wallTimeMs`, `cpuTimeMs`, `memoryUsedMb`
|
|
579
|
-
- [ ] Custom `timeout` parameter accepted and enforced
|
|
580
|
-
- [ ] Infinite loop terminated with structured error (not hang or crash)
|
|
581
|
-
|
|
582
|
-
### API Discoverability (Phase 17)
|
|
583
|
-
|
|
584
|
-
- [ ] `mj.help()` returns all 9 groups with correct `totalMethods` count
|
|
585
|
-
- [ ] Per-group `help()` returns method names for each group
|
|
586
|
-
- [ ] Method aliases work (e.g., `mj.core.recent()`, `mj.analytics.stats()`)
|
|
587
|
-
- [ ] Positional arguments work (e.g., `mj.core.get(id)`)
|
|
588
|
-
|
|
589
|
-
### Readonly Mode (Phase 18)
|
|
590
|
-
|
|
591
|
-
- [ ] `readonly: true` allows read operations (getRecentEntries, searchEntries, getStatistics)
|
|
592
|
-
- [ ] `readonly: true` blocks or errors on write operations (createEntry, updateEntry, deleteEntry)
|
|
593
|
-
- [ ] `readonly: false` (default) allows both read and write operations
|
|
594
|
-
- [ ] `mj.help()` still works in readonly mode
|
|
595
|
-
|
|
596
|
-
### Error Handling & Security (Phase 19)
|
|
597
|
-
|
|
598
|
-
- [ ] Empty code returns structured error (not raw MCP error)
|
|
599
|
-
- [ ] All 7 blocked patterns (`require`, `process`, `eval`, `import`, `Function`, `__proto__`, `child_process`) return structured security errors
|
|
600
|
-
- [ ] Syntax errors return `{ success: false, error: "..." }` with descriptive message
|
|
601
|
-
- [ ] Runtime errors (ReferenceError, TypeError) caught and returned as structured errors
|
|
602
|
-
- [ ] Nulled globals confirmed: `process`, `require`, `setTimeout`, `globalThis` are all `undefined`
|
|
603
|
-
|
|
604
|
-
### Core CRUD (Phase 20)
|
|
605
|
-
|
|
606
|
-
- [ ] `create_entry` persists all optional fields (PR, workflow, project) via Code Mode
|
|
607
|
-
- [ ] `create_entry` with `share_with_team: true` creates entry with `sharedWithTeam` and `author`
|
|
608
|
-
- [ ] `create_entry` rejects invalid `entry_type` and `significance_type` with structured errors
|
|
609
|
-
- [ ] `create_entry` rejects empty content with structured error
|
|
610
|
-
- [ ] `get_entry_by_id` returns `entryType`, `content`, `tags` via Code Mode (note: `importance`/`importanceBreakdown` only available via direct tool call)
|
|
611
|
-
- [ ] `get_entry_by_id` with `include_relationships: false` omits relationship data
|
|
612
|
-
- [ ] `update_entry` updates content, tags, and entry_type — verified via read-back
|
|
613
|
-
- [ ] `update_entry` returns structured error for nonexistent IDs
|
|
614
|
-
- [ ] `delete_entry` soft delete hides entry from search
|
|
615
|
-
- [ ] `delete_entry` permanent delete and nonexistent ID both return structured responses
|
|
616
|
-
- [ ] `get_recent_entries` with `is_personal` filter returns correctly filtered entries
|
|
617
|
-
- [ ] `test_simple` callable via Code Mode
|
|
618
|
-
|
|
619
|
-
### Search & Semantics (Phase 21)
|
|
620
|
-
|
|
621
|
-
- [ ] FTS5 phrase, prefix, boolean NOT, boolean OR all return correct results via Code Mode
|
|
622
|
-
- [ ] FTS5 LIKE fallback works for special characters (`test's`, `100%`)
|
|
623
|
-
- [ ] `search_entries` filters work: `issue_number`, `pr_status`, `workflow_run_id`, `project_number`, `is_personal`
|
|
624
|
-
- [ ] Cross-DB search returns entries with `source: 'personal'` and `source: 'team'`
|
|
625
|
-
- [ ] `search_by_date_range` with filters (`entry_type`, `tags`, `is_personal`) works
|
|
626
|
-
- [ ] `search_by_date_range` rejects invalid date format with structured error
|
|
627
|
-
- [ ] `semantic_search` with custom threshold returns fewer results
|
|
628
|
-
- [ ] `semantic_search` quality gate hint shown even with `hint_on_empty: false`
|
|
629
|
-
- [ ] `get_vector_index_stats` returns `available`, `itemCount`, `modelName`, `dimensions`
|
|
630
|
-
- [ ] `rebuild_vector_index` and `add_to_vector_index` work via Code Mode
|
|
631
|
-
- [ ] `get_statistics` returns all 4 enhanced analytics metrics via Code Mode
|
|
632
|
-
- [ ] `get_cross_project_insights` returns schema-compliant response
|