squish-memory 1.1.5 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +46 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/core/algorithms/index.ts +39 -0
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/core/lib/db-client.ts +168 -0
- package/core/lib/parse-embedding.ts +59 -0
- package/core/lib/schemas.ts +102 -0
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/core/memory/index.ts +11 -0
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/core/places/index.ts +14 -0
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +581 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/core/scheduler/index.ts +8 -0
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/core/search/index.ts +4 -0
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/core/session/index.ts +7 -0
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/core/snapshots/cleanup.ts +13 -0
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/core/summarization/cleanup.ts +13 -0
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/core/utils/vector-operations.ts +135 -0
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +324 -0
- package/db/adapter.ts +215 -0
- package/db/bootstrap.ts +1055 -0
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/dist/config.d.ts +40 -17
- package/dist/config.js +150 -198
- package/dist/core/adapters/types.d.ts +13 -33
- package/dist/core/adapters/types.js +1 -1
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
- package/dist/core/algorithms/types.d.ts +0 -8
- package/dist/core/associations.d.ts +3 -1
- package/dist/core/associations.js +37 -1
- package/dist/core/beliefs/decay.d.ts +27 -0
- package/dist/core/beliefs/decay.js +217 -0
- package/dist/core/beliefs/extractor.d.ts +9 -0
- package/dist/core/beliefs/extractor.js +113 -0
- package/dist/core/beliefs/store.d.ts +46 -0
- package/dist/core/beliefs/store.js +466 -0
- package/dist/core/beliefs/types.d.ts +28 -0
- package/dist/core/beliefs/types.js +2 -0
- package/dist/core/commands/mcp-server.d.ts +0 -1
- package/dist/core/commands/mcp-server.js +4 -737
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
- package/dist/core/{toon.js → compression.js} +8 -8
- package/dist/core/context/agent-context.js +1 -1
- package/dist/core/embeddings/embeddings.d.ts +29 -0
- package/dist/core/embeddings/embeddings.js +546 -0
- package/dist/core/embeddings/google-multimodal.js +6 -2
- package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
- package/dist/core/embeddings/local-embeddings.js +11 -0
- package/dist/core/embeddings/qmd-client.js +1 -1
- package/dist/core/embeddings/transformers-local.d.ts +64 -0
- package/dist/core/embeddings/transformers-local.js +213 -0
- package/dist/core/embeddings.d.ts +1 -28
- package/dist/core/embeddings.js +2 -453
- package/dist/core/graph/entity-deduplicator.d.ts +24 -0
- package/dist/core/graph/entity-deduplicator.js +183 -0
- package/dist/core/graph/graph-builder.d.ts +46 -0
- package/dist/core/graph/graph-builder.js +174 -0
- package/dist/core/graph/graph-traversal.d.ts +80 -0
- package/dist/core/graph/graph-traversal.js +315 -0
- package/dist/core/graph/index.d.ts +19 -0
- package/dist/core/graph/index.js +13 -0
- package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
- package/dist/core/graph/llm-entity-extractor.js +313 -0
- package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
- package/dist/core/graph/multi-hop-retrieval.js +215 -0
- package/dist/core/graph/relationship-extractor.d.ts +48 -0
- package/dist/core/graph/relationship-extractor.js +351 -0
- package/dist/core/hooks/agent-hooks.d.ts +10 -1
- package/dist/core/hooks/agent-hooks.js +301 -24
- package/dist/core/hot-cache.d.ts +86 -0
- package/dist/core/hot-cache.js +285 -0
- package/dist/core/index.d.ts +9 -9
- package/dist/core/index.js +9 -12
- package/dist/core/ingestion/core-memory.d.ts +2 -2
- package/dist/core/ingestion/core-memory.js +3 -3
- package/dist/core/ingestion/learnings.js +3 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
- package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
- package/dist/core/lib/parse-embedding.d.ts +9 -0
- package/dist/core/lib/parse-embedding.js +58 -0
- package/dist/core/lib/schemas.d.ts +57 -54
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/lib/utils.d.ts +4 -0
- package/dist/core/lib/utils.js +55 -0
- package/dist/core/lifecycle.d.ts +0 -1
- package/dist/core/lifecycle.js +13 -23
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +14 -8
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +0 -87
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +1 -0
- package/dist/core/memory/consolidation.js +2 -28
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/explain.d.ts +18 -0
- package/dist/core/memory/explain.js +92 -0
- package/dist/core/memory/fact-deriver.d.ts +31 -0
- package/dist/core/memory/fact-deriver.js +236 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
- package/dist/core/memory/hybrid-retrieval.js +25 -127
- package/dist/core/memory/hybrid-scorer.js +6 -23
- package/dist/core/memory/hybrid-search.d.ts +10 -7
- package/dist/core/memory/hybrid-search.js +458 -221
- package/dist/core/memory/importance.d.ts +0 -17
- package/dist/core/memory/importance.js +1 -58
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/memories.d.ts +13 -17
- package/dist/core/memory/memories.js +78 -75
- package/dist/core/memory/memory-lifecycle.d.ts +2 -2
- package/dist/core/memory/memory-lifecycle.js +10 -18
- package/dist/core/memory/normalization.d.ts +1 -16
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/stale-cleaner.d.ts +26 -0
- package/dist/core/memory/stale-cleaner.js +97 -0
- package/dist/core/memory/stats.d.ts +10 -0
- package/dist/core/memory/stats.js +8 -3
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/places/index.d.ts +1 -1
- package/dist/core/places/index.js +1 -1
- package/dist/core/places/places.d.ts +13 -13
- package/dist/core/places/places.js +27 -27
- package/dist/core/places/rules.js +23 -23
- package/dist/core/places/walking.d.ts +3 -3
- package/dist/core/places/walking.js +7 -7
- package/dist/core/projects.js +8 -0
- package/dist/core/runtime/trust-report.d.ts +102 -0
- package/dist/core/runtime/trust-report.js +107 -0
- package/dist/core/runtime/trust-state.d.ts +12 -0
- package/dist/core/runtime/trust-state.js +309 -0
- package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
- package/dist/core/scheduler/cron-scheduler.js +164 -3
- package/dist/core/scheduler/job-runner.js +1 -1
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/session/auto-load.js +28 -3
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/session/self-iteration-job.d.ts +15 -0
- package/dist/core/session/self-iteration-job.js +163 -58
- package/dist/core/session/working-set.d.ts +50 -0
- package/dist/core/session/working-set.js +212 -0
- package/dist/core/snapshots/creation.d.ts +2 -8
- package/dist/core/snapshots/creation.js +3 -12
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +229 -280
- package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
- package/dist/db/drizzle/schema-sqlite.js +83 -4
- package/dist/db/drizzle/schema.d.ts +653 -1
- package/dist/db/drizzle/schema.js +93 -4
- package/dist/db/migrations/associations.d.ts +6 -0
- package/dist/db/migrations/associations.js +29 -0
- package/dist/db/migrations/beliefs.d.ts +10 -0
- package/dist/db/migrations/beliefs.js +76 -0
- package/dist/db/migrations/core-memory.d.ts +6 -0
- package/dist/db/migrations/core-memory.js +29 -0
- package/dist/db/migrations/fts.d.ts +6 -0
- package/dist/db/migrations/fts.js +52 -0
- package/dist/db/migrations/index.d.ts +25 -0
- package/dist/db/migrations/index.js +51 -0
- package/dist/db/migrations/indexes.d.ts +6 -0
- package/dist/db/migrations/indexes.js +30 -0
- package/dist/db/migrations/learnings.d.ts +7 -0
- package/dist/db/migrations/learnings.js +26 -0
- package/dist/db/migrations/maintenance.d.ts +6 -0
- package/dist/db/migrations/maintenance.js +61 -0
- package/dist/db/migrations/memories.d.ts +7 -0
- package/dist/db/migrations/memories.js +16 -0
- package/dist/db/migrations/memory-places.d.ts +6 -0
- package/dist/db/migrations/memory-places.js +29 -0
- package/dist/db/migrations/places.d.ts +6 -0
- package/dist/db/migrations/places.js +43 -0
- package/dist/db/migrations/projects.d.ts +3 -0
- package/dist/db/migrations/projects.js +13 -0
- package/dist/db/migrations/tier-conversion.d.ts +7 -0
- package/dist/db/migrations/tier-conversion.js +20 -0
- package/dist/db/schema/beliefs.d.ts +9 -0
- package/dist/db/schema/beliefs.js +46 -0
- package/dist/db/schema/generator.d.ts +38 -0
- package/dist/db/schema/generator.js +108 -0
- package/dist/db/schema/index.d.ts +19 -20
- package/dist/db/schema/index.js +25 -79
- package/dist/db/schema/learnings.d.ts +7 -0
- package/dist/db/schema/learnings.js +30 -0
- package/dist/db/schema/memories.d.ts +7 -0
- package/dist/db/schema/memories.js +81 -0
- package/dist/db/schema/projects.d.ts +4 -0
- package/dist/db/schema/projects.js +31 -0
- package/dist/packages/mcp/src/index.d.ts +3 -0
- package/dist/packages/mcp/src/index.js +733 -0
- package/mcp.json.example +8 -11
- package/package.json +57 -76
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +877 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -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
|
+
}
|