squish-memory 0.8.2 → 0.9.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.
Files changed (283) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.env.mcp +30 -0
  4. package/.mcp.json +2 -5
  5. package/CHANGELOG.md +111 -0
  6. package/QUICK-START.md +65 -0
  7. package/README.md +188 -530
  8. package/commands/managed-sync.ts +69 -0
  9. package/commands/mcp-server.ts +519 -0
  10. package/config/mcp-cli-fallback-policy.json +22 -0
  11. package/config/mcp-migration-map.json +22 -0
  12. package/config/mcp-mode-semantics.json +21 -0
  13. package/config/mcp-remote-auth.json +36 -0
  14. package/config/mcp-universal.schema.json +48 -0
  15. package/config/mcp.json +38 -0
  16. package/config/remote-memory-policy.json +32 -0
  17. package/dist/algorithms/merge/detection/hash-filters.js +2 -2
  18. package/dist/algorithms/merge/detection/hash-filters.js.map +1 -1
  19. package/dist/algorithms/merge/detection/two-stage-detector.d.ts +5 -2
  20. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -1
  21. package/dist/algorithms/merge/detection/two-stage-detector.js +139 -22
  22. package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -1
  23. package/dist/api/web/index.d.ts +3 -0
  24. package/dist/api/web/index.d.ts.map +1 -0
  25. package/dist/api/web/index.js +4 -0
  26. package/dist/api/web/index.js.map +1 -0
  27. package/dist/api/web/web-server.d.ts +3 -0
  28. package/dist/api/web/web-server.d.ts.map +1 -0
  29. package/dist/api/web/web-server.js +6 -0
  30. package/dist/api/web/web-server.js.map +1 -0
  31. package/dist/api/web/web.d.ts.map +1 -1
  32. package/dist/api/web/web.js +227 -78
  33. package/dist/api/web/web.js.map +1 -1
  34. package/dist/commands/managed-sync.d.ts +10 -0
  35. package/dist/commands/managed-sync.d.ts.map +1 -0
  36. package/dist/commands/managed-sync.js +64 -0
  37. package/dist/commands/managed-sync.js.map +1 -0
  38. package/dist/commands/mcp-server.d.ts +3 -0
  39. package/dist/commands/mcp-server.d.ts.map +1 -0
  40. package/dist/commands/mcp-server.js +389 -0
  41. package/dist/commands/mcp-server.js.map +1 -0
  42. package/dist/config.d.ts +24 -1
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +32 -1
  45. package/dist/config.js.map +1 -1
  46. package/dist/core/associations.d.ts +1 -1
  47. package/dist/core/associations.d.ts.map +1 -1
  48. package/dist/core/consolidation.d.ts +31 -0
  49. package/dist/core/consolidation.d.ts.map +1 -1
  50. package/dist/core/consolidation.js +237 -29
  51. package/dist/core/consolidation.js.map +1 -1
  52. package/dist/core/embeddings/google-multimodal.d.ts +14 -0
  53. package/dist/core/embeddings/google-multimodal.d.ts.map +1 -0
  54. package/dist/core/embeddings/google-multimodal.js +142 -0
  55. package/dist/core/embeddings/google-multimodal.js.map +1 -0
  56. package/dist/core/embeddings.d.ts +3 -2
  57. package/dist/core/embeddings.d.ts.map +1 -1
  58. package/dist/core/embeddings.js +61 -39
  59. package/dist/core/embeddings.js.map +1 -1
  60. package/dist/core/mcp/client.d.ts +17 -0
  61. package/dist/core/mcp/client.d.ts.map +1 -0
  62. package/dist/core/mcp/client.js +101 -0
  63. package/dist/core/mcp/client.js.map +1 -0
  64. package/dist/core/mcp/index.d.ts +6 -0
  65. package/dist/core/mcp/index.d.ts.map +1 -0
  66. package/dist/core/mcp/index.js +6 -0
  67. package/dist/core/mcp/index.js.map +1 -0
  68. package/dist/core/mcp/server.d.ts +18 -0
  69. package/dist/core/mcp/server.d.ts.map +1 -0
  70. package/dist/core/mcp/server.js +131 -0
  71. package/dist/core/mcp/server.js.map +1 -0
  72. package/dist/core/mcp/standalone-server.d.ts +13 -0
  73. package/dist/core/mcp/standalone-server.d.ts.map +1 -0
  74. package/dist/core/mcp/standalone-server.js +46 -0
  75. package/dist/core/mcp/standalone-server.js.map +1 -0
  76. package/dist/core/mcp/tools.d.ts +9 -0
  77. package/dist/core/mcp/tools.d.ts.map +1 -0
  78. package/dist/core/mcp/tools.js +262 -0
  79. package/dist/core/mcp/tools.js.map +1 -0
  80. package/dist/core/mcp/types.d.ts +315 -0
  81. package/dist/core/mcp/types.d.ts.map +1 -0
  82. package/dist/core/mcp/types.js +48 -0
  83. package/dist/core/mcp/types.js.map +1 -0
  84. package/dist/core/memory/categorizer.d.ts +27 -0
  85. package/dist/core/memory/categorizer.d.ts.map +1 -0
  86. package/dist/core/memory/categorizer.js +304 -0
  87. package/dist/core/memory/categorizer.js.map +1 -0
  88. package/dist/core/memory/conflict-detector.d.ts +7 -0
  89. package/dist/core/memory/conflict-detector.d.ts.map +1 -0
  90. package/dist/core/memory/conflict-detector.js +43 -0
  91. package/dist/core/memory/conflict-detector.js.map +1 -0
  92. package/dist/core/memory/context-collector.d.ts +10 -0
  93. package/dist/core/memory/context-collector.d.ts.map +1 -0
  94. package/dist/core/memory/context-collector.js +55 -0
  95. package/dist/core/memory/context-collector.js.map +1 -0
  96. package/dist/core/memory/contradiction-resolver.d.ts +40 -0
  97. package/dist/core/memory/contradiction-resolver.d.ts.map +1 -0
  98. package/dist/core/memory/contradiction-resolver.js +368 -0
  99. package/dist/core/memory/contradiction-resolver.js.map +1 -0
  100. package/dist/core/memory/edit-workflow.d.ts +19 -0
  101. package/dist/core/memory/edit-workflow.d.ts.map +1 -0
  102. package/dist/core/memory/edit-workflow.js +120 -0
  103. package/dist/core/memory/edit-workflow.js.map +1 -0
  104. package/dist/core/memory/feedback-tracker.d.ts +12 -0
  105. package/dist/core/memory/feedback-tracker.d.ts.map +1 -0
  106. package/dist/core/memory/feedback-tracker.js +151 -0
  107. package/dist/core/memory/feedback-tracker.js.map +1 -0
  108. package/dist/core/memory/hybrid-retrieval.d.ts +11 -12
  109. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  110. package/dist/core/memory/hybrid-retrieval.js +56 -28
  111. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  112. package/dist/core/memory/hybrid-scorer.d.ts +5 -16
  113. package/dist/core/memory/hybrid-scorer.d.ts.map +1 -1
  114. package/dist/core/memory/hybrid-scorer.js +161 -125
  115. package/dist/core/memory/hybrid-scorer.js.map +1 -1
  116. package/dist/core/memory/hybrid-search.js +64 -22
  117. package/dist/core/memory/hybrid-search.js.map +1 -1
  118. package/dist/core/memory/memories.d.ts +4 -0
  119. package/dist/core/memory/memories.d.ts.map +1 -1
  120. package/dist/core/memory/memories.js +138 -60
  121. package/dist/core/memory/memories.js.map +1 -1
  122. package/dist/core/memory/progressive-disclosure.d.ts +43 -0
  123. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -0
  124. package/dist/core/memory/progressive-disclosure.js +280 -0
  125. package/dist/core/memory/progressive-disclosure.js.map +1 -0
  126. package/dist/core/memory/query-rewriter.d.ts +13 -0
  127. package/dist/core/memory/query-rewriter.d.ts.map +1 -0
  128. package/dist/core/memory/query-rewriter.js +118 -0
  129. package/dist/core/memory/query-rewriter.js.map +1 -0
  130. package/dist/core/memory/response-analyzer.d.ts +9 -0
  131. package/dist/core/memory/response-analyzer.d.ts.map +1 -0
  132. package/dist/core/memory/response-analyzer.js +61 -0
  133. package/dist/core/memory/response-analyzer.js.map +1 -0
  134. package/dist/core/memory/stats.d.ts +17 -0
  135. package/dist/core/memory/stats.d.ts.map +1 -0
  136. package/dist/core/memory/stats.js +87 -0
  137. package/dist/core/memory/stats.js.map +1 -0
  138. package/dist/core/memory/telemetry.d.ts +69 -0
  139. package/dist/core/memory/telemetry.d.ts.map +1 -0
  140. package/dist/core/memory/telemetry.js +313 -0
  141. package/dist/core/memory/telemetry.js.map +1 -0
  142. package/dist/core/memory/temporal-facts.d.ts +41 -0
  143. package/dist/core/memory/temporal-facts.d.ts.map +1 -0
  144. package/dist/core/memory/temporal-facts.js +262 -0
  145. package/dist/core/memory/temporal-facts.js.map +1 -0
  146. package/dist/core/memory/trigger-detector.d.ts +14 -0
  147. package/dist/core/memory/trigger-detector.d.ts.map +1 -0
  148. package/dist/core/memory/trigger-detector.js +42 -0
  149. package/dist/core/memory/trigger-detector.js.map +1 -0
  150. package/dist/core/memory/write-gate.d.ts +54 -0
  151. package/dist/core/memory/write-gate.d.ts.map +1 -0
  152. package/dist/core/memory/write-gate.js +210 -0
  153. package/dist/core/memory/write-gate.js.map +1 -0
  154. package/dist/core/observations.d.ts.map +1 -1
  155. package/dist/core/observations.js +1 -0
  156. package/dist/core/observations.js.map +1 -1
  157. package/dist/core/projects.d.ts +2 -0
  158. package/dist/core/projects.d.ts.map +1 -1
  159. package/dist/core/projects.js +33 -0
  160. package/dist/core/projects.js.map +1 -1
  161. package/dist/core/scheduler/cron-scheduler.d.ts +32 -0
  162. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -0
  163. package/dist/core/scheduler/cron-scheduler.js +238 -0
  164. package/dist/core/scheduler/cron-scheduler.js.map +1 -0
  165. package/dist/core/scheduler/heartbeat.d.ts +11 -0
  166. package/dist/core/scheduler/heartbeat.d.ts.map +1 -0
  167. package/dist/core/scheduler/heartbeat.js +73 -0
  168. package/dist/core/scheduler/heartbeat.js.map +1 -0
  169. package/dist/core/scheduler/index.d.ts +8 -0
  170. package/dist/core/scheduler/index.d.ts.map +1 -0
  171. package/dist/core/scheduler/index.js +8 -0
  172. package/dist/core/scheduler/index.js.map +1 -0
  173. package/dist/core/scheduler/job-runner.d.ts +11 -0
  174. package/dist/core/scheduler/job-runner.d.ts.map +1 -0
  175. package/dist/core/scheduler/job-runner.js +161 -0
  176. package/dist/core/scheduler/job-runner.js.map +1 -0
  177. package/dist/core/session/auto-load.d.ts +6 -0
  178. package/dist/core/session/auto-load.d.ts.map +1 -0
  179. package/dist/core/session/auto-load.js +119 -0
  180. package/dist/core/session/auto-load.js.map +1 -0
  181. package/dist/core/session/index.d.ts +7 -0
  182. package/dist/core/session/index.d.ts.map +1 -0
  183. package/dist/core/session/index.js +7 -0
  184. package/dist/core/session/index.js.map +1 -0
  185. package/dist/core/session/types.d.ts +26 -0
  186. package/dist/core/session/types.d.ts.map +1 -0
  187. package/dist/core/session/types.js +10 -0
  188. package/dist/core/session/types.js.map +1 -0
  189. package/dist/core/snapshots/comparison.d.ts.map +1 -1
  190. package/dist/core/snapshots/comparison.js +8 -2
  191. package/dist/core/snapshots/comparison.js.map +1 -1
  192. package/dist/core/utils/content-extraction.d.ts.map +1 -1
  193. package/dist/core/utils/content-extraction.js +11 -1
  194. package/dist/core/utils/content-extraction.js.map +1 -1
  195. package/dist/core/utils/memory-operations.d.ts.map +1 -1
  196. package/dist/core/utils/memory-operations.js +3 -1
  197. package/dist/core/utils/memory-operations.js.map +1 -1
  198. package/dist/core/utils/summarization-helpers.d.ts.map +1 -1
  199. package/dist/core/utils/summarization-helpers.js +4 -1
  200. package/dist/core/utils/summarization-helpers.js.map +1 -1
  201. package/dist/core/utils.d.ts.map +1 -1
  202. package/dist/core/utils.js +26 -3
  203. package/dist/core/utils.js.map +1 -1
  204. package/dist/core/worker.d.ts +20 -0
  205. package/dist/core/worker.d.ts.map +1 -1
  206. package/dist/core/worker.js +86 -0
  207. package/dist/core/worker.js.map +1 -1
  208. package/dist/db/adapter.d.ts +1 -5
  209. package/dist/db/adapter.d.ts.map +1 -1
  210. package/dist/db/adapter.js +137 -12
  211. package/dist/db/adapter.js.map +1 -1
  212. package/dist/db/bootstrap.d.ts.map +1 -1
  213. package/dist/db/bootstrap.js +178 -3
  214. package/dist/db/bootstrap.js.map +1 -1
  215. package/dist/db/index.d.ts +1 -5
  216. package/dist/db/index.d.ts.map +1 -1
  217. package/dist/db/index.js +7 -4
  218. package/dist/db/index.js.map +1 -1
  219. package/dist/drizzle/schema-sqlite.d.ts +1953 -612
  220. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  221. package/dist/drizzle/schema-sqlite.js +134 -0
  222. package/dist/drizzle/schema-sqlite.js.map +1 -1
  223. package/dist/drizzle/schema.d.ts +684 -3
  224. package/dist/drizzle/schema.d.ts.map +1 -1
  225. package/dist/drizzle/schema.js +81 -1
  226. package/dist/drizzle/schema.js.map +1 -1
  227. package/dist/index.d.ts +3 -3
  228. package/dist/index.js +152 -13
  229. package/dist/index.js.map +1 -1
  230. package/package.json +126 -103
  231. package/scripts/build-release.sh +33 -0
  232. package/scripts/db/check-db.mjs +88 -0
  233. package/scripts/db/fix-all-columns.mjs +52 -0
  234. package/scripts/db/fix-schema-all.mjs +55 -0
  235. package/scripts/db/fix-schema-full.mjs +46 -0
  236. package/scripts/db/fix-schema.mjs +38 -0
  237. package/scripts/db/init-db.mjs +13 -0
  238. package/scripts/db/recreate-db.mjs +14 -0
  239. package/scripts/generate-mcp.mjs +264 -0
  240. package/scripts/github-release.sh +61 -0
  241. package/scripts/init-dirs.mjs +13 -0
  242. package/scripts/init-dirs.ts +15 -0
  243. package/scripts/install-mcp.mjs +116 -0
  244. package/scripts/install-web.sh +120 -0
  245. package/scripts/install.mjs +340 -0
  246. package/scripts/openclaw-bootstrap.mjs +127 -0
  247. package/scripts/package-release.sh +71 -0
  248. package/scripts/remote-preflight.mjs +62 -0
  249. package/scripts/squish-fallback.mjs +132 -0
  250. package/scripts/test/test-all-systems.mjs +139 -0
  251. package/scripts/test/test-memory-system.mjs +139 -0
  252. package/scripts/test/test-v0.5.0.mjs +210 -0
  253. package/scripts/verify-mcp.mjs +214 -0
  254. package/skills/memory-guide/SKILL.md +181 -123
  255. package/skills/squish-cli/SKILL.md +200 -0
  256. package/skills/squish-mcp/SKILL.md +311 -0
  257. package/skills/squish-memory/SKILL.md +100 -62
  258. package/skills/squish-memory/claude-desktop.json +12 -0
  259. package/skills/squish-memory/install.mjs +335 -0
  260. package/skills/squish-memory/install.sh +94 -62
  261. package/skills/squish-memory/openclaw.json +13 -0
  262. package/skills/squish-memory/opencode.json +14 -0
  263. package/skills/squish-memory/skill.json +32 -0
  264. package/dist/adapters/claude-code/capture.d.ts +0 -11
  265. package/dist/adapters/claude-code/capture.d.ts.map +0 -1
  266. package/dist/adapters/claude-code/capture.js +0 -100
  267. package/dist/adapters/claude-code/capture.js.map +0 -1
  268. package/dist/adapters/claude-code/index.d.ts +0 -5
  269. package/dist/adapters/claude-code/index.d.ts.map +0 -1
  270. package/dist/adapters/claude-code/index.js +0 -6
  271. package/dist/adapters/claude-code/index.js.map +0 -1
  272. package/dist/adapters/claude-code/injection.d.ts +0 -34
  273. package/dist/adapters/claude-code/injection.d.ts.map +0 -1
  274. package/dist/adapters/claude-code/injection.js +0 -127
  275. package/dist/adapters/claude-code/injection.js.map +0 -1
  276. package/dist/adapters/claude-code/plugin-wrapper.d.ts +0 -21
  277. package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +0 -1
  278. package/dist/adapters/claude-code/plugin-wrapper.js +0 -239
  279. package/dist/adapters/claude-code/plugin-wrapper.js.map +0 -1
  280. package/dist/adapters/claude-code/types.d.ts +0 -46
  281. package/dist/adapters/claude-code/types.d.ts.map +0 -1
  282. package/dist/adapters/claude-code/types.js +0 -6
  283. package/dist/adapters/claude-code/types.js.map +0 -1
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import crypto from "node:crypto";
6
+ import { spawnSync } from "node:child_process";
7
+
8
+ const root = process.cwd();
9
+ const defaultConfigPath = path.join(root, "config", "mcp.json");
10
+ const defaultGeneratedDir = path.join(root, "generated", "mcp");
11
+ const requiredFiles = [
12
+ "runtime.json",
13
+ "mcp-servers.json",
14
+ "mcporter.json",
15
+ "openclaw-memory-qmd.json",
16
+ "manifest.json"
17
+ ];
18
+
19
+ function parseArgs(argv) {
20
+ const args = {
21
+ configPath: defaultConfigPath,
22
+ generatedDir: defaultGeneratedDir,
23
+ checkReproducibility: true
24
+ };
25
+
26
+ for (let i = 2; i < argv.length; i += 1) {
27
+ const token = argv[i];
28
+ if (token === "--config") {
29
+ args.configPath = path.resolve(argv[i + 1]);
30
+ i += 1;
31
+ continue;
32
+ }
33
+ if (token === "--generated") {
34
+ args.generatedDir = path.resolve(argv[i + 1]);
35
+ i += 1;
36
+ continue;
37
+ }
38
+ if (token === "--no-repro") {
39
+ args.checkReproducibility = false;
40
+ continue;
41
+ }
42
+ throw new Error(`Unknown argument: ${token}`);
43
+ }
44
+
45
+ return args;
46
+ }
47
+
48
+ function fail(message) {
49
+ throw new Error(message);
50
+ }
51
+
52
+ function readJson(filePath) {
53
+ try {
54
+ return JSON.parse(fs.readFileSync(filePath, "utf8"));
55
+ } catch (error) {
56
+ fail(`Invalid JSON at ${filePath}: ${String(error)}`);
57
+ }
58
+ }
59
+
60
+ function checksum(filePath) {
61
+ const hash = crypto.createHash("sha256");
62
+ hash.update(fs.readFileSync(filePath));
63
+ return hash.digest("hex");
64
+ }
65
+
66
+ function assertServerShape(serverName, server) {
67
+ if (!server || typeof server !== "object") {
68
+ fail(`Server ${serverName} must be an object`);
69
+ }
70
+ if (typeof server.command !== "string" || server.command.length === 0) {
71
+ fail(`Server ${serverName} must include command`);
72
+ }
73
+ if (!Array.isArray(server.args)) {
74
+ fail(`Server ${serverName} must include args array`);
75
+ }
76
+ if (typeof server.transport !== "string" || server.transport.length === 0) {
77
+ fail(`Server ${serverName} must include transport`);
78
+ }
79
+ if (!server.env || typeof server.env !== "object") {
80
+ fail(`Server ${serverName} must include env object`);
81
+ }
82
+ }
83
+
84
+ function verifyGeneratedFiles(dirPath) {
85
+ for (const fileName of requiredFiles) {
86
+ const filePath = path.join(dirPath, fileName);
87
+ if (!fs.existsSync(filePath)) {
88
+ fail(`Missing generated file: ${fileName}`);
89
+ }
90
+ }
91
+ }
92
+
93
+ function verifyRuntime(runtime) {
94
+ const requiredKeys = [
95
+ "connectionTimeoutMs",
96
+ "requestTimeoutMs",
97
+ "maxConcurrentToolCalls",
98
+ "lazyToolDiscovery",
99
+ "resultMaxChars",
100
+ "retry"
101
+ ];
102
+ for (const key of requiredKeys) {
103
+ if (!(key in runtime)) {
104
+ fail(`runtime.json missing required key: ${key}`);
105
+ }
106
+ }
107
+ }
108
+
109
+ function verifyManifest(manifest, dirPath) {
110
+ if (manifest.mode !== "universal") {
111
+ fail("manifest mode must be universal");
112
+ }
113
+ if (!Array.isArray(manifest.files) || manifest.files.length === 0) {
114
+ fail("manifest files must be a non-empty array");
115
+ }
116
+
117
+ const expectedManifestEntries = [
118
+ "runtime.json",
119
+ "mcp-servers.json",
120
+ "mcporter.json",
121
+ "openclaw-memory-qmd.json"
122
+ ];
123
+
124
+ for (const fileName of expectedManifestEntries) {
125
+ const entry = manifest.files.find((item) => item.file === fileName);
126
+ if (!entry) {
127
+ fail(`manifest missing entry for ${fileName}`);
128
+ }
129
+ const actualHash = checksum(path.join(dirPath, fileName));
130
+ if (entry.sha256 !== actualHash) {
131
+ fail(`manifest checksum mismatch for ${fileName}`);
132
+ }
133
+ }
134
+ }
135
+
136
+ function verifyReproducibility(configPath, dirPath) {
137
+ const first = readJson(path.join(dirPath, "manifest.json"));
138
+ const firstChecksums = new Map(first.files.map((item) => [item.file, item.sha256]));
139
+
140
+ const run = spawnSync(
141
+ process.execPath,
142
+ ["scripts/generate-mcp.mjs", "--config", configPath, "--out", dirPath],
143
+ { cwd: root, encoding: "utf8" }
144
+ );
145
+
146
+ if (run.status !== 0) {
147
+ fail(`Reproducibility generation failed: ${run.stderr || run.stdout}`);
148
+ }
149
+
150
+ const second = readJson(path.join(dirPath, "manifest.json"));
151
+ const secondChecksums = new Map(second.files.map((item) => [item.file, item.sha256]));
152
+
153
+ for (const [fileName, firstHash] of firstChecksums.entries()) {
154
+ const secondHash = secondChecksums.get(fileName);
155
+ if (!secondHash) {
156
+ fail(`Reproducibility check missing ${fileName} in second manifest`);
157
+ }
158
+ if (firstHash !== secondHash) {
159
+ fail(`Reproducibility mismatch for ${fileName}`);
160
+ }
161
+ }
162
+ }
163
+
164
+ function main() {
165
+ const args = parseArgs(process.argv);
166
+
167
+ if (!fs.existsSync(args.configPath)) {
168
+ fail(`Config file not found: ${args.configPath}`);
169
+ }
170
+ if (!fs.existsSync(args.generatedDir)) {
171
+ fail(`Generated directory not found: ${args.generatedDir}`);
172
+ }
173
+
174
+ verifyGeneratedFiles(args.generatedDir);
175
+
176
+ const runtime = readJson(path.join(args.generatedDir, "runtime.json"));
177
+ verifyRuntime(runtime);
178
+
179
+ const mcpServers = readJson(path.join(args.generatedDir, "mcp-servers.json"));
180
+ if (!mcpServers.mcpServers || typeof mcpServers.mcpServers !== "object") {
181
+ fail("mcp-servers.json must include mcpServers object");
182
+ }
183
+ const serverEntries = Object.entries(mcpServers.mcpServers);
184
+ if (serverEntries.length === 0) {
185
+ fail("mcp-servers.json must include at least one server");
186
+ }
187
+ for (const [name, server] of serverEntries) {
188
+ assertServerShape(name, server);
189
+ }
190
+
191
+ const mcporter = readJson(path.join(args.generatedDir, "mcporter.json"));
192
+ if (!Array.isArray(mcporter.imports) || mcporter.imports.length === 0) {
193
+ fail("mcporter.json must include imports array");
194
+ }
195
+ if (!mcporter.mcpServers || typeof mcporter.mcpServers !== "object") {
196
+ fail("mcporter.json must include mcpServers object");
197
+ }
198
+
199
+ const openclaw = readJson(path.join(args.generatedDir, "openclaw-memory-qmd.json"));
200
+ if (openclaw?.memory?.backend !== "qmd") {
201
+ fail("openclaw-memory-qmd.json must set memory.backend=qmd");
202
+ }
203
+
204
+ const manifest = readJson(path.join(args.generatedDir, "manifest.json"));
205
+ verifyManifest(manifest, args.generatedDir);
206
+
207
+ if (args.checkReproducibility) {
208
+ verifyReproducibility(args.configPath, args.generatedDir);
209
+ }
210
+
211
+ console.log("MCP verification passed");
212
+ }
213
+
214
+ main();
@@ -1,11 +1,15 @@
1
1
  ---
