squish-memory 0.9.3 → 1.0.1

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 (223) hide show
  1. package/.env.mcp.example +14 -11
  2. package/CHANGELOG.md +68 -0
  3. package/README.md +82 -9
  4. package/bin/squish-add.mjs +32 -0
  5. package/bin/squish-rm.mjs +21 -0
  6. package/config/plugin-manifest.json +152 -0
  7. package/config/plugin-manifest.schema.json +244 -0
  8. package/config/settings.json +51 -0
  9. package/dist/algorithms/{merge/analytics → analytics}/token-estimator.d.ts +1 -1
  10. package/dist/algorithms/analytics/token-estimator.d.ts.map +1 -0
  11. package/dist/algorithms/{merge/analytics → analytics}/token-estimator.js +3 -3
  12. package/dist/algorithms/analytics/token-estimator.js.map +1 -0
  13. package/dist/algorithms/detection/hash-filters.d.ts.map +1 -0
  14. package/dist/algorithms/detection/hash-filters.js.map +1 -0
  15. package/dist/algorithms/{merge/detection → detection}/semantic-ranker.d.ts +1 -1
  16. package/dist/algorithms/detection/semantic-ranker.d.ts.map +1 -0
  17. package/dist/algorithms/{merge/detection → detection}/semantic-ranker.js +1 -1
  18. package/dist/algorithms/detection/semantic-ranker.js.map +1 -0
  19. package/dist/algorithms/{merge/detection → detection}/two-stage-detector.d.ts +1 -1
  20. package/dist/algorithms/detection/two-stage-detector.d.ts.map +1 -0
  21. package/dist/algorithms/{merge/detection → detection}/two-stage-detector.js +4 -4
  22. package/dist/algorithms/detection/two-stage-detector.js.map +1 -0
  23. package/dist/algorithms/handlers/approve-merge.d.ts.map +1 -0
  24. package/dist/algorithms/{merge/handlers → handlers}/approve-merge.js +4 -4
  25. package/dist/algorithms/handlers/approve-merge.js.map +1 -0
  26. package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.d.ts +1 -1
  27. package/dist/algorithms/handlers/detect-duplicates.d.ts.map +1 -0
  28. package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.js +55 -75
  29. package/dist/algorithms/handlers/detect-duplicates.js.map +1 -0
  30. package/dist/algorithms/handlers/get-stats.d.ts.map +1 -0
  31. package/dist/algorithms/{merge/handlers → handlers}/get-stats.js +3 -3
  32. package/dist/algorithms/handlers/get-stats.js.map +1 -0
  33. package/dist/algorithms/handlers/list-proposals.d.ts.map +1 -0
  34. package/dist/algorithms/{merge/handlers → handlers}/list-proposals.js +3 -3
  35. package/dist/algorithms/handlers/list-proposals.js.map +1 -0
  36. package/dist/algorithms/handlers/preview-merge.d.ts.map +1 -0
  37. package/dist/algorithms/{merge/handlers → handlers}/preview-merge.js +3 -3
  38. package/dist/algorithms/handlers/preview-merge.js.map +1 -0
  39. package/dist/algorithms/handlers/reject-merge.d.ts.map +1 -0
  40. package/dist/algorithms/{merge/handlers → handlers}/reject-merge.js +3 -3
  41. package/dist/algorithms/handlers/reject-merge.js.map +1 -0
  42. package/dist/algorithms/handlers/reverse-merge.d.ts.map +1 -0
  43. package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.js +3 -3
  44. package/dist/algorithms/handlers/reverse-merge.js.map +1 -0
  45. package/dist/algorithms/{merge/safety → safety}/safety-checks.d.ts +1 -1
  46. package/dist/algorithms/safety/safety-checks.d.ts.map +1 -0
  47. package/dist/algorithms/safety/safety-checks.js +179 -0
  48. package/dist/algorithms/safety/safety-checks.js.map +1 -0
  49. package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.d.ts +1 -1
  50. package/dist/algorithms/strategies/merge-strategies.d.ts.map +1 -0
  51. package/dist/algorithms/strategies/merge-strategies.js.map +1 -0
  52. package/dist/algorithms/utils/response-builder.d.ts +28 -0
  53. package/dist/algorithms/utils/response-builder.d.ts.map +1 -0
  54. package/dist/algorithms/utils/response-builder.js +37 -0
  55. package/dist/algorithms/utils/response-builder.js.map +1 -0
  56. package/dist/api/web/web.d.ts.map +1 -1
  57. package/dist/api/web/web.js +452 -472
  58. package/dist/api/web/web.js.map +1 -1
  59. package/dist/commands/mcp-server.js +7 -3
  60. package/dist/commands/mcp-server.js.map +1 -1
  61. package/dist/config.d.ts +10 -10
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js +102 -55
  64. package/dist/config.js.map +1 -1
  65. package/dist/core/associations.js +2 -2
  66. package/dist/core/associations.js.map +1 -1
  67. package/dist/core/embeddings.d.ts +1 -1
  68. package/dist/core/embeddings.d.ts.map +1 -1
  69. package/dist/core/embeddings.js +10 -67
  70. package/dist/core/embeddings.js.map +1 -1
  71. package/dist/core/layers/generator.d.ts +25 -0
  72. package/dist/core/layers/generator.d.ts.map +1 -0
  73. package/dist/core/layers/generator.js +76 -0
  74. package/dist/core/layers/generator.js.map +1 -0
  75. package/dist/core/local-embeddings.d.ts +3 -11
  76. package/dist/core/local-embeddings.d.ts.map +1 -1
  77. package/dist/core/local-embeddings.js +2 -76
  78. package/dist/core/local-embeddings.js.map +1 -1
  79. package/dist/core/mcp/tools.d.ts.map +1 -1
  80. package/dist/core/mcp/tools.js +71 -0
  81. package/dist/core/mcp/tools.js.map +1 -1
  82. package/dist/core/memory/context-collector.d.ts.map +1 -1
  83. package/dist/core/memory/context-collector.js +3 -2
  84. package/dist/core/memory/context-collector.js.map +1 -1
  85. package/dist/core/memory/feedback-tracker.d.ts.map +1 -1
  86. package/dist/core/memory/feedback-tracker.js +10 -6
  87. package/dist/core/memory/feedback-tracker.js.map +1 -1
  88. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  89. package/dist/core/memory/hybrid-retrieval.js +49 -1
  90. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  91. package/dist/core/memory/hybrid-search.d.ts.map +1 -1
  92. package/dist/core/memory/hybrid-search.js +32 -39
  93. package/dist/core/memory/hybrid-search.js.map +1 -1
  94. package/dist/core/memory/memories.d.ts.map +1 -1
  95. package/dist/core/memory/memories.js +1 -7
  96. package/dist/core/memory/memories.js.map +1 -1
  97. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -1
  98. package/dist/core/memory/progressive-disclosure.js.map +1 -1
  99. package/dist/core/memory/query-rewriter.js +9 -9
  100. package/dist/core/memory/stats.js +5 -5
  101. package/dist/core/namespaces/index.d.ts +71 -0
  102. package/dist/core/namespaces/index.d.ts.map +1 -0
  103. package/dist/core/namespaces/index.js +305 -0
  104. package/dist/core/namespaces/index.js.map +1 -0
  105. package/dist/core/namespaces/uri-parser.d.ts +31 -0
  106. package/dist/core/namespaces/uri-parser.d.ts.map +1 -0
  107. package/dist/core/namespaces/uri-parser.js +74 -0
  108. package/dist/core/namespaces/uri-parser.js.map +1 -0
  109. package/dist/core/observations.d.ts.map +1 -1
  110. package/dist/core/observations.js +3 -12
  111. package/dist/core/observations.js.map +1 -1
  112. package/dist/core/projects.d.ts.map +1 -1
  113. package/dist/core/projects.js +0 -12
  114. package/dist/core/projects.js.map +1 -1
  115. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -1
  116. package/dist/core/scheduler/cron-scheduler.js +26 -7
  117. package/dist/core/scheduler/cron-scheduler.js.map +1 -1
  118. package/dist/core/scheduler/job-runner.js +8 -5
  119. package/dist/core/scheduler/job-runner.js.map +1 -1
  120. package/dist/core/search/conversations.js +33 -33
  121. package/dist/core/session-hooks/self-iteration-job.d.ts +20 -0
  122. package/dist/core/session-hooks/self-iteration-job.d.ts.map +1 -0
  123. package/dist/core/session-hooks/self-iteration-job.js +282 -0
  124. package/dist/core/session-hooks/self-iteration-job.js.map +1 -0
  125. package/dist/core/session-hooks/session-hooks.d.ts +18 -0
  126. package/dist/core/session-hooks/session-hooks.d.ts.map +1 -0
  127. package/dist/core/session-hooks/session-hooks.js +58 -0
  128. package/dist/core/session-hooks/session-hooks.js.map +1 -0
  129. package/dist/core/tracing/collector.d.ts +111 -0
  130. package/dist/core/tracing/collector.d.ts.map +1 -0
  131. package/dist/core/tracing/collector.js +350 -0
  132. package/dist/core/tracing/collector.js.map +1 -0
  133. package/dist/core/tracing/visualizer.d.ts +32 -0
  134. package/dist/core/tracing/visualizer.d.ts.map +1 -0
  135. package/dist/core/tracing/visualizer.js +165 -0
  136. package/dist/core/tracing/visualizer.js.map +1 -0
  137. package/dist/db/adapter.d.ts +6 -1
  138. package/dist/db/adapter.d.ts.map +1 -1
  139. package/dist/db/adapter.js +54 -126
  140. package/dist/db/adapter.js.map +1 -1
  141. package/dist/db/bootstrap.js +477 -477
  142. package/dist/db/index.d.ts +5 -1
  143. package/dist/db/index.d.ts.map +1 -1
  144. package/dist/drizzle/schema-sqlite.d.ts +384 -0
  145. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  146. package/dist/drizzle/schema-sqlite.js +65 -0
  147. package/dist/drizzle/schema-sqlite.js.map +1 -1
  148. package/dist/drizzle/schema.d.ts +368 -0
  149. package/dist/drizzle/schema.d.ts.map +1 -1
  150. package/dist/drizzle/schema.js +63 -0
  151. package/dist/drizzle/schema.js.map +1 -1
  152. package/dist/index.d.ts +4 -4
  153. package/dist/index.js +101 -62
  154. package/dist/index.js.map +1 -1
  155. package/generated/mcp/manifest.json +23 -0
  156. package/generated/mcp/mcp-servers.json +25 -0
  157. package/generated/mcp/mcporter.json +34 -0
  158. package/generated/mcp/openclaw-memory-qmd.json +17 -0
  159. package/generated/mcp/runtime.json +12 -0
  160. package/package.json +70 -28
  161. package/packages/plugin-claude-code/README.md +73 -0
  162. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +35 -0
  163. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts.map +1 -0
  164. package/packages/plugin-claude-code/dist/plugin-wrapper.js +191 -0
  165. package/packages/plugin-claude-code/dist/plugin-wrapper.js.map +1 -0
  166. package/packages/plugin-claude-code/package.json +31 -0
  167. package/packages/plugin-openclaw/README.md +70 -0
  168. package/packages/plugin-openclaw/dist/index.d.ts +49 -0
  169. package/packages/plugin-openclaw/dist/index.d.ts.map +1 -0
  170. package/packages/plugin-openclaw/dist/index.js +262 -0
  171. package/packages/plugin-openclaw/dist/index.js.map +1 -0
  172. package/packages/plugin-openclaw/openclaw.plugin.json +94 -0
  173. package/packages/plugin-openclaw/package.json +31 -0
  174. package/packages/plugin-opencode/install.mjs +217 -0
  175. package/packages/plugin-opencode/package.json +21 -0
  176. package/scripts/dependency-manager.mjs +217 -0
  177. package/scripts/detect-clients.mjs +78 -0
  178. package/scripts/install-interactive.mjs +674 -0
  179. package/scripts/install-plugin.mjs +415 -0
  180. package/scripts/test-interactive.mjs +131 -0
  181. package/commands/managed-sync.ts +0 -69
  182. package/commands/mcp-server.ts +0 -519
  183. package/dist/algorithms/merge/analytics/token-estimator.d.ts.map +0 -1
  184. package/dist/algorithms/merge/analytics/token-estimator.js.map +0 -1
  185. package/dist/algorithms/merge/detection/hash-filters.d.ts.map +0 -1
  186. package/dist/algorithms/merge/detection/hash-filters.js.map +0 -1
  187. package/dist/algorithms/merge/detection/semantic-ranker.d.ts.map +0 -1
  188. package/dist/algorithms/merge/detection/semantic-ranker.js.map +0 -1
  189. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +0 -1
  190. package/dist/algorithms/merge/detection/two-stage-detector.js.map +0 -1
  191. package/dist/algorithms/merge/handlers/approve-merge.d.ts.map +0 -1
  192. package/dist/algorithms/merge/handlers/approve-merge.js.map +0 -1
  193. package/dist/algorithms/merge/handlers/detect-duplicates.d.ts.map +0 -1
  194. package/dist/algorithms/merge/handlers/detect-duplicates.js.map +0 -1
  195. package/dist/algorithms/merge/handlers/get-stats.d.ts.map +0 -1
  196. package/dist/algorithms/merge/handlers/get-stats.js.map +0 -1
  197. package/dist/algorithms/merge/handlers/list-proposals.d.ts.map +0 -1
  198. package/dist/algorithms/merge/handlers/list-proposals.js.map +0 -1
  199. package/dist/algorithms/merge/handlers/preview-merge.d.ts.map +0 -1
  200. package/dist/algorithms/merge/handlers/preview-merge.js.map +0 -1
  201. package/dist/algorithms/merge/handlers/reject-merge.d.ts.map +0 -1
  202. package/dist/algorithms/merge/handlers/reject-merge.js.map +0 -1
  203. package/dist/algorithms/merge/handlers/reverse-merge.d.ts.map +0 -1
  204. package/dist/algorithms/merge/handlers/reverse-merge.js.map +0 -1
  205. package/dist/algorithms/merge/safety/safety-checks.d.ts.map +0 -1
  206. package/dist/algorithms/merge/safety/safety-checks.js +0 -215
  207. package/dist/algorithms/merge/safety/safety-checks.js.map +0 -1
  208. package/dist/algorithms/merge/strategies/merge-strategies.d.ts.map +0 -1
  209. package/dist/algorithms/merge/strategies/merge-strategies.js.map +0 -1
  210. package/dist/core/embeddings/qmd-provider.d.ts +0 -65
  211. package/dist/core/embeddings/qmd-provider.d.ts.map +0 -1
  212. package/dist/core/embeddings/qmd-provider.js +0 -133
  213. package/dist/core/embeddings/qmd-provider.js.map +0 -1
  214. package/scripts/init-dirs.ts +0 -15
  215. /package/dist/algorithms/{merge/detection → detection}/hash-filters.d.ts +0 -0
  216. /package/dist/algorithms/{merge/detection → detection}/hash-filters.js +0 -0
  217. /package/dist/algorithms/{merge/handlers → handlers}/approve-merge.d.ts +0 -0
  218. /package/dist/algorithms/{merge/handlers → handlers}/get-stats.d.ts +0 -0
  219. /package/dist/algorithms/{merge/handlers → handlers}/list-proposals.d.ts +0 -0
  220. /package/dist/algorithms/{merge/handlers → handlers}/preview-merge.d.ts +0 -0
  221. /package/dist/algorithms/{merge/handlers → handlers}/reject-merge.d.ts +0 -0
  222. /package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.d.ts +0 -0
  223. /package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.js +0 -0
