squish-memory 0.9.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +58 -2
  3. package/config/plugin-manifest.json +152 -0
  4. package/config/plugin-manifest.schema.json +244 -0
  5. package/dist/algorithms/{merge/analytics → analytics}/token-estimator.d.ts +1 -1
  6. package/dist/algorithms/analytics/token-estimator.d.ts.map +1 -0
  7. package/dist/algorithms/{merge/analytics → analytics}/token-estimator.js +3 -3
  8. package/dist/algorithms/analytics/token-estimator.js.map +1 -0
  9. package/dist/algorithms/detection/hash-filters.d.ts.map +1 -0
  10. package/dist/algorithms/detection/hash-filters.js.map +1 -0
  11. package/dist/algorithms/{merge/detection → detection}/semantic-ranker.d.ts +1 -1
  12. package/dist/algorithms/detection/semantic-ranker.d.ts.map +1 -0
  13. package/dist/algorithms/{merge/detection → detection}/semantic-ranker.js +1 -1
  14. package/dist/algorithms/detection/semantic-ranker.js.map +1 -0
  15. package/dist/algorithms/{merge/detection → detection}/two-stage-detector.d.ts +1 -1
  16. package/dist/algorithms/detection/two-stage-detector.d.ts.map +1 -0
  17. package/dist/algorithms/{merge/detection → detection}/two-stage-detector.js +4 -4
  18. package/dist/algorithms/detection/two-stage-detector.js.map +1 -0
  19. package/dist/algorithms/handlers/approve-merge.d.ts.map +1 -0
  20. package/dist/algorithms/{merge/handlers → handlers}/approve-merge.js +4 -4
  21. package/dist/algorithms/handlers/approve-merge.js.map +1 -0
  22. package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.d.ts +1 -1
  23. package/dist/algorithms/handlers/detect-duplicates.d.ts.map +1 -0
  24. package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.js +55 -75
  25. package/dist/algorithms/handlers/detect-duplicates.js.map +1 -0
  26. package/dist/algorithms/handlers/get-stats.d.ts.map +1 -0
  27. package/dist/algorithms/{merge/handlers → handlers}/get-stats.js +3 -3
  28. package/dist/algorithms/handlers/get-stats.js.map +1 -0
  29. package/dist/algorithms/handlers/list-proposals.d.ts.map +1 -0
  30. package/dist/algorithms/{merge/handlers → handlers}/list-proposals.js +3 -3
  31. package/dist/algorithms/handlers/list-proposals.js.map +1 -0
  32. package/dist/algorithms/handlers/preview-merge.d.ts.map +1 -0
  33. package/dist/algorithms/{merge/handlers → handlers}/preview-merge.js +3 -3
  34. package/dist/algorithms/handlers/preview-merge.js.map +1 -0
  35. package/dist/algorithms/handlers/reject-merge.d.ts.map +1 -0
  36. package/dist/algorithms/{merge/handlers → handlers}/reject-merge.js +3 -3
  37. package/dist/algorithms/handlers/reject-merge.js.map +1 -0
  38. package/dist/algorithms/handlers/reverse-merge.d.ts.map +1 -0
  39. package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.js +3 -3
  40. package/dist/algorithms/handlers/reverse-merge.js.map +1 -0
  41. package/dist/algorithms/{merge/safety → safety}/safety-checks.d.ts +1 -1
  42. package/dist/algorithms/safety/safety-checks.d.ts.map +1 -0
  43. package/dist/algorithms/safety/safety-checks.js +179 -0
  44. package/dist/algorithms/safety/safety-checks.js.map +1 -0
  45. package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.d.ts +1 -1
  46. package/dist/algorithms/strategies/merge-strategies.d.ts.map +1 -0
  47. package/dist/algorithms/strategies/merge-strategies.js.map +1 -0
  48. package/dist/algorithms/utils/response-builder.d.ts +28 -0
  49. package/dist/algorithms/utils/response-builder.d.ts.map +1 -0
  50. package/dist/algorithms/utils/response-builder.js +37 -0
  51. package/dist/algorithms/utils/response-builder.js.map +1 -0
  52. package/dist/api/web/web.d.ts.map +1 -1
  53. package/dist/api/web/web.js +0 -21
  54. package/dist/api/web/web.js.map +1 -1
  55. package/dist/commands/mcp-server.js +1 -1
  56. package/dist/config.d.ts +1 -1
  57. package/dist/config.d.ts.map +1 -1
  58. package/dist/config.js +30 -38
  59. package/dist/config.js.map +1 -1
  60. package/dist/core/associations.js +2 -2
  61. package/dist/core/associations.js.map +1 -1
  62. package/dist/core/layers/generator.d.ts +25 -0
  63. package/dist/core/layers/generator.d.ts.map +1 -0
  64. package/dist/core/layers/generator.js +76 -0
  65. package/dist/core/layers/generator.js.map +1 -0
  66. package/dist/core/mcp/tools.d.ts.map +1 -1
  67. package/dist/core/mcp/tools.js +71 -0
  68. package/dist/core/mcp/tools.js.map +1 -1
  69. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  70. package/dist/core/memory/hybrid-retrieval.js +49 -1
  71. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  72. package/dist/core/memory/hybrid-search.d.ts.map +1 -1
  73. package/dist/core/memory/hybrid-search.js +0 -7
  74. package/dist/core/memory/hybrid-search.js.map +1 -1
  75. package/dist/core/memory/memories.d.ts.map +1 -1
  76. package/dist/core/memory/memories.js +47 -53
  77. package/dist/core/memory/memories.js.map +1 -1
  78. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -1
  79. package/dist/core/memory/progressive-disclosure.js.map +1 -1
  80. package/dist/core/namespaces/index.d.ts +71 -0
  81. package/dist/core/namespaces/index.d.ts.map +1 -0
  82. package/dist/core/namespaces/index.js +296 -0
  83. package/dist/core/namespaces/index.js.map +1 -0
  84. package/dist/core/namespaces/uri-parser.d.ts +31 -0
  85. package/dist/core/namespaces/uri-parser.d.ts.map +1 -0
  86. package/dist/core/namespaces/uri-parser.js +74 -0
  87. package/dist/core/namespaces/uri-parser.js.map +1 -0
  88. package/dist/core/observations.d.ts.map +1 -1
  89. package/dist/core/observations.js +3 -12
  90. package/dist/core/observations.js.map +1 -1
  91. package/dist/core/projects.d.ts.map +1 -1
  92. package/dist/core/projects.js +0 -12
  93. package/dist/core/projects.js.map +1 -1
  94. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -1
  95. package/dist/core/scheduler/cron-scheduler.js +14 -0
  96. package/dist/core/scheduler/cron-scheduler.js.map +1 -1
  97. package/dist/core/session-hooks/self-iteration-job.d.ts +20 -0
  98. package/dist/core/session-hooks/self-iteration-job.d.ts.map +1 -0
  99. package/dist/core/session-hooks/self-iteration-job.js +278 -0
  100. package/dist/core/session-hooks/self-iteration-job.js.map +1 -0
  101. package/dist/core/session-hooks/session-hooks.d.ts +18 -0
  102. package/dist/core/session-hooks/session-hooks.d.ts.map +1 -0
  103. package/dist/core/session-hooks/session-hooks.js +55 -0
  104. package/dist/core/session-hooks/session-hooks.js.map +1 -0
  105. package/dist/core/tracing/collector.d.ts +111 -0
  106. package/dist/core/tracing/collector.d.ts.map +1 -0
  107. package/dist/core/tracing/collector.js +338 -0
  108. package/dist/core/tracing/collector.js.map +1 -0
  109. package/dist/core/tracing/visualizer.d.ts +32 -0
  110. package/dist/core/tracing/visualizer.d.ts.map +1 -0
  111. package/dist/core/tracing/visualizer.js +165 -0
  112. package/dist/core/tracing/visualizer.js.map +1 -0
  113. package/dist/drizzle/schema-sqlite.d.ts +384 -0
  114. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  115. package/dist/drizzle/schema-sqlite.js +65 -0
  116. package/dist/drizzle/schema-sqlite.js.map +1 -1
  117. package/dist/drizzle/schema.d.ts +368 -0
  118. package/dist/drizzle/schema.d.ts.map +1 -1
  119. package/dist/drizzle/schema.js +63 -0
  120. package/dist/drizzle/schema.js.map +1 -1
  121. package/dist/index.d.ts +4 -4
  122. package/dist/index.js +101 -62
  123. package/dist/index.js.map +1 -1
  124. package/generated/mcp/manifest.json +23 -0
  125. package/generated/mcp/mcp-servers.json +25 -0
  126. package/generated/mcp/mcporter.json +34 -0
  127. package/generated/mcp/openclaw-memory-qmd.json +17 -0
  128. package/generated/mcp/runtime.json +12 -0
  129. package/package.json +50 -9
  130. package/packages/plugin-claude-code/README.md +73 -0
  131. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +35 -0
  132. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts.map +1 -0
  133. package/packages/plugin-claude-code/dist/plugin-wrapper.js +191 -0
  134. package/packages/plugin-claude-code/dist/plugin-wrapper.js.map +1 -0
  135. package/packages/plugin-claude-code/package.json +31 -0
  136. package/packages/plugin-openclaw/README.md +70 -0
  137. package/packages/plugin-openclaw/dist/index.d.ts +49 -0
  138. package/packages/plugin-openclaw/dist/index.d.ts.map +1 -0
  139. package/packages/plugin-openclaw/dist/index.js +262 -0
  140. package/packages/plugin-openclaw/dist/index.js.map +1 -0
  141. package/packages/plugin-openclaw/openclaw.plugin.json +94 -0
  142. package/packages/plugin-openclaw/package.json +31 -0
  143. package/packages/plugin-opencode/install.mjs +217 -0
  144. package/packages/plugin-opencode/package.json +21 -0
  145. package/scripts/dependency-manager.mjs +217 -0
  146. package/scripts/detect-clients.mjs +78 -0
  147. package/scripts/install-interactive.mjs +674 -0
  148. package/scripts/install-plugin.mjs +415 -0
  149. package/scripts/test-interactive.mjs +131 -0
  150. package/commands/managed-sync.ts +0 -69
  151. package/commands/mcp-server.ts +0 -519
  152. package/dist/algorithms/merge/analytics/token-estimator.d.ts.map +0 -1
  153. package/dist/algorithms/merge/analytics/token-estimator.js.map +0 -1
  154. package/dist/algorithms/merge/detection/hash-filters.d.ts.map +0 -1
  155. package/dist/algorithms/merge/detection/hash-filters.js.map +0 -1
  156. package/dist/algorithms/merge/detection/semantic-ranker.d.ts.map +0 -1
  157. package/dist/algorithms/merge/detection/semantic-ranker.js.map +0 -1
  158. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +0 -1
  159. package/dist/algorithms/merge/detection/two-stage-detector.js.map +0 -1
  160. package/dist/algorithms/merge/handlers/approve-merge.d.ts.map +0 -1
  161. package/dist/algorithms/merge/handlers/approve-merge.js.map +0 -1
  162. package/dist/algorithms/merge/handlers/detect-duplicates.d.ts.map +0 -1
  163. package/dist/algorithms/merge/handlers/detect-duplicates.js.map +0 -1
  164. package/dist/algorithms/merge/handlers/get-stats.d.ts.map +0 -1
  165. package/dist/algorithms/merge/handlers/get-stats.js.map +0 -1
  166. package/dist/algorithms/merge/handlers/list-proposals.d.ts.map +0 -1
  167. package/dist/algorithms/merge/handlers/list-proposals.js.map +0 -1
  168. package/dist/algorithms/merge/handlers/preview-merge.d.ts.map +0 -1
  169. package/dist/algorithms/merge/handlers/preview-merge.js.map +0 -1
  170. package/dist/algorithms/merge/handlers/reject-merge.d.ts.map +0 -1
  171. package/dist/algorithms/merge/handlers/reject-merge.js.map +0 -1
  172. package/dist/algorithms/merge/handlers/reverse-merge.d.ts.map +0 -1
  173. package/dist/algorithms/merge/handlers/reverse-merge.js.map +0 -1
  174. package/dist/algorithms/merge/safety/safety-checks.d.ts.map +0 -1
  175. package/dist/algorithms/merge/safety/safety-checks.js +0 -215
  176. package/dist/algorithms/merge/safety/safety-checks.js.map +0 -1
  177. package/dist/algorithms/merge/strategies/merge-strategies.d.ts.map +0 -1
  178. package/dist/algorithms/merge/strategies/merge-strategies.js.map +0 -1
  179. package/dist/core/embeddings/qmd-provider.d.ts +0 -65
  180. package/dist/core/embeddings/qmd-provider.d.ts.map +0 -1
  181. package/dist/core/embeddings/qmd-provider.js +0 -133
  182. package/dist/core/embeddings/qmd-provider.js.map +0 -1
  183. package/scripts/init-dirs.ts +0 -15
  184. /package/dist/algorithms/{merge/detection → detection}/hash-filters.d.ts +0 -0
  185. /package/dist/algorithms/{merge/detection → detection}/hash-filters.js +0 -0
  186. /package/dist/algorithms/{merge/handlers → handlers}/approve-merge.d.ts +0 -0
  187. /package/dist/algorithms/{merge/handlers → handlers}/get-stats.d.ts +0 -0
  188. /package/dist/algorithms/{merge/handlers → handlers}/list-proposals.d.ts +0 -0
  189. /package/dist/algorithms/{merge/handlers → handlers}/preview-merge.d.ts +0 -0
  190. /package/dist/algorithms/{merge/handlers → handlers}/reject-merge.d.ts +0 -0
  191. /package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.d.ts +0 -0
  192. /package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.js +0 -0
@@ -0,0 +1,25 @@
1
+ {
2
+ "mcpServers": {
3
+ "filesystem": {
4
+ "args": [
5
+ "-y",
6
+ "@modelcontextprotocol/server-filesystem",
7
+ "."
8
+ ],
9
+ "command": "npx",
10
+ "env": {},
11
+ "transport": "stdio"
12
+ },
13
+ "github": {
14
+ "args": [
15
+ "-y",
16
+ "@modelcontextprotocol/server-github"
17
+ ],
18
+ "command": "npx",
19
+ "env": {
20
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
21
+ },
22
+ "transport": "stdio"
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "mcpServers": {
3
+ "filesystem": {
4
+ "args": [
5
+ "-y",
6
+ "@modelcontextprotocol/server-filesystem",
7
+ "."
8
+ ],
9
+ "command": "npx",
10
+ "env": {},
11
+ "transport": "stdio"
12
+ },
13
+ "github": {
14
+ "args": [
15
+ "-y",
16
+ "@modelcontextprotocol/server-github"
17
+ ],
18
+ "command": "npx",
19
+ "env": {
20
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
21
+ },
22
+ "transport": "stdio"
23
+ }
24
+ },
25
+ "imports": [
26
+ "cursor",
27
+ "claude-code",
28
+ "claude-desktop",
29
+ "codex",
30
+ "windsurf",
31
+ "opencode",
32
+ "vscode"
33
+ ]
34
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "memory": {
3
+ "backend": "qmd",
4
+ "qmd": {
5
+ "mcporter": {
6
+ "enabled": true,
7
+ "serverName": "qmd",
8
+ "startDaemon": true
9
+ },
10
+ "limits": {
11
+ "timeoutMs": 60000,
12
+ "maxSnippetChars": 12000,
13
+ "maxResults": 12
14
+ }
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "connectionTimeoutMs": 15000,
3
+ "lazyToolDiscovery": true,
4
+ "maxConcurrentToolCalls": 4,
5
+ "requestTimeoutMs": 60000,
6
+ "resultMaxChars": 12000,
7
+ "retry": {
8
+ "backoffMs": 400,
9
+ "enabled": true,
10
+ "maxAttempts": 3
11
+ }
12
+ }
package/package.json CHANGED
@@ -1,18 +1,22 @@
1
1
  {
2
2
  "name": "squish-memory",
3
- "version": "0.9.3",
4
- "description": "The universal two-tier memory layer for any AI agent - persistent, intelligent memory with QMD search tier and SQLite/Postgres storage tier that works with Claude Code, OpenClaw, and any agent framework",
3
+ "version": "1.0.0",
4
+ "description": "Universal plugin architecture memory system - works as plugin across Claude Code, OpenClaw, OpenCode, Codex, Cursor, VSCode, Windsurf. MCP server with CLI fallback, QMD search, and two-tier storage.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "squish": "dist/index.js",
9
- "squish-mcp": "dist/commands/mcp-server.cjs",
10
- "squish-install": "npx-installer.js"
9
+ "squish-mcp": "dist/commands/mcp-server.js",
10
+ "squish-install": "npx-installer.js",
11
+ "squish-install-plugin": "scripts/install-plugin.mjs"
11
12
  },
12
13
  "scripts": {
13
14
  "build": "tsc",
14
- "mcp:build": "tsc commands/mcp-server.ts --outDir dist/commands --module ES2022 --moduleResolution node --esModuleInterop --target ES2022 --skipLibCheck",
15
- "mcp:cjs": "esbuild commands/mcp-server.ts --bundle --platform=node --outfile=dist/commands/mcp-server.cjs --format=cjs --external:bun:* --external:better-sqlite3 --external:pg --external:drizzle-orm/*",
15
+ "build:plugins": "npm run build && npm run build:claude && npm run build:openclaw",
16
+ "build:claude": "cp -r .claude-plugin packages/plugin-claude-code/",
17
+ "build:openclaw": "mkdir -p packages/plugin-openclaw/dist && cp -r plugins/openclaw/* packages/plugin-openclaw/ && (cd packages/plugin-openclaw && npm run build 2>/dev/null || true)",
18
+ "build:mcp": "tsc commands/mcp-server.ts --outDir dist/commands --module ES2022 --moduleResolution node --esModuleInterop --target ES2022 --skipLibCheck",
19
+ "mcp:cjs": "esbuild commands/mcp-server.ts --bundle --platform=node --outfile=dist/commands/mcp-server.cjs --format=cjs --external:better-sqlite3 --external:pg --external:drizzle-orm/*",
16
20
  "start": "node dist/index.js",
17
21
  "mcp": "node dist/commands/mcp-server.cjs",
18
22
  "web": "node dist/api/web/web-server.js",
@@ -22,6 +26,12 @@
22
26
  "verify:mcp": "node scripts/verify-mcp.mjs",
23
27
  "preflight:remote": "node scripts/remote-preflight.mjs",
24
28
  "fallback:dry": "node scripts/squish-fallback.mjs --op health --simulate-mcp-failure --dry-run",
29
+ "deps:check": "node scripts/dependency-manager.mjs",
30
+ "deps:install": "node scripts/dependency-manager.mjs",
31
+ "detect:clients": "node scripts/detect-clients.mjs",
32
+ "install:plugin": "node scripts/install-plugin.mjs",
33
+ "install:interactive": "node scripts/install-interactive.mjs",
34
+ "test:interactive": "node scripts/test-interactive.mjs",
25
35
  "test": "node --test dist/tests/**/*.test.js",
26
36
  "clean": "rm -rf dist && rm -f *.log",
27
37
  "bench": "bun benchmark/memory.ts",
@@ -58,6 +68,15 @@
58
68
  "model-context-protocol",
59
69
  "claude-code",
60
70
  "openclaw",
71
+ "opencode",
72
+ "codex",
73
+ "cursor",
74
+ "windsurf",
75
+ "vscode",
76
+ "plugin",
77
+ "plugin-architecture",
78
+ "openclaw-plugin",
79
+ "claude-code-plugin",
61
80
  "qmd",
62
81
  "sqlite",
63
82
  "postgres",
@@ -66,16 +85,27 @@
66
85
  "semantic-search",
67
86
  "local-first",
68
87
  "privacy",
69
- "agent-framework"
88
+ "agent-framework",
89
+ "agent-memory"
70
90
  ],
71
91
  "files": [
72
92
  "dist",
73
93
  "scripts",
74
- "commands",
94
+ "!scripts/init-dirs.ts",
75
95
  "skills",
76
96
  "hooks",
77
97
  "config",
78
98
  "bin",
99
+ "generated",
100
+ "packages/plugin-claude-code/dist",
101
+ "packages/plugin-claude-code/package.json",
102
+ "packages/plugin-claude-code/README.md",
103
+ "packages/plugin-openclaw/dist",
104
+ "packages/plugin-openclaw/package.json",
105
+ "packages/plugin-openclaw/README.md",
106
+ "packages/plugin-openclaw/openclaw.plugin.json",
107
+ "packages/plugin-opencode/package.json",
108
+ "packages/plugin-opencode/install.mjs",
79
109
  "plugin.json",
80
110
  ".claude-plugin",
81
111
  ".mcp.json",
@@ -83,7 +113,18 @@
83
113
  "LICENSE",
84
114
  "README.md",
85
115
  "CHANGELOG.md",
86
- "QUICK-START.md"
116
+ "QUICK-START.md",
117
+ "commands/context-paging.md",
118
+ "commands/context-status.md",
119
+ "commands/context.md",
120
+ "commands/core-memory.md",
121
+ "commands/health.md",
122
+ "commands/init.md",
123
+ "commands/merge.md",
124
+ "commands/observe.md",
125
+ "commands/recall.md",
126
+ "commands/remember.md",
127
+ "commands/search.md"
87
128
  ],
88
129
  "author": "michielhdoteth",
89
130
  "license": "MIT",
@@ -0,0 +1,73 @@
1
+ # Squish Memory for Claude Code
2
+
3
+ Claude Code plugin for automatic memory capture and context injection with Squish.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @squish/memory-claude-code
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - **Automatic Memory Capture**: User prompts are automatically stored as memories
14
+ - **Context Injection**: Relevant past memories are injected into Claude's context
15
+ - **Session Summaries**: End-of-session summaries are stored for long-term retention
16
+ - **Debounced Capture**: 2-second debounce avoids noise
17
+
18
+ ## Hooks
19
+
20
+ This plugin implements Claude Code plugin hooks:
21
+
22
+ - `SessionStart` - Initialize memory session
23
+ - `UserPromptSubmit` - Capture user input (2s debounced)
24
+ - `PostToolUse` - Capture tool usage observations
25
+ - `SessionEnd` - Generate and store session summary
26
+
27
+ ## Setup
28
+
29
+ 1. Ensure Squish MCP server is running:
30
+ ```bash
31
+ npx squish-memory install-plugin --client=claude-code
32
+ ```
33
+
34
+ 2. Claude Code will automatically load the plugin on next start if installed globally
35
+
36
+ 3. Verify plugin is active:
37
+ ```bash
38
+ npx squish-memory install-plugin --client=claude-code --verify
39
+ ```
40
+
41
+ ## Configuration
42
+
43
+ Environment variables:
44
+
45
+ | Variable | Description |
46
+ |----------|-------------|
47
+ | `SQUISH_DATA_DIR` | Data directory (default: `~/.squish/claude`) |
48
+ | `SQUISH_COMMAND` | Command to start Squish MCP (default: `squish-mcp`) |
49
+
50
+ ## How It Works
51
+
52
+ 1. **Session Start**: Plugin connects to Squish MCP and creates a session
53
+ 2. **User Input Capture**: Prompts are debounced (2s) then stored as `observation` type memories with tags `user-prompt`, `claude-code`
54
+ 3. **Tool Use Capture**: (Planned) Tool calls and results stored as `observation`
55
+ 4. **Session End**: Summary generated and stored, session statistics recorded
56
+
57
+ ## Development
58
+
59
+ ```bash
60
+ cd packages/plugin-claude-code
61
+ npm install
62
+ npm run build
63
+ ```
64
+
65
+ ## Compatibility
66
+
67
+ - Claude Code v0.62+
68
+ - Node.js 18+
69
+ - Squish v1.0.0+
70
+
71
+ ## License
72
+
73
+ MIT
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Code Plugin: Squish Memory Integration
4
+ *
5
+ * Hooks:
6
+ * - SessionStart: Initialize memory session
7
+ * - UserPromptSubmit: Capture user input as memory
8
+ * - PostToolUse: Capture tool usage as observations
9
+ * - SessionEnd: Summarize session
10
+ */
11
+ declare class ClaudeCodeSquishPlugin {
12
+ private client;
13
+ private sessionId;
14
+ private workspaceDir;
15
+ private debounceTimer;
16
+ private recentMemories;
17
+ constructor();
18
+ initialize(): Promise<void>;
19
+ private connectToSquish;
20
+ private registerHooks;
21
+ private onSessionStart;
22
+ private onUserPromptSubmit;
23
+ private captureUserPrompt;
24
+ private onPostToolUse;
25
+ private onSessionEnd;
26
+ private summarizeSession;
27
+ private observe;
28
+ private callTool;
29
+ shutdown(): Promise<void>;
30
+ }
31
+ export declare function onSessionStart(): Promise<ClaudeCodeSquishPlugin>;
32
+ export declare function onUserPromptSubmit(prompt: string): Promise<void>;
33
+ export declare function onSessionEnd(): Promise<void>;
34
+ export {};
35
+ //# sourceMappingURL=plugin-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-wrapper.d.ts","sourceRoot":"","sources":["../src/plugin-wrapper.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AASH,cAAM,sBAAsB;IAC1B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,cAAc,CAAgB;;IAMhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,eAAe;IA+B7B,OAAO,CAAC,aAAa;YAcP,cAAc;YAYd,kBAAkB;YAiBlB,iBAAiB;YA2BjB,aAAa;YAMb,YAAY;YAoBZ,gBAAgB;YAShB,OAAO;YAUP,QAAQ;IAUT,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKvC;AAGD,wBAAsB,cAAc,oCAInC;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,iBAGtD;AAED,wBAAsB,YAAY,kBAEjC"}
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Code Plugin: Squish Memory Integration
4
+ *
5
+ * Hooks:
6
+ * - SessionStart: Initialize memory session
7
+ * - UserPromptSubmit: Capture user input as memory
8
+ * - PostToolUse: Capture tool usage as observations
9
+ * - SessionEnd: Summarize session
10
+ */
11
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
12
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
13
+ import path from "node:path";
14
+ import os from "node:os";
15
+ import { pathToFileURL } from "node:url";
16
+ class ClaudeCodeSquishPlugin {
17
+ client = null;
18
+ sessionId = "";
19
+ workspaceDir;
20
+ debounceTimer = null;
21
+ recentMemories = [];
22
+ constructor() {
23
+ this.workspaceDir = process.env.CLAUDE_WORKING_DIRECTORY || process.cwd();
24
+ }
25
+ async initialize() {
26
+ console.log("[SquishPlugin] Claude Code plugin initializing...");
27
+ // Connect to Squish MCP (assumes Squish is running)
28
+ await this.connectToSquish();
29
+ // Register hooks
30
+ this.registerHooks();
31
+ console.log("[SquishPlugin] ✓ Plugin ready");
32
+ }
33
+ async connectToSquish() {
34
+ // Check if Squish is running as MCP server (stdio mode expected)
35
+ // In Claude Code plugin mode, Squish should already be running
36
+ // We'll spawn a separate connection or use existing if available
37
+ this.client = new Client({ name: "claude-squish-plugin", version: "1.0.0" }, { capabilities: {} });
38
+ // Connect via stdio to Squish MCP server
39
+ // Squish should be running: squish-mcp --stdio
40
+ const transport = new StdioClientTransport({
41
+ command: process.env.SQUISH_COMMAND || "squish-mcp",
42
+ args: ["--stdio"],
43
+ env: {
44
+ ...process.env,
45
+ SQUISH_MODE: "local",
46
+ SQUISH_DATA_DIR: process.env.SQUISH_DATA_DIR || path.join(os.homedir(), ".squish", "claude")
47
+ }
48
+ });
49
+ try {
50
+ await this.client.connect(transport);
51
+ console.log("[SquishPlugin] Connected to Squish MCP");
52
+ }
53
+ catch (error) {
54
+ console.error("[SquishPlugin] Failed to connect to Squish:", error?.message || error);
55
+ throw error;
56
+ }
57
+ }
58
+ registerHooks() {
59
+ // Hook: SessionStart
60
+ this.onSessionStart();
61
+ // Hook: UserPromptSubmit (via environment or stdin monitoring)
62
+ this.onUserPromptSubmit();
63
+ // Hook: PostToolUse
64
+ this.onPostToolUse();
65
+ // Hook: SessionEnd
66
+ this.onSessionEnd();
67
+ }
68
+ async onSessionStart() {
69
+ this.sessionId = `session-${Date.now()}-${Math.random().toString(36).substring(7)}`;
70
+ console.log("[SquishPlugin] Session started:", this.sessionId);
71
+ // Store session start observation
72
+ await this.observe("session_start", "Claude Code session started", {
73
+ sessionId: this.sessionId,
74
+ workspace: this.workspaceDir,
75
+ timestamp: new Date().toISOString()
76
+ });
77
+ }
78
+ async onUserPromptSubmit() {
79
+ // In Claude Code plugin system, we receive prompts via stdin
80
+ // For this plugin implementation, we'll use a wrapper approach
81
+ // Capture stdin lines as user input
82
+ process.stdin?.on("data", async (data) => {
83
+ const prompt = data.toString().trim();
84
+ if (!prompt)
85
+ return;
86
+ // Debounce to avoid capturing intermediate states
87
+ if (this.debounceTimer)
88
+ clearTimeout(this.debounceTimer);
89
+ this.debounceTimer = setTimeout(async () => {
90
+ await this.captureUserPrompt(prompt);
91
+ }, 2000); // 2 second debounce
92
+ });
93
+ }
94
+ async captureUserPrompt(prompt) {
95
+ try {
96
+ console.log("[SquishPlugin] Capturing user prompt...");
97
+ // Store as memory
98
+ const result = await this.callTool("squish_remember", {
99
+ content: prompt,
100
+ type: "observation",
101
+ tags: ["user-prompt", "claude-code"],
102
+ project: this.workspaceDir,
103
+ metadata: {
104
+ source: "claude-plugin",
105
+ sessionId: this.sessionId,
106
+ capturedAt: new Date().toISOString()
107
+ }
108
+ });
109
+ const memoryId = JSON.parse(result).id;
110
+ this.recentMemories.push(memoryId);
111
+ if (this.recentMemories.length > 50)
112
+ this.recentMemories.shift();
113
+ console.log("[SquishPlugin] ✓ Captured user prompt as memory:", memoryId);
114
+ }
115
+ catch (error) {
116
+ console.error("[SquishPlugin] Failed to capture prompt:", error?.message || error);
117
+ }
118
+ }
119
+ async onPostToolUse() {
120
+ // Capture tool usage from Claude Code output
121
+ // This would need integration with Claude Code's tool result streaming
122
+ // Simplified: we'll rely on users to call observe manually or via prompts
123
+ }
124
+ async onSessionEnd() {
125
+ console.log("[SquishPlugin] Session ending:", this.sessionId);
126
+ try {
127
+ // Generate session summary
128
+ const summary = await this.summarizeSession();
129
+ // Store summary observation
130
+ await this.observe("session_summary", summary, {
131
+ sessionId: this.sessionId,
132
+ memoryCount: this.recentMemories.length,
133
+ endedAt: new Date().toISOString()
134
+ });
135
+ console.log("[SquishPlugin] ✓ Session summary stored");
136
+ }
137
+ catch (error) {
138
+ console.error("[SquishPlugin] Session end error:", error?.message || error);
139
+ }
140
+ }
141
+ async summarizeSession() {
142
+ // Generate a brief summary of this session's memories
143
+ if (this.recentMemories.length === 0) {
144
+ return "Empty session - no memories captured.";
145
+ }
146
+ return `Session ${this.sessionId}: Captured ${this.recentMemories.length} memories from user prompts and interactions.`;
147
+ }
148
+ async observe(type, summary, details) {
149
+ return this.callTool("squish_observe", {
150
+ type,
151
+ action: "claude_code_event",
152
+ summary,
153
+ details,
154
+ project: this.workspaceDir
155
+ });
156
+ }
157
+ async callTool(name, args) {
158
+ if (!this.client) {
159
+ throw new Error("MCP client not connected");
160
+ }
161
+ const result = await this.client.callTool({ name, arguments: args });
162
+ const content = result?.content?.find((c) => c.type === "text")?.text || "{}";
163
+ return content;
164
+ }
165
+ async shutdown() {
166
+ if (this.debounceTimer)
167
+ clearTimeout(this.debounceTimer);
168
+ if (this.client)
169
+ await this.client.close();
170
+ console.log("[SquishPlugin] Shutdown complete");
171
+ }
172
+ }
173
+ // Plugin entry point for Claude Code hook system
174
+ export async function onSessionStart() {
175
+ const plugin = new ClaudeCodeSquishPlugin();
176
+ await plugin.initialize();
177
+ return plugin;
178
+ }
179
+ export async function onUserPromptSubmit(prompt) {
180
+ // This will be called by Claude Code hook system
181
+ // For now, the instance manages its own stdin listener
182
+ }
183
+ export async function onSessionEnd() {
184
+ // Cleanup handled by plugin instance
185
+ }
186
+ // Standalone test mode
187
+ if (process.argv[1] === pathToFileURL(__filename).pathname) {
188
+ const plugin = new ClaudeCodeSquishPlugin();
189
+ plugin.initialize().catch(console.error);
190
+ }
191
+ //# sourceMappingURL=plugin-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-wrapper.js","sourceRoot":"","sources":["../src/plugin-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@squish/memory-claude-code",
3
+ "version": "1.0.0",
4
+ "description": "Claude Code plugin for Squish - automatic memory capture and context injection",
5
+ "main": "dist/plugin-wrapper.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "bun --hot src/plugin-wrapper.ts",
10
+ "prepublishOnly": "npm run clean && npm run build",
11
+ "prepare": "npm run build",
12
+ "clean": "rm -rf dist"
13
+ },
14
+ "keywords": ["claude-code", "plugin", "memory", "mcp", "squish"],
15
+ "author": "michielhdoteth",
16
+ "license": "MIT",
17
+ "dependencies": {
18
+ "@modelcontextprotocol/sdk": "^1.27.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^22.0.0",
22
+ "typescript": "^5.7.0",
23
+ "vitest": "^4.0.17"
24
+ },
25
+ "peerDependencies": {
26
+ "squish-memory": ">=1.0.0"
27
+ },
28
+ "engines": {
29
+ "node": ">=18.0.0"
30
+ }
31
+ }
@@ -0,0 +1,70 @@
1
+ # Squish Memory for OpenClaw
2
+
3
+ OpenClaw plugin that connects to Squish memory system via MCP protocol.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @squish/memory-openclaw
9
+ ```
10
+
11
+ ## Configuration
12
+
13
+ In your OpenClaw config (`~/.openclaw/agents.json` or similar):
14
+
15
+ ```json
16
+ {
17
+ "plugins": {
18
+ "enabled": true,
19
+ "slots": {
20
+ "memory": "squish-memory-openclaw"
21
+ },
22
+ "entries": {
23
+ "squish-memory-openclaw": {
24
+ "enabled": true,
25
+ "config": {
26
+ "baseUrl": "http://127.0.0.1:8767",
27
+ "autoStart": false,
28
+ "sync": {
29
+ "enabled": true,
30
+ "interval": "5m",
31
+ "extraPaths": ["notes", "docs/memory"]
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## Requirements
41
+
42
+ - Squish memory server running (either via `squish-mcp --stdio` or HTTP at `baseUrl`)
43
+ - mcporter (if using OpenClaw's MCP mode)
44
+ - qmd (for fast markdown search)
45
+
46
+ These are auto-installed by the Squish installer when you run:
47
+ ```bash
48
+ npx squish-memory install-plugin --client=openclaw
49
+ ```
50
+
51
+ ## How It Works
52
+
53
+ 1. The plugin registers in the `memory` slot of OpenClaw
54
+ 2. It connects to Squish MCP server (spawns one if autoStart=true)
55
+ 3. Periodic sync monitors workspace files and stores them as memories
56
+ 4. Tool calls from OpenClaw:
57
+ - `memory_search(query, maxResults)` → Squish hybrid search
58
+ - `memory_get(uri, lineRange, overview)` → Retrieve memory content
59
+
60
+ ## Development
61
+
62
+ ```bash
63
+ cd packages/plugin-openclaw
64
+ npm install
65
+ npm run build
66
+ ```
67
+
68
+ ## License
69
+
70
+ MIT
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * OpenClaw Plugin: Squish Memory Integration
4
+ *
5
+ * This plugin connects OpenClaw to Squish memory system:
6
+ * - Tools: memory_search, memory_get
7
+ * - Sync: Monitors workspace and stores memories
8
+ * - Server: Can auto-start Squish MCP or connect to existing
9
+ */
10
+ interface PluginConfig {
11
+ baseUrl?: string;
12
+ autoStart?: boolean;
13
+ sync?: {
14
+ enabled: boolean;
15
+ interval?: string;
16
+ extraPaths?: string[];
17
+ };
18
+ }
19
+ declare class OpenClawSquishPlugin {
20
+ private config;
21
+ private client;
22
+ private syncInterval;
23
+ private workspaceDir;
24
+ private agentId;
25
+ constructor(config: PluginConfig);
26
+ initialize(): Promise<void>;
27
+ private connect;
28
+ private connectViaStdio;
29
+ private connectViaHTTP;
30
+ private startSync;
31
+ private parseInterval;
32
+ private performSync;
33
+ private collectMarkdownFiles;
34
+ private syncFile;
35
+ memory_search(params: {
36
+ query: string;
37
+ maxResults?: number;
38
+ project?: string;
39
+ }): Promise<any>;
40
+ memory_get(params: {
41
+ uri: string;
42
+ lineRange?: number[];
43
+ overview?: boolean;
44
+ }): Promise<any>;
45
+ private extractMemoryId;
46
+ shutdown(): Promise<void>;
47
+ }
48
+ export { OpenClawSquishPlugin };
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAaH,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,YAAY;IAc1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAUnB,OAAO;YAoBP,eAAe;YAuBf,cAAc;IAK5B,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,aAAa;YAWP,WAAW;IAkBzB,OAAO,CAAC,oBAAoB;YAyBd,QAAQ;IA4BhB,aAAa,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IA0B7F,UAAU,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAuCjG,OAAO,CAAC,eAAe;IAWV,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAavC;AAGD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}