@stackmemoryai/stackmemory 0.3.7 → 0.3.9

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 (202) 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/cli/claude-sm.js +0 -11
  6. package/dist/cli/claude-sm.js.map +2 -2
  7. package/dist/cli/codex-sm.js +0 -11
  8. package/dist/cli/codex-sm.js.map +2 -2
  9. package/dist/cli/commands/chromadb.js +64 -34
  10. package/dist/cli/commands/chromadb.js.map +2 -2
  11. package/dist/cli/commands/clear.js +9 -13
  12. package/dist/cli/commands/clear.js.map +2 -2
  13. package/dist/cli/commands/config.js +43 -33
  14. package/dist/cli/commands/config.js.map +2 -2
  15. package/dist/cli/commands/context.js.map +2 -2
  16. package/dist/cli/commands/dashboard.js +41 -13
  17. package/dist/cli/commands/dashboard.js.map +2 -2
  18. package/dist/cli/commands/gc.js +69 -20
  19. package/dist/cli/commands/gc.js.map +2 -2
  20. package/dist/cli/commands/handoff.js.map +2 -2
  21. package/dist/cli/commands/infinite-storage.js +60 -19
  22. package/dist/cli/commands/infinite-storage.js.map +2 -2
  23. package/dist/cli/commands/linear-create.js +36 -8
  24. package/dist/cli/commands/linear-create.js.map +2 -2
  25. package/dist/cli/commands/linear-list.js +33 -10
  26. package/dist/cli/commands/linear-list.js.map +2 -2
  27. package/dist/cli/commands/linear-migrate.js +17 -4
  28. package/dist/cli/commands/linear-migrate.js.map +2 -2
  29. package/dist/cli/commands/linear-test.js +14 -6
  30. package/dist/cli/commands/linear-test.js.map +2 -2
  31. package/dist/cli/commands/linear-unified.js +123 -35
  32. package/dist/cli/commands/linear-unified.js.map +2 -2
  33. package/dist/cli/commands/linear.js.map +2 -2
  34. package/dist/cli/commands/monitor.js.map +2 -2
  35. package/dist/cli/commands/onboard.js +35 -8
  36. package/dist/cli/commands/onboard.js.map +2 -2
  37. package/dist/cli/commands/quality.js +2 -7
  38. package/dist/cli/commands/quality.js.map +2 -2
  39. package/dist/cli/commands/session.js +23 -6
  40. package/dist/cli/commands/session.js.map +2 -2
  41. package/dist/cli/commands/skills.js +72 -27
  42. package/dist/cli/commands/skills.js.map +2 -2
  43. package/dist/cli/commands/storage.js +108 -38
  44. package/dist/cli/commands/storage.js.map +2 -2
  45. package/dist/cli/commands/tui.js.map +2 -2
  46. package/dist/cli/commands/webhook.js +57 -18
  47. package/dist/cli/commands/webhook.js.map +2 -2
  48. package/dist/cli/commands/workflow.js +8 -15
  49. package/dist/cli/commands/workflow.js.map +2 -2
  50. package/dist/cli/commands/worktree.js +34 -13
  51. package/dist/cli/commands/worktree.js.map +2 -2
  52. package/dist/cli/index.js +0 -11
  53. package/dist/cli/index.js.map +2 -2
  54. package/dist/core/config/types.js.map +1 -1
  55. package/dist/core/context/auto-context.js +10 -6
  56. package/dist/core/context/auto-context.js.map +2 -2
  57. package/dist/core/context/context-bridge.js.map +2 -2
  58. package/dist/core/context/frame-database.js +13 -3
  59. package/dist/core/context/frame-database.js.map +2 -2
  60. package/dist/core/context/frame-digest.js +7 -5
  61. package/dist/core/context/frame-digest.js.map +2 -2
  62. package/dist/core/context/frame-manager.js.map +2 -2
  63. package/dist/core/context/frame-stack.js +16 -5
  64. package/dist/core/context/frame-stack.js.map +2 -2
  65. package/dist/core/context/incremental-gc.js +10 -3
  66. package/dist/core/context/incremental-gc.js.map +2 -2
  67. package/dist/core/context/index.js.map +1 -1
  68. package/dist/core/context/permission-manager.js.map +2 -2
  69. package/dist/core/context/recursive-context-manager.js +582 -0
  70. package/dist/core/context/recursive-context-manager.js.map +7 -0
  71. package/dist/core/context/refactored-frame-manager.js +12 -3
  72. package/dist/core/context/refactored-frame-manager.js.map +2 -2
  73. package/dist/core/context/shared-context-layer.js +4 -2
  74. package/dist/core/context/shared-context-layer.js.map +2 -2
  75. package/dist/core/database/batch-operations.js +112 -86
  76. package/dist/core/database/batch-operations.js.map +2 -2
  77. package/dist/core/database/query-cache.js +19 -9
  78. package/dist/core/database/query-cache.js.map +2 -2
  79. package/dist/core/database/sqlite-adapter.js +1 -1
  80. package/dist/core/database/sqlite-adapter.js.map +2 -2
  81. package/dist/core/digest/enhanced-hybrid-digest.js +8 -2
  82. package/dist/core/digest/enhanced-hybrid-digest.js.map +2 -2
  83. package/dist/core/errors/recovery.js +9 -2
  84. package/dist/core/errors/recovery.js.map +2 -2
  85. package/dist/core/execution/parallel-executor.js +254 -0
  86. package/dist/core/execution/parallel-executor.js.map +7 -0
  87. package/dist/core/frame/workflow-templates-stub.js.map +1 -1
  88. package/dist/core/frame/workflow-templates.js +40 -1
  89. package/dist/core/frame/workflow-templates.js.map +2 -2
  90. package/dist/core/monitoring/logger.js +6 -1
  91. package/dist/core/monitoring/logger.js.map +2 -2
  92. package/dist/core/monitoring/metrics.js.map +2 -2
  93. package/dist/core/monitoring/progress-tracker.js.map +2 -2
  94. package/dist/core/performance/context-cache.js.map +2 -2
  95. package/dist/core/performance/lazy-context-loader.js +24 -20
  96. package/dist/core/performance/lazy-context-loader.js.map +2 -2
  97. package/dist/core/performance/optimized-frame-context.js +27 -12
  98. package/dist/core/performance/optimized-frame-context.js.map +2 -2
  99. package/dist/core/performance/performance-benchmark.js +10 -6
  100. package/dist/core/performance/performance-benchmark.js.map +2 -2
  101. package/dist/core/performance/performance-profiler.js +51 -14
  102. package/dist/core/performance/performance-profiler.js.map +2 -2
  103. package/dist/core/performance/streaming-jsonl-parser.js +5 -1
  104. package/dist/core/performance/streaming-jsonl-parser.js.map +2 -2
  105. package/dist/core/projects/project-manager.js +14 -20
  106. package/dist/core/projects/project-manager.js.map +2 -2
  107. package/dist/core/retrieval/context-retriever.js.map +1 -1
  108. package/dist/core/retrieval/llm-context-retrieval.js.map +2 -2
  109. package/dist/core/session/clear-survival-stub.js +5 -1
  110. package/dist/core/session/clear-survival-stub.js.map +2 -2
  111. package/dist/core/session/clear-survival.js +35 -0
  112. package/dist/core/session/clear-survival.js.map +2 -2
  113. package/dist/core/session/index.js.map +1 -1
  114. package/dist/core/session/session-manager.js.map +2 -2
  115. package/dist/core/storage/chromadb-adapter.js +6 -2
  116. package/dist/core/storage/chromadb-adapter.js.map +2 -2
  117. package/dist/core/storage/chromadb-simple.js +17 -5
  118. package/dist/core/storage/chromadb-simple.js.map +2 -2
  119. package/dist/core/storage/infinite-storage.js +109 -46
  120. package/dist/core/storage/infinite-storage.js.map +2 -2
  121. package/dist/core/storage/railway-optimized-storage.js +48 -22
  122. package/dist/core/storage/railway-optimized-storage.js.map +2 -2
  123. package/dist/core/storage/remote-storage.js +41 -23
  124. package/dist/core/storage/remote-storage.js.map +2 -2
  125. package/dist/core/trace/cli-trace-wrapper.js +9 -2
  126. package/dist/core/trace/cli-trace-wrapper.js.map +2 -2
  127. package/dist/core/trace/db-trace-wrapper.js +96 -68
  128. package/dist/core/trace/db-trace-wrapper.js.map +2 -2
  129. package/dist/core/trace/debug-trace.js +25 -8
  130. package/dist/core/trace/debug-trace.js.map +2 -2
  131. package/dist/core/trace/index.js +6 -2
  132. package/dist/core/trace/index.js.map +2 -2
  133. package/dist/core/trace/linear-api-wrapper.js +10 -5
  134. package/dist/core/trace/linear-api-wrapper.js.map +2 -2
  135. package/dist/core/trace/trace-demo.js +14 -10
  136. package/dist/core/trace/trace-demo.js.map +2 -2
  137. package/dist/core/trace/trace-detector.js +9 -2
  138. package/dist/core/trace/trace-detector.js.map +2 -2
  139. package/dist/core/trace/types.js.map +1 -1
  140. package/dist/core/utils/compression.js.map +1 -1
  141. package/dist/core/utils/update-checker.js.map +1 -1
  142. package/dist/core/worktree/worktree-manager.js +18 -7
  143. package/dist/core/worktree/worktree-manager.js.map +2 -2
  144. package/dist/features/analytics/core/analytics-service.js.map +2 -2
  145. package/dist/features/analytics/queries/metrics-queries.js +1 -1
  146. package/dist/features/analytics/queries/metrics-queries.js.map +2 -2
  147. package/dist/features/tasks/pebbles-task-store.js.map +1 -1
  148. package/dist/features/tui/components/analytics-panel.js +36 -15
  149. package/dist/features/tui/components/analytics-panel.js.map +2 -2
  150. package/dist/features/tui/components/pr-tracker.js +19 -7
  151. package/dist/features/tui/components/pr-tracker.js.map +2 -2
  152. package/dist/features/tui/components/session-monitor.js +22 -9
  153. package/dist/features/tui/components/session-monitor.js.map +2 -2
  154. package/dist/features/tui/components/subagent-fleet.js +20 -13
  155. package/dist/features/tui/components/subagent-fleet.js.map +2 -2
  156. package/dist/features/tui/components/task-board.js +26 -10
  157. package/dist/features/tui/components/task-board.js.map +2 -2
  158. package/dist/features/tui/index.js.map +2 -2
  159. package/dist/features/tui/services/data-service.js +6 -2
  160. package/dist/features/tui/services/data-service.js.map +2 -2
  161. package/dist/features/tui/services/linear-task-reader.js +3 -1
  162. package/dist/features/tui/services/linear-task-reader.js.map +2 -2
  163. package/dist/features/tui/services/websocket-client.js +3 -1
  164. package/dist/features/tui/services/websocket-client.js.map +2 -2
  165. package/dist/features/tui/terminal-compat.js +6 -2
  166. package/dist/features/tui/terminal-compat.js.map +2 -2
  167. package/dist/features/web/client/stores/task-store.js.map +2 -2
  168. package/dist/features/web/server/index.js +18 -10
  169. package/dist/features/web/server/index.js.map +2 -2
  170. package/dist/integrations/anthropic/client.js +259 -0
  171. package/dist/integrations/anthropic/client.js.map +7 -0
  172. package/dist/integrations/claude-code/subagent-client.js +404 -0
  173. package/dist/integrations/claude-code/subagent-client.js.map +7 -0
  174. package/dist/integrations/linear/sync-service.js +12 -13
  175. package/dist/integrations/linear/sync-service.js.map +2 -2
  176. package/dist/integrations/linear/sync.js +174 -12
  177. package/dist/integrations/linear/sync.js.map +2 -2
  178. package/dist/integrations/linear/unified-sync.js +1 -1
  179. package/dist/integrations/linear/unified-sync.js.map +1 -1
  180. package/dist/integrations/linear/webhook-server.js +15 -16
  181. package/dist/integrations/linear/webhook-server.js.map +2 -2
  182. package/dist/mcp/stackmemory-mcp-server.js +0 -11
  183. package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
  184. package/dist/servers/production/auth-middleware.js.map +2 -2
  185. package/dist/servers/railway/index.js.map +2 -2
  186. package/dist/services/config-service.js +6 -7
  187. package/dist/services/config-service.js.map +2 -2
  188. package/dist/services/context-service.js +11 -12
  189. package/dist/services/context-service.js.map +2 -2
  190. package/dist/skills/claude-skills.js +101 -2
  191. package/dist/skills/claude-skills.js.map +2 -2
  192. package/dist/skills/dashboard-launcher.js.map +2 -2
  193. package/dist/skills/recursive-agent-orchestrator.js +559 -0
  194. package/dist/skills/recursive-agent-orchestrator.js.map +7 -0
  195. package/dist/skills/repo-ingestion-skill.js.map +2 -2
  196. package/dist/skills/security-secrets-scanner.js +265 -0
  197. package/dist/skills/security-secrets-scanner.js.map +7 -0
  198. package/dist/utils/env.js +46 -0
  199. package/dist/utils/env.js.map +7 -0
  200. package/dist/utils/logger.js +0 -11
  201. package/dist/utils/logger.js.map +2 -2
  202. package/package.json +1 -1
