memory-journal-mcp 4.4.2 → 5.0.0

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 (291) hide show
  1. package/.github/workflows/codeql.yml +1 -6
  2. package/.github/workflows/docker-publish.yml +15 -49
  3. package/.github/workflows/lint-and-test.yml +1 -1
  4. package/.github/workflows/secrets-scanning.yml +4 -3
  5. package/.github/workflows/security-update.yml +3 -3
  6. package/CHANGELOG.md +213 -0
  7. package/CONTRIBUTING.md +132 -97
  8. package/DOCKER_README.md +184 -235
  9. package/Dockerfile +27 -24
  10. package/README.md +218 -190
  11. package/SECURITY.md +27 -35
  12. package/dist/cli.js +16 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/constants/ServerInstructions.d.ts +5 -1
  15. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  16. package/dist/constants/ServerInstructions.js +133 -73
  17. package/dist/constants/ServerInstructions.js.map +1 -1
  18. package/dist/constants/icons.d.ts +2 -2
  19. package/dist/constants/icons.d.ts.map +1 -1
  20. package/dist/constants/icons.js +7 -6
  21. package/dist/constants/icons.js.map +1 -1
  22. package/dist/database/SqliteAdapter.d.ts +37 -24
  23. package/dist/database/SqliteAdapter.d.ts.map +1 -1
  24. package/dist/database/SqliteAdapter.js +319 -157
  25. package/dist/database/SqliteAdapter.js.map +1 -1
  26. package/dist/database/schema.d.ts +45 -0
  27. package/dist/database/schema.d.ts.map +1 -0
  28. package/dist/database/schema.js +92 -0
  29. package/dist/database/schema.js.map +1 -0
  30. package/dist/filtering/ToolFilter.d.ts +1 -1
  31. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  32. package/dist/filtering/ToolFilter.js +13 -2
  33. package/dist/filtering/ToolFilter.js.map +1 -1
  34. package/dist/github/GitHubIntegration.d.ts.map +1 -1
  35. package/dist/github/GitHubIntegration.js +1 -3
  36. package/dist/github/GitHubIntegration.js.map +1 -1
  37. package/dist/handlers/prompts/github.d.ts +12 -0
  38. package/dist/handlers/prompts/github.d.ts.map +1 -0
  39. package/dist/handlers/prompts/github.js +178 -0
  40. package/dist/handlers/prompts/github.js.map +1 -0
  41. package/dist/handlers/prompts/index.d.ts +23 -2
  42. package/dist/handlers/prompts/index.d.ts.map +1 -1
  43. package/dist/handlers/prompts/index.js +7 -432
  44. package/dist/handlers/prompts/index.js.map +1 -1
  45. package/dist/handlers/prompts/workflow.d.ts +12 -0
  46. package/dist/handlers/prompts/workflow.d.ts.map +1 -0
  47. package/dist/handlers/prompts/workflow.js +277 -0
  48. package/dist/handlers/prompts/workflow.js.map +1 -0
  49. package/dist/handlers/resources/core.d.ts +11 -0
  50. package/dist/handlers/resources/core.d.ts.map +1 -0
  51. package/dist/handlers/resources/core.js +433 -0
  52. package/dist/handlers/resources/core.js.map +1 -0
  53. package/dist/handlers/resources/github.d.ts +11 -0
  54. package/dist/handlers/resources/github.d.ts.map +1 -0
  55. package/dist/handlers/resources/github.js +314 -0
  56. package/dist/handlers/resources/github.js.map +1 -0
  57. package/dist/handlers/resources/graph.d.ts +11 -0
  58. package/dist/handlers/resources/graph.d.ts.map +1 -0
  59. package/dist/handlers/resources/graph.js +204 -0
  60. package/dist/handlers/resources/graph.js.map +1 -0
  61. package/dist/handlers/resources/index.d.ts +5 -20
  62. package/dist/handlers/resources/index.d.ts.map +1 -1
  63. package/dist/handlers/resources/index.js +16 -1278
  64. package/dist/handlers/resources/index.js.map +1 -1
  65. package/dist/handlers/resources/shared.d.ts +60 -0
  66. package/dist/handlers/resources/shared.d.ts.map +1 -0
  67. package/dist/handlers/resources/shared.js +49 -0
  68. package/dist/handlers/resources/shared.js.map +1 -0
  69. package/dist/handlers/resources/team.d.ts +13 -0
  70. package/dist/handlers/resources/team.d.ts.map +1 -0
  71. package/dist/handlers/resources/team.js +119 -0
  72. package/dist/handlers/resources/team.js.map +1 -0
  73. package/dist/handlers/resources/templates.d.ts +13 -0
  74. package/dist/handlers/resources/templates.d.ts.map +1 -0
  75. package/dist/handlers/resources/templates.js +310 -0
  76. package/dist/handlers/resources/templates.js.map +1 -0
  77. package/dist/handlers/tools/admin.d.ts +8 -0
  78. package/dist/handlers/tools/admin.d.ts.map +1 -0
  79. package/dist/handlers/tools/admin.js +270 -0
  80. package/dist/handlers/tools/admin.js.map +1 -0
  81. package/dist/handlers/tools/analytics.d.ts +8 -0
  82. package/dist/handlers/tools/analytics.d.ts.map +1 -0
  83. package/dist/handlers/tools/analytics.js +256 -0
  84. package/dist/handlers/tools/analytics.js.map +1 -0
  85. package/dist/handlers/tools/backup.d.ts +8 -0
  86. package/dist/handlers/tools/backup.d.ts.map +1 -0
  87. package/dist/handlers/tools/backup.js +224 -0
  88. package/dist/handlers/tools/backup.js.map +1 -0
  89. package/dist/handlers/tools/core.d.ts +9 -0
  90. package/dist/handlers/tools/core.d.ts.map +1 -0
  91. package/dist/handlers/tools/core.js +326 -0
  92. package/dist/handlers/tools/core.js.map +1 -0
  93. package/dist/handlers/tools/export.d.ts +8 -0
  94. package/dist/handlers/tools/export.d.ts.map +1 -0
  95. package/dist/handlers/tools/export.js +89 -0
  96. package/dist/handlers/tools/export.js.map +1 -0
  97. package/dist/handlers/tools/github/helpers.d.ts +34 -0
  98. package/dist/handlers/tools/github/helpers.d.ts.map +1 -0
  99. package/dist/handlers/tools/github/helpers.js +52 -0
  100. package/dist/handlers/tools/github/helpers.js.map +1 -0
  101. package/dist/handlers/tools/github/insights-tools.d.ts +8 -0
  102. package/dist/handlers/tools/github/insights-tools.d.ts.map +1 -0
  103. package/dist/handlers/tools/github/insights-tools.js +104 -0
  104. package/dist/handlers/tools/github/insights-tools.js.map +1 -0
  105. package/dist/handlers/tools/github/issue-tools.d.ts +8 -0
  106. package/dist/handlers/tools/github/issue-tools.d.ts.map +1 -0
  107. package/dist/handlers/tools/github/issue-tools.js +359 -0
  108. package/dist/handlers/tools/github/issue-tools.js.map +1 -0
  109. package/dist/handlers/tools/github/kanban-tools.d.ts +8 -0
  110. package/dist/handlers/tools/github/kanban-tools.d.ts.map +1 -0
  111. package/dist/handlers/tools/github/kanban-tools.js +108 -0
  112. package/dist/handlers/tools/github/kanban-tools.js.map +1 -0
  113. package/dist/handlers/tools/github/milestone-tools.d.ts +9 -0
  114. package/dist/handlers/tools/github/milestone-tools.d.ts.map +1 -0
  115. package/dist/handlers/tools/github/milestone-tools.js +302 -0
  116. package/dist/handlers/tools/github/milestone-tools.js.map +1 -0
  117. package/dist/handlers/tools/github/mutation-tools.d.ts +12 -0
  118. package/dist/handlers/tools/github/mutation-tools.d.ts.map +1 -0
  119. package/dist/handlers/tools/github/mutation-tools.js +15 -0
  120. package/dist/handlers/tools/github/mutation-tools.js.map +1 -0
  121. package/dist/handlers/tools/github/read-tools.d.ts +8 -0
  122. package/dist/handlers/tools/github/read-tools.d.ts.map +1 -0
  123. package/dist/handlers/tools/github/read-tools.js +260 -0
  124. package/dist/handlers/tools/github/read-tools.js.map +1 -0
  125. package/dist/handlers/tools/github/schemas.d.ts +467 -0
  126. package/dist/handlers/tools/github/schemas.d.ts.map +1 -0
  127. package/dist/handlers/tools/github/schemas.js +335 -0
  128. package/dist/handlers/tools/github/schemas.js.map +1 -0
  129. package/dist/handlers/tools/github.d.ts +14 -0
  130. package/dist/handlers/tools/github.d.ts.map +1 -0
  131. package/dist/handlers/tools/github.js +28 -0
  132. package/dist/handlers/tools/github.js.map +1 -0
  133. package/dist/handlers/tools/index.d.ts +15 -20
  134. package/dist/handlers/tools/index.d.ts.map +1 -1
  135. package/dist/handlers/tools/index.js +117 -2909
  136. package/dist/handlers/tools/index.js.map +1 -1
  137. package/dist/handlers/tools/relationships.d.ts +8 -0
  138. package/dist/handlers/tools/relationships.d.ts.map +1 -0
  139. package/dist/handlers/tools/relationships.js +308 -0
  140. package/dist/handlers/tools/relationships.js.map +1 -0
  141. package/dist/handlers/tools/schemas.d.ts +108 -0
  142. package/dist/handlers/tools/schemas.d.ts.map +1 -0
  143. package/dist/handlers/tools/schemas.js +122 -0
  144. package/dist/handlers/tools/schemas.js.map +1 -0
  145. package/dist/handlers/tools/search.d.ts +8 -0
  146. package/dist/handlers/tools/search.d.ts.map +1 -0
  147. package/dist/handlers/tools/search.js +282 -0
  148. package/dist/handlers/tools/search.js.map +1 -0
  149. package/dist/handlers/tools/team.d.ts +11 -0
  150. package/dist/handlers/tools/team.d.ts.map +1 -0
  151. package/dist/handlers/tools/team.js +239 -0
  152. package/dist/handlers/tools/team.js.map +1 -0
  153. package/dist/server/McpServer.d.ts +4 -0
  154. package/dist/server/McpServer.d.ts.map +1 -1
  155. package/dist/server/McpServer.js +48 -297
  156. package/dist/server/McpServer.js.map +1 -1
  157. package/dist/server/Scheduler.d.ts +91 -0
  158. package/dist/server/Scheduler.d.ts.map +1 -0
  159. package/dist/server/Scheduler.js +201 -0
  160. package/dist/server/Scheduler.js.map +1 -0
  161. package/dist/transports/http.d.ts +66 -0
  162. package/dist/transports/http.d.ts.map +1 -0
  163. package/dist/transports/http.js +519 -0
  164. package/dist/transports/http.js.map +1 -0
  165. package/dist/types/entities.d.ts +101 -0
  166. package/dist/types/entities.d.ts.map +1 -0
  167. package/dist/types/entities.js +5 -0
  168. package/dist/types/entities.js.map +1 -0
  169. package/dist/types/filtering.d.ts +34 -0
  170. package/dist/types/filtering.d.ts.map +1 -0
  171. package/dist/types/filtering.js +5 -0
  172. package/dist/types/filtering.js.map +1 -0
  173. package/dist/types/github.d.ts +166 -0
  174. package/dist/types/github.d.ts.map +1 -0
  175. package/dist/types/github.js +5 -0
  176. package/dist/types/github.js.map +1 -0
  177. package/dist/types/index.d.ts +35 -292
  178. package/dist/types/index.d.ts.map +1 -1
  179. package/dist/types/index.js +2 -2
  180. package/dist/types/index.js.map +1 -1
  181. package/dist/utils/error-helpers.d.ts +37 -0
  182. package/dist/utils/error-helpers.d.ts.map +1 -0
  183. package/dist/utils/error-helpers.js +47 -0
  184. package/dist/utils/error-helpers.js.map +1 -0
  185. package/dist/utils/logger.d.ts.map +1 -1
  186. package/dist/utils/logger.js +6 -3
  187. package/dist/utils/logger.js.map +1 -1
  188. package/dist/utils/security-utils.d.ts +0 -21
  189. package/dist/utils/security-utils.d.ts.map +1 -1
  190. package/dist/utils/security-utils.js +0 -47
  191. package/dist/utils/security-utils.js.map +1 -1
  192. package/dist/vector/VectorSearchManager.d.ts.map +1 -1
  193. package/dist/vector/VectorSearchManager.js +9 -32
  194. package/dist/vector/VectorSearchManager.js.map +1 -1
  195. package/docker-compose.yml +11 -2
  196. package/hooks/README.md +107 -0
  197. package/hooks/cursor/hooks.json +10 -0
  198. package/hooks/cursor/memory-journal.mdc +22 -0
  199. package/hooks/cursor/session-end.sh +19 -0
  200. package/hooks/kilo-code/session-end-mode.json +11 -0
  201. package/hooks/kiro/session-end.md +13 -0
  202. package/mcp-config-example.json +1 -0
  203. package/package.json +11 -9
  204. package/playwright.config.ts +29 -0
  205. package/releases/v4.5.0.md +116 -0
  206. package/releases/v5.0.0.md +105 -0
  207. package/scripts/generate-server-instructions.ts +176 -0
  208. package/scripts/server-instructions-function-body.ts +77 -0
  209. package/server.json +3 -3
  210. package/src/cli.ts +45 -1
  211. package/src/constants/ServerInstructions.ts +133 -73
  212. package/src/constants/icons.ts +8 -7
  213. package/src/constants/server-instructions.md +268 -0
  214. package/src/database/SqliteAdapter.ts +358 -192
  215. package/src/database/schema.ts +125 -0
  216. package/src/filtering/ToolFilter.ts +13 -2
  217. package/src/github/GitHubIntegration.ts +1 -3
  218. package/src/handlers/prompts/github.ts +209 -0
  219. package/src/handlers/prompts/index.ts +10 -499
  220. package/src/handlers/prompts/workflow.ts +314 -0
  221. package/src/handlers/resources/core.ts +528 -0
  222. package/src/handlers/resources/github.ts +358 -0
  223. package/src/handlers/resources/graph.ts +254 -0
  224. package/src/handlers/resources/index.ts +23 -1570
  225. package/src/handlers/resources/shared.ts +103 -0
  226. package/src/handlers/resources/team.ts +133 -0
  227. package/src/handlers/resources/templates.ts +374 -0
  228. package/src/handlers/tools/admin.ts +285 -0
  229. package/src/handlers/tools/analytics.ts +301 -0
  230. package/src/handlers/tools/backup.ts +242 -0
  231. package/src/handlers/tools/core.ts +350 -0
  232. package/src/handlers/tools/export.ts +115 -0
  233. package/src/handlers/tools/github/helpers.ts +86 -0
  234. package/src/handlers/tools/github/insights-tools.ts +119 -0
  235. package/src/handlers/tools/github/issue-tools.ts +439 -0
  236. package/src/handlers/tools/github/kanban-tools.ts +134 -0
  237. package/src/handlers/tools/github/milestone-tools.ts +392 -0
  238. package/src/handlers/tools/github/mutation-tools.ts +17 -0
  239. package/src/handlers/tools/github/read-tools.ts +328 -0
  240. package/src/handlers/tools/github/schemas.ts +369 -0
  241. package/src/handlers/tools/github.ts +36 -0
  242. package/src/handlers/tools/index.ts +144 -3325
  243. package/src/handlers/tools/relationships.ts +358 -0
  244. package/src/handlers/tools/schemas.ts +132 -0
  245. package/src/handlers/tools/search.ts +343 -0
  246. package/src/handlers/tools/team.ts +273 -0
  247. package/src/server/McpServer.ts +63 -358
  248. package/src/server/Scheduler.ts +278 -0
  249. package/src/transports/http.ts +635 -0
  250. package/src/types/entities.ts +145 -0
  251. package/src/types/filtering.ts +54 -0
  252. package/src/types/github.ts +180 -0
  253. package/src/types/index.ts +67 -375
  254. package/src/utils/error-helpers.ts +52 -0
  255. package/src/utils/logger.ts +6 -3
  256. package/src/utils/security-utils.ts +0 -52
  257. package/src/vector/VectorSearchManager.ts +9 -33
  258. package/tests/constants/icons.test.ts +1 -2
  259. package/tests/constants/server-instructions.test.ts +30 -4
  260. package/tests/database/sqlite-adapter.test.ts +91 -7
  261. package/tests/e2e/auth.spec.ts +154 -0
  262. package/tests/e2e/health.spec.ts +63 -0
  263. package/tests/e2e/protocols.spec.ts +134 -0
  264. package/tests/e2e/resources.spec.ts +103 -0
  265. package/tests/e2e/scheduler.spec.ts +79 -0
  266. package/tests/e2e/security.spec.ts +91 -0
  267. package/tests/e2e/sessions.spec.ts +95 -0
  268. package/tests/e2e/stateless.spec.ts +121 -0
  269. package/tests/e2e/tools.spec.ts +111 -0
  270. package/tests/filtering/tool-filter.test.ts +46 -0
  271. package/tests/handlers/error-path-coverage.test.ts +324 -0
  272. package/tests/handlers/github-resource-handlers.test.ts +453 -0
  273. package/tests/handlers/github-tool-handlers.test.ts +899 -0
  274. package/tests/handlers/prompt-handler-coverage.test.ts +106 -0
  275. package/tests/handlers/prompt-handlers.test.ts +40 -0
  276. package/tests/handlers/resource-handler-coverage.test.ts +181 -0
  277. package/tests/handlers/resource-handlers.test.ts +33 -9
  278. package/tests/handlers/search-tool-handlers.test.ts +272 -0
  279. package/tests/handlers/targeted-gap-closure.test.ts +387 -0
  280. package/tests/handlers/team-resource-handlers.test.ts +156 -0
  281. package/tests/handlers/team-tool-handlers.test.ts +301 -0
  282. package/tests/handlers/tool-handler-coverage.test.ts +469 -0
  283. package/tests/handlers/tool-handlers.test.ts +2 -2
  284. package/tests/security/sql-injection.test.ts +3 -54
  285. package/tests/server/mcp-server.test.ts +503 -8
  286. package/tests/server/scheduler.test.ts +400 -0
  287. package/tests/transports/http-transport.test.ts +620 -0
  288. package/tests/vector/vector-search-manager.test.ts +60 -0
  289. package/vitest.config.ts +4 -1
  290. package/.memory-journal-team.db +0 -0
  291. package/.vscode/settings.json +0 -84
