squish-memory 1.1.5 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +46 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/core/algorithms/index.ts +39 -0
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/core/lib/db-client.ts +168 -0
- package/core/lib/parse-embedding.ts +59 -0
- package/core/lib/schemas.ts +102 -0
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/core/memory/index.ts +11 -0
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/core/places/index.ts +14 -0
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +581 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/core/scheduler/index.ts +8 -0
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/core/search/index.ts +4 -0
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/core/session/index.ts +7 -0
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/core/snapshots/cleanup.ts +13 -0
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/core/summarization/cleanup.ts +13 -0
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/core/utils/vector-operations.ts +135 -0
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +324 -0
- package/db/adapter.ts +215 -0
- package/db/bootstrap.ts +1055 -0
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/dist/config.d.ts +40 -17
- package/dist/config.js +150 -198
- package/dist/core/adapters/types.d.ts +13 -33
- package/dist/core/adapters/types.js +1 -1
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
- package/dist/core/algorithms/types.d.ts +0 -8
- package/dist/core/associations.d.ts +3 -1
- package/dist/core/associations.js +37 -1
- package/dist/core/beliefs/decay.d.ts +27 -0
- package/dist/core/beliefs/decay.js +217 -0
- package/dist/core/beliefs/extractor.d.ts +9 -0
- package/dist/core/beliefs/extractor.js +113 -0
- package/dist/core/beliefs/store.d.ts +46 -0
- package/dist/core/beliefs/store.js +466 -0
- package/dist/core/beliefs/types.d.ts +28 -0
- package/dist/core/beliefs/types.js +2 -0
- package/dist/core/commands/mcp-server.d.ts +0 -1
- package/dist/core/commands/mcp-server.js +4 -737
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
- package/dist/core/{toon.js → compression.js} +8 -8
- package/dist/core/context/agent-context.js +1 -1
- package/dist/core/embeddings/embeddings.d.ts +29 -0
- package/dist/core/embeddings/embeddings.js +546 -0
- package/dist/core/embeddings/google-multimodal.js +6 -2
- package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
- package/dist/core/embeddings/local-embeddings.js +11 -0
- package/dist/core/embeddings/qmd-client.js +1 -1
- package/dist/core/embeddings/transformers-local.d.ts +64 -0
- package/dist/core/embeddings/transformers-local.js +213 -0
- package/dist/core/embeddings.d.ts +1 -28
- package/dist/core/embeddings.js +2 -453
- package/dist/core/graph/entity-deduplicator.d.ts +24 -0
- package/dist/core/graph/entity-deduplicator.js +183 -0
- package/dist/core/graph/graph-builder.d.ts +46 -0
- package/dist/core/graph/graph-builder.js +174 -0
- package/dist/core/graph/graph-traversal.d.ts +80 -0
- package/dist/core/graph/graph-traversal.js +315 -0
- package/dist/core/graph/index.d.ts +19 -0
- package/dist/core/graph/index.js +13 -0
- package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
- package/dist/core/graph/llm-entity-extractor.js +313 -0
- package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
- package/dist/core/graph/multi-hop-retrieval.js +215 -0
- package/dist/core/graph/relationship-extractor.d.ts +48 -0
- package/dist/core/graph/relationship-extractor.js +351 -0
- package/dist/core/hooks/agent-hooks.d.ts +10 -1
- package/dist/core/hooks/agent-hooks.js +301 -24
- package/dist/core/hot-cache.d.ts +86 -0
- package/dist/core/hot-cache.js +285 -0
- package/dist/core/index.d.ts +9 -9
- package/dist/core/index.js +9 -12
- package/dist/core/ingestion/core-memory.d.ts +2 -2
- package/dist/core/ingestion/core-memory.js +3 -3
- package/dist/core/ingestion/learnings.js +3 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
- package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
- package/dist/core/lib/parse-embedding.d.ts +9 -0
- package/dist/core/lib/parse-embedding.js +58 -0
- package/dist/core/lib/schemas.d.ts +57 -54
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/lib/utils.d.ts +4 -0
- package/dist/core/lib/utils.js +55 -0
- package/dist/core/lifecycle.d.ts +0 -1
- package/dist/core/lifecycle.js +13 -23
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +14 -8
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +0 -87
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +1 -0
- package/dist/core/memory/consolidation.js +2 -28
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/explain.d.ts +18 -0
- package/dist/core/memory/explain.js +92 -0
- package/dist/core/memory/fact-deriver.d.ts +31 -0
- package/dist/core/memory/fact-deriver.js +236 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
- package/dist/core/memory/hybrid-retrieval.js +25 -127
- package/dist/core/memory/hybrid-scorer.js +6 -23
- package/dist/core/memory/hybrid-search.d.ts +10 -7
- package/dist/core/memory/hybrid-search.js +458 -221
- package/dist/core/memory/importance.d.ts +0 -17
- package/dist/core/memory/importance.js +1 -58
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/memories.d.ts +13 -17
- package/dist/core/memory/memories.js +78 -75
- package/dist/core/memory/memory-lifecycle.d.ts +2 -2
- package/dist/core/memory/memory-lifecycle.js +10 -18
- package/dist/core/memory/normalization.d.ts +1 -16
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/stale-cleaner.d.ts +26 -0
- package/dist/core/memory/stale-cleaner.js +97 -0
- package/dist/core/memory/stats.d.ts +10 -0
- package/dist/core/memory/stats.js +8 -3
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/places/index.d.ts +1 -1
- package/dist/core/places/index.js +1 -1
- package/dist/core/places/places.d.ts +13 -13
- package/dist/core/places/places.js +27 -27
- package/dist/core/places/rules.js +23 -23
- package/dist/core/places/walking.d.ts +3 -3
- package/dist/core/places/walking.js +7 -7
- package/dist/core/projects.js +8 -0
- package/dist/core/runtime/trust-report.d.ts +102 -0
- package/dist/core/runtime/trust-report.js +107 -0
- package/dist/core/runtime/trust-state.d.ts +12 -0
- package/dist/core/runtime/trust-state.js +309 -0
- package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
- package/dist/core/scheduler/cron-scheduler.js +164 -3
- package/dist/core/scheduler/job-runner.js +1 -1
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/session/auto-load.js +28 -3
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/session/self-iteration-job.d.ts +15 -0
- package/dist/core/session/self-iteration-job.js +163 -58
- package/dist/core/session/working-set.d.ts +50 -0
- package/dist/core/session/working-set.js +212 -0
- package/dist/core/snapshots/creation.d.ts +2 -8
- package/dist/core/snapshots/creation.js +3 -12
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +229 -280
- package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
- package/dist/db/drizzle/schema-sqlite.js +83 -4
- package/dist/db/drizzle/schema.d.ts +653 -1
- package/dist/db/drizzle/schema.js +93 -4
- package/dist/db/migrations/associations.d.ts +6 -0
- package/dist/db/migrations/associations.js +29 -0
- package/dist/db/migrations/beliefs.d.ts +10 -0
- package/dist/db/migrations/beliefs.js +76 -0
- package/dist/db/migrations/core-memory.d.ts +6 -0
- package/dist/db/migrations/core-memory.js +29 -0
- package/dist/db/migrations/fts.d.ts +6 -0
- package/dist/db/migrations/fts.js +52 -0
- package/dist/db/migrations/index.d.ts +25 -0
- package/dist/db/migrations/index.js +51 -0
- package/dist/db/migrations/indexes.d.ts +6 -0
- package/dist/db/migrations/indexes.js +30 -0
- package/dist/db/migrations/learnings.d.ts +7 -0
- package/dist/db/migrations/learnings.js +26 -0
- package/dist/db/migrations/maintenance.d.ts +6 -0
- package/dist/db/migrations/maintenance.js +61 -0
- package/dist/db/migrations/memories.d.ts +7 -0
- package/dist/db/migrations/memories.js +16 -0
- package/dist/db/migrations/memory-places.d.ts +6 -0
- package/dist/db/migrations/memory-places.js +29 -0
- package/dist/db/migrations/places.d.ts +6 -0
- package/dist/db/migrations/places.js +43 -0
- package/dist/db/migrations/projects.d.ts +3 -0
- package/dist/db/migrations/projects.js +13 -0
- package/dist/db/migrations/tier-conversion.d.ts +7 -0
- package/dist/db/migrations/tier-conversion.js +20 -0
- package/dist/db/schema/beliefs.d.ts +9 -0
- package/dist/db/schema/beliefs.js +46 -0
- package/dist/db/schema/generator.d.ts +38 -0
- package/dist/db/schema/generator.js +108 -0
- package/dist/db/schema/index.d.ts +19 -20
- package/dist/db/schema/index.js +25 -79
- package/dist/db/schema/learnings.d.ts +7 -0
- package/dist/db/schema/learnings.js +30 -0
- package/dist/db/schema/memories.d.ts +7 -0
- package/dist/db/schema/memories.js +81 -0
- package/dist/db/schema/projects.d.ts +4 -0
- package/dist/db/schema/projects.js +31 -0
- package/dist/packages/mcp/src/index.d.ts +3 -0
- package/dist/packages/mcp/src/index.js +733 -0
- package/mcp.json.example +8 -11
- package/package.json +57 -76
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +877 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Squish GitHub Release Script
|
|
4
|
-
# Run after npm publish to create GitHub release
|
|
5
|
-
|
|
6
|
-
# Auto-detect version from package.json
|
|
7
|
-
VERSION=$(node -p "require('./package.json').version")
|
|
8
|
-
REPO="michielhdoteth/squish"
|
|
9
|
-
|
|
10
|
-
echo "Creating GitHub release v$VERSION..."
|
|
11
|
-
|
|
12
|
-
# Build binaries for different platforms
|
|
13
|
-
echo "Building binaries..."
|
|
14
|
-
|
|
15
|
-
# Create temporary directory for release assets
|
|
16
|
-
mkdir -p release-assets
|
|
17
|
-
cd release-assets
|
|
18
|
-
|
|
19
|
-
# Linux x64
|
|
20
|
-
echo "Building linux-x64..."
|
|
21
|
-
npx pkg ../dist/index.js --targets node18-linux-x64 --output squish-linux-x64
|
|
22
|
-
tar -czf "../squish-v${VERSION}-linux-x64.tar.gz" squish-linux-x64 ../dist/ ../config/plugin.json ../README.md ../LICENSE
|
|
23
|
-
|
|
24
|
-
# Linux ARM64
|
|
25
|
-
echo "Building linux-arm64..."
|
|
26
|
-
npx pkg ../dist/index.js --targets node18-linux-arm64 --output squish-linux-arm64
|
|
27
|
-
tar -czf "../squish-v${VERSION}-linux-arm64.tar.gz" squish-linux-arm64 ../dist/ ../config/plugin.json ../README.md ../LICENSE
|
|
28
|
-
|
|
29
|
-
# macOS ARM64 (Apple Silicon)
|
|
30
|
-
echo "Building macos-arm64..."
|
|
31
|
-
npx pkg ../dist/index.js --targets node18-macos-arm64 --output squish-macos-arm64
|
|
32
|
-
tar -czf "../squish-v${VERSION}-macos-arm64.tar.gz" squish-macos-arm64 ../dist/ ../config/plugin.json ../README.md ../LICENSE
|
|
33
|
-
|
|
34
|
-
# Windows x64
|
|
35
|
-
echo "Building windows-x64..."
|
|
36
|
-
npx pkg ../dist/index.js --targets node18-win-x64 --output squish-windows-x64.exe
|
|
37
|
-
zip "../squish-v${VERSION}-windows-x64.zip" squish-windows-x64.exe ../dist/ ../config/plugin.json ../README.md ../LICENSE
|
|
38
|
-
|
|
39
|
-
cd ..
|
|
40
|
-
rm -rf release-assets
|
|
41
|
-
|
|
42
|
-
echo "Binaries created!"
|
|
43
|
-
|
|
44
|
-
# Check if gh CLI is available and user is authenticated
|
|
45
|
-
if ! command -v gh &> /dev/null; then
|
|
46
|
-
echo "❌ GitHub CLI (gh) not installed. Skipping release creation."
|
|
47
|
-
echo " Install gh CLI and run this script again to create GitHub release."
|
|
48
|
-
echo " Alternatively, create release manually at: https://github.com/$REPO/releases/new?tag=v$VERSION"
|
|
49
|
-
exit 1
|
|
50
|
-
fi
|
|
51
|
-
|
|
52
|
-
# Create GitHub release
|
|
53
|
-
echo "Creating GitHub release..."
|
|
54
|
-
gh release create "v${VERSION}" \
|
|
55
|
-
--title "Squish v${VERSION} - Universal Memory for AI Agents" \
|
|
56
|
-
--notes "## What's New in v${VERSION}
|
|
57
|
-
|
|
58
|
-
Squish provides universal persistent memory for AI agents with support for MCP, CLI, and HTTP API.
|
|
59
|
-
|
|
60
|
-
### Key Features
|
|
61
|
-
- Two-tier memory architecture (QMD search + SQLite/PostgreSQL storage)
|
|
62
|
-
- Trigger detection, contradiction resolution, and temporal facts
|
|
63
|
-
- Universal API compatible with any AI agent framework
|
|
64
|
-
- MCP server integration for Claude Code, OpenClaw, and other MCP clients
|
|
65
|
-
|
|
66
|
-
### Installation
|
|
67
|
-
\`\`\`bash
|
|
68
|
-
npx squish-install
|
|
69
|
-
\`\`\`
|
|
70
|
-
|
|
71
|
-
Or visit: https://github.com/michielhdoteth/squish" \
|
|
72
|
-
"squish-v${VERSION}-linux-x64.tar.gz" \
|
|
73
|
-
"squish-v${VERSION}-linux-arm64.tar.gz" \
|
|
74
|
-
"squish-v${VERSION}-macos-arm64.tar.gz" \
|
|
75
|
-
"squish-v${VERSION}-windows-x64.zip"
|
|
76
|
-
|
|
77
|
-
echo "Release v${VERSION} published!"
|
package/scripts/init-dirs.mjs
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { existsSync, mkdirSync } from 'node:fs';
|
|
4
|
-
import { homedir } from 'node:os';
|
|
5
|
-
import { join } from 'node:path';
|
|
6
|
-
|
|
7
|
-
const defaultDir = join(homedir(), '.squish');
|
|
8
|
-
|
|
9
|
-
if (!existsSync(defaultDir)) {
|
|
10
|
-
mkdirSync(defaultDir, { recursive: true });
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
console.log(`Squish data directory: ${defaultDir}`);
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Install Squish hooks for Claude Code
|
|
3
|
-
# Run from the squish project directory
|
|
4
|
-
|
|
5
|
-
set -e
|
|
6
|
-
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
-
SQUISH_DIR="${SQUISH_DIR:-$HOME/.squish}"
|
|
9
|
-
HOOKS_CONFIG="$SCRIPT_DIR/config/hooks/claude-code-hooks.json"
|
|
10
|
-
|
|
11
|
-
echo "Installing Squish hooks for Claude Code..."
|
|
12
|
-
|
|
13
|
-
# Create Squish config directory
|
|
14
|
-
mkdir -p "$SQUISH_DIR"
|
|
15
|
-
|
|
16
|
-
# Copy hook config
|
|
17
|
-
if [ -f "$HOOKS_CONFIG" ]; then
|
|
18
|
-
cp "$HOOKS_CONFIG" "$SQUISH_DIR/hooks-claude-code.json"
|
|
19
|
-
echo "Copied hook config to $SQUISH_DIR/hooks-claude-code.json"
|
|
20
|
-
else
|
|
21
|
-
echo "ERROR: Hook config not found at $HOOKS_CONFIG"
|
|
22
|
-
exit 1
|
|
23
|
-
fi
|
|
24
|
-
|
|
25
|
-
# Create hooks directory
|
|
26
|
-
mkdir -p "$SQUISH_DIR/hooks"
|
|
27
|
-
|
|
28
|
-
# Check for Claude Code settings file
|
|
29
|
-
SETTINGS_FILE="$HOME/.claude/settings.json"
|
|
30
|
-
HOOKS_DIR="$HOME/.claude/hooks/squish"
|
|
31
|
-
|
|
32
|
-
if [ -f "$SETTINGS_FILE" ]; then
|
|
33
|
-
echo ""
|
|
34
|
-
echo "Found Claude Code settings at $SETTINGS_FILE"
|
|
35
|
-
echo ""
|
|
36
|
-
echo "To enable hooks, add this to your settings.json:"
|
|
37
|
-
echo ""
|
|
38
|
-
cat << 'SETTINGS_JSON'
|
|
39
|
-
{
|
|
40
|
-
"hooks": {
|
|
41
|
-
"SessionStart": [
|
|
42
|
-
{ "matcher": "startup", "hooks": [{ "type": "command", "command": "squish", "args": ["hooks", "session-start", "--agent", "claude-code", "--mode", "startup"], "matcher": "startup" }] },
|
|
43
|
-
{ "matcher": "resume", "hooks": [{ "type": "command", "command": "squish", "args": ["hooks", "session-start", "--agent", "claude-code", "--mode", "resume"], "matcher": "resume" }] },
|
|
44
|
-
{ "matcher": "compact", "hooks": [{ "type": "command", "command": "squish", "args": ["hooks", "session-start", "--agent", "claude-code", "--mode", "compact"], "matcher": "compact" }] }
|
|
45
|
-
],
|
|
46
|
-
"PostToolUse": [
|
|
47
|
-
{ "hooks": [{ "type": "command", "command": "squish", "args": ["hooks", "post-tool-use", "--agent", "claude-code"], "timeout": 5 }] }
|
|
48
|
-
],
|
|
49
|
-
"SessionEnd": [
|
|
50
|
-
{ "hooks": [{ "type": "command", "command": "squish", "args": ["hooks", "session-end", "--agent", "claude-code"], "timeout": 10 }] }
|
|
51
|
-
],
|
|
52
|
-
"PreCompact": [
|
|
53
|
-
{ "matcher": "auto", "hooks": [{ "type": "command", "command": "squish", "args": ["hooks", "pre-compact", "--agent", "claude-code"], "matcher": "auto" }] }
|
|
54
|
-
]
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
SETTINGS_JSON
|
|
58
|
-
|
|
59
|
-
echo ""
|
|
60
|
-
echo "OR use the simplified approach - add MCP servers for memory:"
|
|
61
|
-
echo ""
|
|
62
|
-
cat << 'MCP_CONFIG'
|
|
63
|
-
{
|
|
64
|
-
"mcpServers": {
|
|
65
|
-
"squish-memory": {
|
|
66
|
-
"command": "squish",
|
|
67
|
-
"args": ["run", "mcp"]
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
MCP_CONFIG
|
|
72
|
-
else
|
|
73
|
-
echo ""
|
|
74
|
-
echo "WARNING: Claude Code settings file not found at $SETTINGS_FILE"
|
|
75
|
-
echo "Install Claude Code first, then rerun this script"
|
|
76
|
-
fi
|
|
77
|
-
|
|
78
|
-
echo ""
|
|
79
|
-
echo "Installation complete!"
|
|
80
|
-
echo ""
|
|
81
|
-
echo "Next steps:"
|
|
82
|
-
echo "1. Add MCP server config to your .claude.json or settings.json"
|
|
83
|
-
echo "2. Restart Claude Code"
|
|
84
|
-
echo "3. Run 'squish health' to verify"
|
|
85
|
-
echo ""
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Install Squish hooks for Cursor
|
|
3
|
-
# Run from the squish project directory
|
|
4
|
-
|
|
5
|
-
set -e
|
|
6
|
-
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
-
SQUISH_DIR="${SQUISH_DIR:-$HOME/.squish}"
|
|
9
|
-
HOOKS_CONFIG="$SCRIPT_DIR/config/hooks/cursor-hooks.json"
|
|
10
|
-
|
|
11
|
-
echo "Installing Squish hooks for Cursor..."
|
|
12
|
-
|
|
13
|
-
# Create Squish config directory
|
|
14
|
-
mkdir -p "$SQUISH_DIR"
|
|
15
|
-
|
|
16
|
-
# Copy hook config
|
|
17
|
-
if [ -f "$HOOKS_CONFIG" ]; then
|
|
18
|
-
cp "$HOOKS_CONFIG" "$SQUISH_DIR/hooks-cursor.json"
|
|
19
|
-
echo "Copied hook config to $SQUISH_DIR/hooks-cursor.json"
|
|
20
|
-
else
|
|
21
|
-
echo "ERROR: Hook config not found at $HOOKS_CONFIG"
|
|
22
|
-
exit 1
|
|
23
|
-
fi
|
|
24
|
-
|
|
25
|
-
# Check for Cursor MCP config
|
|
26
|
-
MCP_FILE="$HOME/.cursor/mcp.json"
|
|
27
|
-
|
|
28
|
-
if [ -f "$MCP_FILE" ]; then
|
|
29
|
-
echo ""
|
|
30
|
-
echo "Found Cursor MCP config at $MCP_FILE"
|
|
31
|
-
echo ""
|
|
32
|
-
echo "To enable Squish, add squish to your MCP servers:"
|
|
33
|
-
else
|
|
34
|
-
echo ""
|
|
35
|
-
echo "Creating Cursor MCP config..."
|
|
36
|
-
mkdir -p "$HOME/.cursor"
|
|
37
|
-
cat > "$MCP_FILE" << 'DEFAULT_MCP'
|
|
38
|
-
{
|
|
39
|
-
"mcpServers": {
|
|
40
|
-
"squish": {
|
|
41
|
-
"command": "squish",
|
|
42
|
-
"args": ["run", "mcp"]
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
DEFAULT_MCP
|
|
47
|
-
echo "Created $MCP_FILE"
|
|
48
|
-
fi
|
|
49
|
-
|
|
50
|
-
echo ""
|
|
51
|
-
echo "Installation complete!"
|
|
52
|
-
echo ""
|
|
53
|
-
echo "Next steps:"
|
|
54
|
-
echo "1. Restart Cursor"
|
|
55
|
-
echo "2. Run 'squish health' to verify"
|
|
56
|
-
echo ""
|
package/scripts/install-hooks.sh
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Install Squish hooks for Claude Code
|
|
3
|
-
# Run from the squish project directory
|
|
4
|
-
|
|
5
|
-
set -e
|
|
6
|
-
|
|
7
|
-
HOOKS_DIR="$HOME/.claude/hooks/squish"
|
|
8
|
-
SQUISH_DIR="${SQUISH_DIR:-$HOME/.squish}"
|
|
9
|
-
|
|
10
|
-
echo "Installing Squish Claude Code hooks..."
|
|
11
|
-
|
|
12
|
-
# Create hooks directory
|
|
13
|
-
mkdir -p "$HOOKS_DIR"
|
|
14
|
-
|
|
15
|
-
# Copy hook scripts
|
|
16
|
-
echo "Copying hook scripts..."
|
|
17
|
-
cp -r core/agent-adapters/claude-code/hooks/*.sh "$HOOKS_DIR/"
|
|
18
|
-
chmod +x "$HOOKS_DIR"/*.sh
|
|
19
|
-
|
|
20
|
-
# Create config file if needed
|
|
21
|
-
if [ ! -f "$SQUISH_DIR/config.env" ]; then
|
|
22
|
-
mkdir -p "$SQUISH_DIR"
|
|
23
|
-
echo "SQUISH_DIR=$SQUISH_DIR" > "$SQUISH_DIR/config.env"
|
|
24
|
-
fi
|
|
25
|
-
|
|
26
|
-
# Check if squish is in PATH
|
|
27
|
-
if ! command -v squish &> /dev/null; then
|
|
28
|
-
echo ""
|
|
29
|
-
echo "WARNING: squish not found in PATH"
|
|
30
|
-
echo "Add squish to your PATH or set SQUISH_DIR explicitly"
|
|
31
|
-
echo ""
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
# Add to settings.json (merge with existing)
|
|
35
|
-
SETTINGS_FILE="$HOME/.claude/settings.json"
|
|
36
|
-
HOOKS_JSON='{
|
|
37
|
-
"hooks": {
|
|
38
|
-
"SessionStart": [
|
|
39
|
-
{ "matcher": "startup", "hooks": [{ "type": "command", "command": "'"$HOOKS_DIR"'/session-start.sh", "matcher": "startup" }] },
|
|
40
|
-
{ "matcher": "resume", "hooks": [{ "type": "command", "command": "'"$HOOKS_DIR"'/session-start.sh", "matcher": "resume" }] },
|
|
41
|
-
{ "matcher": "compact", "hooks": [{ "type": "command", "command": "'"$HOOKS_DIR"'/session-start.sh", "matcher": "compact" }] }
|
|
42
|
-
],
|
|
43
|
-
"PreCompact": [
|
|
44
|
-
{ "matcher": "auto", "hooks": [{ "type": "command", "command": "'"$HOOKS_DIR"'/precompact-handover.sh", "matcher": "auto" }] }
|
|
45
|
-
],
|
|
46
|
-
"PostToolUse": [
|
|
47
|
-
{ "hooks": [{ "type": "command", "command": "'"$HOOKS_DIR"'/post-tool-use.sh", "timeout": 5 }] }
|
|
48
|
-
],
|
|
49
|
-
"SessionEnd": [
|
|
50
|
-
{ "hooks": [{ "type": "command", "command": "'"$HOOKS_DIR"'/session-end.sh", "timeout": 10 }] }
|
|
51
|
-
]
|
|
52
|
-
}
|
|
53
|
-
}'
|
|
54
|
-
|
|
55
|
-
if [ -f "$SETTINGS_FILE" ]; then
|
|
56
|
-
# Backup existing settings
|
|
57
|
-
cp "$SETTINGS_FILE" "$SETTINGS_FILE.bak"
|
|
58
|
-
echo "Backed up settings.json to settings.json.bak"
|
|
59
|
-
# Note: Full merge would require jq, keeping it simple
|
|
60
|
-
echo "Manual merge needed - see core/agent-adapters/claude-code/README.md"
|
|
61
|
-
else
|
|
62
|
-
echo "$HOOKS_JSON" > "$SETTINGS_FILE"
|
|
63
|
-
fi
|
|
64
|
-
|
|
65
|
-
echo ""
|
|
66
|
-
echo "Installation complete!"
|
|
67
|
-
echo ""
|
|
68
|
-
echo "Next steps:"
|
|
69
|
-
echo "1. Verify hooks directory: ls $HOOKS_DIR"
|
|
70
|
-
echo "2. Update ~/.claude/settings.json with the hooks config"
|
|
71
|
-
echo "3. Restart Claude Code"
|
|
72
|
-
echo ""
|
|
73
|
-
echo "For troubleshooting, see: core/agent-adapters/claude-code/README.md"
|
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Squish MCP Installer
|
|
5
|
-
* Installs Squish MCP configuration for various AI clients
|
|
6
|
-
* Supports: Claude Code, OpenCode, Codex, Cursor, VS Code, Windsurf
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* bun run install # Interactive wizard
|
|
10
|
-
* bun run install --all # Auto-install for all detected clients
|
|
11
|
-
* bun run install --clients=claude-code,opencode # Specific clients
|
|
12
|
-
* bun run install --dry-run # Preview without installing
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { intro, outro, confirm, multiselect, select, isCancel, cancel, spinner, note } from '@clack/prompts';
|
|
16
|
-
import picocolors from 'picocolors';
|
|
17
|
-
import fs from "node:fs";
|
|
18
|
-
import os from "node:os";
|
|
19
|
-
import path from "node:path";
|
|
20
|
-
|
|
21
|
-
const root = process.cwd();
|
|
22
|
-
const manifestPath = path.join(root, "config", "plugin-manifest.json");
|
|
23
|
-
|
|
24
|
-
const c = picocolors;
|
|
25
|
-
|
|
26
|
-
const icons = {
|
|
27
|
-
squish: "🐙",
|
|
28
|
-
check: "✓",
|
|
29
|
-
cross: "✗",
|
|
30
|
-
arrow: "→",
|
|
31
|
-
dot: "●",
|
|
32
|
-
mcp: "🔌",
|
|
33
|
-
settings: "⚙️"
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
// Client config file locations
|
|
37
|
-
const CLIENT_CONFIGS = {
|
|
38
|
-
"claude-code": { dir: path.join(os.homedir(), ".claude"), file: "mcp.json" },
|
|
39
|
-
opencode: { dir: path.join(os.homedir(), ".config", "opencode"), file: "mcp-servers.json" },
|
|
40
|
-
codex: { dir: path.join(os.homedir(), ".codex"), file: "mcp-servers.json" },
|
|
41
|
-
cursor: { dir: path.join(os.homedir(), ".cursor"), file: "mcp.json" },
|
|
42
|
-
vscode: { dir: path.join(os.homedir(), ".vscode", "mcp"), file: "servers.json" },
|
|
43
|
-
windsurf: { dir: path.join(os.homedir(), ".windsurf"), file: "mcp-servers.json" }
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// CLI argument parsing
|
|
47
|
-
function parseArgs() {
|
|
48
|
-
const args = process.argv.slice(2);
|
|
49
|
-
const options = {
|
|
50
|
-
all: false,
|
|
51
|
-
clients: [],
|
|
52
|
-
dryRun: false,
|
|
53
|
-
help: false
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
for (const arg of args) {
|
|
57
|
-
if (arg === '--all') options.all = true;
|
|
58
|
-
else if (arg === '--dry-run') options.dryRun = true;
|
|
59
|
-
else if (arg === '--help' || arg === '-h') options.help = true;
|
|
60
|
-
else if (arg.startsWith('--clients=')) {
|
|
61
|
-
options.clients = arg.slice(10).split(',').map(c => c.trim());
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return options;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function printHelp() {
|
|
69
|
-
printLogo();
|
|
70
|
-
console.log(c.white("Usage:"));
|
|
71
|
-
console.log(` ${c.cyan("bun run install")} # Interactive wizard`);
|
|
72
|
-
console.log(` ${c.cyan("bun run install --all")} # Auto-install for all detected clients`);
|
|
73
|
-
console.log(` ${c.cyan("bun run install --clients=claude-code,opencode")} # Specific clients`);
|
|
74
|
-
console.log(` ${c.cyan("bun run install --dry-run")} # Preview without installing\n`);
|
|
75
|
-
console.log(c.white("Options:"));
|
|
76
|
-
console.log(` ${c.cyan("--all")} Install for all supported clients`);
|
|
77
|
-
console.log(` ${c.cyan("--clients=")} Comma-separated list of clients`);
|
|
78
|
-
console.log(` ${c.cyan("--dry-run")} Preview changes without installing`);
|
|
79
|
-
console.log(` ${c.cyan("--help")} Show this help message\n`);
|
|
80
|
-
console.log(c.white("Supported clients:"));
|
|
81
|
-
console.log(` claude-code, opencode, codex, cursor, vscode, windsurf`);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function printLogo() {
|
|
85
|
-
console.log(c.cyan(`
|
|
86
|
-
██████╗ ██████╗ ██╗ ██╗██╗███████╗██╗ ██╗
|
|
87
|
-
██╔════╝██╔═══██╗██║ ██║██║██╔════╝██║ ██║
|
|
88
|
-
██████╗██║ ██║██║ ██║██║███████╗███████║
|
|
89
|
-
╚════██║██║ ██║██║ ██║██║╚════██║██╔══██║
|
|
90
|
-
██████║╚██████╔╝╚██████╔╝██║███████║██║ ██║
|
|
91
|
-
╚═════╝ ╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═╝ ╚═╝
|
|
92
|
-
`));
|
|
93
|
-
console.log(c.gray(" Universal Memory System for AI Agents\n"));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function loadManifest() {
|
|
97
|
-
if (!fs.existsSync(manifestPath)) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
try {
|
|
101
|
-
return JSON.parse(fs.readFileSync(manifestPath, "utf8"));
|
|
102
|
-
} catch {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function detectClients() {
|
|
108
|
-
const detected = {};
|
|
109
|
-
for (const [client, config] of Object.entries(CLIENT_CONFIGS)) {
|
|
110
|
-
const configPath = path.join(config.dir, config.file);
|
|
111
|
-
detected[client] = fs.existsSync(config.dir);
|
|
112
|
-
}
|
|
113
|
-
return detected;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function expandPath(filePath) {
|
|
117
|
-
if (filePath.startsWith("~")) {
|
|
118
|
-
return path.join(os.homedir(), filePath.slice(2));
|
|
119
|
-
}
|
|
120
|
-
return filePath;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function ensureDir(dirPath) {
|
|
124
|
-
if (!fs.existsSync(dirPath)) {
|
|
125
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
function backupFile(filePath) {
|
|
130
|
-
if (fs.existsSync(filePath)) {
|
|
131
|
-
const backupPath = `${filePath}.bak.${Date.now()}`;
|
|
132
|
-
fs.copyFileSync(filePath, backupPath);
|
|
133
|
-
console.log(c.gray(` Backed up: ${backupPath}`));
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Generate MCP config for each client format
|
|
138
|
-
function generateMCPConfig(client, manifest) {
|
|
139
|
-
const target = manifest.targets[client];
|
|
140
|
-
if (!target) return null;
|
|
141
|
-
|
|
142
|
-
// OpenCode format: { "server-name": { type, command, enabled } }
|
|
143
|
-
if (target.format === "opencode") {
|
|
144
|
-
return {
|
|
145
|
-
[target.serverName]: {
|
|
146
|
-
type: target.type === "local" ? "local" : "stdio",
|
|
147
|
-
command: Array.isArray(target.command) ? target.command : [target.command],
|
|
148
|
-
enabled: target.enabled !== false
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Standard MCP format: { mcpServers: { "server-name": { type, command, args, env } } }
|
|
154
|
-
return {
|
|
155
|
-
mcpServers: {
|
|
156
|
-
[target.serverName]: {
|
|
157
|
-
command: target.command,
|
|
158
|
-
args: target.args || ["--stdio"],
|
|
159
|
-
env: target.env || {}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Merge MCP config with existing config
|
|
166
|
-
function mergeMCPConfig(client, manifest, options = {}) {
|
|
167
|
-
const target = manifest.targets[client];
|
|
168
|
-
if (!target) return { error: `Unknown client: ${client}` };
|
|
169
|
-
|
|
170
|
-
const configInfo = CLIENT_CONFIGS[client];
|
|
171
|
-
const configPath = expandPath(path.join(configInfo.dir, configInfo.file));
|
|
172
|
-
|
|
173
|
-
// Generate new config
|
|
174
|
-
const newConfig = generateMCPConfig(client, manifest);
|
|
175
|
-
if (!newConfig) return { error: "Failed to generate config" };
|
|
176
|
-
|
|
177
|
-
ensureDir(configInfo.dir);
|
|
178
|
-
|
|
179
|
-
let existingConfig = {};
|
|
180
|
-
if (fs.existsSync(configPath)) {
|
|
181
|
-
try {
|
|
182
|
-
existingConfig = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
183
|
-
} catch {
|
|
184
|
-
existingConfig = {};
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Merge based on format
|
|
189
|
-
let merged;
|
|
190
|
-
if (target.format === "opencode") {
|
|
191
|
-
// OpenCode format: merge at root level
|
|
192
|
-
merged = { ...existingConfig, ...newConfig };
|
|
193
|
-
} else {
|
|
194
|
-
// Standard format: merge under mcpServers
|
|
195
|
-
merged = { ...existingConfig };
|
|
196
|
-
if (!merged.mcpServers) merged.mcpServers = {};
|
|
197
|
-
merged.mcpServers = { ...merged.mcpServers, ...newConfig.mcpServers };
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Write config
|
|
201
|
-
if (!options.dryRun) {
|
|
202
|
-
backupFile(configPath);
|
|
203
|
-
fs.writeFileSync(configPath, JSON.stringify(merged, null, 2));
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return { ok: true, configPath, merged };
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function getClientChoices(manifest, detected) {
|
|
210
|
-
if (!manifest || !manifest.targets) return [];
|
|
211
|
-
|
|
212
|
-
const clientNames = {
|
|
213
|
-
"claude-code": "Claude Code",
|
|
214
|
-
opencode: "OpenCode",
|
|
215
|
-
codex: "Codex",
|
|
216
|
-
cursor: "Cursor",
|
|
217
|
-
vscode: "VS Code",
|
|
218
|
-
windsurf: "Windsurf"
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
return Object.keys(manifest.targets).map(client => {
|
|
222
|
-
const isInstalled = detected[client];
|
|
223
|
-
const name = clientNames[client] || client;
|
|
224
|
-
let label = name;
|
|
225
|
-
if (isInstalled) label += ` ${c.green(icons.check)}`;
|
|
226
|
-
return {
|
|
227
|
-
value: client,
|
|
228
|
-
label: label,
|
|
229
|
-
hint: isInstalled ? "Config found" : "Not detected"
|
|
230
|
-
};
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
async function main() {
|
|
235
|
-
const opts = parseArgs();
|
|
236
|
-
|
|
237
|
-
if (opts.help) {
|
|
238
|
-
printHelp();
|
|
239
|
-
process.exit(0);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
const manifest = loadManifest();
|
|
243
|
-
if (!manifest) {
|
|
244
|
-
console.log(c.red("Error: Plugin manifest not found"));
|
|
245
|
-
process.exit(1);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
const detected = detectClients();
|
|
249
|
-
const choices = getClientChoices(manifest, detected);
|
|
250
|
-
|
|
251
|
-
let clients;
|
|
252
|
-
|
|
253
|
-
// Non-interactive mode
|
|
254
|
-
if (opts.all) {
|
|
255
|
-
// Install for all supported clients
|
|
256
|
-
clients = choices.map(c => c.value);
|
|
257
|
-
printLogo();
|
|
258
|
-
console.log(c.cyan(`Auto-installing for all ${clients.length} clients...\n`));
|
|
259
|
-
} else if (opts.clients.length > 0) {
|
|
260
|
-
// Install for specific clients
|
|
261
|
-
clients = opts.clients;
|
|
262
|
-
printLogo();
|
|
263
|
-
console.log(c.cyan(`Installing for: ${clients.join(', ')}\n`));
|
|
264
|
-
} else if (process.stdin.isTTY) {
|
|
265
|
-
// Interactive mode
|
|
266
|
-
printLogo();
|
|
267
|
-
intro(c.cyan(`${icons.squish} Squish MCP Installer`));
|
|
268
|
-
|
|
269
|
-
// Select clients to install
|
|
270
|
-
clients = await multiselect({
|
|
271
|
-
message: 'Which AI agents do you want to install Squish MCP for?',
|
|
272
|
-
options: choices,
|
|
273
|
-
required: false
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
if (isCancel(clients) || !clients || clients.length === 0) {
|
|
277
|
-
console.log(c.yellow("No clients selected. Exiting."));
|
|
278
|
-
process.exit(0);
|
|
279
|
-
}
|
|
280
|
-
} else {
|
|
281
|
-
// Non-interactive without flags - show help
|
|
282
|
-
printHelp();
|
|
283
|
-
process.exit(0);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Dry run mode
|
|
287
|
-
if (opts.dryRun) {
|
|
288
|
-
console.log(c.yellow("\n--- DRY RUN MODE ---\n"));
|
|
289
|
-
for (const client of clients) {
|
|
290
|
-
const configInfo = CLIENT_CONFIGS[client];
|
|
291
|
-
console.log(` Would install for ${client}:`);
|
|
292
|
-
console.log(` Config: ${configInfo.dir}/${configInfo.file}`);
|
|
293
|
-
}
|
|
294
|
-
console.log("");
|
|
295
|
-
process.exit(0);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Non-interactive: skip review/confirm
|
|
299
|
-
const isInteractive = opts.all || opts.clients.length === 0 && process.stdin.isTTY;
|
|
300
|
-
|
|
301
|
-
if (isInteractive) {
|
|
302
|
-
// Review
|
|
303
|
-
let summary = `${c.white("Installation Summary:")}\n\n`;
|
|
304
|
-
summary += `${c.cyan("Installing Squish MCP for:")}\n`;
|
|
305
|
-
clients.forEach(client => {
|
|
306
|
-
const configInfo = CLIENT_CONFIGS[client];
|
|
307
|
-
summary += ` ${icons.check} ${client}\n`;
|
|
308
|
-
summary += ` ${c.gray(configInfo.dir)}\n`;
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
note(summary, 'Review');
|
|
312
|
-
|
|
313
|
-
const shouldInstall = await confirm({
|
|
314
|
-
message: 'Proceed with installation?',
|
|
315
|
-
initialValue: true
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
if (isCancel(shouldInstall) || !shouldInstall) {
|
|
319
|
-
console.log(c.yellow("Installation cancelled"));
|
|
320
|
-
process.exit(0);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Install
|
|
325
|
-
const s = spinner();
|
|
326
|
-
s.start('Installing MCP configurations...');
|
|
327
|
-
|
|
328
|
-
const results = [];
|
|
329
|
-
for (const client of clients) {
|
|
330
|
-
const result = mergeMCPConfig(client, manifest);
|
|
331
|
-
results.push({ client, ...result });
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
const errors = results.filter(r => r.error);
|
|
335
|
-
const success = results.filter(r => r.ok);
|
|
336
|
-
|
|
337
|
-
if (errors.length > 0) {
|
|
338
|
-
s.stop(c.red(`${icons.cross} Some installations failed`));
|
|
339
|
-
errors.forEach(e => console.log(c.red(` ${e.client}: ${e.error}`)));
|
|
340
|
-
} else {
|
|
341
|
-
s.stop(c.green(`${icons.check} Installed for ${success.length} client(s)`));
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// Next steps
|
|
345
|
-
console.log();
|
|
346
|
-
console.log(c.white("What's next?"));
|
|
347
|
-
console.log(` ${c.cyan(icons.arrow)} Restart your AI assistant(s)`);
|
|
348
|
-
console.log(` ${c.cyan(icons.arrow)} Try: squish remember "Your first memory"`);
|
|
349
|
-
console.log();
|
|
350
|
-
|
|
351
|
-
outro(c.green(`${icons.check} Installation Complete!`));
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
main().catch((err) => {
|
|
355
|
-
console.log(c.red(`Fatal error: ${err.message}`));
|
|
356
|
-
process.exit(1);
|
|
357
|
-
});
|