@@ -3,31 +3,18 @@ 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
7
  import { RepoIngestionSkill } from "../../skills/repo-ingestion-skill.js";
8
8
  import Table from "cli-table3";
9
9
  import dotenv from "dotenv";
10
10
  import path from "path";
11
11
  import { fileURLToPath } from "url";
12
12
  import fs from "fs";
13
- function getEnv(key, defaultValue) {
14
- const value = process.env[key];
15
- if (value === void 0) {
16
- if (defaultValue !== void 0) return defaultValue;
17
- throw new Error(`Environment variable ${key} is required`);
18
- }
19
- return value;
20
- }
21
- function getOptionalEnv(key) {
22
- return process.env[key];
23
- }
24
13
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
25
14
  dotenv.config({
26
15
  path: path.join(__dirname, "../../../.env"),
27
- override: true,
28
- silent: true
16
+ override: true
29
17
  });
30
- const logger = new Logger("ChromaDB-CLI");
31
18
  function createChromaDBCommand() {
32
19
  const chromadb = new Command("chromadb").description("Manage ChromaDB vector storage for context").alias("chroma");
33
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) => {
@@ -68,7 +55,10 @@ function createChromaDBCommand() {
68
55
  updates.push(`CHROMADB_DATABASE=${config.database}`);
69
56
  }
70
57
  if (updates.length > 0) {
71
- 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
+ );
72
62
  }