@@ -1,63 +1,44 @@
1
1
  /**
2
2
  * Memory Journal MCP Server - Type Definitions
3
3
  *
4
- * Core types for the MCP server including tools, resources, prompts,
5
- * database entities, and filtering.
6
- */
7
-
8
- // ============================================================================
9
- // Tool Filtering Types
10
- // ============================================================================
11
-
12
- /**
13
- * Tool group identifiers for Memory Journal
14
- */
15
- export type ToolGroup =
16
- | 'core' // Entry CRUD: create, get_by_id, get_recent, create_minimal, test_simple
17
- | 'search' // Search: search_entries, search_by_date_range, semantic_search
18
- | 'analytics' // Analytics: get_statistics, get_cross_project_insights
19
- | 'relationships' // Relationships: link_entries, visualize_relationships
20
- | 'export' // Export: export_entries
21
- | 'admin' // Admin: update_entry, delete_entry
22
- | 'github' // Reserved for future GitHub-specific tools
23
- | 'backup' // Backup: backup_journal, list_backups, restore_backup
24
-
25
- /**
26
- * Meta-group identifiers for common multi-group selections
27
- */
28
- export type MetaGroup =
29
- | 'starter' // core + search (~8 tools)
30
- | 'essential' // core only (~5 tools)
31
- | 'full' // all groups (~16 tools)
32
- | 'readonly' // everything except admin
33
-
34
- /**
35
- * Tool filter rule
36
- */
37
- export interface ToolFilterRule {
38
- /** Rule type: include or exclude */
39
- type: 'include' | 'exclude'
40
-
41
- /** Target: group name or tool name */
42
- target: string
43
-
44
- /** Whether target is a group (true) or individual tool (false) */
45
- isGroup: boolean
46
- }
47
-
48
- /**
49
- * Parsed tool filter configuration
50
- */
51
- export interface ToolFilterConfig {
52
- /** Original filter string */
53
- raw: string
54
-
55
- /** Parsed rules in order */
56
- rules: ToolFilterRule[]
57
-
58
- /** Set of enabled tool names after applying rules */
59
- enabledTools: Set<string>
60
- }
4
+ * Barrel file re-exporting all types from sub-modules, plus types
5
+ * that depend on external imports (SqliteAdapter, VectorSearchManager, etc.).
6
+ */
7
+
8
+ import type { SqliteAdapter } from '../database/SqliteAdapter.js'
9
+ import type { VectorSearchManager } from '../vector/VectorSearchManager.js'
10
+ import type { GitHubIntegration } from '../github/GitHubIntegration.js'
11
+ import type { ProgressContext } from '../utils/progress-utils.js'
12
+
13
+ // Re-export sub-module types
14
+ export type { ToolGroup, MetaGroup, ToolFilterRule, ToolFilterConfig } from './filtering.js'
15
+ export type {
16
+ EntryType,
17
+ SignificanceType,
18
+ RelationshipType,
19
+ JournalEntry,
20
+ Tag,
21
+ Relationship,
22
+ Embedding,
23
+ ImportanceBreakdown,
24
+ ImportanceResult,
25
+ } from './entities.js'
26
+ export type {
27
+ GitHubProject,
28
+ GitHubIssue,
29
+ GitHubPullRequest,
30
+ GitHubMilestone,
31
+ GitHubWorkflowRun,
32
+ ProjectContext,
33
+ RepoStats,
34
+ TrafficData,
35
+ TrafficReferrer,
36
+ PopularPath,
37
+ ProjectV2StatusOption,
38
+ ProjectV2Item,
39
+ KanbanColumn,
40
+ KanbanBoard,
41
+ } from './github.js'
61
42
 
