@prmichaelsen/remember-mcp 2.7.8 → 2.7.10

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 CHANGED
@@ -5,6 +5,54 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.7.9] - 2026-02-17
9
+
10
+ ### Added
11
+
12
+ - **Bidirectional Linking for Published Memories**
13
+ - Original memories now store `space_memory_id` after publishing
14
+ - Enables correlation between source memory and published space memory
15
+ - Added automatic update of original memory after successful publish
16
+ - Non-critical update - publish still succeeds if update fails
17
+ - Improves traceability and enables future features (unpublish, sync)
18
+
19
+ ### Technical Details
20
+
21
+ - Modified: `src/tools/confirm.ts` (lines 277-296)
22
+ - Added `userCollection.data.update()` call after publish
23
+ - Updates original memory with `space_memory_id` field
24
+ - Includes error handling with warning log (non-blocking)
25
+ - Maintains backward compatibility
26
+
27
+ ---
28
+
29
+ ## [2.7.8] - 2026-02-17
30
+
31
+ ### Fixed
32
+
33
+ - **CRITICAL: Fixed Shared Space Discovery Bug**
34
+ - Search and query tools now correctly filter by `doc_type: 'memory'` instead of `'space_memory'`
35
+ - The `space_memory` concept was removed from the architecture
36
+ - Search tools were filtering for `doc_type: 'space_memory'` but published memories had `doc_type: 'memory'`
37
+ - Now all users can discover memories published to shared spaces like The Void
38
+ - Root cause: Lines 159 in `search-space.ts` and 147 in `query-space.ts` filtered for wrong doc_type
39
+ - Fix: Changed filters from `'space_memory'` to `'memory'` to match actual data
40
+
41
+ ### Technical Details
42
+
43
+ - Modified: `src/tools/search-space.ts` (line 159)
44
+ - Modified: `src/tools/query-space.ts` (line 147)
45
+ - Changed filter from `.equal('space_memory')` to `.equal('memory')`
46
+ - Published memories keep `doc_type: 'memory'` (as intended)
47
+
48
+ ### Impact
49
+
50
+ - **Fixes**: Shared space discovery now works correctly
51
+ - **Unblocks**: Core shared spaces functionality (The Void)
52
+ - **Note**: No data migration needed - existing published memories are correct
53
+
54
+ ---
55
+
8
56
  ## [2.7.7] - 2026-02-17
9
57
 
10
58
  ### Fixed
@@ -2,11 +2,11 @@
2
2
 
3
3
  project:
4
4
  name: remember-mcp
5
- version: 2.6.3
5
+ version: 2.7.8
6
6
  started: 2026-02-11
7
7
  status: in_progress
8
8
  current_milestone: M12
9
- last_updated: 2026-02-16
9
+ last_updated: 2026-02-17
10
10
 
11
11
  milestones:
12
12
  - id: M1
@@ -523,6 +523,19 @@ progress:
523
523
  overall: 50%
524
524
 
525
525
  recent_work:
526
+ - date: 2026-02-17
527
+ description: CRITICAL BUG FIX - Shared Space Discovery Now Works (v2.7.8)
528
+ items:
529
+ - 🐛 CRITICAL: Fixed shared space discovery bug
530
+ - ✅ Search/query tools now filter by doc_type: 'memory' (was 'space_memory')
531
+ - ✅ space_memory concept was removed from architecture
532
+ - ✅ All users can now discover memories in The Void
533
+ - ✅ Root cause: search-space.ts and query-space.ts filtered for wrong doc_type
534
+ - ✅ Changed filters from 'space_memory' to 'memory'
535
+ - ✅ Build successful, all 81 tests passing
536
+ - ✅ No data migration needed - existing memories are correct
537
+ - 📋 Released v2.7.8 with critical bug fix
538
+
526
539
  - date: 2026-02-17
527
540
  description: Fixed Build Error & Completed Task 66 - Comment Field Initialization
528
541
  items:
@@ -544,20 +557,25 @@ recent_work:
544
557
  - 📋 Ready for M12 completion: Tasks 58-59 remaining
545
558
 
546
559
  - date: 2026-02-17
547
- description: ACP Initialization Complete - Project Context Loaded
560
+ description: ACP Initialization Complete - Ready for M12 Completion
548
561
  items:
549
562
  - ✅ ACP initialization workflow executed via @acp.init command
550
563
  - ⚠️ ACP updates available (v1.4.3 with improved script color output)
551
- - ✅ All agent documentation reviewed (23 design docs, 11 milestones, 66 tasks, 5 patterns)
564
+ - ✅ All agent documentation reviewed (30 design docs, 12 milestones, 67 tasks, 7 patterns)
552
565
  - ✅ Project status verified: M1-M4, M10-M11 complete (100%), M12 in progress (60%)
553
- - ✅ Version 2.6.7 confirmed (latest release)
554
- - ✅ 53 unit tests passing (1 skipped integration test)
555
- - ⚠️ TypeScript compilation error: Missing 'poetry' in content-types.ts
566
+ - ✅ Version 2.7.7 confirmed (latest release)
567
+ - ✅ 81 unit tests passing (1 skipped integration test)
568
+ - Test coverage: 33.12% overall
569
+ - ✅ TypeScript compiles without errors
570
+ - ✅ Build successful (dual export: server + factory)
556
571
  - ✅ All 17 MCP tools implemented and working
557
572
  - ✅ M12 Comment System: 3/5 tasks complete (schema, search, query updates)
573
+ - ✅ Task 66 completed: Comment fields initialized in create/update tools
558
574
  - 📋 Remaining M12 tasks: Task 58 (unit tests), Task 59 (documentation)
559
- - 📋 Build blocked by TypeScript error in content-types.ts
560
- - 📋 Need to fix 'poetry' content type metadata
575
+ - 📋 Ready to complete M12 milestone
576
+ - 📋 Multi-tenant architecture with per-user isolation operational
577
+ - 📋 Vector search with Weaviate + metadata with Firestore working
578
+ - 📋 Shared spaces with multi-space support functional
561
579
 
562
580
  - date: 2026-02-16
563
581
  description: Comment System, Structured Logging, and Safety Guidelines (v2.6.0-v2.6.2)
@@ -4330,7 +4330,7 @@ async function executePublishMemory(request, userId) {
4330
4330
  attribution: "user",
4331
4331
  // Merge additional tags with original tags
4332
4332
  tags: [...originalTags, ...additionalTags]
4333
- // Keep doc_type as 'memory' (don't change to 'space_memory')
4333
+ // Keep doc_type as 'memory' (space_memory concept was removed)
4334
4334
  // Keep original created_at, updated_at, version (don't overwrite)
4335
4335
  };
