@stackmemoryai/stackmemory 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/dist/agents/core/agent-task-manager.js +5 -5
  2. package/dist/agents/core/agent-task-manager.js.map +2 -2
  3. package/dist/agents/verifiers/base-verifier.js +2 -2
  4. package/dist/agents/verifiers/base-verifier.js.map +2 -2
  5. package/dist/agents/verifiers/formatter-verifier.js.map +2 -2
  6. package/dist/agents/verifiers/llm-judge.js.map +2 -2
  7. package/dist/cli/claude-sm.js +13 -13
  8. package/dist/cli/claude-sm.js.map +2 -2
  9. package/dist/cli/codex-sm.js +13 -13
  10. package/dist/cli/codex-sm.js.map +2 -2
  11. package/dist/cli/commands/agent.js.map +2 -2
  12. package/dist/cli/commands/chromadb.js +261 -46
  13. package/dist/cli/commands/chromadb.js.map +2 -2
  14. package/dist/cli/commands/clear.js +10 -3
  15. package/dist/cli/commands/clear.js.map +2 -2
  16. package/dist/cli/commands/config.js +43 -33
  17. package/dist/cli/commands/config.js.map +2 -2
  18. package/dist/cli/commands/context.js +13 -2
  19. package/dist/cli/commands/context.js.map +2 -2
  20. package/dist/cli/commands/dashboard.js +41 -13
  21. package/dist/cli/commands/dashboard.js.map +2 -2
  22. package/dist/cli/commands/gc.js +251 -0
  23. package/dist/cli/commands/gc.js.map +7 -0
  24. package/dist/cli/commands/handoff.js +12 -1
  25. package/dist/cli/commands/handoff.js.map +2 -2
  26. package/dist/cli/commands/infinite-storage.js +92 -40
  27. package/dist/cli/commands/infinite-storage.js.map +2 -2
  28. package/dist/cli/commands/linear-create.js +49 -10
  29. package/dist/cli/commands/linear-create.js.map +2 -2
  30. package/dist/cli/commands/linear-list.js +45 -11
  31. package/dist/cli/commands/linear-list.js.map +2 -2
  32. package/dist/cli/commands/linear-migrate.js +29 -5
  33. package/dist/cli/commands/linear-migrate.js.map +2 -2
  34. package/dist/cli/commands/linear-test.js +26 -7
  35. package/dist/cli/commands/linear-test.js.map +2 -2
  36. package/dist/cli/commands/linear-unified.js +350 -0
  37. package/dist/cli/commands/linear-unified.js.map +7 -0
  38. package/dist/cli/commands/linear.js +17 -6
  39. package/dist/cli/commands/linear.js.map +2 -2
  40. package/dist/cli/commands/monitor.js.map +2 -2
  41. package/dist/cli/commands/onboard.js +35 -8
  42. package/dist/cli/commands/onboard.js.map +2 -2
  43. package/dist/cli/commands/quality.js +2 -7
  44. package/dist/cli/commands/quality.js.map +2 -2
  45. package/dist/cli/commands/search.js.map +2 -2
  46. package/dist/cli/commands/session.js +23 -6
  47. package/dist/cli/commands/session.js.map +2 -2
  48. package/dist/cli/commands/skills.js +84 -28
  49. package/dist/cli/commands/skills.js.map +2 -2
  50. package/dist/cli/commands/storage.js +119 -38
  51. package/dist/cli/commands/storage.js.map +2 -2
  52. package/dist/cli/commands/tasks.js.map +2 -2
  53. package/dist/cli/commands/tui.js +13 -2
  54. package/dist/cli/commands/tui.js.map +2 -2
  55. package/dist/cli/commands/webhook.js +71 -21
  56. package/dist/cli/commands/webhook.js.map +2 -2
  57. package/dist/cli/commands/workflow.js +11 -7
  58. package/dist/cli/commands/workflow.js.map +2 -2
  59. package/dist/cli/commands/worktree.js +34 -13
  60. package/dist/cli/commands/worktree.js.map +2 -2
  61. package/dist/cli/index.js +7 -5
  62. package/dist/cli/index.js.map +2 -2
  63. package/dist/core/config/config-manager.js.map +2 -2
  64. package/dist/core/config/types.js.map +1 -1
  65. package/dist/core/context/auto-context.js +10 -6
  66. package/dist/core/context/auto-context.js.map +2 -2
  67. package/dist/core/context/compaction-handler.js.map +2 -2
  68. package/dist/core/context/context-bridge.js.map +2 -2
  69. package/dist/core/context/dual-stack-manager.js.map +2 -2
  70. package/dist/core/context/frame-database.js +13 -3
  71. package/dist/core/context/frame-database.js.map +2 -2
  72. package/dist/core/context/frame-digest.js +7 -5
  73. package/dist/core/context/frame-digest.js.map +2 -2
  74. package/dist/core/context/frame-handoff-manager.js.map +2 -2
  75. package/dist/core/context/frame-manager.js +12 -1
  76. package/dist/core/context/frame-manager.js.map +2 -2
  77. package/dist/core/context/frame-stack.js +16 -5
  78. package/dist/core/context/frame-stack.js.map +2 -2
  79. package/dist/core/context/incremental-gc.js +286 -0
  80. package/dist/core/context/incremental-gc.js.map +7 -0
  81. package/dist/core/context/index.js.map +1 -1
  82. package/dist/core/context/permission-manager.js +12 -1
  83. package/dist/core/context/permission-manager.js.map +2 -2
  84. package/dist/core/context/refactored-frame-manager.js +12 -3
  85. package/dist/core/context/refactored-frame-manager.js.map +2 -2
  86. package/dist/core/context/shared-context-layer.js +16 -3
  87. package/dist/core/context/shared-context-layer.js.map +2 -2
  88. package/dist/core/context/stack-merge-resolver.js.map +2 -2
  89. package/dist/core/context/validation.js.map +2 -2
  90. package/dist/core/database/batch-operations.js +112 -86
  91. package/dist/core/database/batch-operations.js.map +2 -2
  92. package/dist/core/database/connection-pool.js.map +2 -2
  93. package/dist/core/database/migration-manager.js.map +2 -2
  94. package/dist/core/database/paradedb-adapter.js.map +2 -2
  95. package/dist/core/database/query-cache.js +19 -9
  96. package/dist/core/database/query-cache.js.map +2 -2
  97. package/dist/core/database/query-router.js.map +2 -2
  98. package/dist/core/database/sqlite-adapter.js +1 -1
  99. package/dist/core/database/sqlite-adapter.js.map +2 -2
  100. package/dist/core/digest/enhanced-hybrid-digest.js +8 -2
  101. package/dist/core/digest/enhanced-hybrid-digest.js.map +2 -2
  102. package/dist/core/errors/recovery.js +9 -2
  103. package/dist/core/errors/recovery.js.map +2 -2
  104. package/dist/core/frame/workflow-templates-stub.js.map +1 -1
  105. package/dist/core/frame/workflow-templates.js +40 -1
  106. package/dist/core/frame/workflow-templates.js.map +2 -2
  107. package/dist/core/merge/resolution-engine.js.map +2 -2
  108. package/dist/core/monitoring/error-handler.js.map +2 -2
  109. package/dist/core/monitoring/logger.js +19 -3
  110. package/dist/core/monitoring/logger.js.map +2 -2
  111. package/dist/core/monitoring/metrics.js +13 -2
  112. package/dist/core/monitoring/metrics.js.map +2 -2
  113. package/dist/core/monitoring/progress-tracker.js +12 -1
  114. package/dist/core/monitoring/progress-tracker.js.map +2 -2
  115. package/dist/core/monitoring/session-monitor.js.map +2 -2
  116. package/dist/core/performance/context-cache.js.map +2 -2
  117. package/dist/core/performance/lazy-context-loader.js +24 -20
  118. package/dist/core/performance/lazy-context-loader.js.map +2 -2
  119. package/dist/core/performance/monitor.js.map +2 -2
  120. package/dist/core/performance/optimized-frame-context.js +27 -12
  121. package/dist/core/performance/optimized-frame-context.js.map +2 -2
  122. package/dist/core/performance/performance-benchmark.js +10 -6
  123. package/dist/core/performance/performance-benchmark.js.map +2 -2
  124. package/dist/core/performance/performance-profiler.js +63 -15
  125. package/dist/core/performance/performance-profiler.js.map +2 -2
  126. package/dist/core/performance/streaming-jsonl-parser.js +5 -1
  127. package/dist/core/performance/streaming-jsonl-parser.js.map +2 -2
  128. package/dist/core/persistence/postgres-adapter.js.map +2 -2
  129. package/dist/core/projects/project-manager.js +14 -20
  130. package/dist/core/projects/project-manager.js.map +2 -2
  131. package/dist/core/retrieval/context-retriever.js.map +2 -2
  132. package/dist/core/retrieval/graph-retrieval.js.map +2 -2
  133. package/dist/core/retrieval/llm-context-retrieval.js.map +2 -2
  134. package/dist/core/retrieval/retrieval-benchmarks.js.map +2 -2
  135. package/dist/core/retrieval/summary-generator.js.map +2 -2
  136. package/dist/core/session/clear-survival-stub.js +5 -1
  137. package/dist/core/session/clear-survival-stub.js.map +2 -2
  138. package/dist/core/session/clear-survival.js +35 -0
  139. package/dist/core/session/clear-survival.js.map +2 -2
  140. package/dist/core/session/handoff-generator.js.map +2 -2
  141. package/dist/core/session/index.js.map +1 -1
  142. package/dist/core/session/session-manager.js +16 -5
  143. package/dist/core/session/session-manager.js.map +2 -2
  144. package/dist/core/skills/skill-storage.js +13 -2
  145. package/dist/core/skills/skill-storage.js.map +2 -2
  146. package/dist/core/storage/chromadb-adapter.js +6 -2
  147. package/dist/core/storage/chromadb-adapter.js.map +2 -2
  148. package/dist/core/storage/chromadb-simple.js +17 -5
  149. package/dist/core/storage/chromadb-simple.js.map +2 -2
  150. package/dist/core/storage/infinite-storage.js +109 -46
  151. package/dist/core/storage/infinite-storage.js.map +2 -2
  152. package/dist/core/storage/railway-optimized-storage.js +67 -30
  153. package/dist/core/storage/railway-optimized-storage.js.map +2 -2
  154. package/dist/core/storage/remote-storage.js +53 -24
  155. package/dist/core/storage/remote-storage.js.map +2 -2
  156. package/dist/core/trace/cli-trace-wrapper.js +25 -7
  157. package/dist/core/trace/cli-trace-wrapper.js.map +2 -2
  158. package/dist/core/trace/db-trace-wrapper.js +96 -68
  159. package/dist/core/trace/db-trace-wrapper.js.map +2 -2
  160. package/dist/core/trace/debug-trace.js +44 -16
  161. package/dist/core/trace/debug-trace.js.map +2 -2
  162. package/dist/core/trace/index.js +50 -35
  163. package/dist/core/trace/index.js.map +2 -2
  164. package/dist/core/trace/linear-api-wrapper.js +10 -5
  165. package/dist/core/trace/linear-api-wrapper.js.map +2 -2
  166. package/dist/core/trace/trace-demo.js +26 -11
  167. package/dist/core/trace/trace-demo.js.map +2 -2
  168. package/dist/core/trace/trace-detector.js +9 -2
  169. package/dist/core/trace/trace-detector.js.map +2 -2
  170. package/dist/core/trace/trace-store.js.map +2 -2
  171. package/dist/core/trace/types.js.map +1 -1
  172. package/dist/core/utils/compression.js.map +1 -1
  173. package/dist/core/utils/update-checker.js.map +2 -2
  174. package/dist/core/worktree/worktree-manager.js +18 -7
  175. package/dist/core/worktree/worktree-manager.js.map +2 -2
  176. package/dist/features/analytics/api/analytics-api.js.map +2 -2
  177. package/dist/features/analytics/core/analytics-service.js +12 -1
  178. package/dist/features/analytics/core/analytics-service.js.map +2 -2
  179. package/dist/features/analytics/queries/metrics-queries.js +1 -1
  180. package/dist/features/analytics/queries/metrics-queries.js.map +2 -2
  181. package/dist/features/tasks/pebbles-task-store.js.map +2 -2
  182. package/dist/features/tui/components/analytics-panel.js +36 -15
  183. package/dist/features/tui/components/analytics-panel.js.map +2 -2
  184. package/dist/features/tui/components/pr-tracker.js +19 -7
  185. package/dist/features/tui/components/pr-tracker.js.map +2 -2
  186. package/dist/features/tui/components/session-monitor.js +22 -9
  187. package/dist/features/tui/components/session-monitor.js.map +2 -2
  188. package/dist/features/tui/components/subagent-fleet.js +20 -13
  189. package/dist/features/tui/components/subagent-fleet.js.map +2 -2
  190. package/dist/features/tui/components/task-board.js +666 -2
  191. package/dist/features/tui/components/task-board.js.map +2 -2
  192. package/dist/features/tui/index.js +16 -5
  193. package/dist/features/tui/index.js.map +2 -2
  194. package/dist/features/tui/services/data-service.js +30 -15
  195. package/dist/features/tui/services/data-service.js.map +2 -2
  196. package/dist/features/tui/services/linear-task-reader.js +3 -1
  197. package/dist/features/tui/services/linear-task-reader.js.map +2 -2
  198. package/dist/features/tui/services/websocket-client.js +16 -3
  199. package/dist/features/tui/services/websocket-client.js.map +2 -2
  200. package/dist/features/tui/terminal-compat.js +33 -18
  201. package/dist/features/tui/terminal-compat.js.map +2 -2
  202. package/dist/features/web/client/stores/task-store.js.map +2 -2
  203. package/dist/features/web/server/index.js +31 -12
  204. package/dist/features/web/server/index.js.map +2 -2
  205. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +2 -2
  206. package/dist/integrations/claude-code/lifecycle-hooks.js.map +2 -2
  207. package/dist/integrations/claude-code/post-task-hooks.js.map +2 -2
  208. package/dist/integrations/linear/auth.js +17 -6
  209. package/dist/integrations/linear/auth.js.map +2 -2
  210. package/dist/integrations/linear/auto-sync.js.map +2 -2
  211. package/dist/integrations/linear/client.js.map +2 -2
  212. package/dist/integrations/linear/config.js.map +2 -2
  213. package/dist/integrations/linear/migration.js.map +2 -2
  214. package/dist/integrations/linear/oauth-server.js +13 -2
  215. package/dist/integrations/linear/oauth-server.js.map +2 -2
  216. package/dist/integrations/linear/rest-client.js.map +2 -2
  217. package/dist/integrations/linear/sync-enhanced.js +202 -0
  218. package/dist/integrations/linear/sync-enhanced.js.map +7 -0
  219. package/dist/integrations/linear/sync-manager.js.map +2 -2
  220. package/dist/integrations/linear/sync-service.js +24 -14
  221. package/dist/integrations/linear/sync-service.js.map +2 -2
  222. package/dist/integrations/linear/sync.js +196 -3
  223. package/dist/integrations/linear/sync.js.map +2 -2
  224. package/dist/integrations/linear/unified-sync.js +560 -0
  225. package/dist/integrations/linear/unified-sync.js.map +7 -0
  226. package/dist/integrations/linear/webhook-handler.js +12 -1
  227. package/dist/integrations/linear/webhook-handler.js.map +2 -2
  228. package/dist/integrations/linear/webhook-server.js +29 -19
  229. package/dist/integrations/linear/webhook-server.js.map +2 -2
  230. package/dist/integrations/linear/webhook.js +12 -1
  231. package/dist/integrations/linear/webhook.js.map +2 -2
  232. package/dist/integrations/mcp/handlers/context-handlers.js.map +2 -2
  233. package/dist/integrations/mcp/handlers/linear-handlers.js.map +2 -2
  234. package/dist/integrations/mcp/handlers/skill-handlers.js +13 -2
  235. package/dist/integrations/mcp/handlers/skill-handlers.js.map +2 -2
  236. package/dist/integrations/mcp/handlers/task-handlers.js.map +2 -2
  237. package/dist/integrations/mcp/handlers/trace-handlers.js.map +2 -2
  238. package/dist/integrations/mcp/middleware/tool-scoring.js.map +2 -2
  239. package/dist/integrations/mcp/refactored-server.js +15 -4
  240. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  241. package/dist/integrations/mcp/server.js +12 -1
  242. package/dist/integrations/mcp/server.js.map +2 -2
  243. package/dist/integrations/mcp/tool-definitions.js.map +2 -2
  244. package/dist/integrations/pg-aiguide/embedding-provider.js +13 -2
  245. package/dist/integrations/pg-aiguide/embedding-provider.js.map +2 -2
  246. package/dist/integrations/pg-aiguide/semantic-search.js.map +2 -2
  247. package/dist/mcp/stackmemory-mcp-server.js +1 -1
  248. package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
  249. package/dist/middleware/exponential-rate-limiter.js.map +2 -2
  250. package/dist/servers/production/auth-middleware.js +13 -2
  251. package/dist/servers/production/auth-middleware.js.map +2 -2
  252. package/dist/servers/railway/index.js +22 -11
  253. package/dist/servers/railway/index.js.map +2 -2
  254. package/dist/services/config-service.js +6 -7
  255. package/dist/services/config-service.js.map +2 -2
  256. package/dist/services/context-service.js +11 -12
  257. package/dist/services/context-service.js.map +2 -2
  258. package/dist/skills/claude-skills.js +108 -3
  259. package/dist/skills/claude-skills.js.map +2 -2
  260. package/dist/skills/dashboard-launcher.js.map +2 -2
  261. package/dist/skills/repo-ingestion-skill.js +561 -0
  262. package/dist/skills/repo-ingestion-skill.js.map +7 -0
  263. package/dist/utils/env.js +46 -0
  264. package/dist/utils/env.js.map +7 -0
  265. package/dist/utils/logger.js +1 -1
  266. package/dist/utils/logger.js.map +2 -2
  267. package/package.json +5 -1