package/.env.mcp.example CHANGED
@@ -2,26 +2,29 @@
2
2
  SQUISH_MCP_PORT=8767
3
3
  SQUISH_MCP_SERVER_ENABLED=true
4
4
 
5
- # Embeddings - Hybrid mode for best quality
6
- SQUISH_EMBEDDINGS_PROVIDER=hybrid
7
- SQUISH_MULTIMODAL_EMBEDDINGS_ENABLED=true
5
+ # Embeddings Provider: local | openai | ollama | google | none | auto
6
+ # Default: local (TF-IDF, no API needed)
7
+ SQUISH_EMBEDDINGS_PROVIDER=local
8
8
 
9
- # Google Cloud Multimodal (1408-dim vectors)
9
+ # Model Selection (optional - uses defaults if not set)
10
+ # SQUISH_OPENAI_EMBEDDING_MODEL=text-embedding-3-small
11
+ # SQUISH_GOOGLE_EMBEDDING_MODEL=gemini-embedding-001
12
+ # SQUISH_OLLAMA_EMBEDDING_MODEL=nomic-embed-text:v1.5
13
+
14
+ # Google Cloud (for google provider)
10
15
  # Get API key from: https://console.cloud.google.com/apis/credentials
11
- GOOGLE_CLOUD_PROJECT=your-project-id
12
- GOOGLE_CLOUD_LOCATION=us-central1
16
+ # GOOGLE_CLOUD_PROJECT=your-project-id
17
+ # GOOGLE_CLOUD_LOCATION=us-central1
13
18
  # GOOGLE_CLOUD_API_KEY=your-api-key