62
43
  // ============================================================================
63
44
  // MCP 2025-11-25 Annotations
@@ -117,6 +98,8 @@ export interface McpIcon {
117
98
  // Tool, Resource, Prompt Definitions
118
99
  // ============================================================================
119
100
 
101
+ import type { ToolGroup } from './filtering.js'
102
+
120
103
  /**
121
104
  * Tool definition for registration
122
105
  */
@@ -143,7 +126,33 @@ export interface ToolDefinition {
143
126
  annotations: ToolAnnotations
144
127
 
145
128
  /** Tool handler function */
146
- handler: (params: unknown) => Promise<unknown>
129
+ handler: (params: unknown) => unknown
130
+ }
131
+
132
+ /**
133
+ * Tool handler configuration options
134
+ */
135
+ export interface ToolHandlerConfig {
136
+ /** Default GitHub Project number for auto-assignment */
137
+ defaultProjectNumber?: number
138
+ }
139
+
140
+ /**
141
+ * Tool execution context passed to all tool group modules
142
+ */
143
+ export interface ToolContext {
144
+ /** Database adapter */
145
+ db: SqliteAdapter
146
+ /** Team database adapter (optional, requires TEAM_DB_PATH) */
147
+ teamDb?: SqliteAdapter
148
+ /** Vector search manager (optional) */
149
+ vectorManager?: VectorSearchManager
150
+ /** GitHub integration (optional) */
151
+ github?: GitHubIntegration
152
+ /** Handler configuration */
153
+ config?: ToolHandlerConfig
154
+ /** Progress reporting context */
155
+ progress?: ProgressContext
147
156
  }
148
157
 
149
158
  /**
@@ -193,323 +202,6 @@ export interface PromptDefinition {
193
202
  handler: (args: Record<string, string>) => Promise<unknown>
194
203
  }
195
204
 
196
- // ============================================================================
197
- // Database Entity Types
198
- // ============================================================================
199
-
200
- /**
201
- * Entry types for journal entries
202
- */
203
- export type EntryType =
204
- | 'personal_reflection'
205
- | 'project_decision'
206
- | 'technical_achievement'
207
- | 'bug_fix'
208
- | 'feature_implementation'
209
- | 'code_review'
210
- | 'meeting_notes'
211
- | 'learning'
212
- | 'research'
213
- | 'planning'
214
- | 'retrospective'
215
- | 'standup'
216
- | 'other'
217
-
218
- /**
219
- * Significance types for important entries
220
- */
221
- export type SignificanceType =
222
- | 'milestone'
223
- | 'breakthrough'
224
- | 'technical_breakthrough'
225
- | 'decision'
226
- | 'lesson_learned'
227
- | 'blocker_resolved'
228
- | 'release'
229
- | null
230
-
231
- /**
232
- * Relationship types between entries
233
- *
234
- * Standard types:
235
- * - evolves_from: Entry builds upon previous work
236
- * - references: Entry mentions or links to another
237
- * - implements: Entry implements a spec/design
238
- * - clarifies: Entry explains or clarifies another
239
- * - response_to: Entry responds to a question/issue
240
- *
241
- * Causal types (for decision tracing):
242
- * - blocked_by: Entry was blocked by another (e.g., blocker → resolution)
243
- * - resolved: Entry resolved/fixed an issue from another
244
- * - caused: Entry caused or led to another outcome
245
- */
246
- export type RelationshipType =
247
- | 'evolves_from'
248
- | 'references'
249
- | 'implements'
250
- | 'clarifies'
251
- | 'response_to'
252
- | 'blocked_by'
253
- | 'resolved'
254
- | 'caused'
255
-
256
- /**
257
- * Journal entry entity
258
- */
259
- export interface JournalEntry {
260
- id: number
261
- entryType: EntryType
262
- content: string
263
- timestamp: string
264
- isPersonal: boolean
265
- significanceType: SignificanceType
266
- autoContext: string | null
267
- deletedAt: string | null
268
- tags: string[]
269
- // GitHub integration fields
270
- projectNumber?: number | null
271
- projectOwner?: string | null
272
- issueNumber?: number | null
273
- issueUrl?: string | null
274
- prNumber?: number | null
275
- prUrl?: string | null
276
- prStatus?: string | null
277
- workflowRunId?: number | null
278
- workflowName?: string | null
279
- workflowStatus?: string | null
280
- }
281
-
282
- /**
283
- * Tag entity
284
- */
285
- export interface Tag {
286
- id: number
287
- name: string
288
- usageCount: number
289
- }
290
-
291
- /**
292
- * Relationship entity
293
- */
294
- export interface Relationship {
295
- id: number
296
- fromEntryId: number
297
- toEntryId: number
298
- relationshipType: RelationshipType
299
- description: string | null
300
- createdAt: string
301
- }
302
-
303
- /**
304
- * Embedding entity for vector search
305
- */
306
- export interface Embedding {
307
- entryId: number
308
- embedding: Float32Array
309
- modelName: string
310
- }
311
-
312
- /**
313
- * Importance scoring breakdown showing weighted component contributions
314
- */
315
- export interface ImportanceBreakdown {
316
- /** Significance type contribution (weight: 0.30) */
317
- significance: number
318
- /** Relationship count contribution (weight: 0.35) */
319
- relationships: number
320
- /** Causal relationship contribution (weight: 0.20) */
321
- causal: number
322
- /** Recency decay contribution (weight: 0.15) */
323
- recency: number
324
- }
325
-
326
- /**
327
- * Importance calculation result with total score and component breakdown
328
- */
329
- export interface ImportanceResult {
330
- /** Total importance score (0.0-1.0) */
331
- score: number
332
- /** Weighted component contributions */
333
- breakdown: ImportanceBreakdown
334
- }
335
-
336
- // ============================================================================
337
- // GitHub Integration Types
338
- // ============================================================================
339
-
340
- /**
341
- * GitHub project information
342
- */
343
- export interface GitHubProject {
344
- number: number
345
- title: string
346
- url: string
347
- state: 'OPEN' | 'CLOSED'
348
- }
349
-
350
- /**
351
- * GitHub issue information
352
- */
353
- export interface GitHubIssue {
354
- number: number
355
- title: string
356
- url: string
357
- state: 'OPEN' | 'CLOSED'
358
- milestone?: { number: number; title: string } | null
359
- }
360
-
361
- /**
362
- * GitHub pull request information
363
- */
364
- export interface GitHubPullRequest {
365
- number: number
366
- title: string
367
- url: string
368
- state: 'OPEN' | 'CLOSED' | 'MERGED'
369
- }
370
-
371
- /**
372
- * GitHub milestone information
373
- */
374
- export interface GitHubMilestone {
375
- number: number
376
- title: string
377
- description: string | null
378
- state: 'open' | 'closed'
379
- url: string
380
- dueOn: string | null
381
- openIssues: number
382
- closedIssues: number
383
- createdAt: string
384
- updatedAt: string
385
- creator: string | null
386
- }
387
-
388
- /**
389
- * GitHub workflow run information
390
- */
391
- export interface GitHubWorkflowRun {
392
- id: number
393
- name: string
394
- status: 'queued' | 'in_progress' | 'completed'
395
- conclusion: 'success' | 'failure' | 'cancelled' | 'skipped' | null
396
- url: string
397
- headBranch: string
398
- headSha: string
399
- createdAt: string
400
- updatedAt: string
401
- }
402
-
403
- /**
404
- * Auto-captured project context
405
- */
406
- export interface ProjectContext {
407
- repoName: string | null
408
- branch: string | null
409
- commit: string | null
410
- remoteUrl: string | null
411
- projects: GitHubProject[]
412
- issues: GitHubIssue[]
413
- pullRequests: GitHubPullRequest[]
414
- workflowRuns: GitHubWorkflowRun[]
415
- milestones: GitHubMilestone[]
416
- }
417
-
418
- // ============================================================================
419
- // Repository Insights/Traffic Types
420
- // ============================================================================
421
-
422
- /**
423
- * Repository statistics (stars, forks, watchers)
424
- */
425
- export interface RepoStats {
426
- stars: number
427
- forks: number
428
- watchers: number
429
- openIssues: number
430
- size: number // KB
431
- defaultBranch: string
432
- }
433
-
434
- /**
435
- * Aggregated traffic data (14-day rolling)
436
- */
437
- export interface TrafficData {
438
- clones: { total: number; unique: number; dailyAvg: number }
439
- views: { total: number; unique: number; dailyAvg: number }
440
- period: string // e.g. "14 days"
441
- }
442
-
443
- /**
444
- * Traffic referrer source
445
- */
446
- export interface TrafficReferrer {
447
- referrer: string
448
- count: number
449
- uniques: number
450
- }
451
-
452
- /**
453
- * Popular repository path
454
- */
455
- export interface PopularPath {
456
- path: string
457
- title: string
458
- count: number
459
- uniques: number
460
- }
461
-
462
- // ============================================================================
463
- // GitHub Projects v2 Kanban Types
464
- // ============================================================================
465
-
466
- /**
467
- * Status option for single-select field in Projects v2
468
- */
469
- export interface ProjectV2StatusOption {
470
- id: string
471
- name: string
472
- color?: string
473
- }
474
-
475
- /**
476
- * Project item in a Kanban board
477
- */
478
- export interface ProjectV2Item {
479
- id: string
480
- title: string
481
- url: string
482
- type: 'ISSUE' | 'PULL_REQUEST' | 'DRAFT_ISSUE'
483
- status: string | null
484
- number?: number
485
- labels?: string[]
486
- assignees?: string[]
487
- createdAt: string
488
- updatedAt: string
489
- }
490
-
491
- /**
492
- * Kanban column (grouped by Status)
493
- */
494
- export interface KanbanColumn {
495
- status: string
496
- statusOptionId: string
497
- items: ProjectV2Item[]
498
- }
499
-
500
- /**
501
- * Full Kanban board response
502
- */
503
- export interface KanbanBoard {
504
- projectId: string
505
- projectNumber: number
506
- projectTitle: string
507
- statusFieldId: string
508
- statusOptions: ProjectV2StatusOption[]
509
- columns: KanbanColumn[]
510
- totalItems: number
511
- }
512
-
513
205
  // ============================================================================
514
206
  // Configuration Types
515
207
  // ============================================================================
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Centralized Error Helpers for Memory Journal MCP
3
+ *
4
+ * Provides consistent error formatting across all tool handlers.
5
+ * Follows the deterministic error handling standard from mysql-mcp:
6
+ * all errors return { success: false, error: "Human-readable message" }
7
+ * instead of throwing uncaught exceptions.
8
+ */
9
+
10
+ import { ZodError } from 'zod'
11
+
12
+ /**
13
+ * Extract human-readable messages from a ZodError instead of raw JSON array.
14
+ * Maps each Zod issue to its path + message for clear validation feedback.
15
+ */
16
+ export function formatZodError(error: ZodError): string {
17
+ return error.issues
18
+ .map((issue) => {
19
+ const path = issue.path.length > 0 ? `${issue.path.join('.')}: ` : ''
20
+ return `${path}${issue.message}`
21
+ })
22
+ .join('; ')
23
+ }
24
+
25
+ /**
26
+ * Format any caught error into a structured handler error response.
27
+ *
28
+ * Handles ZodError (validation) and general errors (runtime).
29
+ * Use as the single catch block for all tool handlers:
30
+ *
31
+ * ```typescript
32
+ * handler: async (params) => {
33
+ * try {
34
+ * const parsed = Schema.parse(params);
35
+ * // ... domain logic ...
36
+ * return { success: true, ... };
37
+ * } catch (err) {
38
+ * return formatHandlerError(err);
39
+ * }
40
+ * }
41
+ * ```
42
+ */
43
+ export function formatHandlerError(err: unknown): {
44
+ success: false
45
+ error: string
46
+ } {
47
+ if (err instanceof ZodError) {
48
+ return { success: false, error: formatZodError(err) }
49
+ }
50
+ const message = err instanceof Error ? err.message : String(err)
51
+ return { success: false, error: message }
52
+ }
@@ -97,11 +97,14 @@ class Logger {
97
97
  }
98
98
 
99
99
  setLevel(level: LogLevel): void {
100
- this.minLevel = LOG_LEVELS[level]
100
+ if (level in LOG_LEVELS) {
101
+ this.minLevel = LOG_LEVELS[level]
102
+ }
101
103
  }
102
104
  }
