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,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"filesystem": {
|
|
4
|
+
"args": [
|
|
5
|
+
"-y",
|
|
6
|
+
"@modelcontextprotocol/server-filesystem",
|
|
7
|
+
"."
|
|
8
|
+
],
|
|
9
|
+
"command": "npx",
|
|
10
|
+
"env": {},
|
|
11
|
+
"transport": "stdio"
|
|
12
|
+
},
|
|
13
|
+
"github": {
|
|
14
|
+
"args": [
|
|
15
|
+
"-y",
|
|
16
|
+
"@modelcontextprotocol/server-github"
|
|
17
|
+
],
|
|
18
|
+
"command": "npx",
|
|
19
|
+
"env": {
|
|
20
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
|
|
21
|
+
},
|
|
22
|
+
"transport": "stdio"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"filesystem": {
|
|
4
|
+
"args": [
|
|
5
|
+
"-y",
|
|
6
|
+
"@modelcontextprotocol/server-filesystem",
|
|
7
|
+
"."
|
|
8
|
+
],
|
|
9
|
+
"command": "npx",
|
|
10
|
+
"env": {},
|
|
11
|
+
"transport": "stdio"
|
|
12
|
+
},
|
|
13
|
+
"github": {
|
|
14
|
+
"args": [
|
|
15
|
+
"-y",
|
|
16
|
+
"@modelcontextprotocol/server-github"
|
|
17
|
+
],
|
|
18
|
+
"command": "npx",
|
|
19
|
+
"env": {
|
|
20
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
|
|
21
|
+
},
|
|
22
|
+
"transport": "stdio"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"imports": [
|
|
26
|
+
"cursor",
|
|
27
|
+
"claude-code",
|
|
28
|
+
"claude-desktop",
|
|
29
|
+
"codex",
|
|
30
|
+
"windsurf",
|
|
31
|
+
"opencode",
|
|
32
|
+
"vscode"
|
|
33
|
+
]
|
|
34
|
+
}
|
package/package.json
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "squish-memory",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Universal plugin architecture memory system - works as plugin across Claude Code, OpenClaw, OpenCode, Codex, Cursor, VSCode, Windsurf. MCP server with CLI fallback, QMD search, and two-tier storage.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"squish": "dist/index.js",
|
|
9
|
-
"squish-mcp": "dist/commands/mcp-server.
|
|
10
|
-
"squish-
|
|
9
|
+
"squish-mcp": "dist/commands/mcp-server.js",
|
|
10
|
+
"squish-add": "bin/squish-add.mjs",
|
|
11
|
+
"squish-rm": "bin/squish-rm.mjs",
|
|
12
|
+
"squish-install": "npx-installer.js",
|
|
13
|
+
"squish-install-plugin": "scripts/install-plugin.mjs"
|
|
11
14
|
},
|
|
12
15
|
"scripts": {
|
|
13
16
|
"build": "tsc",
|
|
14
|
-
"
|
|
15
|
-
"
|
|
17
|
+
"build:plugins": "npm run build && npm run build:claude && npm run build:openclaw",
|
|
18
|
+
"build:claude": "cp -r .claude-plugin packages/plugin-claude-code/",
|
|
19
|
+
"build:openclaw": "mkdir -p packages/plugin-openclaw/dist && cp -r plugins/openclaw/* packages/plugin-openclaw/ && (cd packages/plugin-openclaw && npm run build 2>/dev/null || true)",
|
|
16
20
|
"start": "node dist/index.js",
|
|
17
|
-
"mcp": "node dist/commands/mcp-server.
|
|
21
|
+
"mcp": "node dist/commands/mcp-server.js",
|
|
18
22
|
"web": "node dist/api/web/web-server.js",
|
|
19
23
|
"web:bun": "bun run dist/api/web/web-server.js",
|
|
20
24
|
"dev": "bun --hot src/index.ts",
|
|
@@ -22,6 +26,12 @@
|
|
|
22
26
|
"verify:mcp": "node scripts/verify-mcp.mjs",
|
|
23
27
|
"preflight:remote": "node scripts/remote-preflight.mjs",
|
|
24
28
|
"fallback:dry": "node scripts/squish-fallback.mjs --op health --simulate-mcp-failure --dry-run",
|
|
29
|
+
"deps:check": "node scripts/dependency-manager.mjs",
|
|
30
|
+
"deps:install": "node scripts/dependency-manager.mjs",
|
|
31
|
+
"detect:clients": "node scripts/detect-clients.mjs",
|
|
32
|
+
"install:plugin": "node scripts/install-plugin.mjs",
|
|
33
|
+
"install:interactive": "node scripts/install-interactive.mjs",
|
|
34
|
+
"test:interactive": "node scripts/test-interactive.mjs",
|
|
25
35
|
"test": "node --test dist/tests/**/*.test.js",
|
|
26
36
|
"clean": "rm -rf dist && rm -f *.log",
|
|
27
37
|
"bench": "bun benchmark/memory.ts",
|
|
@@ -58,6 +68,15 @@
|
|
|
58
68
|
"model-context-protocol",
|
|
59
69
|
"claude-code",
|
|
60
70
|
"openclaw",
|
|
71
|
+
"opencode",
|
|
72
|
+
"codex",
|
|
73
|
+
"cursor",
|
|
74
|
+
"windsurf",
|
|
75
|
+
"vscode",
|
|
76
|
+
"plugin",
|
|
77
|
+
"plugin-architecture",
|
|
78
|
+
"openclaw-plugin",
|
|
79
|
+
"claude-code-plugin",
|
|
61
80
|
"qmd",
|
|
62
81
|
"sqlite",
|
|
63
82
|
"postgres",
|
|
@@ -66,25 +85,47 @@
|
|
|
66
85
|
"semantic-search",
|
|
67
86
|
"local-first",
|
|
68
87
|
"privacy",
|
|
69
|
-
"agent-framework"
|
|
88
|
+
"agent-framework",
|
|
89
|
+
"agent-memory"
|
|
90
|
+
],
|
|
91
|
+
"files": [
|
|
92
|
+
"dist",
|
|
93
|
+
"scripts",
|
|
94
|
+
"!scripts/init-dirs.ts",
|
|
95
|
+
"skills",
|
|
96
|
+
"hooks",
|
|
97
|
+
"config",
|
|
98
|
+
"bin",
|
|
99
|
+
"generated",
|
|
100
|
+
"packages/plugin-claude-code/dist",
|
|
101
|
+
"packages/plugin-claude-code/package.json",
|
|
102
|
+
"packages/plugin-claude-code/README.md",
|
|
103
|
+
"packages/plugin-openclaw/dist",
|
|
104
|
+
"packages/plugin-openclaw/package.json",
|
|
105
|
+
"packages/plugin-openclaw/README.md",
|
|
106
|
+
"packages/plugin-openclaw/openclaw.plugin.json",
|
|
107
|
+
"packages/plugin-opencode/package.json",
|
|
108
|
+
"packages/plugin-opencode/install.mjs",
|
|
109
|
+
"plugin.json",
|
|
110
|
+
".claude-plugin",
|
|
111
|
+
".mcp.json",
|
|
112
|
+
".env.mcp.example",
|
|
113
|
+
"LICENSE",
|
|
114
|
+
"README.md",
|
|
115
|
+
"CHANGELOG.md",
|
|
116
|
+
"QUICK-START.md",
|
|
117
|
+
"commands/context-paging.md",
|
|
118
|
+
"commands/context-status.md",
|
|
119
|
+
"commands/context.md",
|
|
120
|
+
"commands/core-memory.md",
|
|
121
|
+
"commands/health.md",
|
|
122
|
+
"commands/init.md",
|
|
123
|
+
"commands/merge.md",
|
|
124
|
+
"commands/observe.md",
|
|
125
|
+
"commands/recall.md",
|
|
126
|
+
"commands/remember.md",
|
|
127
|
+
"commands/search.md"
|
|
70
128
|
],
|
|
71
|
-
"files": [
|
|
72
|
-
"dist",
|
|
73
|
-
"scripts",
|
|
74
|
-
"commands",
|
|
75
|
-
"skills",
|
|
76
|
-
"hooks",
|
|
77
|
-
"config",
|
|
78
|
-
"bin",
|
|
79
|
-
"plugin.json",
|
|
80
|
-
".claude-plugin",
|
|
81
|
-
".mcp.json",
|
|
82
|
-
".env.mcp.example",
|
|
83
|
-
"LICENSE",
|
|
84
|
-
"README.md",
|
|
85
|
-
"CHANGELOG.md",
|
|
86
|
-
"QUICK-START.md"
|
|
87
|
-
],
|
|
88
129
|
"author": "michielhdoteth",
|
|
89
130
|
"license": "MIT",
|
|
90
131
|
"engines": {
|
|
@@ -99,25 +140,26 @@
|
|
|
99
140
|
"dotenv": "^16.4.0",
|
|
100
141
|
"drizzle-orm": "^0.38.0",
|
|
101
142
|
"express": "^4.21.0",
|
|
143
|
+
"node-cron": "^3.0.0",
|
|
102
144
|
"pg": "8.19.0",
|
|
103
145
|
"pgvector": "^0.2.0",
|
|
104
146
|
"redis": "^4.7.0",
|
|
147
|
+
"sql.js": "^1.14.1",
|
|
105
148
|
"tree-sitter": "^0.22.0",
|
|
106
149
|
"tree-sitter-javascript": "^0.23.0",
|
|
107
150
|
"tree-sitter-python": "^0.23.0",
|
|
108
151
|
"tree-sitter-typescript": "^0.23.0",
|
|
109
152
|
"uuid": "^9.0.1",
|
|
110
153
|
"ws": "^8.18.0",
|
|
111
|
-
"zod": "^3.24.0"
|
|
112
|
-
"node-cron": "^3.0.0"
|
|
154
|
+
"zod": "^3.24.0"
|
|
113
155
|
},
|
|
114
156
|
"devDependencies": {
|
|
115
157
|
"@types/better-sqlite3": "^7.6.13",
|
|
116
158
|
"@types/cors": "^2.8.17",
|
|
117
159
|
"@types/express": "^5.0.0",
|
|
118
160
|
"@types/node": "^22.0.0",
|
|
119
|
-
"@types/pg": "^8.11.10",
|
|
120
161
|
"@types/node-cron": "^3.0.11",
|
|
162
|
+
"@types/pg": "^8.11.10",
|
|
121
163
|
"@types/ws": "^8.5.13",
|
|
122
164
|
"drizzle-kit": "^0.30.0",
|
|
123
165
|
"pkg": "^5.8.1",
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Squish Memory for Claude Code
|
|
2
|
+
|
|
3
|
+
Claude Code plugin for automatic memory capture and context injection with Squish.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @squish/memory-claude-code
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Automatic Memory Capture**: User prompts are automatically stored as memories
|
|
14
|
+
- **Context Injection**: Relevant past memories are injected into Claude's context
|
|
15
|
+
- **Session Summaries**: End-of-session summaries are stored for long-term retention
|
|
16
|
+
- **Debounced Capture**: 2-second debounce avoids noise
|
|
17
|
+
|
|
18
|
+
## Hooks
|
|
19
|
+
|
|
20
|
+
This plugin implements Claude Code plugin hooks:
|
|
21
|
+
|
|
22
|
+
- `SessionStart` - Initialize memory session
|
|
23
|
+
- `UserPromptSubmit` - Capture user input (2s debounced)
|
|
24
|
+
- `PostToolUse` - Capture tool usage observations
|
|
25
|
+
- `SessionEnd` - Generate and store session summary
|
|
26
|
+
|
|
27
|
+
## Setup
|
|
28
|
+
|
|
29
|
+
1. Ensure Squish MCP server is running:
|
|
30
|
+
```bash
|
|
31
|
+
npx squish-memory install-plugin --client=claude-code
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
2. Claude Code will automatically load the plugin on next start if installed globally
|
|
35
|
+
|
|
36
|
+
3. Verify plugin is active:
|
|
37
|
+
```bash
|
|
38
|
+
npx squish-memory install-plugin --client=claude-code --verify
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Configuration
|
|
42
|
+
|
|
43
|
+
Environment variables:
|
|
44
|
+
|
|
45
|
+
| Variable | Description |
|
|
46
|
+
|----------|-------------|
|
|
47
|
+
| `SQUISH_DATA_DIR` | Data directory (default: `~/.squish/claude`) |
|
|
48
|
+
| `SQUISH_COMMAND` | Command to start Squish MCP (default: `squish-mcp`) |
|
|
49
|
+
|
|
50
|
+
## How It Works
|
|
51
|
+
|
|
52
|
+
1. **Session Start**: Plugin connects to Squish MCP and creates a session
|
|
53
|
+
2. **User Input Capture**: Prompts are debounced (2s) then stored as `observation` type memories with tags `user-prompt`, `claude-code`
|
|
54
|
+
3. **Tool Use Capture**: (Planned) Tool calls and results stored as `observation`
|
|
55
|
+
4. **Session End**: Summary generated and stored, session statistics recorded
|
|
56
|
+
|
|
57
|
+
## Development
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
cd packages/plugin-claude-code
|
|
61
|
+
npm install
|
|
62
|
+
npm run build
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Compatibility
|
|
66
|
+
|
|
67
|
+
- Claude Code v0.62+
|
|
68
|
+
- Node.js 18+
|
|
69
|
+
- Squish v1.0.0+
|
|
70
|
+
|
|
71
|
+
## License
|
|
72
|
+
|
|
73
|
+
MIT
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code Plugin: Squish Memory Integration
|
|
4
|
+
*
|
|
5
|
+
* Hooks:
|
|
6
|
+
* - SessionStart: Initialize memory session
|
|
7
|
+
* - UserPromptSubmit: Capture user input as memory
|
|
8
|
+
* - PostToolUse: Capture tool usage as observations
|
|
9
|
+
* - SessionEnd: Summarize session
|
|
10
|
+
*/
|
|
11
|
+
declare class ClaudeCodeSquishPlugin {
|
|
12
|
+
private client;
|
|
13
|
+
private sessionId;
|
|
14
|
+
private workspaceDir;
|
|
15
|
+
private debounceTimer;
|
|
16
|
+
private recentMemories;
|
|
17
|
+
constructor();
|
|
18
|
+
initialize(): Promise<void>;
|
|
19
|
+
private connectToSquish;
|
|
20
|
+
private registerHooks;
|
|
21
|
+
private onSessionStart;
|
|
22
|
+
private onUserPromptSubmit;
|
|
23
|
+
private captureUserPrompt;
|
|
24
|
+
private onPostToolUse;
|
|
25
|
+
private onSessionEnd;
|
|
26
|
+
private summarizeSession;
|
|
27
|
+
private observe;
|
|
28
|
+
private callTool;
|
|
29
|
+
shutdown(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
export declare function onSessionStart(): Promise<ClaudeCodeSquishPlugin>;
|
|
32
|
+
export declare function onUserPromptSubmit(prompt: string): Promise<void>;
|
|
33
|
+
export declare function onSessionEnd(): Promise<void>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=plugin-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-wrapper.d.ts","sourceRoot":"","sources":["../src/plugin-wrapper.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AASH,cAAM,sBAAsB;IAC1B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,cAAc,CAAgB;;IAMhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,eAAe;IA+B7B,OAAO,CAAC,aAAa;YAcP,cAAc;YAYd,kBAAkB;YAiBlB,iBAAiB;YA2BjB,aAAa;YAMb,YAAY;YAoBZ,gBAAgB;YAShB,OAAO;YAUP,QAAQ;IAUT,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKvC;AAGD,wBAAsB,cAAc,oCAInC;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,iBAGtD;AAED,wBAAsB,YAAY,kBAEjC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code Plugin: Squish Memory Integration
|
|
4
|
+
*
|
|
5
|
+
* Hooks:
|
|
6
|
+
* - SessionStart: Initialize memory session
|
|
7
|
+
* - UserPromptSubmit: Capture user input as memory
|
|
8
|
+
* - PostToolUse: Capture tool usage as observations
|
|
9
|
+
* - SessionEnd: Summarize session
|
|
10
|
+
*/
|
|
11
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
12
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import { pathToFileURL } from "node:url";
|
|
16
|
+
class ClaudeCodeSquishPlugin {
|
|
17
|
+
client = null;
|
|
18
|
+
sessionId = "";
|
|
19
|
+
workspaceDir;
|
|
20
|
+
debounceTimer = null;
|
|
21
|
+
recentMemories = [];
|
|
22
|
+
constructor() {
|
|
23
|
+
this.workspaceDir = process.env.CLAUDE_WORKING_DIRECTORY || process.cwd();
|
|
24
|
+
}
|
|
25
|
+
async initialize() {
|
|
26
|
+
console.log("[SquishPlugin] Claude Code plugin initializing...");
|
|
27
|
+
// Connect to Squish MCP (assumes Squish is running)
|
|
28
|
+
await this.connectToSquish();
|
|
29
|
+
// Register hooks
|
|
30
|
+
this.registerHooks();
|
|
31
|
+
console.log("[SquishPlugin] ✓ Plugin ready");
|
|
32
|
+
}
|
|
33
|
+
async connectToSquish() {
|
|
34
|
+
// Check if Squish is running as MCP server (stdio mode expected)
|
|
35
|
+
// In Claude Code plugin mode, Squish should already be running
|
|
36
|
+
// We'll spawn a separate connection or use existing if available
|
|
37
|
+
this.client = new Client({ name: "claude-squish-plugin", version: "1.0.0" }, { capabilities: {} });
|
|
38
|
+
// Connect via stdio to Squish MCP server
|
|
39
|
+
// Squish should be running: squish-mcp --stdio
|
|
40
|
+
const transport = new StdioClientTransport({
|
|
41
|
+
command: process.env.SQUISH_COMMAND || "squish-mcp",
|
|
42
|
+
args: ["--stdio"],
|
|
43
|
+
env: {
|
|
44
|
+
...process.env,
|
|
45
|
+
SQUISH_MODE: "local",
|
|
46
|
+
SQUISH_DATA_DIR: process.env.SQUISH_DATA_DIR || path.join(os.homedir(), ".squish", "claude")
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
try {
|
|
50
|
+
await this.client.connect(transport);
|
|
51
|
+
console.log("[SquishPlugin] Connected to Squish MCP");
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error("[SquishPlugin] Failed to connect to Squish:", error?.message || error);
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
registerHooks() {
|
|
59
|
+
// Hook: SessionStart
|
|
60
|
+
this.onSessionStart();
|
|
61
|
+
// Hook: UserPromptSubmit (via environment or stdin monitoring)
|
|
62
|
+
this.onUserPromptSubmit();
|
|
63
|
+
// Hook: PostToolUse
|
|
64
|
+
this.onPostToolUse();
|
|
65
|
+
// Hook: SessionEnd
|
|
66
|
+
this.onSessionEnd();
|
|
67
|
+
}
|
|
68
|
+
async onSessionStart() {
|
|
69
|
+
this.sessionId = `session-${Date.now()}-${Math.random().toString(36).substring(7)}`;
|
|
70
|
+
console.log("[SquishPlugin] Session started:", this.sessionId);
|
|
71
|
+
// Store session start observation
|
|
72
|
+
await this.observe("session_start", "Claude Code session started", {
|
|
73
|
+
sessionId: this.sessionId,
|
|
74
|
+
workspace: this.workspaceDir,
|
|
75
|
+
timestamp: new Date().toISOString()
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async onUserPromptSubmit() {
|
|
79
|
+
// In Claude Code plugin system, we receive prompts via stdin
|
|
80
|
+
// For this plugin implementation, we'll use a wrapper approach
|
|
81
|
+
// Capture stdin lines as user input
|
|
82
|
+
process.stdin?.on("data", async (data) => {
|
|
83
|
+
const prompt = data.toString().trim();
|
|
84
|
+
if (!prompt)
|
|
85
|
+
return;
|
|
86
|
+
// Debounce to avoid capturing intermediate states
|
|
87
|
+
if (this.debounceTimer)
|
|
88
|
+
clearTimeout(this.debounceTimer);
|
|
89
|
+
this.debounceTimer = setTimeout(async () => {
|
|
90
|
+
await this.captureUserPrompt(prompt);
|
|
91
|
+
}, 2000); // 2 second debounce
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async captureUserPrompt(prompt) {
|
|
95
|
+
try {
|
|
96
|
+
console.log("[SquishPlugin] Capturing user prompt...");
|
|
97
|
+
// Store as memory
|
|
98
|
+
const result = await this.callTool("squish_remember", {
|
|
99
|
+
content: prompt,
|
|
100
|
+
type: "observation",
|
|
101
|
+
tags: ["user-prompt", "claude-code"],
|
|
102
|
+
project: this.workspaceDir,
|
|
103
|
+
metadata: {
|
|
104
|
+
source: "claude-plugin",
|
|
105
|
+
sessionId: this.sessionId,
|
|
106
|
+
capturedAt: new Date().toISOString()
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
const memoryId = JSON.parse(result).id;
|
|
110
|
+
this.recentMemories.push(memoryId);
|
|
111
|
+
if (this.recentMemories.length > 50)
|
|
112
|
+
this.recentMemories.shift();
|
|
113
|
+
console.log("[SquishPlugin] ✓ Captured user prompt as memory:", memoryId);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error("[SquishPlugin] Failed to capture prompt:", error?.message || error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async onPostToolUse() {
|
|
120
|
+
// Capture tool usage from Claude Code output
|
|
121
|
+
// This would need integration with Claude Code's tool result streaming
|
|
122
|
+
// Simplified: we'll rely on users to call observe manually or via prompts
|
|
123
|
+
}
|
|
124
|
+
async onSessionEnd() {
|
|
125
|
+
console.log("[SquishPlugin] Session ending:", this.sessionId);
|
|
126
|
+
try {
|
|
127
|
+
// Generate session summary
|
|
128
|
+
const summary = await this.summarizeSession();
|
|
129
|
+
// Store summary observation
|
|
130
|
+
await this.observe("session_summary", summary, {
|
|
131
|
+
sessionId: this.sessionId,
|
|
132
|
+
memoryCount: this.recentMemories.length,
|
|
133
|
+
endedAt: new Date().toISOString()
|
|
134
|
+
});
|
|
135
|
+
console.log("[SquishPlugin] ✓ Session summary stored");
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
console.error("[SquishPlugin] Session end error:", error?.message || error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async summarizeSession() {
|
|
142
|
+
// Generate a brief summary of this session's memories
|
|
143
|
+
if (this.recentMemories.length === 0) {
|
|
144
|
+
return "Empty session - no memories captured.";
|
|
145
|
+
}
|
|
146
|
+
return `Session ${this.sessionId}: Captured ${this.recentMemories.length} memories from user prompts and interactions.`;
|
|
147
|
+
}
|
|
148
|
+
async observe(type, summary, details) {
|
|
149
|
+
return this.callTool("squish_observe", {
|
|
150
|
+
type,
|
|
151
|
+
action: "claude_code_event",
|
|
152
|
+
summary,
|
|
153
|
+
details,
|
|
154
|
+
project: this.workspaceDir
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async callTool(name, args) {
|
|
158
|
+
if (!this.client) {
|
|
159
|
+
throw new Error("MCP client not connected");
|
|
160
|
+
}
|
|
161
|
+
const result = await this.client.callTool({ name, arguments: args });
|
|
162
|
+
const content = result?.content?.find((c) => c.type === "text")?.text || "{}";
|
|
163
|
+
return content;
|
|
164
|
+
}
|
|
165
|
+
async shutdown() {
|
|
166
|
+
if (this.debounceTimer)
|
|
167
|
+
clearTimeout(this.debounceTimer);
|
|
168
|
+
if (this.client)
|
|
169
|
+
await this.client.close();
|
|
170
|
+
console.log("[SquishPlugin] Shutdown complete");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Plugin entry point for Claude Code hook system
|
|
174
|
+
export async function onSessionStart() {
|
|
175
|
+
const plugin = new ClaudeCodeSquishPlugin();
|
|
176
|
+
await plugin.initialize();
|
|
177
|
+
return plugin;
|
|
178
|
+
}
|
|
179
|
+
export async function onUserPromptSubmit(prompt) {
|
|
180
|
+
// This will be called by Claude Code hook system
|
|
181
|
+
// For now, the instance manages its own stdin listener
|
|
182
|
+
}
|
|
183
|
+
export async function onSessionEnd() {
|
|
184
|
+
// Cleanup handled by plugin instance
|
|
185
|
+
}
|
|
186
|
+
// Standalone test mode
|
|
187
|
+
if (process.argv[1] === pathToFileURL(__filename).pathname) {
|
|
188
|
+
const plugin = new ClaudeCodeSquishPlugin();
|
|
189
|
+
plugin.initialize().catch(console.error);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=plugin-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-wrapper.js","sourceRoot":"","sources":["../src/plugin-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@squish/memory-claude-code",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Claude Code plugin for Squish - automatic memory capture and context injection",
|
|
5
|
+
"main": "dist/plugin-wrapper.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"dev": "bun --hot src/plugin-wrapper.ts",
|
|
10
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
11
|
+
"prepare": "npm run build",
|
|
12
|
+
"clean": "rm -rf dist"
|
|
13
|
+
},
|
|
14
|
+
"keywords": ["claude-code", "plugin", "memory", "mcp", "squish"],
|
|
15
|
+
"author": "michielhdoteth",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@modelcontextprotocol/sdk": "^1.27.0"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^22.0.0",
|
|
22
|
+
"typescript": "^5.7.0",
|
|
23
|
+
"vitest": "^4.0.17"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"squish-memory": ">=1.0.0"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18.0.0"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Squish Memory for OpenClaw
|
|
2
|
+
|
|
3
|
+
OpenClaw plugin that connects to Squish memory system via MCP protocol.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @squish/memory-openclaw
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Configuration
|
|
12
|
+
|
|
13
|
+
In your OpenClaw config (`~/.openclaw/agents.json` or similar):
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"plugins": {
|
|
18
|
+
"enabled": true,
|
|
19
|
+
"slots": {
|
|
20
|
+
"memory": "squish-memory-openclaw"
|
|
21
|
+
},
|
|
22
|
+
"entries": {
|
|
23
|
+
"squish-memory-openclaw": {
|
|
24
|
+
"enabled": true,
|
|
25
|
+
"config": {
|
|
26
|
+
"baseUrl": "http://127.0.0.1:8767",
|
|
27
|
+
"autoStart": false,
|
|
28
|
+
"sync": {
|
|
29
|
+
"enabled": true,
|
|
30
|
+
"interval": "5m",
|
|
31
|
+
"extraPaths": ["notes", "docs/memory"]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Requirements
|
|
41
|
+
|
|
42
|
+
- Squish memory server running (either via `squish-mcp --stdio` or HTTP at `baseUrl`)
|
|
43
|
+
- mcporter (if using OpenClaw's MCP mode)
|
|
44
|
+
- qmd (for fast markdown search)
|
|
45
|
+
|
|
46
|
+
These are auto-installed by the Squish installer when you run:
|
|
47
|
+
```bash
|
|
48
|
+
npx squish-memory install-plugin --client=openclaw
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## How It Works
|
|
52
|
+
|
|
53
|
+
1. The plugin registers in the `memory` slot of OpenClaw
|
|
54
|
+
2. It connects to Squish MCP server (spawns one if autoStart=true)
|
|
55
|
+
3. Periodic sync monitors workspace files and stores them as memories
|
|
56
|
+
4. Tool calls from OpenClaw:
|
|
57
|
+
- `memory_search(query, maxResults)` → Squish hybrid search
|
|
58
|
+
- `memory_get(uri, lineRange, overview)` → Retrieve memory content
|
|
59
|
+
|
|
60
|
+
## Development
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
cd packages/plugin-openclaw
|
|
64
|
+
npm install
|
|
65
|
+
npm run build
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## License
|
|
69
|
+
|
|
70
|
+
MIT
|