14
19
  # Or use service account:
15
20
  # GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
16
21
 
17
- # OpenAI Embeddings (optional, 1536-dim)
22
+ # OpenAI (for openai provider or auto mode)
18
23
  # SQUISH_OPENAI_API_KEY=sk-...
19
24
  # SQUISH_OPENAI_API_URL=https://api.openai.com/v1/embeddings
20
- # SQUISH_OPENAI_EMBEDDING_MODEL=text-embedding-3-small
21
25
 
22
- # Ollama Embeddings (optional, model-dependent dims)
26
+ # Ollama (for ollama provider or auto mode)
23
27
  # SQUISH_OLLAMA_URL=http://localhost:11434
24
- # SQUISH_OLLAMA_EMBEDDING_MODEL=nomic-embed-text:v1.5
25
28
 
26
29
  # Embedding performance & reliability
27
30
  SQUISH_EMBEDDINGS_TIMEOUT_MS=30000
@@ -30,7 +33,7 @@ SQUISH_EMBEDDINGS_RETRY_DELAY_MS=1000
30
33
  # Per-provider overrides (optional)
31
34
  # SQUISH_OPENAI_TIMEOUT_MS=30000
32
35
  # SQUISH_OLLAMA_TIMEOUT_MS=30000
33
- # SQUISH_GOOGLE_MULTIMODAL_TIMEOUT_MS=30000
36
+ # SQUISH_GOOGLE_TIMEOUT_MS=30000
34
37
 
