claude-memory-layer 2.5.0 → 2.5.1

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "claude-memory-layer",
3
3
  "description": "Learn from conversations to provide personalized assistance. The more you use it, the smarter it gets.",
4
- "version": "2.5.0",
4
+ "version": "2.5.1",
5
5
  "author": {
6
6
  "name": "Buzzni"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "claude-memory-layer",
3
3
  "description": "Learn from conversations to provide personalized assistance. The more you use it, the smarter it gets.",
4
- "version": "2.5.0",
4
+ "version": "2.5.1",
5
5
  "author": {
6
6
  "name": "Buzzni"
7
7
  },
package/dist/cli/index.js CHANGED
@@ -38,7 +38,7 @@ function emptyLatencyAggregate() {
38
38
  return { count: 0, failedCount: 0, totalMs: 0, maxMs: 0 };
39
39
  }
40
40
  function runtimeVersion() {
41
- const value = "2.5.0"?.trim();
41
+ const value = "2.5.1"?.trim();
42
42
  return sanitizeRuntimeVersion(value || "development");
43
43
  }
44
44
  function sanitizeRuntimeVersion(value) {
@@ -25704,7 +25704,7 @@ import { Command } from "commander";
25704
25704
  import { exec } from "child_process";
25705
25705
  import * as fs40 from "fs";
25706
25706
  import * as path50 from "path";
25707
- import * as os26 from "os";
25707
+ import * as os27 from "os";
25708
25708
  import { pathToFileURL as pathToFileURL2 } from "url";
25709
25709
 
25710
25710
  // src/services/lesson-consolidation-service.ts
@@ -32160,20 +32160,77 @@ init_sqlite_wrapper();
32160
32160
 
32161
32161
  // src/core/mongo-sync-worker.ts
32162
32162
  import { randomUUID as randomUUID27 } from "crypto";
32163
- import * as os18 from "os";
32163
+ import * as os19 from "os";
32164
32164
  import { MongoClient } from "mongodb";
32165
+
32166
+ // src/core/mongo-sync-config.ts
32167
+ import * as dns from "dns";
32168
+ import * as os18 from "os";
32169
+ var UNPARSEABLE_URI = "<unparseable MongoDB connection string>";
32170
+ function splitMongoUri(uri) {
32171
+ const match = /^([a-z][a-z0-9+.-]*:\/\/)(.*)$/is.exec(uri);
32172
+ if (!match) return null;
32173
+ const [, scheme, rest] = match;
32174
+ const authorityEnd = rest.search(/[/?]/);
32175
+ const authority = authorityEnd === -1 ? rest : rest.slice(0, authorityEnd);
32176
+ const remainder = authorityEnd === -1 ? "" : rest.slice(authorityEnd);
32177
+ if (remainder.includes("@") || authority.indexOf("@") !== authority.lastIndexOf("@")) return null;
32178
+ const atIdx = authority.indexOf("@");
32179
+ const creds = atIdx === -1 ? null : authority.slice(0, atIdx);
32180
+ const hosts = authority.slice(atIdx + 1);
32181
+ if (!hosts) return null;
32182
+ const colonIdx = creds?.indexOf(":") ?? -1;
32183
+ const queryIdx = remainder.indexOf("?");
32184
+ return {
32185
+ scheme,
32186
+ username: creds === null ? null : colonIdx === -1 ? creds : creds.slice(0, colonIdx),
32187
+ password: creds === null || colonIdx === -1 ? null : creds.slice(colonIdx + 1),
32188
+ hosts,
32189
+ path: queryIdx === -1 ? remainder : remainder.slice(0, queryIdx),
32190
+ query: queryIdx === -1 ? null : remainder.slice(queryIdx + 1)
32191
+ };
32192
+ }
32165
32193
  function redactMongoUri(uri) {
32166
- const schemeIdx = uri.indexOf("://");
32167
- if (schemeIdx === -1) return uri;
32168
- const atIdx = uri.indexOf("@", schemeIdx + 3);
32169
- if (atIdx === -1) return uri;
32170
- const creds = uri.slice(schemeIdx + 3, atIdx);
32171
- const colonIdx = creds.indexOf(":");
32172
- if (colonIdx === -1) return uri;
32173
- const prefix = uri.slice(0, schemeIdx + 3 + colonIdx + 1);
32174
- const suffix = uri.slice(atIdx);
32175
- return `${prefix}***${suffix}`;
32194
+ const parts = splitMongoUri(uri);
32195
+ if (!parts) return UNPARSEABLE_URI;
32196
+ const creds = parts.username === null ? "" : parts.password === null ? `${parts.username}@` : `${parts.username}:***@`;
32197
+ const query = parts.query === null ? "" : "?***";
32198
+ return `${parts.scheme}${creds}${parts.hosts}${parts.path}${query}`;
32199
+ }
32200
+ var PARSE_ERROR_NAMES = /* @__PURE__ */ new Set([
32201
+ "MongoParseError",
32202
+ "MongoInvalidArgumentError",
32203
+ "MongoAPIError",
32204
+ "MongoRuntimeError",
32205
+ "MongoMissingCredentialsError",
32206
+ "TypeError",
32207
+ "URIError"
32208
+ ]);
32209
+ var PARSE_HINT = "connection string could not be parsed; percent-encode special characters in the password and check option names";
32210
+ var ERRNO_CODES = /* @__PURE__ */ new Set([
32211
+ ...Object.keys(os18.constants.errno),
32212
+ ...Object.values(dns).filter((value) => typeof value === "string" && /^E[A-Z_]+$/.test(value)),
32213
+ "EAI_AGAIN"
32214
+ ]);
32215
+ function describeMongoConnectionError(error, uri) {
32216
+ const name = error instanceof Error ? error.name : "Error";
32217
+ if (!splitMongoUri(uri) || PARSE_ERROR_NAMES.has(name)) return `${name}: ${PARSE_HINT}`;
32218
+ const facts = connectionErrorFacts(error);
32219
+ return facts.length > 0 ? `${name} (${facts.join(", ")})` : name;
32176
32220
  }
32221
+ function connectionErrorFacts(error) {
32222
+ const facts = /* @__PURE__ */ new Set();
32223
+ let current = error;
32224
+ for (let depth = 0; depth < 5 && current instanceof Error; depth++) {
32225
+ const { code, codeName } = current;
32226
+ if (typeof code === "string" && ERRNO_CODES.has(code)) facts.add(code);
32227
+ if (typeof codeName === "string" && /^[A-Za-z]+$/.test(codeName)) facts.add(codeName);
32228
+ current = current.cause;
32229
+ }
32230
+ return [...facts];
32231
+ }
32232
+
32233
+ // src/core/mongo-sync-worker.ts
32177
32234
  function isRecord8(value) {
32178
32235
  return typeof value === "object" && value !== null && !Array.isArray(value);
32179
32236
  }
@@ -32306,7 +32363,8 @@ var MongoSyncWorker = class {
32306
32363
  this.events = this.db.collection("cml_events");
32307
32364
  } catch (err) {
32308
32365
  const safeUri = redactMongoUri(this.config.uri);
32309
- throw new Error(`MongoDB connection failed (${safeUri}, db=${this.config.dbName}): ${String(err)}`);
32366
+ const reason = describeMongoConnectionError(err, this.config.uri);
32367
+ throw new Error(`MongoDB connection failed (${safeUri}, db=${this.config.dbName}): ${reason}`);
32310
32368
  }
32311
32369
  }
32312
32370
  async disconnect() {
@@ -32367,7 +32425,7 @@ var MongoSyncWorker = class {
32367
32425
  if (batch.length === 0) break;
32368
32426
  const startSeq = await this.allocateSeqRange("events", batch.length);
32369
32427
  const now = /* @__PURE__ */ new Date();
32370
- const hostname2 = os18.hostname();
32428
+ const hostname2 = os19.hostname();
32371
32429
  const ops = batch.map((item, idx) => {
32372
32430
  const event = item.event;
32373
32431
  const seq = startSeq + idx;
@@ -32708,7 +32766,7 @@ function defaultInvocation(options) {
32708
32766
 
32709
32767
  // src/apps/cli/mcp-client-config.ts
32710
32768
  import * as fs25 from "node:fs";
32711
- import * as os19 from "node:os";
32769
+ import * as os20 from "node:os";
32712
32770
  import * as path32 from "node:path";
32713
32771
  function isClaudeMemoryMcpServer(serverName, server) {
32714
32772
  if (!server || typeof server !== "object" || Array.isArray(server)) return false;
@@ -32720,7 +32778,7 @@ function isClaudeMemoryMcpServer(serverName, server) {
32720
32778
  return /memory/i.test(serverName) && /(?:^|[\s/])(?:\.\/)?(?:dist|src)\/(?:extensions\/)?mcp\/index\.(?:js|ts)(?:\s|$)/i.test(invocation);
32721
32779
  }
32722
32780
  function readMcpClientConfigs(options = {}) {
32723
- const homeDir = options.homeDir ?? os19.homedir();
32781
+ const homeDir = options.homeDir ?? os20.homedir();
32724
32782
  const cwd = options.cwd ?? process.cwd();
32725
32783
  return [
32726
32784
  readConfig("claude-code", path32.join(homeDir, ".claude.json"), (text) => {
@@ -34110,7 +34168,7 @@ init_retrieval_trace_ledger();
34110
34168
  init_lesson_usage_audit();
34111
34169
  init_retrieval_telemetry();
34112
34170
  import * as fs33 from "node:fs";
34113
- import * as os20 from "node:os";
34171
+ import * as os21 from "node:os";
34114
34172
  import * as path41 from "node:path";
34115
34173
  var MEMORY_AUDIT_SCHEMA_VERSION = "memory-audit-v1";
34116
34174
  var TEST_NAME_PATTERN = /(^|[-_])(?:tmp|temp|test|testing|fixture|scratch|sandbox|playground|happy-testing-ground|happy-codex-instructions)([-_]|$)/i;
@@ -34397,7 +34455,7 @@ function auditOneStore(store, options) {
34397
34455
  }
34398
34456
  function buildMemoryAuditReport(options = {}) {
34399
34457
  const projectClasses = validateProjectClasses(options.projectClasses ?? {});
34400
- const homeDir = options.homeDir ?? os20.homedir();
34458
+ const homeDir = options.homeDir ?? os21.homedir();
34401
34459
  const memoryRoot = path41.join(homeDir, ".claude-code", "memory");
34402
34460
  const now = options.now ?? /* @__PURE__ */ new Date();
34403
34461
  const discovered = discoverMemoryStores(memoryRoot);
@@ -35281,7 +35339,7 @@ init_project_path();
35281
35339
  init_memory_service();
35282
35340
  init_vector_store();
35283
35341
  import * as fs34 from "node:fs";
35284
- import * as os21 from "node:os";
35342
+ import * as os22 from "node:os";
35285
35343
  import * as path43 from "node:path";
35286
35344
  var DEFAULT_MAINTENANCE_MIN_FREE_BYTES = 5 * 1024 * 1024 * 1024;
35287
35345
  var DEFAULT_MAINTENANCE_MAX_PROJECTS = 25;
@@ -35298,7 +35356,7 @@ function parseMaintenanceMinFreeBytes(value) {
35298
35356
  return Math.floor(gigabytes * 1024 * 1024 * 1024);
35299
35357
  }
35300
35358
  function getMaintenanceDiskStatus(options = {}) {
35301
- const homeDir = options.homeDir ?? os21.homedir();
35359
+ const homeDir = options.homeDir ?? os22.homedir();
35302
35360
  const memoryRoot = path43.join(homeDir, ".claude-code", "memory");
35303
35361
  const probePath = findExistingAncestor(memoryRoot);
35304
35362
  const stats = fs34.statfsSync(probePath);
@@ -35326,7 +35384,7 @@ function discoverMaintenanceTargets(options = {}) {
35326
35384
  modifiedAtMs: getStoreModifiedAtMs(storagePath)
35327
35385
  }] : [];
35328
35386
  }
35329
- const homeDir = options.homeDir ?? os21.homedir();
35387
+ const homeDir = options.homeDir ?? os22.homedir();
35330
35388
  const memoryRoot = path43.join(homeDir, ".claude-code", "memory");
35331
35389
  const registry = loadSessionRegistry({ homeDir });
35332
35390
  const latestByHash = /* @__PURE__ */ new Map();
@@ -35571,7 +35629,7 @@ function maintenanceAggregateReport(report) {
35571
35629
  function maintenanceRunRequiresAttention(report) {
35572
35630
  return report.errors > 0 || report.blocked > 0 || report.quarantined > 0 || report.compactionFailures > 0 || !report.disk.healthy;
35573
35631
  }
35574
- function writeMaintenanceLastRunStatus(report, homeDir = os21.homedir()) {
35632
+ function writeMaintenanceLastRunStatus(report, homeDir = os22.homedir()) {
35575
35633
  const filePath = getMaintenanceLastRunStatusPath(homeDir);
35576
35634
  const status = {
35577
35635
  version: 3,
@@ -35600,7 +35658,7 @@ function writeMaintenanceLastRunStatus(report, homeDir = os21.homedir()) {
35600
35658
  fs34.renameSync(tempPath, filePath);
35601
35659
  return filePath;
35602
35660
  }
35603
- function readMaintenanceLastRunStatus(homeDir = os21.homedir()) {
35661
+ function readMaintenanceLastRunStatus(homeDir = os22.homedir()) {
35604
35662
  try {
35605
35663
  const value = JSON.parse(fs34.readFileSync(getMaintenanceLastRunStatusPath(homeDir), "utf8"));
35606
35664
  if (value.version !== 1 && value.version !== 2 && value.version !== 3 || typeof value.startedAt !== "string" || !Number.isFinite(Date.parse(value.startedAt)) || typeof value.finishedAt !== "string" || !Number.isFinite(Date.parse(value.finishedAt))) return null;
@@ -35860,7 +35918,7 @@ function sanitizeMaintenanceError(message) {
35860
35918
  // src/apps/cli/maintenance-scheduler.ts
35861
35919
  import { execFileSync as execFileSync4 } from "node:child_process";
35862
35920
  import * as fs35 from "node:fs";
35863
- import * as os22 from "node:os";
35921
+ import * as os23 from "node:os";
35864
35922
  import * as path44 from "node:path";
35865
35923
  var MAINTENANCE_LABEL = "com.claude-memory-layer.maintenance";
35866
35924
  var DEFAULT_MAINTENANCE_INTERVAL_SECONDS = 300;
@@ -35877,7 +35935,7 @@ function resolveMaintenancePlatform(platform = process.platform) {
35877
35935
  if (platform === "darwin" || platform === "linux") return platform;
35878
35936
  throw new Error(`maintenance scheduling is not supported on ${platform}; use "claude-memory-layer maintenance run" from your scheduler`);
35879
35937
  }
35880
- function getMaintenanceSchedulerPaths(platform = process.platform, homeDir = os22.homedir()) {
35938
+ function getMaintenanceSchedulerPaths(platform = process.platform, homeDir = os23.homedir()) {
35881
35939
  const supported = resolveMaintenancePlatform(platform);
35882
35940
  const logPath = path44.join(homeDir, ".claude-code", "memory", "logs", "maintenance.log");
35883
35941
  if (supported === "darwin") {
@@ -35954,7 +36012,7 @@ WantedBy=timers.target
35954
36012
  }
35955
36013
  function installMaintenanceScheduler(options, deps = {}) {
35956
36014
  const platform = resolveMaintenancePlatform(options.platform);
35957
- const homeDir = options.homeDir ?? os22.homedir();
36015
+ const homeDir = options.homeDir ?? os23.homedir();
35958
36016
  const intervalSeconds = parseMaintenanceInterval(options.intervalSeconds);
35959
36017
  validateExecutablePath(options.nodePath, "Node executable");
35960
36018
  validateExecutablePath(options.cliPath, "CLI entrypoint");
@@ -36011,7 +36069,7 @@ function installMaintenanceScheduler(options, deps = {}) {
36011
36069
  }
36012
36070
  function getMaintenanceSchedulerStatus(options = {}, deps = {}) {
36013
36071
  const platform = resolveMaintenancePlatform(options.platform);
36014
- const paths = getMaintenanceSchedulerPaths(platform, options.homeDir ?? os22.homedir());
36072
+ const paths = getMaintenanceSchedulerPaths(platform, options.homeDir ?? os23.homedir());
36015
36073
  const installed = paths.definitionPaths.every((file) => fs35.existsSync(file));
36016
36074
  if (!installed) return { ...paths, installed: false, active: false };
36017
36075
  const runner = deps.execFileSync ?? execFileSync4;
@@ -36020,7 +36078,7 @@ function getMaintenanceSchedulerStatus(options = {}, deps = {}) {
36020
36078
  }
36021
36079
  function uninstallMaintenanceScheduler(options = {}, deps = {}) {
36022
36080
  const platform = resolveMaintenancePlatform(options.platform);
36023
- const paths = getMaintenanceSchedulerPaths(platform, options.homeDir ?? os22.homedir());
36081
+ const paths = getMaintenanceSchedulerPaths(platform, options.homeDir ?? os23.homedir());
36024
36082
  const runner = deps.execFileSync ?? execFileSync4;
36025
36083
  if (platform === "darwin") {
36026
36084
  const [plistPath] = paths.definitionPaths;
@@ -36118,7 +36176,7 @@ function systemdUnavailableMessage() {
36118
36176
 
36119
36177
  // src/apps/cli/import-command.ts
36120
36178
  init_project_path();
36121
- import * as os23 from "node:os";
36179
+ import * as os24 from "node:os";
36122
36180
  import * as path45 from "node:path";
36123
36181
  function resolveImportCommandLockOptions(options, deps = {}) {
36124
36182
  if (options.lockPath !== void 0 && options.lockPath.trim().length === 0) {
@@ -36126,7 +36184,7 @@ function resolveImportCommandLockOptions(options, deps = {}) {
36126
36184
  }
36127
36185
  const useGlobalStorage = options.all === true && !options.project && !options.session;
36128
36186
  if (useGlobalStorage) {
36129
- const globalStoragePath = path45.join((deps.homedir ?? os23.homedir)(), ".claude-code", "memory");
36187
+ const globalStoragePath = path45.join((deps.homedir ?? os24.homedir)(), ".claude-code", "memory");
36130
36188
  return {
36131
36189
  storageScope: "global",
36132
36190
  lockPath: options.lockPath ?? path45.join(globalStoragePath, "vector-worker.lock")
@@ -36156,7 +36214,7 @@ init_sqlite_wrapper();
36156
36214
  init_project_path();
36157
36215
  init_session_registry();
36158
36216
  import * as fs36 from "node:fs";
36159
- import * as os24 from "node:os";
36217
+ import * as os25 from "node:os";
36160
36218
  import * as path46 from "node:path";
36161
36219
  function parseProjectScopeAuditDays(value) {
36162
36220
  if (value === void 0) return 7;
@@ -36168,7 +36226,7 @@ function parseProjectScopeAuditDays(value) {
36168
36226
  }
36169
36227
  function auditProjectScope(options = {}, deps = {}) {
36170
36228
  const resolved = {
36171
- homeDir: options.homeDir ?? os24.homedir(),
36229
+ homeDir: options.homeDir ?? os25.homedir(),
36172
36230
  days: parseProjectScopeAuditDays(options.days),
36173
36231
  groupByProject: options.groupByProject === true
36174
36232
  };
@@ -36399,11 +36457,11 @@ function isLocalDirectory2(directory) {
36399
36457
  init_existing_store();
36400
36458
  init_repo_identity();
36401
36459
  import * as fs37 from "node:fs";
36402
- import * as os25 from "node:os";
36460
+ import * as os26 from "node:os";
36403
36461
  import * as path47 from "node:path";
36404
36462
  function inspectProjectBootstrapHealth(options) {
36405
36463
  const projectPath = path47.resolve(options.projectPath);
36406
- const homeDir = options.homeDir ?? os25.homedir();
36464
+ const homeDir = options.homeDir ?? os26.homedir();
36407
36465
  const identity = resolveCanonicalRepoIdentity(projectPath);
36408
36466
  const store = resolveExistingStore(projectPath, { homeDir });
36409
36467
  const settingsText = readText(path47.join(homeDir, ".claude", "settings.json"));
@@ -36900,20 +36958,6 @@ async function findOldestGap(remote, projectKey, localSeqs, pullCursor) {
36900
36958
  };
36901
36959
  }
36902
36960
 
36903
- // src/core/mongo-sync-config.ts
36904
- function redactMongoUri2(uri) {
36905
- const schemeIdx = uri.indexOf("://");
36906
- if (schemeIdx === -1) return uri;
36907
- const atIdx = uri.indexOf("@", schemeIdx + 3);
36908
- if (atIdx === -1) return uri;
36909
- const creds = uri.slice(schemeIdx + 3, atIdx);
36910
- const colonIdx = creds.indexOf(":");
36911
- if (colonIdx === -1) return uri;
36912
- const prefix = uri.slice(0, schemeIdx + 3 + colonIdx + 1);
36913
- const suffix = uri.slice(atIdx);
36914
- return `${prefix}***${suffix}`;
36915
- }
36916
-
36917
36961
  // src/apps/cli/mongo-sync-command.ts
36918
36962
  init_sqlite_event_store();
36919
36963
  init_project_path();
@@ -37074,8 +37118,8 @@ async function runMongoSyncAudit(options, deps = {}) {
37074
37118
  const report = await auditMongoSync(store, connection.collection, { projectKey });
37075
37119
  return { status: report.status, projectKey, detail: summarizeAudit(report), report };
37076
37120
  } catch (error) {
37077
- const safeUri = redactMongoUri2(uri).split("?")[0];
37078
- const message = (error instanceof Error ? error.message : String(error)).split(uri).join(safeUri);
37121
+ const safeUri = redactMongoUri(uri);
37122
+ const message = describeMongoConnectionError(error, uri);
37079
37123
  return { status: "fail", projectKey, detail: `Mongo sync audit failed (${safeUri}, db=${dbName}): ${message}` };
37080
37124
  } finally {
37081
37125
  await connection?.close().catch(() => void 0);
@@ -37238,8 +37282,8 @@ function normalizeClass(value) {
37238
37282
  }
37239
37283
 
37240
37284
  // src/apps/cli/index.ts
37241
- var CLAUDE_SETTINGS_PATH = path50.join(os26.homedir(), ".claude", "settings.json");
37242
- var CODEX_HOOKS_PATH = path50.join(os26.homedir(), ".codex", "hooks.json");
37285
+ var CLAUDE_SETTINGS_PATH = path50.join(os27.homedir(), ".claude", "settings.json");
37286
+ var CODEX_HOOKS_PATH = path50.join(os27.homedir(), ".codex", "hooks.json");
37243
37287
  function getPluginPath() {
37244
37288
  const possiblePaths = [
37245
37289
  path50.join(__dirname, ".."),
@@ -37255,7 +37299,7 @@ function getPluginPath() {
37255
37299
  return p;
37256
37300
  }
37257
37301
  }
37258
- return path50.join(os26.homedir(), ".npm-global", "lib", "node_modules", "claude-memory-layer", "dist");
37302
+ return path50.join(os27.homedir(), ".npm-global", "lib", "node_modules", "claude-memory-layer", "dist");
37259
37303
  }
37260
37304
  function readEnginesNodeRange(packageRoot) {
37261
37305
  try {
@@ -37334,7 +37378,7 @@ function resolveHealthProjectIdentity(projectPath) {
37334
37378
  return { scope: "project", id: /^[a-f0-9]{8}$/.test(normalized) ? normalized : hashProjectPath(normalized) };
37335
37379
  }
37336
37380
  function scanCanonicalProjectStores(canonicalId) {
37337
- const memoryRoot = path50.join(os26.homedir(), ".claude-code", "memory");
37381
+ const memoryRoot = path50.join(os27.homedir(), ".claude-code", "memory");
37338
37382
  const projectsRoot = path50.join(memoryRoot, "projects");
37339
37383
  let scannedStoreCount = 0;
37340
37384
  let matchingStoreCount = 0;
@@ -37770,7 +37814,7 @@ async function runOperationCli(action, label) {
37770
37814
  }
37771
37815
  }
37772
37816
  var program = new Command();
37773
- program.name("claude-memory-layer").description("Claude Code Memory Plugin CLI").version("2.5.0");
37817
+ program.name("claude-memory-layer").description("Claude Code Memory Plugin CLI").version("2.5.1");
37774
37818
  program.command("market-context").description("Fetch read-only DART/FRED/Finnhub context with structured MarketContextSnapshot bull/bear/risk/catalyst analysis").option("--company <name>", "Company name for DART fallback search and report subject").option("--dart-corp-code <code>", "Exact DART corp_code for issuer-specific filings").option("--symbol <ticker>", "Listed ticker for Finnhub company profile").option("--providers <list>", "Comma-separated providers: dart,fred,finnhub").option("--fred-series <list>", "Comma-separated FRED series IDs").option("--json", "Print structured JSON including analysis.marketSnapshot").option("--no-snapshot", "Disable MarketContextSnapshot and DART company snapshot analysis").action(async (options) => {
37775
37819
  try {
37776
37820
  await runMarketContextCommand(options);
@@ -37919,7 +37963,7 @@ program.command("doctor").description("Diagnose the environment: Node version, e
37919
37963
  ...readMcpClientConfigs({ cwd: process.cwd() }).map((read) => checkMcpClientConfig(read, packageRoot, mcpServerEntry)),
37920
37964
  checkProjectStoreAccess(projectStorePath)
37921
37965
  ];
37922
- const memoryRoot = path50.join(os26.homedir(), ".claude-code", "memory");
37966
+ const memoryRoot = path50.join(os27.homedir(), ".claude-code", "memory");
37923
37967
  const { output, exitCode } = await runDoctor(checks, {
37924
37968
  fix: options.fix === true,
37925
37969
  repairEmbeddingBackend: (check) => repairEmbeddingBackend(check, {