103
105
 
104
- // Get log level from environment
105
- const envLevel = (process.env['LOG_LEVEL'] ?? 'info') as LogLevel
106
+ // Get log level from environment (validated against known levels)
107
+ const rawLevel = process.env['LOG_LEVEL'] ?? 'info'
108
+ const envLevel: LogLevel = rawLevel in LOG_LEVELS ? (rawLevel as LogLevel) : 'info'
106
109
 
107
110
  export const logger = new Logger(envLevel)
@@ -32,16 +32,6 @@ export class InvalidDateFormatError extends SecurityError {
32
32
  }
33
33
  }
34
34
 
35
- /**
36
- * Thrown when SQL injection patterns are detected in input
37
- */
38
- export class SqlInjectionError extends SecurityError {
39
- constructor(pattern: string) {
40
- super(`Potential SQL injection detected: '${pattern}'`, 'SQL_INJECTION')
41
- this.name = 'SqlInjectionError'
42
- }
43
- }
44
-
45
35
  /**
46
36
  * Thrown when path traversal is detected in input
47
37
  */
@@ -111,48 +101,6 @@ export function sanitizeSearchQuery(query: string): string {
111
101
  return query.replace(/\\/g, '\\\\').replace(/%/g, '\\%').replace(/_/g, '\\_')
112
102
  }