35
38
  # QMD for local markdown search
36
39
  SQUISH_QMD_ENABLED=true
package/CHANGELOG.md CHANGED
@@ -2,6 +2,74 @@
2
2
 
3
3
  All notable changes to Squish will be documented in this file.
4
4
 
5
+ ## [1.0.0] - 2026-03-17
6
+
7
+ ### 🚀 Major Release - Universal Plugin Architecture
8
+
9
+ #### Added - Interactive Multi-Step Wizard Installer
10
+ - **Beautiful CLI Wizard** with 5-step installation flow using `@clack/prompts`
11
+ - Step 1: Component Selection (CLI, MCP Server, AI Agent Plugins)
12
+ - Step 2: Plugin Selection (Claude Code, OpenClaw, Cursor, etc.)
13
+ - Step 3: Configuration (Local/Remote mode, Embeddings provider)
14
+ - Step 4: Review Summary with visual confirmation
15
+ - Step 5: Automated installation with progress spinners
16
+ - **Quick Install Mode**: `bun run install:interactive --quick` for CLI + all plugins
17
+ - **Dry-run support**: Preview installations without making changes
18
+ - **Configuration persistence**: Saves settings to `~/.squish/config.json`
19
+
20
+ #### Added - Universal Plugin Architecture
21
+ - **Multi-client support**: Works with Claude Code, OpenClaw, OpenCode, Codex, Cursor, VS Code, Windsurf
22
+ - **Plugin types**: Hooks (Claude Code), Plugin-slot (OpenClaw), MCP (all others)
23
+ - **Auto-detection**: Detects which AI agents are already installed
24
+ - **Source indicators**: Shows which plugins have source code available (📦)
25
+
26
+ #### Added - Core Infrastructure
27
+ - **Search Tracing System**: Debug and performance analysis for searches
28
+ - `core/tracing/collector.ts` - Collects search traces
29
+ - `core/tracing/visualizer.ts` - Visualizes trace data
30
+ - New MCP tools: `squish_get_search_traces`, `squish_get_trace_by_id`
31
+ - **Namespace Support**: Hierarchical memory organization
32
+ - `core/namespaces/index.ts` - Namespace management
33
+ - `core/namespaces/uri-parser.ts` - URI parsing for namespaces
34
+ - **Memory Layers (L0/L1/L2)**: Token-efficient retrieval
35
+ - `core/layers/generator.ts` - Generates memory layers
36
+ - **Self-Iteration Job**: Conversation memory extraction
37
+ - `core/session-hooks/self-iteration-job.ts` - Extracts memories from conversations
38
+ - `core/session-hooks/session-hooks.ts` - Session lifecycle hooks
39
+ - **Database Schema Updates**:
40
+ - Added `namespaces` table
41
+ - Added `memory_layers` table
42
+ - Added `search_traces` table
43
+
44
+ #### Fixed - Dependencies
45
+ - **qmd package**: Fixed from non-existent `qmd@0.15.1` to `@tobilu/qmd@2.0.1`
46
+ - **mcporter version**: Updated from `1.2.0` to `0.7.3` (matches installed version)
47
+ - **Scoped package support**: Dependency manager now handles `@scope/package` names
48
+ - **Binary detection**: Properly maps scoped packages to their binary names
49
+
50
+ #### Changed - Code Organization
51
+ - **Refactored CLI**: Improved imports and removed duplicates in `index.ts`
52
+ - **Safety Checks**: Better helper functions for algorithm validation
53
+ - **Response Builder**: Unified response builder for algorithm handlers
54
+ - **Config Validation**: Fixed provider validation logic
55
+ - **Association SQL**: Fixed placeholder issues in SQL queries
56
+ - **Directory Reorganization**: Renamed `core/sessions/` to `core/session-hooks/` for clarity
57
+ - Session lifecycle hooks now in dedicated directory
58
+ - Separates session auto-load (`core/session/`) from hooks/jobs (`core/session-hooks/`)
59
+
60
+ #### Documentation
61
+ - **Interactive Installer Guide**: Complete docs for wizard usage
62
+ - **Plugin Architecture**: Documentation for universal plugin system
63
+ - **Installation Guide**: Quick-start for all supported AI agents
64
+
65
+ ### Breaking Changes
66
+ None - fully backward compatible with 0.9.x
67
+
68
+ ### Migration Notes
69
+ - Run `bun run install:interactive` to use the new wizard
70
+ - Existing installations continue to work without changes
71
+ - Configuration automatically migrated on first run
72
+
5
73
  ## [0.9.3] - 2026-03-14
6
74
 
7
75
  ### Added - Core Memory & Embeddings Improvements (v0.9.2+)
package/README.md CHANGED
@@ -73,14 +73,26 @@ Agent Action -----> [Squish Memory Layer]
73
73
 
74
74
  ## Quick Start
75
75
 
76
- ### For Claude Code (Plugin)
76
+ ### Universal Plugin Installer (Recommended)
77
+ ```bash
78
+ # Install for your AI assistant(s)
79
+ npx squish-memory install-plugin --client=claude-code # Claude Code
80
+ npx squish-memory install-plugin --client=openclaw # OpenClaw
81
+ npx squish-memory install-plugin --client=opencode # OpenCode
82
+ npx squish-memory install-plugin --client=all # All supported clients
83
+
84
+ # Verify installation
85
+ npx squish-memory install-plugin --client=claude-code --verify
86
+ ```
87
+
88
+ ### For Claude Code (Plugin) - Legacy Method
77
89
  ```bash
78
90
  # Install from marketplace
79
91
  /plugin marketplace add https://github.com/michielhdoteth/squish.git
80
92
  /plugin install squish@michielhdoteth-squish
81
93
  ```
82
94
 
83
- ### For OpenClaw (npm)
95
+ ### For OpenClaw (npm) - Legacy Method
84
96
  ```bash
85
97
  npm install -g squish-memory
86
98
  ```
@@ -128,6 +140,50 @@ curl "http://localhost:3000/api/memories/search?q=TypeScript"
128
140
  - **Transport Agnostic**: MCP (stdio/SSE), CLI, or HTTP/WebSocket - choose your preference
129
141
  - **Storage Flexible**: SQLite for local, PostgreSQL for team deployments
130
142
 
143
+ ## Universal Plugin Architecture
144
+
145
+ Squish now provides a **universal plugin system** that works as a plugin across all major AI assistant frameworks through a single manifest-driven installer.
146
+
147
+ ### How It Works
148
+ 1. Single `plugin-manifest.json` defines the plugin for all clients
149
+ 2. `npx squish-memory install-plugin --client=<target>` handles installation
150
+ 3. Auto-installs dependencies (mcporter, qmd) with pinned versions
151
+ 4. Generates client-specific configurations automatically
152
+ 5. Provides unified verification and troubleshooting
153
+
154
+ ### Supported Clients
155
+ | Client | Installation Method | Status |
156
+ |--------|-------------------|---------|
157
+ | Claude Code | Plugin hooks (.claude-plugin/) | ✅ Stable |
158
+ | OpenClaw | Memory slot via MCP bridge | ✅ Stable |
159
+ | OpenCode | MCP server config | ✅ Stable |
160
+ | Codex | MCP server config | ✅ Stable |
161
+ | Cursor | MCP server config | ✅ Beta |
162
+ | VS Code | MCP server config | ✅ Beta |
163
+ | Windsurf | MCP server config | ✅ Beta |
164
+
165
+ ### Quick Installation Examples
166
+ ```bash
167
+ # Install for Claude Code (recommended for Claude users)
168
+ npx squish-memory install-plugin --client=claude-code --verify
169
+
170
+ # Install for OpenClaw (recommended for OpenClaw users)
171
+ npx squish-memory install-plugin --client=openclaw --verify
172
+
173
+ # Install for all supported clients
174
+ npx squish-memory install-plugin --client=all --verify
175
+
176
+ # Install for multiple specific clients
177
+ npx squish-memory install-plugin --client=claude-code,openclaw,opencode --verify
178
+ ```
179
+
180
+ ### Benefits
181
+ - **One manifest to rule them all**: Single source of truth
182
+ - **Zero manual configuration**: Automatic dependency installation
183
+ - **Version pinned dependencies**: Stable, reproducible builds
184
+ - **Unified verification**: One command to check all clients
185
+ - **Backward compatible**: Existing integrations still work
186
+
131
187
  ## Universal API
132
188
 
133
189
  Squish now provides a universal HTTP API that works with any AI agent:
@@ -185,18 +241,35 @@ REDIS_URL=redis://localhost:6379 # Optional for caching
185
241
  PORT=3000 # API server port
186
242
  ```
187
243
 
188
- **Optional:**
244
+ **Configuration File (config/settings.json):**
245
+ ```json
246
+ {
247
+ "embeddings": {
248
+ "provider": "local",
249
+ "models": {
250
+ "openai": { "model": "text-embedding-3-small" },
251
+ "google": { "model": "gemini-embedding-001" },
252
+ "ollama": { "model": "nomic-embed-text:v1.5" }
253
+ }
254
+ }
255
+ }
256
+ ```
257
+
258
+ **Environment Variables (override settings.json):**
189
259
  ```bash
190
260
  SQUISH_DATA_DIR=./.squish # Custom data directory
