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
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Squish Doctor Command
3
+ *
4
+ * Diagnose and fix common Squish issues automatically.
5
+ *
6
+ * Usage:
7
+ * squish doctor # Run diagnostics
8
+ * squish doctor --fix # Auto-fix issues
9
+ * squish doctor --migrate # Force run database migrations
10
+ */
11
+
12
+ import { Command } from 'commander';
13
+ import fs from 'node:fs';
14
+ import path from 'node:path';
15
+ import { getDataDir, config } from '../../../../config.js';
16
+ import { createDb, getDb } from '../../../../db/index.js';
17
+ import { buildHealthState } from '../../../../core/runtime/trust-state.js';
18
+ import { formatHealthReport } from '../../../../core/runtime/trust-report.js';
19
+
20
+ interface DiagnosticResult {
21
+ name: string;
22
+ status: 'ok' | 'degraded' | 'broken';
23
+ message: string;
24
+ fix?: string;
25
+ }
26
+
27
+ export function registerDoctorCommand(program: Command) {
28
+ program
29
+ .command('doctor')
30
+ .description('Diagnose and fix Squish issues')
31
+ .option('-f, --fix', 'Auto-fix issues when possible')
32
+ .option('-m, --migrate', 'Force run database migrations')
33
+ .option('-v, --verbose', 'Show detailed output')
34
+ .option('-p, --project <project>', 'Project path')
35
+ .option('--json', 'Emit machine-readable output', false)
36
+ .action(async (options) => {
37
+ const previousQuiet = process.env.SQUISH_QUIET;
38
+ if (options.json) {
39
+ process.env.SQUISH_QUIET = '1';
40
+ }
41
+ try {
42
+ await runDoctorDiagnostics(options);
43
+ } finally {
44
+ if (options.json) {
45
+ if (previousQuiet === undefined) {
46
+ delete process.env.SQUISH_QUIET;
47
+ } else {
48
+ process.env.SQUISH_QUIET = previousQuiet;
49
+ }
50
+ }
51
+ }
52
+ });
53
+ }
54
+
55
+ async function runDoctorDiagnostics(options: { fix?: boolean; migrate?: boolean; verbose?: boolean; project?: string; json?: boolean }) {
56
+ const results: DiagnosticResult[] = [];
57
+ const dataDir = getDataDir();
58
+
59
+ // Check 1: Data directory exists
60
+ const diagnostic1 = await checkDataDirectory(dataDir);
61
+ results.push(diagnostic1);
62
+
63
+ // Check 2: Database file
64
+ const diagnostic2 = await checkDatabaseFile(dataDir);
65
+ results.push(diagnostic2);
66
+
67
+ // Check 3: Schema version (if database exists)
68
+ if (diagnostic2.status !== 'fail') {
69
+ const diagnostic3 = await checkSchemaVersion(options.migrate || false);
70
+ results.push(diagnostic3);
71
+ }
72
+
73
+ // Check 4: Config valid
74
+ const diagnostic4 = checkConfig();
75
+ results.push(diagnostic4);
76
+
77
+ // Check 5: bin/ files exist
78
+ const diagnostic5 = checkBinFiles();
79
+ results.push(diagnostic5);
80
+
81
+ let health;
82
+ try {
83
+ health = await buildHealthState(options.project);
84
+ } catch (error: any) {
85
+ health = {
86
+ severity: 'degraded' as const,
87
+ currentProject: options.project || process.cwd(),
88
+ checks: [
89
+ {
90
+ name: 'runtime health',
91
+ status: 'degraded' as const,
92
+ detail: `Skipped until schema is readable: ${error.message}`,
93
+ },
94
+ ],
95
+ nextStep: 'Run `squish doctor --migrate` to repair the local schema, then rerun diagnostics.',
96
+ };
97
+ }
98
+
99
+ const combinedSeverity = [health.severity, ...results.map((result) => result.status)].includes('broken')
100
+ ? 'broken'
101
+ : ([health.severity, ...results.map((result) => result.status)].includes('degraded') ? 'degraded' : 'ok');
102
+ const nextStep =
103
+ health.nextStep ??
104
+ results.find((result) => result.fix)?.fix ??
105
+ (options.fix ? 'Apply the suggested fixes, then rerun `squish doctor`.' : null);
106
+
107
+ const combined = {
108
+ severity: combinedSeverity as 'ok' | 'degraded' | 'broken',
109
+ currentProject: health.currentProject,
110
+ checks: health.checks,
111
+ diagnostics: results.map((result) => ({
112
+ name: result.name,
113
+ status: result.status,
114
+ detail: result.message,
115
+ fix: result.fix,
116
+ })),
117
+ nextStep,
118
+ };
119
+
120
+ if (options.json) {
121
+ console.log(JSON.stringify({ ok: combined.severity !== 'broken', ...combined }, null, 2));
122
+ process.exit(combined.severity === 'broken' ? 1 : 0);
123
+ }
124
+
125
+ console.log('\n=== Squish Doctor v1.2.0 ===\n');
126
+ console.log(formatHealthReport({
127
+ severity: combined.severity,
128
+ currentProject: combined.currentProject,
129
+ checks: combined.checks,
130
+ diagnostics: combined.diagnostics,
131
+ nextStep: combined.nextStep,
132
+ }));
133
+
134
+ if (options.verbose) {
135
+ console.log('\nDiagnostic detail');
136
+ for (const result of results) {
137
+ console.log(`- ${result.name}: ${result.message}`);
138
+ if (result.fix) {
139
+ console.log(` fix: ${result.fix}`);
140
+ }
141
+ }
142
+ }
143
+
144
+ process.exit(combined.severity === 'broken' ? 1 : 0);
145
+ }
146
+
147
+ async function checkDataDirectory(dataDir: string): Promise<DiagnosticResult> {
148
+ try {
149
+ if (!fs.existsSync(dataDir)) {
150
+ // Try to create it
151
+ fs.mkdirSync(dataDir, { recursive: true });
152
+ return { name: 'data directory', status: 'ok', message: 'Created data directory' };
153
+ }
154
+ return { name: 'data directory', status: 'ok', message: dataDir };
155
+ } catch (error) {
156
+ return { name: 'data directory', status: 'broken', message: 'Cannot access data directory', fix: 'Check file permissions' };
157
+ }
158
+ }
159
+
160
+ async function checkDatabaseFile(dataDir: string): Promise<DiagnosticResult> {
161
+ const dbPath = path.join(dataDir, 'squish.db');
162
+
163
+ try {
164
+ if (!fs.existsSync(dbPath)) {
165
+ return { name: 'database file', status: 'degraded', message: 'Database not found (will be created on first use)', fix: 'Run any squish command to create the local database.' };
166
+ }
167
+ return { name: 'database file', status: 'ok', message: dbPath };
168
+ } catch (error) {
169
+ return { name: 'database file', status: 'broken', message: 'Cannot access database file', fix: 'Check file permissions' };
170
+ }
171
+ }
172
+
173
+ async function checkSchemaVersion(forceMigrate: boolean): Promise<DiagnosticResult> {
174
+ let dbClient: any;
175
+ try {
176
+ dbClient = await getDb();
177
+ } catch (error) {
178
+ if (!config.isTeamMode) {
179
+ return checkSqliteSchemaDirect(forceMigrate);
180
+ }
181
+ return { name: 'schema version', status: 'degraded', message: 'Cannot connect to database (no driver available)' };
182
+ }
183
+ if (!dbClient) {
184
+ return { name: 'schema version', status: 'degraded', message: 'Cannot connect to database (no driver available)' };
185
+ }
186
+
187
+ // Check for required tables
188
+ const requiredTables = [
189
+ 'memories',
190
+ 'learnings',
191
+ 'projects',
192
+ 'users',
193
+ 'conversations',
194
+ 'messages',
195
+ 'entities',
196
+ 'core_memory',
197
+ 'context_sessions',
198
+ 'memory_associations',
199
+ 'namespaces',
200
+ 'maintenance_jobs',
201
+ 'places',
202
+ 'memory_places',
203
+ 'place_rules',
204
+ 'session_summaries',
205
+ 'beliefs',
206
+ 'belief_memory_sources',
207
+ 'belief_edges',
208
+ ];
209
+
210
+ // Get SQLite vs Postgres client handling
211
+ const dbAny = dbClient as any;
212
+ const isSqlite = typeof dbAny.exec === 'function';
213
+
214
+ let existingTables: string[] = [];
215
+ if (isSqlite) {
216
+ const tables = dbAny.prepare("SELECT name FROM sqlite_master WHERE type='table'").all() as Array<{name: string}>;
217
+ existingTables = tables.map(t => t.name);
218
+ } else {
219
+ // Postgres
220
+ try {
221
+ const result = await dbAny.query("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
222
+ existingTables = result.rows?.map((r: any) => r.tablename) ?? [];
223
+ } catch {
224
+ existingTables = [];
225
+ }
226
+ }
227
+
228
+ const missingTables = requiredTables.filter(t => !existingTables.includes(t));
229
+
230
+ // If forceMigrate or missing tables, run migrations
231
+ if (forceMigrate || missingTables.length > 0) {
232
+ try {
233
+ // Import bootstrap functions
234
+ const { ensureSqliteSchema } = await import('../../../../db/bootstrap.js');
235
+ const { getSchemaVersion } = await import('../../../../db/bootstrap.js');
236
+
237
+ if (isSqlite) {
238
+ await ensureSqliteSchema(dbAny);
239
+ const version = await getSchemaVersion(dbAny);
240
+ return {
241
+ name: 'schema version',
242
+ status: 'ok',
243
+ message: `Migrations applied. Schema: ${version}`
244
+ };
245
+ }
246
+
247
+ return { name: 'schema version', status: 'ok', message: 'Database schema OK' };
248
+ } catch (error) {
249
+ const msg = error instanceof Error ? error.message : String(error);
250
+ return {
251
+ name: 'schema version',
252
+ status: 'degraded',
253
+ message: `Migration note: ${msg}`,
254
+ fix: 'Run "squish doctor --migrate" to retry'
255
+ };
256
+ }
257
+ }
258
+
259
+ return { name: 'schema version', status: 'ok', message: `Tables OK (${existingTables.length})` };
260
+ }
261
+
262
+ async function checkSqliteSchemaDirect(forceMigrate: boolean): Promise<DiagnosticResult> {
263
+ const dbPath = path.join(getDataDir(), 'squish.db');
264
+
265
+ try {
266
+ const sqliteModule = await import('bun:sqlite');
267
+ const sqlite = new sqliteModule.default(dbPath);
268
+ try {
269
+ const tables = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table'").all() as Array<{ name: string }>;
270
+ const existingTables = tables.map((table) => table.name);
271
+ const requiredTables = [
272
+ 'memories',
273
+ 'learnings',
274
+ 'projects',
275
+ 'users',
276
+ 'conversations',
277
+ 'messages',
278
+ 'entities',
279
+ 'core_memory',
280
+ 'context_sessions',
281
+ 'memory_associations',
282
+ 'namespaces',
283
+ 'maintenance_jobs',
284
+ 'places',
285
+ 'memory_places',
286
+ 'place_rules',
287
+ 'session_summaries',
288
+ 'beliefs',
289
+ 'belief_memory_sources',
290
+ 'belief_edges',
291
+ ];
292
+ const missingTables = requiredTables.filter((table) => !existingTables.includes(table));
293
+
294
+ if (forceMigrate || missingTables.length > 0) {
295
+ const { ensureSqliteSchema, getSchemaVersion } = await import('../../../../db/bootstrap.js');
296
+ await ensureSqliteSchema(sqlite as any);
297
+ const version = await getSchemaVersion(sqlite as any);
298
+ return {
299
+ name: 'schema version',
300
+ status: 'ok',
301
+ message: `Migrations applied. Schema: ${version}`,
302
+ };
303
+ }
304
+
305
+ return { name: 'schema version', status: 'ok', message: `Tables OK (${existingTables.length})` };
306
+ } finally {
307
+ sqlite.close();
308
+ }
309
+ } catch (error) {
310
+ const msg = error instanceof Error ? error.message : String(error);
311
+ return {
312
+ name: 'schema version',
313
+ status: 'degraded',
314
+ message: `Migration note: ${msg}`,
315
+ fix: 'Run "squish doctor --migrate" to retry',
316
+ };
317
+ }
318
+ }
319
+
320
+ function checkConfig(): DiagnosticResult {
321
+ try {
322
+ // Basic config validation
323
+ const dataDir = getDataDir();
324
+ const embeddingsProvider = config.embeddingsProvider;
325
+
326
+ return {
327
+ name: 'configuration',
328
+ status: 'ok',
329
+ message: `Provider: ${embeddingsProvider}, Data: ${dataDir}`
330
+ };
331
+ } catch (error) {
332
+ return { name: 'configuration', status: 'broken', message: 'Config validation failed', fix: 'Check config.ts' };
333
+ }
334
+ }
335
+
336
+ function checkBinFiles(): DiagnosticResult {
337
+ const binDir = path.join(process.cwd(), 'bin');
338
+
339
+ try {
340
+ const files = ['squish.mjs', 'squish-mcp.mjs', 'install-interactive.mjs'];
341
+ const missing: string[] = [];
342
+
343
+ for (const file of files) {
344
+ if (!fs.existsSync(path.join(binDir, file))) {
345
+ missing.push(file);
346
+ }
347
+ }
348
+
349
+ if (missing.length > 0) {
350
+ return { name: 'cli binaries', status: 'broken', message: `Missing: ${missing.join(', ')}` };
351
+ }
352
+
353
+ return { name: 'cli binaries', status: 'ok', message: 'All binaries present' };
354
+ } catch (error) {
355
+ return { name: 'cli binaries', status: 'broken', message: 'Cannot check binaries', fix: 'Reinstall squish-memory' };
356
+ }
357
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Forget Command - Delete memory
3
+ *
4
+ * Usage: squish forget <memoryId> [--confirm] [--older-than "30 days"]
5
+ */
6
+
7
+ import { Command } from 'commander';
8
+ import { eq } from 'drizzle-orm';
9
+ import { getDbClient } from '../../../../core/lib/db-client.js';
10
+ import { search } from '../../../../core/memory/memories.js';
11
+ import { filterByDateRange } from '../../../../core/lib/utils.js';
12
+
13
+ export function registerForgetCommand(program: Command) {
14
+ program
15
+ .command('forget <memoryId>')
16
+ .description('Delete memory (single or bulk with --older-than --search)')
17
+ .option('--older-than <period>', 'Bulk delete memories older than')
18
+ .option('--search <query>', 'Search query to match specific memories')
19
+ .option('--type <type>', 'Filter by memory type')
20
+ .option('--confirm', 'Actually delete (default is dry-run)', false)
21
+ .option('-l, --limit <number>', 'Max memories to delete', '100')
22
+ .option('-p, --project <project>', 'Project path', process.cwd())
23
+ .action(async (memoryId: string, options: any) => {
24
+ try {
25
+ const { db, schema } = await getDbClient();
26
+
27
+ if (memoryId && memoryId !== 'all') {
28
+ await db.delete(schema.memories).where(eq(schema.memories.id, memoryId));
29
+ console.log(JSON.stringify({ ok: true, deleted: 1, memoryId }));
30
+ return;
31
+ }
32
+
33
+ if (!options.olderThan && !options.search) {
34
+ console.error(JSON.stringify({
35
+ ok: false,
36
+ error: 'Provide memoryId or use --older-than / --search for bulk delete'
37
+ }));
38
+ process.exit(1);
39
+ }
40
+
41
+ const results = await search({
42
+ query: options.search || '',
43
+ project: options.project,
44
+ limit: parseInt(options.limit) || 100,
45
+ type: options.type
46
+ });
47
+
48
+ let filtered = results;
49
+ if (options.olderThan) {
50
+ filtered = filterByDateRange(results, '', options.olderThan);
51
+ }
52
+
53
+ const deleted = [];
54
+ if (options.confirm) {
55
+ for (const mem of filtered) {
56
+ await db.delete(schema.memories).where(eq(schema.memories.id, mem.id));
57
+ deleted.push(mem.id);
58
+ }
59
+ }
60
+
61
+ console.log(JSON.stringify({
62
+ ok: true,
63
+ matched: filtered.length,
64
+ deleted: deleted.length,
65
+ dryRun: !options.confirm
66
+ }, null, 2));
67
+ } catch (error: any) {
68
+ console.error(JSON.stringify({ ok: false, error: error.message }));
69
+ process.exit(1);
70
+ }
71
+ });
72
+ }
@@ -0,0 +1,36 @@
1
+ import { Command } from 'commander';
2
+ import { buildHealthState } from '../../../../core/runtime/trust-state.js';
3
+ import { formatHealthReport } from '../../../../core/runtime/trust-report.js';
4
+
5
+ export function registerHealthCommand(program: Command) {
6
+ program
7
+ .command('health')
8
+ .description('Show runtime health for the current project')
9
+ .option('-p, --project <project>', 'Project path')
10
+ .option('--json', 'Emit machine-readable output', false)
11
+ .action(async (options: any) => {
12
+ const previousQuiet = process.env.SQUISH_QUIET;
13
+ if (options.json) {
14
+ process.env.SQUISH_QUIET = '1';
15
+ }
16
+ try {
17
+ const health = await buildHealthState(options.project);
18
+ if (options.json) {
19
+ console.log(JSON.stringify({ ok: true, ...health }, null, 2));
20
+ return;
21
+ }
22
+ console.log(formatHealthReport(health));
23
+ } catch (error: any) {
24
+ console.error(JSON.stringify({ ok: false, error: error.message }));
25
+ process.exit(1);
26
+ } finally {
27
+ if (options.json) {
28
+ if (previousQuiet === undefined) {
29
+ delete process.env.SQUISH_QUIET;
30
+ } else {
31
+ process.env.SQUISH_QUIET = previousQuiet;
32
+ }
33
+ }
34
+ }
35
+ });
36
+ }
@@ -0,0 +1,41 @@
1
+ import { Command } from 'commander';
2
+ import { buildInspectState } from '../../../../core/runtime/trust-state.js';
3
+ import { formatInspectReport } from '../../../../core/runtime/trust-report.js';
4
+
5
+ export function registerInspectCommand(program: Command) {
6
+ program
7
+ .command('inspect <id>')
8
+ .description('Inspect how and why a memory was stored')
9
+ .option('-P, --pretty', 'Human-friendly output', false)
10
+ .option('--json', 'Emit machine-readable output', false)
11
+ .action(async (id: string, options: any) => {
12
+ const previousQuiet = process.env.SQUISH_QUIET;
13
+ if (options.json) {
14
+ process.env.SQUISH_QUIET = '1';
15
+ }
16
+ try {
17
+ const inspection = await buildInspectState(id);
18
+ if (!inspection) {
19
+ console.error(JSON.stringify({ ok: false, error: 'Memory not found' }));
20
+ process.exit(1);
21
+ }
22
+
23
+ if (options.json) {
24
+ console.log(JSON.stringify({ ok: true, inspection }, null, 2));
25
+ } else {
26
+ console.log(formatInspectReport(inspection));
27
+ }
28
+ } catch (error: any) {
29
+ console.error(JSON.stringify({ ok: false, error: error.message }));
30
+ process.exit(1);
31
+ } finally {
32
+ if (options.json) {
33
+ if (previousQuiet === undefined) {
34
+ delete process.env.SQUISH_QUIET;
35
+ } else {
36
+ process.env.SQUISH_QUIET = previousQuiet;
37
+ }
38
+ }
39
+ }
40
+ });
41
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Link Command - Manage memory associations
3
+ *
4
+ * Usage: squish link find <memoryId> [--depth 2]
5
+ * squish link add <fromId> <toId> [--type relates_to]
6
+ */
7
+
8
+ import { Command } from 'commander';
9
+ import { createAssociation, getRelatedMemories } from '../../../../core/associations.js';
10
+
11
+ export function registerLinkCommand(program: Command) {
12
+ program
13
+ .command('link <action> [args...]')
14
+ .description('Manage links (find/add/list)')
15
+ .option('-d, --depth <number>', 'Graph traversal depth', '2')
16
+ .option('-t, --type <type>', 'Association type', 'relates_to')
17
+ .option('-w, --weight <number>', 'Association weight', '0.5')
18
+ .action(async (action: string, args: string[], options: any) => {
19
+ try {
20
+ if (action === 'find' && args[0]) {
21
+ const related = await getRelatedMemories(args[0], options.depth * 5);
22
+ console.log(JSON.stringify({ ok: true, count: related.length, related }, null, 2));
23
+ } else if (action === 'add' && args[0] && args[1]) {
24
+ await createAssociation(args[0], args[1], options.type as any, options.weight);
25
+
26
+ // Auto-update knowledge graph (fire-and-forget)
27
+ try {
28
+ const { addMemoryToGraph } = await import('../../../../core/graph/graph-builder.js');
29
+ const [result1, result2] = await Promise.all([
30
+ addMemoryToGraph(args[0]).catch(() => null),
31
+ addMemoryToGraph(args[1]).catch(() => null)
32
+ ]);
33
+ if (result1 || result2) {
34
+ console.error(`[Graph] Updated graph for linked memories`);
35
+ }
36
+ } catch (e) {
37
+ // Ignore graph errors
38
+ }
39
+
40
+ console.log(JSON.stringify({ ok: true, action: 'created', from: args[0], to: args[1], type: options.type }));
41
+ } else {
42
+ console.log(JSON.stringify({ ok: false, error: 'Usage: squish link find <id> OR squish link add <from> <to>' }));
43
+ process.exit(1);
44
+ }
45
+ } catch (error: any) {
46
+ console.error(JSON.stringify({ ok: false, error: error.message }));
47
+ process.exit(1);
48
+ }
49
+ });
50
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Migrate Command - Migrate memories between .squish directories
3
+ *
4
+ * Usage: squish migrate <source-path> [--target <path>] [--delete-source] [--dry-run]
5
+ */
6
+
7
+ import { Command } from 'commander';
8
+ import { migrateMemories, type MigrateResult } from '../../../../core/memory/migrate.js';
9
+ import { existsSync } from 'fs';
10
+ import { join } from 'path';
11
+
12
+ export function registerMigrateCommand(program: Command) {
13
+ program
14
+ .command('migrate <source>')
15
+ .description('Migrate memories from one .squish directory to another (unify multiple .squish folders)')
16
+ .option('-t, --target <path>', 'Target .squish directory (default: current directory)', process.cwd())
17
+ .option('-d, --delete-source', 'Delete source directory after successful migration (requires --yes)')
18
+ .option('-y, --yes', 'Skip confirmation prompts')
19
+ .option('-n, --dry-run', 'Preview migration without making changes', false)
20
+ .action(async (source: string, options: any) => {
21
+ const target = options.target || process.cwd();
22
+ const dryRun = options.dryRun || false;
23
+ const deleteSource = options.deleteSource || false;
24
+ const confirmed = options.yes || false;
25
+
26
+ // Validate paths
27
+ if (!existsSync(source)) {
28
+ console.error(`Error: Source directory does not exist: ${source}`);
29
+ process.exit(1);
30
+ }
31
+
32
+ const sourceDbPath = join(source, 'squish.db');
33
+ const targetDbPath = join(target, 'squish.db');
34
+
35
+ if (!existsSync(sourceDbPath)) {
36
+ console.error(`Error: Source is not a .squish directory (no squish.db found): ${source}`);
37
+ process.exit(1);
38
+ }
39
+
40
+ if (!existsSync(targetDbPath)) {
41
+ console.error(`Error: Target is not a .squish directory (no squish.db found): ${target}`);
42
+ process.exit(1);
43
+ }
44
+
45
+ // Show plan
46
+ console.log('\n=== Migration Plan ===');
47
+ console.log(`Source: ${source}`);
48
+ console.log(`Target: ${target}`);
49
+ console.log(`Dry-run: ${dryRun ? 'YES (no changes)' : 'NO'}`);
50
+ console.log(`Delete source: ${deleteSource ? 'YES (after success)' : 'NO'}`);
51
+
52
+ if (!confirmed && !dryRun) {
53
+ console.log('\nThis will copy ALL memories from source to target.');
54
+ console.log('The source directory will NOT be deleted unless you also pass --delete-source');
55
+ console.log('Use --yes to confirm or --dry-run to preview.\n');
56
+ process.exit(1);
57
+ }
58
+
59
+ try {
60
+ console.log('\nMigrating...\n');
61
+
62
+ const result: MigrateResult = await migrateMemories(source, target, {
63
+ dryRun,
64
+ deleteSource,
65
+ });
66
+
67
+ console.log('=== Migration Result ===');
68
+ console.log(`Memories copied: ${result.memoriesCopied}`);
69
+ console.log(`Learnings copied: ${result.observationsCopied}`);
70
+ console.log(`Associations copied: ${result.associationsCopied}`);
71
+ console.log(`Projects mapped: ${result.projectsMapped}`);
72
+
73
+ if (deleteSource && !dryRun && result.sourceDeleted) {
74
+ console.log(`Source deleted: YES`);
75
+ } else if (deleteSource && !dryRun && !result.sourceDeleted) {
76
+ console.log(`Source deleted: NO (manual deletion required)`);
77
+ } else if (deleteSource && dryRun) {
78
+ console.log(`Source would be deleted after confirmation`);
79
+ }
80
+
81
+ console.log(`\n${result.message}`);
82
+
83
+ if (result.memoriesCopied > 0 && !dryRun) {
84
+ console.log('\nTip: After verifying the migration worked, you can manually delete the source directory:');
85
+ console.log(` rm -rf ${source}`);
86
+ }
87
+
88
+ } catch (error) {
89
+ console.error(`Migration failed:`, error instanceof Error ? error.message : error);
90
+ process.exit(1);
91
+ }
92
+ });
93
+ }