4336
4336
  logger.info("Inserting memory into Memory_public", {
@@ -4355,6 +4355,26 @@ async function executePublishMemory(request, userId) {
4355
4355
  spaceMemoryId: result,
4356
4356
  spaces: request.payload.spaces
4357
4357
  });
4358
+ try {
4359
+ await userCollection.data.update({
4360
+ id: request.payload.memory_id,
4361
+ properties: {
4362
+ space_memory_id: result
4363
+ }
4364
+ });
4365
+ logger.info("Updated original memory with space_memory_id", {
4366
+ function: "executePublishMemory",
4367
+ memoryId: request.payload.memory_id,
4368
+ spaceMemoryId: result
4369
+ });
4370
+ } catch (updateError) {
4371
+ logger.warn("Failed to update original memory with space_memory_id", {
4372
+ function: "executePublishMemory",
4373
+ memoryId: request.payload.memory_id,
4374
+ spaceMemoryId: result,
4375
+ error: updateError instanceof Error ? updateError.message : String(updateError)
4376
+ });
4377
+ }
4358
4378
  return JSON.stringify(
4359
4379
  {
4360
4380
  success: true,
@@ -4542,7 +4562,7 @@ async function handleSearchSpace(args, userId) {
4542
4562
  const publicCollection = await ensurePublicCollection(weaviateClient);
4543
4563
  const filterList = [];
4544
4564
  filterList.push(publicCollection.filter.byProperty("spaces").containsAny(args.spaces));
4545
- filterList.push(publicCollection.filter.byProperty("doc_type").equal("space_memory"));
4565
+ filterList.push(publicCollection.filter.byProperty("doc_type").equal("memory"));
4546
4566
  if (args.content_type) {
4547
4567
  filterList.push(publicCollection.filter.byProperty("type").equal(args.content_type));
4548
4568
  }
@@ -4698,7 +4718,7 @@ async function handleQuerySpace(args, userId) {
4698
4718
  const publicCollection = await ensurePublicCollection(weaviateClient);
4699
4719
  const filterList = [];
4700
4720
  filterList.push(publicCollection.filter.byProperty("spaces").containsAny(args.spaces));
4701
- filterList.push(publicCollection.filter.byProperty("doc_type").equal("space_memory"));
4721
+ filterList.push(publicCollection.filter.byProperty("doc_type").equal("memory"));
4702
4722
  if (args.content_type) {
4703
4723
  filterList.push(publicCollection.filter.byProperty("type").equal(args.content_type));
4704
4724
  }
package/dist/server.js CHANGED
@@ -4398,7 +4398,7 @@ async function executePublishMemory(request, userId) {
4398
4398
  attribution: "user",
4399
4399
  // Merge additional tags with original tags
4400
4400
  tags: [...originalTags, ...additionalTags]
4401
- // Keep doc_type as 'memory' (don't change to 'space_memory')
4401
+ // Keep doc_type as 'memory' (space_memory concept was removed)
4402
4402
  // Keep original created_at, updated_at, version (don't overwrite)
4403
4403
  };
4404
4404
  logger.info("Inserting memory into Memory_public", {
@@ -4423,6 +4423,26 @@ async function executePublishMemory(request, userId) {
4423
4423
  spaceMemoryId: result,
4424
4424
  spaces: request.payload.spaces
4425
4425
  });
4426
+ try {
4427
+ await userCollection.data.update({
4428
+ id: request.payload.memory_id,
4429
+ properties: {
4430
+ space_memory_id: result
4431
+ }
4432
+ });
4433
+ logger.info("Updated original memory with space_memory_id", {
4434
+ function: "executePublishMemory",
4435
+ memoryId: request.payload.memory_id,
4436
+ spaceMemoryId: result
4437
+ });
4438
+ } catch (updateError) {
4439
+ logger.warn("Failed to update original memory with space_memory_id", {
4440
+ function: "executePublishMemory",
4441
+ memoryId: request.payload.memory_id,
4442
+ spaceMemoryId: result,
4443
+ error: updateError instanceof Error ? updateError.message : String(updateError)
4444
+ });
4445
+ }
4426
4446
  return JSON.stringify(
4427
4447
  {
4428
4448
  success: true,
@@ -4610,7 +4630,7 @@ async function handleSearchSpace(args, userId) {
4610
4630
  const publicCollection = await ensurePublicCollection(weaviateClient);
4611
4631
  const filterList = [];
4612
4632
  filterList.push(publicCollection.filter.byProperty("spaces").containsAny(args.spaces));
4613
- filterList.push(publicCollection.filter.byProperty("doc_type").equal("space_memory"));
4633
+ filterList.push(publicCollection.filter.byProperty("doc_type").equal("memory"));
4614
4634
  if (args.content_type) {
4615
4635
  filterList.push(publicCollection.filter.byProperty("type").equal(args.content_type));
4616
4636
  }
@@ -4766,7 +4786,7 @@ async function handleQuerySpace(args, userId) {
4766
4786
  const publicCollection = await ensurePublicCollection(weaviateClient);
4767
4787
  const filterList = [];
4768
4788
  filterList.push(publicCollection.filter.byProperty("spaces").containsAny(args.spaces));
4769
- filterList.push(publicCollection.filter.byProperty("doc_type").equal("space_memory"));
4789
+ filterList.push(publicCollection.filter.byProperty("doc_type").equal("memory"));
4770
4790
  if (args.content_type) {
4771
4791
  filterList.push(publicCollection.filter.byProperty("type").equal(args.content_type));
4772
4792
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prmichaelsen/remember-mcp",
3
- "version": "2.7.8",
3
+ "version": "2.7.10",
4
4
  "description": "Multi-tenant memory system MCP server with vector search and relationships",
5
5
  "main": "dist/server.js",
6
6
  "type": "module",
@@ -243,7 +243,7 @@ async function executePublishMemory(
243
243
  attribution: 'user' as const,
244
244
  // Merge additional tags with original tags
245
245
  tags: [...originalTags, ...additionalTags],
246
- // Keep doc_type as 'memory' (don't change to 'space_memory')
246
+ // Keep doc_type as 'memory' (space_memory concept was removed)
247
247
  // Keep original created_at, updated_at, version (don't overwrite)
248
248
  };
249
249
 
@@ -274,6 +274,30 @@ async function executePublishMemory(
274
274
  spaces: request.payload.spaces,
275
275
  });
276
276
 
277
+ // Update original memory with space_memory_id for bidirectional linking
278
+ try {
279
+ await userCollection.data.update({
280
+ id: request.payload.memory_id,
281
+ properties: {
282
+ space_memory_id: result,
283
+ },
284
+ });
285
+
286
+ logger.info('Updated original memory with space_memory_id', {
287
+ function: 'executePublishMemory',
288
+ memoryId: request.payload.memory_id,
289
+ spaceMemoryId: result,
290
+ });
291
+ } catch (updateError) {
292
+ logger.warn('Failed to update original memory with space_memory_id', {
293
+ function: 'executePublishMemory',
294
+ memoryId: request.payload.memory_id,
295
+ spaceMemoryId: result,
296
+ error: updateError instanceof Error ? updateError.message : String(updateError),
297
+ });
298
+ // Don't fail the publish if this update fails - it's not critical
299
+ }
300
+
277
301
  // Return minimal response with spaces array
278
302
  return JSON.stringify(
279
303
  {
@@ -143,8 +143,8 @@ export async function handleQuerySpace(
143
143
  // Filter by spaces array (memory must be in at least one requested space)
144
144
  filterList.push(publicCollection.filter.byProperty('spaces').containsAny(args.spaces));
145
145
 
146
- // Filter by doc_type (space_memory)
147
- filterList.push(publicCollection.filter.byProperty('doc_type').equal('space_memory'));
146
+ // Filter by doc_type (memory) - space_memory concept was removed
147
+ filterList.push(publicCollection.filter.byProperty('doc_type').equal('memory'));
148
148
 
149
149
  // Apply content type filter
150
150
  if (args.content_type) {
@@ -155,8 +155,8 @@ export async function handleSearchSpace(
155
155
  // Filter by spaces array (memory must be in at least one requested space)
156
156
  filterList.push(publicCollection.filter.byProperty('spaces').containsAny(args.spaces));
157
157
 
158
- // Filter by doc_type (space_memory)
159
- filterList.push(publicCollection.filter.byProperty('doc_type').equal('space_memory'));
158
+ // Filter by doc_type (memory) - space_memory concept was removed
159
+ filterList.push(publicCollection.filter.byProperty('doc_type').equal('memory'));
160
160
 
161
161
  // Apply content type filter
162
162
  if (args.content_type) {