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.
Files changed (499) hide show
  1. package/.env.example +32 -16
  2. package/CHANGELOG.md +147 -0
  3. package/README.md +120 -78
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +46 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +19 -23
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +107 -52
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/core/algorithms/index.ts +39 -0
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/core/lib/db-client.ts +168 -0
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/core/lib/schemas.ts +102 -0
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/core/memory/index.ts +11 -0
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/core/places/index.ts +14 -0
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +581 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/core/scheduler/index.ts +8 -0
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/core/search/index.ts +4 -0
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/core/session/index.ts +7 -0
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/core/snapshots/cleanup.ts +13 -0
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/core/summarization/cleanup.ts +13 -0
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/core/utils/vector-operations.ts +135 -0
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +324 -0
  187. package/db/adapter.ts +215 -0
  188. package/db/bootstrap.ts +1055 -0
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/dist/config.d.ts +40 -17
  220. package/dist/config.js +150 -198
  221. package/dist/core/adapters/types.d.ts +13 -33
  222. package/dist/core/adapters/types.js +1 -1
  223. package/dist/core/agent-preferences.d.ts +16 -0
  224. package/dist/core/agent-preferences.js +124 -0
  225. package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
  226. package/dist/core/algorithms/types.d.ts +0 -8
  227. package/dist/core/associations.d.ts +3 -1
  228. package/dist/core/associations.js +37 -1
  229. package/dist/core/beliefs/decay.d.ts +27 -0
  230. package/dist/core/beliefs/decay.js +217 -0
  231. package/dist/core/beliefs/extractor.d.ts +9 -0
  232. package/dist/core/beliefs/extractor.js +113 -0
  233. package/dist/core/beliefs/store.d.ts +46 -0
  234. package/dist/core/beliefs/store.js +466 -0
  235. package/dist/core/beliefs/types.d.ts +28 -0
  236. package/dist/core/beliefs/types.js +2 -0
  237. package/dist/core/commands/mcp-server.d.ts +0 -1
  238. package/dist/core/commands/mcp-server.js +4 -737
  239. package/dist/core/commands/remember.d.ts +24 -0
  240. package/dist/core/commands/remember.js +144 -0
  241. package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
  242. package/dist/core/{toon.js → compression.js} +8 -8
  243. package/dist/core/context/agent-context.js +1 -1
  244. package/dist/core/embeddings/embeddings.d.ts +29 -0
  245. package/dist/core/embeddings/embeddings.js +546 -0
  246. package/dist/core/embeddings/google-multimodal.js +6 -2
  247. package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
  248. package/dist/core/embeddings/local-embeddings.js +11 -0
  249. package/dist/core/embeddings/qmd-client.js +1 -1
  250. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  251. package/dist/core/embeddings/transformers-local.js +213 -0
  252. package/dist/core/embeddings.d.ts +1 -28
  253. package/dist/core/embeddings.js +2 -453
  254. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  255. package/dist/core/graph/entity-deduplicator.js +183 -0
  256. package/dist/core/graph/graph-builder.d.ts +46 -0
  257. package/dist/core/graph/graph-builder.js +174 -0
  258. package/dist/core/graph/graph-traversal.d.ts +80 -0
  259. package/dist/core/graph/graph-traversal.js +315 -0
  260. package/dist/core/graph/index.d.ts +19 -0
  261. package/dist/core/graph/index.js +13 -0
  262. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  263. package/dist/core/graph/llm-entity-extractor.js +313 -0
  264. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  265. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  266. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  267. package/dist/core/graph/relationship-extractor.js +351 -0
  268. package/dist/core/hooks/agent-hooks.d.ts +10 -1
  269. package/dist/core/hooks/agent-hooks.js +301 -24
  270. package/dist/core/hot-cache.d.ts +86 -0
  271. package/dist/core/hot-cache.js +285 -0
  272. package/dist/core/index.d.ts +9 -9
  273. package/dist/core/index.js +9 -12
  274. package/dist/core/ingestion/core-memory.d.ts +2 -2
  275. package/dist/core/ingestion/core-memory.js +3 -3
  276. package/dist/core/ingestion/learnings.js +3 -0
  277. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  278. package/dist/core/ingestion/signal-engine.js +201 -0
  279. package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
  280. package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
  281. package/dist/core/lib/parse-embedding.d.ts +9 -0
  282. package/dist/core/lib/parse-embedding.js +58 -0
  283. package/dist/core/lib/schemas.d.ts +57 -54
  284. package/dist/core/lib/types.d.ts +45 -0
  285. package/dist/core/lib/types.js +6 -0
  286. package/dist/core/lib/utils.d.ts +4 -0
  287. package/dist/core/lib/utils.js +55 -0
  288. package/dist/core/lifecycle.d.ts +0 -1
  289. package/dist/core/lifecycle.js +13 -23
  290. package/dist/core/logger.d.ts +1 -0
  291. package/dist/core/logger.js +14 -8
  292. package/dist/core/mcp/tools.d.ts +0 -2
  293. package/dist/core/mcp/tools.js +0 -87
  294. package/dist/core/mcp/types.d.ts +25 -253
  295. package/dist/core/mcp/types.js +2 -2
  296. package/dist/core/memory/categorizer.js +1 -0
  297. package/dist/core/memory/consolidation.js +2 -28
  298. package/dist/core/memory/entity-extractor.d.ts +4 -0
  299. package/dist/core/memory/entity-extractor.js +30 -16
  300. package/dist/core/memory/explain.d.ts +18 -0
  301. package/dist/core/memory/explain.js +92 -0
  302. package/dist/core/memory/fact-deriver.d.ts +31 -0
  303. package/dist/core/memory/fact-deriver.js +236 -0
  304. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  305. package/dist/core/memory/hybrid-retrieval.js +25 -127
  306. package/dist/core/memory/hybrid-scorer.js +6 -23
  307. package/dist/core/memory/hybrid-search.d.ts +10 -7
  308. package/dist/core/memory/hybrid-search.js +458 -221
  309. package/dist/core/memory/importance.d.ts +0 -17
  310. package/dist/core/memory/importance.js +1 -58
  311. package/dist/core/memory/index.d.ts +1 -0
  312. package/dist/core/memory/index.js +1 -0
  313. package/dist/core/memory/memories.d.ts +13 -17
  314. package/dist/core/memory/memories.js +78 -75
  315. package/dist/core/memory/memory-lifecycle.d.ts +2 -2
  316. package/dist/core/memory/memory-lifecycle.js +10 -18
  317. package/dist/core/memory/normalization.d.ts +1 -16
  318. package/dist/core/memory/path-strengthener.d.ts +39 -0
  319. package/dist/core/memory/path-strengthener.js +150 -0
  320. package/dist/core/memory/query-processor.js +37 -3
  321. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  322. package/dist/core/memory/retrieval-feedback.js +213 -0
  323. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  324. package/dist/core/memory/stale-cleaner.js +97 -0
  325. package/dist/core/memory/stats.d.ts +10 -0
  326. package/dist/core/memory/stats.js +8 -3
  327. package/dist/core/memory/trigger-detector.d.ts +8 -1
  328. package/dist/core/memory/trigger-detector.js +42 -5
  329. package/dist/core/places/index.d.ts +1 -1
  330. package/dist/core/places/index.js +1 -1
  331. package/dist/core/places/places.d.ts +13 -13
  332. package/dist/core/places/places.js +27 -27
  333. package/dist/core/places/rules.js +23 -23
  334. package/dist/core/places/walking.d.ts +3 -3
  335. package/dist/core/places/walking.js +7 -7
  336. package/dist/core/projects.js +8 -0
  337. package/dist/core/runtime/trust-report.d.ts +102 -0
  338. package/dist/core/runtime/trust-report.js +107 -0
  339. package/dist/core/runtime/trust-state.d.ts +12 -0
  340. package/dist/core/runtime/trust-state.js +309 -0
  341. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  342. package/dist/core/scheduler/cron-scheduler.js +164 -3
  343. package/dist/core/scheduler/job-runner.js +1 -1
  344. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  345. package/dist/core/search/qmd-wrapper.js +58 -0
  346. package/dist/core/session/auto-load.js +28 -3
  347. package/dist/core/session/entity-tracker.d.ts +62 -0
  348. package/dist/core/session/entity-tracker.js +287 -0
  349. package/dist/core/session/reference-resolver.d.ts +26 -0
  350. package/dist/core/session/reference-resolver.js +121 -0
  351. package/dist/core/session/self-iteration-job.d.ts +15 -0
  352. package/dist/core/session/self-iteration-job.js +163 -58
  353. package/dist/core/session/working-set.d.ts +50 -0
  354. package/dist/core/session/working-set.js +212 -0
  355. package/dist/core/snapshots/creation.d.ts +2 -8
  356. package/dist/core/snapshots/creation.js +3 -12
  357. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  358. package/dist/core/utils/summarization-helpers.js +1 -6
  359. package/dist/db/bootstrap.d.ts +2 -0
  360. package/dist/db/bootstrap.js +229 -280
  361. package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
  362. package/dist/db/drizzle/schema-sqlite.js +83 -4
  363. package/dist/db/drizzle/schema.d.ts +653 -1
  364. package/dist/db/drizzle/schema.js +93 -4
  365. package/dist/db/migrations/associations.d.ts +6 -0
  366. package/dist/db/migrations/associations.js +29 -0
  367. package/dist/db/migrations/beliefs.d.ts +10 -0
  368. package/dist/db/migrations/beliefs.js +76 -0
  369. package/dist/db/migrations/core-memory.d.ts +6 -0
  370. package/dist/db/migrations/core-memory.js +29 -0
  371. package/dist/db/migrations/fts.d.ts +6 -0
  372. package/dist/db/migrations/fts.js +52 -0
  373. package/dist/db/migrations/index.d.ts +25 -0
  374. package/dist/db/migrations/index.js +51 -0
  375. package/dist/db/migrations/indexes.d.ts +6 -0
  376. package/dist/db/migrations/indexes.js +30 -0
  377. package/dist/db/migrations/learnings.d.ts +7 -0
  378. package/dist/db/migrations/learnings.js +26 -0
  379. package/dist/db/migrations/maintenance.d.ts +6 -0
  380. package/dist/db/migrations/maintenance.js +61 -0
  381. package/dist/db/migrations/memories.d.ts +7 -0
  382. package/dist/db/migrations/memories.js +16 -0
  383. package/dist/db/migrations/memory-places.d.ts +6 -0
  384. package/dist/db/migrations/memory-places.js +29 -0
  385. package/dist/db/migrations/places.d.ts +6 -0
  386. package/dist/db/migrations/places.js +43 -0
  387. package/dist/db/migrations/projects.d.ts +3 -0
  388. package/dist/db/migrations/projects.js +13 -0
  389. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  390. package/dist/db/migrations/tier-conversion.js +20 -0
  391. package/dist/db/schema/beliefs.d.ts +9 -0
  392. package/dist/db/schema/beliefs.js +46 -0
  393. package/dist/db/schema/generator.d.ts +38 -0
  394. package/dist/db/schema/generator.js +108 -0
  395. package/dist/db/schema/index.d.ts +19 -20
  396. package/dist/db/schema/index.js +25 -79
  397. package/dist/db/schema/learnings.d.ts +7 -0
  398. package/dist/db/schema/learnings.js +30 -0
  399. package/dist/db/schema/memories.d.ts +7 -0
  400. package/dist/db/schema/memories.js +81 -0
  401. package/dist/db/schema/projects.d.ts +4 -0
  402. package/dist/db/schema/projects.js +31 -0
  403. package/dist/packages/mcp/src/index.d.ts +3 -0
  404. package/dist/packages/mcp/src/index.js +733 -0
  405. package/mcp.json.example +8 -11
  406. package/package.json +57 -76
  407. package/packages/cli/package.json +22 -0
  408. package/packages/cli/src/commands/clean.ts +68 -0
  409. package/packages/cli/src/commands/context.ts +79 -0
  410. package/packages/cli/src/commands/doctor.ts +357 -0
  411. package/packages/cli/src/commands/forget.ts +72 -0
  412. package/packages/cli/src/commands/health.ts +36 -0
  413. package/packages/cli/src/commands/inspect.ts +41 -0
  414. package/packages/cli/src/commands/link.ts +50 -0
  415. package/packages/cli/src/commands/migrate.ts +93 -0
  416. package/packages/cli/src/commands/recall.ts +99 -0
  417. package/packages/cli/src/commands/recent.ts +57 -0
  418. package/packages/cli/src/commands/remember.ts +139 -0
  419. package/packages/cli/src/commands/run.ts +58 -0
  420. package/packages/cli/src/commands/stale.ts +43 -0
  421. package/packages/cli/src/commands/stats.ts +42 -0
  422. package/packages/cli/src/index.ts +57 -0
  423. package/packages/cli/tsconfig.json +24 -0
  424. package/packages/mcp/package.json +26 -0
  425. package/packages/mcp/src/index.ts +877 -0
  426. package/packages/mcp/tsconfig.json +20 -0
  427. package/skills/squish-memory/SKILL.md +38 -35
  428. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  429. package/skills/squish-memory/references/claude-desktop.json +12 -0
  430. package/skills/squish-memory/references/openclaw.json +13 -0
  431. package/skills/squish-memory/references/opencode.json +14 -0
  432. package/config/hooks/claude-code-hooks.json +0 -39
  433. package/config/hooks/cursor-hooks.json +0 -30
  434. package/config/hooks/opencode-hooks.json +0 -30
  435. package/config/hooks/windsurf-hooks.json +0 -30
  436. package/config/mcp-cli-fallback-policy.json +0 -22
  437. package/config/mcp.json +0 -38
  438. package/config/plugin-manifest.json +0 -101
  439. package/config/plugin-manifest.schema.json +0 -244
  440. package/config/plugin.json +0 -32
  441. package/config/remote-memory-policy.json +0 -32
  442. package/core/commands/context-paging.md +0 -51
  443. package/core/commands/context-status.md +0 -22
  444. package/core/commands/context.md +0 -5
  445. package/core/commands/core-memory.md +0 -56
  446. package/core/commands/health.md +0 -5
  447. package/core/commands/init.md +0 -39
  448. package/core/commands/merge.md +0 -113
  449. package/core/commands/recall.md +0 -5
  450. package/core/commands/remember.md +0 -11
  451. package/core/commands/search.md +0 -10
  452. package/dist/core/commands/managed-sync.d.ts +0 -10
  453. package/dist/core/commands/managed-sync.js +0 -64
  454. package/dist/core/external-folder/index.d.ts +0 -102
  455. package/dist/core/external-folder/index.js +0 -294
  456. package/dist/core/namespaces/index.d.ts +0 -71
  457. package/dist/core/namespaces/index.js +0 -305
  458. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  459. package/dist/core/namespaces/uri-parser.js +0 -74
  460. package/dist/core/search/qmd-search.d.ts +0 -61
  461. package/dist/core/search/qmd-search.js +0 -178
  462. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  463. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  464. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  465. package/dist/core/session-hooks/session-hooks.js +0 -58
  466. package/dist/core/snapshots.d.ts +0 -29
  467. package/dist/core/snapshots.js +0 -220
  468. package/dist/core/sync/qmd-sync.d.ts +0 -94
  469. package/dist/core/sync/qmd-sync.js +0 -201
  470. package/dist/index.d.ts +0 -7
  471. package/dist/index.js +0 -1677
  472. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  473. package/dist/webui/server.d.ts +0 -5
  474. package/dist/webui/server.js +0 -642
  475. package/generated/mcp/manifest.json +0 -23
  476. package/generated/mcp/mcp-servers.json +0 -25
  477. package/generated/mcp/mcporter.json +0 -34
  478. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  479. package/generated/mcp/runtime.json +0 -12
  480. package/scripts/README.md +0 -60
  481. package/scripts/build-release.sh +0 -36
  482. package/scripts/check-secrets.js +0 -132
  483. package/scripts/copy-runtime-assets.mjs +0 -26
  484. package/scripts/generate-mcp.mjs +0 -264
  485. package/scripts/github-release.sh +0 -77
  486. package/scripts/init-dirs.mjs +0 -13
  487. package/scripts/install-claude-code.sh +0 -85
  488. package/scripts/install-cursor.sh +0 -56
  489. package/scripts/install-hooks.sh +0 -73
  490. package/scripts/install-interactive.mjs +0 -357
  491. package/scripts/install-opencode.sh +0 -75
  492. package/scripts/install-plugin.mjs +0 -415
  493. package/scripts/install-windsurf.sh +0 -67
  494. package/scripts/remote-preflight.mjs +0 -62
  495. package/scripts/squish-fallback.mjs +0 -132
  496. package/scripts/test-interactive.mjs +0 -131
  497. package/scripts/verify-mcp.mjs +0 -214
  498. package/skills/squish-memory/scripts/install.mjs +0 -335
  499. 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!"
@@ -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 ""
@@ -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
- });