superlocalmemory 2.8.1 → 2.8.2
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/ATTRIBUTION.md +50 -0
- package/CHANGELOG.md +8 -0
- package/README.md +24 -15
- package/bin/aider-smart +2 -2
- package/bin/slm +18 -18
- package/configs/continue-skills.yaml +4 -4
- package/docs/ARCHITECTURE.md +3 -3
- package/docs/CLI-COMMANDS-REFERENCE.md +18 -18
- package/docs/FRAMEWORK-INTEGRATIONS.md +4 -4
- package/docs/UNIVERSAL-INTEGRATION.md +15 -15
- package/install.sh +4 -4
- package/mcp_server.py +1 -1
- package/package.json +4 -2
- package/src/graph/graph_core.py +3 -3
- package/src/memory_store_v2.py +6 -1
- package/src/qualixar_attribution.py +139 -0
- package/src/qualixar_watermark.py +78 -0
- package/src/setup_validator.py +2 -2
- /package/bin/{superlocalmemoryv2:learning → superlocalmemoryv2-learning} +0 -0
- /package/bin/{superlocalmemoryv2:list → superlocalmemoryv2-list} +0 -0
- /package/bin/{superlocalmemoryv2:patterns → superlocalmemoryv2-patterns} +0 -0
- /package/bin/{superlocalmemoryv2:profile → superlocalmemoryv2-profile} +0 -0
- /package/bin/{superlocalmemoryv2:recall → superlocalmemoryv2-recall} +0 -0
- /package/bin/{superlocalmemoryv2:remember → superlocalmemoryv2-remember} +0 -0
- /package/bin/{superlocalmemoryv2:reset → superlocalmemoryv2-reset} +0 -0
- /package/bin/{superlocalmemoryv2:status → superlocalmemoryv2-status} +0 -0
package/ATTRIBUTION.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Attribution
|
|
2
|
+
|
|
3
|
+
## SuperLocalMemory
|
|
4
|
+
|
|
5
|
+
**SuperLocalMemory** is part of the Qualixar research initiative — advancing agent development through research.
|
|
6
|
+
|
|
7
|
+
### Creator
|
|
8
|
+
|
|
9
|
+
**Varun Pratap Bhardwaj** — Solution Architect & Original Creator
|
|
10
|
+
- GitHub: [@varun369](https://github.com/varun369)
|
|
11
|
+
- ORCID: 0009-0002-8726-4289
|
|
12
|
+
|
|
13
|
+
### License
|
|
14
|
+
|
|
15
|
+
This software is licensed under the MIT License. See [LICENSE](LICENSE) for full terms.
|
|
16
|
+
|
|
17
|
+
### Output Attribution
|
|
18
|
+
|
|
19
|
+
All tool outputs carry provenance metadata:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Generated by SuperLocalMemory | Part of Qualixar
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Outputs may include:
|
|
26
|
+
- **Layer 1 (Visible):** Human-readable attribution in reports and exports.
|
|
27
|
+
- **Layer 2 (Cryptographic):** SHA-256 content hash and signature in the `_qualixar` metadata block.
|
|
28
|
+
- **Layer 3 (Steganographic):** Invisible zero-width character watermark in text outputs.
|
|
29
|
+
|
|
30
|
+
### Verification
|
|
31
|
+
|
|
32
|
+
Output provenance can be verified programmatically:
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from qualixar_attribution import QualixarSigner
|
|
36
|
+
is_valid = QualixarSigner.verify(signed_output)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Research Initiative
|
|
40
|
+
|
|
41
|
+
Qualixar is a research platform for AI agent development tools. SuperLocalMemory is one of several research initiatives under the Qualixar umbrella. For more information, visit qualixar.com.
|
|
42
|
+
|
|
43
|
+
### Third-Party Acknowledgments
|
|
44
|
+
|
|
45
|
+
SuperLocalMemory uses the following open-source libraries:
|
|
46
|
+
- scikit-learn (BSD-3-Clause) — TF-IDF vectorization and similarity search
|
|
47
|
+
- SQLite (Public Domain) — Local database storage
|
|
48
|
+
- NumPy (BSD-3-Clause) — Numerical operations
|
|
49
|
+
|
|
50
|
+
See [requirements.txt](requirements.txt) for the full dependency list.
|
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,14 @@ SuperLocalMemory V2 - Intelligent local memory system for AI coding assistants.
|
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
+
## [2.8.2] - 2026-03-04
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- Windows compatibility for repository cloning (#7)
|
|
23
|
+
- Updated test assertions for v2.8 behavioral feature dimensions
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
19
27
|
## [2.8.0] - 2026-02-26
|
|
20
28
|
|
|
21
29
|
**Release Type:** Major Feature Release — "Memory That Manages Itself"
|
package/README.md
CHANGED
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
</p>
|
|
39
39
|
|
|
40
40
|
<p align="center">
|
|
41
|
-
<b>Created by <a href="https://github.com/varun369">Varun Pratap Bhardwaj</a
|
|
41
|
+
<b>A <a href="https://github.com/varun369">Qualixar</a> Product</b> · Created by <a href="https://github.com/varun369">Varun Pratap Bhardwaj</a> •
|
|
42
42
|
<a href="https://github.com/sponsors/varun369">💖 Sponsor</a> •
|
|
43
43
|
<a href="LICENSE">📜 MIT License</a>
|
|
44
44
|
</p>
|
|
@@ -201,10 +201,10 @@ You: *sighs and explains everything again*
|
|
|
201
201
|
npm install -g superlocalmemory
|
|
202
202
|
|
|
203
203
|
# Save a memory
|
|
204
|
-
superlocalmemoryv2
|
|
204
|
+
superlocalmemoryv2-remember "Fixed auth bug - JWT tokens were expiring too fast, increased to 24h"
|
|
205
205
|
|
|
206
206
|
# Later, in a new session...
|
|
207
|
-
superlocalmemoryv2
|
|
207
|
+
superlocalmemoryv2-recall "auth bug"
|
|
208
208
|
# ✓ Found: "Fixed auth bug - JWT tokens were expiring too fast, increased to 24h"
|
|
209
209
|
```
|
|
210
210
|
|
|
@@ -230,7 +230,7 @@ Both methods auto-detect and configure **17+ IDEs and AI tools** — Cursor, VS
|
|
|
230
230
|
### Verify Installation
|
|
231
231
|
|
|
232
232
|
```bash
|
|
233
|
-
superlocalmemoryv2
|
|
233
|
+
superlocalmemoryv2-status
|
|
234
234
|
# ✓ Database: OK (0 memories)
|
|
235
235
|
# ✓ Graph: Ready
|
|
236
236
|
# ✓ Patterns: Ready
|
|
@@ -343,7 +343,7 @@ Not another simple key-value store. SuperLocalMemory implements **cutting-edge m
|
|
|
343
343
|
|
|
344
344
|
| Tool | Integration | How It Works |
|
|
345
345
|
|------|-------------|--------------|
|
|
346
|
-
| **Claude Code** | ✅ Skills + MCP | `/superlocalmemoryv2
|
|
346
|
+
| **Claude Code** | ✅ Skills + MCP | `/superlocalmemoryv2-remember` |
|
|
347
347
|
| **Cursor** | ✅ MCP + Skills | AI uses memory tools natively |
|
|
348
348
|
| **Windsurf** | ✅ MCP + Skills | Native memory access |
|
|
349
349
|
| **Claude Desktop** | ✅ MCP | Built-in support |
|
|
@@ -365,7 +365,7 @@ Not another simple key-value store. SuperLocalMemory implements **cutting-edge m
|
|
|
365
365
|
- "Remember that we use this framework" just works
|
|
366
366
|
|
|
367
367
|
2. **Skills & Commands** — For Claude Code, Continue.dev, Cody
|
|
368
|
-
- `/superlocalmemoryv2
|
|
368
|
+
- `/superlocalmemoryv2-remember` in Claude Code
|
|
369
369
|
- `/slm-remember` in Continue.dev and Cody
|
|
370
370
|
- Familiar slash command interface
|
|
371
371
|
|
|
@@ -466,15 +466,15 @@ Auto-clustering discovers 6-7 natural topic communities from your memories.
|
|
|
466
466
|
|
|
467
467
|
```bash
|
|
468
468
|
# Memory Operations
|
|
469
|
-
superlocalmemoryv2
|
|
470
|
-
superlocalmemoryv2
|
|
471
|
-
superlocalmemoryv2
|
|
472
|
-
superlocalmemoryv2
|
|
469
|
+
superlocalmemoryv2-remember "content" --tags tag1,tag2 # Save memory
|
|
470
|
+
superlocalmemoryv2-recall "search query" # Search
|
|
471
|
+
superlocalmemoryv2-list # Recent memories
|
|
472
|
+
superlocalmemoryv2-status # System health
|
|
473
473
|
|
|
474
474
|
# Profile Management
|
|
475
|
-
superlocalmemoryv2
|
|
476
|
-
superlocalmemoryv2
|
|
477
|
-
superlocalmemoryv2
|
|
475
|
+
superlocalmemoryv2-profile list # Show all profiles
|
|
476
|
+
superlocalmemoryv2-profile create <name> # New profile
|
|
477
|
+
superlocalmemoryv2-profile switch <name> # Switch context
|
|
478
478
|
|
|
479
479
|
# Knowledge Graph
|
|
480
480
|
python ~/.claude-memory/graph_engine.py build # Build graph
|
|
@@ -544,11 +544,20 @@ MIT License — use freely, even commercially. Just include the license.
|
|
|
544
544
|
|
|
545
545
|
## 👨💻 Author
|
|
546
546
|
|
|
547
|
-
**Varun Pratap Bhardwaj** — Solution Architect
|
|
547
|
+
**Varun Pratap Bhardwaj** — Founder, Qualixar · Solution Architect
|
|
548
548
|
|
|
549
549
|
[](https://github.com/varun369)
|
|
550
550
|
|
|
551
|
-
Building
|
|
551
|
+
Building the complete agent development platform at Qualixar — memory, testing, contracts, and security for AI agents.
|
|
552
|
+
|
|
553
|
+
### Part of the Qualixar Agent Development Platform
|
|
554
|
+
|
|
555
|
+
SuperLocalMemory is part of **Qualixar**, a suite of open-source tools for building reliable AI agents:
|
|
556
|
+
|
|
557
|
+
| Product | What It Does |
|
|
558
|
+
|---------|-------------|
|
|
559
|
+
| **SuperLocalMemory** | Local-first AI agent memory |
|
|
560
|
+
| **SkillFortify** | Agent skill supply chain security |
|
|
552
561
|
|
|
553
562
|
---
|
|
554
563
|
|
package/bin/aider-smart
CHANGED
|
@@ -35,11 +35,11 @@ echo ""
|
|
|
35
35
|
if command -v slm &> /dev/null; then
|
|
36
36
|
# Use slm command if available
|
|
37
37
|
slm context > "$CONTEXT_FILE" 2>/dev/null || {
|
|
38
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
38
|
+
"$SLM_DIR/bin/superlocalmemoryv2-recall" "$project" --limit 5 > "$CONTEXT_FILE" 2>/dev/null || true
|
|
39
39
|
}
|
|
40
40
|
else
|
|
41
41
|
# Fallback to direct command
|
|
42
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
42
|
+
"$SLM_DIR/bin/superlocalmemoryv2-recall" "$project" --limit 5 > "$CONTEXT_FILE" 2>/dev/null || true
|
|
43
43
|
fi
|
|
44
44
|
|
|
45
45
|
# Get coding patterns if available
|
package/bin/slm
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# Licensed under MIT License
|
|
7
7
|
#
|
|
8
8
|
# This is a CONVENIENCE wrapper. Original commands still work:
|
|
9
|
-
# superlocalmemoryv2
|
|
9
|
+
# superlocalmemoryv2-remember, superlocalmemoryv2-recall, etc.
|
|
10
10
|
|
|
11
11
|
set -e
|
|
12
12
|
|
|
@@ -24,13 +24,13 @@ case "$1" in
|
|
|
24
24
|
remember|save|store)
|
|
25
25
|
shift
|
|
26
26
|
# Calls existing command - no duplicate logic
|
|
27
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
27
|
+
"$SLM_DIR/bin/superlocalmemoryv2-remember" "$@"
|
|
28
28
|
;;
|
|
29
29
|
|
|
30
30
|
recall|search|find)
|
|
31
31
|
shift
|
|
32
32
|
# Calls existing command - no duplicate logic
|
|
33
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
33
|
+
"$SLM_DIR/bin/superlocalmemoryv2-recall" "$@"
|
|
34
34
|
;;
|
|
35
35
|
|
|
36
36
|
list|ls)
|
|
@@ -38,44 +38,44 @@ case "$1" in
|
|
|
38
38
|
# Convert positional number to --limit flag
|
|
39
39
|
# e.g., "slm list 5" becomes "--limit 5"
|
|
40
40
|
if [ -n "$1" ] && [[ "$1" =~ ^[0-9]+$ ]]; then
|
|
41
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
41
|
+
"$SLM_DIR/bin/superlocalmemoryv2-list" --limit "$1"
|
|
42
42
|
else
|
|
43
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
43
|
+
"$SLM_DIR/bin/superlocalmemoryv2-list" "$@"
|
|
44
44
|
fi
|
|
45
45
|
;;
|
|
46
46
|
|
|
47
47
|
status|info|stats)
|
|
48
48
|
# Calls existing command - no duplicate logic
|
|
49
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
49
|
+
"$SLM_DIR/bin/superlocalmemoryv2-status"
|
|
50
50
|
;;
|
|
51
51
|
|
|
52
52
|
profile)
|
|
53
53
|
shift
|
|
54
54
|
# Calls existing command - no duplicate logic
|
|
55
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
55
|
+
"$SLM_DIR/bin/superlocalmemoryv2-profile" "$@"
|
|
56
56
|
;;
|
|
57
57
|
|
|
58
58
|
switch-profile)
|
|
59
59
|
shift
|
|
60
60
|
# Convenience alias: "slm switch-profile <name>" -> "slm profile switch <name>"
|
|
61
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
61
|
+
"$SLM_DIR/bin/superlocalmemoryv2-profile" switch "$@"
|
|
62
62
|
;;
|
|
63
63
|
|
|
64
64
|
list-profiles)
|
|
65
65
|
# Convenience alias: "slm list-profiles" -> "slm profile list"
|
|
66
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
66
|
+
"$SLM_DIR/bin/superlocalmemoryv2-profile" list
|
|
67
67
|
;;
|
|
68
68
|
|
|
69
69
|
create-profile)
|
|
70
70
|
shift
|
|
71
71
|
# Convenience alias: "slm create-profile <name>" -> "slm profile create <name>"
|
|
72
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
72
|
+
"$SLM_DIR/bin/superlocalmemoryv2-profile" create "$@"
|
|
73
73
|
;;
|
|
74
74
|
|
|
75
75
|
reset)
|
|
76
76
|
shift
|
|
77
77
|
# Calls existing command - no duplicate logic
|
|
78
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
78
|
+
"$SLM_DIR/bin/superlocalmemoryv2-reset" "$@"
|
|
79
79
|
;;
|
|
80
80
|
|
|
81
81
|
ui|dashboard)
|
|
@@ -103,7 +103,7 @@ case "$1" in
|
|
|
103
103
|
context)
|
|
104
104
|
# NEW: Get context for current directory/project
|
|
105
105
|
project=$(basename "$PWD")
|
|
106
|
-
"$SLM_DIR/bin/superlocalmemoryv2
|
|
106
|
+
"$SLM_DIR/bin/superlocalmemoryv2-recall" "$project" --limit 5
|
|
107
107
|
;;
|
|
108
108
|
|
|
109
109
|
graph)
|
|
@@ -361,12 +361,12 @@ ADVANCED:
|
|
|
361
361
|
slm reset hard --confirm Hard reset (nuclear option)
|
|
362
362
|
|
|
363
363
|
ORIGINAL COMMANDS (still work):
|
|
364
|
-
superlocalmemoryv2
|
|
365
|
-
superlocalmemoryv2
|
|
366
|
-
superlocalmemoryv2
|
|
367
|
-
superlocalmemoryv2
|
|
368
|
-
superlocalmemoryv2
|
|
369
|
-
superlocalmemoryv2
|
|
364
|
+
superlocalmemoryv2-remember <content>
|
|
365
|
+
superlocalmemoryv2-recall <query>
|
|
366
|
+
superlocalmemoryv2-list [N]
|
|
367
|
+
superlocalmemoryv2-status
|
|
368
|
+
superlocalmemoryv2-profile <command>
|
|
369
|
+
superlocalmemoryv2-reset <type>
|
|
370
370
|
|
|
371
371
|
EXAMPLES:
|
|
372
372
|
slm remember "Use FastAPI for REST APIs" --tags python,backend
|
|
@@ -5,19 +5,19 @@
|
|
|
5
5
|
slashCommands:
|
|
6
6
|
- name: "slm-remember"
|
|
7
7
|
description: "Save to SuperLocalMemory"
|
|
8
|
-
run: "~/.claude-memory/bin/superlocalmemoryv2
|
|
8
|
+
run: "~/.claude-memory/bin/superlocalmemoryv2-remember \"{{input}}\""
|
|
9
9
|
|
|
10
10
|
- name: "slm-recall"
|
|
11
11
|
description: "Search SuperLocalMemory"
|
|
12
|
-
run: "~/.claude-memory/bin/superlocalmemoryv2
|
|
12
|
+
run: "~/.claude-memory/bin/superlocalmemoryv2-recall \"{{input}}\""
|
|
13
13
|
|
|
14
14
|
- name: "slm-list"
|
|
15
15
|
description: "List recent memories"
|
|
16
|
-
run: "~/.claude-memory/bin/superlocalmemoryv2
|
|
16
|
+
run: "~/.claude-memory/bin/superlocalmemoryv2-list"
|
|
17
17
|
|
|
18
18
|
- name: "slm-status"
|
|
19
19
|
description: "SuperLocalMemory system status"
|
|
20
|
-
run: "~/.claude-memory/bin/superlocalmemoryv2
|
|
20
|
+
run: "~/.claude-memory/bin/superlocalmemoryv2-status"
|
|
21
21
|
|
|
22
22
|
# Usage in Continue.dev:
|
|
23
23
|
# /slm-remember Use FastAPI for REST APIs
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -61,7 +61,7 @@ Simple Storage → Intelligent Organization → Adaptive Learning
|
|
|
61
61
|
│ • Continue.dev - MCP context providers │
|
|
62
62
|
├─────────────────────────────────────────────────────────────┤
|
|
63
63
|
│ TIER 2: Skills & Commands │
|
|
64
|
-
│ • Claude Code - /superlocalmemoryv2
|
|
64
|
+
│ • Claude Code - /superlocalmemoryv2-* │
|
|
65
65
|
│ • Continue.dev - /slm-* slash commands │
|
|
66
66
|
│ • Cody - Custom commands via settings │
|
|
67
67
|
├─────────────────────────────────────────────────────────────┤
|
|
@@ -148,8 +148,8 @@ Installation automatically detects and configures:
|
|
|
148
148
|
Provides simple syntax for all operations:
|
|
149
149
|
|
|
150
150
|
```bash
|
|
151
|
-
slm remember "content" # Calls superlocalmemoryv2
|
|
152
|
-
slm recall "query" # Calls superlocalmemoryv2
|
|
151
|
+
slm remember "content" # Calls superlocalmemoryv2-remember
|
|
152
|
+
slm recall "query" # Calls superlocalmemoryv2-recall
|
|
153
153
|
slm list # Recent memories
|
|
154
154
|
slm status # System health
|
|
155
155
|
slm profile list # Profile management
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
SuperLocalMemory V2 offers three access methods:
|
|
8
8
|
1. **Universal CLI** - Simple `slm` commands (NEW in v2.1.0)
|
|
9
|
-
2. **Original CLI** - Full `superlocalmemoryv2
|
|
9
|
+
2. **Original CLI** - Full `superlocalmemoryv2-*` commands
|
|
10
10
|
3. **MCP/Skills** - IDE-specific integration (auto-configured)
|
|
11
11
|
|
|
12
12
|
All methods use the same local SQLite database.
|
|
@@ -105,9 +105,9 @@ All original commands continue to work unchanged. Use these if you prefer explic
|
|
|
105
105
|
|
|
106
106
|
### Check System Status
|
|
107
107
|
```bash
|
|
108
|
-
superlocalmemoryv2
|
|
108
|
+
superlocalmemoryv2-status
|
|
109
109
|
# OR
|
|
110
|
-
~/.claude-memory/bin/superlocalmemoryv2
|
|
110
|
+
~/.claude-memory/bin/superlocalmemoryv2-status
|
|
111
111
|
```
|
|
112
112
|
Shows: total memories, graph stats, clusters, patterns, database size
|
|
113
113
|
|
|
@@ -119,38 +119,38 @@ Shows: total memories, graph stats, clusters, patterns, database size
|
|
|
119
119
|
|
|
120
120
|
### List All Profiles
|
|
121
121
|
```bash
|
|
122
|
-
superlocalmemoryv2
|
|
122
|
+
superlocalmemoryv2-profile list
|
|
123
123
|
# OR
|
|
124
|
-
~/.claude-memory/bin/superlocalmemoryv2
|
|
124
|
+
~/.claude-memory/bin/superlocalmemoryv2-profile list
|
|
125
125
|
```
|
|
126
126
|
Shows all profiles with active marker (→)
|
|
127
127
|
|
|
128
128
|
### Show Current Active Profile
|
|
129
129
|
```bash
|
|
130
|
-
superlocalmemoryv2
|
|
130
|
+
superlocalmemoryv2-profile current
|
|
131
131
|
# OR
|
|
132
|
-
~/.claude-memory/bin/superlocalmemoryv2
|
|
132
|
+
~/.claude-memory/bin/superlocalmemoryv2-profile current
|
|
133
133
|
```
|
|
134
134
|
Shows current profile details and memory count
|
|
135
135
|
|
|
136
136
|
### Create New Profile
|
|
137
137
|
```bash
|
|
138
138
|
# Empty profile
|
|
139
|
-
superlocalmemoryv2
|
|
139
|
+
superlocalmemoryv2-profile create work --description "Work projects"
|
|
140
140
|
|
|
141
141
|
# Copy from current profile
|
|
142
|
-
superlocalmemoryv2
|
|
142
|
+
superlocalmemoryv2-profile create personal --from-current
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
### Switch Profile
|
|
146
146
|
```bash
|
|
147
|
-
superlocalmemoryv2
|
|
147
|
+
superlocalmemoryv2-profile switch work
|
|
148
148
|
```
|
|
149
149
|
**⚠️ Restart your IDE after switching if using MCP integration.**
|
|
150
150
|
|
|
151
151
|
### Delete Profile
|
|
152
152
|
```bash
|
|
153
|
-
superlocalmemoryv2
|
|
153
|
+
superlocalmemoryv2-profile delete old-project
|
|
154
154
|
```
|
|
155
155
|
- Cannot delete "default" profile
|
|
156
156
|
- Cannot delete currently active profile
|
|
@@ -165,15 +165,15 @@ superlocalmemoryv2:profile delete old-project
|
|
|
165
165
|
```bash
|
|
166
166
|
slm status
|
|
167
167
|
# OR
|
|
168
|
-
superlocalmemoryv2
|
|
168
|
+
superlocalmemoryv2-status
|
|
169
169
|
```
|
|
170
170
|
**Always check status before any reset operation!**
|
|
171
171
|
|
|
172
172
|
### Soft Reset
|
|
173
173
|
```bash
|
|
174
|
-
superlocalmemoryv2
|
|
174
|
+
superlocalmemoryv2-reset soft
|
|
175
175
|
# OR
|
|
176
|
-
~/.claude-memory/bin/superlocalmemoryv2
|
|
176
|
+
~/.claude-memory/bin/superlocalmemoryv2-reset soft
|
|
177
177
|
```
|
|
178
178
|
- Clears all memories from current profile
|
|
179
179
|
- Clears graph, patterns, tree structure
|
|
@@ -183,9 +183,9 @@ superlocalmemoryv2:reset soft
|
|
|
183
183
|
|
|
184
184
|
### Hard Reset
|
|
185
185
|
```bash
|
|
186
|
-
superlocalmemoryv2
|
|
186
|
+
superlocalmemoryv2-reset hard --confirm
|
|
187
187
|
# OR
|
|
188
|
-
~/.claude-memory/bin/superlocalmemoryv2
|
|
188
|
+
~/.claude-memory/bin/superlocalmemoryv2-reset hard --confirm
|
|
189
189
|
```
|
|
190
190
|
- ⚠️ **NUCLEAR OPTION** ⚠️
|
|
191
191
|
- Deletes entire database file
|
|
@@ -195,9 +195,9 @@ superlocalmemoryv2:reset hard --confirm
|
|
|
195
195
|
|
|
196
196
|
### Layer Reset (Surgical)
|
|
197
197
|
```bash
|
|
198
|
-
superlocalmemoryv2
|
|
198
|
+
superlocalmemoryv2-reset layer --layers graph patterns
|
|
199
199
|
# OR
|
|
200
|
-
~/.claude-memory/bin/superlocalmemoryv2
|
|
200
|
+
~/.claude-memory/bin/superlocalmemoryv2-reset layer --layers graph patterns
|
|
201
201
|
```
|
|
202
202
|
Available layers:
|
|
203
203
|
- `graph` - Clear graph nodes, edges, clusters
|
|
@@ -240,7 +240,7 @@ history.clear()
|
|
|
240
240
|
chat_store.delete_messages("user-1")
|
|
241
241
|
|
|
242
242
|
# CLI: Reset entire profile
|
|
243
|
-
# superlocalmemoryv2
|
|
243
|
+
# superlocalmemoryv2-reset soft --profile customer-support
|
|
244
244
|
```
|
|
245
245
|
|
|
246
246
|
---
|
|
@@ -265,7 +265,7 @@ If you see "database is locked" errors:
|
|
|
265
265
|
|
|
266
266
|
```bash
|
|
267
267
|
# Check if SuperLocalMemory is running correctly
|
|
268
|
-
superlocalmemoryv2
|
|
268
|
+
superlocalmemoryv2-status
|
|
269
269
|
|
|
270
270
|
# Restart any MCP servers
|
|
271
271
|
# (Close and reopen Cursor/Windsurf)
|
|
@@ -277,10 +277,10 @@ If a profile doesn't exist:
|
|
|
277
277
|
|
|
278
278
|
```bash
|
|
279
279
|
# List available profiles
|
|
280
|
-
superlocalmemoryv2
|
|
280
|
+
superlocalmemoryv2-profile list
|
|
281
281
|
|
|
282
282
|
# Create the profile
|
|
283
|
-
superlocalmemoryv2
|
|
283
|
+
superlocalmemoryv2-profile create work
|
|
284
284
|
```
|
|
285
285
|
|
|
286
286
|
---
|
|
@@ -33,7 +33,7 @@ After installation, restart any IDE you want to use SuperLocalMemory with.
|
|
|
33
33
|
|
|
34
34
|
### Step 3: Start Using It
|
|
35
35
|
- **In Cursor/Windsurf:** Just talk naturally - "Remember that we use FastAPI for APIs"
|
|
36
|
-
- **In Claude Code:** Use `/superlocalmemoryv2
|
|
36
|
+
- **In Claude Code:** Use `/superlocalmemoryv2-remember` or the new `slm` commands
|
|
37
37
|
- **In Terminal:** Use `slm remember "content"`
|
|
38
38
|
|
|
39
39
|
---
|
|
@@ -48,11 +48,11 @@ After installation, restart any IDE you want to use SuperLocalMemory with.
|
|
|
48
48
|
|
|
49
49
|
**Usage:**
|
|
50
50
|
```
|
|
51
|
-
/superlocalmemoryv2
|
|
52
|
-
/superlocalmemoryv2
|
|
53
|
-
/superlocalmemoryv2
|
|
54
|
-
/superlocalmemoryv2
|
|
55
|
-
/superlocalmemoryv2
|
|
51
|
+
/superlocalmemoryv2-remember "Use FastAPI for REST APIs"
|
|
52
|
+
/superlocalmemoryv2-recall "FastAPI"
|
|
53
|
+
/superlocalmemoryv2-list
|
|
54
|
+
/superlocalmemoryv2-status
|
|
55
|
+
/superlocalmemoryv2-profile list
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
**OR use the simpler CLI:**
|
|
@@ -169,7 +169,7 @@ Continue's AI can also call memory tools directly.
|
|
|
169
169
|
slashCommands:
|
|
170
170
|
- name: "slm-remember"
|
|
171
171
|
description: "Save to SuperLocalMemory"
|
|
172
|
-
run: "~/.claude-memory/bin/superlocalmemoryv2
|
|
172
|
+
run: "~/.claude-memory/bin/superlocalmemoryv2-remember \"{{input}}\""
|
|
173
173
|
|
|
174
174
|
# For MCP tools
|
|
175
175
|
contextProviders:
|
|
@@ -293,7 +293,7 @@ ChatGPT: [calls fetch(42)]
|
|
|
293
293
|
|
|
294
294
|
**Commands Installed:**
|
|
295
295
|
- `slm` - Main command
|
|
296
|
-
- All original `superlocalmemoryv2
|
|
296
|
+
- All original `superlocalmemoryv2-*` commands still work
|
|
297
297
|
|
|
298
298
|
**Usage:**
|
|
299
299
|
```bash
|
|
@@ -335,7 +335,7 @@ All access methods use the **SAME local SQLite database**:
|
|
|
335
335
|
│ ACCESS METHODS │
|
|
336
336
|
├─────────────────────────────────────────────┤
|
|
337
337
|
│ TIER 1: Skills │
|
|
338
|
-
│ • Claude Code: /superlocalmemoryv2
|
|
338
|
+
│ • Claude Code: /superlocalmemoryv2-* │
|
|
339
339
|
│ • Continue: /slm-* │
|
|
340
340
|
│ • Cody: /slm-* │
|
|
341
341
|
├─────────────────────────────────────────────┤
|
|
@@ -359,7 +359,7 @@ All access methods use the **SAME local SQLite database**:
|
|
|
359
359
|
└───────────────────┘
|
|
360
360
|
```
|
|
361
361
|
|
|
362
|
-
**Key Point:** No matter which method you use, all data goes to the same place. You can use `/superlocalmemoryv2
|
|
362
|
+
**Key Point:** No matter which method you use, all data goes to the same place. You can use `/superlocalmemoryv2-remember` in Claude Code, then `slm recall` in terminal, and see the same memories.
|
|
363
363
|
|
|
364
364
|
---
|
|
365
365
|
|
|
@@ -453,11 +453,11 @@ python3 ~/.claude-memory/mcp_server.py --transport http --port 8001
|
|
|
453
453
|
|
|
454
454
|
| Old Command | Still Works? | New Alternative |
|
|
455
455
|
|-------------|--------------|-----------------|
|
|
456
|
-
| `superlocalmemoryv2
|
|
457
|
-
| `superlocalmemoryv2
|
|
458
|
-
| `superlocalmemoryv2
|
|
459
|
-
| `superlocalmemoryv2
|
|
460
|
-
| `superlocalmemoryv2
|
|
456
|
+
| `superlocalmemoryv2-remember` | ✅ Yes | `slm remember` |
|
|
457
|
+
| `superlocalmemoryv2-recall` | ✅ Yes | `slm recall` |
|
|
458
|
+
| `superlocalmemoryv2-list` | ✅ Yes | `slm list` |
|
|
459
|
+
| `superlocalmemoryv2-status` | ✅ Yes | `slm status` |
|
|
460
|
+
| `superlocalmemoryv2-profile` | ✅ Yes | `slm profile` |
|
|
461
461
|
|
|
462
462
|
**Nothing breaks. Everything gains new capabilities.**
|
|
463
463
|
|
package/install.sh
CHANGED
|
@@ -848,10 +848,10 @@ echo ""
|
|
|
848
848
|
echo "Available commands (two ways to use them):"
|
|
849
849
|
echo ""
|
|
850
850
|
echo "OPTION 1: Original commands (still work):"
|
|
851
|
-
echo " superlocalmemoryv2
|
|
852
|
-
echo " superlocalmemoryv2
|
|
853
|
-
echo " superlocalmemoryv2
|
|
854
|
-
echo " superlocalmemoryv2
|
|
851
|
+
echo " superlocalmemoryv2-remember - Save a new memory"
|
|
852
|
+
echo " superlocalmemoryv2-recall - Search memories"
|
|
853
|
+
echo " superlocalmemoryv2-list - List recent memories"
|
|
854
|
+
echo " superlocalmemoryv2-status - Check system status"
|
|
855
855
|
echo ""
|
|
856
856
|
echo "OPTION 2: New simple commands:"
|
|
857
857
|
echo " slm remember <content> - Save (simpler syntax)"
|
package/mcp_server.py
CHANGED
|
@@ -609,7 +609,7 @@ async def remember(
|
|
|
609
609
|
"""
|
|
610
610
|
Save content to SuperLocalMemory with intelligent indexing.
|
|
611
611
|
|
|
612
|
-
This calls the SAME backend as /superlocalmemoryv2
|
|
612
|
+
This calls the SAME backend as /superlocalmemoryv2-remember skill.
|
|
613
613
|
All memories are stored in the same local SQLite database.
|
|
614
614
|
|
|
615
615
|
Args:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "superlocalmemory",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.2",
|
|
4
4
|
"description": "Your AI Finally Remembers You - Local-first intelligent memory system for AI assistants. Works with Claude, Cursor, Windsurf, VS Code/Copilot, Codex, and 17+ AI tools. 100% local, zero cloud dependencies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-memory",
|
|
@@ -22,7 +22,9 @@
|
|
|
22
22
|
"chatgpt",
|
|
23
23
|
"chatgpt-connector",
|
|
24
24
|
"openai",
|
|
25
|
-
"deep-research"
|
|
25
|
+
"deep-research",
|
|
26
|
+
"qualixar",
|
|
27
|
+
"agent-development-platform"
|
|
26
28
|
],
|
|
27
29
|
"author": {
|
|
28
30
|
"name": "Varun Pratap Bhardwaj",
|
package/src/graph/graph_core.py
CHANGED
|
@@ -80,7 +80,7 @@ class GraphEngine:
|
|
|
80
80
|
logger.error(f"Missing required tables: {missing}")
|
|
81
81
|
return {'success': False, 'error': 'database_not_initialized',
|
|
82
82
|
'message': f"Database not initialized. Missing tables: {', '.join(missing)}",
|
|
83
|
-
'fix': "Run 'superlocalmemoryv2
|
|
83
|
+
'fix': "Run 'superlocalmemoryv2-status' first to initialize the database, or add some memories."}
|
|
84
84
|
|
|
85
85
|
active_profile = self._get_active_profile()
|
|
86
86
|
logger.info(f"Building graph for profile: {active_profile}")
|
|
@@ -91,12 +91,12 @@ class GraphEngine:
|
|
|
91
91
|
if len(memories) == 0:
|
|
92
92
|
return {'success': False, 'error': 'no_memories',
|
|
93
93
|
'message': 'No memories found in database.',
|
|
94
|
-
'fix': "Add some memories first: superlocalmemoryv2
|
|
94
|
+
'fix': "Add some memories first: superlocalmemoryv2-remember 'Your content here'"}
|
|
95
95
|
if len(memories) < 2:
|
|
96
96
|
return {'success': False, 'error': 'insufficient_memories',
|
|
97
97
|
'message': 'Need at least 2 memories to build knowledge graph.',
|
|
98
98
|
'memories': len(memories),
|
|
99
|
-
'fix': "Add more memories: superlocalmemoryv2
|
|
99
|
+
'fix': "Add more memories: superlocalmemoryv2-remember 'Your content here'"}
|
|
100
100
|
|
|
101
101
|
memories = apply_sampling(cursor, memories, active_profile)
|
|
102
102
|
clear_profile_graph_data(cursor, conn, memories, active_profile)
|
package/src/memory_store_v2.py
CHANGED
|
@@ -1201,7 +1201,8 @@ class MemoryStoreV2:
|
|
|
1201
1201
|
Removing or obscuring this attribution violates the license terms.
|
|
1202
1202
|
|
|
1203
1203
|
Returns:
|
|
1204
|
-
Dictionary with creator information and attribution requirements
|
|
1204
|
+
Dictionary with creator information and attribution requirements,
|
|
1205
|
+
including Qualixar platform provenance.
|
|
1205
1206
|
"""
|
|
1206
1207
|
with self._read_connection() as conn:
|
|
1207
1208
|
cursor = conn.cursor()
|
|
@@ -1218,6 +1219,10 @@ class MemoryStoreV2:
|
|
|
1218
1219
|
'attribution_required': 'yes'
|
|
1219
1220
|
}
|
|
1220
1221
|
|
|
1222
|
+
# Qualixar platform provenance (non-breaking additions)
|
|
1223
|
+
attribution['platform'] = 'Qualixar'
|
|
1224
|
+
attribution['verify_url'] = 'https://qualixar.com'
|
|
1225
|
+
|
|
1221
1226
|
return attribution
|
|
1222
1227
|
|
|
1223
1228
|
def export_for_context(self, query: str, max_tokens: int = 4000) -> str:
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
+
# Part of Qualixar — Advancing Agent Development Through Research
|
|
5
|
+
"""
|
|
6
|
+
Qualixar Attribution — Cryptographic output signing for provenance tracking.
|
|
7
|
+
|
|
8
|
+
Signs tool outputs with SHA-256 content hashes and verifiable provenance
|
|
9
|
+
metadata. Part of the 3-layer Qualixar attribution system:
|
|
10
|
+
Layer 1: Visible attribution (ATTRIBUTION.md, get_attribution())
|
|
11
|
+
Layer 2: Cryptographic signing (this module)
|
|
12
|
+
Layer 3: Steganographic watermarking (qualixar_watermark.py)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import hashlib
|
|
16
|
+
import json
|
|
17
|
+
import time
|
|
18
|
+
from typing import Any, Dict
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Registry of all Qualixar research initiative tools
|
|
22
|
+
TOOL_REGISTRY: Dict[str, str] = {
|
|
23
|
+
"agentassert": "AgentAssert — Behavioral Contracts",
|
|
24
|
+
"agentassay": "AgentAssay — Stochastic Testing",
|
|
25
|
+
"skillfortify": "SkillFortify — Security Validation",
|
|
26
|
+
"superlocalmemory": "SuperLocalMemory — Agent Memory",
|
|
27
|
+
"telephonebench": "TelephoneBench — Communication Benchmarks",
|
|
28
|
+
"vibecheck": "VibeCheck — Code Reliability",
|
|
29
|
+
"agentreplay": "AgentReplay — Time-Travel Debugging",
|
|
30
|
+
"agentchaos": "AgentChaos — Chaos Engineering",
|
|
31
|
+
"agentmigrate": "AgentMigrate — Migration Engineering",
|
|
32
|
+
"agentpact": "AgentPact — Composition Testing",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class QualixarSigner:
|
|
37
|
+
"""Signs tool outputs with cryptographic provenance metadata.
|
|
38
|
+
|
|
39
|
+
Adds a ``_qualixar`` block to output dictionaries containing a SHA-256
|
|
40
|
+
content hash, timestamp, tool information, and a verifiable signature.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
tool_name: Identifier for the tool (e.g. ``"superlocalmemory"``).
|
|
44
|
+
version: Semantic version string of the tool.
|
|
45
|
+
|
|
46
|
+
Example::
|
|
47
|
+
|
|
48
|
+
signer = QualixarSigner("superlocalmemory", "2.8.1")
|
|
49
|
+
signed = signer.sign({"memories": [...]})
|
|
50
|
+
assert QualixarSigner.verify(signed) is True
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def __init__(self, tool_name: str, version: str) -> None:
|
|
54
|
+
self.tool_name = tool_name
|
|
55
|
+
self.version = version
|
|
56
|
+
self.tool_desc = TOOL_REGISTRY.get(tool_name, tool_name)
|
|
57
|
+
|
|
58
|
+
def sign(self, output_data: Any) -> Dict[str, Any]:
|
|
59
|
+
"""Add cryptographic provenance to any output.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
output_data: The data to sign. If a dict, provenance is added
|
|
63
|
+
in-place. Otherwise wrapped in ``{"data": ...}``.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Dictionary with the original data plus a ``_qualixar`` provenance
|
|
67
|
+
block containing content_hash, timestamp, and signature.
|
|
68
|
+
"""
|
|
69
|
+
timestamp = time.time()
|
|
70
|
+
canonical = json.dumps(output_data, sort_keys=True, default=str)
|
|
71
|
+
content_hash = hashlib.sha256(canonical.encode()).hexdigest()
|
|
72
|
+
|
|
73
|
+
provenance = {
|
|
74
|
+
"_qualixar": {
|
|
75
|
+
"tool": self.tool_name,
|
|
76
|
+
"tool_description": self.tool_desc,
|
|
77
|
+
"version": self.version,
|
|
78
|
+
"platform": "Qualixar",
|
|
79
|
+
"timestamp": timestamp,
|
|
80
|
+
"content_hash": content_hash,
|
|
81
|
+
"license": "MIT",
|
|
82
|
+
"attribution": (
|
|
83
|
+
f"Generated by {self.tool_desc} v{self.version}"
|
|
84
|
+
),
|
|
85
|
+
"signature": self._compute_signature(
|
|
86
|
+
content_hash, timestamp
|
|
87
|
+
),
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if isinstance(output_data, dict):
|
|
92
|
+
output_data.update(provenance)
|
|
93
|
+
return output_data
|
|
94
|
+
return {"data": output_data, **provenance}
|
|
95
|
+
|
|
96
|
+
def _compute_signature(
|
|
97
|
+
self, content_hash: str, timestamp: float
|
|
98
|
+
) -> str:
|
|
99
|
+
"""Compute HMAC-style signature over content hash and timestamp.
|
|
100
|
+
|
|
101
|
+
In production, this should use Ed25519 with a private key.
|
|
102
|
+
The current implementation uses SHA-256 over a canonical string
|
|
103
|
+
as a lightweight integrity check.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
content_hash: SHA-256 hex digest of the canonical content.
|
|
107
|
+
timestamp: Unix timestamp of signing.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
Hex-encoded SHA-256 signature string.
|
|
111
|
+
"""
|
|
112
|
+
sig_input = (
|
|
113
|
+
f"{self.tool_name}:{self.version}:"
|
|
114
|
+
f"{content_hash}:{timestamp}"
|
|
115
|
+
)
|
|
116
|
+
return hashlib.sha256(sig_input.encode()).hexdigest()
|
|
117
|
+
|
|
118
|
+
@staticmethod
|
|
119
|
+
def verify(output_data: Dict[str, Any]) -> bool:
|
|
120
|
+
"""Verify an output's provenance signature.
|
|
121
|
+
|
|
122
|
+
Re-computes the content hash from the non-provenance fields and
|
|
123
|
+
compares it against the hash stored in the ``_qualixar`` block.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
output_data: A dictionary previously signed with :meth:`sign`.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
``True`` if the content hash matches, ``False`` otherwise.
|
|
130
|
+
"""
|
|
131
|
+
prov = output_data.get("_qualixar", {})
|
|
132
|
+
if not prov:
|
|
133
|
+
return False
|
|
134
|
+
content = {
|
|
135
|
+
k: v for k, v in output_data.items() if k != "_qualixar"
|
|
136
|
+
}
|
|
137
|
+
canonical = json.dumps(content, sort_keys=True, default=str)
|
|
138
|
+
expected_hash = hashlib.sha256(canonical.encode()).hexdigest()
|
|
139
|
+
return prov.get("content_hash") == expected_hash
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
+
# Part of Qualixar — Advancing Agent Development Through Research
|
|
5
|
+
"""
|
|
6
|
+
Qualixar Watermark — Steganographic attribution for text outputs.
|
|
7
|
+
|
|
8
|
+
Embeds invisible zero-width Unicode characters in text to encode a tool
|
|
9
|
+
identifier. The watermark is invisible to human readers but can be
|
|
10
|
+
extracted programmatically to verify provenance.
|
|
11
|
+
|
|
12
|
+
Part of the 3-layer Qualixar attribution system:
|
|
13
|
+
Layer 1: Visible attribution (ATTRIBUTION.md, get_attribution())
|
|
14
|
+
Layer 2: Cryptographic signing (qualixar_attribution.py)
|
|
15
|
+
Layer 3: Steganographic watermarking (this module)
|
|
16
|
+
|
|
17
|
+
No external dependencies required.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
# Zero-width characters for binary encoding
|
|
21
|
+
ZW_SPACE = '\u200b' # Zero-width space = bit 0
|
|
22
|
+
ZW_JOINER = '\u200d' # Zero-width joiner = bit 1
|
|
23
|
+
ZW_SEP = '\ufeff' # Byte order mark = separator
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def encode_watermark(text: str, tool_id: str) -> str:
|
|
27
|
+
"""Embed an invisible watermark in text output.
|
|
28
|
+
|
|
29
|
+
Converts ``tool_id`` to binary and encodes each bit as a zero-width
|
|
30
|
+
Unicode character. The watermark is inserted after the first paragraph
|
|
31
|
+
break (``\\n\\n``) so it remains invisible to human readers.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
text: The text to watermark.
|
|
35
|
+
tool_id: Short identifier to embed (e.g. ``"slm"``).
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
The original text with the invisible watermark inserted.
|
|
39
|
+
"""
|
|
40
|
+
binary = ''.join(format(ord(c), '08b') for c in tool_id)
|
|
41
|
+
watermark = ZW_SEP
|
|
42
|
+
for bit in binary:
|
|
43
|
+
watermark += ZW_SPACE if bit == '0' else ZW_JOINER
|
|
44
|
+
watermark += ZW_SEP
|
|
45
|
+
|
|
46
|
+
# Insert after first paragraph break (invisible to users)
|
|
47
|
+
if '\n\n' in text:
|
|
48
|
+
idx = text.index('\n\n') + 2
|
|
49
|
+
return text[:idx] + watermark + text[idx:]
|
|
50
|
+
return text + watermark
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def decode_watermark(text: str) -> str:
|
|
54
|
+
"""Extract a hidden watermark from text.
|
|
55
|
+
|
|
56
|
+
Locates the zero-width separator characters and decodes the binary
|
|
57
|
+
payload between them back into the original tool identifier string.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
text: Text that may contain a watermark.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
The decoded tool identifier, or an empty string if no watermark
|
|
64
|
+
is found.
|
|
65
|
+
"""
|
|
66
|
+
start = text.find(ZW_SEP)
|
|
67
|
+
if start == -1:
|
|
68
|
+
return ""
|
|
69
|
+
end = text.find(ZW_SEP, start + 1)
|
|
70
|
+
if end == -1:
|
|
71
|
+
return ""
|
|
72
|
+
encoded = text[start + 1:end]
|
|
73
|
+
binary = ''.join(
|
|
74
|
+
'0' if c == ZW_SPACE else '1'
|
|
75
|
+
for c in encoded
|
|
76
|
+
)
|
|
77
|
+
chars = [binary[i:i + 8] for i in range(0, len(binary), 8)]
|
|
78
|
+
return ''.join(chr(int(b, 2)) for b in chars if len(b) == 8)
|
package/src/setup_validator.py
CHANGED
|
@@ -425,9 +425,9 @@ def validate_setup(auto_fix: bool = False) -> bool:
|
|
|
425
425
|
print("\n✓ All required checks passed!")
|
|
426
426
|
print("\nQuick Start Commands:")
|
|
427
427
|
print(" 1. Add a memory:")
|
|
428
|
-
print(" superlocalmemoryv2
|
|
428
|
+
print(" superlocalmemoryv2-remember 'Your content here'")
|
|
429
429
|
print("\n 2. Search memories:")
|
|
430
|
-
print(" superlocalmemoryv2
|
|
430
|
+
print(" superlocalmemoryv2-recall 'search query'")
|
|
431
431
|
print("\n 3. Build knowledge graph (after adding 2+ memories):")
|
|
432
432
|
print(" python ~/.claude-memory/graph_engine.py build")
|
|
433
433
|
print("\n 4. Start UI server:")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|