113
103
 
114
- // ============================================================================
115
- // SQL Injection Detection
116
- // ============================================================================
117
-
118
- /**
119
- * Patterns that indicate SQL injection attempts.
120
- * Used for validation in edge cases where parameterized queries aren't possible.
121
- */
122
- const SQL_INJECTION_PATTERNS = [
123
- /;\s*(DROP|DELETE|INSERT|UPDATE|CREATE|ALTER|TRUNCATE)/i,
124
- /--\s*/,
125
- /\/\*[\s\S]*?\*\//,
126
- /UNION\s+(ALL\s+)?SELECT/i,
127
- /'\s*OR\s+['"]?1['"]?\s*=\s*['"]?1/i,
128
- /ATTACH\s+DATABASE/i,
129
- /DETACH\s+DATABASE/i,
130
- /load_extension\s*\(/i,
131
- ] as const
132
-
133
- /**
134
- * Checks if a string contains potential SQL injection patterns.
135
- * This is a secondary defense layer; parameterized queries are the primary defense.
136
- *
137
- * @param input - The string to check
138
- * @returns true if injection patterns are detected, false otherwise
139
- */
140
- export function containsSqlInjection(input: string): boolean {
141
- return SQL_INJECTION_PATTERNS.some((pattern) => pattern.test(input))
142
- }
143
-
144
- /**
145
- * Validates that input does not contain SQL injection patterns.
146
- *
147
- * @param input - The string to validate
148
- * @throws SqlInjectionError if injection patterns are detected
149
- */
150
- export function assertNoSqlInjection(input: string): void {
151
- if (containsSqlInjection(input)) {
152
- throw new SqlInjectionError(input.substring(0, 50))
153
- }
154
- }
155
-
156
104
  // ============================================================================
157
105
  // Path Validation
158
106
  // ============================================================================
@@ -247,49 +247,25 @@ export class VectorSearchManager {
247
247
 
248
248
  logger.info('Rebuilding vector index from database...', { module: 'VectorSearch' })
249
249
 
250
- // Step 1: Get total entry count and build ID set for orphan detection
250
+ // Step 1: Get total entry count for progress reporting
251
251
  const totalEntries = db.getActiveEntryCount()
252
- const dbIds = new Set<string>()
253
252
 
254
- // Collect all active entry IDs via pagination (avoids loading all content at once)
255
- for (let offset = 0; offset < totalEntries; offset += REBUILD_PAGE_SIZE) {
256
- const page = db.getEntriesPage(offset, REBUILD_PAGE_SIZE)
257
- for (const entry of page) {
258
- dbIds.add(String(entry.id))
259
- }
260
- }
261
-
262
- // Step 2: Clean up existing index items
263
- // If the index is corrupted (e.g., from a process kill), recreate it
253
+ // Step 2: Clean up existing index delete all items for clean re-index
254
+ // (No orphan detection needed since everything is re-inserted from scratch)
264
255
  try {
265
256
  const indexItems = await this.index.listItems()
266
- let orphansRemoved = 0
267
257
  for (const item of indexItems) {
268
- if (!dbIds.has(item.id)) {
269
- try {
270
- await this.index.deleteItem(item.id)
271
- orphansRemoved++
272
- } catch {
273
- // Ignore errors during cleanup
274
- }
275
- }
276
- }
277
- if (orphansRemoved > 0) {
278
- logger.info(`Cleaned up ${String(orphansRemoved)} orphaned vector entries`, {
279
- module: 'VectorSearch',
280
- })
281
- }
282
-
283
- // Step 3: Delete all remaining items to prepare for clean re-index
284
- // This avoids the double-delete overhead of calling addEntry (upsert) per item
285
- const remainingItems = await this.index.listItems()
286
- for (const item of remainingItems) {
287
258
  try {
288
259
  await this.index.deleteItem(item.id)
289
260
  } catch {
290
- // Ignore
261
+ // Ignore individual deletion errors
291
262
  }
292
263
  }
264
+ if (indexItems.length > 0) {
265
+ logger.info(`Cleared ${String(indexItems.length)} items from vector index`, {
266
+ module: 'VectorSearch',
267
+ })
268
+ }
293
269
  } catch (indexError) {
294
270
  // Index files are corrupted — recreate from scratch
295
271
  logger.warning('Vector index corrupted, recreating...', {
@@ -17,7 +17,6 @@ import {
17
17
  ICON_BRIEFING,
18
18
  ICON_CLOCK,
19
19
  ICON_TAG,
20
- ICON_TEAM,
21
20
  ICON_STAR,
22
21
  ICON_ISSUE,
23
22
  ICON_PR,
@@ -57,7 +56,7 @@ describe('Resource icons', () => {
57
56
  { name: 'ICON_BRIEFING', icon: ICON_BRIEFING },
58
57
  { name: 'ICON_CLOCK', icon: ICON_CLOCK },
59
58
  { name: 'ICON_TAG', icon: ICON_TAG },
60
- { name: 'ICON_TEAM', icon: ICON_TEAM },
59
+
61
60
  { name: 'ICON_STAR', icon: ICON_STAR },
62
61
  { name: 'ICON_ISSUE', icon: ICON_ISSUE },
63
62
  { name: 'ICON_PR', icon: ICON_PR },