@stackmemoryai/stackmemory 0.2.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) hide show
  1. package/dist/agents/core/agent-task-manager.js +512 -0
  2. package/dist/agents/core/agent-task-manager.js.map +7 -0
  3. package/dist/agents/verifiers/base-verifier.js +129 -0
  4. package/dist/agents/verifiers/base-verifier.js.map +7 -0
  5. package/dist/agents/verifiers/formatter-verifier.js +126 -0
  6. package/dist/agents/verifiers/formatter-verifier.js.map +7 -0
  7. package/dist/agents/verifiers/llm-judge.js +248 -0
  8. package/dist/agents/verifiers/llm-judge.js.map +7 -0
  9. package/dist/cli/__tests__/index.test.js +290 -0
  10. package/dist/cli/__tests__/index.test.js.map +7 -0
  11. package/dist/cli/auto-detect.js +317 -0
  12. package/dist/cli/auto-detect.js.map +7 -0
  13. package/dist/cli/browser-test.js +29 -0
  14. package/dist/cli/browser-test.js.map +7 -0
  15. package/dist/cli/claude-sm.js +369 -0
  16. package/dist/cli/claude-sm.js.map +7 -0
  17. package/dist/cli/codex-sm.js +283 -0
  18. package/dist/cli/codex-sm.js.map +7 -0
  19. package/dist/cli/commands/agent.js +286 -0
  20. package/dist/cli/commands/agent.js.map +7 -0
  21. package/dist/cli/commands/config.js +199 -0
  22. package/dist/cli/commands/config.js.map +7 -0
  23. package/dist/cli/commands/context.js +327 -0
  24. package/dist/cli/commands/context.js.map +7 -0
  25. package/dist/cli/commands/handoff.js +191 -0
  26. package/dist/cli/commands/handoff.js.map +7 -0
  27. package/dist/cli/commands/linear-test.js +115 -0
  28. package/dist/cli/commands/linear-test.js.map +7 -0
  29. package/dist/cli/commands/linear.js +378 -0
  30. package/dist/cli/commands/linear.js.map +7 -0
  31. package/dist/cli/commands/log.js +165 -0
  32. package/dist/cli/commands/log.js.map +7 -0
  33. package/dist/cli/commands/onboard.js +349 -0
  34. package/dist/cli/commands/onboard.js.map +7 -0
  35. package/dist/cli/commands/projects.js +195 -0
  36. package/dist/cli/commands/projects.js.map +7 -0
  37. package/dist/cli/commands/search.js +152 -0
  38. package/dist/cli/commands/search.js.map +7 -0
  39. package/dist/cli/commands/session.js +179 -0
  40. package/dist/cli/commands/session.js.map +7 -0
  41. package/dist/cli/commands/tasks.js +205 -0
  42. package/dist/cli/commands/tasks.js.map +7 -0
  43. package/dist/cli/commands/webhook.js +131 -0
  44. package/dist/cli/commands/webhook.js.map +7 -0
  45. package/dist/cli/commands/worktree.js +276 -0
  46. package/dist/cli/commands/worktree.js.map +7 -0
  47. package/dist/cli/index.js +953 -0
  48. package/dist/cli/index.js.map +7 -0
  49. package/dist/cli/utils/viewer.js +92 -0
  50. package/dist/cli/utils/viewer.js.map +7 -0
  51. package/dist/core/config/__tests__/config-manager.test.js +248 -0
  52. package/dist/core/config/__tests__/config-manager.test.js.map +7 -0
  53. package/dist/core/config/config-manager.js +368 -0
  54. package/dist/core/config/config-manager.js.map +7 -0
  55. package/dist/core/config/types.js +140 -0
  56. package/dist/core/config/types.js.map +7 -0
  57. package/dist/core/context/__tests__/frame-manager.test.js +879 -0
  58. package/dist/core/context/__tests__/frame-manager.test.js.map +7 -0
  59. package/dist/core/context/auto-context.js +72 -0
  60. package/dist/core/context/auto-context.js.map +7 -0
  61. package/dist/core/context/compaction-handler.js +326 -0
  62. package/dist/core/context/compaction-handler.js.map +7 -0
  63. package/dist/core/context/frame-database.js +376 -0
  64. package/dist/core/context/frame-database.js.map +7 -0
  65. package/dist/core/context/frame-digest.js +239 -0
  66. package/dist/core/context/frame-digest.js.map +7 -0
  67. package/dist/core/context/frame-manager.js +682 -0
  68. package/dist/core/context/frame-manager.js.map +7 -0
  69. package/dist/core/context/frame-stack.js +270 -0
  70. package/dist/core/context/frame-stack.js.map +7 -0
  71. package/dist/core/context/frame-types.js +1 -0
  72. package/dist/core/context/frame-types.js.map +7 -0
  73. package/dist/core/context/index.js +33 -0
  74. package/dist/core/context/index.js.map +7 -0
  75. package/dist/core/context/model-aware-compaction.js +619 -0
  76. package/dist/core/context/model-aware-compaction.js.map +7 -0
  77. package/dist/core/context/refactored-frame-manager.js +393 -0
  78. package/dist/core/context/refactored-frame-manager.js.map +7 -0
  79. package/dist/core/database/batch-operations.js +329 -0
  80. package/dist/core/database/batch-operations.js.map +7 -0
  81. package/dist/core/database/connection-pool.js +224 -0
  82. package/dist/core/database/connection-pool.js.map +7 -0
  83. package/dist/core/database/query-cache.js +284 -0
  84. package/dist/core/database/query-cache.js.map +7 -0
  85. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +379 -0
  86. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +7 -0
  87. package/dist/core/digest/__tests__/frame-digest-integration.test.js +230 -0
  88. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +7 -0
  89. package/dist/core/digest/enhanced-hybrid-digest.js +267 -0
  90. package/dist/core/digest/enhanced-hybrid-digest.js.map +7 -0
  91. package/dist/core/digest/frame-digest-integration.js +172 -0
  92. package/dist/core/digest/frame-digest-integration.js.map +7 -0
  93. package/dist/core/digest/hybrid-digest-generator.js +549 -0
  94. package/dist/core/digest/hybrid-digest-generator.js.map +7 -0
  95. package/dist/core/digest/index.js +5 -0
  96. package/dist/core/digest/index.js.map +7 -0
  97. package/dist/core/digest/types.js +21 -0
  98. package/dist/core/digest/types.js.map +7 -0
  99. package/dist/core/errors/__tests__/error-handling.test.js +270 -0
  100. package/dist/core/errors/__tests__/error-handling.test.js.map +7 -0
  101. package/dist/core/errors/index.js +239 -0
  102. package/dist/core/errors/index.js.map +7 -0
  103. package/dist/core/errors/recovery.js +258 -0
  104. package/dist/core/errors/recovery.js.map +7 -0
  105. package/dist/core/merge/__tests__/conflict-scenarios.test.js +414 -0
  106. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +7 -0
  107. package/dist/core/merge/conflict-detector.js +424 -0
  108. package/dist/core/merge/conflict-detector.js.map +7 -0
  109. package/dist/core/merge/index.js +5 -0
  110. package/dist/core/merge/index.js.map +7 -0
  111. package/dist/core/merge/resolution-engine.js +565 -0
  112. package/dist/core/merge/resolution-engine.js.map +7 -0
  113. package/dist/core/merge/stack-diff.js +528 -0
  114. package/dist/core/merge/stack-diff.js.map +7 -0
  115. package/dist/core/merge/types.js +1 -0
  116. package/dist/core/merge/types.js.map +7 -0
  117. package/dist/core/monitoring/error-handler.js +278 -0
  118. package/dist/core/monitoring/error-handler.js.map +7 -0
  119. package/dist/core/monitoring/logger.js +115 -0
  120. package/dist/core/monitoring/logger.js.map +7 -0
  121. package/dist/core/monitoring/metrics.js +157 -0
  122. package/dist/core/monitoring/metrics.js.map +7 -0
  123. package/dist/core/monitoring/progress-tracker.js +174 -0
  124. package/dist/core/monitoring/progress-tracker.js.map +7 -0
  125. package/dist/core/performance/context-cache.js +269 -0
  126. package/dist/core/performance/context-cache.js.map +7 -0
  127. package/dist/core/performance/index.js +7 -0
  128. package/dist/core/performance/index.js.map +7 -0
  129. package/dist/core/performance/lazy-context-loader.js +319 -0
  130. package/dist/core/performance/lazy-context-loader.js.map +7 -0
  131. package/dist/core/performance/monitor.js +217 -0
  132. package/dist/core/performance/monitor.js.map +7 -0
  133. package/dist/core/performance/optimized-frame-context.js +326 -0
  134. package/dist/core/performance/optimized-frame-context.js.map +7 -0
  135. package/dist/core/performance/performance-benchmark.js +269 -0
  136. package/dist/core/performance/performance-benchmark.js.map +7 -0
  137. package/dist/core/performance/performance-profiler.js +318 -0
  138. package/dist/core/performance/performance-profiler.js.map +7 -0
  139. package/dist/core/performance/streaming-jsonl-parser.js +187 -0
  140. package/dist/core/performance/streaming-jsonl-parser.js.map +7 -0
  141. package/dist/core/persistence/postgres-adapter.js +345 -0
  142. package/dist/core/persistence/postgres-adapter.js.map +7 -0
  143. package/dist/core/projects/project-manager.js +699 -0
  144. package/dist/core/projects/project-manager.js.map +7 -0
  145. package/dist/core/query/__tests__/query-parser.test.js +301 -0
  146. package/dist/core/query/__tests__/query-parser.test.js.map +7 -0
  147. package/dist/core/query/__tests__/query-templates.test.js +210 -0
  148. package/dist/core/query/__tests__/query-templates.test.js.map +7 -0
  149. package/dist/core/query/query-parser.js +366 -0
  150. package/dist/core/query/query-parser.js.map +7 -0
  151. package/dist/core/query/query-templates.js +317 -0
  152. package/dist/core/query/query-templates.js.map +7 -0
  153. package/dist/core/retrieval/index.js +4 -0
  154. package/dist/core/retrieval/index.js.map +7 -0
  155. package/dist/core/retrieval/llm-context-retrieval.js +577 -0
  156. package/dist/core/retrieval/llm-context-retrieval.js.map +7 -0
  157. package/dist/core/retrieval/summary-generator.js +585 -0
  158. package/dist/core/retrieval/summary-generator.js.map +7 -0
  159. package/dist/core/retrieval/types.js +17 -0
  160. package/dist/core/retrieval/types.js.map +7 -0
  161. package/dist/core/session/index.js +11 -0
  162. package/dist/core/session/index.js.map +7 -0
  163. package/dist/core/session/session-manager.js +297 -0
  164. package/dist/core/session/session-manager.js.map +7 -0
  165. package/dist/core/trace/cli-trace-wrapper.js +110 -0
  166. package/dist/core/trace/cli-trace-wrapper.js.map +7 -0
  167. package/dist/core/trace/db-trace-wrapper.js +215 -0
  168. package/dist/core/trace/db-trace-wrapper.js.map +7 -0
  169. package/dist/core/trace/debug-trace.js +385 -0
  170. package/dist/core/trace/debug-trace.js.map +7 -0
  171. package/dist/core/trace/index.js +158 -0
  172. package/dist/core/trace/index.js.map +7 -0
  173. package/dist/core/trace/linear-api-wrapper.js +169 -0
  174. package/dist/core/trace/linear-api-wrapper.js.map +7 -0
  175. package/dist/core/trace/trace-demo.js +135 -0
  176. package/dist/core/trace/trace-demo.js.map +7 -0
  177. package/dist/core/trace/trace-detector.demo.js +138 -0
  178. package/dist/core/trace/trace-detector.demo.js.map +7 -0
  179. package/dist/core/trace/trace-detector.js +386 -0
  180. package/dist/core/trace/trace-detector.js.map +7 -0
  181. package/dist/core/trace/trace-detector.test.js +401 -0
  182. package/dist/core/trace/trace-detector.test.js.map +7 -0
  183. package/dist/core/trace/trace-store.js +341 -0
  184. package/dist/core/trace/trace-store.js.map +7 -0
  185. package/dist/core/trace/types.js +73 -0
  186. package/dist/core/trace/types.js.map +7 -0
  187. package/dist/core/types.js +1 -0
  188. package/dist/core/types.js.map +7 -0
  189. package/dist/core/utils/update-checker.js +214 -0
  190. package/dist/core/utils/update-checker.js.map +7 -0
  191. package/dist/core/worktree/worktree-manager.js +450 -0
  192. package/dist/core/worktree/worktree-manager.js.map +7 -0
  193. package/dist/features/analytics/api/analytics-api.js +283 -0
  194. package/dist/features/analytics/api/analytics-api.js.map +7 -0
  195. package/dist/features/analytics/core/analytics-service.js +267 -0
  196. package/dist/features/analytics/core/analytics-service.js.map +7 -0
  197. package/dist/features/analytics/index.js +14 -0
  198. package/dist/features/analytics/index.js.map +7 -0
  199. package/dist/features/analytics/queries/metrics-queries.js +273 -0
  200. package/dist/features/analytics/queries/metrics-queries.js.map +7 -0
  201. package/dist/features/analytics/types/metrics.js +1 -0
  202. package/dist/features/analytics/types/metrics.js.map +7 -0
  203. package/dist/features/browser/browser-mcp.js +488 -0
  204. package/dist/features/browser/browser-mcp.js.map +7 -0
  205. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +747 -0
  206. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +7 -0
  207. package/dist/features/tasks/pebbles-task-store.js +647 -0
  208. package/dist/features/tasks/pebbles-task-store.js.map +7 -0
  209. package/dist/features/tasks/task-aware-context.js +406 -0
  210. package/dist/features/tasks/task-aware-context.js.map +7 -0
  211. package/dist/index.js +21 -0
  212. package/dist/index.js.map +7 -0
  213. package/dist/integrations/linear/__tests__/auth.test.js +558 -0
  214. package/dist/integrations/linear/__tests__/auth.test.js.map +7 -0
  215. package/dist/integrations/linear/__tests__/sync-service.test.js +760 -0
  216. package/dist/integrations/linear/__tests__/sync-service.test.js.map +7 -0
  217. package/dist/integrations/linear/auth.js +308 -0
  218. package/dist/integrations/linear/auth.js.map +7 -0
  219. package/dist/integrations/linear/auto-sync.js +244 -0
  220. package/dist/integrations/linear/auto-sync.js.map +7 -0
  221. package/dist/integrations/linear/client.js +448 -0
  222. package/dist/integrations/linear/client.js.map +7 -0
  223. package/dist/integrations/linear/config.js +115 -0
  224. package/dist/integrations/linear/config.js.map +7 -0
  225. package/dist/integrations/linear/sync-manager.js +233 -0
  226. package/dist/integrations/linear/sync-manager.js.map +7 -0
  227. package/dist/integrations/linear/sync-service.js +214 -0
  228. package/dist/integrations/linear/sync-service.js.map +7 -0
  229. package/dist/integrations/linear/sync.js +565 -0
  230. package/dist/integrations/linear/sync.js.map +7 -0
  231. package/dist/integrations/linear/types.js +1 -0
  232. package/dist/integrations/linear/types.js.map +7 -0
  233. package/dist/integrations/linear/webhook-server.js +204 -0
  234. package/dist/integrations/linear/webhook-server.js.map +7 -0
  235. package/dist/integrations/linear/webhook.js +269 -0
  236. package/dist/integrations/linear/webhook.js.map +7 -0
  237. package/dist/integrations/mcp/__tests__/server.test.js +798 -0
  238. package/dist/integrations/mcp/__tests__/server.test.js.map +7 -0
  239. package/dist/integrations/mcp/handlers/context-handlers.js +253 -0
  240. package/dist/integrations/mcp/handlers/context-handlers.js.map +7 -0
  241. package/dist/integrations/mcp/handlers/index.js +134 -0
  242. package/dist/integrations/mcp/handlers/index.js.map +7 -0
  243. package/dist/integrations/mcp/handlers/linear-handlers.js +243 -0
  244. package/dist/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  245. package/dist/integrations/mcp/handlers/task-handlers.js +235 -0
  246. package/dist/integrations/mcp/handlers/task-handlers.js.map +7 -0
  247. package/dist/integrations/mcp/handlers/trace-handlers.js +304 -0
  248. package/dist/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  249. package/dist/integrations/mcp/index.js +19 -0
  250. package/dist/integrations/mcp/index.js.map +7 -0
  251. package/dist/integrations/mcp/refactored-server.js +331 -0
  252. package/dist/integrations/mcp/refactored-server.js.map +7 -0
  253. package/dist/integrations/mcp/server.js +1621 -0
  254. package/dist/integrations/mcp/server.js.map +7 -0
  255. package/dist/integrations/mcp/tool-definitions.js +562 -0
  256. package/dist/integrations/mcp/tool-definitions.js.map +7 -0
  257. package/dist/integrations/mcp/trace-test.js +44 -0
  258. package/dist/integrations/mcp/trace-test.js.map +7 -0
  259. package/dist/integrations/pg-aiguide/embedding-provider.js +174 -0
  260. package/dist/integrations/pg-aiguide/embedding-provider.js.map +7 -0
  261. package/dist/integrations/pg-aiguide/semantic-search.js +183 -0
  262. package/dist/integrations/pg-aiguide/semantic-search.js.map +7 -0
  263. package/dist/integrations/pg-aiguide/timescale-analytics.js +220 -0
  264. package/dist/integrations/pg-aiguide/timescale-analytics.js.map +7 -0
  265. package/dist/mcp/stackmemory-mcp-server.js +550 -0
  266. package/dist/mcp/stackmemory-mcp-server.js.map +7 -0
  267. package/dist/middleware/exponential-rate-limiter.js +285 -0
  268. package/dist/middleware/exponential-rate-limiter.js.map +7 -0
  269. package/dist/models/user.model.js +351 -0
  270. package/dist/models/user.model.js.map +7 -0
  271. package/dist/scripts/benchmark-performance.d.ts +7 -0
  272. package/dist/scripts/benchmark-performance.d.ts.map +1 -0
  273. package/dist/scripts/benchmark-performance.js +44 -0
  274. package/dist/scripts/benchmark-performance.js.map +1 -0
  275. package/dist/scripts/cleanup-duplicate-tasks.d.ts +12 -0
  276. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +1 -0
  277. package/dist/scripts/cleanup-duplicate-tasks.js +215 -0
  278. package/dist/scripts/cleanup-duplicate-tasks.js.map +1 -0
  279. package/dist/servers/production/auth-middleware.js +513 -0
  280. package/dist/servers/production/auth-middleware.js.map +7 -0
  281. package/dist/servers/railway/index.js +390 -0
  282. package/dist/servers/railway/index.js.map +7 -0
  283. package/dist/services/config-service.js +62 -0
  284. package/dist/services/config-service.js.map +7 -0
  285. package/dist/services/context-service.js +191 -0
  286. package/dist/services/context-service.js.map +7 -0
  287. package/dist/src/agents/core/agent-task-manager.d.ts +154 -0
  288. package/dist/src/agents/core/agent-task-manager.d.ts.map +1 -0
  289. package/dist/src/agents/core/agent-task-manager.js +504 -0
  290. package/dist/src/agents/core/agent-task-manager.js.map +1 -0
  291. package/dist/src/agents/verifiers/base-verifier.d.ts +112 -0
  292. package/dist/src/agents/verifiers/base-verifier.d.ts.map +1 -0
  293. package/dist/src/agents/verifiers/base-verifier.js +130 -0
  294. package/dist/src/agents/verifiers/base-verifier.js.map +1 -0
  295. package/dist/src/agents/verifiers/formatter-verifier.d.ts +14 -0
  296. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +1 -0
  297. package/dist/src/agents/verifiers/formatter-verifier.js +107 -0
  298. package/dist/src/agents/verifiers/formatter-verifier.js.map +1 -0
  299. package/dist/src/agents/verifiers/llm-judge.d.ts +46 -0
  300. package/dist/src/agents/verifiers/llm-judge.d.ts.map +1 -0
  301. package/dist/src/agents/verifiers/llm-judge.js +248 -0
  302. package/dist/src/agents/verifiers/llm-judge.js.map +1 -0
  303. package/dist/src/cli/claude-sm.js +55 -0
  304. package/dist/src/cli/claude-sm.js.map +1 -1
  305. package/dist/src/cli/commands/agent.d.ts +9 -0
  306. package/dist/src/cli/commands/agent.d.ts.map +1 -0
  307. package/dist/src/cli/commands/agent.js +303 -0
  308. package/dist/src/cli/commands/agent.js.map +1 -0
  309. package/dist/src/cli/commands/handoff.d.ts +6 -0
  310. package/dist/src/cli/commands/handoff.d.ts.map +1 -0
  311. package/dist/src/cli/commands/handoff.js +212 -0
  312. package/dist/src/cli/commands/handoff.js.map +1 -0
  313. package/dist/src/cli/index.d.ts.map +1 -1
  314. package/dist/src/cli/index.js +4 -0
  315. package/dist/src/cli/index.js.map +1 -1
  316. package/dist/src/core/context/frame-database.d.ts +59 -0
  317. package/dist/src/core/context/frame-database.d.ts.map +1 -0
  318. package/dist/src/core/context/frame-database.js +333 -0
  319. package/dist/src/core/context/frame-database.js.map +1 -0
  320. package/dist/src/core/context/frame-digest.d.ts +59 -0
  321. package/dist/src/core/context/frame-digest.d.ts.map +1 -0
  322. package/dist/src/core/context/frame-digest.js +264 -0
  323. package/dist/src/core/context/frame-digest.js.map +1 -0
  324. package/dist/src/core/context/frame-manager.d.ts +2 -0
  325. package/dist/src/core/context/frame-manager.d.ts.map +1 -1
  326. package/dist/src/core/context/frame-manager.js +7 -0
  327. package/dist/src/core/context/frame-manager.js.map +1 -1
  328. package/dist/src/core/context/frame-stack.d.ts +85 -0
  329. package/dist/src/core/context/frame-stack.d.ts.map +1 -0
  330. package/dist/src/core/context/frame-stack.js +287 -0
  331. package/dist/src/core/context/frame-stack.js.map +1 -0
  332. package/dist/src/core/context/frame-types.d.ts +67 -0
  333. package/dist/src/core/context/frame-types.d.ts.map +1 -0
  334. package/dist/src/core/context/frame-types.js +6 -0
  335. package/dist/src/core/context/frame-types.js.map +1 -0
  336. package/dist/src/core/context/index.d.ts +11 -0
  337. package/dist/src/core/context/index.d.ts.map +1 -0
  338. package/dist/src/core/context/index.js +14 -0
  339. package/dist/src/core/context/index.js.map +1 -0
  340. package/dist/src/core/context/refactored-frame-manager.d.ts +99 -0
  341. package/dist/src/core/context/refactored-frame-manager.d.ts.map +1 -0
  342. package/dist/src/core/context/refactored-frame-manager.js +340 -0
  343. package/dist/src/core/context/refactored-frame-manager.js.map +1 -0
  344. package/dist/src/core/database/batch-operations.d.ts +118 -0
  345. package/dist/src/core/database/batch-operations.d.ts.map +1 -0
  346. package/dist/src/core/database/batch-operations.js +339 -0
  347. package/dist/src/core/database/batch-operations.js.map +1 -0
  348. package/dist/src/core/database/connection-pool.d.ts +79 -0
  349. package/dist/src/core/database/connection-pool.d.ts.map +1 -0
  350. package/dist/src/core/database/connection-pool.js +236 -0
  351. package/dist/src/core/database/connection-pool.js.map +1 -0
  352. package/dist/src/core/database/query-cache.d.ts +135 -0
  353. package/dist/src/core/database/query-cache.d.ts.map +1 -0
  354. package/dist/src/core/database/query-cache.js +294 -0
  355. package/dist/src/core/database/query-cache.js.map +1 -0
  356. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +125 -0
  357. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +1 -0
  358. package/dist/src/core/digest/enhanced-hybrid-digest.js +282 -0
  359. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +1 -0
  360. package/dist/src/core/digest/frame-digest-integration.d.ts +67 -0
  361. package/dist/src/core/digest/frame-digest-integration.d.ts.map +1 -0
  362. package/dist/src/core/digest/frame-digest-integration.js +198 -0
  363. package/dist/src/core/digest/frame-digest-integration.js.map +1 -0
  364. package/dist/src/core/digest/hybrid-digest-generator.d.ts +3 -3
  365. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -1
  366. package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -1
  367. package/dist/src/core/digest/index.d.ts +3 -1
  368. package/dist/src/core/digest/index.d.ts.map +1 -1
  369. package/dist/src/core/digest/index.js +3 -1
  370. package/dist/src/core/digest/index.js.map +1 -1
  371. package/dist/src/core/errors/index.d.ts +13 -5
  372. package/dist/src/core/errors/index.d.ts.map +1 -1
  373. package/dist/src/core/errors/index.js +13 -5
  374. package/dist/src/core/errors/index.js.map +1 -1
  375. package/dist/src/core/merge/conflict-detector.d.ts +122 -0
  376. package/dist/src/core/merge/conflict-detector.d.ts.map +1 -0
  377. package/dist/src/core/merge/conflict-detector.js +468 -0
  378. package/dist/src/core/merge/conflict-detector.js.map +1 -0
  379. package/dist/src/core/merge/index.d.ts +9 -0
  380. package/dist/src/core/merge/index.d.ts.map +1 -0
  381. package/dist/src/core/merge/index.js +9 -0
  382. package/dist/src/core/merge/index.js.map +1 -0
  383. package/dist/src/core/merge/resolution-engine.d.ts +120 -0
  384. package/dist/src/core/merge/resolution-engine.d.ts.map +1 -0
  385. package/dist/src/core/merge/resolution-engine.js +573 -0
  386. package/dist/src/core/merge/resolution-engine.js.map +1 -0
  387. package/dist/src/core/merge/stack-diff.d.ts +97 -0
  388. package/dist/src/core/merge/stack-diff.d.ts.map +1 -0
  389. package/dist/src/core/merge/stack-diff.js +516 -0
  390. package/dist/src/core/merge/stack-diff.js.map +1 -0
  391. package/dist/src/core/merge/types.d.ts +110 -0
  392. package/dist/src/core/merge/types.d.ts.map +1 -0
  393. package/dist/src/core/merge/types.js +6 -0
  394. package/dist/src/core/merge/types.js.map +1 -0
  395. package/dist/src/core/performance/context-cache.d.ts +109 -0
  396. package/dist/src/core/performance/context-cache.d.ts.map +1 -0
  397. package/dist/src/core/performance/context-cache.js +280 -0
  398. package/dist/src/core/performance/context-cache.js.map +1 -0
  399. package/dist/src/core/performance/index.d.ts +3 -0
  400. package/dist/src/core/performance/index.d.ts.map +1 -0
  401. package/dist/src/core/performance/index.js +3 -0
  402. package/dist/src/core/performance/index.js.map +1 -0
  403. package/dist/src/core/performance/lazy-context-loader.d.ts +93 -0
  404. package/dist/src/core/performance/lazy-context-loader.d.ts.map +1 -0
  405. package/dist/src/core/performance/lazy-context-loader.js +332 -0
  406. package/dist/src/core/performance/lazy-context-loader.js.map +1 -0
  407. package/dist/src/core/performance/monitor.d.ts +48 -0
  408. package/dist/src/core/performance/monitor.d.ts.map +1 -0
  409. package/dist/src/core/performance/monitor.js +226 -0
  410. package/dist/src/core/performance/monitor.js.map +1 -0
  411. package/dist/src/core/performance/optimized-frame-context.d.ts +74 -0
  412. package/dist/src/core/performance/optimized-frame-context.d.ts.map +1 -0
  413. package/dist/src/core/performance/optimized-frame-context.js +330 -0
  414. package/dist/src/core/performance/optimized-frame-context.js.map +1 -0
  415. package/dist/src/core/performance/performance-benchmark.d.ts +50 -0
  416. package/dist/src/core/performance/performance-benchmark.d.ts.map +1 -0
  417. package/dist/src/core/performance/performance-benchmark.js +290 -0
  418. package/dist/src/core/performance/performance-benchmark.js.map +1 -0
  419. package/dist/src/core/performance/performance-profiler.d.ts +151 -0
  420. package/dist/src/core/performance/performance-profiler.d.ts.map +1 -0
  421. package/dist/src/core/performance/performance-profiler.js +346 -0
  422. package/dist/src/core/performance/performance-profiler.js.map +1 -0
  423. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +41 -0
  424. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +1 -0
  425. package/dist/src/core/performance/streaming-jsonl-parser.js +193 -0
  426. package/dist/src/core/performance/streaming-jsonl-parser.js.map +1 -0
  427. package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -1
  428. package/dist/src/core/persistence/postgres-adapter.js +18 -4
  429. package/dist/src/core/persistence/postgres-adapter.js.map +1 -1
  430. package/dist/src/core/query/query-parser.d.ts +5 -0
  431. package/dist/src/core/query/query-parser.d.ts.map +1 -1
  432. package/dist/src/core/query/query-parser.js +86 -18
  433. package/dist/src/core/query/query-parser.js.map +1 -1
  434. package/dist/src/core/query/query-templates.d.ts +44 -0
  435. package/dist/src/core/query/query-templates.d.ts.map +1 -0
  436. package/dist/src/core/query/query-templates.js +326 -0
  437. package/dist/src/core/query/query-templates.js.map +1 -0
  438. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +5 -3
  439. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -1
  440. package/dist/src/core/retrieval/llm-context-retrieval.js +73 -21
  441. package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -1
  442. package/dist/src/core/trace/cli-trace-wrapper.d.ts +23 -0
  443. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +1 -0
  444. package/dist/src/core/trace/cli-trace-wrapper.js +141 -0
  445. package/dist/src/core/trace/cli-trace-wrapper.js.map +1 -0
  446. package/dist/src/core/trace/db-trace-wrapper.d.ts +36 -0
  447. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +1 -0
  448. package/dist/src/core/trace/db-trace-wrapper.js +252 -0
  449. package/dist/src/core/trace/db-trace-wrapper.js.map +1 -0
  450. package/dist/src/core/trace/debug-trace.d.ts +84 -0
  451. package/dist/src/core/trace/debug-trace.d.ts.map +1 -0
  452. package/dist/src/core/trace/debug-trace.js +402 -0
  453. package/dist/src/core/trace/debug-trace.js.map +1 -0
  454. package/dist/src/core/trace/error-test.d.ts +6 -0
  455. package/dist/src/core/trace/error-test.d.ts.map +1 -0
  456. package/dist/src/core/trace/error-test.js +128 -0
  457. package/dist/src/core/trace/error-test.js.map +1 -0
  458. package/dist/src/core/trace/index.d.ts +25 -0
  459. package/dist/src/core/trace/index.d.ts.map +1 -0
  460. package/dist/src/core/trace/index.js +121 -0
  461. package/dist/src/core/trace/index.js.map +1 -0
  462. package/dist/src/core/trace/linear-api-wrapper.d.ts +17 -0
  463. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +1 -0
  464. package/dist/src/core/trace/linear-api-wrapper.js +205 -0
  465. package/dist/src/core/trace/linear-api-wrapper.js.map +1 -0
  466. package/dist/src/core/trace/performance-test.d.ts +6 -0
  467. package/dist/src/core/trace/performance-test.d.ts.map +1 -0
  468. package/dist/src/core/trace/performance-test.js +111 -0
  469. package/dist/src/core/trace/performance-test.js.map +1 -0
  470. package/dist/src/core/trace/trace-demo.d.ts +8 -0
  471. package/dist/src/core/trace/trace-demo.d.ts.map +1 -0
  472. package/dist/src/core/trace/trace-demo.js +154 -0
  473. package/dist/src/core/trace/trace-demo.js.map +1 -0
  474. package/dist/src/core/trace/trace-detector.d.ts +2 -2
  475. package/dist/src/core/trace/trace-detector.d.ts.map +1 -1
  476. package/dist/src/core/trace/trace-detector.demo.js +1 -1
  477. package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
  478. package/dist/src/core/trace/trace-detector.js +3 -3
  479. package/dist/src/core/trace/trace-detector.js.map +1 -1
  480. package/dist/src/features/tasks/pebbles-task-store.d.ts +9 -2
  481. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
  482. package/dist/src/features/tasks/pebbles-task-store.js +97 -18
  483. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
  484. package/dist/src/integrations/linear/auth.d.ts.map +1 -1
  485. package/dist/src/integrations/linear/auth.js.map +1 -1
  486. package/dist/src/integrations/linear/client.d.ts +15 -1
  487. package/dist/src/integrations/linear/client.d.ts.map +1 -1
  488. package/dist/src/integrations/linear/client.js +85 -3
  489. package/dist/src/integrations/linear/client.js.map +1 -1
  490. package/dist/src/integrations/linear/sync-manager.d.ts +2 -0
  491. package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -1
  492. package/dist/src/integrations/linear/sync-manager.js +16 -4
  493. package/dist/src/integrations/linear/sync-manager.js.map +1 -1
  494. package/dist/src/integrations/linear/sync-service.d.ts +23 -2
  495. package/dist/src/integrations/linear/sync-service.d.ts.map +1 -1
  496. package/dist/src/integrations/linear/sync-service.js +44 -25
  497. package/dist/src/integrations/linear/sync-service.js.map +1 -1
  498. package/dist/src/integrations/linear/sync.d.ts +6 -0
  499. package/dist/src/integrations/linear/sync.d.ts.map +1 -1
  500. package/dist/src/integrations/linear/sync.js +27 -2
  501. package/dist/src/integrations/linear/sync.js.map +1 -1
  502. package/dist/src/integrations/linear/types.d.ts +16 -1
  503. package/dist/src/integrations/linear/types.d.ts.map +1 -1
  504. package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -1
  505. package/dist/src/integrations/linear/webhook-server.js +10 -8
  506. package/dist/src/integrations/linear/webhook-server.js.map +1 -1
  507. package/dist/src/integrations/linear/webhook.d.ts +13 -0
  508. package/dist/src/integrations/linear/webhook.d.ts.map +1 -1
  509. package/dist/src/integrations/linear/webhook.js +101 -14
  510. package/dist/src/integrations/linear/webhook.js.map +1 -1
  511. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +39 -0
  512. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +1 -0
  513. package/dist/src/integrations/mcp/handlers/context-handlers.js +266 -0
  514. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +1 -0
  515. package/dist/src/integrations/mcp/handlers/index.d.ts +37 -0
  516. package/dist/src/integrations/mcp/handlers/index.d.ts.map +1 -0
  517. package/dist/src/integrations/mcp/handlers/index.js +134 -0
  518. package/dist/src/integrations/mcp/handlers/index.js.map +1 -0
  519. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +33 -0
  520. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +1 -0
  521. package/dist/src/integrations/mcp/handlers/linear-handlers.js +251 -0
  522. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +1 -0
  523. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +42 -0
  524. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +1 -0
  525. package/dist/src/integrations/mcp/handlers/task-handlers.js +238 -0
  526. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +1 -0
  527. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +41 -0
  528. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +1 -0
  529. package/dist/src/integrations/mcp/handlers/trace-handlers.js +298 -0
  530. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +1 -0
  531. package/dist/src/integrations/mcp/index.d.ts +13 -0
  532. package/dist/src/integrations/mcp/index.d.ts.map +1 -0
  533. package/dist/src/integrations/mcp/index.js +17 -0
  534. package/dist/src/integrations/mcp/index.js.map +1 -0
  535. package/dist/src/integrations/mcp/refactored-server.d.ts +76 -0
  536. package/dist/src/integrations/mcp/refactored-server.d.ts.map +1 -0
  537. package/dist/src/integrations/mcp/refactored-server.js +351 -0
  538. package/dist/src/integrations/mcp/refactored-server.js.map +1 -0
  539. package/dist/src/integrations/mcp/tool-definitions.d.ts +44 -0
  540. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +1 -0
  541. package/dist/src/integrations/mcp/tool-definitions.js +563 -0
  542. package/dist/src/integrations/mcp/tool-definitions.js.map +1 -0
  543. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -1
  544. package/dist/src/integrations/pg-aiguide/semantic-search.js +43 -21
  545. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -1
  546. package/dist/src/mcp/stackmemory-mcp-server.d.ts +9 -0
  547. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +1 -0
  548. package/dist/src/mcp/stackmemory-mcp-server.js +519 -0
  549. package/dist/src/mcp/stackmemory-mcp-server.js.map +1 -0
  550. package/dist/src/middleware/exponential-rate-limiter.d.ts +78 -0
  551. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +1 -0
  552. package/dist/src/middleware/exponential-rate-limiter.js +293 -0
  553. package/dist/src/middleware/exponential-rate-limiter.js.map +1 -0
  554. package/dist/src/models/user.model.d.ts +8 -1
  555. package/dist/src/models/user.model.d.ts.map +1 -1
  556. package/dist/src/models/user.model.js +62 -14
  557. package/dist/src/models/user.model.js.map +1 -1
  558. package/dist/src/servers/production/auth-middleware.d.ts +5 -2
  559. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
  560. package/dist/src/servers/production/auth-middleware.js +71 -34
  561. package/dist/src/servers/production/auth-middleware.js.map +1 -1
  562. package/dist/src/services/context-service.d.ts.map +1 -1
  563. package/dist/src/services/context-service.js +86 -1
  564. package/dist/src/services/context-service.js.map +1 -1
  565. package/dist/src/validation/schemas.d.ts +633 -0
  566. package/dist/src/validation/schemas.d.ts.map +1 -0
  567. package/dist/src/validation/schemas.js +347 -0
  568. package/dist/src/validation/schemas.js.map +1 -0
  569. package/dist/types/task.js +1 -0
  570. package/dist/types/task.js.map +7 -0
  571. package/dist/utils/logger.js +52 -0
  572. package/dist/utils/logger.js.map +7 -0
  573. package/dist/validation/schemas.js +218 -0
  574. package/dist/validation/schemas.js.map +7 -0
  575. package/package.json +7 -3
