squish-memory 1.1.5 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +46 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/core/algorithms/index.ts +39 -0
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/core/lib/db-client.ts +168 -0
- package/core/lib/parse-embedding.ts +59 -0
- package/core/lib/schemas.ts +102 -0
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/core/memory/index.ts +11 -0
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/core/places/index.ts +14 -0
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +581 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/core/scheduler/index.ts +8 -0
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/core/search/index.ts +4 -0
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/core/session/index.ts +7 -0
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/core/snapshots/cleanup.ts +13 -0
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/core/summarization/cleanup.ts +13 -0
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/core/utils/vector-operations.ts +135 -0
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +324 -0
- package/db/adapter.ts +215 -0
- package/db/bootstrap.ts +1055 -0
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/dist/config.d.ts +40 -17
- package/dist/config.js +150 -198
- package/dist/core/adapters/types.d.ts +13 -33
- package/dist/core/adapters/types.js +1 -1
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
- package/dist/core/algorithms/types.d.ts +0 -8
- package/dist/core/associations.d.ts +3 -1
- package/dist/core/associations.js +37 -1
- package/dist/core/beliefs/decay.d.ts +27 -0
- package/dist/core/beliefs/decay.js +217 -0
- package/dist/core/beliefs/extractor.d.ts +9 -0
- package/dist/core/beliefs/extractor.js +113 -0
- package/dist/core/beliefs/store.d.ts +46 -0
- package/dist/core/beliefs/store.js +466 -0
- package/dist/core/beliefs/types.d.ts +28 -0
- package/dist/core/beliefs/types.js +2 -0
- package/dist/core/commands/mcp-server.d.ts +0 -1
- package/dist/core/commands/mcp-server.js +4 -737
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
- package/dist/core/{toon.js → compression.js} +8 -8
- package/dist/core/context/agent-context.js +1 -1
- package/dist/core/embeddings/embeddings.d.ts +29 -0
- package/dist/core/embeddings/embeddings.js +546 -0
- package/dist/core/embeddings/google-multimodal.js +6 -2
- package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
- package/dist/core/embeddings/local-embeddings.js +11 -0
- package/dist/core/embeddings/qmd-client.js +1 -1
- package/dist/core/embeddings/transformers-local.d.ts +64 -0
- package/dist/core/embeddings/transformers-local.js +213 -0
- package/dist/core/embeddings.d.ts +1 -28
- package/dist/core/embeddings.js +2 -453
- package/dist/core/graph/entity-deduplicator.d.ts +24 -0
- package/dist/core/graph/entity-deduplicator.js +183 -0
- package/dist/core/graph/graph-builder.d.ts +46 -0
- package/dist/core/graph/graph-builder.js +174 -0
- package/dist/core/graph/graph-traversal.d.ts +80 -0
- package/dist/core/graph/graph-traversal.js +315 -0
- package/dist/core/graph/index.d.ts +19 -0
- package/dist/core/graph/index.js +13 -0
- package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
- package/dist/core/graph/llm-entity-extractor.js +313 -0
- package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
- package/dist/core/graph/multi-hop-retrieval.js +215 -0
- package/dist/core/graph/relationship-extractor.d.ts +48 -0
- package/dist/core/graph/relationship-extractor.js +351 -0
- package/dist/core/hooks/agent-hooks.d.ts +10 -1
- package/dist/core/hooks/agent-hooks.js +301 -24
- package/dist/core/hot-cache.d.ts +86 -0
- package/dist/core/hot-cache.js +285 -0
- package/dist/core/index.d.ts +9 -9
- package/dist/core/index.js +9 -12
- package/dist/core/ingestion/core-memory.d.ts +2 -2
- package/dist/core/ingestion/core-memory.js +3 -3
- package/dist/core/ingestion/learnings.js +3 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
- package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
- package/dist/core/lib/parse-embedding.d.ts +9 -0
- package/dist/core/lib/parse-embedding.js +58 -0
- package/dist/core/lib/schemas.d.ts +57 -54
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/lib/utils.d.ts +4 -0
- package/dist/core/lib/utils.js +55 -0
- package/dist/core/lifecycle.d.ts +0 -1
- package/dist/core/lifecycle.js +13 -23
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +14 -8
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +0 -87
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +1 -0
- package/dist/core/memory/consolidation.js +2 -28
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/explain.d.ts +18 -0
- package/dist/core/memory/explain.js +92 -0
- package/dist/core/memory/fact-deriver.d.ts +31 -0
- package/dist/core/memory/fact-deriver.js +236 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
- package/dist/core/memory/hybrid-retrieval.js +25 -127
- package/dist/core/memory/hybrid-scorer.js +6 -23
- package/dist/core/memory/hybrid-search.d.ts +10 -7
- package/dist/core/memory/hybrid-search.js +458 -221
- package/dist/core/memory/importance.d.ts +0 -17
- package/dist/core/memory/importance.js +1 -58
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/memories.d.ts +13 -17
- package/dist/core/memory/memories.js +78 -75
- package/dist/core/memory/memory-lifecycle.d.ts +2 -2
- package/dist/core/memory/memory-lifecycle.js +10 -18
- package/dist/core/memory/normalization.d.ts +1 -16
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/stale-cleaner.d.ts +26 -0
- package/dist/core/memory/stale-cleaner.js +97 -0
- package/dist/core/memory/stats.d.ts +10 -0
- package/dist/core/memory/stats.js +8 -3
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/places/index.d.ts +1 -1
- package/dist/core/places/index.js +1 -1
- package/dist/core/places/places.d.ts +13 -13
- package/dist/core/places/places.js +27 -27
- package/dist/core/places/rules.js +23 -23
- package/dist/core/places/walking.d.ts +3 -3
- package/dist/core/places/walking.js +7 -7
- package/dist/core/projects.js +8 -0
- package/dist/core/runtime/trust-report.d.ts +102 -0
- package/dist/core/runtime/trust-report.js +107 -0
- package/dist/core/runtime/trust-state.d.ts +12 -0
- package/dist/core/runtime/trust-state.js +309 -0
- package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
- package/dist/core/scheduler/cron-scheduler.js +164 -3
- package/dist/core/scheduler/job-runner.js +1 -1
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/session/auto-load.js +28 -3
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/session/self-iteration-job.d.ts +15 -0
- package/dist/core/session/self-iteration-job.js +163 -58
- package/dist/core/session/working-set.d.ts +50 -0
- package/dist/core/session/working-set.js +212 -0
- package/dist/core/snapshots/creation.d.ts +2 -8
- package/dist/core/snapshots/creation.js +3 -12
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +229 -280
- package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
- package/dist/db/drizzle/schema-sqlite.js +83 -4
- package/dist/db/drizzle/schema.d.ts +653 -1
- package/dist/db/drizzle/schema.js +93 -4
- package/dist/db/migrations/associations.d.ts +6 -0
- package/dist/db/migrations/associations.js +29 -0
- package/dist/db/migrations/beliefs.d.ts +10 -0
- package/dist/db/migrations/beliefs.js +76 -0
- package/dist/db/migrations/core-memory.d.ts +6 -0
- package/dist/db/migrations/core-memory.js +29 -0
- package/dist/db/migrations/fts.d.ts +6 -0
- package/dist/db/migrations/fts.js +52 -0
- package/dist/db/migrations/index.d.ts +25 -0
- package/dist/db/migrations/index.js +51 -0
- package/dist/db/migrations/indexes.d.ts +6 -0
- package/dist/db/migrations/indexes.js +30 -0
- package/dist/db/migrations/learnings.d.ts +7 -0
- package/dist/db/migrations/learnings.js +26 -0
- package/dist/db/migrations/maintenance.d.ts +6 -0
- package/dist/db/migrations/maintenance.js +61 -0
- package/dist/db/migrations/memories.d.ts +7 -0
- package/dist/db/migrations/memories.js +16 -0
- package/dist/db/migrations/memory-places.d.ts +6 -0
- package/dist/db/migrations/memory-places.js +29 -0
- package/dist/db/migrations/places.d.ts +6 -0
- package/dist/db/migrations/places.js +43 -0
- package/dist/db/migrations/projects.d.ts +3 -0
- package/dist/db/migrations/projects.js +13 -0
- package/dist/db/migrations/tier-conversion.d.ts +7 -0
- package/dist/db/migrations/tier-conversion.js +20 -0
- package/dist/db/schema/beliefs.d.ts +9 -0
- package/dist/db/schema/beliefs.js +46 -0
- package/dist/db/schema/generator.d.ts +38 -0
- package/dist/db/schema/generator.js +108 -0
- package/dist/db/schema/index.d.ts +19 -20
- package/dist/db/schema/index.js +25 -79
- package/dist/db/schema/learnings.d.ts +7 -0
- package/dist/db/schema/learnings.js +30 -0
- package/dist/db/schema/memories.d.ts +7 -0
- package/dist/db/schema/memories.js +81 -0
- package/dist/db/schema/projects.d.ts +4 -0
- package/dist/db/schema/projects.js +31 -0
- package/dist/packages/mcp/src/index.d.ts +3 -0
- package/dist/packages/mcp/src/index.js +733 -0
- package/mcp.json.example +8 -11
- package/package.json +57 -76
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +877 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mode": "universal",
|
|
3
|
-
"generatedAt": "2026-04-13T04:19:52.236Z",
|
|
4
|
-
"source": "config/mcp.json",
|
|
5
|
-
"files": [
|
|
6
|
-
{
|
|
7
|
-
"file": "mcp-servers.json",
|
|
8
|
-
"sha256": "2c90cc52893f55bc92cc4f29c77bfeeb635c1c73fa46038d287548caeb35ca6a"
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"file": "mcporter.json",
|
|
12
|
-
"sha256": "af42e1c03d44f66fcbe2a9b7694f1d3a126527147c66b760236e72348e1e4573"
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"file": "openclaw-memory-qmd.json",
|
|
16
|
-
"sha256": "8a158ff45e98e0db7a7aff41dba7be76652b72aea82443773f9efc7fb056d615"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"file": "runtime.json",
|
|
20
|
-
"sha256": "4afbdec03de92c6a29fc24df32f01305c2e9cf69ed2d02866a01e361492d14b6"
|
|
21
|
-
}
|
|
22
|
-
]
|
|
23
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mcpServers": {
|
|
3
|
-
"filesystem": {
|
|
4
|
-
"args": [
|
|
5
|
-
"-y",
|
|
6
|
-
"@modelcontextprotocol/server-filesystem",
|
|
7
|
-
"."
|
|
8
|
-
],
|
|
9
|
-
"command": "npx",
|
|
10
|
-
"env": {},
|
|
11
|
-
"transport": "stdio"
|
|
12
|
-
},
|
|
13
|
-
"github": {
|
|
14
|
-
"args": [
|
|
15
|
-
"-y",
|
|
16
|
-
"@modelcontextprotocol/server-github"
|
|
17
|
-
],
|
|
18
|
-
"command": "npx",
|
|
19
|
-
"env": {
|
|
20
|
-
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
|
|
21
|
-
},
|
|
22
|
-
"transport": "stdio"
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mcpServers": {
|
|
3
|
-
"filesystem": {
|
|
4
|
-
"args": [
|
|
5
|
-
"-y",
|
|
6
|
-
"@modelcontextprotocol/server-filesystem",
|
|
7
|
-
"."
|
|
8
|
-
],
|
|
9
|
-
"command": "npx",
|
|
10
|
-
"env": {},
|
|
11
|
-
"transport": "stdio"
|
|
12
|
-
},
|
|
13
|
-
"github": {
|
|
14
|
-
"args": [
|
|
15
|
-
"-y",
|
|
16
|
-
"@modelcontextprotocol/server-github"
|
|
17
|
-
],
|
|
18
|
-
"command": "npx",
|
|
19
|
-
"env": {
|
|
20
|
-
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
|
|
21
|
-
},
|
|
22
|
-
"transport": "stdio"
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
"imports": [
|
|
26
|
-
"cursor",
|
|
27
|
-
"claude-code",
|
|
28
|
-
"claude-desktop",
|
|
29
|
-
"codex",
|
|
30
|
-
"windsurf",
|
|
31
|
-
"opencode",
|
|
32
|
-
"vscode"
|
|
33
|
-
]
|
|
34
|
-
}
|
package/scripts/README.md
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Squish Scripts
|
|
2
|
-
|
|
3
|
-
This directory contains essential build, installation, verification, and release scripts for the Squish project.
|
|
4
|
-
|
|
5
|
-
## Essential Scripts (Required for Build/Install/Release)
|
|
6
|
-
|
|
7
|
-
### Build & Runtime
|
|
8
|
-
- **`copy-runtime-assets.mjs`** - Copies runtime assets (e.g., sqlite WASM) to dist/. Run automatically during `npm run build`.
|
|
9
|
-
- **`init-dirs.mjs`** - Initializes required directories (~/.squish). Run automatically after `npm install` (postinstall hook).
|
|
10
|
-
|
|
11
|
-
### Installation
|
|
12
|
-
- **`install-interactive.mjs`** - Interactive installer wizard. Run with `npm run install`.
|
|
13
|
-
- **`install-plugin.mjs`** - Unified plugin installer for all supported clients (Claude Code, OpenCode, Codex, OpenClaw). Used by the add-mcp command and for manual installation.
|
|
14
|
-
|
|
15
|
-
### Verification & Testing
|
|
16
|
-
- **`verify-mcp.mjs`** - Verifies MCP configuration and artifacts. Run during release and CI.
|
|
17
|
-
- **`test-interactive.mjs`** - Interactive test runner with filtering and reporting.
|
|
18
|
-
- **`check-secrets.js`** - Scans for accidentally committed secrets. Run as pre-commit hook.
|
|
19
|
-
|
|
20
|
-
### Dependency Management
|
|
21
|
-
- **`dependency-manager.mjs`** - Checks and installs dependencies for different clients. Commands: `npm run deps:check`, `npm run deps:install`.
|
|
22
|
-
- **`detect-clients.mjs`** - Detects installed AI clients and their locations. Run with `npm run detect:clients`.
|
|
23
|
-
|
|
24
|
-
### Deployment & Reliability
|
|
25
|
-
- **`remote-preflight.mjs`** - Preflight checks for remote deployments. Run with `npm run preflight:remote`.
|
|
26
|
-
- **`squish-fallback.mjs`** - MCP fallback mechanism for handling failures. Run with `npm run fallback:dry` for simulation.
|
|
27
|
-
|
|
28
|
-
### Release Automation
|
|
29
|
-
- **`build-release.sh`** - Orchestrates full release build (Linux/macOS). Run with `npm run release`.
|
|
30
|
-
- **`github-release.sh`** - Creates GitHub release with assets. Part of the release process.
|
|
31
|
-
|
|
32
|
-
## Scripts Reference
|
|
33
|
-
|
|
34
|
-
| Script | Purpose | Invocation |
|
|
35
|
-
|--------|---------|------------|
|
|
36
|
-
| `copy-runtime-assets.mjs` | Copy WASM and other assets to dist | `npm run build` (automatic) |
|
|
37
|
-
| `generate-mcp.mjs` | Generate MCP configuration files | `node scripts/generate-mcp.mjs` |
|
|
38
|
-
| `verify-mcp.mjs` | Verify MCP artifacts are valid | `node scripts/verify-mcp.mjs` |
|
|
39
|
-
| `init-dirs.mjs` | Create ~/.squish and other dirs | `npm install` (automatic) |
|
|
40
|
-
| `install-interactive.mjs` | Interactive installation wizard | `npm run install` |
|
|
41
|
-
| `install-plugin.mjs` | Install plugin for specific client | `node scripts/install-plugin.mjs --client=<name>` |
|
|
42
|
-
| `dependency-manager.mjs` | Manage client dependencies | `npm run deps:check`, `npm run deps:install` |
|
|
43
|
-
| `detect-clients.mjs` | Detect installed AI clients | `npm run detect:clients` |
|
|
44
|
-
| `test-interactive.mjs` | Interactive test runner | `npm run test:interactive` |
|
|
45
|
-
| `remote-preflight.mjs` | Remote deployment checks | `npm run preflight:remote` |
|
|
46
|
-
| `squish-fallback.mjs` | MCP fallback simulation | `npm run fallback:dry` |
|
|
47
|
-
| `check-secrets.js` | Scan for secrets in code | `npm run check:secrets` |
|
|
48
|
-
| `build-release.sh` | Build release packages | `npm run release` (Linux/macOS) |
|
|
49
|
-
| `github-release.sh` | Publish to GitHub Releases | `npm run release` (part of) |
|
|
50
|
-
|
|
51
|
-
## Notes
|
|
52
|
-
|
|
53
|
-
- All scripts are written in JavaScript (ESM) or shell (`.sh`) for portability.
|
|
54
|
-
- Scripts prefixed with `node` are run with Node.js. Use `bun` for faster execution if available.
|
|
55
|
-
- Release scripts (`build-release.sh`, `github-release.sh`) are designed for CI/CD environments.
|
|
56
|
-
- The `install-plugin.mjs` script is the unified installer that replaced legacy `install-mcp.mjs` and `openclaw-bootstrap.mjs`.
|
|
57
|
-
|
|
58
|
-
## Developer Scripts
|
|
59
|
-
|
|
60
|
-
Development and debugging utilities are in scripts/ for build/dev workflows.
|
package/scripts/build-release.sh
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Squish Release Build Script
|
|
4
|
-
# Run this before publishing to ensure everything is ready
|
|
5
|
-
|
|
6
|
-
set -e
|
|
7
|
-
|
|
8
|
-
# Auto-detect version from package.json
|
|
9
|
-
VERSION=$(node -p "require('./package.json').version")
|
|
10
|
-
echo "Building Squish v$VERSION..."
|
|
11
|
-
|
|
12
|
-
# Clean previous builds
|
|
13
|
-
npm run clean
|
|
14
|
-
|
|
15
|
-
# Build the project using standard build script
|
|
16
|
-
echo "Building project..."
|
|
17
|
-
npm run build
|
|
18
|
-
|
|
19
|
-
# Verify MCP artifacts are generated
|
|
20
|
-
echo "🔨 Generating MCP artifacts..."
|
|
21
|
-
node scripts/generate-mcp.mjs
|
|
22
|
-
|
|
23
|
-
# Verify MCP artifacts
|
|
24
|
-
echo "🧪 Verifying MCP artifacts..."
|
|
25
|
-
node scripts/verify-mcp.mjs
|
|
26
|
-
|
|
27
|
-
echo "Build complete!"
|
|
28
|
-
|
|
29
|
-
# Optional: Test the build (uncomment if needed)
|
|
30
|
-
# echo "🧪 Testing build..."
|
|
31
|
-
# timeout 5 node dist/index.js &
|
|
32
|
-
# sleep 2
|
|
33
|
-
# curl -s http://localhost:37777/api/health | grep -q "ok" && echo "✅ API working" || echo "❌ API failed"
|
|
34
|
-
# pkill -f "node dist/index.js" || true
|
|
35
|
-
|
|
36
|
-
echo "Ready for release!"
|
package/scripts/check-secrets.js
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Secret Scanner - Checks for accidentally committed secrets
|
|
5
|
-
* Run this before committing or use the pre-commit hook
|
|
6
|
-
*
|
|
7
|
-
* Usage: node scripts/check-secrets.js
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { execSync } from 'child_process';
|
|
11
|
-
import { existsSync, readFileSync } from 'fs';
|
|
12
|
-
|
|
13
|
-
// Common secret patterns
|
|
14
|
-
const SECRET_PATTERNS = [
|
|
15
|
-
// API Keys
|
|
16
|
-
{ pattern: /(sk|sg)-[0-9a-zA-Z]{24,}/gi, name: 'Stripe/General API Key' },
|
|
17
|
-
{ pattern: /AIza[0-9A-Za-z\\-_]{35}/gi, name: 'Google API Key' },
|
|
18
|
-
{ pattern: /xox[baprs]-[0-9a-zA-Z-]{10,}/gi, name: 'Slack Token' },
|
|
19
|
-
{ pattern: /xox[baprs]-[0-9a-zA-Z-]{10,}/gi, name: 'Slack Token' },
|
|
20
|
-
{ pattern: /ghp_[0-9a-zA-Z]{36}/gi, name: 'GitHub Personal Access Token' },
|
|
21
|
-
{ pattern: /github_pat_[0-9a-zA-Z]{22}_[0-9a-zA-Z]{59}/gi, name: 'GitHub Fine-grained Token' },
|
|
22
|
-
{ pattern: /Bearer\s+[A-Za-z0-9\-_]+/gi, name: 'Bearer Token' },
|
|
23
|
-
{ pattern: /Authorization:\s*Bearer\s+[A-Za-z0-9\-_]+/gi, name: 'Authorization Header' },
|
|
24
|
-
{ pattern: /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/gi, name: 'JWT Token' },
|
|
25
|
-
|
|
26
|
-
// AWS
|
|
27
|
-
{ pattern: /(?:A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}/gi, name: 'AWS Access Key' },
|
|
28
|
-
{ pattern: /(?:\")?aws_access_key_id(?:\\s*:\\s*\")([A-Z0-9]{20})(?:\"|$)/gi, name: 'AWS Access Key ID' },
|
|
29
|
-
{ pattern: /(?:\")?aws_secret_access_key(?:\\s*:\\s*\")([A-Za-z0-9/+=]{40})(?:\"|$)/gi, name: 'AWS Secret Access Key' },
|
|
30
|
-
|
|
31
|
-
// Database
|
|
32
|
-
{ pattern: /(?:mongodb|mysql|postgres|postgresql|redis):\/\/[^\s]+:[^\s]+@/gi, name: 'Database Connection String' },
|
|
33
|
-
{ pattern: /(?:password|passwd|pwd)\s*[=:]\s*['"]?[^'"]{8,}['"]?/gi, name: 'Password in config' },
|
|
34
|
-
|
|
35
|
-
// .env specific
|
|
36
|
-
{ pattern: /^[A-Z_]+=sk-|^[A-Z_]+=AIza/gi, name: 'API Key in .env format' },
|
|
37
|
-
];
|
|
38
|
-
|
|
39
|
-
// File extensions to check
|
|
40
|
-
const TEXT_EXTENSIONS = [
|
|
41
|
-
'.ts', '.js', '.json', '.md', '.txt', '.yml', '.yaml', '.toml',
|
|
42
|
-
'.sh', '.bash', '.zsh', '.ini', '.cfg', '.conf', '.env', '.env.local'
|
|
43
|
-
];
|
|
44
|
-
|
|
45
|
-
function isTextFile(filePath) {
|
|
46
|
-
return TEXT_EXTENSIONS.some(ext => filePath.endsWith(ext)) || filePath.includes('.env');
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function getStagedFiles() {
|
|
50
|
-
try {
|
|
51
|
-
const output = execSync('git diff --cached --name-only', { encoding: 'utf-8' });
|
|
52
|
-
return output.split('\n').filter(f => f.trim());
|
|
53
|
-
} catch (error) {
|
|
54
|
-
console.error('Failed to get staged files:', error.message);
|
|
55
|
-
return [];
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function readFileContent(filePath) {
|
|
60
|
-
try {
|
|
61
|
-
return readFileSync(filePath, 'utf-8');
|
|
62
|
-
} catch (error) {
|
|
63
|
-
// File may have been removed or unreadable
|
|
64
|
-
return '';
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function scanContent(content, filePath) {
|
|
69
|
-
const findings = [];
|
|
70
|
-
|
|
71
|
-
for (const { pattern, name } of SECRET_PATTERNS) {
|
|
72
|
-
let match;
|
|
73
|
-
const regex = new RegExp(pattern);
|
|
74
|
-
while ((match = regex.exec(content)) !== null) {
|
|
75
|
-
const lineNumber = content.substring(0, match.index).split('\n').length;
|
|
76
|
-
findings.push({
|
|
77
|
-
file: filePath,
|
|
78
|
-
line: lineNumber,
|
|
79
|
-
type: name,
|
|
80
|
-
value: maskSecret(match[0]),
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return findings;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function maskSecret(secret) {
|
|
89
|
-
if (secret.length <= 8) return '***';
|
|
90
|
-
return secret.substring(0, 6) + '...' + secret.substring(secret.length - 4);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function main() {
|
|
94
|
-
console.log('🔍 Scanning for secrets...\n');
|
|
95
|
-
|
|
96
|
-
const stagedFiles = getStagedFiles();
|
|
97
|
-
const textFiles = stagedFiles.filter(isTextFile);
|
|
98
|
-
|
|
99
|
-
if (textFiles.length === 0) {
|
|
100
|
-
console.log('No text files to scan.');
|
|
101
|
-
process.exit(0);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
let totalFindings = 0;
|
|
105
|
-
|
|
106
|
-
for (const file of textFiles) {
|
|
107
|
-
const content = readFileContent(file);
|
|
108
|
-
if (!content) continue;
|
|
109
|
-
|
|
110
|
-
const findings = scanContent(content, file);
|
|
111
|
-
if (findings.length > 0) {
|
|
112
|
-
console.log(`❌ ${file}:`);
|
|
113
|
-
for (const finding of findings) {
|
|
114
|
-
console.log(` Line ${finding.line}: ${finding.type} - ${finding.value}`);
|
|
115
|
-
totalFindings++;
|
|
116
|
-
}
|
|
117
|
-
console.log('');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (totalFindings > 0) {
|
|
122
|
-
console.log(`\n🚨 Found ${totalFindings} potential secret(s).`);
|
|
123
|
-
console.log(' Please remove these before committing!');
|
|
124
|
-
console.log(' Use environment variables or a secret manager instead.\n');
|
|
125
|
-
process.exit(1);
|
|
126
|
-
} else {
|
|
127
|
-
console.log('✅ No secrets detected.\n');
|
|
128
|
-
process.exit(0);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
main();
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import fs from 'node:fs';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { fileURLToPath } from 'node:url';
|
|
6
|
-
|
|
7
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
-
const __dirname = path.dirname(__filename);
|
|
9
|
-
const root = path.resolve(__dirname, '..');
|
|
10
|
-
|
|
11
|
-
const copies = [
|
|
12
|
-
{
|
|
13
|
-
from: path.join(root, 'node_modules', 'sql.js', 'dist', 'sql-wasm.wasm'),
|
|
14
|
-
to: path.join(root, 'dist', 'vendor', 'sql.js', 'sql-wasm.wasm'),
|
|
15
|
-
},
|
|
16
|
-
];
|
|
17
|
-
|
|
18
|
-
for (const asset of copies) {
|
|
19
|
-
if (!fs.existsSync(asset.from)) {
|
|
20
|
-
throw new Error(`Runtime asset not found: ${asset.from}`);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
fs.mkdirSync(path.dirname(asset.to), { recursive: true });
|
|
24
|
-
fs.copyFileSync(asset.from, asset.to);
|
|
25
|
-
console.log(`[copy-runtime-assets] Copied ${path.relative(root, asset.from)} -> ${path.relative(root, asset.to)}`);
|
|
26
|
-
}
|
package/scripts/generate-mcp.mjs
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import crypto from "node:crypto";
|
|
6
|
-
|
|
7
|
-
const root = process.cwd();
|
|
8
|
-
const defaultSourcePath = path.join(root, "config", "mcp.json");
|
|
9
|
-
const defaultOutDir = path.join(root, "generated", "mcp");
|
|
10
|
-
const defaultImports = [
|
|
11
|
-
"cursor",
|
|
12
|
-
"claude-code",
|
|
13
|
-
"claude-desktop",
|
|
14
|
-
"codex",
|
|
15
|
-
"windsurf",
|
|
16
|
-
"opencode",
|
|
17
|
-
"vscode"
|
|
18
|
-
];
|
|
19
|
-
|
|
20
|
-
function parseArgs(argv) {
|
|
21
|
-
const args = {
|
|
22
|
-
configPath: defaultSourcePath,
|
|
23
|
-
outDir: defaultOutDir,
|
|
24
|
-
strictEnv: false
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
for (let i = 2; i < argv.length; i += 1) {
|
|
28
|
-
const token = argv[i];
|
|
29
|
-
if (token === "--strict-env") {
|
|
30
|
-
args.strictEnv = true;
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
if (token === "--config") {
|
|
34
|
-
args.configPath = path.resolve(argv[i + 1]);
|
|
35
|
-
i += 1;
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
if (token === "--out") {
|
|
39
|
-
args.outDir = path.resolve(argv[i + 1]);
|
|
40
|
-
i += 1;
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
throw new Error(`Unknown argument: ${token}`);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return args;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function readJson(filePath) {
|
|
50
|
-
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function ensureDir(dirPath) {
|
|
54
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function writeJson(filePath, data) {
|
|
58
|
-
fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function sha256File(filePath) {
|
|
62
|
-
const hash = crypto.createHash("sha256");
|
|
63
|
-
hash.update(fs.readFileSync(filePath));
|
|
64
|
-
return hash.digest("hex");
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function sortObjectKeys(input) {
|
|
68
|
-
if (Array.isArray(input)) {
|
|
69
|
-
return input.map(sortObjectKeys);
|
|
70
|
-
}
|
|
71
|
-
if (input && typeof input === "object") {
|
|
72
|
-
const sorted = {};
|
|
73
|
-
for (const key of Object.keys(input).sort()) {
|
|
74
|
-
sorted[key] = sortObjectKeys(input[key]);
|
|
75
|
-
}
|
|
76
|
-
return sorted;
|
|
77
|
-
}
|
|
78
|
-
return input;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function extractEnvPlaceholders(servers) {
|
|
82
|
-
const placeholders = [];
|
|
83
|
-
for (const [serverName, server] of Object.entries(servers)) {
|
|
84
|
-
const env = server?.env || {};
|
|
85
|
-
for (const [envKey, value] of Object.entries(env)) {
|
|
86
|
-
if (typeof value !== "string") continue;
|
|
87
|
-
const match = value.match(/^\$\{([A-Z0-9_]+)\}$/);
|
|
88
|
-
if (match) {
|
|
89
|
-
placeholders.push({ serverName, envKey, variable: match[1] });
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return placeholders;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function validateConfig(config, strictEnv) {
|
|
97
|
-
if (!config || typeof config !== "object") {
|
|
98
|
-
throw new Error("Invalid config: expected object");
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (!config.defaults || typeof config.defaults !== "object") {
|
|
102
|
-
throw new Error("Invalid config: defaults must be an object");
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (!config.servers || typeof config.servers !== "object") {
|
|
106
|
-
throw new Error("Invalid config: servers must be an object");
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const serverNames = Object.keys(config.servers);
|
|
110
|
-
if (serverNames.length === 0) {
|
|
111
|
-
throw new Error("Invalid config: at least one server is required");
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
for (const [serverName, server] of Object.entries(config.servers)) {
|
|
115
|
-
if (!server || typeof server !== "object") {
|
|
116
|
-
throw new Error(`Invalid server ${serverName}: expected object`);
|
|
117
|
-
}
|
|
118
|
-
if (!server.command || typeof server.command !== "string") {
|
|
119
|
-
throw new Error(`Invalid server ${serverName}: command is required`);
|
|
120
|
-
}
|
|
121
|
-
if (!Array.isArray(server.args)) {
|
|
122
|
-
throw new Error(`Invalid server ${serverName}: args must be an array`);
|
|
123
|
-
}
|
|
124
|
-
if (!server.transport || typeof server.transport !== "string") {
|
|
125
|
-
throw new Error(`Invalid server ${serverName}: transport is required`);
|
|
126
|
-
}
|
|
127
|
-
if (!server.env || typeof server.env !== "object") {
|
|
128
|
-
throw new Error(`Invalid server ${serverName}: env must be an object`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const includeServers = config.includeServers || [];
|
|
133
|
-
if (includeServers.length > 0) {
|
|
134
|
-
const unique = new Set(includeServers);
|
|
135
|
-
if (unique.size !== includeServers.length) {
|
|
136
|
-
throw new Error("Invalid config: includeServers contains duplicates");
|
|
137
|
-
}
|
|
138
|
-
for (const name of includeServers) {
|
|
139
|
-
if (!config.servers[name]) {
|
|
140
|
-
throw new Error(`Invalid config: includeServers references unknown server ${name}`);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (strictEnv) {
|
|
146
|
-
const unresolved = extractEnvPlaceholders(config.servers)
|
|
147
|
-
.filter((entry) => !process.env[entry.variable]);
|
|
148
|
-
if (unresolved.length > 0) {
|
|
149
|
-
const first = unresolved[0];
|
|
150
|
-
throw new Error(
|
|
151
|
-
`Missing required env for strict mode: ${first.variable} (server=${first.serverName}, key=${first.envKey})`
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
function selectServers(config) {
|
|
158
|
-
const include = config.includeServers || [];
|
|
159
|
-
if (include.length === 0) {
|
|
160
|
-
return config.servers;
|
|
161
|
-
}
|
|
162
|
-
const selected = {};
|
|
163
|
-
for (const serverName of include) {
|
|
164
|
-
selected[serverName] = config.servers[serverName];
|
|
165
|
-
}
|
|
166
|
-
return selected;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function toOpenClawMemoryConfig(runtime) {
|
|
170
|
-
return {
|
|
171
|
-
memory: {
|
|
172
|
-
backend: "qmd",
|
|
173
|
-
qmd: {
|
|
174
|
-
mcporter: {
|
|
175
|
-
enabled: true,
|
|
176
|
-
serverName: "qmd",
|
|
177
|
-
startDaemon: true
|
|
178
|
-
},
|
|
179
|
-
limits: {
|
|
180
|
-
timeoutMs: runtime.requestTimeoutMs,
|
|
181
|
-
maxSnippetChars: runtime.resultMaxChars,
|
|
182
|
-
maxResults: 12
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
function toMcporterConfig(servers) {
|
|
190
|
-
return {
|
|
191
|
-
mcpServers: servers,
|
|
192
|
-
imports: defaultImports
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function removeLegacyProfileDirectories(outDir) {
|
|
197
|
-
const removed = [];
|
|
198
|
-
if (!fs.existsSync(outDir)) return;
|
|
199
|
-
const entries = fs.readdirSync(outDir, { withFileTypes: true });
|
|
200
|
-
for (const entry of entries) {
|
|
201
|
-
if (entry.isDirectory()) {
|
|
202
|
-
fs.rmSync(path.join(outDir, entry.name), { recursive: true, force: true });
|
|
203
|
-
removed.push(entry.name);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return removed;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function main() {
|
|
210
|
-
const args = parseArgs(process.argv);
|
|
211
|
-
const config = readJson(args.configPath);
|
|
212
|
-
|
|
213
|
-
validateConfig(config, args.strictEnv);
|
|
214
|
-
|
|
215
|
-
ensureDir(args.outDir);
|
|
216
|
-
const removedLegacyDirs = removeLegacyProfileDirectories(args.outDir) || [];
|
|
217
|
-
|
|
218
|
-
if (config.profiles && typeof config.profiles === "object") {
|
|
219
|
-
console.warn(
|
|
220
|
-
"[mcp-migration] legacy profiles detected in config/mcp.json and ignored by universal generator"
|
|
221
|
-
);
|
|
222
|
-
}
|
|
223
|
-
if (removedLegacyDirs.length > 0) {
|
|
224
|
-
console.warn(
|
|
225
|
-
`[mcp-migration] removed legacy profile output directories: ${removedLegacyDirs.join(", ")}`
|
|
226
|
-
);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
const runtime = sortObjectKeys(config.defaults);
|
|
230
|
-
const selectedServers = sortObjectKeys(selectServers(config));
|
|
231
|
-
|
|
232
|
-
const fileMap = {
|
|
233
|
-
"runtime.json": runtime,
|
|
234
|
-
"mcp-servers.json": { mcpServers: selectedServers },
|
|
235
|
-
"mcporter.json": toMcporterConfig(selectedServers),
|
|
236
|
-
"openclaw-memory-qmd.json": toOpenClawMemoryConfig(runtime)
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
for (const [fileName, json] of Object.entries(fileMap)) {
|
|
240
|
-
writeJson(path.join(args.outDir, fileName), json);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const manifestFiles = Object.keys(fileMap)
|
|
244
|
-
.sort()
|
|
245
|
-
.map((fileName) => {
|
|
246
|
-
const filePath = path.join(args.outDir, fileName);
|
|
247
|
-
return {
|
|
248
|
-
file: fileName,
|
|
249
|
-
sha256: sha256File(filePath)
|
|
250
|
-
};
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
const manifest = {
|
|
254
|
-
mode: "universal",
|
|
255
|
-
generatedAt: new Date().toISOString(),
|
|
256
|
-
source: path.relative(root, args.configPath).replace(/\\/g, "/"),
|
|
257
|
-
files: manifestFiles
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
writeJson(path.join(args.outDir, "manifest.json"), manifest);
|
|
261
|
-
console.log(`Generated universal MCP artifacts in ${args.outDir}`);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
main();
|