@prmichaelsen/remember-mcp 0.2.7 → 1.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,145 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0] - 2026-02-12
9
+
10
+ ### 🚨 BREAKING CHANGES
11
+
12
+ - **`createServer` is now async**: The factory function now returns `Promise<Server>` instead of `Server`. Consumers must use `await` when calling `createServer()`.
13
+
14
+ ```typescript
15
+ // Before (0.2.x)
16
+ const server = createServer(token, userId);
17
+
18
+ // After (1.0.0+)
19
+ const server = await createServer(token, userId);
20
+ ```
21
+
22
+ **Impact**: Only affects direct factory users. The mcp-auth wrapper handles async factories automatically, so no changes needed for mcp-auth users.
23
+
24
+ ### ✨ Added
25
+
26
+ - **Weaviate v3 Filter API**: Implemented proper Weaviate v3 filter builders using fluent API
27
+ - Created `src/utils/weaviate-filters.ts` with filter builder utilities
28
+ - Supports AND/OR logic for complex filter combinations
29
+ - Comprehensive filter support: type, weight, trust, date range, tags
30
+
31
+ - **Combined Memory + Relationship Search**: `remember_search_memory` now searches BOTH memories and relationships by default
32
+ - Uses OR logic to search both doc types
33
+ - Results separated into `memories` and `relationships` arrays
34
+ - Backward compatible: set `include_relationships: false` to search only memories
35
+ - Relationship observations are now searchable
36
+
37
+ - **Comprehensive Unit Tests**: Added 29 test cases for filter builders
38
+ - Tests for `buildMemoryOnlyFilters`, `buildRelationshipOnlyFilters`, `buildCombinedSearchFilters`
39
+ - Tests for edge cases and complex filter scenarios
40
+ - 83.67% code coverage on weaviate-filters.ts
41
+
42
+ - **Jest Type Support**: Added "jest" to tsconfig types array for proper TypeScript support in test files
43
+
44
+ ### 🐛 Fixed
45
+
46
+ - **gRPC Filter Error**: Fixed "paths needs to have an uneven number of components" error
47
+ - Replaced old Weaviate v2 filter format (path/operator/valueText) with v3 fluent API
48
+ - Affected tools: `remember_search_memory`, `remember_query_memory`
49
+
50
+ - **Database Initialization**: Changed from fire-and-forget to await pattern
51
+ - Server now waits for database initialization before accepting requests
52
+ - Prevents server from starting in broken state
53
+ - Errors propagate clearly to caller
54
+
55
+ - **Test Failures**: Fixed server-factory tests to handle async createServer
56
+ - Updated all tests to use async/await
57
+ - Changed synchronous expect() calls to async expect().resolves/rejects
58
+
59
+ ### 📊 Test Results
60
+
61
+ - **54 tests passing** (up from 25)
62
+ - **4 test suites passing** (all green)
63
+ - **Overall coverage: 26.54%** (up from 22.53%)
64
+ - **1 skipped** (integration test requiring live Weaviate)
65
+
66
+ ### 📝 Documentation
67
+
68
+ - Updated `agent/progress.yaml` with Task 20 completion
69
+ - Updated `agent/tasks/task-20-fix-weaviate-v3-filters.md` with implementation details
70
+ - All changes documented in agent directory
71
+
72
+ ---
73
+
74
+ ## [0.2.8] - 2026-02-11
75
+
76
+ ### ✨ Added
77
+
78
+ - Complete memory CRUD operations (create, read, update, delete)
79
+ - Complete relationship CRUD operations (create, read, update, delete)
80
+ - User preferences system with 6 categories
81
+ - 12 MCP tools fully implemented
82
+ - Hybrid search (semantic + keyword)
83
+ - Vector similarity search
84
+ - RAG-optimized queries
85
+ - 45 content types
86
+
87
+ ### 📊 Milestones Completed
88
+
89
+ - M1: Project Foundation (100%)
90
+ - M2: Core Memory System (100%)
91
+ - M3: Relationships & Graph (100%)
92
+ - M4: User Preferences (100%)
93
+
94
+ ---
95
+
96
+ ## [0.1.0] - 2026-02-11
97
+
98
+ ### ✨ Initial Release
99
+
100
+ - Project structure and configuration
101
+ - Weaviate client with multi-tenant support
102
+ - Firestore integration
103
+ - Basic MCP server with stdio transport
104
+ - Server factory for mcp-auth compatibility
105
+ - 25 unit tests
106
+ - Dual build: standalone server + library factory
107
+
108
+ ---
109
+
110
+ ## Migration Guides
111
+
112
+ ### Migrating from 0.2.x to 1.0.0
113
+
114
+ **If you're using the factory export:**
115
+
116
+ ```typescript
117
+ // OLD (0.2.x)
118
+ import { createServer } from '@prmichaelsen/remember-mcp/factory';
119
+ const server = createServer(accessToken, userId);
120
+
121
+ // NEW (1.0.0+)
122
+ import { createServer } from '@prmichaelsen/remember-mcp/factory';
123
+ const server = await createServer(accessToken, userId);
124
+ ```
125
+
126
+ **If you're using mcp-auth wrapper:**
127
+ - No changes needed! mcp-auth handles async factories automatically.
128
+
129
+ **If you're using standalone server:**
130
+ - No changes needed! You don't call createServer directly.
131
+
132
+ **If you're using Claude Desktop:**
133
+ - No changes needed! You use the built server via npx.
134
+
135
+ ---
136
+
137
+ ## Versioning Policy
138
+
139
+ This project follows [Semantic Versioning](https://semver.org/):
140
+
141
+ - **Major** (X.0.0): Breaking changes
142
+ - **Minor** (0.X.0): New features, backward compatible
143
+ - **Patch** (0.0.X): Bug fixes, backward compatible
144
+
145
+ **Note**: Version 1.0.0 indicates the first stable release with a breaking change from 0.2.x. Future breaking changes will increment the major version (2.0.0, 3.0.0, etc.).
@@ -38,5 +38,5 @@ export interface ServerOptions {
38
38
  * });
