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.
Files changed (372) hide show
  1. package/README.md +44 -28
  2. package/dist/{chunk-X4SWFATC.js → chunk-BI4ZNSKA.js} +38 -24
  3. package/dist/{chunk-HCEWINSB.js → chunk-N6EBIDN7.js} +99 -102
  4. package/dist/cli.js +2 -2
  5. package/dist/index.js +2 -2
  6. package/dist/tools-WPRY5MJ6.js +2 -0
  7. package/package.json +10 -1
  8. package/skills/github-commander/SKILL.md +151 -0
  9. package/skills/github-commander/config/project-config.example.md +125 -0
  10. package/skills/github-commander/workflows/code-quality-audit.md +80 -0
  11. package/skills/github-commander/workflows/full-audit.md +134 -0
  12. package/skills/github-commander/workflows/issue-triage.md +239 -0
  13. package/skills/github-commander/workflows/milestone-sprint.md +81 -0
  14. package/skills/github-commander/workflows/perf-audit.md +142 -0
  15. package/skills/github-commander/workflows/pr-review.md +123 -0
  16. package/skills/github-commander/workflows/security-audit.md +170 -0
  17. package/skills/github-commander/workflows/update-deps.md +109 -0
  18. package/.dockerignore +0 -139
  19. package/.gitattributes +0 -20
  20. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -95
  21. package/.github/ISSUE_TEMPLATE/config.yml +0 -11
  22. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -110
  23. package/.github/ISSUE_TEMPLATE/question.md +0 -78
  24. package/.github/aw/actions-lock.json +0 -14
  25. package/.github/copilot-instructions.md +0 -122
  26. package/.github/dependabot.yml +0 -93
  27. package/.github/pull_request_template.md +0 -135
  28. package/.github/workflows/README.md +0 -133
  29. package/.github/workflows/agentics-maintenance.yml +0 -141
  30. package/.github/workflows/auto-release.yml +0 -68
  31. package/.github/workflows/ci-health-monitor.lock.yml +0 -1121
  32. package/.github/workflows/ci-health-monitor.md +0 -87
  33. package/.github/workflows/codeql.yml +0 -41
  34. package/.github/workflows/dependabot-auto-merge.yml +0 -42
  35. package/.github/workflows/dependency-maintenance.lock.yml +0 -1182
  36. package/.github/workflows/dependency-maintenance.md +0 -147
  37. package/.github/workflows/docker-publish.yml +0 -254
  38. package/.github/workflows/docs-drift-detector.lock.yml +0 -1142
  39. package/.github/workflows/docs-drift-detector.md +0 -115
  40. package/.github/workflows/lint-and-test.yml +0 -60
  41. package/.github/workflows/publish-npm.yml +0 -85
  42. package/.github/workflows/secrets-scanning.yml +0 -32
  43. package/.github/workflows/security-update.yml +0 -127
  44. package/.gitleaks.toml +0 -9
  45. package/.prettierignore +0 -21
  46. package/.prettierrc +0 -33
  47. package/.scout-ignore +0 -12
  48. package/.trivyignore +0 -21
  49. package/CHANGELOG.md +0 -1814
  50. package/CODE_OF_CONDUCT.md +0 -133
  51. package/CONTRIBUTING.md +0 -263
  52. package/DOCKER_README.md +0 -331
  53. package/Dockerfile +0 -128
  54. package/SECURITY.md +0 -227
  55. package/UNRELEASED.md +0 -1
  56. package/dist/tools-T4U5A3X4.js +0 -2
  57. package/docker-compose.yml +0 -71
  58. package/docs/README.md +0 -18
  59. package/docs/agentic-journal-synergy.md +0 -175
  60. package/docs/copilot-setup.md +0 -72
  61. package/eslint.config.js +0 -110
  62. package/mcp-config-example.json +0 -21
  63. package/playwright.config.ts +0 -35
  64. package/releases/v2.1.0.md +0 -220
  65. package/releases/v2.2.0.md +0 -168
  66. package/releases/v3.0.0.md +0 -237
  67. package/releases/v3.1.0.md +0 -104
  68. package/releases/v3.1.1.md +0 -42
  69. package/releases/v3.1.2.md +0 -40
  70. package/releases/v3.1.3.md +0 -64
  71. package/releases/v3.1.4.md +0 -32
  72. package/releases/v3.1.5.md +0 -44
  73. package/releases/v4.0.0.md +0 -71
  74. package/releases/v4.1.0.md +0 -88
  75. package/releases/v4.2.0.md +0 -90
  76. package/releases/v4.3.0.md +0 -92
  77. package/releases/v4.3.1.md +0 -69
  78. package/releases/v4.4.0.md +0 -120
  79. package/releases/v4.4.1.md +0 -33
  80. package/releases/v4.4.2.md +0 -31
  81. package/releases/v4.5.0.md +0 -116
  82. package/releases/v5.0.0.md +0 -105
  83. package/releases/v5.0.1.md +0 -25
  84. package/releases/v5.1.0.md +0 -83
  85. package/releases/v5.1.1.md +0 -10
  86. package/releases/v6.0.0.md +0 -48
  87. package/releases/v6.0.1.md +0 -36
  88. package/releases/v6.1.0.md +0 -68
  89. package/releases/v6.1.1.md +0 -30
  90. package/releases/v6.1.2.md +0 -23
  91. package/scripts/generate-server-instructions.ts +0 -306
  92. package/scripts/server-instructions-function-body.ts +0 -107
  93. package/scripts/server-instructions-gotchas.ts +0 -45
  94. package/server.json +0 -42
  95. package/social-preview.png +0 -0
  96. package/src/auth/auth-context.ts +0 -78
  97. package/src/auth/authorization-server-discovery.ts +0 -263
  98. package/src/auth/errors.ts +0 -215
  99. package/src/auth/index.ts +0 -58
  100. package/src/auth/middleware.ts +0 -392
  101. package/src/auth/oauth-resource-server.ts +0 -170
  102. package/src/auth/scope-map.ts +0 -46
  103. package/src/auth/scopes.ts +0 -256
  104. package/src/auth/token-validator.ts +0 -293
  105. package/src/auth/transport-agnostic.ts +0 -164
  106. package/src/auth/types.ts +0 -372
  107. package/src/cli.ts +0 -279
  108. package/src/codemode/api-constants.ts +0 -263
  109. package/src/codemode/api.ts +0 -302
  110. package/src/codemode/auto-return.ts +0 -65
  111. package/src/codemode/index.ts +0 -47
  112. package/src/codemode/sandbox-factory.ts +0 -144
  113. package/src/codemode/sandbox.ts +0 -220
  114. package/src/codemode/security.ts +0 -155
  115. package/src/codemode/types.ts +0 -228
  116. package/src/codemode/worker-sandbox.ts +0 -277
  117. package/src/codemode/worker-script.ts +0 -239
  118. package/src/constants/icons.ts +0 -183
  119. package/src/constants/server-instructions.md +0 -166
  120. package/src/constants/server-instructions.ts +0 -514
  121. package/src/database/adapter-factory.ts +0 -16
  122. package/src/database/core/entry-columns.ts +0 -10
  123. package/src/database/core/interfaces.ts +0 -188
  124. package/src/database/core/schema.ts +0 -152
  125. package/src/database/sqlite-adapter/backup.ts +0 -167
  126. package/src/database/sqlite-adapter/entries/crud.ts +0 -233
  127. package/src/database/sqlite-adapter/entries/importance.ts +0 -76
  128. package/src/database/sqlite-adapter/entries/index.ts +0 -142
  129. package/src/database/sqlite-adapter/entries/search.ts +0 -294
  130. package/src/database/sqlite-adapter/entries/shared.ts +0 -102
  131. package/src/database/sqlite-adapter/entries/statistics.ts +0 -162
  132. package/src/database/sqlite-adapter/index.ts +0 -265
  133. package/src/database/sqlite-adapter/native-connection.ts +0 -301
  134. package/src/database/sqlite-adapter/relationships.ts +0 -70
  135. package/src/database/sqlite-adapter/tags.ts +0 -182
  136. package/src/filtering/tool-filter.ts +0 -312
  137. package/src/github/github-integration/client.ts +0 -114
  138. package/src/github/github-integration/index.ts +0 -297
  139. package/src/github/github-integration/insights.ts +0 -155
  140. package/src/github/github-integration/issues.ts +0 -213
  141. package/src/github/github-integration/milestones.ts +0 -262
  142. package/src/github/github-integration/projects.ts +0 -414
  143. package/src/github/github-integration/pull-requests.ts +0 -235
  144. package/src/github/github-integration/repository.ts +0 -110
  145. package/src/github/github-integration/types.ts +0 -43
  146. package/src/handlers/prompts/github.ts +0 -210
  147. package/src/handlers/prompts/index.ts +0 -97
  148. package/src/handlers/prompts/workflow.ts +0 -361
  149. package/src/handlers/resources/core/briefing/context-section.ts +0 -182
  150. package/src/handlers/resources/core/briefing/github-section.ts +0 -354
  151. package/src/handlers/resources/core/briefing/index.ts +0 -106
  152. package/src/handlers/resources/core/briefing/user-message.ts +0 -114
  153. package/src/handlers/resources/core/health.ts +0 -75
  154. package/src/handlers/resources/core/index.ts +0 -31
  155. package/src/handlers/resources/core/instructions.ts +0 -45
  156. package/src/handlers/resources/core/utilities.ts +0 -310
  157. package/src/handlers/resources/github.ts +0 -340
  158. package/src/handlers/resources/graph.ts +0 -218
  159. package/src/handlers/resources/help.ts +0 -410
  160. package/src/handlers/resources/index.ts +0 -143
  161. package/src/handlers/resources/shared.ts +0 -219
  162. package/src/handlers/resources/team.ts +0 -134
  163. package/src/handlers/resources/templates.ts +0 -334
  164. package/src/handlers/tools/admin.ts +0 -351
  165. package/src/handlers/tools/analytics.ts +0 -346
  166. package/src/handlers/tools/backup.ts +0 -272
  167. package/src/handlers/tools/codemode.ts +0 -188
  168. package/src/handlers/tools/core.ts +0 -359
  169. package/src/handlers/tools/error-fields-mixin.ts +0 -10
  170. package/src/handlers/tools/export.ts +0 -150
  171. package/src/handlers/tools/github/copilot-tools.ts +0 -72
  172. package/src/handlers/tools/github/helpers.ts +0 -125
  173. package/src/handlers/tools/github/insights-tools.ts +0 -112
  174. package/src/handlers/tools/github/issue-tools.ts +0 -442
  175. package/src/handlers/tools/github/kanban-tools.ts +0 -153
  176. package/src/handlers/tools/github/milestone-tools.ts +0 -371
  177. package/src/handlers/tools/github/mutation-tools.ts +0 -17
  178. package/src/handlers/tools/github/read-tools.ts +0 -302
  179. package/src/handlers/tools/github/schemas.ts +0 -435
  180. package/src/handlers/tools/github.ts +0 -39
  181. package/src/handlers/tools/index.ts +0 -255
  182. package/src/handlers/tools/relationships.ts +0 -390
  183. package/src/handlers/tools/schemas.ts +0 -165
  184. package/src/handlers/tools/search.ts +0 -448
  185. package/src/handlers/tools/team/admin-tools.ts +0 -164
  186. package/src/handlers/tools/team/analytics-tools.ts +0 -233
  187. package/src/handlers/tools/team/backup-tools.ts +0 -83
  188. package/src/handlers/tools/team/core-tools.ts +0 -197
  189. package/src/handlers/tools/team/export-tools.ts +0 -130
  190. package/src/handlers/tools/team/helpers.ts +0 -66
  191. package/src/handlers/tools/team/index.ts +0 -45
  192. package/src/handlers/tools/team/relationship-tools.ts +0 -219
  193. package/src/handlers/tools/team/schemas.ts +0 -558
  194. package/src/handlers/tools/team/search-tools.ts +0 -145
  195. package/src/handlers/tools/team/vector-tools.ts +0 -261
  196. package/src/index.ts +0 -57
  197. package/src/server/mcp-server.ts +0 -446
  198. package/src/server/registration.ts +0 -141
  199. package/src/server/scheduler.ts +0 -283
  200. package/src/transports/http/handlers.ts +0 -78
  201. package/src/transports/http/index.ts +0 -8
  202. package/src/transports/http/security.ts +0 -147
  203. package/src/transports/http/server/index.ts +0 -397
  204. package/src/transports/http/server/legacy-sse.ts +0 -87
  205. package/src/transports/http/server/stateful.ts +0 -222
  206. package/src/transports/http/server/stateless.ts +0 -42
  207. package/src/transports/http/types.ts +0 -132
  208. package/src/types/entities.ts +0 -145
  209. package/src/types/error-types.ts +0 -92
  210. package/src/types/errors.ts +0 -200
  211. package/src/types/filtering.ts +0 -55
  212. package/src/types/github.ts +0 -216
  213. package/src/types/index.ts +0 -348
  214. package/src/utils/error-helpers.ts +0 -78
  215. package/src/utils/errors/error-response-fields.ts +0 -29
  216. package/src/utils/errors/suggestions.ts +0 -94
  217. package/src/utils/github-helpers.ts +0 -33
  218. package/src/utils/logger.ts +0 -107
  219. package/src/utils/mcp-logger.ts +0 -155
  220. package/src/utils/progress-utils.ts +0 -100
  221. package/src/utils/query-helpers.ts +0 -78
  222. package/src/utils/resource-annotations.ts +0 -75
  223. package/src/utils/security-utils.ts +0 -198
  224. package/src/utils/vector-index-helpers.ts +0 -24
  225. package/src/vector/vector-search-manager.ts +0 -409
  226. package/src/version.ts +0 -15
  227. package/test-server/README.md +0 -193
  228. package/test-server/code-map.md +0 -399
  229. package/test-server/test-agent-experience.md +0 -213
  230. package/test-server/test-filter-instructions.mjs +0 -295
  231. package/test-server/test-instruction-levels.mjs +0 -102
  232. package/test-server/test-preflight.md +0 -55
  233. package/test-server/test-prompts.mjs +0 -185
  234. package/test-server/test-scheduler.mjs +0 -174
  235. package/test-server/test-tool-annotations.mjs +0 -115
  236. package/test-server/test-tools-codemode.md +0 -632
  237. package/test-server/test-tools-codemode2.md +0 -1218
  238. package/test-server/test-tools-team.md +0 -215
  239. package/test-server/test-tools.md +0 -429
  240. package/test-server/test-tools2.md +0 -361
  241. package/test-server/test-tools3.md +0 -396
  242. package/test-server/tool-reference.md +0 -231
  243. package/tests/README.md +0 -54
  244. package/tests/auth/auth-context.test.ts +0 -162
  245. package/tests/auth/authorization-server-discovery.test.ts +0 -265
  246. package/tests/auth/errors.test.ts +0 -170
  247. package/tests/auth/middleware.test.ts +0 -585
  248. package/tests/auth/oauth-resource-server.test.ts +0 -173
  249. package/tests/auth/scope-map.test.ts +0 -66
  250. package/tests/auth/scopes.test.ts +0 -347
  251. package/tests/auth/token-validator.test.ts +0 -271
  252. package/tests/codemode/api.test.ts +0 -396
  253. package/tests/codemode/auto-return.test.ts +0 -167
  254. package/tests/codemode/codemode-tool-handlers.test.ts +0 -197
  255. package/tests/codemode/sandbox-factory.test.ts +0 -152
  256. package/tests/codemode/sandbox.test.ts +0 -190
  257. package/tests/codemode/security.test.ts +0 -242
  258. package/tests/codemode/worker-sandbox.test.ts +0 -106
  259. package/tests/constants/icons.test.ts +0 -101
  260. package/tests/constants/server-instructions.test.ts +0 -514
  261. package/tests/database/crud-workflow-branches.test.ts +0 -418
  262. package/tests/database/database-branches.test.ts +0 -132
  263. package/tests/database/entries-auth-branches.test.ts +0 -390
  264. package/tests/database/native-connection.test.ts +0 -249
  265. package/tests/database/shared-helpers.test.ts +0 -103
  266. package/tests/database/sqlite-adapter.bench.ts +0 -63
  267. package/tests/database/sqlite-adapter.test.ts +0 -690
  268. package/tests/database/tags.test.ts +0 -134
  269. package/tests/e2e/README.md +0 -39
  270. package/tests/e2e/auth.spec.ts +0 -106
  271. package/tests/e2e/codemode-abuse.spec.ts +0 -75
  272. package/tests/e2e/health.spec.ts +0 -63
  273. package/tests/e2e/helpers.ts +0 -139
  274. package/tests/e2e/oauth-discovery.spec.ts +0 -102
  275. package/tests/e2e/oauth-scopes.spec.ts +0 -222
  276. package/tests/e2e/payloads-admin.spec.ts +0 -76
  277. package/tests/e2e/payloads-analytics.spec.ts +0 -37
  278. package/tests/e2e/payloads-backup-restore.spec.ts +0 -102
  279. package/tests/e2e/payloads-backup.spec.ts +0 -44
  280. package/tests/e2e/payloads-codemode-api.spec.ts +0 -131
  281. package/tests/e2e/payloads-codemode-readonly.spec.ts +0 -116
  282. package/tests/e2e/payloads-codemode.spec.ts +0 -116
  283. package/tests/e2e/payloads-core.spec.ts +0 -82
  284. package/tests/e2e/payloads-error-contracts.spec.ts +0 -159
  285. package/tests/e2e/payloads-export.spec.ts +0 -46
  286. package/tests/e2e/payloads-github-degradation.spec.ts +0 -73
  287. package/tests/e2e/payloads-github.spec.ts +0 -176
  288. package/tests/e2e/payloads-relationships.spec.ts +0 -56
  289. package/tests/e2e/payloads-search.spec.ts +0 -64
  290. package/tests/e2e/payloads-team-happy.spec.ts +0 -231
  291. package/tests/e2e/payloads-team.spec.ts +0 -174
  292. package/tests/e2e/prompts-expanded.spec.ts +0 -137
  293. package/tests/e2e/prompts.spec.ts +0 -62
  294. package/tests/e2e/protocols.spec.ts +0 -134
  295. package/tests/e2e/rate-limiting.spec.ts +0 -291
  296. package/tests/e2e/resources-briefing-env.spec.ts +0 -106
  297. package/tests/e2e/resources-complete.spec.ts +0 -180
  298. package/tests/e2e/resources-expanded.spec.ts +0 -83
  299. package/tests/e2e/resources-instructions-levels.spec.ts +0 -145
  300. package/tests/e2e/resources-templates.spec.ts +0 -123
  301. package/tests/e2e/resources.spec.ts +0 -103
  302. package/tests/e2e/scheduler.spec.ts +0 -79
  303. package/tests/e2e/security.spec.ts +0 -112
  304. package/tests/e2e/session-advanced.spec.ts +0 -152
  305. package/tests/e2e/sessions.spec.ts +0 -95
  306. package/tests/e2e/stateless.spec.ts +0 -79
  307. package/tests/e2e/streaming.spec.ts +0 -176
  308. package/tests/e2e/tool-filtering-presets.spec.ts +0 -192
  309. package/tests/e2e/tool-filtering.spec.ts +0 -77
  310. package/tests/e2e/tools.spec.ts +0 -111
  311. package/tests/filtering/tool-filter.test.ts +0 -314
  312. package/tests/github/client-issues-errors.test.ts +0 -433
  313. package/tests/github/github-integration-branches.test.ts +0 -490
  314. package/tests/github/github-integration.test.ts +0 -1015
  315. package/tests/github/github-managers-branches.test.ts +0 -907
  316. package/tests/github/pull-requests.test.ts +0 -334
  317. package/tests/handlers/analytics-branches.test.ts +0 -222
  318. package/tests/handlers/backup-branches.test.ts +0 -270
  319. package/tests/handlers/briefing-context-section.test.ts +0 -388
  320. package/tests/handlers/briefing-github-section.test.ts +0 -392
  321. package/tests/handlers/briefing-user-message.test.ts +0 -405
  322. package/tests/handlers/codemode-tools.test.ts +0 -85
  323. package/tests/handlers/copilot-tools.test.ts +0 -126
  324. package/tests/handlers/error-path-coverage.test.ts +0 -324
  325. package/tests/handlers/export-tools.test.ts +0 -203
  326. package/tests/handlers/github-resource-handlers.test.ts +0 -929
  327. package/tests/handlers/github-tool-handlers.test.ts +0 -1452
  328. package/tests/handlers/handler-error-branches.test.ts +0 -346
  329. package/tests/handlers/help-resource.test.ts +0 -92
  330. package/tests/handlers/prompt-handler-coverage.test.ts +0 -108
  331. package/tests/handlers/prompt-handlers.test.ts +0 -131
  332. package/tests/handlers/resource-handler-coverage.test.ts +0 -281
  333. package/tests/handlers/resource-handlers.test.ts +0 -357
  334. package/tests/handlers/resource-prompt-branches.test.ts +0 -495
  335. package/tests/handlers/search-tool-handlers.test.ts +0 -379
  336. package/tests/handlers/targeted-gap-closure.test.ts +0 -387
  337. package/tests/handlers/team-admin.test.ts +0 -291
  338. package/tests/handlers/team-analytics.test.ts +0 -220
  339. package/tests/handlers/team-core.test.ts +0 -148
  340. package/tests/handlers/team-data.test.ts +0 -198
  341. package/tests/handlers/team-relationships.test.ts +0 -271
  342. package/tests/handlers/team-resource-handlers.test.ts +0 -161
  343. package/tests/handlers/team-search.test.ts +0 -134
  344. package/tests/handlers/team-tool-handlers.test.ts +0 -301
  345. package/tests/handlers/team-vector.test.ts +0 -213
  346. package/tests/handlers/template-github-branches.test.ts +0 -676
  347. package/tests/handlers/tool-annotations.test.ts +0 -90
  348. package/tests/handlers/tool-handler-coverage.test.ts +0 -514
  349. package/tests/handlers/tool-handlers.test.ts +0 -510
  350. package/tests/handlers/tool-output-schemas.test.ts +0 -116
  351. package/tests/handlers/vector-tool-handlers.test.ts +0 -238
  352. package/tests/security/sql-injection.test.ts +0 -284
  353. package/tests/server/mcp-server.bench.ts +0 -55
  354. package/tests/server/mcp-server.test.ts +0 -1326
  355. package/tests/server/scheduler.test.ts +0 -400
  356. package/tests/transports/http-legacy-sse.test.ts +0 -275
  357. package/tests/transports/http-security.test.ts +0 -322
  358. package/tests/transports/http-stateful.test.ts +0 -487
  359. package/tests/transports/http-transport-server.test.ts +0 -301
  360. package/tests/transports/http-transport.test.ts +0 -771
  361. package/tests/utils/github-helpers.test.ts +0 -58
  362. package/tests/utils/logger.test.ts +0 -180
  363. package/tests/utils/mcp-logger.test.ts +0 -211
  364. package/tests/utils/progress-utils.test.ts +0 -156
  365. package/tests/utils/query-helpers.test.ts +0 -80
  366. package/tests/utils/security-utils.test.ts +0 -82
  367. package/tests/vector/vector-search-branches.test.ts +0 -111
  368. package/tests/vector/vector-search-manager.test.ts +0 -375
  369. package/tests/vector/vector-search.bench.ts +0 -48
  370. package/tsconfig.json +0 -42
  371. package/tsup.config.ts +0 -19
  372. 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