@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
@@ -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\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) {\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": "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",
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
  }
@@ -195,18 +195,7 @@ function createConfigCommand() {
195
195
  }
196
196
  console.log(` Importance: ${color(level)}`);
197
197
  });
198
- config.command("create-profile <name>").description("Create a custom configuration profile").option(
199
- "-d, --description <text>",
200
- "Profile description"
201
- ).option(
202
- "-b, --base-weight <number>",
203
- "Base weight (0-1)",
204
- parseFloat
205
- ).option(
206
- "-i, --impact-weight <number>",
207
- "Impact weight (0-1)",
208
- parseFloat
209
- ).option(
198
+ config.command("create-profile <name>").description("Create a custom configuration profile").option("-d, --description <text>", "Profile description").option("-b, --base-weight <number>", "Base weight (0-1)", parseFloat).option("-i, --impact-weight <number>", "Impact weight (0-1)", parseFloat).option(
210
199
  "-p, --persistence-weight <number>",
211
200
  "Persistence weight (0-1)",
212
201
  parseFloat
@@ -214,15 +203,14 @@ function createConfigCommand() {
214
203
  "-r, --reference-weight <number>",
215
204
  "Reference weight (0-1)",
216
205
  parseFloat
217
- ).option(
218
- "--copy-from <profile>",
219
- "Copy settings from existing profile"
220
- ).action(async (name, options) => {
206
+ ).option("--copy-from <profile>", "Copy settings from existing profile").action(async (name, options) => {
221
207
  const manager = new ConfigManager();
222
208
  const config2 = manager.getConfig();
223
209
  if (config2.profiles && config2.profiles[name]) {
224
210
  console.log(
225
- chalk.yellow(`\u26A0 Profile '${name}' already exists. Use 'edit-profile' to modify it.`)
211
+ chalk.yellow(
212
+ `\u26A0 Profile '${name}' already exists. Use 'edit-profile' to modify it.`
213
+ )
226
214
  );
227
215
  process.exit(1);
228
216
  }
@@ -230,10 +218,16 @@ function createConfigCommand() {
230
218
  if (options.copyFrom) {
231
219
  const sourceProfile = config2.profiles?.[options.copyFrom];
232
220
  if (!sourceProfile) {
233
- console.log(chalk.red(`\u274C Source profile '${options.copyFrom}' not found`));
221
+ console.log(
222
+ chalk.red(`\u274C Source profile '${options.copyFrom}' not found`)
223
+ );
234
224
  process.exit(1);
235
225
  }
236
- newProfile = { ...sourceProfile, name, description: options.description };
226
+ newProfile = {
227
+ ...sourceProfile,
228
+ name,
229
+ description: options.description
230
+ };
237
231
  } else {
238
232
  const weights = {
239
233
  base: options.baseWeight ?? DEFAULT_WEIGHTS.base,
@@ -243,7 +237,9 @@ function createConfigCommand() {
243
237
  };
244
238
  const sum = weights.base + weights.impact + weights.persistence + weights.reference;
245
239
  if (Math.abs(sum - 1) > 1e-3) {
246
- console.log(chalk.red(`\u274C Weights must sum to 1.0 (current: ${sum.toFixed(3)})`));
240
+ console.log(
241
+ chalk.red(`\u274C Weights must sum to 1.0 (current: ${sum.toFixed(3)})`)
242
+ );
247
243
  console.log(chalk.yellow("\nNormalizing weights to sum to 1.0..."));
248
244
  const factor = 1 / sum;
249
245
  weights.base *= factor;
@@ -273,17 +269,27 @@ function createConfigCommand() {
273
269
  Activate with: stackmemory config set-profile ${name}`)
274
270
  );
275
271
  });
276
- config.command("edit-profile <name>").description("Edit an existing profile").option("-s, --set-tool <tool:score>", "Set tool score (e.g., search:0.95)", (value, previous) => {
277
- const result = previous || {};
278
- const [tool, score] = value.split(":");
279
- result[tool] = parseFloat(score);
280
- return result;
281
- }, {}).option("-w, --set-weight <type:value>", "Set weight (e.g., base:0.4)", (value, previous) => {
282
- const result = previous || {};
283
- const [type, weight] = value.split(":");
284
- result[type] = parseFloat(weight);
285
- return result;
286
- }, {}).action(async (name, options) => {
272
+ config.command("edit-profile <name>").description("Edit an existing profile").option(
273
+ "-s, --set-tool <tool:score>",
274
+ "Set tool score (e.g., search:0.95)",
275
+ (value, previous) => {
276
+ const result = previous || {};
277
+ const [tool, score] = value.split(":");
278
+ result[tool] = parseFloat(score);
279
+ return result;
280
+ },
281
+ {}
282
+ ).option(
283
+ "-w, --set-weight <type:value>",
284
+ "Set weight (e.g., base:0.4)",
285
+ (value, previous) => {
286
+ const result = previous || {};
287
+ const [type, weight] = value.split(":");
288
+ result[type] = parseFloat(weight);
289
+ return result;
290
+ },
291
+ {}
292
+ ).action(async (name, options) => {
287
293
  const manager = new ConfigManager();
288
294
  const config2 = manager.getConfig();
289
295
  if (!config2.profiles?.[name]) {
@@ -312,7 +318,9 @@ Activate with: stackmemory config set-profile ${name}`)
312
318
  const weights = profile.scoring.weights;
313
319
  const sum = (weights.base || 0) + (weights.impact || 0) + (weights.persistence || 0) + (weights.reference || 0);
314
320
  if (Math.abs(sum - 1) > 1e-3) {
315
- console.log(chalk.yellow(`\u26A0 Weights sum to ${sum.toFixed(3)}, normalizing...`));
321
+ console.log(
322
+ chalk.yellow(`\u26A0 Weights sum to ${sum.toFixed(3)}, normalizing...`)
323
+ );
316
324
  const factor = 1 / sum;
317
325
  if (weights.base) weights.base *= factor;
318
326
  if (weights.impact) weights.impact *= factor;
@@ -334,7 +342,9 @@ Activate with: stackmemory config set-profile ${name}`)
334
342
  Profile: ${profile}`));
335
343
  console.log("Note: Run tools with this profile to generate metrics");
336
344
  } else {
337
- console.log("\nNote: Tool scoring metrics will be available after running MCP tools");
345
+ console.log(
346
+ "\nNote: Tool scoring metrics will be available after running MCP tools"
347
+ );
338
348
  }
339
349
  console.log(chalk.gray("\nMetrics tracked:"));
340
350
  console.log(" \u2022 Average score per tool");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/commands/config.ts"],
4
- "sourcesContent": ["/**\n * Config command for StackMemory CLI\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport chalk from 'chalk';\nimport { ConfigManager } from '../../core/config/config-manager.js';\nimport { \n DEFAULT_CONFIG, \n PRESET_PROFILES, \n ProfileConfig, \n ScoringWeights,\n DEFAULT_WEIGHTS,\n DEFAULT_TOOL_SCORES\n} from '../../core/config/types.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config').description(\n 'Manage StackMemory configuration'\n );\n\n config\n .command('validate')\n .description('Validate configuration file')\n .option(\n '-f, --file <path>',\n 'Path to config file',\n '.stackmemory/config.yaml'\n )\n .option('--fix', 'Attempt to auto-fix common issues')\n .action(async (options) => {\n console.log(chalk.blue('\uD83D\uDD0D Validating configuration...'));\n\n const configPath = path.resolve(options.file);\n const manager = new ConfigManager(configPath);\n const result = manager.validate();\n\n // Display errors\n if (result.errors.length > 0) {\n console.log(chalk.red('\\n\u2717 Errors:'));\n result.errors.forEach((error) => {\n console.log(chalk.red(` \u2022 ${error}`));\n });\n }\n\n // Display warnings\n if (result.warnings.length > 0) {\n console.log(chalk.yellow('\\n\u26A0 Warnings:'));\n result.warnings.forEach((warning) => {\n console.log(chalk.yellow(` \u2022 ${warning}`));\n });\n }\n\n // Display suggestions\n if (result.suggestions.length > 0) {\n console.log(chalk.cyan('\\n\uD83D\uDCA1 Suggestions:'));\n result.suggestions.forEach((suggestion) => {\n console.log(chalk.cyan(` \u2022 ${suggestion}`));\n });\n }\n\n // Auto-fix if requested\n if (options.fix && result.errors.length > 0) {\n console.log(chalk.blue('\\n\uD83D\uDD27 Attempting auto-fix...'));\n\n const config = manager.getConfig();\n const weights = config.scoring.weights;\n const weightSum =\n weights.base +\n weights.impact +\n weights.persistence +\n weights.reference;\n\n if (Math.abs(weightSum - 1.0) > 0.001) {\n // Normalize weights to sum to 1.0\n const factor = 1.0 / weightSum;\n manager.updateWeights({\n base: weights.base * factor,\n impact: weights.impact * factor,\n persistence: weights.persistence * factor,\n reference: weights.reference * factor,\n });\n manager.save();\n console.log(chalk.green(' \u2713 Normalized weights to sum to 1.0'));\n }\n }\n\n // Final status\n if (result.valid) {\n console.log(chalk.green('\\n\u2705 Configuration is valid'));\n process.exit(0);\n } else {\n console.log(chalk.red('\\n\u274C Configuration has errors'));\n process.exit(1);\n }\n });\n\n config\n .command('init')\n .description('Initialize configuration file with defaults')\n .option('-p, --profile <name>', 'Use a preset profile', 'default')\n .option('-f, --force', 'Overwrite existing config')\n .action(async (options) => {\n const configPath = path.join(\n process.cwd(),\n '.stackmemory',\n 'config.yaml'\n );\n\n if (fs.existsSync(configPath) && !options.force) {\n console.log(\n chalk.yellow(\n '\u26A0 Config file already exists. Use --force to overwrite.'\n )\n );\n process.exit(1);\n }\n\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const config = { ...DEFAULT_CONFIG };\n if (options.profile && options.profile !== 'default') {\n config.profile = options.profile;\n }\n\n const content = yaml.dump(config, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n });\n\n fs.writeFileSync(configPath, content, 'utf-8');\n console.log(chalk.green(`\u2705 Created config file at ${configPath}`));\n\n if (options.profile !== 'default') {\n console.log(chalk.cyan(`\uD83D\uDCCB Using profile: ${options.profile}`));\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .option('-p, --profile <name>', 'Show specific profile')\n .action(async (options) => {\n const manager = new ConfigManager();\n const config = manager.getConfig();\n\n if (options.profile) {\n const profiles = manager.getProfiles();\n const profile = profiles[options.profile];\n\n if (!profile) {\n console.log(chalk.red(`\u274C Profile '${options.profile}' not found`));\n console.log(chalk.cyan('Available profiles:'));\n Object.keys(profiles).forEach((name) => {\n console.log(` \u2022 ${name}`);\n });\n process.exit(1);\n }\n\n console.log(chalk.blue(`\\n\uD83D\uDCCB Profile: ${profile.name}`));\n if (profile.description) {\n console.log(chalk.gray(` ${profile.description}`));\n }\n console.log('\\n' + yaml.dump(profile, { indent: 2 }));\n } else {\n console.log(chalk.blue('\\n\uD83D\uDCCB Current Configuration:'));\n if (config.profile) {\n console.log(chalk.cyan(` Active Profile: ${config.profile}`));\n }\n console.log('\\n' + yaml.dump(config, { indent: 2 }));\n }\n });\n\n config\n .command('set-profile <name>')\n .description('Set active profile')\n .action(async (name) => {\n const manager = new ConfigManager();\n\n if (manager.setProfile(name)) {\n manager.save();\n console.log(chalk.green(`\u2705 Active profile set to: ${name}`));\n } else {\n console.log(chalk.red(`\u274C Profile '${name}' not found`));\n console.log(chalk.cyan('Available profiles:'));\n Object.keys(manager.getProfiles()).forEach((profile) => {\n console.log(` \u2022 ${profile}`);\n });\n process.exit(1);\n }\n });\n\n config\n .command('list-profiles')\n .description('List available profiles')\n .action(async () => {\n const manager = new ConfigManager();\n const profiles = manager.getProfiles();\n const currentProfile = manager.getConfig().profile;\n\n console.log(chalk.blue('\\n\uD83D\uDCCB Available Profiles:'));\n Object.entries(profiles).forEach(([name, profile]) => {\n const marker = name === currentProfile ? chalk.green(' \u2713') : '';\n console.log(` \u2022 ${chalk.cyan(name)}${marker}`);\n if (profile.description) {\n console.log(chalk.gray(` ${profile.description}`));\n }\n });\n });\n\n config\n .command('test-score <tool>')\n .description('Test importance scoring for a tool')\n .option('-f, --files <number>', 'Number of files affected', parseInt)\n .option('-p, --permanent', 'Is change permanent')\n .option('-r, --references <number>', 'Reference count', parseInt)\n .action(async (tool, options) => {\n const manager = new ConfigManager();\n\n const score = manager.calculateScore(tool, {\n filesAffected: options.files,\n isPermanent: options.permanent,\n referenceCount: options.references,\n });\n\n const config = manager.getConfig();\n const baseScore = config.scoring.tool_scores[tool] || 0.5;\n\n console.log(chalk.blue('\\n\uD83D\uDCCA Score Calculation:'));\n console.log(` Tool: ${chalk.cyan(tool)}`);\n console.log(` Base Score: ${chalk.yellow(baseScore.toFixed(3))}`);\n\n if (options.files !== undefined) {\n console.log(` Files Affected: ${options.files}`);\n }\n if (options.permanent) {\n console.log(` Permanent: ${chalk.green('Yes')}`);\n }\n if (options.references !== undefined) {\n console.log(` References: ${options.references}`);\n }\n\n console.log(chalk.blue('\\n Weights:'));\n console.log(` Base: ${config.scoring.weights.base}`);\n console.log(` Impact: ${config.scoring.weights.impact}`);\n console.log(` Persistence: ${config.scoring.weights.persistence}`);\n console.log(` Reference: ${config.scoring.weights.reference}`);\n\n console.log(chalk.green(`\\n Final Score: ${score.toFixed(3)}`));\n\n // Show importance level\n let level = 'Low';\n let color = chalk.gray;\n if (score >= 0.8) {\n level = 'Critical';\n color = chalk.red;\n } else if (score >= 0.6) {\n level = 'High';\n color = chalk.yellow;\n } else if (score >= 0.4) {\n level = 'Medium';\n color = chalk.cyan;\n }\n\n console.log(` Importance: ${color(level)}`);\n });\n\n config\n .command('create-profile <name>')\n .description('Create a custom configuration profile')\n .option(\n '-d, --description <text>',\n 'Profile description'\n )\n .option(\n '-b, --base-weight <number>',\n 'Base weight (0-1)',\n parseFloat\n )\n .option(\n '-i, --impact-weight <number>',\n 'Impact weight (0-1)',\n parseFloat\n )\n .option(\n '-p, --persistence-weight <number>',\n 'Persistence weight (0-1)',\n parseFloat\n )\n .option(\n '-r, --reference-weight <number>',\n 'Reference weight (0-1)',\n parseFloat\n )\n .option(\n '--copy-from <profile>',\n 'Copy settings from existing profile'\n )\n .action(async (name, options) => {\n const manager = new ConfigManager();\n const config = manager.getConfig();\n\n // Check if profile already exists\n if (config.profiles && config.profiles[name]) {\n console.log(\n chalk.yellow(`\u26A0 Profile '${name}' already exists. Use 'edit-profile' to modify it.`)\n );\n process.exit(1);\n }\n\n let newProfile: ProfileConfig;\n\n if (options.copyFrom) {\n // Copy from existing profile\n const sourceProfile = config.profiles?.[options.copyFrom];\n if (!sourceProfile) {\n console.log(chalk.red(`\u274C Source profile '${options.copyFrom}' not found`));\n process.exit(1);\n }\n newProfile = { ...sourceProfile, name, description: options.description };\n } else {\n // Create new profile with custom weights\n const weights: ScoringWeights = {\n base: options.baseWeight ?? DEFAULT_WEIGHTS.base,\n impact: options.impactWeight ?? DEFAULT_WEIGHTS.impact,\n persistence: options.persistenceWeight ?? DEFAULT_WEIGHTS.persistence,\n reference: options.referenceWeight ?? DEFAULT_WEIGHTS.reference,\n };\n\n // Validate weights sum to 1.0\n const sum = weights.base + weights.impact + weights.persistence + weights.reference;\n if (Math.abs(sum - 1.0) > 0.001) {\n console.log(chalk.red(`\u274C Weights must sum to 1.0 (current: ${sum.toFixed(3)})`));\n console.log(chalk.yellow('\\nNormalizing weights to sum to 1.0...'));\n \n const factor = 1.0 / sum;\n weights.base *= factor;\n weights.impact *= factor;\n weights.persistence *= factor;\n weights.reference *= factor;\n }\n\n newProfile = {\n name,\n description: options.description || `Custom profile created ${new Date().toLocaleDateString()}`,\n scoring: {\n weights,\n tool_scores: DEFAULT_TOOL_SCORES,\n },\n };\n }\n\n // Add profile to config\n if (!config.profiles) {\n config.profiles = {};\n }\n config.profiles[name] = newProfile;\n\n // Save config\n manager.save();\n\n console.log(chalk.green(`\u2705 Created profile: ${name}`));\n console.log(chalk.blue('\\nProfile Configuration:'));\n console.log(yaml.dump(newProfile, { indent: 2 }));\n console.log(\n chalk.cyan(`\\nActivate with: stackmemory config set-profile ${name}`)\n );\n });\n\n config\n .command('edit-profile <name>')\n .description('Edit an existing profile')\n .option('-s, --set-tool <tool:score>', 'Set tool score (e.g., search:0.95)', (value, previous) => {\n const result = previous || {};\n const [tool, score] = value.split(':');\n result[tool] = parseFloat(score);\n return result;\n }, {})\n .option('-w, --set-weight <type:value>', 'Set weight (e.g., base:0.4)', (value, previous) => {\n const result = previous || {};\n const [type, weight] = value.split(':');\n result[type] = parseFloat(weight);\n return result;\n }, {})\n .action(async (name, options) => {\n const manager = new ConfigManager();\n const config = manager.getConfig();\n\n if (!config.profiles?.[name]) {\n console.log(chalk.red(`\u274C Profile '${name}' not found`));\n process.exit(1);\n }\n\n const profile = config.profiles[name];\n\n // Update tool scores\n if (Object.keys(options.setTool).length > 0) {\n if (!profile.scoring) {\n profile.scoring = {};\n }\n if (!profile.scoring.tool_scores) {\n profile.scoring.tool_scores = {};\n }\n Object.assign(profile.scoring.tool_scores, options.setTool);\n console.log(chalk.green('\u2713 Updated tool scores'));\n }\n\n // Update weights\n if (Object.keys(options.setWeight).length > 0) {\n if (!profile.scoring) {\n profile.scoring = {};\n }\n if (!profile.scoring.weights) {\n profile.scoring.weights = { ...DEFAULT_WEIGHTS };\n }\n Object.assign(profile.scoring.weights, options.setWeight);\n \n // Validate weights\n const weights = profile.scoring.weights;\n const sum = (weights.base || 0) + (weights.impact || 0) + \n (weights.persistence || 0) + (weights.reference || 0);\n \n if (Math.abs(sum - 1.0) > 0.001) {\n console.log(chalk.yellow(`\u26A0 Weights sum to ${sum.toFixed(3)}, normalizing...`));\n const factor = 1.0 / sum;\n if (weights.base) weights.base *= factor;\n if (weights.impact) weights.impact *= factor;\n if (weights.persistence) weights.persistence *= factor;\n if (weights.reference) weights.reference *= factor;\n }\n \n console.log(chalk.green('\u2713 Updated weights'));\n }\n\n // Save changes\n manager.save();\n\n console.log(chalk.green(`\\n\u2705 Profile '${name}' updated`));\n console.log(chalk.blue('\\nUpdated Configuration:'));\n console.log(yaml.dump(profile, { indent: 2 }));\n });\n\n config\n .command('profile-report [profile]')\n .description('Show profile effectiveness report')\n .action(async (profile) => {\n // This would integrate with the ToolScoringMiddleware\n // For now, show a placeholder\n console.log(chalk.blue('\\n\uD83D\uDCCA Profile Effectiveness Report'));\n \n if (profile) {\n console.log(chalk.cyan(`\\nProfile: ${profile}`));\n console.log('Note: Run tools with this profile to generate metrics');\n } else {\n console.log('\\nNote: Tool scoring metrics will be available after running MCP tools');\n }\n \n console.log(chalk.gray('\\nMetrics tracked:'));\n console.log(' \u2022 Average score per tool');\n console.log(' \u2022 High-importance operations');\n console.log(' \u2022 Profile usage frequency');\n console.log(' \u2022 Score trends over time');\n });\n\n return config;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Config command for StackMemory CLI\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport chalk from 'chalk';\nimport { ConfigManager } from '../../core/config/config-manager.js';\nimport {\n DEFAULT_CONFIG,\n PRESET_PROFILES,\n ProfileConfig,\n ScoringWeights,\n DEFAULT_WEIGHTS,\n DEFAULT_TOOL_SCORES,\n} from '../../core/config/types.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config').description(\n 'Manage StackMemory configuration'\n );\n\n config\n .command('validate')\n .description('Validate configuration file')\n .option(\n '-f, --file <path>',\n 'Path to config file',\n '.stackmemory/config.yaml'\n )\n .option('--fix', 'Attempt to auto-fix common issues')\n .action(async (options) => {\n console.log(chalk.blue('\uD83D\uDD0D Validating configuration...'));\n\n const configPath = path.resolve(options.file);\n const manager = new ConfigManager(configPath);\n const result = manager.validate();\n\n // Display errors\n if (result.errors.length > 0) {\n console.log(chalk.red('\\n\u2717 Errors:'));\n result.errors.forEach((error) => {\n console.log(chalk.red(` \u2022 ${error}`));\n });\n }\n\n // Display warnings\n if (result.warnings.length > 0) {\n console.log(chalk.yellow('\\n\u26A0 Warnings:'));\n result.warnings.forEach((warning) => {\n console.log(chalk.yellow(` \u2022 ${warning}`));\n });\n }\n\n // Display suggestions\n if (result.suggestions.length > 0) {\n console.log(chalk.cyan('\\n\uD83D\uDCA1 Suggestions:'));\n result.suggestions.forEach((suggestion) => {\n console.log(chalk.cyan(` \u2022 ${suggestion}`));\n });\n }\n\n // Auto-fix if requested\n if (options.fix && result.errors.length > 0) {\n console.log(chalk.blue('\\n\uD83D\uDD27 Attempting auto-fix...'));\n\n const config = manager.getConfig();\n const weights = config.scoring.weights;\n const weightSum =\n weights.base +\n weights.impact +\n weights.persistence +\n weights.reference;\n\n if (Math.abs(weightSum - 1.0) > 0.001) {\n // Normalize weights to sum to 1.0\n const factor = 1.0 / weightSum;\n manager.updateWeights({\n base: weights.base * factor,\n impact: weights.impact * factor,\n persistence: weights.persistence * factor,\n reference: weights.reference * factor,\n });\n manager.save();\n console.log(chalk.green(' \u2713 Normalized weights to sum to 1.0'));\n }\n }\n\n // Final status\n if (result.valid) {\n console.log(chalk.green('\\n\u2705 Configuration is valid'));\n process.exit(0);\n } else {\n console.log(chalk.red('\\n\u274C Configuration has errors'));\n process.exit(1);\n }\n });\n\n config\n .command('init')\n .description('Initialize configuration file with defaults')\n .option('-p, --profile <name>', 'Use a preset profile', 'default')\n .option('-f, --force', 'Overwrite existing config')\n .action(async (options) => {\n const configPath = path.join(\n process.cwd(),\n '.stackmemory',\n 'config.yaml'\n );\n\n if (fs.existsSync(configPath) && !options.force) {\n console.log(\n chalk.yellow(\n '\u26A0 Config file already exists. Use --force to overwrite.'\n )\n );\n process.exit(1);\n }\n\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const config = { ...DEFAULT_CONFIG };\n if (options.profile && options.profile !== 'default') {\n config.profile = options.profile;\n }\n\n const content = yaml.dump(config, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n });\n\n fs.writeFileSync(configPath, content, 'utf-8');\n console.log(chalk.green(`\u2705 Created config file at ${configPath}`));\n\n if (options.profile !== 'default') {\n console.log(chalk.cyan(`\uD83D\uDCCB Using profile: ${options.profile}`));\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .option('-p, --profile <name>', 'Show specific profile')\n .action(async (options) => {\n const manager = new ConfigManager();\n const config = manager.getConfig();\n\n if (options.profile) {\n const profiles = manager.getProfiles();\n const profile = profiles[options.profile];\n\n if (!profile) {\n console.log(chalk.red(`\u274C Profile '${options.profile}' not found`));\n console.log(chalk.cyan('Available profiles:'));\n Object.keys(profiles).forEach((name) => {\n console.log(` \u2022 ${name}`);\n });\n process.exit(1);\n }\n\n console.log(chalk.blue(`\\n\uD83D\uDCCB Profile: ${profile.name}`));\n if (profile.description) {\n console.log(chalk.gray(` ${profile.description}`));\n }\n console.log('\\n' + yaml.dump(profile, { indent: 2 }));\n } else {\n console.log(chalk.blue('\\n\uD83D\uDCCB Current Configuration:'));\n if (config.profile) {\n console.log(chalk.cyan(` Active Profile: ${config.profile}`));\n }\n console.log('\\n' + yaml.dump(config, { indent: 2 }));\n }\n });\n\n config\n .command('set-profile <name>')\n .description('Set active profile')\n .action(async (name) => {\n const manager = new ConfigManager();\n\n if (manager.setProfile(name)) {\n manager.save();\n console.log(chalk.green(`\u2705 Active profile set to: ${name}`));\n } else {\n console.log(chalk.red(`\u274C Profile '${name}' not found`));\n console.log(chalk.cyan('Available profiles:'));\n Object.keys(manager.getProfiles()).forEach((profile) => {\n console.log(` \u2022 ${profile}`);\n });\n process.exit(1);\n }\n });\n\n config\n .command('list-profiles')\n .description('List available profiles')\n .action(async () => {\n const manager = new ConfigManager();\n const profiles = manager.getProfiles();\n const currentProfile = manager.getConfig().profile;\n\n console.log(chalk.blue('\\n\uD83D\uDCCB Available Profiles:'));\n Object.entries(profiles).forEach(([name, profile]) => {\n const marker = name === currentProfile ? chalk.green(' \u2713') : '';\n console.log(` \u2022 ${chalk.cyan(name)}${marker}`);\n if (profile.description) {\n console.log(chalk.gray(` ${profile.description}`));\n }\n });\n });\n\n config\n .command('test-score <tool>')\n .description('Test importance scoring for a tool')\n .option('-f, --files <number>', 'Number of files affected', parseInt)\n .option('-p, --permanent', 'Is change permanent')\n .option('-r, --references <number>', 'Reference count', parseInt)\n .action(async (tool, options) => {\n const manager = new ConfigManager();\n\n const score = manager.calculateScore(tool, {\n filesAffected: options.files,\n isPermanent: options.permanent,\n referenceCount: options.references,\n });\n\n const config = manager.getConfig();\n const baseScore = config.scoring.tool_scores[tool] || 0.5;\n\n console.log(chalk.blue('\\n\uD83D\uDCCA Score Calculation:'));\n console.log(` Tool: ${chalk.cyan(tool)}`);\n console.log(` Base Score: ${chalk.yellow(baseScore.toFixed(3))}`);\n\n if (options.files !== undefined) {\n console.log(` Files Affected: ${options.files}`);\n }\n if (options.permanent) {\n console.log(` Permanent: ${chalk.green('Yes')}`);\n }\n if (options.references !== undefined) {\n console.log(` References: ${options.references}`);\n }\n\n console.log(chalk.blue('\\n Weights:'));\n console.log(` Base: ${config.scoring.weights.base}`);\n console.log(` Impact: ${config.scoring.weights.impact}`);\n console.log(` Persistence: ${config.scoring.weights.persistence}`);\n console.log(` Reference: ${config.scoring.weights.reference}`);\n\n console.log(chalk.green(`\\n Final Score: ${score.toFixed(3)}`));\n\n // Show importance level\n let level = 'Low';\n let color = chalk.gray;\n if (score >= 0.8) {\n level = 'Critical';\n color = chalk.red;\n } else if (score >= 0.6) {\n level = 'High';\n color = chalk.yellow;\n } else if (score >= 0.4) {\n level = 'Medium';\n color = chalk.cyan;\n }\n\n console.log(` Importance: ${color(level)}`);\n });\n\n config\n .command('create-profile <name>')\n .description('Create a custom configuration profile')\n .option('-d, --description <text>', 'Profile description')\n .option('-b, --base-weight <number>', 'Base weight (0-1)', parseFloat)\n .option('-i, --impact-weight <number>', 'Impact weight (0-1)', parseFloat)\n .option(\n '-p, --persistence-weight <number>',\n 'Persistence weight (0-1)',\n parseFloat\n )\n .option(\n '-r, --reference-weight <number>',\n 'Reference weight (0-1)',\n parseFloat\n )\n .option('--copy-from <profile>', 'Copy settings from existing profile')\n .action(async (name, options) => {\n const manager = new ConfigManager();\n const config = manager.getConfig();\n\n // Check if profile already exists\n if (config.profiles && config.profiles[name]) {\n console.log(\n chalk.yellow(\n `\u26A0 Profile '${name}' already exists. Use 'edit-profile' to modify it.`\n )\n );\n process.exit(1);\n }\n\n let newProfile: ProfileConfig;\n\n if (options.copyFrom) {\n // Copy from existing profile\n const sourceProfile = config.profiles?.[options.copyFrom];\n if (!sourceProfile) {\n console.log(\n chalk.red(`\u274C Source profile '${options.copyFrom}' not found`)\n );\n process.exit(1);\n }\n newProfile = {\n ...sourceProfile,\n name,\n description: options.description,\n };\n } else {\n // Create new profile with custom weights\n const weights: ScoringWeights = {\n base: options.baseWeight ?? DEFAULT_WEIGHTS.base,\n impact: options.impactWeight ?? DEFAULT_WEIGHTS.impact,\n persistence: options.persistenceWeight ?? DEFAULT_WEIGHTS.persistence,\n reference: options.referenceWeight ?? DEFAULT_WEIGHTS.reference,\n };\n\n // Validate weights sum to 1.0\n const sum =\n weights.base +\n weights.impact +\n weights.persistence +\n weights.reference;\n if (Math.abs(sum - 1.0) > 0.001) {\n console.log(\n chalk.red(`\u274C Weights must sum to 1.0 (current: ${sum.toFixed(3)})`)\n );\n console.log(chalk.yellow('\\nNormalizing weights to sum to 1.0...'));\n\n const factor = 1.0 / sum;\n weights.base *= factor;\n weights.impact *= factor;\n weights.persistence *= factor;\n weights.reference *= factor;\n }\n\n newProfile = {\n name,\n description:\n options.description ||\n `Custom profile created ${new Date().toLocaleDateString()}`,\n scoring: {\n weights,\n tool_scores: DEFAULT_TOOL_SCORES,\n },\n };\n }\n\n // Add profile to config\n if (!config.profiles) {\n config.profiles = {};\n }\n config.profiles[name] = newProfile;\n\n // Save config\n manager.save();\n\n console.log(chalk.green(`\u2705 Created profile: ${name}`));\n console.log(chalk.blue('\\nProfile Configuration:'));\n console.log(yaml.dump(newProfile, { indent: 2 }));\n console.log(\n chalk.cyan(`\\nActivate with: stackmemory config set-profile ${name}`)\n );\n });\n\n config\n .command('edit-profile <name>')\n .description('Edit an existing profile')\n .option(\n '-s, --set-tool <tool:score>',\n 'Set tool score (e.g., search:0.95)',\n (value, previous) => {\n const result = previous || {};\n const [tool, score] = value.split(':');\n result[tool] = parseFloat(score);\n return result;\n },\n {}\n )\n .option(\n '-w, --set-weight <type:value>',\n 'Set weight (e.g., base:0.4)',\n (value, previous) => {\n const result = previous || {};\n const [type, weight] = value.split(':');\n result[type] = parseFloat(weight);\n return result;\n },\n {}\n )\n .action(async (name, options) => {\n const manager = new ConfigManager();\n const config = manager.getConfig();\n\n if (!config.profiles?.[name]) {\n console.log(chalk.red(`\u274C Profile '${name}' not found`));\n process.exit(1);\n }\n\n const profile = config.profiles[name];\n\n // Update tool scores\n if (Object.keys(options.setTool).length > 0) {\n if (!profile.scoring) {\n profile.scoring = {};\n }\n if (!profile.scoring.tool_scores) {\n profile.scoring.tool_scores = {};\n }\n Object.assign(profile.scoring.tool_scores, options.setTool);\n console.log(chalk.green('\u2713 Updated tool scores'));\n }\n\n // Update weights\n if (Object.keys(options.setWeight).length > 0) {\n if (!profile.scoring) {\n profile.scoring = {};\n }\n if (!profile.scoring.weights) {\n profile.scoring.weights = { ...DEFAULT_WEIGHTS };\n }\n Object.assign(profile.scoring.weights, options.setWeight);\n\n // Validate weights\n const weights = profile.scoring.weights;\n const sum =\n (weights.base || 0) +\n (weights.impact || 0) +\n (weights.persistence || 0) +\n (weights.reference || 0);\n\n if (Math.abs(sum - 1.0) > 0.001) {\n console.log(\n chalk.yellow(`\u26A0 Weights sum to ${sum.toFixed(3)}, normalizing...`)\n );\n const factor = 1.0 / sum;\n if (weights.base) weights.base *= factor;\n if (weights.impact) weights.impact *= factor;\n if (weights.persistence) weights.persistence *= factor;\n if (weights.reference) weights.reference *= factor;\n }\n\n console.log(chalk.green('\u2713 Updated weights'));\n }\n\n // Save changes\n manager.save();\n\n console.log(chalk.green(`\\n\u2705 Profile '${name}' updated`));\n console.log(chalk.blue('\\nUpdated Configuration:'));\n console.log(yaml.dump(profile, { indent: 2 }));\n });\n\n config\n .command('profile-report [profile]')\n .description('Show profile effectiveness report')\n .action(async (profile) => {\n // This would integrate with the ToolScoringMiddleware\n // For now, show a placeholder\n console.log(chalk.blue('\\n\uD83D\uDCCA Profile Effectiveness Report'));\n\n if (profile) {\n console.log(chalk.cyan(`\\nProfile: ${profile}`));\n console.log('Note: Run tools with this profile to generate metrics');\n } else {\n console.log(\n '\\nNote: Tool scoring metrics will be available after running MCP tools'\n );\n }\n\n console.log(chalk.gray('\\nMetrics tracked:'));\n console.log(' \u2022 Average score per tool');\n console.log(' \u2022 High-importance operations');\n console.log(' \u2022 Profile usage frequency');\n console.log(' \u2022 Score trends over time');\n });\n\n return config;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["config"]
7
7
  }
@@ -3,6 +3,17 @@ import Database from "better-sqlite3";
3
3
  import { join } from "path";
4
4
  import { existsSync } from "fs";
5
5
  import { FrameManager } from "../../core/context/frame-manager.js";
6
+ function getEnv(key, defaultValue) {
7
+ const value = process.env[key];
8
+ if (value === void 0) {
9
+ if (defaultValue !== void 0) return defaultValue;
10
+ throw new Error(`Environment variable ${key} is required`);
11
+ }
12
+ return value;
13
+ }
14
+ function getOptionalEnv(key) {
15
+ return process.env[key];
16
+ }
6
17
  function createContextCommands() {
7
18
  const context = new Command("context").alias("ctx").description("Manage context stack");
8
19
  context.command("show").alias("status").description("Show current context stack").option("-v, --verbose", "Show detailed information").action(async (options) => {
@@ -273,7 +284,7 @@ function createContextCommands() {
273
284
  });
274
285
  }
275
286
  } else if (action === "save") {
276
- const instanceId = options.instance || process.env.CLAUDE_INSTANCE_ID;
287
+ const instanceId = options.instance || process.env["CLAUDE_INSTANCE_ID"];
277
288
  const branch = options.branch || "unknown";
278
289
  if (!instanceId) {
279
290
  console.log("\u26A0\uFE0F No instance ID provided or detected.");
@@ -293,7 +304,7 @@ function createContextCommands() {
293
304
  console.log(` Instance: ${instanceId}`);
294
305
  console.log(` Frame ID: ${frameId.slice(0, 10)}`);
295
306
  } else if (action === "load") {
296
- const instanceId = options.instance || process.env.CLAUDE_INSTANCE_ID;
307
+ const instanceId = options.instance || process.env["CLAUDE_INSTANCE_ID"];
297
308
  if (!instanceId) {
298
309
  console.log("\u26A0\uFE0F No instance ID provided.");
299
310
  return;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/commands/context.ts"],
4
- "sourcesContent": ["/**\n * Context Commands for StackMemory CLI\n * Manage context stack (show, push, pop)\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { FrameManager, FrameType } from '../../core/context/frame-manager.js';\n\nexport function createContextCommands(): Command {\n const context = new Command('context')\n .alias('ctx')\n .description('Manage context stack');\n\n // Show current context\n context\n .command('show')\n .alias('status')\n .description('Show current context stack')\n .option('-v, --verbose', 'Show detailed information')\n .action(async (options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n // Get project ID - try metadata table, fallback to default\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(\n `\n SELECT value FROM metadata WHERE key = 'project_id'\n `\n )\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {\n // metadata table doesn't exist, use default\n }\n\n const frameManager = new FrameManager(db, projectId, { \n skipContextBridge: true \n });\n\n const depth = frameManager.getStackDepth();\n const activePath = frameManager.getActiveFramePath();\n\n console.log(`\\n\uD83D\uDCDA Context Stack\\n`);\n console.log(`Project: ${projectId}`);\n console.log(`Depth: ${depth}`);\n console.log(`Active frames: ${activePath.length}\\n`);\n\n if (activePath.length === 0) {\n console.log('No active context frames.\\n');\n console.log('Use \"stackmemory context push\" to create one.');\n } else {\n const typeIcon: Record<string, string> = {\n session: '\uD83D\uDD37',\n task: '\uD83D\uDCCB',\n command: '\u26A1',\n file: '\uD83D\uDCC4',\n decision: '\uD83D\uDCA1',\n };\n\n console.log('Stack (bottom to top):');\n activePath.forEach((frame, i) => {\n const icon = typeIcon[frame.type] || '\uD83D\uDCE6';\n const indent = ' '.repeat(i);\n console.log(\n `${indent}${i === activePath.length - 1 ? '\u2514\u2500' : '\u251C\u2500'} ${icon} ${frame.name || frame.frame_id.slice(0, 10)}`\n );\n\n if (options.verbose) {\n console.log(`${indent} ID: ${frame.frame_id}`);\n console.log(`${indent} Type: ${frame.type}`);\n console.log(\n `${indent} Created: ${new Date(frame.created_at * 1000).toLocaleString()}`\n );\n }\n });\n }\n\n console.log('');\n } catch (error) {\n console.error('\u274C Failed to show context:', (error as Error).message);\n } finally {\n db.close();\n }\n });\n\n // Push new context frame\n context\n .command('push <name>')\n .description('Push a new context frame onto the stack')\n .option(\n '-t, --type <type>',\n 'Frame type (session, task, command, file, decision)',\n 'task'\n )\n .option('-m, --metadata <json>', 'Additional metadata as JSON')\n .action(async (name, options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, { \n skipContextBridge: true \n });\n\n // Get current top frame as parent\n const activePath = frameManager.getActiveFramePath();\n const parentId =\n activePath.length > 0\n ? activePath[activePath.length - 1].frame_id\n : undefined;\n\n // Parse metadata if provided\n let inputs = {};\n if (options.metadata) {\n try {\n inputs = JSON.parse(options.metadata);\n } catch {\n console.log('\u26A0\uFE0F Invalid metadata JSON, ignoring');\n }\n }\n\n const frameId = frameManager.createFrame({\n type: options.type as FrameType,\n name,\n inputs,\n parentFrameId: parentId,\n });\n\n console.log(`\u2705 Pushed context frame: ${name}`);\n console.log(` ID: ${frameId.slice(0, 10)}`);\n console.log(` Type: ${options.type}`);\n console.log(` Depth: ${frameManager.getStackDepth()}`);\n } catch (error) {\n console.error('\u274C Failed to push context:', (error as Error).message);\n } finally {\n db.close();\n }\n });\n\n // Pop context frame\n context\n .command('pop')\n .description('Pop the top context frame from the stack')\n .option('-a, --all', 'Pop all frames (clear stack)')\n .action(async (options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, { \n skipContextBridge: true \n });\n\n const activePath = frameManager.getActiveFramePath();\n\n if (activePath.length === 0) {\n console.log('\uD83D\uDCDA Stack is already empty.');\n return;\n }\n\n if (options.all) {\n // Close all frames from top to bottom\n for (let i = activePath.length - 1; i >= 0; i--) {\n frameManager.closeFrame(activePath[i].frame_id);\n }\n console.log(`\u2705 Cleared all ${activePath.length} context frames.`);\n } else {\n // Close just the top frame\n const topFrame = activePath[activePath.length - 1];\n frameManager.closeFrame(topFrame.frame_id);\n console.log(\n `\u2705 Popped: ${topFrame.name || topFrame.frame_id.slice(0, 10)}`\n );\n console.log(` Depth: ${frameManager.getStackDepth()}`);\n }\n } catch (error) {\n console.error('\u274C Failed to pop context:', (error as Error).message);\n } finally {\n db.close();\n }\n });\n\n // Add event to current context\n context\n .command('add <type> <message>')\n .description(\n 'Add an event to current context (types: observation, decision, error)'\n )\n .action(async (type, message) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, { \n skipContextBridge: true \n });\n\n const activePath = frameManager.getActiveFramePath();\n\n if (activePath.length === 0) {\n console.log('\u26A0\uFE0F No active context frame. Creating one...');\n frameManager.createFrame({\n type: 'task',\n name: 'cli-session',\n inputs: {},\n });\n }\n\n const currentFrame = frameManager.getActiveFramePath().slice(-1)[0];\n\n const validTypes = [\n 'observation',\n 'decision',\n 'error',\n 'action',\n 'result',\n ];\n if (!validTypes.includes(type)) {\n console.log(`\u26A0\uFE0F Unknown event type \"${type}\". Using \"observation\".`);\n type = 'observation';\n }\n\n frameManager.addEvent(\n type,\n { message, content: message },\n currentFrame.frame_id\n );\n\n console.log(\n `\u2705 Added ${type}: ${message.slice(0, 50)}${message.length > 50 ? '...' : ''}`\n );\n } catch (error) {\n console.error('\u274C Failed to add event:', (error as Error).message);\n } finally {\n db.close();\n }\n });\n\n // Worktree integration commands\n context\n .command('worktree [action]')\n .description('Manage Claude worktree contexts')\n .option('-i, --instance <id>', 'Instance ID')\n .option('-b, --branch <name>', 'Branch name')\n .option('-l, --list', 'List worktree contexts')\n .action(async (action, options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, { \n skipContextBridge: true \n });\n\n if (options.list || action === 'list') {\n // List all worktree contexts\n const worktreeFrames = db\n .prepare(\n `\n SELECT * FROM frames \n WHERE project_id = ? \n AND type = 'session' \n AND inputs LIKE '%worktree%'\n ORDER BY created_at DESC\n LIMIT 10\n `\n )\n .all(projectId) as any[];\n\n console.log('\\n\uD83C\uDF33 Worktree Contexts\\n');\n if (worktreeFrames.length === 0) {\n console.log('No worktree contexts found.');\n } else {\n worktreeFrames.forEach((frame) => {\n const inputs = JSON.parse(frame.inputs || '{}');\n const instanceId = inputs.instanceId || 'unknown';\n const branch = inputs.branch || 'unknown';\n const created = new Date(\n frame.created_at * 1000\n ).toLocaleString();\n console.log(`\uD83D\uDCCD ${frame.name || frame.frame_id.slice(0, 10)}`);\n console.log(` Instance: ${instanceId}`);\n console.log(` Branch: ${branch}`);\n console.log(` Created: ${created}`);\n console.log('');\n });\n }\n } else if (action === 'save') {\n // Save current worktree context\n const instanceId = options.instance || process.env.CLAUDE_INSTANCE_ID;\n const branch = options.branch || 'unknown';\n\n if (!instanceId) {\n console.log('\u26A0\uFE0F No instance ID provided or detected.');\n return;\n }\n\n const frameId = frameManager.createFrame({\n type: 'task',\n name: `worktree-${branch}`,\n inputs: {\n worktree: true,\n instanceId,\n branch,\n path: process.cwd(),\n },\n });\n\n console.log(`\u2705 Saved worktree context for ${branch}`);\n console.log(` Instance: ${instanceId}`);\n console.log(` Frame ID: ${frameId.slice(0, 10)}`);\n } else if (action === 'load') {\n // Load worktree context\n const instanceId = options.instance || process.env.CLAUDE_INSTANCE_ID;\n\n if (!instanceId) {\n console.log('\u26A0\uFE0F No instance ID provided.');\n return;\n }\n\n const worktreeFrame = db\n .prepare(\n `\n SELECT * FROM frames \n WHERE project_id = ? \n AND type = 'session' \n AND inputs LIKE ?\n ORDER BY created_at DESC\n LIMIT 1\n `\n )\n .get(projectId, `%\"instanceId\":\"${instanceId}\"%`) as any;\n\n if (worktreeFrame) {\n const inputs = JSON.parse(worktreeFrame.inputs || '{}');\n console.log(`\u2705 Loaded worktree context`);\n console.log(` Branch: ${inputs.branch}`);\n console.log(` Instance: ${inputs.instanceId}`);\n console.log(` Path: ${inputs.path}`);\n } else {\n console.log('\u26A0\uFE0F No worktree context found for this instance.');\n }\n } else {\n console.log('Usage: stackmemory context worktree [save|load|list]');\n }\n } catch (error) {\n console.error(\n '\u274C Failed to manage worktree context:',\n (error as Error).message\n );\n } finally {\n db.close();\n }\n });\n\n return context;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Context Commands for StackMemory CLI\n * Manage context stack (show, push, pop)\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { FrameManager, FrameType } from '../../core/context/frame-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\nexport function createContextCommands(): Command {\n const context = new Command('context')\n .alias('ctx')\n .description('Manage context stack');\n\n // Show current context\n context\n .command('show')\n .alias('status')\n .description('Show current context stack')\n .option('-v, --verbose', 'Show detailed information')\n .action(async (options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n // Get project ID - try metadata table, fallback to default\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(\n `\n SELECT value FROM metadata WHERE key = 'project_id'\n `\n )\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {\n // metadata table doesn't exist, use default\n }\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n\n const depth = frameManager.getStackDepth();\n const activePath = frameManager.getActiveFramePath();\n\n console.log(`\\n\uD83D\uDCDA Context Stack\\n`);\n console.log(`Project: ${projectId}`);\n console.log(`Depth: ${depth}`);\n console.log(`Active frames: ${activePath.length}\\n`);\n\n if (activePath.length === 0) {\n console.log('No active context frames.\\n');\n console.log('Use \"stackmemory context push\" to create one.');\n } else {\n const typeIcon: Record<string, string> = {\n session: '\uD83D\uDD37',\n task: '\uD83D\uDCCB',\n command: '\u26A1',\n file: '\uD83D\uDCC4',\n decision: '\uD83D\uDCA1',\n };\n\n console.log('Stack (bottom to top):');\n activePath.forEach((frame, i) => {\n const icon = typeIcon[frame.type] || '\uD83D\uDCE6';\n const indent = ' '.repeat(i);\n console.log(\n `${indent}${i === activePath.length - 1 ? '\u2514\u2500' : '\u251C\u2500'} ${icon} ${frame.name || frame.frame_id.slice(0, 10)}`\n );\n\n if (options.verbose) {\n console.log(`${indent} ID: ${frame.frame_id}`);\n console.log(`${indent} Type: ${frame.type}`);\n console.log(\n `${indent} Created: ${new Date(frame.created_at * 1000).toLocaleString()}`\n );\n }\n });\n }\n\n console.log('');\n } catch (error: unknown) {\n console.error('\u274C Failed to show context:', (error as Error).message);\n } finally {\n db.close();\n }\n });\n\n // Push new context frame\n context\n .command('push <name>')\n .description('Push a new context frame onto the stack')\n .option(\n '-t, --type <type>',\n 'Frame type (session, task, command, file, decision)',\n 'task'\n )\n .option('-m, --metadata <json>', 'Additional metadata as JSON')\n .action(async (name, options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n\n // Get current top frame as parent\n const activePath = frameManager.getActiveFramePath();\n const parentId =\n activePath.length > 0\n ? activePath[activePath.length - 1].frame_id\n : undefined;\n\n // Parse metadata if provided\n let inputs = {};\n if (options.metadata) {\n try {\n inputs = JSON.parse(options.metadata);\n } catch {\n console.log('\u26A0\uFE0F Invalid metadata JSON, ignoring');\n }\n }\n\n const frameId = frameManager.createFrame({\n type: options.type as FrameType,\n name,\n inputs,\n parentFrameId: parentId,\n });\n\n console.log(`\u2705 Pushed context frame: ${name}`);\n console.log(` ID: ${frameId.slice(0, 10)}`);\n console.log(` Type: ${options.type}`);\n console.log(` Depth: ${frameManager.getStackDepth()}`);\n } catch (error: unknown) {\n console.error('\u274C Failed to push context:', (error as Error).message);\n } finally {\n db.close();\n }\n });\n\n // Pop context frame\n context\n .command('pop')\n .description('Pop the top context frame from the stack')\n .option('-a, --all', 'Pop all frames (clear stack)')\n .action(async (options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n\n const activePath = frameManager.getActiveFramePath();\n\n if (activePath.length === 0) {\n console.log('\uD83D\uDCDA Stack is already empty.');\n return;\n }\n\n if (options.all) {\n // Close all frames from top to bottom\n for (let i = activePath.length - 1; i >= 0; i--) {\n frameManager.closeFrame(activePath[i].frame_id);\n }\n console.log(`\u2705 Cleared all ${activePath.length} context frames.`);\n } else {\n // Close just the top frame\n const topFrame = activePath[activePath.length - 1];\n frameManager.closeFrame(topFrame.frame_id);\n console.log(\n `\u2705 Popped: ${topFrame.name || topFrame.frame_id.slice(0, 10)}`\n );\n console.log(` Depth: ${frameManager.getStackDepth()}`);\n }\n } catch (error: unknown) {\n console.error('\u274C Failed to pop context:', (error as Error).message);\n } finally {\n db.close();\n }\n });\n\n // Add event to current context\n context\n .command('add <type> <message>')\n .description(\n 'Add an event to current context (types: observation, decision, error)'\n )\n .action(async (type, message) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n\n const activePath = frameManager.getActiveFramePath();\n\n if (activePath.length === 0) {\n console.log('\u26A0\uFE0F No active context frame. Creating one...');\n frameManager.createFrame({\n type: 'task',\n name: 'cli-session',\n inputs: {},\n });\n }\n\n const currentFrame = frameManager.getActiveFramePath().slice(-1)[0];\n\n const validTypes = [\n 'observation',\n 'decision',\n 'error',\n 'action',\n 'result',\n ];\n if (!validTypes.includes(type)) {\n console.log(`\u26A0\uFE0F Unknown event type \"${type}\". Using \"observation\".`);\n type = 'observation';\n }\n\n frameManager.addEvent(\n type,\n { message, content: message },\n currentFrame.frame_id\n );\n\n console.log(\n `\u2705 Added ${type}: ${message.slice(0, 50)}${message.length > 50 ? '...' : ''}`\n );\n } catch (error: unknown) {\n console.error('\u274C Failed to add event:', (error as Error).message);\n } finally {\n db.close();\n }\n });\n\n // Worktree integration commands\n context\n .command('worktree [action]')\n .description('Manage Claude worktree contexts')\n .option('-i, --instance <id>', 'Instance ID')\n .option('-b, --branch <name>', 'Branch name')\n .option('-l, --list', 'List worktree contexts')\n .action(async (action, options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const projectRow = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (projectRow?.value) projectId = projectRow.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n\n if (options.list || action === 'list') {\n // List all worktree contexts\n const worktreeFrames = db\n .prepare(\n `\n SELECT * FROM frames \n WHERE project_id = ? \n AND type = 'session' \n AND inputs LIKE '%worktree%'\n ORDER BY created_at DESC\n LIMIT 10\n `\n )\n .all(projectId) as any[];\n\n console.log('\\n\uD83C\uDF33 Worktree Contexts\\n');\n if (worktreeFrames.length === 0) {\n console.log('No worktree contexts found.');\n } else {\n worktreeFrames.forEach((frame) => {\n const inputs = JSON.parse(frame.inputs || '{}');\n const instanceId = inputs.instanceId || 'unknown';\n const branch = inputs.branch || 'unknown';\n const created = new Date(\n frame.created_at * 1000\n ).toLocaleString();\n console.log(`\uD83D\uDCCD ${frame.name || frame.frame_id.slice(0, 10)}`);\n console.log(` Instance: ${instanceId}`);\n console.log(` Branch: ${branch}`);\n console.log(` Created: ${created}`);\n console.log('');\n });\n }\n } else if (action === 'save') {\n // Save current worktree context\n const instanceId =\n options.instance || process.env['CLAUDE_INSTANCE_ID'];\n const branch = options.branch || 'unknown';\n\n if (!instanceId) {\n console.log('\u26A0\uFE0F No instance ID provided or detected.');\n return;\n }\n\n const frameId = frameManager.createFrame({\n type: 'task',\n name: `worktree-${branch}`,\n inputs: {\n worktree: true,\n instanceId,\n branch,\n path: process.cwd(),\n },\n });\n\n console.log(`\u2705 Saved worktree context for ${branch}`);\n console.log(` Instance: ${instanceId}`);\n console.log(` Frame ID: ${frameId.slice(0, 10)}`);\n } else if (action === 'load') {\n // Load worktree context\n const instanceId =\n options.instance || process.env['CLAUDE_INSTANCE_ID'];\n\n if (!instanceId) {\n console.log('\u26A0\uFE0F No instance ID provided.');\n return;\n }\n\n const worktreeFrame = db\n .prepare(\n `\n SELECT * FROM frames \n WHERE project_id = ? \n AND type = 'session' \n AND inputs LIKE ?\n ORDER BY created_at DESC\n LIMIT 1\n `\n )\n .get(projectId, `%\"instanceId\":\"${instanceId}\"%`) as any;\n\n if (worktreeFrame) {\n const inputs = JSON.parse(worktreeFrame.inputs || '{}');\n console.log(`\u2705 Loaded worktree context`);\n console.log(` Branch: ${inputs.branch}`);\n console.log(` Instance: ${inputs.instanceId}`);\n console.log(` Path: ${inputs.path}`);\n } else {\n console.log('\u26A0\uFE0F No worktree context found for this instance.');\n }\n } else {\n console.log('Usage: stackmemory context worktree [save|load|list]');\n }\n } catch (error: unknown) {\n console.error(\n '\u274C Failed to manage worktree context:',\n (error as Error).message\n );\n } finally {\n db.close();\n }\n });\n\n return context;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -25,14 +25,28 @@ const dashboardCommand = {
25
25
  const projectRoot = process.cwd();
26
26
  const dbPath = join(projectRoot, ".stackmemory", "context.db");
27
27
  if (!existsSync(dbPath)) {
28
- console.log('\u274C StackMemory not initialized. Run "stackmemory init" first.');
28
+ console.log(
29
+ '\u274C StackMemory not initialized. Run "stackmemory init" first.'
30
+ );
29
31
  return;
30
32
  }
31
33
  const displayDashboard = async () => {
32
34
  console.clear();
33
- console.log(chalk.cyan.bold("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"));
34
- console.log(chalk.cyan.bold(" \u{1F680} StackMemory Monitoring Dashboard "));
35
- console.log(chalk.cyan.bold("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"));
35
+ console.log(
36
+ chalk.cyan.bold(
37
+ "\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
38
+ )
39
+ );
40
+ console.log(
41
+ chalk.cyan.bold(
42
+ " \u{1F680} StackMemory Monitoring Dashboard "
43
+ )
44
+ );
45
+ console.log(
46
+ chalk.cyan.bold(
47
+ "\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
48
+ )
49
+ );
36
50
  console.log();
37
51
  const sessionManager = new SessionManager({ enableMonitoring: false });
38
52
  await sessionManager.initialize();
@@ -52,8 +66,12 @@ const dashboardCommand = {
52
66
  style: { head: [], border: [] }
53
67
  });
54
68
  sessions.forEach((session) => {
55
- const duration = Math.round((Date.now() - session.startedAt) / 1e3 / 60);
56
- const lastActive = Math.round((Date.now() - session.lastActiveAt) / 1e3 / 60);
69
+ const duration = Math.round(
70
+ (Date.now() - session.startedAt) / 1e3 / 60
71
+ );
72
+ const lastActive = Math.round(
73
+ (Date.now() - session.lastActiveAt) / 1e3 / 60
74
+ );
57
75
  const status = session.state === "active" ? chalk.green("\u25CF Active") : session.state === "completed" ? chalk.gray("\u25CF Completed") : chalk.yellow("\u25CF Idle");
58
76
  sessionsTable.push([
59
77
  session.sessionId.substring(0, 8),
@@ -66,13 +84,15 @@ const dashboardCommand = {
66
84
  console.log(chalk.yellow.bold("\u{1F4CA} Active Sessions"));
67
85
  console.log(sessionsTable.toString());
68
86
  console.log();
69
- const frameStats = db.prepare(`
87
+ const frameStats = db.prepare(
88
+ `
70
89
  SELECT
71
90
  COUNT(*) as total,
72
91
  SUM(CASE WHEN state = 'active' THEN 1 ELSE 0 END) as active,
73
92
  COUNT(DISTINCT run_id) as sessions
74
93
  FROM frames
75
- `).get();
94
+ `
95
+ ).get();
76
96
  const statsTable = new Table({
77
97
  head: [chalk.white("Metric"), chalk.white("Value")],
78
98
  style: { head: [], border: [] }
@@ -85,7 +105,8 @@ const dashboardCommand = {
85
105
  console.log(chalk.yellow.bold("\u{1F4C8} Frame Statistics"));
86
106
  console.log(statsTable.toString());
87
107
  console.log();
88
- const recentActivity = db.prepare(`
108
+ const recentActivity = db.prepare(
109
+ `
89
110
  SELECT
90
111
  name,
91
112
  type,
@@ -94,7 +115,8 @@ const dashboardCommand = {
94
115
  FROM frames
95
116
  ORDER BY created_at DESC
96
117
  LIMIT 5
97
- `).all();
118
+ `
119
+ ).all();
98
120
  if (recentActivity.length > 0) {
99
121
  const activityTable = new Table({
100
122
  head: [
@@ -125,7 +147,11 @@ const dashboardCommand = {
125
147
  console.log();
126
148
  db.close();
127
149
  if (argv.watch) {
128
- console.log(chalk.gray(`Auto-refreshing every ${argv.interval} seconds. Press Ctrl+C to exit.`));
150
+ console.log(
151
+ chalk.gray(
152
+ `Auto-refreshing every ${argv.interval} seconds. Press Ctrl+C to exit.`
153
+ )
154
+ );
129
155
  } else {
130
156
  console.log(chalk.gray("Run with --watch to auto-refresh"));
131
157
  }
@@ -159,14 +185,16 @@ function createProgressBar(value, max) {
159
185
  return color("\u2588".repeat(filled)) + chalk.gray("\u2591".repeat(empty));
160
186
  }
161
187
  async function estimateContextUsage(db) {
162
- const result = db.prepare(`
188
+ const result = db.prepare(
189
+ `
163
190
  SELECT
164
191
  COUNT(*) as frame_count,
165
192
  SUM(LENGTH(inputs)) as input_size,
166
193
  SUM(LENGTH(outputs)) as output_size
167
194
  FROM frames
168
195
  WHERE state = 'active'
169
- `).get();
196
+ `
197
+ ).get();
170
198
  const totalBytes = (result.input_size || 0) + (result.output_size || 0);
171
199
  const estimatedTokens = totalBytes / 4;
172
200
  const maxTokens = 128e3;