73
63
  spinner.succeed("ChromaDB initialized successfully");
74
64
  console.log(chalk.green("\n\u2705 Configuration:"));
@@ -81,10 +71,16 @@ function createChromaDBCommand() {
81
71
  } catch (error) {
82
72
  spinner.fail("Failed to initialize ChromaDB");
83
73
  logger.error("Initialization error", error);
84
- 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
+ );
85
77
  }
86
78
  });
87
- 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) => {
88
84
  const spinner = ora("Storing context...").start();
89
85
  try {
90
86
  const config = {
@@ -121,7 +117,9 @@ function createChromaDBCommand() {
121
117
  } catch (error) {
122
118
  spinner.fail("Failed to store context");
123
119
  logger.error("Store error", error);
124
- 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
+ );
125
123
  }
126
124
  });
127
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) => {
@@ -173,7 +171,9 @@ function createChromaDBCommand() {
173
171
  } catch (error) {
174
172
  spinner.fail("Failed to query contexts");
175
173
  logger.error("Query error", error);
176
- 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
+ );
177
177
  }
178
178
  });
179
179
  chromadb.command("recent").description("Get recent contexts").option("--limit <n>", "Number of results", "20").option("--type <type>", "Filter by type").action(async (options) => {
@@ -213,12 +213,16 @@ function createChromaDBCommand() {
213
213
  ]);
214
214
  }
215
215
  console.log(table.toString());
216
- console.log(chalk.green(`
217
- \u2705 Found ${results.length} recent contexts`));
216
+ console.log(
217
+ chalk.green(`
218
+ \u2705 Found ${results.length} recent contexts`)
219
+ );
218
220
  } catch (error) {
219
221
  spinner.fail("Failed to get recent contexts");
220
222
  logger.error("Recent error", error);
221
- 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
+ );
222
226
  }
223
227
  });
224
228
  chromadb.command("stats").description("Get ChromaDB storage statistics").action(async () => {
@@ -248,7 +252,9 @@ function createChromaDBCommand() {
248
252
  } catch (error) {
249
253
  spinner.fail("Failed to get statistics");
250
254
  logger.error("Stats error", error);
251
- 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
+ );
252
258
  }
253
259
  });
254
260
  chromadb.command("clean").description("Clean old contexts").option("--days <n>", "Delete contexts older than N days", "30").action(async (options) => {
@@ -268,7 +274,9 @@ function createChromaDBCommand() {
268
274
  } catch (error) {
269
275
  spinner.fail("Failed to clean contexts");
270
276
  logger.error("Clean error", error);
271
- 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
+ );
272
280
  }
273
281
  });
274
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) => {
@@ -304,8 +312,12 @@ function createChromaDBCommand() {
304
312
  console.log(chalk.green("\n\u{1F4CA} Ingestion Statistics:"));
305
313
  console.log(` Files processed: ${result.stats.filesProcessed}`);
306
314
  console.log(` Chunks created: ${result.stats.chunksCreated}`);
307
- console.log(` Total size: ${(result.stats.totalSize / 1024 / 1024).toFixed(2)} MB`);
308
- console.log(` Time elapsed: ${(result.stats.timeElapsed / 1e3).toFixed(2)} seconds`);
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
+ );
309
321
  }
310
322
  } else {
311
323
  spinner.fail(result.message);
@@ -313,7 +325,9 @@ function createChromaDBCommand() {
313
325
  } catch (error) {
314
326
  spinner.fail("Failed to ingest repository");
315
327
  logger.error("Ingestion error", error);
316
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
328
+ console.error(
329
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
330
+ );
317
331
  }
318
332
  });
319
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) => {
@@ -345,7 +359,9 @@ function createChromaDBCommand() {
345
359
  console.log(` Files updated: ${result.stats.filesUpdated}`);
346
360
  console.log(` Files added: ${result.stats.filesAdded}`);
347
361
  console.log(` Files removed: ${result.stats.filesRemoved}`);
348
- console.log(` Time elapsed: ${(result.stats.timeElapsed / 1e3).toFixed(2)} seconds`);
362
+ console.log(
363
+ ` Time elapsed: ${(result.stats.timeElapsed / 1e3).toFixed(2)} seconds`
364
+ );
349
365
  }
350
366
  } else {
351
367
  spinner.fail(result.message);
@@ -353,7 +369,9 @@ function createChromaDBCommand() {
353
369
  } catch (error) {
354
370
  spinner.fail("Failed to update repository");
355
371
  logger.error("Update error", error);
356
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
372
+ console.error(
373
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
374
+ );
357
375
  }
358
376
  });