39
39
  * ```
40
40
  */
41
- export declare function createServer(accessToken: string, userId: string, options?: ServerOptions): Server;
41
+ export declare function createServer(accessToken: string, userId: string, options?: ServerOptions): Promise<Server>;
42
42
  //# sourceMappingURL=server-factory.d.ts.map
@@ -3190,14 +3190,12 @@ async function ensureDatabasesInitialized() {
3190
3190
  })();
3191
3191
  return initializationPromise;
3192
3192
  }
3193
- function createServer(accessToken, userId, options = {}) {
3193
+ async function createServer(accessToken, userId, options = {}) {
3194
3194
  if (!userId) {
3195
3195
  throw new Error("userId is required");
3196
3196
  }
3197
3197
  logger.debug("Creating server instance", { userId });
3198
- ensureDatabasesInitialized().catch((error) => {
3199
- logger.error("Failed to initialize databases:", error);
3200
- });
3198
+ await ensureDatabasesInitialized();
3201
3199
  const server = new Server(
3202
3200
  {
3203
3201
  name: options.name || "remember-mcp",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prmichaelsen/remember-mcp",
3
- "version": "0.2.7",
3
+ "version": "1.0.0",
4
4
  "description": "Multi-tenant memory system MCP server with vector search and relationships",
5
5
  "main": "dist/server.js",
6
6
  "type": "module",
@@ -3,24 +3,24 @@ import { createServer } from './server-factory.js';
3
3
 
4
4
  describe('Server Factory', () => {
5
5
  describe('Parameter Validation', () => {
6
- it('should create server instance with valid parameters', () => {
7
- const server = createServer('test-token', 'user123');
6
+ it('should create server instance with valid parameters', async () => {
7
+ const server = await createServer('test-token', 'user123');
8
8
  expect(server).toBeDefined();
9
9
  expect(server).toHaveProperty('setRequestHandler');
10
10
  });
11
11
 
12
- it('should allow empty accessToken (not used by remember-mcp)', () => {
12
+ it('should allow empty accessToken (not used by remember-mcp)', async () => {
13
13
  // accessToken is not used by remember-mcp (self-managed data)
14
14
  // Should not throw even with empty string
15
- expect(() => createServer('', 'user123')).not.toThrow();
15
+ await expect(createServer('', 'user123')).resolves.toBeDefined();
16
16
  });
17
17
 
18
- it('should require userId', () => {
19
- expect(() => createServer('token', '')).toThrow('userId is required');
18
+ it('should require userId', async () => {
19
+ await expect(createServer('token', '')).rejects.toThrow('userId is required');
20
20
  });
21
21
 
22
- it('should accept custom options', () => {
23
- const server = createServer('token', 'user123', {
22
+ it('should accept custom options', async () => {
23
+ const server = await createServer('token', 'user123', {
24
24
  name: 'custom-name',
25
25
  version: '2.0.0',
26
26
  });
@@ -113,11 +113,11 @@ async function ensureDatabasesInitialized(): Promise<void> {
113
113
  * });
114
114
  * ```
115
115
  */
116
- export function createServer(
116
+ export async function createServer(
117
117
  accessToken: string,
118
118
  userId: string,
119
119
  options: ServerOptions = {}
120
- ): Server {
120
+ ): Promise<Server> {
121
121
  // Note: accessToken is not used by remember-mcp (self-managed data)
122
122
  // but required by mcp-auth contract. Can be any value including empty string.
123
123
 
@@ -128,11 +128,8 @@ export function createServer(
128
128
  logger.debug('Creating server instance', { userId });
129
129
 
130
130
  // Ensure databases are initialized (happens once globally)
131
- // Note: This is synchronous to match the Server return type
132
- // The actual initialization happens on first tool call
133
- ensureDatabasesInitialized().catch(error => {
134
- logger.error('Failed to initialize databases:', error);
135
- });
131
+ // Initialization must succeed or server creation fails
132
+ await ensureDatabasesInitialized();
136
133
 
137
134
  // Create MCP server
138
135
  const server = new Server(