@@ -3,7 +3,8 @@ import chalk from "chalk";
3
3
  import ora from "ora";
4
4
  import { ChromaDBAdapter } from "../../core/storage/chromadb-adapter.js";
5
5
  import { FrameManager } from "../../core/context/frame-manager.js";
6
- import { Logger } from "../../core/monitoring/logger.js";
6
+ import { logger } from "../../core/monitoring/logger.js";
7
+ import { RepoIngestionSkill } from "../../skills/repo-ingestion-skill.js";
7
8
  import Table from "cli-table3";
8
9
  import dotenv from "dotenv";
9
10
  import path from "path";
@@ -12,22 +13,20 @@ import fs from "fs";
12
13
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
14
  dotenv.config({
14
15
  path: path.join(__dirname, "../../../.env"),
15
- override: true,
16
- silent: true
16
+ override: true
17
17
  });
18
- const logger = new Logger("ChromaDB-CLI");
19
18
  function createChromaDBCommand() {
20
19
  const chromadb = new Command("chromadb").description("Manage ChromaDB vector storage for context").alias("chroma");
21
20
  chromadb.command("init").description("Initialize ChromaDB connection").option("--api-key <key>", "ChromaDB API key").option("--tenant <tenant>", "ChromaDB tenant ID").option("--database <database>", "ChromaDB database name").option("--user-id <id>", "User ID for segmentation").option("--team-id <id>", "Team ID for segmentation").action(async (options) => {
22
21
  const spinner = ora("Initializing ChromaDB...").start();
23
22
  try {
24
23
  const config = {
25
- apiKey: options.apiKey || process.env.CHROMADB_API_KEY || "",
26
- tenant: options.tenant || process.env.CHROMADB_TENANT || "",
27
- database: options.database || process.env.CHROMADB_DATABASE || "stackmemory"
24
+ apiKey: options.apiKey || process.env["CHROMADB_API_KEY"] || "",
25
+ tenant: options.tenant || process.env["CHROMADB_TENANT"] || "",
26
+ database: options.database || process.env["CHROMADB_DATABASE"] || "stackmemory"
28
27
  };
29
- const userId = options.userId || process.env.USER || "default";
30
- const teamId = options.teamId || process.env.CHROMADB_TEAM_ID;
28
+ const userId = options.userId || process.env["USER"] || "default";
29
+ const teamId = options.teamId || process.env["CHROMADB_TEAM_ID"];
31
30
  if (!config.apiKey || !config.tenant) {
32
31
  spinner.fail("Missing ChromaDB credentials");
33
32
  console.log(chalk.yellow("\nPlease provide:"));
@@ -56,7 +55,10 @@ function createChromaDBCommand() {
56
55
  updates.push(`CHROMADB_DATABASE=${config.database}`);
57
56
  }
58
57
  if (updates.length > 0) {
59
- fs.appendFileSync(envPath, "\n# ChromaDB Configuration\n" + updates.join("\n") + "\n");
58
+ fs.appendFileSync(
59
+ envPath,
60
+ "\n# ChromaDB Configuration\n" + updates.join("\n") + "\n"
61
+ );
60
62
  }
61
63
  spinner.succeed("ChromaDB initialized successfully");
62
64
  console.log(chalk.green("\n\u2705 Configuration:"));
@@ -69,19 +71,25 @@ function createChromaDBCommand() {
69
71
  } catch (error) {
70
72
  spinner.fail("Failed to initialize ChromaDB");
71
73
  logger.error("Initialization error", error);
72
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
74
+ console.error(
75
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
76
+ );
73
77
  }
74
78
  });
75
- chromadb.command("store").description("Store current context in ChromaDB").option("--type <type>", "Context type (frame/decision/observation)", "frame").option("--content <content>", "Content to store").option("--project <name>", "Project name").action(async (options) => {
79
+ chromadb.command("store").description("Store current context in ChromaDB").option(
80
+ "--type <type>",
81
+ "Context type (frame/decision/observation)",
82
+ "frame"
83
+ ).option("--content <content>", "Content to store").option("--project <name>", "Project name").action(async (options) => {
76
84
  const spinner = ora("Storing context...").start();
77
85
  try {
78
86
  const config = {
79
- apiKey: process.env.CHROMADB_API_KEY || "",
80
- tenant: process.env.CHROMADB_TENANT || "",
81
- database: process.env.CHROMADB_DATABASE || "stackmemory"
87
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
88
+ tenant: process.env["CHROMADB_TENANT"] || "",
89
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory"
82
90
  };
83
- const userId = process.env.USER || "default";
84
- const teamId = process.env.CHROMADB_TEAM_ID;
91
+ const userId = process.env["USER"] || "default";
92
+ const teamId = process.env["CHROMADB_TEAM_ID"];
85
93
  const adapter = new ChromaDBAdapter(config, userId, teamId);
86
94
  await adapter.initialize();
87
95
  if (options.type === "frame") {
@@ -96,8 +104,8 @@ function createChromaDBCommand() {
96
104
  const metadata = {
97
105
  project_name: options.project || path.basename(process.cwd())
98
106
  };
99
- if (process.env.STACKMEMORY_SESSION_ID) {
100
- metadata.session_id = process.env.STACKMEMORY_SESSION_ID;
107
+ if (process.env["STACKMEMORY_SESSION_ID"]) {
108
+ metadata.session_id = process.env["STACKMEMORY_SESSION_ID"];
101
109
  }
102
110
  await adapter.storeContext(
103
111
  options.type,
@@ -109,19 +117,21 @@ function createChromaDBCommand() {
109
117
  } catch (error) {
110
118
  spinner.fail("Failed to store context");
111
119
  logger.error("Store error", error);
112
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
120
+ console.error(
121
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
122
+ );
113
123
  }
114
124
  });
115
125
  chromadb.command("query <search>").description("Query contexts from ChromaDB").option("--limit <n>", "Number of results", "10").option("--type <type>", "Filter by type").option("--project <name>", "Filter by project").action(async (search, options) => {
116
126
  const spinner = ora("Searching...").start();
117
127
  try {
118
128
  const config = {
119
- apiKey: process.env.CHROMADB_API_KEY || "",
120
- tenant: process.env.CHROMADB_TENANT || "",
121
- database: process.env.CHROMADB_DATABASE || "stackmemory"
129
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
130
+ tenant: process.env["CHROMADB_TENANT"] || "",
131
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory"
122
132
  };
123
- const userId = process.env.USER || "default";
124
- const teamId = process.env.CHROMADB_TEAM_ID;
133
+ const userId = process.env["USER"] || "default";
134
+ const teamId = process.env["CHROMADB_TEAM_ID"];
125
135
  const adapter = new ChromaDBAdapter(config, userId, teamId);
126
136
  await adapter.initialize();
127
137
  const filters = {};
@@ -161,19 +171,21 @@ function createChromaDBCommand() {
161
171
  } catch (error) {
162
172
  spinner.fail("Failed to query contexts");
163
173
  logger.error("Query error", error);
164
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
174
+ console.error(
175
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
176
+ );
165
177
  }
166
178
  });
167
179
  chromadb.command("recent").description("Get recent contexts").option("--limit <n>", "Number of results", "20").option("--type <type>", "Filter by type").action(async (options) => {
168
180
  const spinner = ora("Fetching recent contexts...").start();
169
181
  try {
170
182
  const config = {
171
- apiKey: process.env.CHROMADB_API_KEY || "",
172
- tenant: process.env.CHROMADB_TENANT || "",
173
- database: process.env.CHROMADB_DATABASE || "stackmemory"
183
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
184
+ tenant: process.env["CHROMADB_TENANT"] || "",
185
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory"
174
186
  };
175
- const userId = process.env.USER || "default";
176
- const teamId = process.env.CHROMADB_TEAM_ID;
187
+ const userId = process.env["USER"] || "default";
188
+ const teamId = process.env["CHROMADB_TEAM_ID"];
177
189
  const adapter = new ChromaDBAdapter(config, userId, teamId);
178
190
  await adapter.initialize();
179
191
  const results = await adapter.getRecentContexts(
@@ -201,24 +213,28 @@ function createChromaDBCommand() {
201
213
  ]);
202
214
  }
203
215
  console.log(table.toString());
204
- console.log(chalk.green(`
205
- \u2705 Found ${results.length} recent contexts`));
216
+ console.log(
217
+ chalk.green(`
218
+ \u2705 Found ${results.length} recent contexts`)
219
+ );
206
220
  } catch (error) {
207
221
  spinner.fail("Failed to get recent contexts");
208
222
  logger.error("Recent error", error);
209
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
223
+ console.error(
224
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
225
+ );
210
226
  }
211
227
  });
212
228
  chromadb.command("stats").description("Get ChromaDB storage statistics").action(async () => {
213
229
  const spinner = ora("Fetching statistics...").start();
214
230
  try {
215
231
  const config = {
216
- apiKey: process.env.CHROMADB_API_KEY || "",
217
- tenant: process.env.CHROMADB_TENANT || "",
218
- database: process.env.CHROMADB_DATABASE || "stackmemory"
232
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
233
+ tenant: process.env["CHROMADB_TENANT"] || "",
234
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory"
219
235
  };
220
- const userId = process.env.USER || "default";
221
- const teamId = process.env.CHROMADB_TEAM_ID;
236
+ const userId = process.env["USER"] || "default";
237
+ const teamId = process.env["CHROMADB_TEAM_ID"];
222
238
  const adapter = new ChromaDBAdapter(config, userId, teamId);
223
239
  await adapter.initialize();
224
240
  const stats = await adapter.getStats();
@@ -236,19 +252,21 @@ function createChromaDBCommand() {
236
252
  } catch (error) {
237
253
  spinner.fail("Failed to get statistics");
238
254
  logger.error("Stats error", error);
239
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
255
+ console.error(
256
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
257
+ );
240
258
  }
241
259
  });
242
260
  chromadb.command("clean").description("Clean old contexts").option("--days <n>", "Delete contexts older than N days", "30").action(async (options) => {
243
261
  const spinner = ora("Cleaning old contexts...").start();
244
262
  try {
245
263
  const config = {
246
- apiKey: process.env.CHROMADB_API_KEY || "",
247
- tenant: process.env.CHROMADB_TENANT || "",
248
- database: process.env.CHROMADB_DATABASE || "stackmemory"
264
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
265
+ tenant: process.env["CHROMADB_TENANT"] || "",
266
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory"
249
267
  };
250
- const userId = process.env.USER || "default";
251
- const teamId = process.env.CHROMADB_TEAM_ID;
268
+ const userId = process.env["USER"] || "default";
269
+ const teamId = process.env["CHROMADB_TEAM_ID"];
252
270
  const adapter = new ChromaDBAdapter(config, userId, teamId);
253
271
  await adapter.initialize();
254
272
  const deleted = await adapter.deleteOldContexts(parseInt(options.days));
@@ -256,7 +274,204 @@ function createChromaDBCommand() {
256
274
  } catch (error) {
257
275
  spinner.fail("Failed to clean contexts");
258
276
  logger.error("Clean error", error);
259
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
277
+ console.error(
278
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
279
+ );
280
+ }
281
+ });
282
+ chromadb.command("ingest <name>").description("Ingest a repository into ChromaDB for code search").option("--path <path>", "Repository path (default: current directory)").option("--incremental", "Only process changed files").option("--include-tests", "Include test files").option("--include-docs", "Include documentation files").option("--force-update", "Force re-indexing of all files").option("--max-file-size <bytes>", "Maximum file size to process").option("--chunk-size <lines>", "Lines per chunk").action(async (name, options) => {
283
+ const spinner = ora("Ingesting repository...").start();
284
+ try {
285
+ const config = {
286
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
287
+ tenant: process.env["CHROMADB_TENANT"] || "",
288
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory",
289
+ collectionName: "stackmemory_repos"
290
+ };
291
+ if (!config.apiKey || !config.tenant) {
292
+ spinner.fail("ChromaDB not configured");
293
+ console.log(chalk.yellow("\nPlease run: stackmemory chromadb init"));
294
+ return;
295
+ }
296
+ const userId = process.env["USER"] || "default";
297
+ const teamId = process.env["CHROMADB_TEAM_ID"];
298
+ const skill = new RepoIngestionSkill(config, userId, teamId);
299
+ await skill.initialize();
300
+ const repoPath = options.path || process.cwd();
301
+ const result = await skill.ingestRepository(repoPath, name, {
302
+ incremental: options.incremental,
303
+ forceUpdate: options.forceUpdate,
304
+ includeTests: options.includeTests,
305
+ includeDocs: options.includeDocs,
306
+ maxFileSize: options.maxFileSize ? parseInt(options.maxFileSize) : void 0,
307
+ chunkSize: options.chunkSize ? parseInt(options.chunkSize) : void 0
308
+ });
309
+ if (result.success) {
310
+ spinner.succeed(result.message);
311
+ if (result.stats) {
312
+ console.log(chalk.green("\n\u{1F4CA} Ingestion Statistics:"));
313
+ console.log(` Files processed: ${result.stats.filesProcessed}`);
314
+ console.log(` Chunks created: ${result.stats.chunksCreated}`);
315
+ console.log(
316
+ ` Total size: ${(result.stats.totalSize / 1024 / 1024).toFixed(2)} MB`
317
+ );
318
+ console.log(
319
+ ` Time elapsed: ${(result.stats.timeElapsed / 1e3).toFixed(2)} seconds`
320
+ );
321
+ }
322
+ } else {
323
+ spinner.fail(result.message);
324
+ }
325
+ } catch (error) {
326
+ spinner.fail("Failed to ingest repository");
327
+ logger.error("Ingestion error", error);
328
+ console.error(
329
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
330
+ );
331
+ }
332
+ });
333
+ chromadb.command("update <name>").description("Update an existing repository in ChromaDB").option("--path <path>", "Repository path (default: current directory)").option("--force-update", "Force re-indexing of all files").action(async (name, options) => {
334
+ const spinner = ora("Updating repository...").start();
335
+ try {
336
+ const config = {
337
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
338
+ tenant: process.env["CHROMADB_TENANT"] || "",
339
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory",
340
+ collectionName: "stackmemory_repos"
341
+ };
342
+ if (!config.apiKey || !config.tenant) {
343
+ spinner.fail("ChromaDB not configured");
344
+ console.log(chalk.yellow("\nPlease run: stackmemory chromadb init"));
345
+ return;
346
+ }
347
+ const userId = process.env["USER"] || "default";
348
+ const teamId = process.env["CHROMADB_TEAM_ID"];
349
+ const skill = new RepoIngestionSkill(config, userId, teamId);
350
+ await skill.initialize();
351
+ const repoPath = options.path || process.cwd();
352
+ const result = await skill.updateRepository(repoPath, name, {
353
+ forceUpdate: options.forceUpdate
354
+ });
355
+ if (result.success) {
356
+ spinner.succeed(result.message);
357
+ if (result.stats) {
358
+ console.log(chalk.green("\n\u{1F4CA} Update Statistics:"));
359
+ console.log(` Files updated: ${result.stats.filesUpdated}`);
360
+ console.log(` Files added: ${result.stats.filesAdded}`);
361
+ console.log(` Files removed: ${result.stats.filesRemoved}`);
362
+ console.log(
363
+ ` Time elapsed: ${(result.stats.timeElapsed / 1e3).toFixed(2)} seconds`
364
+ );
365
+ }
366
+ } else {
367
+ spinner.fail(result.message);
368
+ }
369
+ } catch (error) {
370
+ spinner.fail("Failed to update repository");
371
+ logger.error("Update error", error);
372
+ console.error(
373
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
374
+ );
375
+ }
376
+ });
377
+ chromadb.command("search-code <query>").description("Search code in ingested repositories").option("--repo <name>", "Filter by repository name").option("--language <lang>", "Filter by programming language").option("--limit <n>", "Maximum results", "20").action(async (query, options) => {
378
+ const spinner = ora("Searching code...").start();
379
+ try {
380
+ const config = {
381
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
382
+ tenant: process.env["CHROMADB_TENANT"] || "",
383
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory",
384
+ collectionName: "stackmemory_repos"
385
+ };
386
+ if (!config.apiKey || !config.tenant) {
387
+ spinner.fail("ChromaDB not configured");
388
+ console.log(chalk.yellow("\nPlease run: stackmemory chromadb init"));
389
+ return;
390
+ }
391
+ const userId = process.env["USER"] || "default";
392
+ const teamId = process.env["CHROMADB_TEAM_ID"];
393
+ const skill = new RepoIngestionSkill(config, userId, teamId);
394
+ await skill.initialize();
395
+ const results = await skill.searchCode(query, {
396
+ repoName: options.repo,
397
+ language: options.language,
398
+ limit: parseInt(options.limit)
399
+ });
400
+ spinner.stop();
401
+ if (results.length === 0) {
402
+ console.log(chalk.yellow("No results found"));
403
+ return;
404
+ }
405
+ console.log(chalk.cyan(`
406
+ \u{1F50D} Found ${results.length} code matches:
407
+ `));
408
+ for (const result of results) {
409
+ console.log(chalk.green(`\u{1F4C1} ${result.repoName}/${result.filePath}`));
410
+ console.log(
411
+ chalk.gray(
412
+ ` Lines ${result.startLine}-${result.endLine} | Score: ${result.score.toFixed(3)}`
413
+ )
414
+ );
415
+ const lines = result.content.split("\n").slice(0, 3);
416
+ lines.forEach((line) => {
417
+ console.log(
418
+ chalk.dim(
419
+ ` ${line.slice(0, 80)}${line.length > 80 ? "..." : ""}`
420
+ )
421
+ );
422
+ });
423
+ console.log();
424
+ }
425
+ } catch (error) {
426
+ spinner.fail("Failed to search code");
427
+ logger.error("Search error", error);
428
+ console.error(
429
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
430
+ );
431
+ }
432
+ });
433
+ chromadb.command("repo-stats [name]").description("Get statistics for ingested repositories").action(async (name) => {
434
+ const spinner = ora("Fetching repository statistics...").start();
435
+ try {
436
+ const config = {
437
+ apiKey: process.env["CHROMADB_API_KEY"] || "",
438
+ tenant: process.env["CHROMADB_TENANT"] || "",
439
+ database: process.env["CHROMADB_DATABASE"] || "stackmemory",
440
+ collectionName: "stackmemory_repos"
441
+ };
442
+ if (!config.apiKey || !config.tenant) {
443
+ spinner.fail("ChromaDB not configured");
444
+ console.log(chalk.yellow("\nPlease run: stackmemory chromadb init"));
445
+ return;
446
+ }
447
+ const userId = process.env["USER"] || "default";
448
+ const teamId = process.env["CHROMADB_TEAM_ID"];
449
+ const skill = new RepoIngestionSkill(config, userId, teamId);
450
+ await skill.initialize();
451
+ const stats = await skill.getRepoStats(name);
452
+ spinner.stop();
453
+ console.log(chalk.cyan("\n\u{1F4CA} Repository Statistics\n"));
454
+ console.log(`Total repositories: ${chalk.bold(stats.totalRepos)}`);
455
+ console.log(`Total files: ${chalk.bold(stats.totalFiles)}`);
456
+ console.log(`Total chunks: ${chalk.bold(stats.totalChunks)}`);
457
+ if (Object.keys(stats.languages).length > 0) {
458
+ console.log("\nLanguages:");
459
+ for (const [lang, count] of Object.entries(stats.languages)) {
460
+ console.log(` ${lang}: ${count}`);
461
+ }
462
+ }
463
+ if (Object.keys(stats.frameworks).length > 0) {
464
+ console.log("\nFrameworks:");
465
+ for (const [framework, count] of Object.entries(stats.frameworks)) {
466
+ console.log(` ${framework}: ${count}`);
467
+ }
468
+ }
469
+ } catch (error) {
470
+ spinner.fail("Failed to get repository statistics");
471
+ logger.error("Stats error", error);
472
+ console.error(
473
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
474
+ );
260
475
  }
261
476
  });
262
477
  return chromadb;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/commands/chromadb.ts"],
4
- "sourcesContent": ["/**\n * ChromaDB CLI Commands for StackMemory\n * \n * Provides commands to interact with ChromaDB vector storage\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ChromaDBAdapter } from '../../core/storage/chromadb-adapter.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { Logger } from '../../core/monitoring/logger.js';\nimport Table from 'cli-table3';\nimport dotenv from 'dotenv';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Load environment variables\ndotenv.config({ \n path: path.join(__dirname, '../../../.env'),\n override: true,\n silent: true\n});\n\nconst logger = new Logger('ChromaDB-CLI');\n\nexport function createChromaDBCommand(): Command {\n const chromadb = new Command('chromadb')\n .description('Manage ChromaDB vector storage for context')\n .alias('chroma');\n\n // Initialize ChromaDB\n chromadb\n .command('init')\n .description('Initialize ChromaDB connection')\n .option('--api-key <key>', 'ChromaDB API key')\n .option('--tenant <tenant>', 'ChromaDB tenant ID')\n .option('--database <database>', 'ChromaDB database name')\n .option('--user-id <id>', 'User ID for segmentation')\n .option('--team-id <id>', 'Team ID for segmentation')\n .action(async (options) => {\n const spinner = ora('Initializing ChromaDB...').start();\n\n try {\n // Get config from options or environment\n const config = {\n apiKey: options.apiKey || process.env.CHROMADB_API_KEY || '',\n tenant: options.tenant || process.env.CHROMADB_TENANT || '',\n database: options.database || process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = options.userId || process.env.USER || 'default';\n const teamId = options.teamId || process.env.CHROMADB_TEAM_ID;\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('Missing ChromaDB credentials');\n console.log(chalk.yellow('\\nPlease provide:'));\n console.log(' --api-key <key> ChromaDB API key');\n console.log(' --tenant <tenant> ChromaDB tenant ID');\n console.log('\\nOr set environment variables:');\n console.log(' CHROMADB_API_KEY');\n console.log(' CHROMADB_TENANT');\n return;\n }\n\n // Initialize adapter\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n // Save config to .env if not present\n const envPath = path.join(__dirname, '../../../.env');\n let envContent = '';\n \n if (fs.existsSync(envPath)) {\n envContent = fs.readFileSync(envPath, 'utf8');\n }\n\n const updates: string[] = [];\n if (!envContent.includes('CHROMADB_API_KEY')) {\n updates.push(`CHROMADB_API_KEY=${config.apiKey}`);\n }\n if (!envContent.includes('CHROMADB_TENANT')) {\n updates.push(`CHROMADB_TENANT=${config.tenant}`);\n }\n if (!envContent.includes('CHROMADB_DATABASE')) {\n updates.push(`CHROMADB_DATABASE=${config.database}`);\n }\n\n if (updates.length > 0) {\n fs.appendFileSync(envPath, '\\n# ChromaDB Configuration\\n' + updates.join('\\n') + '\\n');\n }\n\n spinner.succeed('ChromaDB initialized successfully');\n \n console.log(chalk.green('\\n\u2705 Configuration:'));\n console.log(` Tenant: ${config.tenant}`);\n console.log(` Database: ${config.database}`);\n console.log(` User ID: ${userId}`);\n if (teamId) {\n console.log(` Team ID: ${teamId}`);\n }\n } catch (error) {\n spinner.fail('Failed to initialize ChromaDB');\n logger.error('Initialization error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Store current context\n chromadb\n .command('store')\n .description('Store current context in ChromaDB')\n .option('--type <type>', 'Context type (frame/decision/observation)', 'frame')\n .option('--content <content>', 'Content to store')\n .option('--project <name>', 'Project name')\n .action(async (options) => {\n const spinner = ora('Storing context...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n if (options.type === 'frame') {\n // Store current frames\n const frameManager = new FrameManager();\n const frames = frameManager.getAllFrames();\n \n for (const frame of frames) {\n await adapter.storeFrame(frame);\n }\n \n spinner.succeed(`Stored ${frames.length} frames`);\n } else {\n // Store decision or observation\n const content = options.content || `${options.type} at ${new Date().toISOString()}`;\n const metadata: any = {\n project_name: options.project || path.basename(process.cwd()),\n };\n \n // Only add session_id if it exists\n if (process.env.STACKMEMORY_SESSION_ID) {\n metadata.session_id = process.env.STACKMEMORY_SESSION_ID;\n }\n \n await adapter.storeContext(\n options.type as 'decision' | 'observation',\n content,\n metadata\n );\n \n spinner.succeed(`Stored ${options.type}`);\n }\n } catch (error) {\n spinner.fail('Failed to store context');\n logger.error('Store error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Query contexts\n chromadb\n .command('query <search>')\n .description('Query contexts from ChromaDB')\n .option('--limit <n>', 'Number of results', '10')\n .option('--type <type>', 'Filter by type')\n .option('--project <name>', 'Filter by project')\n .action(async (search, options) => {\n const spinner = ora('Searching...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const filters: any = {};\n if (options.type) {\n filters.type = [options.type];\n }\n if (options.project) {\n filters.projectName = options.project;\n }\n\n const results = await adapter.queryContexts(\n search,\n parseInt(options.limit),\n filters\n );\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No results found'));\n return;\n }\n\n // Display results\n const table = new Table({\n head: ['Type', 'Project', 'Content', 'Distance'],\n colWidths: [15, 20, 50, 10],\n wordWrap: true,\n });\n\n for (const result of results) {\n const content = result.content.substring(0, 100) + \n (result.content.length > 100 ? '...' : '');\n \n table.push([\n result.metadata.type || 'unknown',\n result.metadata.project_name || 'default',\n content,\n result.distance.toFixed(3),\n ]);\n }\n\n console.log(table.toString());\n console.log(chalk.green(`\\n\u2705 Found ${results.length} results`));\n } catch (error) {\n spinner.fail('Failed to query contexts');\n logger.error('Query error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Get recent contexts\n chromadb\n .command('recent')\n .description('Get recent contexts')\n .option('--limit <n>', 'Number of results', '20')\n .option('--type <type>', 'Filter by type')\n .action(async (options) => {\n const spinner = ora('Fetching recent contexts...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const results = await adapter.getRecentContexts(\n parseInt(options.limit),\n options.type\n );\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No recent contexts found'));\n return;\n }\n\n // Display results\n const table = new Table({\n head: ['Time', 'Type', 'Project', 'Content'],\n colWidths: [20, 12, 20, 48],\n wordWrap: true,\n });\n\n for (const result of results) {\n const time = new Date(result.metadata.timestamp).toLocaleString();\n const content = result.content.substring(0, 100) + \n (result.content.length > 100 ? '...' : '');\n \n table.push([\n time,\n result.metadata.type || 'unknown',\n result.metadata.project_name || 'default',\n content,\n ]);\n }\n\n console.log(table.toString());\n console.log(chalk.green(`\\n\u2705 Found ${results.length} recent contexts`));\n } catch (error) {\n spinner.fail('Failed to get recent contexts');\n logger.error('Recent error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Get statistics\n chromadb\n .command('stats')\n .description('Get ChromaDB storage statistics')\n .action(async () => {\n const spinner = ora('Fetching statistics...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const stats = await adapter.getStats();\n\n spinner.stop();\n\n console.log(chalk.cyan('\\n\uD83D\uDCCA ChromaDB Statistics\\n'));\n console.log(`Total Documents: ${chalk.bold(stats.totalDocuments)}`);\n console.log(`User Documents: ${chalk.bold(stats.userDocuments)}`);\n \n if (stats.teamDocuments !== undefined) {\n console.log(`Team Documents: ${chalk.bold(stats.teamDocuments)}`);\n }\n\n console.log('\\nDocuments by Type:');\n for (const [type, count] of Object.entries(stats.documentsByType)) {\n console.log(` ${type}: ${count}`);\n }\n } catch (error) {\n spinner.fail('Failed to get statistics');\n logger.error('Stats error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Clean old contexts\n chromadb\n .command('clean')\n .description('Clean old contexts')\n .option('--days <n>', 'Delete contexts older than N days', '30')\n .action(async (options) => {\n const spinner = ora('Cleaning old contexts...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const deleted = await adapter.deleteOldContexts(parseInt(options.days));\n\n spinner.succeed(`Deleted ${deleted} old contexts`);\n } catch (error) {\n spinner.fail('Failed to clean contexts');\n logger.error('Clean error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n return chromadb;\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * ChromaDB CLI Commands for StackMemory\n *\n * Provides commands to interact with ChromaDB vector storage\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ChromaDBAdapter } from '../../core/storage/chromadb-adapter.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { RepoIngestionSkill } from '../../skills/repo-ingestion-skill.js';\nimport Table from 'cli-table3';\nimport dotenv from 'dotenv';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Load environment variables\ndotenv.config({\n path: path.join(__dirname, '../../../.env'),\n override: true,\n});\n\n\n\nexport function createChromaDBCommand(): Command {\n const chromadb = new Command('chromadb')\n .description('Manage ChromaDB vector storage for context')\n .alias('chroma');\n\n // Initialize ChromaDB\n chromadb\n .command('init')\n .description('Initialize ChromaDB connection')\n .option('--api-key <key>', 'ChromaDB API key')\n .option('--tenant <tenant>', 'ChromaDB tenant ID')\n .option('--database <database>', 'ChromaDB database name')\n .option('--user-id <id>', 'User ID for segmentation')\n .option('--team-id <id>', 'Team ID for segmentation')\n .action(async (options) => {\n const spinner = ora('Initializing ChromaDB...').start();\n\n try {\n // Get config from options or environment\n const config = {\n apiKey: options.apiKey || process.env['CHROMADB_API_KEY'] || '',\n tenant: options.tenant || process.env['CHROMADB_TENANT'] || '',\n database:\n options.database ||\n process.env['CHROMADB_DATABASE'] ||\n 'stackmemory',\n };\n\n const userId = options.userId || process.env['USER'] || 'default';\n const teamId = options.teamId || process.env['CHROMADB_TEAM_ID'];\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('Missing ChromaDB credentials');\n console.log(chalk.yellow('\\nPlease provide:'));\n console.log(' --api-key <key> ChromaDB API key');\n console.log(' --tenant <tenant> ChromaDB tenant ID');\n console.log('\\nOr set environment variables:');\n console.log(' CHROMADB_API_KEY');\n console.log(' CHROMADB_TENANT');\n return;\n }\n\n // Initialize adapter\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n // Save config to .env if not present\n const envPath = path.join(__dirname, '../../../.env');\n let envContent = '';\n\n if (fs.existsSync(envPath)) {\n envContent = fs.readFileSync(envPath, 'utf8');\n }\n\n const updates: string[] = [];\n if (!envContent.includes('CHROMADB_API_KEY')) {\n updates.push(`CHROMADB_API_KEY=${config.apiKey}`);\n }\n if (!envContent.includes('CHROMADB_TENANT')) {\n updates.push(`CHROMADB_TENANT=${config.tenant}`);\n }\n if (!envContent.includes('CHROMADB_DATABASE')) {\n updates.push(`CHROMADB_DATABASE=${config.database}`);\n }\n\n if (updates.length > 0) {\n fs.appendFileSync(\n envPath,\n '\\n# ChromaDB Configuration\\n' + updates.join('\\n') + '\\n'\n );\n }\n\n spinner.succeed('ChromaDB initialized successfully');\n\n console.log(chalk.green('\\n\u2705 Configuration:'));\n console.log(` Tenant: ${config.tenant}`);\n console.log(` Database: ${config.database}`);\n console.log(` User ID: ${userId}`);\n if (teamId) {\n console.log(` Team ID: ${teamId}`);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to initialize ChromaDB');\n logger.error('Initialization error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Store current context\n chromadb\n .command('store')\n .description('Store current context in ChromaDB')\n .option(\n '--type <type>',\n 'Context type (frame/decision/observation)',\n 'frame'\n )\n .option('--content <content>', 'Content to store')\n .option('--project <name>', 'Project name')\n .action(async (options) => {\n const spinner = ora('Storing context...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n if (options.type === 'frame') {\n // Store current frames\n const frameManager = new FrameManager();\n const frames = frameManager.getAllFrames();\n\n for (const frame of frames) {\n await adapter.storeFrame(frame);\n }\n\n spinner.succeed(`Stored ${frames.length} frames`);\n } else {\n // Store decision or observation\n const content =\n options.content || `${options.type} at ${new Date().toISOString()}`;\n const metadata: any = {\n project_name: options.project || path.basename(process.cwd()),\n };\n\n // Only add session_id if it exists\n if (process.env['STACKMEMORY_SESSION_ID']) {\n metadata.session_id = process.env['STACKMEMORY_SESSION_ID'];\n }\n\n await adapter.storeContext(\n options.type as 'decision' | 'observation',\n content,\n metadata\n );\n\n spinner.succeed(`Stored ${options.type}`);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to store context');\n logger.error('Store error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Query contexts\n chromadb\n .command('query <search>')\n .description('Query contexts from ChromaDB')\n .option('--limit <n>', 'Number of results', '10')\n .option('--type <type>', 'Filter by type')\n .option('--project <name>', 'Filter by project')\n .action(async (search, options) => {\n const spinner = ora('Searching...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const filters: any = {};\n if (options.type) {\n filters.type = [options.type];\n }\n if (options.project) {\n filters.projectName = options.project;\n }\n\n const results = await adapter.queryContexts(\n search,\n parseInt(options.limit),\n filters\n );\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No results found'));\n return;\n }\n\n // Display results\n const table = new Table({\n head: ['Type', 'Project', 'Content', 'Distance'],\n colWidths: [15, 20, 50, 10],\n wordWrap: true,\n });\n\n for (const result of results) {\n const content =\n result.content.substring(0, 100) +\n (result.content.length > 100 ? '...' : '');\n\n table.push([\n result.metadata.type || 'unknown',\n result.metadata.project_name || 'default',\n content,\n result.distance.toFixed(3),\n ]);\n }\n\n console.log(table.toString());\n console.log(chalk.green(`\\n\u2705 Found ${results.length} results`));\n } catch (error: unknown) {\n spinner.fail('Failed to query contexts');\n logger.error('Query error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Get recent contexts\n chromadb\n .command('recent')\n .description('Get recent contexts')\n .option('--limit <n>', 'Number of results', '20')\n .option('--type <type>', 'Filter by type')\n .action(async (options) => {\n const spinner = ora('Fetching recent contexts...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const results = await adapter.getRecentContexts(\n parseInt(options.limit),\n options.type\n );\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No recent contexts found'));\n return;\n }\n\n // Display results\n const table = new Table({\n head: ['Time', 'Type', 'Project', 'Content'],\n colWidths: [20, 12, 20, 48],\n wordWrap: true,\n });\n\n for (const result of results) {\n const time = new Date(result.metadata.timestamp).toLocaleString();\n const content =\n result.content.substring(0, 100) +\n (result.content.length > 100 ? '...' : '');\n\n table.push([\n time,\n result.metadata.type || 'unknown',\n result.metadata.project_name || 'default',\n content,\n ]);\n }\n\n console.log(table.toString());\n console.log(\n chalk.green(`\\n\u2705 Found ${results.length} recent contexts`)\n );\n } catch (error: unknown) {\n spinner.fail('Failed to get recent contexts');\n logger.error('Recent error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Get statistics\n chromadb\n .command('stats')\n .description('Get ChromaDB storage statistics')\n .action(async () => {\n const spinner = ora('Fetching statistics...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const stats = await adapter.getStats();\n\n spinner.stop();\n\n console.log(chalk.cyan('\\n\uD83D\uDCCA ChromaDB Statistics\\n'));\n console.log(`Total Documents: ${chalk.bold(stats.totalDocuments)}`);\n console.log(`User Documents: ${chalk.bold(stats.userDocuments)}`);\n\n if (stats.teamDocuments !== undefined) {\n console.log(`Team Documents: ${chalk.bold(stats.teamDocuments)}`);\n }\n\n console.log('\\nDocuments by Type:');\n for (const [type, count] of Object.entries(stats.documentsByType)) {\n console.log(` ${type}: ${count}`);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to get statistics');\n logger.error('Stats error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Clean old contexts\n chromadb\n .command('clean')\n .description('Clean old contexts')\n .option('--days <n>', 'Delete contexts older than N days', '30')\n .action(async (options) => {\n const spinner = ora('Cleaning old contexts...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const deleted = await adapter.deleteOldContexts(parseInt(options.days));\n\n spinner.succeed(`Deleted ${deleted} old contexts`);\n } catch (error: unknown) {\n spinner.fail('Failed to clean contexts');\n logger.error('Clean error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Ingest repository\n chromadb\n .command('ingest <name>')\n .description('Ingest a repository into ChromaDB for code search')\n .option('--path <path>', 'Repository path (default: current directory)')\n .option('--incremental', 'Only process changed files')\n .option('--include-tests', 'Include test files')\n .option('--include-docs', 'Include documentation files')\n .option('--force-update', 'Force re-indexing of all files')\n .option('--max-file-size <bytes>', 'Maximum file size to process')\n .option('--chunk-size <lines>', 'Lines per chunk')\n .action(async (name, options) => {\n const spinner = ora('Ingesting repository...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: 'stackmemory_repos',\n };\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('ChromaDB not configured');\n console.log(chalk.yellow('\\nPlease run: stackmemory chromadb init'));\n return;\n }\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const skill = new RepoIngestionSkill(config, userId, teamId);\n await skill.initialize();\n\n const repoPath = options.path || process.cwd();\n const result = await skill.ingestRepository(repoPath, name, {\n incremental: options.incremental,\n forceUpdate: options.forceUpdate,\n includeTests: options.includeTests,\n includeDocs: options.includeDocs,\n maxFileSize: options.maxFileSize\n ? parseInt(options.maxFileSize)\n : undefined,\n chunkSize: options.chunkSize\n ? parseInt(options.chunkSize)\n : undefined,\n });\n\n if (result.success) {\n spinner.succeed(result.message);\n if (result.stats) {\n console.log(chalk.green('\\n\uD83D\uDCCA Ingestion Statistics:'));\n console.log(` Files processed: ${result.stats.filesProcessed}`);\n console.log(` Chunks created: ${result.stats.chunksCreated}`);\n console.log(\n ` Total size: ${(result.stats.totalSize / 1024 / 1024).toFixed(2)} MB`\n );\n console.log(\n ` Time elapsed: ${(result.stats.timeElapsed / 1000).toFixed(2)} seconds`\n );\n }\n } else {\n spinner.fail(result.message);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to ingest repository');\n logger.error('Ingestion error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Update repository\n chromadb\n .command('update <name>')\n .description('Update an existing repository in ChromaDB')\n .option('--path <path>', 'Repository path (default: current directory)')\n .option('--force-update', 'Force re-indexing of all files')\n .action(async (name, options) => {\n const spinner = ora('Updating repository...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: 'stackmemory_repos',\n };\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('ChromaDB not configured');\n console.log(chalk.yellow('\\nPlease run: stackmemory chromadb init'));\n return;\n }\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const skill = new RepoIngestionSkill(config, userId, teamId);\n await skill.initialize();\n\n const repoPath = options.path || process.cwd();\n const result = await skill.updateRepository(repoPath, name, {\n forceUpdate: options.forceUpdate,\n });\n\n if (result.success) {\n spinner.succeed(result.message);\n if (result.stats) {\n console.log(chalk.green('\\n\uD83D\uDCCA Update Statistics:'));\n console.log(` Files updated: ${result.stats.filesUpdated}`);\n console.log(` Files added: ${result.stats.filesAdded}`);\n console.log(` Files removed: ${result.stats.filesRemoved}`);\n console.log(\n ` Time elapsed: ${(result.stats.timeElapsed / 1000).toFixed(2)} seconds`\n );\n }\n } else {\n spinner.fail(result.message);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to update repository');\n logger.error('Update error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Search code\n chromadb\n .command('search-code <query>')\n .description('Search code in ingested repositories')\n .option('--repo <name>', 'Filter by repository name')\n .option('--language <lang>', 'Filter by programming language')\n .option('--limit <n>', 'Maximum results', '20')\n .action(async (query, options) => {\n const spinner = ora('Searching code...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: 'stackmemory_repos',\n };\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('ChromaDB not configured');\n console.log(chalk.yellow('\\nPlease run: stackmemory chromadb init'));\n return;\n }\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const skill = new RepoIngestionSkill(config, userId, teamId);\n await skill.initialize();\n\n const results = await skill.searchCode(query, {\n repoName: options.repo,\n language: options.language,\n limit: parseInt(options.limit),\n });\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No results found'));\n return;\n }\n\n console.log(chalk.cyan(`\\n\uD83D\uDD0D Found ${results.length} code matches:\\n`));\n\n for (const result of results) {\n console.log(chalk.green(`\uD83D\uDCC1 ${result.repoName}/${result.filePath}`));\n console.log(\n chalk.gray(\n ` Lines ${result.startLine}-${result.endLine} | Score: ${result.score.toFixed(3)}`\n )\n );\n\n // Show snippet\n const lines = result.content.split('\\n').slice(0, 3);\n lines.forEach((line) => {\n console.log(\n chalk.dim(\n ` ${line.slice(0, 80)}${line.length > 80 ? '...' : ''}`\n )\n );\n });\n console.log();\n }\n } catch (error: unknown) {\n spinner.fail('Failed to search code');\n logger.error('Search error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Repository stats\n chromadb\n .command('repo-stats [name]')\n .description('Get statistics for ingested repositories')\n .action(async (name) => {\n const spinner = ora('Fetching repository statistics...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: 'stackmemory_repos',\n };\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('ChromaDB not configured');\n console.log(chalk.yellow('\\nPlease run: stackmemory chromadb init'));\n return;\n }\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const skill = new RepoIngestionSkill(config, userId, teamId);\n await skill.initialize();\n\n const stats = await skill.getRepoStats(name);\n\n spinner.stop();\n\n console.log(chalk.cyan('\\n\uD83D\uDCCA Repository Statistics\\n'));\n console.log(`Total repositories: ${chalk.bold(stats.totalRepos)}`);\n console.log(`Total files: ${chalk.bold(stats.totalFiles)}`);\n console.log(`Total chunks: ${chalk.bold(stats.totalChunks)}`);\n\n if (Object.keys(stats.languages).length > 0) {\n console.log('\\nLanguages:');\n for (const [lang, count] of Object.entries(stats.languages)) {\n console.log(` ${lang}: ${count}`);\n }\n }\n\n if (Object.keys(stats.frameworks).length > 0) {\n console.log('\\nFrameworks:');\n for (const [framework, count] of Object.entries(stats.frameworks)) {\n console.log(` ${framework}: ${count}`);\n }\n }\n } catch (error: unknown) {\n spinner.fail('Failed to get repository statistics');\n logger.error('Stats error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n return chromadb;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,7 @@ import * as fs from "fs/promises";
6
6
  import * as path from "path";
7
7
  import Database from "better-sqlite3";
8
8
  import { existsSync } from "fs";
9
- import { ClearSurvival } from "../../core/session/clear-survival-stub.js";
9
+ import { ClearSurvival } from "../../core/session/clear-survival.js";
10
10
  import { FrameManager } from "../../core/context/frame-manager.js";
11
11
  import { sessionManager } from "../../core/session/session-manager.js";
12
12
  const clearCommand = new Command("clear").description("Manage context clearing with ledger preservation").option("--save", "Save continuity ledger before clearing").option("--restore", "Restore from continuity ledger").option("--check", "Check if clear is recommended").option("--auto", "Automatically save if needed and clear").option("--status", "Show current context usage").option("--show-ledger", "Display current ledger").action(async (options) => {
@@ -31,8 +31,13 @@ const clearCommand = new Command("clear").description("Manage context clearing w
31
31
  generateHandoff: () => Promise.resolve("Mock handoff"),
32
32
  getHandoffPath: () => "mock.md"
33
33
  };
34
+ const dbManager = {
35
+ getCurrentSessionId: () => Promise.resolve(session.id),
36
+ getSession: () => Promise.resolve(session)
37
+ };
34
38
  const clearSurvival = new ClearSurvival(
35
39
  frameManager,
40
+ dbManager,
36
41
  handoffGenerator,
37
42
  projectRoot
38
43
  );
@@ -59,7 +64,7 @@ const clearCommand = new Command("clear").description("Manage context clearing w
59
64
  }
60
65
  } catch (error) {
61
66
  console.error(chalk.red("Error: " + error.message));
62
- if (process.env.NODE_ENV !== "test") {
67
+ if (process.env["NODE_ENV"] !== "test") {
63
68
  process.exit(1);
64
69
  }
65
70
  }
@@ -105,7 +110,9 @@ async function saveLedger(clearSurvival, spinner) {
105
110
  console.log("\nSaved:");
106
111
  console.log(` \u2022 ${ledger.activeFrames.length} active frames`);
107
112
  console.log(` \u2022 ${ledger.decisions.length} key decisions`);
108
- console.log(` \u2022 ${ledger.context.importantTasks?.length || 0} important tasks`);
113
+ console.log(
114
+ ` \u2022 ${ledger.context.importantTasks?.length || 0} important tasks`
115
+ );
109
116
  }
110
117
  async function restoreFromLedger(clearSurvival, spinner) {
111
118
  spinner.start("Restoring from continuity ledger...");