2
2
  name: memory-guide
3
- description: Expert guide for using Squish memory system v0.6.0. Use when managing persistent memory, storing context, recalling information, or optimizing memory usage in Claude Code sessions.
3
+ description: Expert guide for using Squish memory system v0.9.0. Use when managing persistent memory, storing context, recalling information, or optimizing memory usage across MCP clients.
4
+ version: 0.9.0
5
+ author: michielhdoteth
6
+ tags: [memory, persistence, squish, guide, mcp, ai-assistant]
7
+ emoji: book
4
8
  ---
5
9
 
6
- # Squish Memory System Guide v0.6.0
10
+ # Squish Memory System Guide v0.9.0
7
11
 
8
- You are an expert at using the Squish persistent memory system for Claude Code.
12
+ You are an expert at using the Squish persistent memory system for AI coding assistants.
9
13
 
10
14
  ## When to Use Squish Memory
11
15
 
@@ -26,173 +30,227 @@ Use Squish memory tools proactively for:
26
30
  - Inject project-specific context
27
31
  - Maintain working memory across sessions
28
32
 
29
- ## Core Memory (Always In Context)
33
+ ## MCP Tools Reference
30
34
 
31
- **Tool:** `core_memory` with `action` parameter
35
+ ### Storing Memories
32
36
 