191
- SQUISH_EMBEDDINGS_PROVIDER=local # local, openai, ollama, google-multimodal, hybrid
261
+ SQUISH_EMBEDDINGS_PROVIDER=local # local, openai, ollama, google, none, auto
192
262
 
193
- # For better embeddings (optional)
194
- SQUISH_OPENAI_API_KEY=sk-...
263
+ # Model selection (optional, uses defaults if not set)
195
264
  SQUISH_OPENAI_EMBEDDING_MODEL=text-embedding-3-small
196
- SQUISH_OLLAMA_URL=http://localhost:11434
265
+ SQUISH_GOOGLE_EMBEDDING_MODEL=gemini-embedding-001
197
266
  SQUISH_OLLAMA_EMBEDDING_MODEL=nomic-embed-text:v1.5
198
- SQUISH_GOOGLE_CLOUD_PROJECT=your-project
199
- SQUISH_GOOGLE_CLOUD_API_KEY=your-key
267
+
268
+ # API credentials (for cloud providers)
269
+ SQUISH_OPENAI_API_KEY=sk-...
270
+ SQUISH_OLLAMA_URL=http://localhost:11434
271
+ GOOGLE_CLOUD_PROJECT=your-project
272
+ GOOGLE_CLOUD_API_KEY=your-key
200
273
 
201
274
  # Embedding performance & reliability