359
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) => {
@@ -389,17 +407,27 @@ function createChromaDBCommand() {
389
407
  `));
390
408
  for (const result of results) {
391
409
  console.log(chalk.green(`\u{1F4C1} ${result.repoName}/${result.filePath}`));
392
- console.log(chalk.gray(` Lines ${result.startLine}-${result.endLine} | Score: ${result.score.toFixed(3)}`));
410
+ console.log(
411
+ chalk.gray(
412
+ ` Lines ${result.startLine}-${result.endLine} | Score: ${result.score.toFixed(3)}`
413
+ )
414
+ );
393
415
  const lines = result.content.split("\n").slice(0, 3);
394
416
  lines.forEach((line) => {
395
- console.log(chalk.dim(` ${line.slice(0, 80)}${line.length > 80 ? "..." : ""}`));
417
+ console.log(
418
+ chalk.dim(
419
+ ` ${line.slice(0, 80)}${line.length > 80 ? "..." : ""}`
420
+ )
421
+ );
396
422
  });
397
423
  console.log();
398
424
  }
399
425
  } catch (error) {
400
426
  spinner.fail("Failed to search code");
401
427
  logger.error("Search error", error);
402
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
428
+ console.error(
429
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
430
+ );
403
431
  }
404
432
  });
405
433
  chromadb.command("repo-stats [name]").description("Get statistics for ingested repositories").action(async (name) => {
@@ -441,7 +469,9 @@ function createChromaDBCommand() {
441
469
  } catch (error) {
442
470
  spinner.fail("Failed to get repository statistics");
443
471
  logger.error("Stats error", error);
444
- console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
472
+ console.error(
473
+ chalk.red(error instanceof Error ? error.message : "Unknown error")
474
+ );
445
475
  }
446
476
  });
447
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 { 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// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\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: unknown) {\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: unknown) {\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: unknown) {\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: unknown) {\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: unknown) {\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: unknown) {\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 // 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 ? parseInt(options.maxFileSize) : undefined,\n chunkSize: options.chunkSize ? parseInt(options.chunkSize) : 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(` Total size: ${(result.stats.totalSize / 1024 / 1024).toFixed(2)} MB`);\n console.log(` Time elapsed: ${(result.stats.timeElapsed / 1000).toFixed(2)} seconds`);\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(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\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(` Time elapsed: ${(result.stats.timeElapsed / 1000).toFixed(2)} seconds`);\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(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\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(chalk.gray(` Lines ${result.startLine}-${result.endLine} | Score: ${result.score.toFixed(3)}`));\n \n // Show snippet\n const lines = result.content.split('\\n').slice(0, 3);\n lines.forEach(line => {\n console.log(chalk.dim(` ${line.slice(0, 80)}${line.length > 80 ? '...' : ''}`));\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(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\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(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,20 +6,9 @@ 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
- function getEnv(key, defaultValue) {
13
- const value = process.env[key];
14
- if (value === void 0) {
15
- if (defaultValue !== void 0) return defaultValue;
16
- throw new Error(`Environment variable ${key} is required`);
17
- }
18
- return value;
19
- }
20
- function getOptionalEnv(key) {
21
- return process.env[key];
22
- }
23
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) => {
24
13
  const spinner = ora();
25
14
  try {
@@ -42,8 +31,13 @@ const clearCommand = new Command("clear").description("Manage context clearing w
42
31
  generateHandoff: () => Promise.resolve("Mock handoff"),
43
32
  getHandoffPath: () => "mock.md"
44
33
  };
34
+ const dbManager = {
35
+ getCurrentSessionId: () => Promise.resolve(session.id),
36
+ getSession: () => Promise.resolve(session)
37
+ };
45
38
  const clearSurvival = new ClearSurvival(
46
39
  frameManager,
40
+ dbManager,
47
41
  handoffGenerator,
48
42
  projectRoot
49
43
  );
@@ -116,7 +110,9 @@ async function saveLedger(clearSurvival, spinner) {
116
110
  console.log("\nSaved:");
117
111
  console.log(` \u2022 ${ledger.activeFrames.length} active frames`);
118
112
  console.log(` \u2022 ${ledger.decisions.length} key decisions`);
119
- console.log(` \u2022 ${ledger.context.importantTasks?.length || 0} important tasks`);
113
+ console.log(
114
+ ` \u2022 ${ledger.context.importantTasks?.length || 0} important tasks`
115
+ );
120
116
  }
121
117
  async function restoreFromLedger(clearSurvival, spinner) {
122
118
  spinner.start("Restoring from continuity ledger...");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/commands/clear.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * Clear command for StackMemory\n * Manages context clearing with ledger preservation\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport Database from 'better-sqlite3';\nimport { existsSync } from 'fs';\nimport { ClearSurvival } from '../../core/session/clear-survival-stub.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { HandoffGenerator } from '../../core/session/handoff-generator.js';\nimport { sessionManager } from '../../core/session/session-manager.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\n\nconst clearCommand = new Command('clear')\n .description('Manage context clearing with ledger preservation')\n .option('--save', 'Save continuity ledger before clearing')\n .option('--restore', 'Restore from continuity ledger')\n .option('--check', 'Check if clear is recommended')\n .option('--auto', 'Automatically save if needed and clear')\n .option('--status', 'Show current context usage')\n .option('--show-ledger', 'Display current ledger')\n .action(async (options) => {\n const spinner = ora();\n\n try {\n // Initialize managers\n const projectRoot = process.cwd();\n const dbPath = path.join(projectRoot, '.stackmemory', 'context.db');\n\n // Check if StackMemory is initialized\n if (!existsSync(dbPath)) {\n console.error(\n chalk.red('\u2717 StackMemory not initialized in this directory')\n );\n console.log(chalk.yellow('Run: stackmemory init'));\n process.exit(1);\n }\n\n const db = new Database(dbPath);\n \n // Initialize session manager\n await sessionManager.initialize();\n const session = await sessionManager.getOrCreateSession({\n projectPath: projectRoot,\n });\n\n const frameManager = new FrameManager(db, session.projectId);\n // For testing - use a mock handoff generator\n const handoffGenerator = {\n generateHandoff: () => Promise.resolve('Mock handoff'),\n getHandoffPath: () => 'mock.md'\n };\n const clearSurvival = new ClearSurvival(\n frameManager,\n handoffGenerator,\n projectRoot\n );\n\n // Handle different options\n if (options.status) {\n await showContextStatus(clearSurvival);\n } else if (options.check) {\n await checkIfClearRecommended(clearSurvival);\n } else if (options.save) {\n await saveLedger(clearSurvival, spinner);\n } else if (options.restore) {\n await restoreFromLedger(clearSurvival, spinner);\n } else if (options.showLedger) {\n await showLedger(projectRoot);\n } else if (options.auto) {\n await autoClear(clearSurvival, spinner);\n } else {\n // Default: Show status and options\n await showContextStatus(clearSurvival);\n console.log('\\nOptions:');\n console.log(' --status Show current context usage');\n console.log(' --check Check if clear is recommended');\n console.log(' --save Save continuity ledger');\n console.log(' --restore Restore from ledger');\n console.log(' --auto Auto-save if needed and clear');\n }\n } catch (error: unknown) {\n // Don't exit in tests - just log the error\n console.error(chalk.red('Error: ' + (error as Error).message));\n if (process.env['NODE_ENV'] !== 'test') {\n process.exit(1);\n }\n }\n });\n\nasync function showContextStatus(clearSurvival: ClearSurvival): Promise<void> {\n const usage = await clearSurvival.getContextUsage();\n const status = clearSurvival.assessContextStatus(usage);\n\n console.log(chalk.bold('\\n\uD83D\uDCCA Context Usage Status'));\n console.log('\u2500'.repeat(40));\n \n const percentage = Math.round(usage.percentageUsed);\n const statusColor = getStatusColor(status);\n \n console.log(`Usage: ${percentage}% ${getProgressBar(percentage)}`);\n console.log(`Status: ${statusColor}`);\n console.log(`Active Frames: ${usage.activeFrames}`);\n console.log(`Total Frames: ${usage.totalFrames}`);\n console.log(`Sessions: ${usage.sessionCount}`);\n \n if (status === 'critical' || status === 'saved') {\n console.log(\n chalk.yellow('\\n\u26A0\uFE0F Consider clearing context to improve performance')\n );\n console.log(chalk.cyan('Run: stackmemory clear --save'));\n }\n}\n\nasync function checkIfClearRecommended(clearSurvival: ClearSurvival): Promise<void> {\n const usage = await clearSurvival.getContextUsage();\n const status = clearSurvival.assessContextStatus(usage);\n \n if (status === 'critical' || status === 'saved') {\n console.log(chalk.yellow('\u2713 Clear recommended'));\n console.log(`Context usage: ${Math.round(usage.percentageUsed)}%`);\n process.exit(0);\n } else {\n console.log(chalk.green('\u2717 Clear not needed'));\n console.log(`Context usage: ${Math.round(usage.percentageUsed)}%`);\n process.exit(1);\n }\n}\n\nasync function saveLedger(clearSurvival: ClearSurvival, spinner: ora.Ora): Promise<void> {\n spinner.start('Saving continuity ledger...');\n \n const ledgerPath = await clearSurvival.saveContinuityLedger();\n \n spinner.succeed(chalk.green('Continuity ledger saved'));\n console.log(chalk.cyan(`Location: ${ledgerPath}`));\n \n // Show what was saved\n const ledger = JSON.parse(await fs.readFile(ledgerPath, 'utf-8'));\n console.log('\\nSaved:');\n console.log(` \u2022 ${ledger.activeFrames.length} active frames`);\n console.log(` \u2022 ${ledger.decisions.length} key decisions`);\n console.log(` \u2022 ${ledger.context.importantTasks?.length || 0} important tasks`);\n}\n\nasync function restoreFromLedger(clearSurvival: ClearSurvival, spinner: ora.Ora): Promise<void> {\n spinner.start('Restoring from continuity ledger...');\n \n const result = await clearSurvival.restoreFromLedger();\n \n if (result.success) {\n spinner.succeed(chalk.green('Context restored from ledger'));\n console.log('\\nRestored:');\n console.log(` \u2022 ${result.restoredFrames} frames`);\n console.log(` \u2022 ${result.restoredDecisions} decisions`);\n } else {\n spinner.fail(chalk.red('Failed to restore from ledger'));\n console.log(chalk.yellow(result.message));\n }\n}\n\nasync function showLedger(projectRoot: string): Promise<void> {\n const ledgerPath = path.join(projectRoot, '.stackmemory', 'continuity.json');\n \n if (!existsSync(ledgerPath)) {\n console.log(chalk.yellow('No continuity ledger found'));\n return;\n }\n \n const ledger = JSON.parse(await fs.readFile(ledgerPath, 'utf-8'));\n \n console.log(chalk.bold('\\n\uD83D\uDCD6 Continuity Ledger'));\n console.log('\u2500'.repeat(40));\n console.log(`Created: ${new Date(ledger.timestamp).toLocaleString()}`);\n console.log(`Active Frames: ${ledger.activeFrames.length}`);\n console.log(`Key Decisions: ${ledger.decisions.length}`);\n \n if (ledger.activeFrames.length > 0) {\n console.log('\\nActive Work:');\n ledger.activeFrames.slice(0, 5).forEach((frame: any) => {\n console.log(` \u2022 ${frame.name} (${frame.type})`);\n });\n }\n \n if (ledger.decisions.length > 0) {\n console.log('\\nKey Decisions:');\n ledger.decisions.slice(0, 3).forEach((decision: any) => {\n console.log(` \u2022 ${decision.decision}`);\n });\n }\n}\n\nasync function autoClear(clearSurvival: ClearSurvival, spinner: ora.Ora): Promise<void> {\n const usage = await clearSurvival.getContextUsage();\n const status = clearSurvival.assessContextStatus(usage);\n \n if (status === 'critical' || status === 'saved') {\n spinner.start('Auto-saving ledger before clear...');\n await clearSurvival.saveContinuityLedger();\n spinner.succeed('Ledger saved');\n \n spinner.start('Clearing context...');\n // Note: Actual clear implementation would go here\n // For now, just simulate\n await new Promise(resolve => setTimeout(resolve, 1000));\n spinner.succeed('Context cleared successfully');\n } else {\n console.log(chalk.green('Context usage is healthy, no clear needed'));\n }\n}\n\nfunction getProgressBar(percentage: number): string {\n const filled = Math.round(percentage / 5);\n const empty = 20 - filled;\n \n let bar = '[';\n bar += chalk.green('\u25A0').repeat(Math.min(filled, 10));\n bar += chalk.yellow('\u25A0').repeat(Math.max(0, Math.min(filled - 10, 5)));\n bar += chalk.red('\u25A0').repeat(Math.max(0, filled - 15));\n bar += chalk.gray('\u25A1').repeat(empty);\n bar += ']';\n \n return bar;\n}\n\nfunction getStatusColor(status: string): string {\n switch (status) {\n case 'healthy':\n return chalk.green('\u2713 Healthy (<50%)');\n case 'moderate':\n return chalk.blue('\u26A1 Moderate (50-70%)');\n case 'critical':\n return chalk.yellow('\u26A0\uFE0F Critical (70-85%)');\n case 'saved':\n return chalk.red('\uD83D\uDCBE Auto-saved (>85%)');\n default:\n return status;\n }\n}\n\n// Export for use in main CLI\nexport default clearCommand;"],
5
- "mappings": ";AAMA,SAAS,eAAe;AACxB,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,OAAO,cAAc;AACrB,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAE7B,SAAS,sBAAsB;AAE/B,SAAS,OAAO,KAAa,cAA+B;AAC1D,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,UAAU,QAAW;AACvB,QAAI,iBAAiB,OAAW,QAAO;AACvC,UAAM,IAAI,MAAM,wBAAwB,GAAG,cAAc;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAiC;AACvD,SAAO,QAAQ,IAAI,GAAG;AACxB;AAGA,MAAM,eAAe,IAAI,QAAQ,OAAO,EACrC,YAAY,kDAAkD,EAC9D,OAAO,UAAU,wCAAwC,EACzD,OAAO,aAAa,gCAAgC,EACpD,OAAO,WAAW,+BAA+B,EACjD,OAAO,UAAU,wCAAwC,EACzD,OAAO,YAAY,4BAA4B,EAC/C,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,OAAO,YAAY;AACzB,QAAM,UAAU,IAAI;AAEpB,MAAI;AAEF,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,SAAS,KAAK,KAAK,aAAa,gBAAgB,YAAY;AAGlE,QAAI,CAAC,WAAW,MAAM,GAAG;AACvB,cAAQ;AAAA,QACN,MAAM,IAAI,sDAAiD;AAAA,MAC7D;AACA,cAAQ,IAAI,MAAM,OAAO,uBAAuB,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,KAAK,IAAI,SAAS,MAAM;AAG9B,UAAM,eAAe,WAAW;AAChC,UAAM,UAAU,MAAM,eAAe,mBAAmB;AAAA,MACtD,aAAa;AAAA,IACf,CAAC;AAED,UAAM,eAAe,IAAI,aAAa,IAAI,QAAQ,SAAS;AAE3D,UAAM,mBAAmB;AAAA,MACvB,iBAAiB,MAAM,QAAQ,QAAQ,cAAc;AAAA,MACrD,gBAAgB,MAAM;AAAA,IACxB;AACA,UAAM,gBAAgB,IAAI;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ;AAClB,YAAM,kBAAkB,aAAa;AAAA,IACvC,WAAW,QAAQ,OAAO;AACxB,YAAM,wBAAwB,aAAa;AAAA,IAC7C,WAAW,QAAQ,MAAM;AACvB,YAAM,WAAW,eAAe,OAAO;AAAA,IACzC,WAAW,QAAQ,SAAS;AAC1B,YAAM,kBAAkB,eAAe,OAAO;AAAA,IAChD,WAAW,QAAQ,YAAY;AAC7B,YAAM,WAAW,WAAW;AAAA,IAC9B,WAAW,QAAQ,MAAM;AACvB,YAAM,UAAU,eAAe,OAAO;AAAA,IACxC,OAAO;AAEL,YAAM,kBAAkB,aAAa;AACrC,cAAQ,IAAI,YAAY;AACxB,cAAQ,IAAI,2CAA2C;AACvD,cAAQ,IAAI,8CAA8C;AAC1D,cAAQ,IAAI,uCAAuC;AACnD,cAAQ,IAAI,oCAAoC;AAChD,cAAQ,IAAI,8CAA8C;AAAA,IAC5D;AAAA,EACF,SAAS,OAAgB;AAEvB,YAAQ,MAAM,MAAM,IAAI,YAAa,MAAgB,OAAO,CAAC;AAC7D,QAAI,QAAQ,IAAI,UAAU,MAAM,QAAQ;AACtC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;AAEH,eAAe,kBAAkB,eAA6C;AAC5E,QAAM,QAAQ,MAAM,cAAc,gBAAgB;AAClD,QAAM,SAAS,cAAc,oBAAoB,KAAK;AAEtD,UAAQ,IAAI,MAAM,KAAK,kCAA2B,CAAC;AACnD,UAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAE1B,QAAM,aAAa,KAAK,MAAM,MAAM,cAAc;AAClD,QAAM,cAAc,eAAe,MAAM;AAEzC,UAAQ,IAAI,UAAU,UAAU,KAAK,eAAe,UAAU,CAAC,EAAE;AACjE,UAAQ,IAAI,WAAW,WAAW,EAAE;AACpC,UAAQ,IAAI,kBAAkB,MAAM,YAAY,EAAE;AAClD,UAAQ,IAAI,iBAAiB,MAAM,WAAW,EAAE;AAChD,UAAQ,IAAI,aAAa,MAAM,YAAY,EAAE;AAE7C,MAAI,WAAW,cAAc,WAAW,SAAS;AAC/C,YAAQ;AAAA,MACN,MAAM,OAAO,kEAAwD;AAAA,IACvE;AACA,YAAQ,IAAI,MAAM,KAAK,+BAA+B,CAAC;AAAA,EACzD;AACF;AAEA,eAAe,wBAAwB,eAA6C;AAClF,QAAM,QAAQ,MAAM,cAAc,gBAAgB;AAClD,QAAM,SAAS,cAAc,oBAAoB,KAAK;AAEtD,MAAI,WAAW,cAAc,WAAW,SAAS;AAC/C,YAAQ,IAAI,MAAM,OAAO,0BAAqB,CAAC;AAC/C,YAAQ,IAAI,kBAAkB,KAAK,MAAM,MAAM,cAAc,CAAC,GAAG;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB,OAAO;AACL,YAAQ,IAAI,MAAM,MAAM,yBAAoB,CAAC;AAC7C,YAAQ,IAAI,kBAAkB,KAAK,MAAM,MAAM,cAAc,CAAC,GAAG;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,WAAW,eAA8B,SAAiC;AACvF,UAAQ,MAAM,6BAA6B;AAE3C,QAAM,aAAa,MAAM,cAAc,qBAAqB;AAE5D,UAAQ,QAAQ,MAAM,MAAM,yBAAyB,CAAC;AACtD,UAAQ,IAAI,MAAM,KAAK,aAAa,UAAU,EAAE,CAAC;AAGjD,QAAM,SAAS,KAAK,MAAM,MAAM,GAAG,SAAS,YAAY,OAAO,CAAC;AAChE,UAAQ,IAAI,UAAU;AACtB,UAAQ,IAAI,YAAO,OAAO,aAAa,MAAM,gBAAgB;AAC7D,UAAQ,IAAI,YAAO,OAAO,UAAU,MAAM,gBAAgB;AAC1D,UAAQ,IAAI,YAAO,OAAO,QAAQ,gBAAgB,UAAU,CAAC,kBAAkB;AACjF;AAEA,eAAe,kBAAkB,eAA8B,SAAiC;AAC9F,UAAQ,MAAM,qCAAqC;AAEnD,QAAM,SAAS,MAAM,cAAc,kBAAkB;AAErD,MAAI,OAAO,SAAS;AAClB,YAAQ,QAAQ,MAAM,MAAM,8BAA8B,CAAC;AAC3D,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,YAAO,OAAO,cAAc,SAAS;AACjD,YAAQ,IAAI,YAAO,OAAO,iBAAiB,YAAY;AAAA,EACzD,OAAO;AACL,YAAQ,KAAK,MAAM,IAAI,+BAA+B,CAAC;AACvD,YAAQ,IAAI,MAAM,OAAO,OAAO,OAAO,CAAC;AAAA,EAC1C;AACF;AAEA,eAAe,WAAW,aAAoC;AAC5D,QAAM,aAAa,KAAK,KAAK,aAAa,gBAAgB,iBAAiB;AAE3E,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,YAAQ,IAAI,MAAM,OAAO,4BAA4B,CAAC;AACtD;AAAA,EACF;AAEA,QAAM,SAAS,KAAK,MAAM,MAAM,GAAG,SAAS,YAAY,OAAO,CAAC;AAEhE,UAAQ,IAAI,MAAM,KAAK,+BAAwB,CAAC;AAChD,UAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,UAAQ,IAAI,YAAY,IAAI,KAAK,OAAO,SAAS,EAAE,eAAe,CAAC,EAAE;AACrE,UAAQ,IAAI,kBAAkB,OAAO,aAAa,MAAM,EAAE;AAC1D,UAAQ,IAAI,kBAAkB,OAAO,UAAU,MAAM,EAAE;AAEvD,MAAI,OAAO,aAAa,SAAS,GAAG;AAClC,YAAQ,IAAI,gBAAgB;AAC5B,WAAO,aAAa,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,UAAe;AACtD,cAAQ,IAAI,YAAO,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG;AAAA,IACjD,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,YAAQ,IAAI,kBAAkB;AAC9B,WAAO,UAAU,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,aAAkB;AACtD,cAAQ,IAAI,YAAO,SAAS,QAAQ,EAAE;AAAA,IACxC,CAAC;AAAA,EACH;AACF;AAEA,eAAe,UAAU,eAA8B,SAAiC;AACtF,QAAM,QAAQ,MAAM,cAAc,gBAAgB;AAClD,QAAM,SAAS,cAAc,oBAAoB,KAAK;AAEtD,MAAI,WAAW,cAAc,WAAW,SAAS;AAC/C,YAAQ,MAAM,oCAAoC;AAClD,UAAM,cAAc,qBAAqB;AACzC,YAAQ,QAAQ,cAAc;AAE9B,YAAQ,MAAM,qBAAqB;AAGnC,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAI,CAAC;AACtD,YAAQ,QAAQ,8BAA8B;AAAA,EAChD,OAAO;AACL,YAAQ,IAAI,MAAM,MAAM,2CAA2C,CAAC;AAAA,EACtE;AACF;AAEA,SAAS,eAAe,YAA4B;AAClD,QAAM,SAAS,KAAK,MAAM,aAAa,CAAC;AACxC,QAAM,QAAQ,KAAK;AAEnB,MAAI,MAAM;AACV,SAAO,MAAM,MAAM,QAAG,EAAE,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;AACnD,SAAO,MAAM,OAAO,QAAG,EAAE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AACrE,SAAO,MAAM,IAAI,QAAG,EAAE,OAAO,KAAK,IAAI,GAAG,SAAS,EAAE,CAAC;AACrD,SAAO,MAAM,KAAK,QAAG,EAAE,OAAO,KAAK;AACnC,SAAO;AAEP,SAAO;AACT;AAEA,SAAS,eAAe,QAAwB;AAC9C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,MAAM,MAAM,uBAAkB;AAAA,IACvC,KAAK;AACH,aAAO,MAAM,KAAK,0BAAqB;AAAA,IACzC,KAAK;AACH,aAAO,MAAM,OAAO,gCAAsB;AAAA,IAC5C,KAAK;AACH,aAAO,MAAM,IAAI,6BAAsB;AAAA,IACzC;AACE,aAAO;AAAA,EACX;AACF;AAGA,IAAO,gBAAQ;",
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * Clear command for StackMemory\n * Manages context clearing with ledger preservation\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport Database from 'better-sqlite3';\nimport { existsSync } from 'fs';\nimport { ClearSurvival } from '../../core/session/clear-survival.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { HandoffGenerator } from '../../core/session/handoff-generator.js';\nimport { sessionManager } from '../../core/session/session-manager.js';\nimport { getEnv, getOptionalEnv } from '../../utils/env.js';\n\nconst clearCommand = new Command('clear')\n .description('Manage context clearing with ledger preservation')\n .option('--save', 'Save continuity ledger before clearing')\n .option('--restore', 'Restore from continuity ledger')\n .option('--check', 'Check if clear is recommended')\n .option('--auto', 'Automatically save if needed and clear')\n .option('--status', 'Show current context usage')\n .option('--show-ledger', 'Display current ledger')\n .action(async (options) => {\n const spinner = ora();\n\n try {\n // Initialize managers\n const projectRoot = process.cwd();\n const dbPath = path.join(projectRoot, '.stackmemory', 'context.db');\n\n // Check if StackMemory is initialized\n if (!existsSync(dbPath)) {\n console.error(\n chalk.red('\u2717 StackMemory not initialized in this directory')\n );\n console.log(chalk.yellow('Run: stackmemory init'));\n process.exit(1);\n }\n\n const db = new Database(dbPath);\n\n // Initialize session manager\n await sessionManager.initialize();\n const session = await sessionManager.getOrCreateSession({\n projectPath: projectRoot,\n });\n\n const frameManager = new FrameManager(db, session.projectId);\n // For testing - use a mock handoff generator\n const handoffGenerator = {\n generateHandoff: () => Promise.resolve('Mock handoff'),\n getHandoffPath: () => 'mock.md',\n };\n // Create a mock DatabaseManager for ClearSurvival\n const dbManager = {\n getCurrentSessionId: () => Promise.resolve(session.id),\n getSession: () => Promise.resolve(session),\n } as any;\n const clearSurvival = new ClearSurvival(\n frameManager,\n dbManager,\n handoffGenerator as any,\n projectRoot\n );\n\n // Handle different options\n if (options.status) {\n await showContextStatus(clearSurvival);\n } else if (options.check) {\n await checkIfClearRecommended(clearSurvival);\n } else if (options.save) {\n await saveLedger(clearSurvival, spinner);\n } else if (options.restore) {\n await restoreFromLedger(clearSurvival, spinner);\n } else if (options.showLedger) {\n await showLedger(projectRoot);\n } else if (options.auto) {\n await autoClear(clearSurvival, spinner);\n } else {\n // Default: Show status and options\n await showContextStatus(clearSurvival);\n console.log('\\nOptions:');\n console.log(' --status Show current context usage');\n console.log(' --check Check if clear is recommended');\n console.log(' --save Save continuity ledger');\n console.log(' --restore Restore from ledger');\n console.log(' --auto Auto-save if needed and clear');\n }\n } catch (error: unknown) {\n // Don't exit in tests - just log the error\n console.error(chalk.red('Error: ' + (error as Error).message));\n if (process.env['NODE_ENV'] !== 'test') {\n process.exit(1);\n }\n }\n });\n\nasync function showContextStatus(clearSurvival: ClearSurvival): Promise<void> {\n const usage = await clearSurvival.getContextUsage();\n const status = clearSurvival.assessContextStatus(usage);\n\n console.log(chalk.bold('\\n\uD83D\uDCCA Context Usage Status'));\n console.log('\u2500'.repeat(40));\n\n const percentage = Math.round(usage.percentageUsed);\n const statusColor = getStatusColor(status);\n\n console.log(`Usage: ${percentage}% ${getProgressBar(percentage)}`);\n console.log(`Status: ${statusColor}`);\n console.log(`Active Frames: ${usage.activeFrames}`);\n console.log(`Total Frames: ${usage.totalFrames}`);\n console.log(`Sessions: ${usage.sessionCount}`);\n\n if (status === 'critical' || status === 'saved') {\n console.log(\n chalk.yellow('\\n\u26A0\uFE0F Consider clearing context to improve performance')\n );\n console.log(chalk.cyan('Run: stackmemory clear --save'));\n }\n}\n\nasync function checkIfClearRecommended(\n clearSurvival: ClearSurvival\n): Promise<void> {\n const usage = await clearSurvival.getContextUsage();\n const status = clearSurvival.assessContextStatus(usage);\n\n if (status === 'critical' || status === 'saved') {\n console.log(chalk.yellow('\u2713 Clear recommended'));\n console.log(`Context usage: ${Math.round(usage.percentageUsed)}%`);\n process.exit(0);\n } else {\n console.log(chalk.green('\u2717 Clear not needed'));\n console.log(`Context usage: ${Math.round(usage.percentageUsed)}%`);\n process.exit(1);\n }\n}\n\nasync function saveLedger(\n clearSurvival: ClearSurvival,\n spinner: ora.Ora\n): Promise<void> {\n spinner.start('Saving continuity ledger...');\n\n const ledgerPath = await clearSurvival.saveContinuityLedger();\n\n spinner.succeed(chalk.green('Continuity ledger saved'));\n console.log(chalk.cyan(`Location: ${ledgerPath}`));\n\n // Show what was saved\n const ledger = JSON.parse(await fs.readFile(ledgerPath, 'utf-8'));\n console.log('\\nSaved:');\n console.log(` \u2022 ${ledger.activeFrames.length} active frames`);\n console.log(` \u2022 ${ledger.decisions.length} key decisions`);\n console.log(\n ` \u2022 ${ledger.context.importantTasks?.length || 0} important tasks`\n );\n}\n\nasync function restoreFromLedger(\n clearSurvival: ClearSurvival,\n spinner: ora.Ora\n): Promise<void> {\n spinner.start('Restoring from continuity ledger...');\n\n const result = await clearSurvival.restoreFromLedger();\n\n if (result.success) {\n spinner.succeed(chalk.green('Context restored from ledger'));\n console.log('\\nRestored:');\n console.log(` \u2022 ${result.restoredFrames} frames`);\n console.log(` \u2022 ${result.restoredDecisions} decisions`);\n } else {\n spinner.fail(chalk.red('Failed to restore from ledger'));\n console.log(chalk.yellow(result.message));\n }\n}\n\nasync function showLedger(projectRoot: string): Promise<void> {\n const ledgerPath = path.join(projectRoot, '.stackmemory', 'continuity.json');\n\n if (!existsSync(ledgerPath)) {\n console.log(chalk.yellow('No continuity ledger found'));\n return;\n }\n\n const ledger = JSON.parse(await fs.readFile(ledgerPath, 'utf-8'));\n\n console.log(chalk.bold('\\n\uD83D\uDCD6 Continuity Ledger'));\n console.log('\u2500'.repeat(40));\n console.log(`Created: ${new Date(ledger.timestamp).toLocaleString()}`);\n console.log(`Active Frames: ${ledger.activeFrames.length}`);\n console.log(`Key Decisions: ${ledger.decisions.length}`);\n\n if (ledger.activeFrames.length > 0) {\n console.log('\\nActive Work:');\n ledger.activeFrames.slice(0, 5).forEach((frame: any) => {\n console.log(` \u2022 ${frame.name} (${frame.type})`);\n });\n }\n\n if (ledger.decisions.length > 0) {\n console.log('\\nKey Decisions:');\n ledger.decisions.slice(0, 3).forEach((decision: any) => {\n console.log(` \u2022 ${decision.decision}`);\n });\n }\n}\n\nasync function autoClear(\n clearSurvival: ClearSurvival,\n spinner: ora.Ora\n): Promise<void> {\n const usage = await clearSurvival.getContextUsage();\n const status = clearSurvival.assessContextStatus(usage);\n\n if (status === 'critical' || status === 'saved') {\n spinner.start('Auto-saving ledger before clear...');\n await clearSurvival.saveContinuityLedger();\n spinner.succeed('Ledger saved');\n\n spinner.start('Clearing context...');\n // Note: Actual clear implementation would go here\n // For now, just simulate\n await new Promise((resolve) => setTimeout(resolve, 1000));\n spinner.succeed('Context cleared successfully');\n } else {\n console.log(chalk.green('Context usage is healthy, no clear needed'));\n }\n}\n\nfunction getProgressBar(percentage: number): string {\n const filled = Math.round(percentage / 5);\n const empty = 20 - filled;\n\n let bar = '[';\n bar += chalk.green('\u25A0').repeat(Math.min(filled, 10));\n bar += chalk.yellow('\u25A0').repeat(Math.max(0, Math.min(filled - 10, 5)));\n bar += chalk.red('\u25A0').repeat(Math.max(0, filled - 15));\n bar += chalk.gray('\u25A1').repeat(empty);\n bar += ']';\n\n return bar;\n}\n\nfunction getStatusColor(status: string): string {\n switch (status) {\n case 'healthy':\n return chalk.green('\u2713 Healthy (<50%)');\n case 'moderate':\n return chalk.blue('\u26A1 Moderate (50-70%)');\n case 'critical':\n return chalk.yellow('\u26A0\uFE0F Critical (70-85%)');\n case 'saved':\n return chalk.red('\uD83D\uDCBE Auto-saved (>85%)');\n default:\n return status;\n }\n}\n\n// Export for use in main CLI\nexport default clearCommand;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }