squish-memory 0.8.2 → 0.9.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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.env.mcp +30 -0
- package/.mcp.json +2 -5
- package/CHANGELOG.md +111 -0
- package/QUICK-START.md +65 -0
- package/README.md +188 -530
- package/commands/managed-sync.ts +69 -0
- package/commands/mcp-server.ts +519 -0
- package/config/mcp-cli-fallback-policy.json +22 -0
- package/config/mcp-migration-map.json +22 -0
- package/config/mcp-mode-semantics.json +21 -0
- package/config/mcp-remote-auth.json +36 -0
- package/config/mcp-universal.schema.json +48 -0
- package/config/mcp.json +38 -0
- package/config/remote-memory-policy.json +32 -0
- package/dist/algorithms/merge/detection/hash-filters.js +2 -2
- package/dist/algorithms/merge/detection/hash-filters.js.map +1 -1
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts +5 -2
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -1
- package/dist/algorithms/merge/detection/two-stage-detector.js +139 -22
- package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -1
- package/dist/commands/managed-sync.d.ts +10 -0
- package/dist/commands/managed-sync.d.ts.map +1 -0
- package/dist/commands/managed-sync.js +64 -0
- package/dist/commands/managed-sync.js.map +1 -0
- package/dist/commands/mcp-server.d.ts +3 -0
- package/dist/commands/mcp-server.d.ts.map +1 -0
- package/dist/commands/mcp-server.js +389 -0
- package/dist/commands/mcp-server.js.map +1 -0
- package/dist/config.d.ts +24 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +32 -1
- package/dist/config.js.map +1 -1
- package/dist/core/associations.d.ts +1 -1
- package/dist/core/associations.d.ts.map +1 -1
- package/dist/core/consolidation.d.ts +31 -0
- package/dist/core/consolidation.d.ts.map +1 -1
- package/dist/core/consolidation.js +237 -29
- package/dist/core/consolidation.js.map +1 -1
- package/dist/core/embeddings/google-multimodal.d.ts +14 -0
- package/dist/core/embeddings/google-multimodal.d.ts.map +1 -0
- package/dist/core/embeddings/google-multimodal.js +142 -0
- package/dist/core/embeddings/google-multimodal.js.map +1 -0
- package/dist/core/embeddings.d.ts +3 -2
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +61 -39
- package/dist/core/embeddings.js.map +1 -1
- package/dist/core/mcp/client.d.ts +17 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +101 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/index.d.ts +6 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +6 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/server.d.ts +18 -0
- package/dist/core/mcp/server.d.ts.map +1 -0
- package/dist/core/mcp/server.js +131 -0
- package/dist/core/mcp/server.js.map +1 -0
- package/dist/core/mcp/standalone-server.d.ts +13 -0
- package/dist/core/mcp/standalone-server.d.ts.map +1 -0
- package/dist/core/mcp/standalone-server.js +46 -0
- package/dist/core/mcp/standalone-server.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +9 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +262 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/mcp/types.d.ts +315 -0
- package/dist/core/mcp/types.d.ts.map +1 -0
- package/dist/core/mcp/types.js +48 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/memory/categorizer.d.ts +27 -0
- package/dist/core/memory/categorizer.d.ts.map +1 -0
- package/dist/core/memory/categorizer.js +304 -0
- package/dist/core/memory/categorizer.js.map +1 -0
- package/dist/core/memory/conflict-detector.d.ts +7 -0
- package/dist/core/memory/conflict-detector.d.ts.map +1 -0
- package/dist/core/memory/conflict-detector.js +43 -0
- package/dist/core/memory/conflict-detector.js.map +1 -0
- package/dist/core/memory/context-collector.d.ts +10 -0
- package/dist/core/memory/context-collector.d.ts.map +1 -0
- package/dist/core/memory/context-collector.js +55 -0
- package/dist/core/memory/context-collector.js.map +1 -0
- package/dist/core/memory/contradiction-resolver.d.ts +40 -0
- package/dist/core/memory/contradiction-resolver.d.ts.map +1 -0
- package/dist/core/memory/contradiction-resolver.js +368 -0
- package/dist/core/memory/contradiction-resolver.js.map +1 -0
- package/dist/core/memory/edit-workflow.d.ts +19 -0
- package/dist/core/memory/edit-workflow.d.ts.map +1 -0
- package/dist/core/memory/edit-workflow.js +120 -0
- package/dist/core/memory/edit-workflow.js.map +1 -0
- package/dist/core/memory/feedback-tracker.d.ts +12 -0
- package/dist/core/memory/feedback-tracker.d.ts.map +1 -0
- package/dist/core/memory/feedback-tracker.js +151 -0
- package/dist/core/memory/feedback-tracker.js.map +1 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +11 -12
- package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/core/memory/hybrid-retrieval.js +56 -28
- package/dist/core/memory/hybrid-retrieval.js.map +1 -1
- package/dist/core/memory/hybrid-scorer.d.ts +5 -16
- package/dist/core/memory/hybrid-scorer.d.ts.map +1 -1
- package/dist/core/memory/hybrid-scorer.js +161 -125
- package/dist/core/memory/hybrid-scorer.js.map +1 -1
- package/dist/core/memory/hybrid-search.js +53 -19
- package/dist/core/memory/hybrid-search.js.map +1 -1
- package/dist/core/memory/memories.d.ts +4 -0
- package/dist/core/memory/memories.d.ts.map +1 -1
- package/dist/core/memory/memories.js +133 -60
- package/dist/core/memory/memories.js.map +1 -1
- package/dist/core/memory/progressive-disclosure.d.ts +43 -0
- package/dist/core/memory/progressive-disclosure.d.ts.map +1 -0
- package/dist/core/memory/progressive-disclosure.js +280 -0
- package/dist/core/memory/progressive-disclosure.js.map +1 -0
- package/dist/core/memory/query-rewriter.d.ts +13 -0
- package/dist/core/memory/query-rewriter.d.ts.map +1 -0
- package/dist/core/memory/query-rewriter.js +118 -0
- package/dist/core/memory/query-rewriter.js.map +1 -0
- package/dist/core/memory/response-analyzer.d.ts +9 -0
- package/dist/core/memory/response-analyzer.d.ts.map +1 -0
- package/dist/core/memory/response-analyzer.js +61 -0
- package/dist/core/memory/response-analyzer.js.map +1 -0
- package/dist/core/memory/stats.d.ts +17 -0
- package/dist/core/memory/stats.d.ts.map +1 -0
- package/dist/core/memory/stats.js +87 -0
- package/dist/core/memory/stats.js.map +1 -0
- package/dist/core/memory/telemetry.d.ts +69 -0
- package/dist/core/memory/telemetry.d.ts.map +1 -0
- package/dist/core/memory/telemetry.js +313 -0
- package/dist/core/memory/telemetry.js.map +1 -0
- package/dist/core/memory/temporal-facts.d.ts +41 -0
- package/dist/core/memory/temporal-facts.d.ts.map +1 -0
- package/dist/core/memory/temporal-facts.js +262 -0
- package/dist/core/memory/temporal-facts.js.map +1 -0
- package/dist/core/memory/trigger-detector.d.ts +14 -0
- package/dist/core/memory/trigger-detector.d.ts.map +1 -0
- package/dist/core/memory/trigger-detector.js +42 -0
- package/dist/core/memory/trigger-detector.js.map +1 -0
- package/dist/core/memory/write-gate.d.ts +54 -0
- package/dist/core/memory/write-gate.d.ts.map +1 -0
- package/dist/core/memory/write-gate.js +210 -0
- package/dist/core/memory/write-gate.js.map +1 -0
- package/dist/core/projects.d.ts +2 -0
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +33 -0
- package/dist/core/projects.js.map +1 -1
- package/dist/core/scheduler/cron-scheduler.d.ts +32 -0
- package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/cron-scheduler.js +238 -0
- package/dist/core/scheduler/cron-scheduler.js.map +1 -0
- package/dist/core/scheduler/heartbeat.d.ts +11 -0
- package/dist/core/scheduler/heartbeat.d.ts.map +1 -0
- package/dist/core/scheduler/heartbeat.js +73 -0
- package/dist/core/scheduler/heartbeat.js.map +1 -0
- package/dist/core/scheduler/index.d.ts +8 -0
- package/dist/core/scheduler/index.d.ts.map +1 -0
- package/dist/core/scheduler/index.js +8 -0
- package/dist/core/scheduler/index.js.map +1 -0
- package/dist/core/scheduler/job-runner.d.ts +11 -0
- package/dist/core/scheduler/job-runner.d.ts.map +1 -0
- package/dist/core/scheduler/job-runner.js +161 -0
- package/dist/core/scheduler/job-runner.js.map +1 -0
- package/dist/core/session/auto-load.d.ts +6 -0
- package/dist/core/session/auto-load.d.ts.map +1 -0
- package/dist/core/session/auto-load.js +119 -0
- package/dist/core/session/auto-load.js.map +1 -0
- package/dist/core/session/index.d.ts +7 -0
- package/dist/core/session/index.d.ts.map +1 -0
- package/dist/core/session/index.js +7 -0
- package/dist/core/session/index.js.map +1 -0
- package/dist/core/session/types.d.ts +26 -0
- package/dist/core/session/types.d.ts.map +1 -0
- package/dist/core/session/types.js +10 -0
- package/dist/core/session/types.js.map +1 -0
- package/dist/core/snapshots/comparison.d.ts.map +1 -1
- package/dist/core/snapshots/comparison.js +8 -2
- package/dist/core/snapshots/comparison.js.map +1 -1
- package/dist/core/utils/content-extraction.d.ts.map +1 -1
- package/dist/core/utils/content-extraction.js +11 -1
- package/dist/core/utils/content-extraction.js.map +1 -1
- package/dist/core/utils/summarization-helpers.d.ts.map +1 -1
- package/dist/core/utils/summarization-helpers.js +4 -1
- package/dist/core/utils/summarization-helpers.js.map +1 -1
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +26 -3
- package/dist/core/utils.js.map +1 -1
- package/dist/core/worker.d.ts +20 -0
- package/dist/core/worker.d.ts.map +1 -1
- package/dist/core/worker.js +86 -0
- package/dist/core/worker.js.map +1 -1
- package/dist/db/adapter.d.ts +1 -5
- package/dist/db/adapter.d.ts.map +1 -1
- package/dist/db/adapter.js +125 -12
- package/dist/db/adapter.js.map +1 -1
- package/dist/db/bootstrap.d.ts.map +1 -1
- package/dist/db/bootstrap.js +178 -3
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +7 -4
- package/dist/db/index.js.map +1 -1
- package/dist/drizzle/schema-sqlite.d.ts +1953 -612
- package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
- package/dist/drizzle/schema-sqlite.js +134 -0
- package/dist/drizzle/schema-sqlite.js.map +1 -1
- package/dist/drizzle/schema.d.ts +684 -3
- package/dist/drizzle/schema.d.ts.map +1 -1
- package/dist/drizzle/schema.js +81 -1
- package/dist/drizzle/schema.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +152 -13
- package/dist/index.js.map +1 -1
- package/package.json +125 -103
- package/scripts/build-release.sh +33 -0
- package/scripts/db/check-db.mjs +88 -0
- package/scripts/db/fix-all-columns.mjs +52 -0
- package/scripts/db/fix-schema-all.mjs +55 -0
- package/scripts/db/fix-schema-full.mjs +46 -0
- package/scripts/db/fix-schema.mjs +38 -0
- package/scripts/db/init-db.mjs +13 -0
- package/scripts/db/recreate-db.mjs +14 -0
- package/scripts/generate-mcp.mjs +264 -0
- package/scripts/github-release.sh +61 -0
- package/scripts/init-dirs.mjs +13 -0
- package/scripts/init-dirs.ts +15 -0
- package/scripts/install-mcp.mjs +116 -0
- package/scripts/install-web.sh +120 -0
- package/scripts/install.mjs +340 -0
- package/scripts/openclaw-bootstrap.mjs +127 -0
- package/scripts/package-release.sh +71 -0
- package/scripts/remote-preflight.mjs +62 -0
- package/scripts/squish-fallback.mjs +132 -0
- package/scripts/test/test-all-systems.mjs +139 -0
- package/scripts/test/test-memory-system.mjs +139 -0
- package/scripts/test/test-v0.5.0.mjs +210 -0
- package/scripts/verify-mcp.mjs +214 -0
- package/skills/memory-guide/SKILL.md +181 -123
- package/skills/squish-cli/SKILL.md +200 -0
- package/skills/squish-mcp/SKILL.md +311 -0
- package/skills/squish-memory/SKILL.md +100 -62
- package/skills/squish-memory/claude-desktop.json +12 -0
- package/skills/squish-memory/install.mjs +335 -0
- package/skills/squish-memory/install.sh +94 -62
- package/skills/squish-memory/openclaw.json +13 -0
- package/skills/squish-memory/opencode.json +14 -0
- package/skills/squish-memory/skill.json +32 -0
- package/dist/adapters/claude-code/capture.d.ts +0 -11
- package/dist/adapters/claude-code/capture.d.ts.map +0 -1
- package/dist/adapters/claude-code/capture.js +0 -100
- package/dist/adapters/claude-code/capture.js.map +0 -1
- package/dist/adapters/claude-code/index.d.ts +0 -5
- package/dist/adapters/claude-code/index.d.ts.map +0 -1
- package/dist/adapters/claude-code/index.js +0 -6
- package/dist/adapters/claude-code/index.js.map +0 -1
- package/dist/adapters/claude-code/injection.d.ts +0 -34
- package/dist/adapters/claude-code/injection.d.ts.map +0 -1
- package/dist/adapters/claude-code/injection.js +0 -127
- package/dist/adapters/claude-code/injection.js.map +0 -1
- package/dist/adapters/claude-code/plugin-wrapper.d.ts +0 -21
- package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +0 -1
- package/dist/adapters/claude-code/plugin-wrapper.js +0 -239
- package/dist/adapters/claude-code/plugin-wrapper.js.map +0 -1
- package/dist/adapters/claude-code/types.d.ts +0 -46
- package/dist/adapters/claude-code/types.d.ts.map +0 -1
- package/dist/adapters/claude-code/types.js +0 -6
- 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.
|
|
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.
|
|
10
|
+
# Squish Memory System Guide v0.9.0
|
|
7
11
|
|
|
8
|
-
You are an expert at using the Squish persistent memory system for
|
|
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
|
-
##
|
|
33
|
+
## MCP Tools Reference
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
### Storing Memories
|
|
32
36
|
|
|
33
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
+
### Searching Memories
|
|
60
65
|
|
|
61
|
-
**
|
|
66
|
+
**Tool:** `squish_search`
|
|
62
67
|
|
|
63
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
- For refactoring: Load architectural notes
|
|
70
|
+
```typescript
|
|
71
|
+
// Basic search
|
|
72
|
+
squish_search({ query: "authentication patterns", limit: 5 })
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
/squish:context_paging action=view
|
|
81
|
+
### Retrieving Memories
|
|
86
82
|
|
|
87
|
-
|
|
88
|
-
/squish:context_paging action=evict memoryIds=["id1","id2"]
|
|
89
|
-
```
|
|
83
|
+
**Tool:** `squish_recall`
|
|
90
84
|
|
|
91
|
-
|
|
85
|
+
Retrieve a specific memory by ID.
|
|
92
86
|
|
|
93
|
-
|
|
87
|
+
```typescript
|
|
88
|
+
squish_recall({ memoryId: "uuid-here" })
|
|
89
|
+
```
|
|
94
90
|
|
|
95
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
95
|
+
Delete a memory by ID.
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
squish_forget({ memoryId: "uuid-here" })
|
|
114
99
|
```
|
|
115
100
|
|
|
116
|
-
|
|
101
|
+
### Updating Memories
|
|
117
102
|
|
|
118
|
-
**
|
|
103
|
+
**Tool:** `squish_update`
|
|
119
104
|
|
|
120
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
116
|
+
### Graph Associations
|
|
133
117
|
|
|
134
|
-
|
|
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
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
131
|
+
**Tool:** `squish_related`
|
|
156
132
|
|
|
157
|
-
|
|
158
|
-
```
|
|
159
|
-
/squish:merge action=detect
|
|
160
|
-
/squish:merge action=approve mergeId=xyz789
|
|
161
|
-
```
|
|
133
|
+
Find related memories via graph traversal.
|
|
162
134
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
135
|
+
```typescript
|
|
136
|
+
squish_related({
|
|
137
|
+
memoryId: "uuid-here",
|
|
138
|
+
depth: 2,
|
|
139
|
+
minWeight: 0.3
|
|
140
|
+
})
|
|
166
141
|
```
|
|
167
142
|
|
|
168
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
194
|
+
**Tool:** `squish_health`
|
|
195
|
+
|
|
196
|
+
Check system health.
|
|
179
197
|
|
|
198
|
+
```typescript
|
|
199
|
+
squish_health({})
|
|
180
200
|
```
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
210
|
+
**Tool:** `squish_projects`
|
|
211
|
+
|
|
212
|
+
List all projects.
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
squish_projects({})
|
|
216
|
+
```
|
|
190
217
|
|
|
191
|
-
|
|
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
|
-
**
|
|
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.
|