33
- **Sections:**
34
- - **persona**: Your identity, role, communication style
35
- - **user_info**: User's name, preferences, coding style, expertise level
36
- - **project_context**: Current project context, architecture, stack, patterns
37
- - **working_notes**: Active TODOs, current focus, blockers, next steps
37
+ **Tool:** `squish_remember`
38
38
 
39
- **Actions:**
40
- - `view` - See all core memory sections
41
- - `edit` - Replace content in a specific section
42
- - `append` - Add to existing section content
39
+ Store new memories with automatic embedding.
43
40
 
44
- **When to update:**
45
- - Beginning of new projects (project_context section)
46
- - When user shares preferences (user_info section)
47
- - At end of sessions (working_notes section with TODOs)
48
- - When identity/role changes (persona section)
41
+ ```typescript
42
+ // Store a preference
43
+ squish_remember({
44
+ content: "User prefers functional components with hooks over class components",
45
+ type: "preference",
46
+ tags: ["react", "preferences"]
47
+ })
49
48
 
50
- **Example usage:**
51
- ```
52
- /squish:core_memory action=append section=project_context text="Stack: TypeScript, React, PostgreSQL, Drizzle ORM"
53
- /squish:core_memory action=edit section=working_notes content="Authentication complete. Next: implement API rate limiting"
54
- /squish:core_memory action=view
55
- ```
49
+ // Store a fact
50
+ squish_remember({
51
+ content: "API uses JWT tokens with 1-hour expiration",
52
+ type: "fact",
53
+ tags: ["auth", "api"]
54
+ })
56
55
 
57
- ## Context Paging (Working Set)
56
+ // Store a decision
57
+ squish_remember({
58
+ content: "Chose PostgreSQL over MongoDB for better relational data",
59
+ type: "decision",
60
+ tags: ["database", "architecture"]
61
+ })
62
+ ```
58
63
 
59
- **Tool:** `context_paging` with `action` parameter
64
+ ### Searching Memories
60
65
 
61
- **Purpose:** Agent-controlled working memory for relevant information during tasks
66
+ **Tool:** `squish_search`
62
67
 
63
- **Actions:**
64
- - `load` - Load memories into working context
65
- - `evict` - Remove memories from working context
66
- - `view` - See what's currently loaded
68
+ Hybrid search across all memory types.
67
69
 
68
- **When to load memories:**
69
- - Before starting work: Load relevant past decisions, patterns
70
- - During debugging: Load related error memories
71
- - For refactoring: Load architectural notes
70
+ ```typescript
71
+ // Basic search
72
+ squish_search({ query: "authentication patterns", limit: 5 })
72
73
 
73
- **When to evict:**
74
- - Task completed
75
- - Context getting full (check context_status)
76
- - Information no longer relevant
74
+ // Search with project filter
75
+ squish_search({ query: "database schema", project: "/path/to/project", limit: 10 })
77
76
 
78
- **Example workflow:**
77
+ // Search specific memory type
78
+ squish_search({ query: "user preferences", type: "preference" })
79
79
  ```
80
- # Before starting authentication work
81
- /squish:search query="authentication patterns we discussed"
82
- /squish:context_paging action=load memoryIds=["id1","id2","id3"]
83
80
 
84
- # Check what's loaded
85
- /squish:context_paging action=view
81
+ ### Retrieving Memories
86
82
 
87
- # After completing task
88
- /squish:context_paging action=evict memoryIds=["id1","id2"]
89
- ```
83
+ **Tool:** `squish_recall`
90
84
 
91
- ## Storing Memories
85
+ Retrieve a specific memory by ID.
92
86
 
93
- **Tool:** `remember`
87
+ ```typescript
88
+ squish_recall({ memoryId: "uuid-here" })
89
+ ```
94
90
 
95
- **What to store:**
96
- - Decisions made and rationale
97
- - User preferences discovered
98
- - Code patterns agreed upon
99
- - Project-specific conventions
100
- - Blockers encountered and solutions
101
- - Technical specifications
91
+ ### Deleting Memories
102
92
 
103
- **Memory types:**
104
- - observation: Facts observed, patterns noticed
105
- - fact: Technical facts, specifications
106
- - decision: Decisions made with rationale
107
- - context: Project/domain context
108
- - preference: User preferences
93
+ **Tool:** `squish_forget`
109
94
 
110
- **Example:**
111
- ```
112
- /squish:remember content="User prefers functional components with hooks over class components" type=preference sector=autobiographical
113
- /squish:remember content="API uses JWT tokens with 1-hour expiration, refresh tokens stored in httpOnly cookies" type=fact sector=semantic
95
+ Delete a memory by ID.
96
+
97
+ ```typescript
98
+ squish_forget({ memoryId: "uuid-here" })
114
99
  ```
115
100
 
116
- ## Search and Recall
101
+ ### Updating Memories
117
102
 
118
- **Tools:** `search`, `recall`, `get_related`
103
+ **Tool:** `squish_update`
119
104
 
120
- **Search strategies:**
121
- - Semantic search: Natural language queries
122
- - Full-text search: Specific keywords, file names
123
- - Related memories: Find connected information via association graph
105
+ Update existing memory content, tags, or type.
124
106
 
125
- **Example:**
126
- ```
127
- /squish:search query="database schema design decisions" limit=5
128
- /squish:recall memoryId=abc123
129
- /squish:get_related memoryId=abc123 limit=10
107
+ ```typescript
108
+ squish_update({
109
+ memoryId: "uuid-here",
110
+ content: "Updated content",
111
+ tags: ["new", "tags"],
112
+ type: "fact"
113
+ })
130
114
  ```
131
115
 
132
- ## Best Practices
116
+ ### Graph Associations
133
117
 
134
- 1. **Store proactively**: Don't wait until end of session
135
- 2. **Be specific**: Include context, timestamps, rationale
136
- 3. **Use appropriate types**: Choose correct memory type and sector
137
- 4. **Load selectively**: Don't load everything, focus on relevant memories
138
- 5. **Maintain core memory**: Keep project/working sections current
139
- 6. **Use associations**: Related memories are powerful for context
140
-
141
- ## Memory Lifecycle
118
+ **Tool:** `squish_associate`
142
119
 
143
- - **Hot memories**: Recent, frequently accessed (auto-retained)
144
- - **Warm memories**: Older but still relevant
145
- - **Cold memories**: Old, rarely accessed (may be evicted)
146
- - **Protected**: Marked important, won't be evicted
147
- - **Pinned**: Auto-injected into context
120
+ Link related memories together.
148
121
 
149
- **Governance:**
150
- ```
151
- /squish:protect_memory memoryId=abc123
152
- /squish:pin_memory memoryId=abc123
122
+ ```typescript
123
+ squish_associate({
124
+ fromMemoryId: "uuid-1",
125
+ toMemoryId: "uuid-2",
126
+ type: "relates_to",
127
+ weight: 0.8
128
+ })
153
129
  ```
154
130
 
155
- ## Advanced Features
131
+ **Tool:** `squish_related`
156
132
 
157
- **Merge duplicates:**
158
- ```
159
- /squish:merge action=detect
160
- /squish:merge action=approve mergeId=xyz789
161
- ```
133
+ Find related memories via graph traversal.
162
134
 
163
- **Session summarization:**
164
- ```
165
- /squish:summarize_session
135
+ ```typescript
136
+ squish_related({
137
+ memoryId: "uuid-here",
138
+ depth: 2,
139
+ minWeight: 0.3
140
+ })
166
141
  ```
167
142
 
168
- **Health check:**
143
+ ### Context & Observations
144
+
145
+ **Tool:** `squish_context`
146
+
147
+ Get project context with relevant memories.
148
+
149
+ ```typescript
150
+ squish_context({ project: "/path/to/project", limit: 10 })
169
151
  ```
170
- /squish:health
152
+
153
+ **Tool:** `squish_observe`
154
+
155
+ Record observations about your work.
156
+
157
+ ```typescript
158
+ squish_observe({
159
+ type: "tool_use",
160
+ action: "Created new API endpoint",
161
+ summary: "Implemented POST /users endpoint",
162
+ target: "api/users.ts"
163
+ })
164
+
165
+ squish_observe({
166
+ type: "error",
167
+ action: "Database connection failed",
168
+ summary: "PostgreSQL timeout after 30s",
169
+ target: "db/index.ts"
170
+ })
171
171
  ```
172
172
 
173
- **Context status:**
173
+ ### QMD Search
174
+
175
+ **Tool:** `squish_qmd_search`
176
+
177
+ Search local markdown files using QMD.
178
+
179
+ ```typescript
180
+ squish_qmd_search({ query: "authentication", limit: 10 })
181
+ squish_qmd_search({ query: "react hooks", collection: "docs" })
174
182
  ```
175
- /squish:context_status
183
+
184
+ ### Utilities
185
+
186
+ **Tool:** `squish_embed`
187
+
188
+ Generate embeddings for text.
189
+
190
+ ```typescript
191
+ squish_embed({ text: "Text to embed" })
176
192
  ```
177
193
 
178
- ## Integration Pattern
194
+ **Tool:** `squish_health`
195
+
196
+ Check system health.
179
197
 
198
+ ```typescript
199
+ squish_health({})
180
200
  ```
181
- 1. Session start: /squish:core_memory action=view
182
- 2. Load relevant context: /squish:search + /squish:context_paging action=load
183
- 3. Work on task: Use loaded memories as reference
184
- 4. Store new learnings: /squish:remember key information
185
- 5. Update working memory: /squish:core_memory action=edit section=working_notes
186
- 6. Session end: /squish:context_paging action=evict, summarize if needed
201
+
202
+ **Tool:** `squish_stats`
203
+
204
+ Get memory statistics.
205
+
206
+ ```typescript
207
+ squish_stats({ project: "/path/to/project" })
187
208
  ```
188
209
 
189
- ## v0.6.0 Changes
210
+ **Tool:** `squish_projects`
211
+
212
+ List all projects.
213
+
214
+ ```typescript
215
+ squish_projects({})
216
+ ```
190
217
 
191
- **Consolidated Tools (11 tools, down from 18):**
192
- - `core_memory` - Replaces core_memory_view/edit/append
193
- - `context_paging` - Replaces load_to_context/evict_from_context/view_loaded
194
- - `merge` - Replaces detect_duplicates + merge operations
218
+ ## Best Practices
195
219
 
196
- **All tools now use `action` parameter for sub-operations.**
220
+ 1. **Store proactively**: Don't wait until end of session
221
+ 2. **Be specific**: Include context, timestamps, rationale
222
+ 3. **Use appropriate types**: Choose correct memory type and sector
223
+ 4. **Use associations**: Link related memories for better retrieval
224
+ 5. **Record observations**: Use `squish_observe` for tool usage patterns
225
+ 6. **Set importance**: Mark critical memories with high importance
226
+
227
+ ## Memory Types
228
+
229
+ - **observation**: Facts observed, patterns noticed, tool usage
230
+ - **fact**: Technical facts, specifications
231
+ - **decision**: Decisions made with rationale
232
+ - **context**: Project/domain context
233
+ - **preference**: User preferences
234
+
235
+ ## When to Use Each Tool
236
+
237
+ | Task | Use |
238
+ |------|-----|
239
+ | Remember something important | `squish_remember` |
240
+ | Find relevant past info | `squish_search` |
241
+ | Get specific memory | `squish_recall` |
242
+ | Delete incorrect memory | `squish_forget` |
243
+ | Update stored info | `squish_update` |
244
+ | Link related memories | `squish_associate` |
245
+ | Find connected info | `squish_related` |
246
+ | Get project overview | `squish_context` |
247
+ | Record work observations | `squish_observe` |
248
+ | Search local docs | `squish_qmd_search` |
249
+ | Check system status | `squish_health` |
250
+ | View memory stats | `squish_stats` |
251
+
252
+ ## v0.9.0 Notes
253
+
254
+ **All tools use consistent input schema patterns.**
197
255
 
198
256
  Remember: Squish is your persistent memory. Use it actively to maintain continuity across sessions and provide better assistance.