202
275
  SQUISH_EMBEDDINGS_TIMEOUT_MS=30000
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ // Wrapper for squish commands - launches interactive mode when no args
3
+ import { spawn } from 'child_process';
4
+ import { fileURLToPath } from 'url';
5
+ import { dirname, join } from 'path';
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+
10
+ const args = process.argv.slice(2);
11
+
12
+ // If no args, launch interactive installer
13
+ if (args.length === 0) {
14
+ const interactivePath = join(__dirname, '..', 'scripts', 'install-interactive.mjs');
15
+ const child = spawn('node', [interactivePath], {
16
+ stdio: 'inherit',
17
+ shell: false
18
+ });
19
+ child.on('exit', (code) => {
20
+ process.exit(code ?? 0);
21
+ });
22
+ } else {
23
+ // Pass through to install-plugin.mjs
24
+ const scriptPath = join(__dirname, '..', 'scripts', 'install-plugin.mjs');
25
+ const child = spawn('node', [scriptPath, ...args], {
26
+ stdio: 'inherit',
27
+ shell: false
28
+ });
29
+ child.on('exit', (code) => {
30
+ process.exit(code ?? 0);
31
+ });
32
+ }
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ // Wrapper for squish remove command
3
+ import { spawn } from 'child_process';
4
+ import { fileURLToPath } from 'url';
5
+ import { dirname, join } from 'path';
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+
10
+ const args = process.argv.slice(2);
11
+ const scriptPath = join(__dirname, 'scripts', 'install-plugin.mjs');
12
+
13
+ // Add --uninstall flag
14
+ const child = spawn('node', [scriptPath, '--uninstall', ...args], {
15
+ stdio: 'inherit',
16
+ shell: false
17
+ });
18
+
19
+ child.on('exit', (code) => {
20
+ process.exit(code ?? 0);
21
+ });
@@ -0,0 +1,152 @@
1
+ {
2
+ "id": "squish-memory",
3
+ "name": "Squish Memory",
4
+ "version": "1.0.0",
5
+ "description": "Universal two-tier memory system for AI agents with hybrid search, core memory, and MCP-first architecture",
6
+ "capabilities": ["mcp", "cli", "web"],
7
+ "targets": {
8
+ "claude-code": {
9
+ "type": "hooks",
10
+ "hooks": ["SessionStart", "UserPromptSubmit", "PostToolUse", "SessionEnd"],
11
+ "install": {
12
+ "copy": [
13
+ { "from": ".claude-plugin/plugin.json", "to": "~/.claude/plugin.json" }
14
+ ]
15
+ },
16
+ "verify": {
17
+ "fileExists": "~/.claude/plugin.json",
18
+ "toolCheck": "squish_health"
19
+ }
20
+ },
21
+ "openclaw": {
22
+ "type": "plugin-slot",
23
+ "slot": "memory",
24
+ "tools": ["memory_search", "memory_get"],
25
+ "install": {
26
+ "command": "node scripts/openclaw-bootstrap.mjs --skip-tool-check"
27
+ },
28
+ "verify": {
29
+ "fileExists": "~/.openclaw/openclaw-memory.json",
30
+ "toolCheck": "memory_search"
31
+ }
32
+ },
33
+ "opencode": {
34
+ "type": "mcp",
35
+ "tools": ["squish_remember", "squish_search", "squish_recall", "squish_context", "squish_health"],
36
+ "install": {
37
+ "copy": [
38
+ { "from": "generated/mcp/mcp-servers.json", "to": "~/.config/opencode/mcp-servers.json" }
39
+ ]
40
+ },
41
+ "verify": {
42
+ "fileExists": "~/.config/opencode/mcp-servers.json",
43
+ "toolCheck": "squish_health"
44
+ }
45
+ },
46
+ "codex": {
47
+ "type": "mcp",
48
+ "tools": ["squish_remember", "squish_search", "squish_recall", "squish_context", "squish_health"],
49
+ "install": {
50
+ "copy": [
51
+ { "from": "generated/mcp/mcp-servers.json", "to": "~/.codex/mcp-servers.json" }
52
+ ]
53
+ },
54
+ "verify": {
55
+ "fileExists": "~/.codex/mcp-servers.json",
56
+ "toolCheck": "squish_health"
57
+ }
58
+ },
59
+ "cursor": {
60
+ "type": "mcp",
61
+ "tools": ["squish_remember", "squish_search", "squish_recall", "squish_context", "squish_health"],
62
+ "install": {
63
+ "copy": [
64
+ { "from": "generated/mcp/mcp-servers.json", "to": "~/.cursor/mcp.json" }
65
+ ]
66
+ },
67
+ "verify": {
68
+ "fileExists": "~/.cursor/mcp.json",
69
+ "toolCheck": "squish_health"
70
+ }
71
+ },
72
+ "vscode": {
73
+ "type": "mcp",
74
+ "tools": ["squish_remember", "squish_search", "squish_recall", "squish_context", "squish_health"],
75
+ "install": {
76
+ "copy": [
77
+ { "from": "generated/mcp/mcp-servers.json", "to": "~/.vscode/mcp/servers.json" }
78
+ ]
79
+ },
80
+ "verify": {
81
+ "fileExists": "~/.vscode/mcp/servers.json",
82
+ "toolCheck": "squish_health"
83
+ }
84
+ },
85
+ "windsurf": {
86
+ "type": "mcp",
87
+ "tools": ["squish_remember", "squish_search", "squish_recall", "squish_context", "squish_health"],
88
+ "install": {
89
+ "copy": [
90
+ { "from": "generated/mcp/mcp-servers.json", "to": "~/.windsurf/mcp-servers.json" }
91
+ ]
92
+ },
93
+ "verify": {
94
+ "fileExists": "~/.windsurf/mcp-servers.json",
95
+ "toolCheck": "squish_health"
96
+ }
97
+ }
98
+ },
99
+ "dependencies": {
100
+ "mcporter": {
101
+ "version": "0.7.3",
102
+ "autoInstall": true,
103
+ "optional": false,
104
+ "provides": ["mcp-bridge", "openclaw-memory"]
105
+ },
106
+ "@tobilu/qmd": {
107
+ "version": "2.0.1",
108
+ "autoInstall": true,
109
+ "optional": false,
110
+ "provides": ["fast-search", "bm25", "vector-search"]
111
+ }
112
+ },
113
+ "auth": {
114
+ "modes": ["none", "token"],
115
+ "default": "none",
116
+ "token": {
117
+ "envVar": "SQUISH_REMOTE_TOKEN",
118
+ "help": "Set SQUISH_REMOTE_TOKEN for remote mode authentication"
119
+ }
120
+ },
121
+ "pinning": {
122
+ "mcporter": "0.7.3",
123
+ "@tobilu/qmd": "2.0.1",
124
+ "@modelcontextprotocol/sdk": "1.27.1"
125
+ },
126
+ "entry": {
127
+ "mcp": "dist/commands/mcp-server.cjs",
128
+ "cli": "dist/index.js",
129
+ "plugin": "packages/plugin-openclaw/dist/index.js"
130
+ },
131
+ "compatibility": {
132
+ "minNodeVersion": "18.0.0",
133
+ "clients": [
134
+ { "id": "claude-code", "minVersion": "0.62.0" },
135
+ { "id": "openclaw", "minVersion": "2026.2.15" },
136
+ { "id": "opencode", "minVersion": "0.1.0" },
137
+ { "id": "codex", "minVersion": "0.1.0" },
138
+ { "id": "cursor", "minVersion": "0.45.0" },
139
+ { "id": "vscode-mcp", "minVersion": "1.0.0" },
140
+ { "id": "windsurf", "minVersion": "0.1.0" }
141
+ ]
142
+ },
143
+ "healthCheck": {
144
+ "mcpTool": "squish_health",
145
+ "httpEndpoint": "/health"
146
+ },
147
+ "generated": {
148
+ "from": "config/plugin-manifest.json",
149
+ "generator": "squish-memory@1.0.0",
150
+ "timestamp": "2026-01-17T00:00:00.000Z"
151
+ }
152
+ }