Skip to content

Commit 7a2d4bc

Browse files
committed
release: v1.3.4
1 parent 53547a0 commit 7a2d4bc

23 files changed

Lines changed: 90 additions & 49 deletions

File tree

claudecode-plugin/.claude-plugin/marketplace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
{
99
"name": "lore",
1010
"description": "Long-term Lore memory for AI agents — fixed boot baseline, recall injection, and MCP tools",
11-
"version": "1.3.3",
11+
"version": "1.3.4",
1212
"source": "./",
1313
"author": {
1414
"name": "FFatTiger"
1515
}
1616
}
1717
],
18-
"version": "1.3.3"
18+
"version": "1.3.4"
1919
}

claudecode-plugin/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "lore",
33
"description": "Long-term Lore memory for AI agents — fixed boot baseline, recall injection, and MCP tools",
4-
"version": "1.3.3",
4+
"version": "1.3.4",
55
"author": {
66
"name": "FFatTiger"
77
},

codex-plugin/.codex-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lore",
3-
"version": "1.3.3",
3+
"version": "1.3.4",
44
"description": "Long-term Lore memory for Codex via MCP tools, skills, and bundled lifecycle hooks.",
55
"author": {
66
"name": "FFatTiger"

hermes-plugin/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Environment variables:
6060
- `boot()` - Load boot memories
6161
- `get_node(uri, nav_only, session_id, query_id)` - Read memory node
6262
- `create_node(content, priority, glossary, uri, domain, parent_path, title, disclosure)` - Create new memory
63-
- `update_node(uri, content, priority, disclosure, glossary, glossary_add, glossary_remove, session_id)` - Update existing memory
63+
- `update_node(uri, content, priority, disclosure, glossary_add, glossary_remove, session_id)` - Update existing memory
6464
- `delete_node(uri, session_id)` - Delete memory
6565
- `move_node(old_uri, new_uri)` - Move or rename a memory node
6666
- `search(query, domain, limit, content_limit)` - Search memories

hermes-plugin/lore_memory/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ def get_tool_schemas(self) -> List[Dict[str, Any]]:
412412
},
413413
{
414414
"name": "lore_update_node",
415-
"description": "Revise an existing long-term memory node. Any provided content, metadata, and glossary fields are applied as one node update event; omitted fields are left unchanged",
415+
"description": "Revise an existing long-term memory node. Omitted content, metadata, and glossary mutation fields are left unchanged",
416416
"parameters": {
417417
"type": "object",
418418
"additionalProperties": False,
@@ -421,7 +421,6 @@ def get_tool_schemas(self) -> List[Dict[str, Any]]:
421421
"content": {"type": "string", "description": "New content to replace the existing content; omit to leave content unchanged"},
422422
"priority": {"type": "integer", "minimum": 0, "description": "New priority level; omit to leave priority unchanged"},
423423
"disclosure": {"type": "string", "description": "New disclosure / trigger condition; omit to leave disclosure unchanged"},
424-
"glossary": {"type": "array", "items": {"type": "string"}, "description": "Full replacement list for this node glossary. Omit to leave glossary unchanged; pass [] to clear it"},
425424
"glossary_add": {"type": "array", "items": {"type": "string"}, "description": "Keywords to add as part of this same node update event"},
426425
"glossary_remove": {"type": "array", "items": {"type": "string"}, "description": "Keywords to remove as part of this same node update event"},
427426
"session_id": {"type": "string", "description": "Session identifier from the <recall session_id=\"...\"> tag"},
@@ -597,7 +596,6 @@ def _tool_lore_update_node(self, args: Dict) -> str:
597596
domain=domain, path=path, content=args.get("content"),
598597
priority=args.get("priority"), disclosure=args.get("disclosure"),
599598
session_id=args.get("session_id") or self._session_id,
600-
glossary=args.get("glossary"),
601599
glossary_add=args.get("glossary_add"),
602600
glossary_remove=args.get("glossary_remove")
603601
)

hermes-plugin/lore_memory/client.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,6 @@ def update_node(
168168
data["disclosure"] = disclosure
169169
if session_id is not None:
170170
data["session_id"] = session_id
171-
if glossary is not None:
172-
data["glossary"] = glossary
173171
if glossary_add:
174172
data["glossary_add"] = glossary_add
175173
if glossary_remove:

hermes-plugin/lore_memory/plugin.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: lore
2-
version: 1.2.0
2+
version: 1.3.4
33
description: Lore long-term memory system — fixed boot baseline, cross-session recall, and durable project context
44
author: FFatTiger
55
provides_tools:

hermes-plugin/lore_memory/test_thin_adapters.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,15 @@ def test_update_node_sends_glossary_mutations_in_node_request(self):
7373

7474
self.assertEqual(result["uri"], "core://agent/profile-renamed")
7575
self.assertEqual(len(requests), 1)
76-
self.assertEqual(requests[0][1]["data"]["glossary"], ["fresh"])
76+
self.assertNotIn("glossary", requests[0][1]["data"])
7777
self.assertEqual(requests[0][1]["data"]["glossary_add"], ["memory"])
7878
self.assertEqual(requests[0][1]["data"]["glossary_remove"], ["archive"])
7979

8080

8181
class FakeClient:
82+
def __init__(self):
83+
self.last_update_kwargs = None
84+
8285
def parse_uri(self, uri):
8386
return uri.split("://", 1)[0], uri.split("://", 1)[1]
8487

@@ -89,6 +92,7 @@ def create_node(self, **kwargs):
8992
return {"uri": "core://agent/profile", "node_uuid": "uuid-create"}
9093

9194
def update_node(self, **kwargs):
95+
self.last_update_kwargs = kwargs
9296
return {"uri": "core://agent/profile-renamed", "node_uuid": "uuid-update"}
9397

9498
def delete_node(self, *args, **kwargs):
@@ -124,6 +128,26 @@ def test_update_tool_formats_top_level_uri(self):
124128

125129
self.assertEqual(result, "Updated: core://agent/profile-renamed")
126130

131+
def test_update_tool_does_not_expose_glossary_replacement(self):
132+
schemas = {tool["name"]: tool for tool in self.provider.get_tool_schemas()}
133+
props = schemas["lore_update_node"]["parameters"]["properties"]
134+
135+
self.assertNotIn("glossary", props)
136+
self.assertIn("glossary_add", props)
137+
self.assertIn("glossary_remove", props)
138+
self.assertNotIn("glossary fields", schemas["lore_update_node"]["description"])
139+
140+
def test_update_tool_ignores_glossary_replacement_argument(self):
141+
result = self.provider._tool_lore_update_node({
142+
"uri": "core://agent/profile",
143+
"glossary": ["fresh"],
144+
"glossary_add": ["memory"],
145+
})
146+
147+
self.assertEqual(result, "Updated: core://agent/profile-renamed")
148+
self.assertNotIn("glossary", self.provider._client.last_update_kwargs)
149+
self.assertEqual(self.provider._client.last_update_kwargs["glossary_add"], ["memory"])
150+
127151
def test_delete_tool_formats_canonical_delete_receipt(self):
128152
result = self.provider._tool_lore_delete_node({"uri": "core://legacy/profile"})
129153
self.assertEqual(result, "Deleted: core://legacy/profile (canonical: core://canonical/profile)")

openclaw-plugin/__tests__/tools.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,14 @@ describe('tool parameter schemas', () => {
8282
expect(tools.lore_update_node.parameters.required).toContain('uri');
8383
});
8484

85+
it('lore_update_node exposes glossary mutations without full replacement', () => {
86+
const props = tools.lore_update_node.parameters.properties;
87+
expect(props.glossary).toBeUndefined();
88+
expect(props.glossary_add).toBeDefined();
89+
expect(props.glossary_remove).toBeDefined();
90+
expect(tools.lore_update_node.description).not.toContain('glossary fields');
91+
});
92+
8593
it('lore_delete_node requires uri', () => {
8694
expect(tools.lore_delete_node.parameters.required).toContain('uri');
8795
});
@@ -256,7 +264,10 @@ describe('tool response formatting', () => {
256264
expect(result.content[0].text).toContain('Updated core://agent/profile-renamed');
257265
expect((fetch as any).mock.calls).toHaveLength(1);
258266
expect((fetch as any).mock.calls.map((call: any[]) => call[1].method)).not.toContain('GET');
259-
expect(JSON.parse((fetch as any).mock.calls[0][1].body)).toMatchObject({ content: 'updated', glossary: ['fresh'], glossary_add: ['memory'] });
267+
const body = JSON.parse((fetch as any).mock.calls[0][1].body);
268+
expect(body).toMatchObject({ content: 'updated', glossary_add: ['memory'] });
269+
expect(body).not.toHaveProperty('glossary');
270+
expect(result.content[0].text).not.toContain('glossary=');
260271
});
261272

262273
it('lore_delete_node prefers canonical delete receipts', async () => {

openclaw-plugin/openclaw.plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"id": "lore",
33
"name": "Lore",
44
"description": "Primary Lore memory system for fixed boot baseline, recall, and cross-session project knowledge.",
5-
"version": "1.3.3",
5+
"version": "1.3.4",
66
"activation": {
77
"onStartup": true
88
},

0 commit comments

Comments
 (0)