squish-memory 0.9.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.mcp.example +14 -11
- package/CHANGELOG.md +68 -0
- package/README.md +82 -9
- package/bin/squish-add.mjs +32 -0
- package/bin/squish-rm.mjs +21 -0
- package/config/plugin-manifest.json +152 -0
- package/config/plugin-manifest.schema.json +244 -0
- package/config/settings.json +51 -0
- package/dist/algorithms/{merge/analytics → analytics}/token-estimator.d.ts +1 -1
- package/dist/algorithms/analytics/token-estimator.d.ts.map +1 -0
- package/dist/algorithms/{merge/analytics → analytics}/token-estimator.js +3 -3
- package/dist/algorithms/analytics/token-estimator.js.map +1 -0
- package/dist/algorithms/detection/hash-filters.d.ts.map +1 -0
- package/dist/algorithms/detection/hash-filters.js.map +1 -0
- package/dist/algorithms/{merge/detection → detection}/semantic-ranker.d.ts +1 -1
- package/dist/algorithms/detection/semantic-ranker.d.ts.map +1 -0
- package/dist/algorithms/{merge/detection → detection}/semantic-ranker.js +1 -1
- package/dist/algorithms/detection/semantic-ranker.js.map +1 -0
- package/dist/algorithms/{merge/detection → detection}/two-stage-detector.d.ts +1 -1
- package/dist/algorithms/detection/two-stage-detector.d.ts.map +1 -0
- package/dist/algorithms/{merge/detection → detection}/two-stage-detector.js +4 -4
- package/dist/algorithms/detection/two-stage-detector.js.map +1 -0
- package/dist/algorithms/handlers/approve-merge.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/approve-merge.js +4 -4
- package/dist/algorithms/handlers/approve-merge.js.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.d.ts +1 -1
- package/dist/algorithms/handlers/detect-duplicates.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.js +55 -75
- package/dist/algorithms/handlers/detect-duplicates.js.map +1 -0
- package/dist/algorithms/handlers/get-stats.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/get-stats.js +3 -3
- package/dist/algorithms/handlers/get-stats.js.map +1 -0
- package/dist/algorithms/handlers/list-proposals.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/list-proposals.js +3 -3
- package/dist/algorithms/handlers/list-proposals.js.map +1 -0
- package/dist/algorithms/handlers/preview-merge.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/preview-merge.js +3 -3
- package/dist/algorithms/handlers/preview-merge.js.map +1 -0
- package/dist/algorithms/handlers/reject-merge.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/reject-merge.js +3 -3
- package/dist/algorithms/handlers/reject-merge.js.map +1 -0
- package/dist/algorithms/handlers/reverse-merge.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.js +3 -3
- package/dist/algorithms/handlers/reverse-merge.js.map +1 -0
- package/dist/algorithms/{merge/safety → safety}/safety-checks.d.ts +1 -1
- package/dist/algorithms/safety/safety-checks.d.ts.map +1 -0
- package/dist/algorithms/safety/safety-checks.js +179 -0
- package/dist/algorithms/safety/safety-checks.js.map +1 -0
- package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.d.ts +1 -1
- package/dist/algorithms/strategies/merge-strategies.d.ts.map +1 -0
- package/dist/algorithms/strategies/merge-strategies.js.map +1 -0
- package/dist/algorithms/utils/response-builder.d.ts +28 -0
- package/dist/algorithms/utils/response-builder.d.ts.map +1 -0
- package/dist/algorithms/utils/response-builder.js +37 -0
- package/dist/algorithms/utils/response-builder.js.map +1 -0
- package/dist/api/web/web.d.ts.map +1 -1
- package/dist/api/web/web.js +452 -472
- package/dist/api/web/web.js.map +1 -1
- package/dist/commands/mcp-server.js +7 -3
- package/dist/commands/mcp-server.js.map +1 -1
- package/dist/config.d.ts +10 -10
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +102 -55
- package/dist/config.js.map +1 -1
- package/dist/core/associations.js +2 -2
- package/dist/core/associations.js.map +1 -1
- package/dist/core/embeddings.d.ts +1 -1
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +10 -67
- package/dist/core/embeddings.js.map +1 -1
- package/dist/core/layers/generator.d.ts +25 -0
- package/dist/core/layers/generator.d.ts.map +1 -0
- package/dist/core/layers/generator.js +76 -0
- package/dist/core/layers/generator.js.map +1 -0
- package/dist/core/local-embeddings.d.ts +3 -11
- package/dist/core/local-embeddings.d.ts.map +1 -1
- package/dist/core/local-embeddings.js +2 -76
- package/dist/core/local-embeddings.js.map +1 -1
- package/dist/core/mcp/tools.d.ts.map +1 -1
- package/dist/core/mcp/tools.js +71 -0
- package/dist/core/mcp/tools.js.map +1 -1
- package/dist/core/memory/context-collector.d.ts.map +1 -1
- package/dist/core/memory/context-collector.js +3 -2
- package/dist/core/memory/context-collector.js.map +1 -1
- package/dist/core/memory/feedback-tracker.d.ts.map +1 -1
- package/dist/core/memory/feedback-tracker.js +10 -6
- package/dist/core/memory/feedback-tracker.js.map +1 -1
- package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/core/memory/hybrid-retrieval.js +49 -1
- package/dist/core/memory/hybrid-retrieval.js.map +1 -1
- package/dist/core/memory/hybrid-search.d.ts.map +1 -1
- package/dist/core/memory/hybrid-search.js +32 -39
- package/dist/core/memory/hybrid-search.js.map +1 -1
- package/dist/core/memory/memories.d.ts.map +1 -1
- package/dist/core/memory/memories.js +1 -7
- package/dist/core/memory/memories.js.map +1 -1
- package/dist/core/memory/progressive-disclosure.d.ts.map +1 -1
- package/dist/core/memory/progressive-disclosure.js.map +1 -1
- package/dist/core/memory/query-rewriter.js +9 -9
- package/dist/core/memory/stats.js +5 -5
- package/dist/core/namespaces/index.d.ts +71 -0
- package/dist/core/namespaces/index.d.ts.map +1 -0
- package/dist/core/namespaces/index.js +305 -0
- package/dist/core/namespaces/index.js.map +1 -0
- package/dist/core/namespaces/uri-parser.d.ts +31 -0
- package/dist/core/namespaces/uri-parser.d.ts.map +1 -0
- package/dist/core/namespaces/uri-parser.js +74 -0
- package/dist/core/namespaces/uri-parser.js.map +1 -0
- package/dist/core/observations.d.ts.map +1 -1
- package/dist/core/observations.js +3 -12
- package/dist/core/observations.js.map +1 -1
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +0 -12
- package/dist/core/projects.js.map +1 -1
- package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -1
- package/dist/core/scheduler/cron-scheduler.js +26 -7
- package/dist/core/scheduler/cron-scheduler.js.map +1 -1
- package/dist/core/scheduler/job-runner.js +8 -5
- package/dist/core/scheduler/job-runner.js.map +1 -1
- package/dist/core/search/conversations.js +33 -33
- package/dist/core/session-hooks/self-iteration-job.d.ts +20 -0
- package/dist/core/session-hooks/self-iteration-job.d.ts.map +1 -0
- package/dist/core/session-hooks/self-iteration-job.js +282 -0
- package/dist/core/session-hooks/self-iteration-job.js.map +1 -0
- package/dist/core/session-hooks/session-hooks.d.ts +18 -0
- package/dist/core/session-hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/session-hooks/session-hooks.js +58 -0
- package/dist/core/session-hooks/session-hooks.js.map +1 -0
- package/dist/core/tracing/collector.d.ts +111 -0
- package/dist/core/tracing/collector.d.ts.map +1 -0
- package/dist/core/tracing/collector.js +350 -0
- package/dist/core/tracing/collector.js.map +1 -0
- package/dist/core/tracing/visualizer.d.ts +32 -0
- package/dist/core/tracing/visualizer.d.ts.map +1 -0
- package/dist/core/tracing/visualizer.js +165 -0
- package/dist/core/tracing/visualizer.js.map +1 -0
- package/dist/db/adapter.d.ts +6 -1
- package/dist/db/adapter.d.ts.map +1 -1
- package/dist/db/adapter.js +54 -126
- package/dist/db/adapter.js.map +1 -1
- package/dist/db/bootstrap.js +477 -477
- package/dist/db/index.d.ts +5 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/drizzle/schema-sqlite.d.ts +384 -0
- package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
- package/dist/drizzle/schema-sqlite.js +65 -0
- package/dist/drizzle/schema-sqlite.js.map +1 -1
- package/dist/drizzle/schema.d.ts +368 -0
- package/dist/drizzle/schema.d.ts.map +1 -1
- package/dist/drizzle/schema.js +63 -0
- package/dist/drizzle/schema.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +101 -62
- package/dist/index.js.map +1 -1
- package/generated/mcp/manifest.json +23 -0
- package/generated/mcp/mcp-servers.json +25 -0
- package/generated/mcp/mcporter.json +34 -0
- package/generated/mcp/openclaw-memory-qmd.json +17 -0
- package/generated/mcp/runtime.json +12 -0
- package/package.json +70 -28
- package/packages/plugin-claude-code/README.md +73 -0
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +35 -0
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts.map +1 -0
- package/packages/plugin-claude-code/dist/plugin-wrapper.js +191 -0
- package/packages/plugin-claude-code/dist/plugin-wrapper.js.map +1 -0
- package/packages/plugin-claude-code/package.json +31 -0
- package/packages/plugin-openclaw/README.md +70 -0
- package/packages/plugin-openclaw/dist/index.d.ts +49 -0
- package/packages/plugin-openclaw/dist/index.d.ts.map +1 -0
- package/packages/plugin-openclaw/dist/index.js +262 -0
- package/packages/plugin-openclaw/dist/index.js.map +1 -0
- package/packages/plugin-openclaw/openclaw.plugin.json +94 -0
- package/packages/plugin-openclaw/package.json +31 -0
- package/packages/plugin-opencode/install.mjs +217 -0
- package/packages/plugin-opencode/package.json +21 -0
- package/scripts/dependency-manager.mjs +217 -0
- package/scripts/detect-clients.mjs +78 -0
- package/scripts/install-interactive.mjs +674 -0
- package/scripts/install-plugin.mjs +415 -0
- package/scripts/test-interactive.mjs +131 -0
- package/commands/managed-sync.ts +0 -69
- package/commands/mcp-server.ts +0 -519
- package/dist/algorithms/merge/analytics/token-estimator.d.ts.map +0 -1
- package/dist/algorithms/merge/analytics/token-estimator.js.map +0 -1
- package/dist/algorithms/merge/detection/hash-filters.d.ts.map +0 -1
- package/dist/algorithms/merge/detection/hash-filters.js.map +0 -1
- package/dist/algorithms/merge/detection/semantic-ranker.d.ts.map +0 -1
- package/dist/algorithms/merge/detection/semantic-ranker.js.map +0 -1
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +0 -1
- package/dist/algorithms/merge/detection/two-stage-detector.js.map +0 -1
- package/dist/algorithms/merge/handlers/approve-merge.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/approve-merge.js.map +0 -1
- package/dist/algorithms/merge/handlers/detect-duplicates.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/detect-duplicates.js.map +0 -1
- package/dist/algorithms/merge/handlers/get-stats.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/get-stats.js.map +0 -1
- package/dist/algorithms/merge/handlers/list-proposals.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/list-proposals.js.map +0 -1
- package/dist/algorithms/merge/handlers/preview-merge.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/preview-merge.js.map +0 -1
- package/dist/algorithms/merge/handlers/reject-merge.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/reject-merge.js.map +0 -1
- package/dist/algorithms/merge/handlers/reverse-merge.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/reverse-merge.js.map +0 -1
- package/dist/algorithms/merge/safety/safety-checks.d.ts.map +0 -1
- package/dist/algorithms/merge/safety/safety-checks.js +0 -215
- package/dist/algorithms/merge/safety/safety-checks.js.map +0 -1
- package/dist/algorithms/merge/strategies/merge-strategies.d.ts.map +0 -1
- package/dist/algorithms/merge/strategies/merge-strategies.js.map +0 -1
- package/dist/core/embeddings/qmd-provider.d.ts +0 -65
- package/dist/core/embeddings/qmd-provider.d.ts.map +0 -1
- package/dist/core/embeddings/qmd-provider.js +0 -133
- package/dist/core/embeddings/qmd-provider.js.map +0 -1
- package/scripts/init-dirs.ts +0 -15
- /package/dist/algorithms/{merge/detection → detection}/hash-filters.d.ts +0 -0
- /package/dist/algorithms/{merge/detection → detection}/hash-filters.js +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/approve-merge.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/get-stats.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/list-proposals.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/preview-merge.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/reject-merge.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.d.ts +0 -0
- /package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.js +0 -0
|
@@ -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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
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
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
11
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
12
|
+
import fs from "node:fs";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
class OpenClawSquishPlugin {
|
|
18
|
+
config;
|
|
19
|
+
client = null;
|
|
20
|
+
syncInterval = null;
|
|
21
|
+
workspaceDir;
|
|
22
|
+
agentId;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.config = {
|
|
25
|
+
baseUrl: "http://127.0.0.1:8767",
|
|
26
|
+
autoStart: false,
|
|
27
|
+
sync: { enabled: true, interval: "5m", extraPaths: [] },
|
|
28
|
+
...config
|
|
29
|
+
};
|
|
30
|
+
this.workspaceDir = process.env.OPENCLAW_WORKSPACE || process.cwd();
|
|
31
|
+
this.agentId = process.env.OPENCLAW_AGENT_ID || "default";
|
|
32
|
+
console.log("[SquishPlugin] Initializing with workspace:", this.workspaceDir);
|
|
33
|
+
}
|
|
34
|
+
async initialize() {
|
|
35
|
+
// Connect to Squish MCP
|
|
36
|
+
await this.connect();
|
|
37
|
+
// Start sync if enabled
|
|
38
|
+
if (this.config.sync?.enabled) {
|
|
39
|
+
this.startSync();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async connect() {
|
|
43
|
+
try {
|
|
44
|
+
// If baseUrl is set, try HTTP connection
|
|
45
|
+
if (this.config.baseUrl && this.config.baseUrl.startsWith("http")) {
|
|
46
|
+
console.log("[SquishPlugin] Connecting via HTTP to", this.config.baseUrl);
|
|
47
|
+
// TODO: Implement HTTP client
|
|
48
|
+
await this.connectViaHTTP(this.config.baseUrl);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Use stdio for local spawn or existing Squish
|
|
52
|
+
console.log("[SquishPlugin] Connecting via stdio");
|
|
53
|
+
await this.connectViaStdio();
|
|
54
|
+
}
|
|
55
|
+
console.log("[SquishPlugin] ✓ Connected to Squish");
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error("[SquishPlugin] ✗ Connection failed:", error?.message || error);
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async connectViaStdio() {
|
|
63
|
+
this.client = new Client({ name: "openclaw-squish-plugin", version: "1.0.0" }, { capabilities: {} });
|
|
64
|
+
const transport = new StdioClientTransport({
|
|
65
|
+
command: "node",
|
|
66
|
+
args: [path.join(__dirname, "..", "..", "..", "dist", "commands", "mcp-server.cjs"), "--stdio"],
|
|
67
|
+
env: {
|
|
68
|
+
...process.env,
|
|
69
|
+
SQUISH_MODE: "local",
|
|
70
|
+
SQUISH_DATA_DIR: path.join(os.homedir(), ".squish", "openclaw")
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
await this.client.connect(transport);
|
|
74
|
+
// Verify connection with health check
|
|
75
|
+
const result = await this.client.callTool({ name: "squish_health", arguments: {} });
|
|
76
|
+
console.log("[SquishPlugin] Health:", result.content);
|
|
77
|
+
}
|
|
78
|
+
async connectViaHTTP(url) {
|
|
79
|
+
// Implement HTTP connection using fetch to /mcp endpoints
|
|
80
|
+
throw new Error("HTTP mode not yet implemented - use stdio");
|
|
81
|
+
}
|
|
82
|
+
startSync() {
|
|
83
|
+
if (this.config.sync?.interval) {
|
|
84
|
+
const ms = this.parseInterval(this.config.sync.interval);
|
|
85
|
+
this.syncInterval = setInterval(() => this.performSync(), ms);
|
|
86
|
+
}
|
|
87
|
+
// Initial sync
|
|
88
|
+
setTimeout(() => this.performSync(), 1000);
|
|
89
|
+
}
|
|
90
|
+
parseInterval(interval) {
|
|
91
|
+
const match = interval.match(/^(\d+)([smhd])$/);
|
|
92
|
+
if (!match)
|
|
93
|
+
throw new Error(`Invalid interval: ${interval}`);
|
|
94
|
+
const value = parseInt(match[1], 10);
|
|
95
|
+
const unit = match[2];
|
|
96
|
+
const multipliers = { s: 1000, m: 60000, h: 3600000, d: 86400000 };
|
|
97
|
+
return value * (multipliers[unit]);
|
|
98
|
+
}
|
|
99
|
+
async performSync() {
|
|
100
|
+
try {
|
|
101
|
+
console.log("[SquishPlugin] Starting workspace sync...");
|
|
102
|
+
// Find markdown files in workspace
|
|
103
|
+
const files = this.collectMarkdownFiles();
|
|
104
|
+
console.log(`[SquishPlugin] Found ${files.length} files to sync`);
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
await this.syncFile(file);
|
|
107
|
+
}
|
|
108
|
+
console.log("[SquishPlugin] Sync complete");
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error("[SquishPlugin] Sync error:", error?.message || error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
collectMarkdownFiles() {
|
|
115
|
+
const files = [];
|
|
116
|
+
const extraPaths = this.config.sync?.extraPaths || [];
|
|
117
|
+
const searchPaths = [this.workspaceDir, ...extraPaths.map(p => path.join(this.workspaceDir, p))];
|
|
118
|
+
for (const searchPath of searchPaths) {
|
|
119
|
+
if (!fs.existsSync(searchPath))
|
|
120
|
+
continue;
|
|
121
|
+
const walk = (dir) => {
|
|
122
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
123
|
+
for (const entry of entries) {
|
|
124
|
+
const fullPath = path.join(dir, entry.name);
|
|
125
|
+
if (entry.isDirectory()) {
|
|
126
|
+
walk(fullPath);
|
|
127
|
+
}
|
|
128
|
+
else if (entry.name.endsWith(".md")) {
|
|
129
|
+
files.push(fullPath);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
walk(searchPath);
|
|
134
|
+
}
|
|
135
|
+
return files;
|
|
136
|
+
}
|
|
137
|
+
async syncFile(filePath) {
|
|
138
|
+
try {
|
|
139
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
140
|
+
const relativePath = path.relative(this.workspaceDir, filePath);
|
|
141
|
+
// Store as memory with metadata
|
|
142
|
+
await this.client?.callTool({
|
|
143
|
+
name: "squish_remember",
|
|
144
|
+
arguments: {
|
|
145
|
+
content: content,
|
|
146
|
+
type: "context",
|
|
147
|
+
tags: ["openclaw-sync", relativePath],
|
|
148
|
+
metadata: {
|
|
149
|
+
source: "openclaw-plugin",
|
|
150
|
+
filePath: relativePath,
|
|
151
|
+
agentId: this.agentId,
|
|
152
|
+
syncedAt: new Date().toISOString()
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
console.log(`[SquishPlugin] Synced: ${relativePath}`);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error(`[SquishPlugin] Failed to sync ${filePath}:`, error?.message || error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Tool implementation for OpenClaw to call
|
|
163
|
+
async memory_search(params) {
|
|
164
|
+
if (!this.client) {
|
|
165
|
+
throw new Error("MCP client not connected");
|
|
166
|
+
}
|
|
167
|
+
const result = await this.client.callTool({
|
|
168
|
+
name: "squish_search",
|
|
169
|
+
arguments: {
|
|
170
|
+
query: params.query,
|
|
171
|
+
limit: params.maxResults || 6,
|
|
172
|
+
project: params.project || this.workspaceDir,
|
|
173
|
+
mode: "hybrid"
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
// Parse result
|
|
177
|
+
const text = (result.content?.find((c) => c.type === "text")?.text || "{}");
|
|
178
|
+
const parsed = JSON.parse(text);
|
|
179
|
+
return {
|
|
180
|
+
results: parsed.results || [],
|
|
181
|
+
count: parsed.results?.length || 0,
|
|
182
|
+
query: params.query
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
async memory_get(params) {
|
|
186
|
+
if (!this.client) {
|
|
187
|
+
throw new Error("MCP client not connected");
|
|
188
|
+
}
|
|
189
|
+
// Extract memory ID from URI
|
|
190
|
+
const memoryId = this.extractMemoryId(params.uri);
|
|
191
|
+
const result = await this.client.callTool({
|
|
192
|
+
name: "squish_recall",
|
|
193
|
+
arguments: { memoryId }
|
|
194
|
+
});
|
|
195
|
+
const text = (result.content?.find((c) => c.type === "text")?.text || "{}");
|
|
196
|
+
const memory = JSON.parse(text);
|
|
197
|
+
if (!memory) {
|
|
198
|
+
throw new Error(`Memory not found: ${params.uri}`);
|
|
199
|
+
}
|
|
200
|
+
// Handle lineRange or overview
|
|
201
|
+
let content = memory.content || "";
|
|
202
|
+
if (params.lineRange && Array.isArray(params.lineRange)) {
|
|
203
|
+
const lines = content.split("\n");
|
|
204
|
+
const [start, end] = params.lineRange;
|
|
205
|
+
content = lines.slice(start, end).join("\n");
|
|
206
|
+
}
|
|
207
|
+
if (params.overview) {
|
|
208
|
+
content = content.substring(0, 500) + "...";
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
uri: params.uri,
|
|
212
|
+
content,
|
|
213
|
+
metadata: memory
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
extractMemoryId(uri) {
|
|
217
|
+
// Handle squish://memory/<id> format
|
|
218
|
+
const match = uri.match(/^squish:\/\/memory\/([a-f0-9-]+)$/);
|
|
219
|
+
if (match)
|
|
220
|
+
return match[1];
|
|
221
|
+
// Handle direct UUID
|
|
222
|
+
if (/^[a-f0-9-]{36}$/.test(uri))
|
|
223
|
+
return uri;
|
|
224
|
+
throw new Error(`Invalid memory URI: ${uri}`);
|
|
225
|
+
}
|
|
226
|
+
async shutdown() {
|
|
227
|
+
if (this.syncInterval) {
|
|
228
|
+
clearInterval(this.syncInterval);
|
|
229
|
+
this.syncInterval = null;
|
|
230
|
+
}
|
|
231
|
+
if (this.client) {
|
|
232
|
+
await this.client.close();
|
|
233
|
+
this.client = null;
|
|
234
|
+
}
|
|
235
|
+
console.log("[SquishPlugin] Shutdown complete");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Export for OpenClaw
|
|
239
|
+
export { OpenClawSquishPlugin };
|
|
240
|
+
// If run directly (testing), start plugin server
|
|
241
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
242
|
+
const config = {
|
|
243
|
+
baseUrl: process.env.SQUISH_BASE_URL,
|
|
244
|
+
autoStart: process.env.SQUISH_AUTO_START === "true",
|
|
245
|
+
sync: {
|
|
246
|
+
enabled: true,
|
|
247
|
+
interval: process.env.SQUISH_SYNC_INTERVAL || "5m"
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
const plugin = new OpenClawSquishPlugin(config);
|
|
251
|
+
process.on("SIGINT", () => plugin.shutdown());
|
|
252
|
+
process.on("SIGTERM", () => plugin.shutdown());
|
|
253
|
+
plugin.initialize().then(() => {
|
|
254
|
+
console.log("[SquishPlugin] Ready");
|
|
255
|
+
// Keep process alive
|
|
256
|
+
process.stdin?.resume();
|
|
257
|
+
}).catch((err) => {
|
|
258
|
+
console.error("[SquishPlugin] Failed to start:", err);
|
|
259
|
+
process.exit(1);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "squish-memory-openclaw",
|
|
3
|
+
"name": "Squish Memory for OpenClaw",
|
|
4
|
+
"description": "Connect OpenClaw to Squish memory system via MCP",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"pluginApiVersion": "1.0.0",
|
|
7
|
+
"author": "michielhdoteth",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"homepage": "https://github.com/michielhdoteth/squish",
|
|
10
|
+
"slot": "memory",
|
|
11
|
+
"tools": [
|
|
12
|
+
{
|
|
13
|
+
"name": "memory_search",
|
|
14
|
+
"description": "Search memories using Squish hybrid search",
|
|
15
|
+
"parameters": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"properties": {
|
|
18
|
+
"query": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Search query"
|
|
21
|
+
},
|
|
22
|
+
"maxResults": {
|
|
23
|
+
"type": "number",
|
|
24
|
+
"description": "Maximum results to return",
|
|
25
|
+
"default": 6
|
|
26
|
+
},
|
|
27
|
+
"project": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "Project path to scope search"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"required": ["query"]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "memory_get",
|
|
37
|
+
"description": "Get memory content by URI or ID",
|
|
38
|
+
"parameters": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"properties": {
|
|
41
|
+
"uri": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "Memory URI (e.g., squish://memory/<id>) or file path"
|
|
44
|
+
},
|
|
45
|
+
"lineRange": {
|
|
46
|
+
"type": "array",
|
|
47
|
+
"items": { "type": "number" },
|
|
48
|
+
"minItems": 2,
|
|
49
|
+
"maxItems": 2,
|
|
50
|
+
"description": "Line range [start, end]"
|
|
51
|
+
},
|
|
52
|
+
"overview": {
|
|
53
|
+
"type": "boolean",
|
|
54
|
+
"description": "Get overview instead of full content",
|
|
55
|
+
"default": false
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"required": ["uri"]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"config": {
|
|
63
|
+
"baseUrl": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"default": "http://127.0.0.1:8767",
|
|
66
|
+
"description": "Squish MCP server URL"
|
|
67
|
+
},
|
|
68
|
+
"autoStart": {
|
|
69
|
+
"type": "boolean",
|
|
70
|
+
"default": false,
|
|
71
|
+
"description": "Auto-start Squish MCP server if not running"
|
|
72
|
+
},
|
|
73
|
+
"sync": {
|
|
74
|
+
"type": "object",
|
|
75
|
+
"properties": {
|
|
76
|
+
"enabled": {
|
|
77
|
+
"type": "boolean",
|
|
78
|
+
"default": true
|
|
79
|
+
},
|
|
80
|
+
"interval": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"default": "5m",
|
|
83
|
+
"description": "Sync interval (e.g., 5m, 1h)"
|
|
84
|
+
},
|
|
85
|
+
"extraPaths": {
|
|
86
|
+
"type": "array",
|
|
87
|
+
"items": { "type": "string" },
|
|
88
|
+
"default": ["notes", "docs/memory"],
|
|
89
|
+
"description": "Extra directories to sync"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@squish/memory-openclaw",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "OpenClaw memory plugin for Squish - provides memory_search and memory_get tools via Squish MCP",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"dev": "bun --hot src/index.ts",
|
|
10
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
11
|
+
"prepare": "npm run build",
|
|
12
|
+
"clean": "rm -rf dist"
|
|
13
|
+
},
|
|
14
|
+
"keywords": ["openclaw", "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,217 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OpenCode Plugin Installer for Squish
|
|
5
|
+
* Auto-installs CLI + configures OpenCode to use Squish as MCP server
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
import { spawnSync } from "node:child_process";
|
|
12
|
+
|
|
13
|
+
const CONFIG_DIR = path.join(os.homedir(), ".config", "opencode");
|
|
14
|
+
const CONFIG_PATH = path.join(CONFIG_DIR, "config.json");
|
|
15
|
+
|
|
16
|
+
const OPENCODE_SCHEMA = "https://opencode.ai/config.json";
|
|
17
|
+
|
|
18
|
+
function ensureDir(dirPath) {
|
|
19
|
+
if (!fs.existsSync(dirPath)) {
|
|
20
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function getSquishMcpConfig() {
|
|
25
|
+
return {
|
|
26
|
+
type: "local",
|
|
27
|
+
command: ["squish-mcp"],
|
|
28
|
+
enabled: true,
|
|
29
|
+
environment: {}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function loadOpenCodeConfig() {
|
|
34
|
+
if (!fs.existsSync(CONFIG_PATH)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const content = fs.readFileSync(CONFIG_PATH, "utf8");
|
|
40
|
+
return JSON.parse(content);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error(`[ERROR] Failed to parse OpenCode config: ${error.message}`);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function saveOpenCodeConfig(config) {
|
|
48
|
+
ensureDir(CONFIG_DIR);
|
|
49
|
+
fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function createNewConfig() {
|
|
53
|
+
return {
|
|
54
|
+
$schema: OPENCODE_SCHEMA,
|
|
55
|
+
mcp: {
|
|
56
|
+
squish: getSquishMcpConfig()
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function installForOpenCode(options = {}) {
|
|
62
|
+
console.log("[INSTALL] Installing Squish for OpenCode...");
|
|
63
|
+
|
|
64
|
+
let config = loadOpenCodeConfig();
|
|
65
|
+
let created = false;
|
|
66
|
+
|
|
67
|
+
if (!config) {
|
|
68
|
+
if (options.dryRun) {
|
|
69
|
+
console.log("[DRY-RUN] Would create new OpenCode config at:", CONFIG_PATH);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
config = createNewConfig();
|
|
74
|
+
created = true;
|
|
75
|
+
console.log("[INSTALL] Created new OpenCode config");
|
|
76
|
+
} else {
|
|
77
|
+
if (options.dryRun) {
|
|
78
|
+
console.log("[DRY-RUN] Would update existing OpenCode config at:", CONFIG_PATH);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Ensure mcp section exists
|
|
83
|
+
if (!config.mcp) {
|
|
84
|
+
config.mcp = {};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Add or update squish MCP config
|
|
88
|
+
config.mcp.squish = getSquishMcpConfig();
|
|
89
|
+
console.log("[INSTALL] Updated existing OpenCode config");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
saveOpenCodeConfig(config);
|
|
93
|
+
console.log(`[INSTALL] ${created ? 'Created' : 'Updated'}: ${CONFIG_PATH}`);
|
|
94
|
+
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function uninstallForOpenCode(options = {}) {
|
|
99
|
+
console.log("[UNINSTALL] Removing Squish from OpenCode...");
|
|
100
|
+
|
|
101
|
+
const config = loadOpenCodeConfig();
|
|
102
|
+
if (!config) {
|
|
103
|
+
console.log("[UNINSTALL] No OpenCode config found");
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!config.mcp || !config.mcp.squish) {
|
|
108
|
+
console.log("[UNINSTALL] Squish not found in OpenCode config");
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (options.dryRun) {
|
|
113
|
+
console.log("[DRY-RUN] Would remove Squish from OpenCode config");
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
delete config.mcp.squish;
|
|
118
|
+
|
|
119
|
+
// Clean up empty mcp section
|
|
120
|
+
if (Object.keys(config.mcp).length === 0) {
|
|
121
|
+
delete config.mcp;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
saveOpenCodeConfig(config);
|
|
125
|
+
console.log("[UNINSTALL] Removed Squish from OpenCode config");
|
|
126
|
+
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function verifyOpenCodeInstallation() {
|
|
131
|
+
console.log("[VERIFY] Checking OpenCode installation...");
|
|
132
|
+
|
|
133
|
+
const config = loadOpenCodeConfig();
|
|
134
|
+
if (!config) {
|
|
135
|
+
return { ok: false, error: "OpenCode config not found" };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (!config.mcp || !config.mcp.squish) {
|
|
139
|
+
return { ok: false, error: "Squish MCP not configured" };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const squishConfig = config.mcp.squish;
|
|
143
|
+
|
|
144
|
+
if (squishConfig.type !== "local") {
|
|
145
|
+
return { ok: false, error: `Expected type 'local', got '${squishConfig.type}'` };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (!squishConfig.enabled) {
|
|
149
|
+
return { ok: false, error: "Squish MCP is disabled" };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Check if squish-mcp command is available
|
|
153
|
+
const result = spawnSync("which", ["squish-mcp"], { encoding: "utf8", shell: true });
|
|
154
|
+
if (result.status !== 0) {
|
|
155
|
+
return { ok: false, error: "squish-mcp command not found in PATH" };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
console.log("[VERIFY] OpenCode config:", CONFIG_PATH);
|
|
159
|
+
console.log("[VERIFY] Squish MCP configured:", squishConfig.command.join(" "));
|
|
160
|
+
console.log("[VERIFY] Status: enabled");
|
|
161
|
+
|
|
162
|
+
return { ok: true, message: "OpenCode installation verified" };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function main() {
|
|
166
|
+
const args = process.argv.slice(2);
|
|
167
|
+
const options = {
|
|
168
|
+
dryRun: args.includes("--dry-run") || args.includes("-d"),
|
|
169
|
+
uninstall: args.includes("--uninstall") || args.includes("-u"),
|
|
170
|
+
verify: args.includes("--verify") || args.includes("-v")
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
console.log("[OpenCode Plugin for Squish]");
|
|
174
|
+
console.log();
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
if (options.verify) {
|
|
178
|
+
const result = verifyOpenCodeInstallation();
|
|
179
|
+
if (result.ok) {
|
|
180
|
+
console.log("\n[VERIFY] " + result.message);
|
|
181
|
+
process.exit(0);
|
|
182
|
+
} else {
|
|
183
|
+
console.error("\n[VERIFY] Failed:", result.error);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (options.uninstall) {
|
|
189
|
+
const success = uninstallForOpenCode(options);
|
|
190
|
+
process.exit(success ? 0 : 1);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const success = installForOpenCode(options);
|
|
194
|
+
|
|
195
|
+
if (success && !options.dryRun) {
|
|
196
|
+
const verify = verifyOpenCodeInstallation();
|
|
197
|
+
if (verify.ok) {
|
|
198
|
+
console.log("\n[SUCCESS] OpenCode plugin installed successfully!");
|
|
199
|
+
console.log("\nTo use Squish in OpenCode:");
|
|
200
|
+
console.log(" 1. Restart OpenCode if it's running");
|
|
201
|
+
console.log(" 2. Start a conversation and ask about memories");
|
|
202
|
+
console.log(" 3. Or explicitly: 'use the squish tool to search for...'");
|
|
203
|
+
} else {
|
|
204
|
+
console.error("\n[WARNING] Installation succeeded but verification failed:");
|
|
205
|
+
console.error(" ", verify.error);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
process.exit(success ? 0 : 1);
|
|
210
|
+
|
|
211
|
+
} catch (error) {
|
|
212
|
+
console.error("[ERROR]", error.message);
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
main();
|