@@ -0,0 +1,378 @@
1
+ import chalk from "chalk";
2
+ import {
3
+ LinearAuthManager,
4
+ LinearOAuthSetup
5
+ } from "../../integrations/linear/auth.js";
6
+ import {
7
+ LinearSyncEngine,
8
+ DEFAULT_SYNC_CONFIG
9
+ } from "../../integrations/linear/sync.js";
10
+ import {
11
+ LinearSyncManager,
12
+ DEFAULT_SYNC_MANAGER_CONFIG
13
+ } from "../../integrations/linear/sync-manager.js";
14
+ import { LinearConfigManager } from "../../integrations/linear/config.js";
15
+ import { PebblesTaskStore } from "../../features/tasks/pebbles-task-store.js";
16
+ import { LinearClient } from "../../integrations/linear/client.js";
17
+ import Database from "better-sqlite3";
18
+ import { join } from "path";
19
+ import { existsSync } from "fs";
20
+ import { logger } from "../../core/monitoring/logger.js";
21
+ import Table from "cli-table3";
22
+ function displaySyncResult(result) {
23
+ if (result.success) {
24
+ console.log(chalk.green("\u2713 Sync completed successfully"));
25
+ } else {
26
+ console.log(chalk.yellow("\u26A0 Sync completed with issues"));
27
+ }
28
+ if (result.synced.toLinear > 0 || result.synced.fromLinear > 0 || result.synced.updated > 0) {
29
+ console.log(chalk.cyan(" \u{1F4CA} Summary:"));
30
+ if (result.synced.toLinear > 0) {
31
+ console.log(` \u2192 Linear: ${result.synced.toLinear} tasks`);
32
+ }
33
+ if (result.synced.fromLinear > 0) {
34
+ console.log(` \u2190 Linear: ${result.synced.fromLinear} tasks`);
35
+ }
36
+ if (result.synced.updated > 0) {
37
+ console.log(` \u2194 Updated: ${result.synced.updated} tasks`);
38
+ }
39
+ }
40
+ if (result.conflicts.length > 0) {
41
+ console.log(chalk.yellow(` \u26A0 Conflicts: ${result.conflicts.length}`));
42
+ result.conflicts.slice(0, 3).forEach((conflict) => {
43
+ console.log(` - ${conflict.reason}`);
44
+ });
45
+ if (result.conflicts.length > 3) {
46
+ console.log(` ... and ${result.conflicts.length - 3} more`);
47
+ }
48
+ }
49
+ if (result.errors.length > 0) {
50
+ console.log(chalk.red(` \u274C Errors: ${result.errors.length}`));
51
+ result.errors.slice(0, 3).forEach((error) => {
52
+ console.log(` - ${error.substring(0, 80)}`);
53
+ });
54
+ if (result.errors.length > 3) {
55
+ console.log(` ... and ${result.errors.length - 3} more`);
56
+ }
57
+ }
58
+ }
59
+ function registerLinearCommands(parent) {
60
+ const linear = parent.command("linear").description("Linear API integration commands");
61
+ linear.command("auth").description("Authenticate with Linear").option("--api-key <key>", "Use API key instead of OAuth").action(async (options) => {
62
+ try {
63
+ if (options.apiKey) {
64
+ process.env.LINEAR_API_KEY = options.apiKey;
65
+ console.log(chalk.green("\u2713 Linear API key set"));
66
+ const client = new LinearClient({ apiKey: options.apiKey });
67
+ const user = await client.getViewer();
68
+ if (user) {
69
+ console.log(
70
+ chalk.cyan(`Connected as: ${user.name} (${user.email})`)
71
+ );
72
+ }
73
+ } else {
74
+ const authManager = new LinearAuthManager(process.cwd());
75
+ const setup = new LinearOAuthSetup(process.cwd());
76
+ const authResult = await setup.setupInteractive();
77
+ if (authResult.authUrl) {
78
+ console.log(chalk.cyan("\n\u{1F517} Open this URL in your browser:"));
79
+ console.log(authResult.authUrl);
80
+ console.log(
81
+ chalk.gray("\nFollow the instructions to complete authentication")
82
+ );
83
+ }
84
+ if (authResult.instructions) {
85
+ console.log(chalk.yellow("\n\u{1F4DD} Instructions:"));
86
+ authResult.instructions.forEach((instruction) => {
87
+ console.log(` ${instruction}`);
88
+ });
89
+ }
90
+ }
91
+ } catch (error) {
92
+ console.error(
93
+ chalk.red("Authentication failed:"),
94
+ error.message
95
+ );
96
+ process.exit(1);
97
+ }
98
+ });
99
+ linear.command("sync").description("Sync tasks with Linear").option(
100
+ "-d, --direction <dir>",
101
+ "Sync direction: bidirectional, to_linear, from_linear",
102
+ "bidirectional"
103
+ ).option("-t, --team <id>", "Default Linear team ID").option("--dry-run", "Preview sync without making changes").option("--daemon", "Run in daemon mode with periodic sync").option(
104
+ "-i, --interval <minutes>",
105
+ "Sync interval in minutes (default: 15)"
106
+ ).action(async (options) => {
107
+ try {
108
+ const projectRoot = process.cwd();
109
+ const dbPath = join(projectRoot, ".stackmemory", "context.db");
110
+ if (!existsSync(dbPath)) {
111
+ console.log(chalk.red("\u274C StackMemory not initialized"));
112
+ return;
113
+ }
114
+ const db = new Database(dbPath);
115
+ const taskStore = new PebblesTaskStore(projectRoot, db);
116
+ const authManager = new LinearAuthManager(projectRoot);
117
+ const config = {
118
+ ...DEFAULT_SYNC_CONFIG,
119
+ direction: options.direction,
120
+ defaultTeamId: options.team,
121
+ enabled: true
122
+ };
123
+ if (options.daemon) {
124
+ const managerConfig = {
125
+ ...DEFAULT_SYNC_MANAGER_CONFIG,
126
+ ...config,
127
+ autoSyncInterval: parseInt(options.interval) || 15
128
+ };
129
+ const syncManager = new LinearSyncManager(
130
+ taskStore,
131
+ authManager,
132
+ managerConfig,
133
+ projectRoot
134
+ );
135
+ console.log(chalk.green("\u{1F680} Starting Linear sync daemon"));
136
+ console.log(
137
+ chalk.cyan(
138
+ ` Sync interval: ${managerConfig.autoSyncInterval} minutes`
139
+ )
140
+ );
141
+ console.log(chalk.cyan(` Direction: ${managerConfig.direction}`));
142
+ console.log(chalk.gray(" Press Ctrl+C to stop\n"));
143
+ const initialResult = await syncManager.syncOnStart();
144
+ if (initialResult) {
145
+ displaySyncResult(initialResult);
146
+ }
147
+ syncManager.on("sync:started", ({ trigger }) => {
148
+ console.log(
149
+ chalk.yellow(
150
+ `
151
+ \u{1F504} ${(/* @__PURE__ */ new Date()).toLocaleTimeString()} - Starting ${trigger} sync...`
152
+ )
153
+ );
154
+ });
155
+ syncManager.on("sync:completed", ({ result }) => {
156
+ displaySyncResult(result);
157
+ });
158
+ syncManager.on("sync:failed", ({ result }) => {
159
+ console.log(chalk.red("\u274C Sync failed"));
160
+ if (result.errors.length > 0) {
161
+ result.errors.forEach((error) => {
162
+ console.log(chalk.red(` - ${error}`));
163
+ });
164
+ }
165
+ });
166
+ process.on("SIGINT", async () => {
167
+ console.log(chalk.yellow("\n\u23F9 Stopping sync daemon..."));
168
+ await syncManager.syncOnEnd();
169
+ syncManager.stop();
170
+ db.close();
171
+ process.exit(0);
172
+ });
173
+ process.stdin.resume();
174
+ } else {
175
+ const syncEngine = new LinearSyncEngine(
176
+ taskStore,
177
+ authManager,
178
+ config
179
+ );
180
+ console.log(chalk.yellow("\u{1F504} Syncing with Linear..."));
181
+ if (options.dryRun) {
182
+ console.log(chalk.gray("(Dry run - no changes will be made)"));
183
+ }
184
+ const result = await syncEngine.sync();
185
+ displaySyncResult(result);
186
+ db.close();
187
+ }
188
+ } catch (error) {
189
+ logger.error("Sync failed", error);
190
+ console.error(chalk.red("Sync failed:"), error.message);
191
+ process.exit(1);
192
+ }
193
+ });
194
+ linear.command("status").description("Show Linear sync status").action(async () => {
195
+ try {
196
+ const authManager = new LinearAuthManager(process.cwd());
197
+ const tokens = authManager.loadTokens();
198
+ const apiKey = process.env.LINEAR_API_KEY;
199
+ if (!tokens && !apiKey) {
200
+ console.log(chalk.yellow("\u26A0 Not authenticated with Linear"));
201
+ console.log('Run "stackmemory linear auth" to connect');
202
+ return;
203
+ }
204
+ const client = apiKey ? new LinearClient({ apiKey }) : new LinearClient({
205
+ apiKey: tokens.accessToken
206
+ });
207
+ const user = await client.getViewer();
208
+ if (user) {
209
+ console.log(chalk.green("\u2713 Connected to Linear"));
210
+ console.log(chalk.cyan(` User: ${user.name} (${user.email})`));
211
+ const teams = await client.getTeams();
212
+ if (teams && teams.length > 0) {
213
+ console.log(chalk.cyan("\n\u{1F4CB} Teams:"));
214
+ teams.forEach((team) => {
215
+ console.log(` - ${team.name} (${team.key})`);
216
+ });
217
+ }
218
+ } else {
219
+ console.log(chalk.red("\u274C Could not connect to Linear"));
220
+ }
221
+ } catch (error) {
222
+ console.error(
223
+ chalk.red("Status check failed:"),
224
+ error.message
225
+ );
226
+ }
227
+ });
228
+ linear.command("tasks").description("List Linear tasks").option("--limit <n>", "Number of tasks to show", "10").action(async (options) => {
229
+ try {
230
+ const authManager = new LinearAuthManager(process.cwd());
231
+ const tokens = authManager.loadTokens();
232
+ const apiKey = process.env.LINEAR_API_KEY;
233
+ if (!tokens && !apiKey) {
234
+ console.log(chalk.yellow("\u26A0 Not authenticated with Linear"));
235
+ return;
236
+ }
237
+ const client = apiKey ? new LinearClient({ apiKey }) : new LinearClient({
238
+ apiKey: tokens.accessToken
239
+ });
240
+ const issues = await client.getIssues({
241
+ limit: parseInt(options.limit)
242
+ });
243
+ if (!issues || issues.length === 0) {
244
+ console.log(chalk.gray("No issues found"));
245
+ return;
246
+ }
247
+ const table = new Table({
248
+ head: ["ID", "Title", "State", "Priority", "Assignee"],
249
+ style: { head: ["cyan"] }
250
+ });
251
+ issues.forEach((issue) => {
252
+ table.push([
253
+ issue.identifier,
254
+ issue.title.substring(0, 40) + (issue.title.length > 40 ? "..." : ""),
255
+ issue.state?.name || "-",
256
+ issue.priority ? `P${issue.priority}` : "-",
257
+ issue.assignee?.name || "-"
258
+ ]);
259
+ });
260
+ console.log(table.toString());
261
+ console.log(chalk.gray(`
262
+ Showing ${issues.length} issues`));
263
+ } catch (error) {
264
+ console.error(
265
+ chalk.red("Failed to list tasks:"),
266
+ error.message
267
+ );
268
+ }
269
+ });
270
+ linear.command("update <issueId>").description("Update Linear task status").option(
271
+ "-s, --status <status>",
272
+ "New status (todo, in-progress, done, canceled)"
273
+ ).option("-t, --title <title>", "Update task title").option("-d, --description <desc>", "Update task description").option(
274
+ "-p, --priority <priority>",
275
+ "Set priority (1=urgent, 2=high, 3=medium, 4=low)"
276
+ ).action(async (issueId, options) => {
277
+ try {
278
+ const authManager = new LinearAuthManager(process.cwd());
279
+ const tokens = authManager.loadTokens();
280
+ if (!tokens) {
281
+ console.error(
282
+ chalk.red("Not authenticated. Run: stackmemory linear auth")
283
+ );
284
+ return;
285
+ }
286
+ const client = new LinearClient({
287
+ apiKey: tokens.accessToken
288
+ });
289
+ let issue = await client.getIssue(issueId);
290
+ if (!issue) {
291
+ issue = await client.findIssueByIdentifier(issueId);
292
+ }
293
+ if (!issue) {
294
+ console.error(chalk.red(`Issue ${issueId} not found`));
295
+ return;
296
+ }
297
+ const updates = {};
298
+ if (options.status) {
299
+ const team = await client.getTeam();
300
+ const states = await client.getWorkflowStates(team.id);
301
+ const statusMap = {
302
+ todo: "unstarted",
303
+ "in-progress": "started",
304
+ done: "completed",
305
+ canceled: "cancelled"
306
+ };
307
+ const targetType = statusMap[options.status.toLowerCase()] || options.status;
308
+ const targetState = states.find((s) => s.type === targetType);
309
+ if (!targetState) {
310
+ console.error(chalk.red(`Invalid status: ${options.status}`));
311
+ console.log(chalk.gray("Available states:"));
312
+ states.forEach(
313
+ (s) => console.log(chalk.gray(` - ${s.name} (${s.type})`))
314
+ );
315
+ return;
316
+ }
317
+ updates.stateId = targetState.id;
318
+ }
319
+ if (options.title) updates.title = options.title;
320
+ if (options.description) updates.description = options.description;
321
+ if (options.priority) updates.priority = parseInt(options.priority);
322
+ const updatedIssue = await client.updateIssue(issue.id, updates);
323
+ console.log(
324
+ chalk.green(
325
+ `\u2713 Updated ${updatedIssue.identifier}: ${updatedIssue.title}`
326
+ )
327
+ );
328
+ if (options.status) {
329
+ console.log(chalk.cyan(` Status: ${updatedIssue.state.name}`));
330
+ }
331
+ console.log(chalk.gray(` ${updatedIssue.url}`));
332
+ } catch (error) {
333
+ console.error(
334
+ chalk.red("Failed to update task:"),
335
+ error.message
336
+ );
337
+ }
338
+ });
339
+ linear.command("config").description("Configure Linear sync settings").option("--team <id>", "Set default team ID").option("--interval <minutes>", "Auto-sync interval in minutes").option("--direction <dir>", "Sync direction").option("--conflict <strategy>", "Conflict resolution strategy").action(async (options) => {
340
+ try {
341
+ const configManager = new LinearConfigManager(process.cwd());
342
+ const config = configManager.loadConfig() || configManager.getDefaultConfig();
343
+ let updated = false;
344
+ if (options.team) {
345
+ logger.info("Team ID configuration not yet implemented", {
346
+ teamId: options.team
347
+ });
348
+ }
349
+ if (options.interval) {
350
+ config.interval = parseInt(options.interval);
351
+ updated = true;
352
+ }
353
+ if (options.direction) {
354
+ config.direction = options.direction;
355
+ updated = true;
356
+ }
357
+ if (options.conflict) {
358
+ config.conflictResolution = options.conflict;
359
+ updated = true;
360
+ }
361
+ if (updated) {
362
+ configManager.saveConfig(config);
363
+ console.log(chalk.green("\u2713 Configuration updated"));
364
+ }
365
+ console.log(chalk.cyan("\n\u{1F4CB} Current Configuration:"));
366
+ console.log(` Enabled: ${config.enabled ? "yes" : "no"}`);
367
+ console.log(` Interval: ${config.interval} minutes`);
368
+ console.log(` Direction: ${config.direction}`);
369
+ console.log(` Conflicts: ${config.conflictResolution}`);
370
+ } catch (error) {
371
+ console.error(chalk.red("Config failed:"), error.message);
372
+ }
373
+ });
374
+ }
375
+ export {
376
+ registerLinearCommands
377
+ };
378
+ //# sourceMappingURL=linear.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/linear.ts"],
4
+ "sourcesContent": ["/**\n * Linear integration commands\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n LinearAuthManager,\n LinearOAuthSetup,\n} from '../../integrations/linear/auth.js';\nimport {\n LinearSyncEngine,\n DEFAULT_SYNC_CONFIG,\n} from '../../integrations/linear/sync.js';\nimport {\n LinearSyncManager,\n DEFAULT_SYNC_MANAGER_CONFIG,\n} from '../../integrations/linear/sync-manager.js';\nimport { LinearConfigManager } from '../../integrations/linear/config.js';\nimport { PebblesTaskStore } from '../../features/tasks/pebbles-task-store.js';\nimport { LinearClient } from '../../integrations/linear/client.js';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync, mkdirSync } from 'fs';\nimport { logger } from '../../core/monitoring/logger.js';\nimport Table from 'cli-table3';\nimport { SyncResult } from '../../integrations/linear/sync.js';\n\n/**\n * Display sync result in a formatted way\n */\nfunction displaySyncResult(result: SyncResult) {\n if (result.success) {\n console.log(chalk.green('\u2713 Sync completed successfully'));\n } else {\n console.log(chalk.yellow('\u26A0 Sync completed with issues'));\n }\n\n if (\n result.synced.toLinear > 0 ||\n result.synced.fromLinear > 0 ||\n result.synced.updated > 0\n ) {\n console.log(chalk.cyan(' \uD83D\uDCCA Summary:'));\n if (result.synced.toLinear > 0) {\n console.log(` \u2192 Linear: ${result.synced.toLinear} tasks`);\n }\n if (result.synced.fromLinear > 0) {\n console.log(` \u2190 Linear: ${result.synced.fromLinear} tasks`);\n }\n if (result.synced.updated > 0) {\n console.log(` \u2194 Updated: ${result.synced.updated} tasks`);\n }\n }\n\n if (result.conflicts.length > 0) {\n console.log(chalk.yellow(` \u26A0 Conflicts: ${result.conflicts.length}`));\n result.conflicts.slice(0, 3).forEach((conflict) => {\n console.log(` - ${conflict.reason}`);\n });\n if (result.conflicts.length > 3) {\n console.log(` ... and ${result.conflicts.length - 3} more`);\n }\n }\n\n if (result.errors.length > 0) {\n console.log(chalk.red(` \u274C Errors: ${result.errors.length}`));\n result.errors.slice(0, 3).forEach((error) => {\n console.log(` - ${error.substring(0, 80)}`);\n });\n if (result.errors.length > 3) {\n console.log(` ... and ${result.errors.length - 3} more`);\n }\n }\n}\n\nexport function registerLinearCommands(parent: Command) {\n const linear = parent\n .command('linear')\n .description('Linear API integration commands');\n\n // Auth command\n linear\n .command('auth')\n .description('Authenticate with Linear')\n .option('--api-key <key>', 'Use API key instead of OAuth')\n .action(async (options) => {\n try {\n if (options.apiKey) {\n // Set API key as environment variable\n process.env.LINEAR_API_KEY = options.apiKey;\n console.log(chalk.green('\u2713 Linear API key set'));\n\n // Test the connection\n const client = new LinearClient({ apiKey: options.apiKey });\n const user = await client.getViewer();\n\n if (user) {\n console.log(\n chalk.cyan(`Connected as: ${user.name} (${user.email})`)\n );\n }\n } else {\n // OAuth flow\n const authManager = new LinearAuthManager(process.cwd());\n const setup = new LinearOAuthSetup(process.cwd());\n const authResult = await setup.setupInteractive();\n\n if (authResult.authUrl) {\n console.log(chalk.cyan('\\n\uD83D\uDD17 Open this URL in your browser:'));\n console.log(authResult.authUrl);\n console.log(\n chalk.gray('\\nFollow the instructions to complete authentication')\n );\n }\n\n if (authResult.instructions) {\n console.log(chalk.yellow('\\n\uD83D\uDCDD Instructions:'));\n authResult.instructions.forEach((instruction) => {\n console.log(` ${instruction}`);\n });\n }\n }\n } catch (error) {\n console.error(\n chalk.red('Authentication failed:'),\n (error as Error).message\n );\n process.exit(1);\n }\n });\n\n // Sync command\n linear\n .command('sync')\n .description('Sync tasks with Linear')\n .option(\n '-d, --direction <dir>',\n 'Sync direction: bidirectional, to_linear, from_linear',\n 'bidirectional'\n )\n .option('-t, --team <id>', 'Default Linear team ID')\n .option('--dry-run', 'Preview sync without making changes')\n .option('--daemon', 'Run in daemon mode with periodic sync')\n .option(\n '-i, --interval <minutes>',\n 'Sync interval in minutes (default: 15)'\n )\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(chalk.red('\u274C StackMemory not initialized'));\n return;\n }\n\n const db = new Database(dbPath);\n const taskStore = new PebblesTaskStore(projectRoot, db);\n const authManager = new LinearAuthManager(projectRoot);\n\n const config = {\n ...DEFAULT_SYNC_CONFIG,\n direction: options.direction,\n defaultTeamId: options.team,\n enabled: true,\n };\n\n if (options.daemon) {\n // Run in daemon mode with periodic sync\n const managerConfig = {\n ...DEFAULT_SYNC_MANAGER_CONFIG,\n ...config,\n autoSyncInterval: parseInt(options.interval) || 15,\n };\n\n const syncManager = new LinearSyncManager(\n taskStore,\n authManager,\n managerConfig,\n projectRoot\n );\n\n console.log(chalk.green('\uD83D\uDE80 Starting Linear sync daemon'));\n console.log(\n chalk.cyan(\n ` Sync interval: ${managerConfig.autoSyncInterval} minutes`\n )\n );\n console.log(chalk.cyan(` Direction: ${managerConfig.direction}`));\n console.log(chalk.gray(' Press Ctrl+C to stop\\n'));\n\n // Initial sync\n const initialResult = await syncManager.syncOnStart();\n if (initialResult) {\n displaySyncResult(initialResult);\n }\n\n // Listen for sync events\n syncManager.on('sync:started', ({ trigger }) => {\n console.log(\n chalk.yellow(\n `\\n\uD83D\uDD04 ${new Date().toLocaleTimeString()} - Starting ${trigger} sync...`\n )\n );\n });\n\n syncManager.on('sync:completed', ({ result }) => {\n displaySyncResult(result);\n });\n\n syncManager.on('sync:failed', ({ result }) => {\n console.log(chalk.red('\u274C Sync failed'));\n if (result.errors.length > 0) {\n result.errors.forEach((error: string) => {\n console.log(chalk.red(` - ${error}`));\n });\n }\n });\n\n // Handle graceful shutdown\n process.on('SIGINT', async () => {\n console.log(chalk.yellow('\\n\u23F9 Stopping sync daemon...'));\n await syncManager.syncOnEnd();\n syncManager.stop();\n db.close();\n process.exit(0);\n });\n\n // Keep process alive\n process.stdin.resume();\n } else {\n // Single sync\n const syncEngine = new LinearSyncEngine(\n taskStore,\n authManager,\n config\n );\n\n console.log(chalk.yellow('\uD83D\uDD04 Syncing with Linear...'));\n\n if (options.dryRun) {\n console.log(chalk.gray('(Dry run - no changes will be made)'));\n }\n\n const result = await syncEngine.sync();\n displaySyncResult(result);\n db.close();\n }\n } catch (error) {\n logger.error('Sync failed', error as Error);\n console.error(chalk.red('Sync failed:'), (error as Error).message);\n process.exit(1);\n }\n });\n\n // Status command\n linear\n .command('status')\n .description('Show Linear sync status')\n .action(async () => {\n try {\n const authManager = new LinearAuthManager(process.cwd());\n const tokens = authManager.loadTokens();\n const apiKey = process.env.LINEAR_API_KEY;\n\n if (!tokens && !apiKey) {\n console.log(chalk.yellow('\u26A0 Not authenticated with Linear'));\n console.log('Run \"stackmemory linear auth\" to connect');\n return;\n }\n\n const client = apiKey\n ? new LinearClient({ apiKey })\n : new LinearClient({\n apiKey: tokens!.accessToken,\n });\n\n const user = await client.getViewer();\n\n if (user) {\n console.log(chalk.green('\u2713 Connected to Linear'));\n console.log(chalk.cyan(` User: ${user.name} (${user.email})`));\n\n // Show teams\n const teams = await client.getTeams();\n if (teams && teams.length > 0) {\n console.log(chalk.cyan('\\n\uD83D\uDCCB Teams:'));\n teams.forEach((team) => {\n console.log(` - ${team.name} (${team.key})`);\n });\n }\n } else {\n console.log(chalk.red('\u274C Could not connect to Linear'));\n }\n } catch (error) {\n console.error(\n chalk.red('Status check failed:'),\n (error as Error).message\n );\n }\n });\n\n // List tasks command\n linear\n .command('tasks')\n .description('List Linear tasks')\n .option('--limit <n>', 'Number of tasks to show', '10')\n .action(async (options) => {\n try {\n const authManager = new LinearAuthManager(process.cwd());\n const tokens = authManager.loadTokens();\n const apiKey = process.env.LINEAR_API_KEY;\n\n if (!tokens && !apiKey) {\n console.log(chalk.yellow('\u26A0 Not authenticated with Linear'));\n return;\n }\n\n const client = apiKey\n ? new LinearClient({ apiKey })\n : new LinearClient({\n apiKey: tokens!.accessToken,\n });\n\n const issues = await client.getIssues({\n limit: parseInt(options.limit),\n });\n\n if (!issues || issues.length === 0) {\n console.log(chalk.gray('No issues found'));\n return;\n }\n\n const table = new Table({\n head: ['ID', 'Title', 'State', 'Priority', 'Assignee'],\n style: { head: ['cyan'] },\n });\n\n issues.forEach((issue) => {\n table.push([\n issue.identifier,\n issue.title.substring(0, 40) +\n (issue.title.length > 40 ? '...' : ''),\n issue.state?.name || '-',\n issue.priority ? `P${issue.priority}` : '-',\n issue.assignee?.name || '-',\n ]);\n });\n\n console.log(table.toString());\n console.log(chalk.gray(`\\nShowing ${issues.length} issues`));\n } catch (error) {\n console.error(\n chalk.red('Failed to list tasks:'),\n (error as Error).message\n );\n }\n });\n\n // Update command - update Linear task status\n linear\n .command('update <issueId>')\n .description('Update Linear task status')\n .option(\n '-s, --status <status>',\n 'New status (todo, in-progress, done, canceled)'\n )\n .option('-t, --title <title>', 'Update task title')\n .option('-d, --description <desc>', 'Update task description')\n .option(\n '-p, --priority <priority>',\n 'Set priority (1=urgent, 2=high, 3=medium, 4=low)'\n )\n .action(async (issueId, options) => {\n try {\n const authManager = new LinearAuthManager(process.cwd());\n const tokens = authManager.loadTokens();\n\n if (!tokens) {\n console.error(\n chalk.red('Not authenticated. Run: stackmemory linear auth')\n );\n return;\n }\n\n const client = new LinearClient({\n apiKey: tokens.accessToken,\n });\n\n // Find the issue first\n let issue = await client.getIssue(issueId);\n if (!issue) {\n // Try finding by identifier\n issue = await client.findIssueByIdentifier(issueId);\n }\n\n if (!issue) {\n console.error(chalk.red(`Issue ${issueId} not found`));\n return;\n }\n\n const updates: any = {};\n\n // Handle status update\n if (options.status) {\n const team = await client.getTeam();\n const states = await client.getWorkflowStates(team.id);\n\n const statusMap: Record<string, string> = {\n todo: 'unstarted',\n 'in-progress': 'started',\n done: 'completed',\n canceled: 'cancelled',\n };\n\n const targetType =\n statusMap[options.status.toLowerCase()] || options.status;\n const targetState = states.find((s) => s.type === targetType);\n\n if (!targetState) {\n console.error(chalk.red(`Invalid status: ${options.status}`));\n console.log(chalk.gray('Available states:'));\n states.forEach((s) =>\n console.log(chalk.gray(` - ${s.name} (${s.type})`))\n );\n return;\n }\n\n updates.stateId = targetState.id;\n }\n\n if (options.title) updates.title = options.title;\n if (options.description) updates.description = options.description;\n if (options.priority) updates.priority = parseInt(options.priority);\n\n // Perform update\n const updatedIssue = await client.updateIssue(issue.id, updates);\n\n console.log(\n chalk.green(\n `\u2713 Updated ${updatedIssue.identifier}: ${updatedIssue.title}`\n )\n );\n if (options.status) {\n console.log(chalk.cyan(` Status: ${updatedIssue.state.name}`));\n }\n console.log(chalk.gray(` ${updatedIssue.url}`));\n } catch (error) {\n console.error(\n chalk.red('Failed to update task:'),\n (error as Error).message\n );\n }\n });\n\n // Config command\n linear\n .command('config')\n .description('Configure Linear sync settings')\n .option('--team <id>', 'Set default team ID')\n .option('--interval <minutes>', 'Auto-sync interval in minutes')\n .option('--direction <dir>', 'Sync direction')\n .option('--conflict <strategy>', 'Conflict resolution strategy')\n .action(async (options) => {\n try {\n const configManager = new LinearConfigManager(process.cwd());\n const config =\n configManager.loadConfig() || configManager.getDefaultConfig();\n\n let updated = false;\n\n if (options.team) {\n // Team ID would need to be stored separately or in a different config\n logger.info('Team ID configuration not yet implemented', {\n teamId: options.team,\n });\n }\n\n if (options.interval) {\n config.interval = parseInt(options.interval);\n updated = true;\n }\n\n if (options.direction) {\n config.direction = options.direction;\n updated = true;\n }\n\n if (options.conflict) {\n config.conflictResolution = options.conflict;\n updated = true;\n }\n\n if (updated) {\n configManager.saveConfig(config);\n console.log(chalk.green('\u2713 Configuration updated'));\n }\n\n // Display current config\n console.log(chalk.cyan('\\n\uD83D\uDCCB Current Configuration:'));\n console.log(` Enabled: ${config.enabled ? 'yes' : 'no'}`);\n console.log(` Interval: ${config.interval} minutes`);\n console.log(` Direction: ${config.direction}`);\n console.log(` Conflicts: ${config.conflictResolution}`);\n } catch (error) {\n console.error(chalk.red('Config failed:'), (error as Error).message);\n }\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,165 @@
1
+ import { Command } from "commander";
2
+ import Database from "better-sqlite3";
3
+ import { join } from "path";
4
+ import { existsSync, readFileSync } from "fs";
5
+ function createLogCommand() {
6
+ const log = new Command("log").alias("history").description("View recent activity log").option("-n, --lines <n>", "Number of entries to show", "20").option("-t, --type <type>", "Filter by type (task, frame, event, sync)").option("-f, --follow", "Follow log in real-time").action(async (options) => {
7
+ const projectRoot = process.cwd();
8
+ const dbPath = join(projectRoot, ".stackmemory", "context.db");
9
+ const tasksPath = join(projectRoot, ".stackmemory", "tasks.jsonl");
10
+ if (!existsSync(dbPath)) {
11
+ console.log(
12
+ '\u274C StackMemory not initialized. Run "stackmemory init" first.'
13
+ );
14
+ return;
15
+ }
16
+ const limit = parseInt(options.lines);
17
+ const activities = [];
18
+ const db = new Database(dbPath);
19
+ if (!options.type || options.type === "frame") {
20
+ try {
21
+ const frames = db.prepare(
22
+ `
23
+ SELECT id, type, name, state, created_at, updated_at
24
+ FROM frames
25
+ ORDER BY updated_at DESC
26
+ LIMIT ?
27
+ `
28
+ ).all(limit);
29
+ frames.forEach((f) => {
30
+ activities.push({
31
+ timestamp: f.updated_at || f.created_at,
32
+ type: "frame",
33
+ action: f.state === "closed" ? "closed" : "opened",
34
+ details: `[${f.type}] ${f.name || f.id.slice(0, 10)}`
35
+ });
36
+ });
37
+ } catch {
38
+ }
39
+ }
40
+ if (!options.type || options.type === "event") {
41
+ try {
42
+ const events = db.prepare(
43
+ `
44
+ SELECT id, type, data, timestamp
45
+ FROM events
46
+ ORDER BY timestamp DESC
47
+ LIMIT ?
48
+ `
49
+ ).all(limit);
50
+ events.forEach((e) => {
51
+ let data = {};
52
+ try {
53
+ data = JSON.parse(e.data);
54
+ } catch {
55
+ }
56
+ activities.push({
57
+ timestamp: e.timestamp,
58
+ type: "event",
59
+ action: e.type,
60
+ details: data.message || data.content || data.decision || ""
61
+ });
62
+ });
63
+ } catch {
64
+ }
65
+ }
66
+ if (!options.type || options.type === "task") {
67
+ try {
68
+ const tasks = db.prepare(
69
+ `
70
+ SELECT id, title, status, type, timestamp
71
+ FROM task_cache
72
+ ORDER BY timestamp DESC
73
+ LIMIT ?
74
+ `
75
+ ).all(limit);
76
+ tasks.forEach((t) => {
77
+ activities.push({
78
+ timestamp: t.timestamp,
79
+ type: "task",
80
+ action: t.type?.replace("task_", "") || t.status,
81
+ details: t.title
82
+ });
83
+ });
84
+ } catch {
85
+ }
86
+ }
87
+ db.close();
88
+ if (!options.type || options.type === "sync") {
89
+ const mappingsPath = join(
90
+ projectRoot,
91
+ ".stackmemory",
92
+ "linear-mappings.json"
93
+ );
94
+ if (existsSync(mappingsPath)) {
95
+ try {
96
+ const mappings = JSON.parse(readFileSync(mappingsPath, "utf-8"));
97
+ mappings.slice(-limit).forEach((m) => {
98
+ activities.push({
99
+ timestamp: Math.floor(m.lastSyncTimestamp / 1e3),
100
+ type: "sync",
101
+ action: "synced",
102
+ details: `${m.linearIdentifier}`
103
+ });
104
+ });
105
+ } catch {
106
+ }
107
+ }
108
+ }
109
+ activities.sort((a, b) => b.timestamp - a.timestamp);
110
+ console.log(`
111
+ \u{1F4DC} Activity Log
112
+ `);
113
+ const typeIcon = {
114
+ frame: "\u{1F4C1}",
115
+ event: "\u26A1",
116
+ task: "\u{1F4CB}",
117
+ sync: "\u{1F504}"
118
+ };
119
+ activities.slice(0, limit).forEach((activity) => {
120
+ const date = new Date(activity.timestamp * 1e3);
121
+ const timeStr = date.toLocaleTimeString("en-US", {
122
+ hour: "2-digit",
123
+ minute: "2-digit"
124
+ });
125
+ const dateStr = date.toLocaleDateString("en-US", {
126
+ month: "short",
127
+ day: "numeric"
128
+ });
129
+ const icon = typeIcon[activity.type] || "\u{1F4DD}";
130
+ console.log(
131
+ `${icon} ${dateStr} ${timeStr} ${activity.action.padEnd(12)} ${activity.details.slice(0, 50)}`
132
+ );
133
+ });
134
+ console.log("");
135
+ if (options.follow) {
136
+ console.log("\u{1F440} Watching for changes... (Ctrl+C to stop)\n");
137
+ try {
138
+ const chokidar = await import("chokidar");
139
+ const watcher = chokidar.watch(join(projectRoot, ".stackmemory"), {
140
+ persistent: true,
141
+ ignoreInitial: true
142
+ });
143
+ watcher.on("change", (path) => {
144
+ const now = /* @__PURE__ */ new Date();
145
+ const timeStr = now.toLocaleTimeString("en-US", {
146
+ hour: "2-digit",
147
+ minute: "2-digit"
148
+ });
149
+ console.log(
150
+ `\u{1F504} ${timeStr} File changed: ${path.split("/").pop()}`
151
+ );
152
+ });
153
+ await new Promise(() => {
154
+ });
155
+ } catch {
156
+ console.log("Install chokidar for follow mode: npm i chokidar");
157
+ }
158
+ }
159
+ });
160
+ return log;
161
+ }
162
+ export {
163
+ createLogCommand
164
+ };
165
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/log.ts"],
4
+ "sourcesContent": ["/**\n * Log Command for StackMemory CLI\n * View recent activity log\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync, readFileSync } from 'fs';\n\nexport function createLogCommand(): Command {\n const log = new Command('log')\n .alias('history')\n .description('View recent activity log')\n .option('-n, --lines <n>', 'Number of entries to show', '20')\n .option('-t, --type <type>', 'Filter by type (task, frame, event, sync)')\n .option('-f, --follow', 'Follow log in real-time')\n .action(async (options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n const tasksPath = join(projectRoot, '.stackmemory', 'tasks.jsonl');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n const limit = parseInt(options.lines);\n const activities: Array<{\n timestamp: number;\n type: string;\n action: string;\n details: string;\n }> = [];\n\n const db = new Database(dbPath);\n\n // Get frame activity\n if (!options.type || options.type === 'frame') {\n try {\n const frames = db\n .prepare(\n `\n SELECT id, type, name, state, created_at, updated_at\n FROM frames \n ORDER BY updated_at DESC\n LIMIT ?\n `\n )\n .all(limit) as any[];\n\n frames.forEach((f) => {\n activities.push({\n timestamp: f.updated_at || f.created_at,\n type: 'frame',\n action: f.state === 'closed' ? 'closed' : 'opened',\n details: `[${f.type}] ${f.name || f.id.slice(0, 10)}`,\n });\n });\n } catch {}\n }\n\n // Get event activity\n if (!options.type || options.type === 'event') {\n try {\n const events = db\n .prepare(\n `\n SELECT id, type, data, timestamp\n FROM events \n ORDER BY timestamp DESC\n LIMIT ?\n `\n )\n .all(limit) as any[];\n\n events.forEach((e) => {\n let data: any = {};\n try {\n data = JSON.parse(e.data);\n } catch {}\n\n activities.push({\n timestamp: e.timestamp,\n type: 'event',\n action: e.type,\n details: data.message || data.content || data.decision || '',\n });\n });\n } catch {}\n }\n\n // Get task activity\n if (!options.type || options.type === 'task') {\n try {\n const tasks = db\n .prepare(\n `\n SELECT id, title, status, type, timestamp\n FROM task_cache \n ORDER BY timestamp DESC\n LIMIT ?\n `\n )\n .all(limit) as any[];\n\n tasks.forEach((t) => {\n activities.push({\n timestamp: t.timestamp,\n type: 'task',\n action: t.type?.replace('task_', '') || t.status,\n details: t.title,\n });\n });\n } catch {}\n }\n\n db.close();\n\n // Get sync activity from Linear mappings\n if (!options.type || options.type === 'sync') {\n const mappingsPath = join(\n projectRoot,\n '.stackmemory',\n 'linear-mappings.json'\n );\n if (existsSync(mappingsPath)) {\n try {\n const mappings = JSON.parse(readFileSync(mappingsPath, 'utf-8'));\n mappings.slice(-limit).forEach((m: any) => {\n activities.push({\n timestamp: Math.floor(m.lastSyncTimestamp / 1000),\n type: 'sync',\n action: 'synced',\n details: `${m.linearIdentifier}`,\n });\n });\n } catch {}\n }\n }\n\n // Sort by timestamp descending\n activities.sort((a, b) => b.timestamp - a.timestamp);\n\n console.log(`\\n\uD83D\uDCDC Activity Log\\n`);\n\n const typeIcon: Record<string, string> = {\n frame: '\uD83D\uDCC1',\n event: '\u26A1',\n task: '\uD83D\uDCCB',\n sync: '\uD83D\uDD04',\n };\n\n activities.slice(0, limit).forEach((activity) => {\n const date = new Date(activity.timestamp * 1000);\n const timeStr = date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n const dateStr = date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n });\n const icon = typeIcon[activity.type] || '\uD83D\uDCDD';\n\n console.log(\n `${icon} ${dateStr} ${timeStr} ${activity.action.padEnd(12)} ${activity.details.slice(0, 50)}`\n );\n });\n\n console.log('');\n\n // Follow mode\n if (options.follow) {\n console.log('\uD83D\uDC40 Watching for changes... (Ctrl+C to stop)\\n');\n\n // Watch for file changes\n try {\n const chokidar = await import('chokidar');\n const watcher = chokidar.watch(join(projectRoot, '.stackmemory'), {\n persistent: true,\n ignoreInitial: true,\n });\n\n watcher.on('change', (path: string) => {\n const now = new Date();\n const timeStr = now.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n console.log(\n `\uD83D\uDD04 ${timeStr} File changed: ${path.split('/').pop()}`\n );\n });\n\n // Keep process alive\n await new Promise(() => {});\n } catch {\n console.log('Install chokidar for follow mode: npm i chokidar');\n }\n }\n });\n\n return log;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }