@stackmemoryai/stackmemory 0.3.1 → 0.3.5

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 (744) hide show
  1. package/README.md +69 -288
  2. package/dist/cli/commands/chromadb.js +267 -0
  3. package/dist/cli/commands/chromadb.js.map +7 -0
  4. package/dist/cli/commands/clear.js +191 -0
  5. package/dist/cli/commands/clear.js.map +7 -0
  6. package/dist/cli/commands/config.js +152 -1
  7. package/dist/cli/commands/config.js.map +2 -2
  8. package/dist/cli/commands/context.js +15 -5
  9. package/dist/cli/commands/context.js.map +2 -2
  10. package/dist/cli/commands/dashboard.js +178 -0
  11. package/dist/cli/commands/dashboard.js.map +7 -0
  12. package/dist/cli/commands/handoff.js +125 -8
  13. package/dist/cli/commands/handoff.js.map +2 -2
  14. package/dist/cli/commands/linear-create.js +132 -0
  15. package/dist/cli/commands/linear-create.js.map +7 -0
  16. package/dist/cli/commands/linear-list.js +69 -0
  17. package/dist/cli/commands/linear-list.js.map +7 -0
  18. package/dist/cli/commands/linear-migrate.js +40 -0
  19. package/dist/cli/commands/linear-migrate.js.map +7 -0
  20. package/dist/cli/commands/linear.js +185 -36
  21. package/dist/cli/commands/linear.js.map +2 -2
  22. package/dist/cli/commands/monitor.js +309 -0
  23. package/dist/cli/commands/monitor.js.map +7 -0
  24. package/dist/cli/commands/quality.js +414 -0
  25. package/dist/cli/commands/quality.js.map +7 -0
  26. package/dist/cli/commands/skills.js +262 -0
  27. package/dist/cli/commands/skills.js.map +7 -0
  28. package/dist/cli/commands/storage.js +275 -0
  29. package/dist/cli/commands/storage.js.map +7 -0
  30. package/dist/cli/commands/tui.js +66 -0
  31. package/dist/cli/commands/tui.js.map +7 -0
  32. package/dist/cli/commands/workflow.js +134 -0
  33. package/dist/cli/commands/workflow.js.map +7 -0
  34. package/dist/cli/index.js +109 -8
  35. package/dist/cli/index.js.map +3 -3
  36. package/dist/core/analytics/team-analytics.js +374 -0
  37. package/dist/core/analytics/team-analytics.js.map +7 -0
  38. package/dist/core/context/context-bridge.js +234 -0
  39. package/dist/core/context/context-bridge.js.map +7 -0
  40. package/dist/core/context/dual-stack-manager.js +850 -0
  41. package/dist/core/context/dual-stack-manager.js.map +7 -0
  42. package/dist/core/context/frame-handoff-manager.js +774 -0
  43. package/dist/core/context/frame-handoff-manager.js.map +7 -0
  44. package/dist/core/context/frame-manager.js +142 -13
  45. package/dist/core/context/frame-manager.js.map +2 -2
  46. package/dist/core/context/permission-manager.js +181 -0
  47. package/dist/core/context/permission-manager.js.map +7 -0
  48. package/dist/core/context/shared-context-layer.js +386 -0
  49. package/dist/core/context/shared-context-layer.js.map +7 -0
  50. package/dist/core/context/stack-merge-resolver.js +600 -0
  51. package/dist/core/context/stack-merge-resolver.js.map +7 -0
  52. package/dist/core/context/validation.js +121 -0
  53. package/dist/core/context/validation.js.map +7 -0
  54. package/dist/core/database/connection-pool.js +266 -175
  55. package/dist/core/database/connection-pool.js.map +2 -2
  56. package/dist/core/database/database-adapter.js +51 -0
  57. package/dist/core/database/database-adapter.js.map +7 -0
  58. package/dist/core/database/migration-manager.js +514 -0
  59. package/dist/core/database/migration-manager.js.map +7 -0
  60. package/dist/core/database/paradedb-adapter.js +970 -0
  61. package/dist/core/database/paradedb-adapter.js.map +7 -0
  62. package/dist/core/database/query-router.js +421 -0
  63. package/dist/core/database/query-router.js.map +7 -0
  64. package/dist/core/database/sqlite-adapter.js +547 -0
  65. package/dist/core/database/sqlite-adapter.js.map +7 -0
  66. package/dist/core/errors/index.js +21 -1
  67. package/dist/core/errors/index.js.map +2 -2
  68. package/dist/core/frame/workflow-templates-stub.js +42 -0
  69. package/dist/core/frame/workflow-templates-stub.js.map +7 -0
  70. package/dist/core/frame/workflow-templates.js +276 -0
  71. package/dist/core/frame/workflow-templates.js.map +7 -0
  72. package/dist/core/merge/conflict-detector.js +5 -2
  73. package/dist/core/merge/conflict-detector.js.map +2 -2
  74. package/dist/core/merge/resolution-engine.js +3 -14
  75. package/dist/core/merge/resolution-engine.js.map +2 -2
  76. package/dist/core/merge/stack-diff.js.map +2 -2
  77. package/dist/core/monitoring/logger.js +18 -3
  78. package/dist/core/monitoring/logger.js.map +2 -2
  79. package/dist/core/monitoring/session-monitor.js +296 -0
  80. package/dist/core/monitoring/session-monitor.js.map +7 -0
  81. package/dist/core/retrieval/context-retriever.js +475 -0
  82. package/dist/core/retrieval/context-retriever.js.map +7 -0
  83. package/dist/core/retrieval/graph-retrieval.js +658 -0
  84. package/dist/core/retrieval/graph-retrieval.js.map +7 -0
  85. package/dist/core/retrieval/hierarchical-retrieval.js +652 -0
  86. package/dist/core/retrieval/hierarchical-retrieval.js.map +7 -0
  87. package/dist/core/retrieval/retrieval-benchmarks.js +517 -0
  88. package/dist/core/retrieval/retrieval-benchmarks.js.map +7 -0
  89. package/dist/core/session/clear-survival-stub.js +49 -0
  90. package/dist/core/session/clear-survival-stub.js.map +7 -0
  91. package/dist/core/session/clear-survival.js +426 -0
  92. package/dist/core/session/clear-survival.js.map +7 -0
  93. package/dist/core/session/handoff-generator.js +339 -0
  94. package/dist/core/session/handoff-generator.js.map +7 -0
  95. package/dist/core/session/session-manager.js +61 -26
  96. package/dist/core/session/session-manager.js.map +3 -3
  97. package/dist/core/skills/index.js +3 -0
  98. package/dist/core/skills/index.js.map +7 -0
  99. package/dist/core/skills/skill-storage.js +749 -0
  100. package/dist/core/skills/skill-storage.js.map +7 -0
  101. package/dist/core/skills/types.js +189 -0
  102. package/dist/core/skills/types.js.map +7 -0
  103. package/dist/core/storage/chromadb-adapter.js +346 -0
  104. package/dist/core/storage/chromadb-adapter.js.map +7 -0
  105. package/dist/core/storage/railway-optimized-storage.js +550 -0
  106. package/dist/core/storage/railway-optimized-storage.js.map +7 -0
  107. package/dist/core/storage/remote-storage.js +456 -0
  108. package/dist/core/storage/remote-storage.js.map +7 -0
  109. package/dist/core/trace/trace-detector.js +136 -5
  110. package/dist/core/trace/trace-detector.js.map +2 -2
  111. package/dist/core/trace/trace-store.js.map +2 -2
  112. package/dist/features/tui/components/analytics-panel.js +136 -0
  113. package/dist/features/tui/components/analytics-panel.js.map +7 -0
  114. package/dist/features/tui/components/frame-visualizer.js +377 -0
  115. package/dist/features/tui/components/frame-visualizer.js.map +7 -0
  116. package/dist/features/tui/components/pr-tracker.js +123 -0
  117. package/dist/features/tui/components/pr-tracker.js.map +7 -0
  118. package/dist/features/tui/components/session-monitor.js +286 -0
  119. package/dist/features/tui/components/session-monitor.js.map +7 -0
  120. package/dist/features/tui/components/subagent-fleet.js +388 -0
  121. package/dist/features/tui/components/subagent-fleet.js.map +7 -0
  122. package/dist/features/tui/components/task-board.js +475 -0
  123. package/dist/features/tui/components/task-board.js.map +7 -0
  124. package/dist/features/tui/index.js +397 -0
  125. package/dist/features/tui/index.js.map +7 -0
  126. package/dist/features/tui/services/data-service.js +654 -0
  127. package/dist/features/tui/services/data-service.js.map +7 -0
  128. package/dist/features/tui/services/websocket-client.js +149 -0
  129. package/dist/features/tui/services/websocket-client.js.map +7 -0
  130. package/dist/features/tui/terminal-compat.js +205 -0
  131. package/dist/features/tui/terminal-compat.js.map +7 -0
  132. package/dist/features/tui/types.js +1 -0
  133. package/dist/features/tui/types.js.map +7 -0
  134. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +455 -0
  135. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  136. package/dist/integrations/claude-code/lifecycle-hooks.js +250 -0
  137. package/dist/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  138. package/dist/integrations/claude-code/post-task-hooks.js +541 -0
  139. package/dist/integrations/claude-code/post-task-hooks.js.map +7 -0
  140. package/dist/integrations/linear/client.js +22 -4
  141. package/dist/integrations/linear/client.js.map +2 -2
  142. package/dist/integrations/linear/migration.js +299 -0
  143. package/dist/integrations/linear/migration.js.map +7 -0
  144. package/dist/integrations/linear/oauth-server.js +396 -0
  145. package/dist/integrations/linear/oauth-server.js.map +7 -0
  146. package/dist/integrations/linear/rest-client.js +199 -0
  147. package/dist/integrations/linear/rest-client.js.map +7 -0
  148. package/dist/integrations/linear/sync.js +14 -2
  149. package/dist/integrations/linear/sync.js.map +2 -2
  150. package/dist/integrations/linear/webhook-handler.js +200 -0
  151. package/dist/integrations/linear/webhook-handler.js.map +7 -0
  152. package/dist/integrations/mcp/handlers/skill-handlers.js +514 -0
  153. package/dist/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  154. package/dist/integrations/mcp/middleware/tool-scoring.js +352 -0
  155. package/dist/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  156. package/dist/integrations/mcp/refactored-server.js +31 -3
  157. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  158. package/dist/integrations/mcp/server.js +25 -7
  159. package/dist/integrations/mcp/server.js.map +2 -2
  160. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  161. package/dist/models/user.model.js +3 -0
  162. package/dist/models/user.model.js.map +2 -2
  163. package/dist/services/context-service.js.map +2 -2
  164. package/dist/skills/claude-skills.js +666 -0
  165. package/dist/skills/claude-skills.js.map +7 -0
  166. package/dist/utils/formatting.js +58 -0
  167. package/dist/utils/formatting.js.map +7 -0
  168. package/package.json +30 -24
  169. package/dist/cli/__tests__/index.test.js +0 -290
  170. package/dist/cli/__tests__/index.test.js.map +0 -7
  171. package/dist/core/config/__tests__/config-manager.test.js +0 -248
  172. package/dist/core/config/__tests__/config-manager.test.js.map +0 -7
  173. package/dist/core/context/__tests__/frame-manager.test.js +0 -879
  174. package/dist/core/context/__tests__/frame-manager.test.js.map +0 -7
  175. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +0 -379
  176. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +0 -7
  177. package/dist/core/digest/__tests__/frame-digest-integration.test.js +0 -230
  178. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +0 -7
  179. package/dist/core/errors/__tests__/error-handling.test.js +0 -270
  180. package/dist/core/errors/__tests__/error-handling.test.js.map +0 -7
  181. package/dist/core/merge/__tests__/conflict-scenarios.test.js +0 -414
  182. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +0 -7
  183. package/dist/core/query/__tests__/query-parser.test.js +0 -301
  184. package/dist/core/query/__tests__/query-parser.test.js.map +0 -7
  185. package/dist/core/query/__tests__/query-templates.test.js +0 -210
  186. package/dist/core/query/__tests__/query-templates.test.js.map +0 -7
  187. package/dist/core/trace/trace-detector.test.js +0 -401
  188. package/dist/core/trace/trace-detector.test.js.map +0 -7
  189. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +0 -747
  190. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -7
  191. package/dist/integrations/linear/__tests__/auth.test.js +0 -558
  192. package/dist/integrations/linear/__tests__/auth.test.js.map +0 -7
  193. package/dist/integrations/linear/__tests__/sync-service.test.js +0 -760
  194. package/dist/integrations/linear/__tests__/sync-service.test.js.map +0 -7
  195. package/dist/integrations/mcp/__tests__/server.test.js +0 -798
  196. package/dist/integrations/mcp/__tests__/server.test.js.map +0 -7
  197. package/dist/scripts/benchmark-performance.d.ts +0 -7
  198. package/dist/scripts/benchmark-performance.d.ts.map +0 -1
  199. package/dist/scripts/benchmark-performance.js +0 -44
  200. package/dist/scripts/benchmark-performance.js.map +0 -1
  201. package/dist/scripts/cancel-duplicate-tasks.d.ts +0 -7
  202. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +0 -1
  203. package/dist/scripts/cancel-duplicate-tasks.js +0 -172
  204. package/dist/scripts/cancel-duplicate-tasks.js.map +0 -1
  205. package/dist/scripts/cleanup-duplicate-tasks.d.ts +0 -12
  206. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +0 -1
  207. package/dist/scripts/cleanup-duplicate-tasks.js +0 -215
  208. package/dist/scripts/cleanup-duplicate-tasks.js.map +0 -1
  209. package/dist/scripts/initialize.d.ts +0 -6
  210. package/dist/scripts/initialize.d.ts.map +0 -1
  211. package/dist/scripts/initialize.js +0 -93
  212. package/dist/scripts/initialize.js.map +0 -1
  213. package/dist/scripts/list-linear-tasks.d.ts +0 -6
  214. package/dist/scripts/list-linear-tasks.d.ts.map +0 -1
  215. package/dist/scripts/list-linear-tasks.js +0 -121
  216. package/dist/scripts/list-linear-tasks.js.map +0 -1
  217. package/dist/scripts/merge-linear-duplicates-safe.d.ts +0 -7
  218. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +0 -1
  219. package/dist/scripts/merge-linear-duplicates-safe.js +0 -267
  220. package/dist/scripts/merge-linear-duplicates-safe.js.map +0 -1
  221. package/dist/scripts/show-linear-summary.d.ts +0 -6
  222. package/dist/scripts/show-linear-summary.d.ts.map +0 -1
  223. package/dist/scripts/show-linear-summary.js +0 -120
  224. package/dist/scripts/show-linear-summary.js.map +0 -1
  225. package/dist/scripts/status.d.ts +0 -6
  226. package/dist/scripts/status.d.ts.map +0 -1
  227. package/dist/scripts/status.js +0 -101
  228. package/dist/scripts/status.js.map +0 -1
  229. package/dist/src/agents/core/agent-task-manager.d.ts +0 -154
  230. package/dist/src/agents/core/agent-task-manager.d.ts.map +0 -1
  231. package/dist/src/agents/core/agent-task-manager.js +0 -504
  232. package/dist/src/agents/core/agent-task-manager.js.map +0 -1
  233. package/dist/src/agents/verifiers/base-verifier.d.ts +0 -112
  234. package/dist/src/agents/verifiers/base-verifier.d.ts.map +0 -1
  235. package/dist/src/agents/verifiers/base-verifier.js +0 -130
  236. package/dist/src/agents/verifiers/base-verifier.js.map +0 -1
  237. package/dist/src/agents/verifiers/formatter-verifier.d.ts +0 -14
  238. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +0 -1
  239. package/dist/src/agents/verifiers/formatter-verifier.js +0 -107
  240. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -1
  241. package/dist/src/agents/verifiers/llm-judge.d.ts +0 -46
  242. package/dist/src/agents/verifiers/llm-judge.d.ts.map +0 -1
  243. package/dist/src/agents/verifiers/llm-judge.js +0 -248
  244. package/dist/src/agents/verifiers/llm-judge.js.map +0 -1
  245. package/dist/src/cli/auto-detect.d.ts +0 -61
  246. package/dist/src/cli/auto-detect.d.ts.map +0 -1
  247. package/dist/src/cli/auto-detect.js +0 -350
  248. package/dist/src/cli/auto-detect.js.map +0 -1
  249. package/dist/src/cli/browser-test.d.ts +0 -6
  250. package/dist/src/cli/browser-test.d.ts.map +0 -1
  251. package/dist/src/cli/browser-test.js +0 -32
  252. package/dist/src/cli/browser-test.js.map +0 -1
  253. package/dist/src/cli/claude-sm.d.ts +0 -7
  254. package/dist/src/cli/claude-sm.d.ts.map +0 -1
  255. package/dist/src/cli/claude-sm.js +0 -412
  256. package/dist/src/cli/claude-sm.js.map +0 -1
  257. package/dist/src/cli/commands/agent.d.ts +0 -9
  258. package/dist/src/cli/commands/agent.d.ts.map +0 -1
  259. package/dist/src/cli/commands/agent.js +0 -303
  260. package/dist/src/cli/commands/agent.js.map +0 -1
  261. package/dist/src/cli/commands/config.d.ts +0 -6
  262. package/dist/src/cli/commands/config.d.ts.map +0 -1
  263. package/dist/src/cli/commands/config.js +0 -224
  264. package/dist/src/cli/commands/config.js.map +0 -1
  265. package/dist/src/cli/commands/context.d.ts +0 -7
  266. package/dist/src/cli/commands/context.d.ts.map +0 -1
  267. package/dist/src/cli/commands/context.js +0 -365
  268. package/dist/src/cli/commands/context.js.map +0 -1
  269. package/dist/src/cli/commands/handoff.d.ts +0 -6
  270. package/dist/src/cli/commands/handoff.d.ts.map +0 -1
  271. package/dist/src/cli/commands/handoff.js +0 -212
  272. package/dist/src/cli/commands/handoff.js.map +0 -1
  273. package/dist/src/cli/commands/linear-test.d.ts +0 -6
  274. package/dist/src/cli/commands/linear-test.d.ts.map +0 -1
  275. package/dist/src/cli/commands/linear-test.js +0 -123
  276. package/dist/src/cli/commands/linear-test.js.map +0 -1
  277. package/dist/src/cli/commands/linear.d.ts +0 -6
  278. package/dist/src/cli/commands/linear.d.ts.map +0 -1
  279. package/dist/src/cli/commands/linear.js +0 -393
  280. package/dist/src/cli/commands/linear.js.map +0 -1
  281. package/dist/src/cli/commands/log.d.ts +0 -7
  282. package/dist/src/cli/commands/log.d.ts.map +0 -1
  283. package/dist/src/cli/commands/log.js +0 -168
  284. package/dist/src/cli/commands/log.js.map +0 -1
  285. package/dist/src/cli/commands/onboard.d.ts +0 -8
  286. package/dist/src/cli/commands/onboard.d.ts.map +0 -1
  287. package/dist/src/cli/commands/onboard.js +0 -363
  288. package/dist/src/cli/commands/onboard.js.map +0 -1
  289. package/dist/src/cli/commands/projects.d.ts +0 -8
  290. package/dist/src/cli/commands/projects.d.ts.map +0 -1
  291. package/dist/src/cli/commands/projects.js +0 -220
  292. package/dist/src/cli/commands/projects.js.map +0 -1
  293. package/dist/src/cli/commands/search.d.ts +0 -7
  294. package/dist/src/cli/commands/search.d.ts.map +0 -1
  295. package/dist/src/cli/commands/search.js +0 -162
  296. package/dist/src/cli/commands/search.js.map +0 -1
  297. package/dist/src/cli/commands/session.d.ts +0 -7
  298. package/dist/src/cli/commands/session.d.ts.map +0 -1
  299. package/dist/src/cli/commands/session.js +0 -222
  300. package/dist/src/cli/commands/session.js.map +0 -1
  301. package/dist/src/cli/commands/tasks.d.ts +0 -7
  302. package/dist/src/cli/commands/tasks.d.ts.map +0 -1
  303. package/dist/src/cli/commands/tasks.js +0 -229
  304. package/dist/src/cli/commands/tasks.js.map +0 -1
  305. package/dist/src/cli/commands/webhook.d.ts +0 -3
  306. package/dist/src/cli/commands/webhook.d.ts.map +0 -1
  307. package/dist/src/cli/commands/webhook.js +0 -157
  308. package/dist/src/cli/commands/webhook.js.map +0 -1
  309. package/dist/src/cli/commands/worktree.d.ts +0 -8
  310. package/dist/src/cli/commands/worktree.d.ts.map +0 -1
  311. package/dist/src/cli/commands/worktree.js +0 -339
  312. package/dist/src/cli/commands/worktree.js.map +0 -1
  313. package/dist/src/cli/index.d.ts +0 -8
  314. package/dist/src/cli/index.d.ts.map +0 -1
  315. package/dist/src/cli/index.js +0 -995
  316. package/dist/src/cli/index.js.map +0 -1
  317. package/dist/src/cli/utils/viewer.d.ts +0 -3
  318. package/dist/src/cli/utils/viewer.d.ts.map +0 -1
  319. package/dist/src/cli/utils/viewer.js +0 -91
  320. package/dist/src/cli/utils/viewer.js.map +0 -1
  321. package/dist/src/core/config/config-manager.d.ts +0 -95
  322. package/dist/src/core/config/config-manager.d.ts.map +0 -1
  323. package/dist/src/core/config/config-manager.js +0 -359
  324. package/dist/src/core/config/config-manager.js.map +0 -1
  325. package/dist/src/core/config/types.d.ts +0 -72
  326. package/dist/src/core/config/types.d.ts.map +0 -1
  327. package/dist/src/core/config/types.js +0 -127
  328. package/dist/src/core/config/types.js.map +0 -1
  329. package/dist/src/core/context/auto-context.d.ts +0 -22
  330. package/dist/src/core/context/auto-context.d.ts.map +0 -1
  331. package/dist/src/core/context/auto-context.js +0 -77
  332. package/dist/src/core/context/auto-context.js.map +0 -1
  333. package/dist/src/core/context/compaction-handler.d.ts +0 -119
  334. package/dist/src/core/context/compaction-handler.d.ts.map +0 -1
  335. package/dist/src/core/context/compaction-handler.js +0 -306
  336. package/dist/src/core/context/compaction-handler.js.map +0 -1
  337. package/dist/src/core/context/frame-database.d.ts +0 -59
  338. package/dist/src/core/context/frame-database.d.ts.map +0 -1
  339. package/dist/src/core/context/frame-database.js +0 -333
  340. package/dist/src/core/context/frame-database.js.map +0 -1
  341. package/dist/src/core/context/frame-digest.d.ts +0 -59
  342. package/dist/src/core/context/frame-digest.d.ts.map +0 -1
  343. package/dist/src/core/context/frame-digest.js +0 -264
  344. package/dist/src/core/context/frame-digest.js.map +0 -1
  345. package/dist/src/core/context/frame-manager.d.ts +0 -112
  346. package/dist/src/core/context/frame-manager.d.ts.map +0 -1
  347. package/dist/src/core/context/frame-manager.js +0 -600
  348. package/dist/src/core/context/frame-manager.js.map +0 -1
  349. package/dist/src/core/context/frame-stack.d.ts +0 -85
  350. package/dist/src/core/context/frame-stack.d.ts.map +0 -1
  351. package/dist/src/core/context/frame-stack.js +0 -287
  352. package/dist/src/core/context/frame-stack.js.map +0 -1
  353. package/dist/src/core/context/frame-types.d.ts +0 -67
  354. package/dist/src/core/context/frame-types.d.ts.map +0 -1
  355. package/dist/src/core/context/frame-types.js +0 -6
  356. package/dist/src/core/context/frame-types.js.map +0 -1
  357. package/dist/src/core/context/index.d.ts +0 -11
  358. package/dist/src/core/context/index.d.ts.map +0 -1
  359. package/dist/src/core/context/index.js +0 -14
  360. package/dist/src/core/context/index.js.map +0 -1
  361. package/dist/src/core/context/model-aware-compaction.d.ts +0 -101
  362. package/dist/src/core/context/model-aware-compaction.d.ts.map +0 -1
  363. package/dist/src/core/context/model-aware-compaction.js +0 -616
  364. package/dist/src/core/context/model-aware-compaction.js.map +0 -1
  365. package/dist/src/core/context/refactored-frame-manager.d.ts +0 -99
  366. package/dist/src/core/context/refactored-frame-manager.d.ts.map +0 -1
  367. package/dist/src/core/context/refactored-frame-manager.js +0 -340
  368. package/dist/src/core/context/refactored-frame-manager.js.map +0 -1
  369. package/dist/src/core/database/batch-operations.d.ts +0 -118
  370. package/dist/src/core/database/batch-operations.d.ts.map +0 -1
  371. package/dist/src/core/database/batch-operations.js +0 -339
  372. package/dist/src/core/database/batch-operations.js.map +0 -1
  373. package/dist/src/core/database/connection-pool.d.ts +0 -79
  374. package/dist/src/core/database/connection-pool.d.ts.map +0 -1
  375. package/dist/src/core/database/connection-pool.js +0 -236
  376. package/dist/src/core/database/connection-pool.js.map +0 -1
  377. package/dist/src/core/database/query-cache.d.ts +0 -135
  378. package/dist/src/core/database/query-cache.d.ts.map +0 -1
  379. package/dist/src/core/database/query-cache.js +0 -294
  380. package/dist/src/core/database/query-cache.js.map +0 -1
  381. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +0 -125
  382. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +0 -1
  383. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -282
  384. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -1
  385. package/dist/src/core/digest/frame-digest-integration.d.ts +0 -67
  386. package/dist/src/core/digest/frame-digest-integration.d.ts.map +0 -1
  387. package/dist/src/core/digest/frame-digest-integration.js +0 -198
  388. package/dist/src/core/digest/frame-digest-integration.js.map +0 -1
  389. package/dist/src/core/digest/hybrid-digest-generator.d.ts +0 -76
  390. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +0 -1
  391. package/dist/src/core/digest/hybrid-digest-generator.js +0 -629
  392. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -1
  393. package/dist/src/core/digest/index.d.ts +0 -9
  394. package/dist/src/core/digest/index.d.ts.map +0 -1
  395. package/dist/src/core/digest/index.js +0 -9
  396. package/dist/src/core/digest/index.js.map +0 -1
  397. package/dist/src/core/digest/types.d.ts +0 -154
  398. package/dist/src/core/digest/types.d.ts.map +0 -1
  399. package/dist/src/core/digest/types.js +0 -18
  400. package/dist/src/core/digest/types.js.map +0 -1
  401. package/dist/src/core/errors/index.d.ts +0 -143
  402. package/dist/src/core/errors/index.d.ts.map +0 -1
  403. package/dist/src/core/errors/index.js +0 -282
  404. package/dist/src/core/errors/index.js.map +0 -1
  405. package/dist/src/core/errors/recovery.d.ts +0 -86
  406. package/dist/src/core/errors/recovery.d.ts.map +0 -1
  407. package/dist/src/core/errors/recovery.js +0 -274
  408. package/dist/src/core/errors/recovery.js.map +0 -1
  409. package/dist/src/core/merge/conflict-detector.d.ts +0 -122
  410. package/dist/src/core/merge/conflict-detector.d.ts.map +0 -1
  411. package/dist/src/core/merge/conflict-detector.js +0 -468
  412. package/dist/src/core/merge/conflict-detector.js.map +0 -1
  413. package/dist/src/core/merge/index.d.ts +0 -9
  414. package/dist/src/core/merge/index.d.ts.map +0 -1
  415. package/dist/src/core/merge/index.js +0 -9
  416. package/dist/src/core/merge/index.js.map +0 -1
  417. package/dist/src/core/merge/resolution-engine.d.ts +0 -120
  418. package/dist/src/core/merge/resolution-engine.d.ts.map +0 -1
  419. package/dist/src/core/merge/resolution-engine.js +0 -573
  420. package/dist/src/core/merge/resolution-engine.js.map +0 -1
  421. package/dist/src/core/merge/stack-diff.d.ts +0 -97
  422. package/dist/src/core/merge/stack-diff.d.ts.map +0 -1
  423. package/dist/src/core/merge/stack-diff.js +0 -516
  424. package/dist/src/core/merge/stack-diff.js.map +0 -1
  425. package/dist/src/core/merge/types.d.ts +0 -110
  426. package/dist/src/core/merge/types.d.ts.map +0 -1
  427. package/dist/src/core/merge/types.js +0 -6
  428. package/dist/src/core/merge/types.js.map +0 -1
  429. package/dist/src/core/monitoring/error-handler.d.ts +0 -46
  430. package/dist/src/core/monitoring/error-handler.d.ts.map +0 -1
  431. package/dist/src/core/monitoring/error-handler.js +0 -212
  432. package/dist/src/core/monitoring/error-handler.js.map +0 -1
  433. package/dist/src/core/monitoring/logger.d.ts +0 -24
  434. package/dist/src/core/monitoring/logger.d.ts.map +0 -1
  435. package/dist/src/core/monitoring/logger.js +0 -126
  436. package/dist/src/core/monitoring/logger.js.map +0 -1
  437. package/dist/src/core/monitoring/metrics.d.ts +0 -10
  438. package/dist/src/core/monitoring/metrics.d.ts.map +0 -1
  439. package/dist/src/core/monitoring/metrics.js +0 -152
  440. package/dist/src/core/monitoring/metrics.js.map +0 -1
  441. package/dist/src/core/monitoring/progress-tracker.d.ts +0 -95
  442. package/dist/src/core/monitoring/progress-tracker.d.ts.map +0 -1
  443. package/dist/src/core/monitoring/progress-tracker.js +0 -178
  444. package/dist/src/core/monitoring/progress-tracker.js.map +0 -1
  445. package/dist/src/core/performance/context-cache.d.ts +0 -109
  446. package/dist/src/core/performance/context-cache.d.ts.map +0 -1
  447. package/dist/src/core/performance/context-cache.js +0 -280
  448. package/dist/src/core/performance/context-cache.js.map +0 -1
  449. package/dist/src/core/performance/index.d.ts +0 -3
  450. package/dist/src/core/performance/index.d.ts.map +0 -1
  451. package/dist/src/core/performance/index.js +0 -3
  452. package/dist/src/core/performance/index.js.map +0 -1
  453. package/dist/src/core/performance/lazy-context-loader.d.ts +0 -93
  454. package/dist/src/core/performance/lazy-context-loader.d.ts.map +0 -1
  455. package/dist/src/core/performance/lazy-context-loader.js +0 -332
  456. package/dist/src/core/performance/lazy-context-loader.js.map +0 -1
  457. package/dist/src/core/performance/monitor.d.ts +0 -48
  458. package/dist/src/core/performance/monitor.d.ts.map +0 -1
  459. package/dist/src/core/performance/monitor.js +0 -226
  460. package/dist/src/core/performance/monitor.js.map +0 -1
  461. package/dist/src/core/performance/optimized-frame-context.d.ts +0 -74
  462. package/dist/src/core/performance/optimized-frame-context.d.ts.map +0 -1
  463. package/dist/src/core/performance/optimized-frame-context.js +0 -330
  464. package/dist/src/core/performance/optimized-frame-context.js.map +0 -1
  465. package/dist/src/core/performance/performance-benchmark.d.ts +0 -50
  466. package/dist/src/core/performance/performance-benchmark.d.ts.map +0 -1
  467. package/dist/src/core/performance/performance-benchmark.js +0 -290
  468. package/dist/src/core/performance/performance-benchmark.js.map +0 -1
  469. package/dist/src/core/performance/performance-profiler.d.ts +0 -151
  470. package/dist/src/core/performance/performance-profiler.d.ts.map +0 -1
  471. package/dist/src/core/performance/performance-profiler.js +0 -346
  472. package/dist/src/core/performance/performance-profiler.js.map +0 -1
  473. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +0 -41
  474. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +0 -1
  475. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -193
  476. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -1
  477. package/dist/src/core/persistence/postgres-adapter.d.ts +0 -31
  478. package/dist/src/core/persistence/postgres-adapter.d.ts.map +0 -1
  479. package/dist/src/core/persistence/postgres-adapter.js +0 -330
  480. package/dist/src/core/persistence/postgres-adapter.js.map +0 -1
  481. package/dist/src/core/projects/project-manager.d.ts +0 -130
  482. package/dist/src/core/projects/project-manager.d.ts.map +0 -1
  483. package/dist/src/core/projects/project-manager.js +0 -709
  484. package/dist/src/core/projects/project-manager.js.map +0 -1
  485. package/dist/src/core/query/query-parser.d.ts +0 -109
  486. package/dist/src/core/query/query-parser.d.ts.map +0 -1
  487. package/dist/src/core/query/query-parser.js +0 -415
  488. package/dist/src/core/query/query-parser.js.map +0 -1
  489. package/dist/src/core/query/query-templates.d.ts +0 -44
  490. package/dist/src/core/query/query-templates.d.ts.map +0 -1
  491. package/dist/src/core/query/query-templates.js +0 -326
  492. package/dist/src/core/query/query-templates.js.map +0 -1
  493. package/dist/src/core/retrieval/index.d.ts +0 -8
  494. package/dist/src/core/retrieval/index.d.ts.map +0 -1
  495. package/dist/src/core/retrieval/index.js +0 -8
  496. package/dist/src/core/retrieval/index.js.map +0 -1
  497. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +0 -73
  498. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +0 -1
  499. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -597
  500. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -1
  501. package/dist/src/core/retrieval/summary-generator.d.ts +0 -63
  502. package/dist/src/core/retrieval/summary-generator.d.ts.map +0 -1
  503. package/dist/src/core/retrieval/summary-generator.js +0 -622
  504. package/dist/src/core/retrieval/summary-generator.js.map +0 -1
  505. package/dist/src/core/retrieval/types.d.ts +0 -257
  506. package/dist/src/core/retrieval/types.d.ts.map +0 -1
  507. package/dist/src/core/retrieval/types.js +0 -18
  508. package/dist/src/core/retrieval/types.js.map +0 -1
  509. package/dist/src/core/session/index.d.ts +0 -2
  510. package/dist/src/core/session/index.d.ts.map +0 -1
  511. package/dist/src/core/session/index.js +0 -2
  512. package/dist/src/core/session/index.js.map +0 -1
  513. package/dist/src/core/session/session-manager.d.ts +0 -69
  514. package/dist/src/core/session/session-manager.d.ts.map +0 -1
  515. package/dist/src/core/session/session-manager.js +0 -311
  516. package/dist/src/core/session/session-manager.js.map +0 -1
  517. package/dist/src/core/trace/cli-trace-wrapper.d.ts +0 -23
  518. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +0 -1
  519. package/dist/src/core/trace/cli-trace-wrapper.js +0 -141
  520. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -1
  521. package/dist/src/core/trace/db-trace-wrapper.d.ts +0 -36
  522. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +0 -1
  523. package/dist/src/core/trace/db-trace-wrapper.js +0 -252
  524. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -1
  525. package/dist/src/core/trace/debug-trace.d.ts +0 -84
  526. package/dist/src/core/trace/debug-trace.d.ts.map +0 -1
  527. package/dist/src/core/trace/debug-trace.js +0 -402
  528. package/dist/src/core/trace/debug-trace.js.map +0 -1
  529. package/dist/src/core/trace/error-test.d.ts +0 -6
  530. package/dist/src/core/trace/error-test.d.ts.map +0 -1
  531. package/dist/src/core/trace/error-test.js +0 -128
  532. package/dist/src/core/trace/error-test.js.map +0 -1
  533. package/dist/src/core/trace/index.d.ts +0 -25
  534. package/dist/src/core/trace/index.d.ts.map +0 -1
  535. package/dist/src/core/trace/index.js +0 -121
  536. package/dist/src/core/trace/index.js.map +0 -1
  537. package/dist/src/core/trace/linear-api-wrapper.d.ts +0 -17
  538. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +0 -1
  539. package/dist/src/core/trace/linear-api-wrapper.js +0 -205
  540. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -1
  541. package/dist/src/core/trace/performance-test.d.ts +0 -6
  542. package/dist/src/core/trace/performance-test.d.ts.map +0 -1
  543. package/dist/src/core/trace/performance-test.js +0 -111
  544. package/dist/src/core/trace/performance-test.js.map +0 -1
  545. package/dist/src/core/trace/trace-demo.d.ts +0 -8
  546. package/dist/src/core/trace/trace-demo.d.ts.map +0 -1
  547. package/dist/src/core/trace/trace-demo.js +0 -154
  548. package/dist/src/core/trace/trace-demo.js.map +0 -1
  549. package/dist/src/core/trace/trace-detector.d.ts +0 -108
  550. package/dist/src/core/trace/trace-detector.d.ts.map +0 -1
  551. package/dist/src/core/trace/trace-detector.demo.d.ts +0 -5
  552. package/dist/src/core/trace/trace-detector.demo.d.ts.map +0 -1
  553. package/dist/src/core/trace/trace-detector.demo.js +0 -145
  554. package/dist/src/core/trace/trace-detector.demo.js.map +0 -1
  555. package/dist/src/core/trace/trace-detector.js +0 -425
  556. package/dist/src/core/trace/trace-detector.js.map +0 -1
  557. package/dist/src/core/trace/trace-store.d.ts +0 -60
  558. package/dist/src/core/trace/trace-store.d.ts.map +0 -1
  559. package/dist/src/core/trace/trace-store.js +0 -323
  560. package/dist/src/core/trace/trace-store.js.map +0 -1
  561. package/dist/src/core/trace/types.d.ts +0 -81
  562. package/dist/src/core/trace/types.d.ts.map +0 -1
  563. package/dist/src/core/trace/types.js +0 -70
  564. package/dist/src/core/trace/types.js.map +0 -1
  565. package/dist/src/core/types.d.ts +0 -35
  566. package/dist/src/core/types.d.ts.map +0 -1
  567. package/dist/src/core/types.js +0 -2
  568. package/dist/src/core/types.js.map +0 -1
  569. package/dist/src/core/utils/update-checker.d.ts +0 -38
  570. package/dist/src/core/utils/update-checker.d.ts.map +0 -1
  571. package/dist/src/core/utils/update-checker.js +0 -213
  572. package/dist/src/core/utils/update-checker.js.map +0 -1
  573. package/dist/src/core/worktree/worktree-manager.d.ts +0 -110
  574. package/dist/src/core/worktree/worktree-manager.d.ts.map +0 -1
  575. package/dist/src/core/worktree/worktree-manager.js +0 -456
  576. package/dist/src/core/worktree/worktree-manager.js.map +0 -1
  577. package/dist/src/features/analytics/api/analytics-api.d.ts +0 -24
  578. package/dist/src/features/analytics/api/analytics-api.d.ts.map +0 -1
  579. package/dist/src/features/analytics/api/analytics-api.js +0 -289
  580. package/dist/src/features/analytics/api/analytics-api.js.map +0 -1
  581. package/dist/src/features/analytics/core/analytics-service.d.ts +0 -29
  582. package/dist/src/features/analytics/core/analytics-service.d.ts.map +0 -1
  583. package/dist/src/features/analytics/core/analytics-service.js +0 -275
  584. package/dist/src/features/analytics/core/analytics-service.js.map +0 -1
  585. package/dist/src/features/analytics/index.d.ts +0 -12
  586. package/dist/src/features/analytics/index.d.ts.map +0 -1
  587. package/dist/src/features/analytics/index.js +0 -11
  588. package/dist/src/features/analytics/index.js.map +0 -1
  589. package/dist/src/features/analytics/queries/metrics-queries.d.ts +0 -11
  590. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +0 -1
  591. package/dist/src/features/analytics/queries/metrics-queries.js +0 -240
  592. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -1
  593. package/dist/src/features/analytics/types/metrics.d.ts +0 -60
  594. package/dist/src/features/analytics/types/metrics.d.ts.map +0 -1
  595. package/dist/src/features/analytics/types/metrics.js +0 -2
  596. package/dist/src/features/analytics/types/metrics.js.map +0 -1
  597. package/dist/src/features/browser/browser-mcp.d.ts +0 -94
  598. package/dist/src/features/browser/browser-mcp.d.ts.map +0 -1
  599. package/dist/src/features/browser/browser-mcp.js +0 -459
  600. package/dist/src/features/browser/browser-mcp.js.map +0 -1
  601. package/dist/src/features/tasks/pebbles-task-store.d.ts +0 -128
  602. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +0 -1
  603. package/dist/src/features/tasks/pebbles-task-store.js +0 -572
  604. package/dist/src/features/tasks/pebbles-task-store.js.map +0 -1
  605. package/dist/src/features/tasks/task-aware-context.d.ts +0 -103
  606. package/dist/src/features/tasks/task-aware-context.d.ts.map +0 -1
  607. package/dist/src/features/tasks/task-aware-context.js +0 -412
  608. package/dist/src/features/tasks/task-aware-context.js.map +0 -1
  609. package/dist/src/index.d.ts +0 -21
  610. package/dist/src/index.d.ts.map +0 -1
  611. package/dist/src/index.js +0 -9
  612. package/dist/src/index.js.map +0 -1
  613. package/dist/src/integrations/linear/auth.d.ts +0 -99
  614. package/dist/src/integrations/linear/auth.d.ts.map +0 -1
  615. package/dist/src/integrations/linear/auth.js +0 -319
  616. package/dist/src/integrations/linear/auth.js.map +0 -1
  617. package/dist/src/integrations/linear/auto-sync.d.ts +0 -77
  618. package/dist/src/integrations/linear/auto-sync.d.ts.map +0 -1
  619. package/dist/src/integrations/linear/auto-sync.js +0 -268
  620. package/dist/src/integrations/linear/auto-sync.js.map +0 -1
  621. package/dist/src/integrations/linear/client.d.ts +0 -127
  622. package/dist/src/integrations/linear/client.d.ts.map +0 -1
  623. package/dist/src/integrations/linear/client.js +0 -446
  624. package/dist/src/integrations/linear/client.js.map +0 -1
  625. package/dist/src/integrations/linear/config.d.ts +0 -51
  626. package/dist/src/integrations/linear/config.d.ts.map +0 -1
  627. package/dist/src/integrations/linear/config.js +0 -103
  628. package/dist/src/integrations/linear/config.js.map +0 -1
  629. package/dist/src/integrations/linear/sync-manager.d.ts +0 -78
  630. package/dist/src/integrations/linear/sync-manager.d.ts.map +0 -1
  631. package/dist/src/integrations/linear/sync-manager.js +0 -235
  632. package/dist/src/integrations/linear/sync-manager.js.map +0 -1
  633. package/dist/src/integrations/linear/sync-service.d.ts +0 -46
  634. package/dist/src/integrations/linear/sync-service.d.ts.map +0 -1
  635. package/dist/src/integrations/linear/sync-service.js +0 -217
  636. package/dist/src/integrations/linear/sync-service.js.map +0 -1
  637. package/dist/src/integrations/linear/sync.d.ts +0 -125
  638. package/dist/src/integrations/linear/sync.d.ts.map +0 -1
  639. package/dist/src/integrations/linear/sync.js +0 -563
  640. package/dist/src/integrations/linear/sync.js.map +0 -1
  641. package/dist/src/integrations/linear/types.d.ts +0 -90
  642. package/dist/src/integrations/linear/types.d.ts.map +0 -1
  643. package/dist/src/integrations/linear/types.js +0 -2
  644. package/dist/src/integrations/linear/types.js.map +0 -1
  645. package/dist/src/integrations/linear/webhook-server.d.ts +0 -32
  646. package/dist/src/integrations/linear/webhook-server.d.ts.map +0 -1
  647. package/dist/src/integrations/linear/webhook-server.js +0 -190
  648. package/dist/src/integrations/linear/webhook-server.js.map +0 -1
  649. package/dist/src/integrations/linear/webhook.d.ts +0 -108
  650. package/dist/src/integrations/linear/webhook.d.ts.map +0 -1
  651. package/dist/src/integrations/linear/webhook.js +0 -291
  652. package/dist/src/integrations/linear/webhook.js.map +0 -1
  653. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +0 -39
  654. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +0 -1
  655. package/dist/src/integrations/mcp/handlers/context-handlers.js +0 -266
  656. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -1
  657. package/dist/src/integrations/mcp/handlers/index.d.ts +0 -37
  658. package/dist/src/integrations/mcp/handlers/index.d.ts.map +0 -1
  659. package/dist/src/integrations/mcp/handlers/index.js +0 -134
  660. package/dist/src/integrations/mcp/handlers/index.js.map +0 -1
  661. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +0 -33
  662. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +0 -1
  663. package/dist/src/integrations/mcp/handlers/linear-handlers.js +0 -251
  664. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -1
  665. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +0 -42
  666. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +0 -1
  667. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -238
  668. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -1
  669. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +0 -41
  670. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +0 -1
  671. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -298
  672. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -1
  673. package/dist/src/integrations/mcp/index.d.ts +0 -13
  674. package/dist/src/integrations/mcp/index.d.ts.map +0 -1
  675. package/dist/src/integrations/mcp/index.js +0 -17
  676. package/dist/src/integrations/mcp/index.js.map +0 -1
  677. package/dist/src/integrations/mcp/refactored-server.d.ts +0 -76
  678. package/dist/src/integrations/mcp/refactored-server.d.ts.map +0 -1
  679. package/dist/src/integrations/mcp/refactored-server.js +0 -351
  680. package/dist/src/integrations/mcp/refactored-server.js.map +0 -1
  681. package/dist/src/integrations/mcp/server.d.ts +0 -54
  682. package/dist/src/integrations/mcp/server.d.ts.map +0 -1
  683. package/dist/src/integrations/mcp/server.js +0 -1616
  684. package/dist/src/integrations/mcp/server.js.map +0 -1
  685. package/dist/src/integrations/mcp/tool-definitions.d.ts +0 -44
  686. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +0 -1
  687. package/dist/src/integrations/mcp/tool-definitions.js +0 -563
  688. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -1
  689. package/dist/src/integrations/mcp/trace-test.d.ts +0 -5
  690. package/dist/src/integrations/mcp/trace-test.d.ts.map +0 -1
  691. package/dist/src/integrations/mcp/trace-test.js +0 -54
  692. package/dist/src/integrations/mcp/trace-test.js.map +0 -1
  693. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +0 -48
  694. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +0 -1
  695. package/dist/src/integrations/pg-aiguide/embedding-provider.js +0 -190
  696. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +0 -1
  697. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +0 -34
  698. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +0 -1
  699. package/dist/src/integrations/pg-aiguide/semantic-search.js +0 -176
  700. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +0 -1
  701. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +0 -44
  702. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +0 -1
  703. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +0 -215
  704. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +0 -1
  705. package/dist/src/mcp/stackmemory-mcp-server.d.ts +0 -9
  706. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +0 -1
  707. package/dist/src/mcp/stackmemory-mcp-server.js +0 -519
  708. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -1
  709. package/dist/src/middleware/exponential-rate-limiter.d.ts +0 -78
  710. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +0 -1
  711. package/dist/src/middleware/exponential-rate-limiter.js +0 -293
  712. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -1
  713. package/dist/src/models/user.model.d.ts +0 -62
  714. package/dist/src/models/user.model.d.ts.map +0 -1
  715. package/dist/src/models/user.model.js +0 -311
  716. package/dist/src/models/user.model.js.map +0 -1
  717. package/dist/src/servers/production/auth-middleware.d.ts +0 -76
  718. package/dist/src/servers/production/auth-middleware.d.ts.map +0 -1
  719. package/dist/src/servers/production/auth-middleware.js +0 -558
  720. package/dist/src/servers/production/auth-middleware.js.map +0 -1
  721. package/dist/src/servers/railway/index.d.ts +0 -7
  722. package/dist/src/servers/railway/index.d.ts.map +0 -1
  723. package/dist/src/servers/railway/index.js +0 -401
  724. package/dist/src/servers/railway/index.js.map +0 -1
  725. package/dist/src/services/config-service.d.ts +0 -44
  726. package/dist/src/services/config-service.d.ts.map +0 -1
  727. package/dist/src/services/config-service.js +0 -61
  728. package/dist/src/services/config-service.js.map +0 -1
  729. package/dist/src/services/context-service.d.ts +0 -17
  730. package/dist/src/services/context-service.d.ts.map +0 -1
  731. package/dist/src/services/context-service.js +0 -173
  732. package/dist/src/services/context-service.js.map +0 -1
  733. package/dist/src/types/task.d.ts +0 -27
  734. package/dist/src/types/task.d.ts.map +0 -1
  735. package/dist/src/types/task.js +0 -2
  736. package/dist/src/types/task.js.map +0 -1
  737. package/dist/src/utils/logger.d.ts +0 -13
  738. package/dist/src/utils/logger.d.ts.map +0 -1
  739. package/dist/src/utils/logger.js +0 -52
  740. package/dist/src/utils/logger.js.map +0 -1
  741. package/dist/src/validation/schemas.d.ts +0 -633
  742. package/dist/src/validation/schemas.d.ts.map +0 -1
  743. package/dist/src/validation/schemas.js +0 -347
  744. package/dist/src/validation/schemas.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/dashboard.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * Dashboard Command - Display monitoring dashboard in terminal\n */\n\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { SessionManager } from '../../core/session/session-manager.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\nexport const dashboardCommand = {\n command: 'dashboard',\n describe: 'Display monitoring dashboard in terminal',\n builder: (yargs: any) => {\n return yargs\n .option('watch', {\n alias: 'w',\n type: 'boolean',\n description: 'Auto-refresh dashboard',\n default: false\n })\n .option('interval', {\n alias: 'i',\n type: 'number',\n description: 'Refresh interval in seconds',\n default: 5\n });\n },\n handler: async (argv: any) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log('\u274C StackMemory not initialized. Run \"stackmemory init\" first.');\n return;\n }\n\n const displayDashboard = async () => {\n console.clear();\n \n // Header\n 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'));\n console.log(chalk.cyan.bold(' \uD83D\uDE80 StackMemory Monitoring Dashboard '));\n 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'));\n console.log();\n\n const sessionManager = new SessionManager({ enableMonitoring: false });\n await sessionManager.initialize();\n \n const db = new Database(dbPath);\n\n // Get sessions\n const sessions = await sessionManager.listSessions({ \n state: 'active',\n limit: 5 \n });\n \n // Sessions Table\n const sessionsTable = new Table({\n head: [\n chalk.white('Session ID'),\n chalk.white('Status'),\n chalk.white('Branch'),\n chalk.white('Duration'),\n chalk.white('Last Active')\n ],\n style: { head: [], border: [] }\n });\n\n sessions.forEach(session => {\n const duration = Math.round((Date.now() - session.startedAt) / 1000 / 60);\n const lastActive = Math.round((Date.now() - session.lastActiveAt) / 1000 / 60);\n const status = session.state === 'active' \n ? chalk.green('\u25CF Active')\n : session.state === 'completed'\n ? chalk.gray('\u25CF Completed')\n : chalk.yellow('\u25CF Idle');\n\n sessionsTable.push([\n session.sessionId.substring(0, 8),\n status,\n session.branch || 'main',\n `${duration}m`,\n `${lastActive}m ago`\n ]);\n });\n\n console.log(chalk.yellow.bold('\uD83D\uDCCA Active Sessions'));\n console.log(sessionsTable.toString());\n console.log();\n\n // Frame Statistics\n const frameStats = db.prepare(`\n SELECT \n COUNT(*) as total,\n SUM(CASE WHEN state = 'active' THEN 1 ELSE 0 END) as active,\n COUNT(DISTINCT run_id) as sessions\n FROM frames\n `).get() as any;\n\n const statsTable = new Table({\n head: [chalk.white('Metric'), chalk.white('Value')],\n style: { head: [], border: [] }\n });\n\n statsTable.push(\n ['Total Frames', frameStats.total || 0],\n ['Active Frames', chalk.green(frameStats.active || 0)],\n ['Total Sessions', frameStats.sessions || 0]\n );\n\n console.log(chalk.yellow.bold('\uD83D\uDCC8 Frame Statistics'));\n console.log(statsTable.toString());\n console.log();\n\n // Recent Activity\n const recentActivity = db.prepare(`\n SELECT \n name,\n type,\n state,\n datetime(created_at, 'unixepoch') as created\n FROM frames\n ORDER BY created_at DESC\n LIMIT 5\n `).all() as any[];\n\n if (recentActivity.length > 0) {\n const activityTable = new Table({\n head: [\n chalk.white('Frame'),\n chalk.white('Type'),\n chalk.white('Status'),\n chalk.white('Created')\n ],\n style: { head: [], border: [] }\n });\n\n recentActivity.forEach(frame => {\n const status = frame.state === 'active'\n ? chalk.green('Active')\n : chalk.gray('Closed');\n \n activityTable.push([\n frame.name.substring(0, 30),\n frame.type,\n status,\n frame.created\n ]);\n });\n\n console.log(chalk.yellow.bold('\uD83D\uDD50 Recent Activity'));\n console.log(activityTable.toString());\n console.log();\n }\n\n // Memory Usage\n const contextUsage = await estimateContextUsage(db);\n const usageBar = createProgressBar(contextUsage, 100);\n \n console.log(chalk.yellow.bold('\uD83D\uDCBE Context Usage'));\n console.log(`${usageBar} ${contextUsage}%`);\n console.log();\n\n db.close();\n\n // Footer\n if (argv.watch) {\n console.log(chalk.gray(`Auto-refreshing every ${argv.interval} seconds. Press Ctrl+C to exit.`));\n } else {\n console.log(chalk.gray('Run with --watch to auto-refresh'));\n }\n };\n\n try {\n await displayDashboard();\n\n if (argv.watch) {\n const interval = setInterval(async () => {\n await displayDashboard();\n }, argv.interval * 1000);\n\n process.on('SIGINT', () => {\n clearInterval(interval);\n console.clear();\n console.log(chalk.green('\u2705 Dashboard closed'));\n process.exit(0);\n });\n }\n } catch (error) {\n console.error(chalk.red('\u274C Dashboard error:'), (error as Error).message);\n process.exit(1);\n }\n }\n};\n\nfunction createProgressBar(value: number, max: number): string {\n const percentage = Math.min(100, Math.round((value / max) * 100));\n const filled = Math.round(percentage / 5);\n const empty = 20 - filled;\n \n let color = chalk.green;\n if (percentage > 80) color = chalk.red;\n else if (percentage > 60) color = chalk.yellow;\n \n return color('\u2588'.repeat(filled)) + chalk.gray('\u2591'.repeat(empty));\n}\n\nasync function estimateContextUsage(db: Database): Promise<number> {\n const result = db.prepare(`\n SELECT \n COUNT(*) as frame_count,\n SUM(LENGTH(inputs)) as input_size,\n SUM(LENGTH(outputs)) as output_size\n FROM frames\n WHERE state = 'active'\n `).get() as any;\n\n // Rough estimate: assume average token is 4 bytes\n const totalBytes = (result.input_size || 0) + (result.output_size || 0);\n const estimatedTokens = totalBytes / 4;\n const maxTokens = 128000; // Claude's context window\n \n return Math.round((estimatedTokens / maxTokens) * 100);\n}"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -8,14 +8,18 @@ import { PebblesTaskStore } from "../../features/tasks/pebbles-task-store.js";
8
8
  import { logger } from "../../core/monitoring/logger.js";
9
9
  function createHandoffCommand() {
10
10
  const cmd = new Command("handoff");
11
- cmd.description("Commit current work and generate a handoff prompt for the next session").option("-m, --message <message>", "Custom commit message").option("--no-commit", "Skip git commit").option("--copy", "Copy the handoff prompt to clipboard").action(async (options) => {
11
+ cmd.description("Session handoff for continuity between Claude sessions");
12
+ cmd.command("capture", { isDefault: true }).description("Commit current work and generate a handoff prompt").option("-m, --message <message>", "Custom commit message").option("--no-commit", "Skip git commit").option("--copy", "Copy the handoff prompt to clipboard").action(async (options) => {
12
13
  try {
13
14
  const projectRoot = process.cwd();
14
15
  const dbPath = join(projectRoot, ".stackmemory", "context.db");
15
16
  let gitStatus = "";
16
17
  let hasChanges = false;
17
18
  try {
18
- gitStatus = execSync("git status --short", { encoding: "utf-8", cwd: projectRoot });
19
+ gitStatus = execSync("git status --short", {
20
+ encoding: "utf-8",
21
+ cwd: projectRoot
22
+ });
19
23
  hasChanges = gitStatus.trim().length > 0;
20
24
  } catch (err) {
21
25
  console.log("\u26A0\uFE0F Not in a git repository");
@@ -32,7 +36,10 @@ function createHandoffCommand() {
32
36
  console.log(`\u2705 Committed changes: "${commitMessage}"`);
33
37
  console.log(` Branch: ${currentBranch}`);
34
38
  } catch (err) {
35
- console.error("\u274C Failed to commit changes:", err.message);
39
+ console.error(
40
+ "\u274C Failed to commit changes:",
41
+ err.message
42
+ );
36
43
  }
37
44
  } else if (!hasChanges) {
38
45
  console.log("\u2139\uFE0F No changes to commit");
@@ -53,9 +60,13 @@ function createHandoffCommand() {
53
60
  }
54
61
  const taskStore = new PebblesTaskStore(projectRoot, db);
55
62
  const activeTasks = taskStore.getActiveTasks();
56
- const inProgress = activeTasks.filter((t) => t.status === "in_progress");
63
+ const inProgress = activeTasks.filter(
64
+ (t) => t.status === "in_progress"
65
+ );
57
66
  const todo = activeTasks.filter((t) => t.status === "pending");
58
- const recentlyCompleted = activeTasks.filter((t) => t.status === "completed" && t.completed_at).sort((a, b) => (b.completed_at || 0) - (a.completed_at || 0)).slice(0, 3);
67
+ const recentlyCompleted = activeTasks.filter((t) => t.status === "completed" && t.completed_at).sort(
68
+ (a, b) => (b.completed_at || 0) - (a.completed_at || 0)
69
+ ).slice(0, 3);
59
70
  if (inProgress.length > 0 || todo.length > 0) {
60
71
  tasksSummary = "\nTasks:\n";
61
72
  if (inProgress.length > 0) {
@@ -86,12 +97,14 @@ function createHandoffCommand() {
86
97
  `;
87
98
  });
88
99
  }
89
- const recentEvents = db.prepare(`
100
+ const recentEvents = db.prepare(
101
+ `
90
102
  SELECT event_type as type, payload as data, datetime(ts, 'unixepoch') as time
91
103
  FROM events
92
104
  ORDER BY ts DESC
93
105
  LIMIT 5
94
- `).all();
106
+ `
107
+ ).all();
95
108
  if (recentEvents.length > 0) {
96
109
  recentWork += "\nRecent Activity:\n";
97
110
  recentEvents.forEach((event) => {
@@ -157,7 +170,11 @@ ${notes}
157
170
  ---
158
171
  Generated by stackmemory handoff at ${timestamp}
159
172
  `;
160
- const handoffPath = join(projectRoot, ".stackmemory", "last-handoff.md");
173
+ const handoffPath = join(
174
+ projectRoot,
175
+ ".stackmemory",
176
+ "last-handoff.md"
177
+ );
161
178
  writeFileSync(handoffPath, handoffPrompt);
162
179
  console.log("\n" + "=".repeat(60));
163
180
  console.log(handoffPrompt);
@@ -183,6 +200,106 @@ Generated by stackmemory handoff at ${timestamp}
183
200
  process.exit(1);
184
201
  }
185
202
  });
203
+ cmd.command("restore").description("Restore context from last handoff").option("--no-copy", "Do not copy prompt to clipboard").action(async (options) => {
204
+ try {
205
+ const projectRoot = process.cwd();
206
+ const handoffPath = join(
207
+ projectRoot,
208
+ ".stackmemory",
209
+ "last-handoff.md"
210
+ );
211
+ const metaPath = join(
212
+ process.env.HOME || "~",
213
+ ".stackmemory",
214
+ "handoffs",
215
+ "last-handoff-meta.json"
216
+ );
217
+ if (!existsSync(handoffPath)) {
218
+ console.log("\u274C No handoff found in this project");
219
+ console.log('\u{1F4A1} Run "stackmemory handoff" to create one');
220
+ return;
221
+ }
222
+ const handoffPrompt = readFileSync(handoffPath, "utf-8");
223
+ console.log("\n" + "=".repeat(60));
224
+ console.log("\u{1F4CB} RESTORED HANDOFF");
225
+ console.log("=".repeat(60));
226
+ console.log(handoffPrompt);
227
+ console.log("=".repeat(60));
228
+ if (existsSync(metaPath)) {
229
+ const metadata = JSON.parse(readFileSync(metaPath, "utf-8"));
230
+ console.log("\n\u{1F4CA} Session Metadata:");
231
+ console.log(` Timestamp: ${metadata.timestamp}`);
232
+ console.log(` Reason: ${metadata.reason}`);
233
+ console.log(` Duration: ${metadata.session_duration}s`);
234
+ console.log(` Command: ${metadata.command}`);
235
+ }
236
+ try {
237
+ const gitStatus = execSync("git status --short", {
238
+ encoding: "utf-8"
239
+ }).trim();
240
+ if (gitStatus) {
241
+ console.log("\n\u26A0\uFE0F Current uncommitted changes:");
242
+ console.log(gitStatus);
243
+ }
244
+ } catch (err) {
245
+ }
246
+ if (options.copy !== false) {
247
+ try {
248
+ const copyCommand = process.platform === "darwin" ? "pbcopy" : process.platform === "win32" ? "clip" : "xclip -selection clipboard";
249
+ execSync(copyCommand, {
250
+ input: handoffPrompt,
251
+ cwd: projectRoot
252
+ });
253
+ console.log("\n\u2705 Handoff prompt copied to clipboard!");
254
+ } catch (err) {
255
+ console.log("\n\u26A0\uFE0F Could not copy to clipboard");
256
+ }
257
+ }
258
+ console.log("\n\u{1F680} Ready to continue where you left off!");
259
+ } catch (error) {
260
+ logger.error("Handoff restore failed", error);
261
+ console.error("\u274C Restore failed:", error.message);
262
+ process.exit(1);
263
+ }
264
+ });
265
+ cmd.command("auto").description("Enable auto-capture on session termination").option("--command <command>", "Command to wrap with auto-handoff").action(async (options) => {
266
+ const scriptPath = join(
267
+ __dirname,
268
+ "..",
269
+ "..",
270
+ "..",
271
+ "scripts",
272
+ "stackmemory-auto-handoff.sh"
273
+ );
274
+ if (!existsSync(scriptPath)) {
275
+ console.error("\u274C Auto-handoff script not found");
276
+ console.log("\u{1F4E6} Please ensure StackMemory is properly installed");
277
+ return;
278
+ }
279
+ console.log("\u{1F6E1}\uFE0F StackMemory Auto-Handoff");
280
+ console.log("\u2500".repeat(50));
281
+ if (options.command) {
282
+ console.log(`Wrapping command: ${options.command}`);
283
+ execSync(`${scriptPath} ${options.command}`, {
284
+ stdio: "inherit",
285
+ env: { ...process.env, AUTO_CAPTURE_ON_EXIT: "true" }
286
+ });
287
+ } else {
288
+ console.log("To enable auto-handoff for your current session:");
289
+ console.log("");
290
+ console.log(" For bash/zsh:");
291
+ console.log(` source <(${scriptPath} --shell)`);
292
+ console.log("");
293
+ console.log(" Or wrap a command:");
294
+ console.log(` ${scriptPath} claude`);
295
+ console.log(` ${scriptPath} npm run dev`);
296
+ console.log("");
297
+ console.log(" Add to your shell profile for permanent setup:");
298
+ console.log(
299
+ ` echo 'alias claude="${scriptPath} claude"' >> ~/.bashrc`
300
+ );
301
+ }
302
+ });
186
303
  return cmd;
187
304
  }
188
305
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/commands/handoff.ts"],
4
- "sourcesContent": ["/**\n * Handoff command - Commits work and generates a prompt for the next session\n */\n\nimport { Command } from 'commander';\nimport { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport Database from 'better-sqlite3';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { PebblesTaskStore } from '../../features/tasks/pebbles-task-store.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport function createHandoffCommand(): Command {\n const cmd = new Command('handoff');\n \n cmd\n .description('Commit current work and generate a handoff prompt for the next session')\n .option('-m, --message <message>', 'Custom commit message')\n .option('--no-commit', 'Skip git commit')\n .option('--copy', 'Copy the handoff prompt to clipboard')\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n \n // 1. Check git status\n let gitStatus = '';\n let hasChanges = false;\n \n try {\n gitStatus = execSync('git status --short', { encoding: 'utf-8', cwd: projectRoot });\n hasChanges = gitStatus.trim().length > 0;\n } catch (err) {\n console.log('\u26A0\uFE0F Not in a git repository');\n }\n \n // 2. Commit if there are changes and not skipped\n if (hasChanges && options.commit !== false) {\n try {\n // Get current branch\n const currentBranch = execSync('git rev-parse --abbrev-ref HEAD', { \n encoding: 'utf-8', \n cwd: projectRoot \n }).trim();\n \n // Stage all changes\n execSync('git add -A', { cwd: projectRoot });\n \n // Generate or use custom commit message\n const commitMessage = options.message || `chore: handoff checkpoint on ${currentBranch}`;\n \n // Commit\n execSync(`git commit -m \"${commitMessage}\"`, { cwd: projectRoot });\n \n console.log(`\u2705 Committed changes: \"${commitMessage}\"`);\n console.log(` Branch: ${currentBranch}`);\n } catch (err) {\n console.error('\u274C Failed to commit changes:', (err as Error).message);\n }\n } else if (!hasChanges) {\n console.log('\u2139\uFE0F No changes to commit');\n }\n \n // 3. Gather context for handoff prompt\n let contextSummary = '';\n let tasksSummary = '';\n let recentWork = '';\n \n if (existsSync(dbPath)) {\n const db = new Database(dbPath);\n \n // Get recent context\n const frameManager = new FrameManager(db, 'cli-project');\n const activeFrames = frameManager.getActiveFramePath();\n \n if (activeFrames.length > 0) {\n contextSummary = 'Active context frames:\\n';\n activeFrames.forEach(frame => {\n contextSummary += ` - ${frame.name} [${frame.type}]\\n`;\n });\n }\n \n // Get task status\n const taskStore = new PebblesTaskStore(projectRoot, db);\n const activeTasks = taskStore.getActiveTasks();\n \n const inProgress = activeTasks.filter((t: any) => t.status === 'in_progress');\n const todo = activeTasks.filter((t: any) => t.status === 'pending');\n const recentlyCompleted = activeTasks\n .filter((t: any) => t.status === 'completed' && t.completed_at)\n .sort((a: any, b: any) => (b.completed_at || 0) - (a.completed_at || 0))\n .slice(0, 3);\n \n if (inProgress.length > 0 || todo.length > 0) {\n tasksSummary = '\\nTasks:\\n';\n \n if (inProgress.length > 0) {\n tasksSummary += 'In Progress:\\n';\n inProgress.forEach((t: any) => {\n const externalId = t.external_refs?.linear?.id;\n tasksSummary += ` - ${t.title}${externalId ? ` [${externalId}]` : ''}\\n`;\n });\n }\n \n if (todo.length > 0) {\n tasksSummary += 'TODO:\\n';\n todo.slice(0, 5).forEach((t: any) => {\n const externalId = t.external_refs?.linear?.id;\n tasksSummary += ` - ${t.title}${externalId ? ` [${externalId}]` : ''}\\n`;\n });\n if (todo.length > 5) {\n tasksSummary += ` ... and ${todo.length - 5} more\\n`;\n }\n }\n }\n \n if (recentlyCompleted.length > 0) {\n recentWork = '\\nRecently Completed:\\n';\n recentlyCompleted.forEach((t: any) => {\n recentWork += ` \u2713 ${t.title}\\n`;\n });\n }\n \n // Get recent events\n const recentEvents = db.prepare(`\n SELECT event_type as type, payload as data, datetime(ts, 'unixepoch') as time\n FROM events\n ORDER BY ts DESC\n LIMIT 5\n `).all() as any[];\n \n if (recentEvents.length > 0) {\n recentWork += '\\nRecent Activity:\\n';\n recentEvents.forEach(event => {\n const data = JSON.parse(event.data);\n recentWork += ` - ${event.type}: ${data.message || data.name || 'activity'}\\n`;\n });\n }\n \n db.close();\n }\n \n // 4. Get current git info\n let gitInfo = '';\n try {\n const branch = execSync('git rev-parse --abbrev-ref HEAD', { \n encoding: 'utf-8', \n cwd: projectRoot \n }).trim();\n \n const lastCommit = execSync('git log -1 --oneline', { \n encoding: 'utf-8', \n cwd: projectRoot \n }).trim();\n \n gitInfo = `\\nGit Status:\\n Branch: ${branch}\\n Last commit: ${lastCommit}\\n`;\n } catch (err) {\n // Ignore git errors\n }\n \n // 5. Check for any blockers or notes\n let notes = '';\n const notesPath = join(projectRoot, '.stackmemory', 'handoff.md');\n if (existsSync(notesPath)) {\n const handoffNotes = readFileSync(notesPath, 'utf-8');\n if (handoffNotes.trim()) {\n notes = `\\nNotes from previous handoff:\\n${handoffNotes}\\n`;\n }\n }\n \n // 6. Generate the handoff prompt\n const timestamp = new Date().toISOString();\n const handoffPrompt = `# Session Handoff - ${timestamp}\n\n## Project: ${projectRoot.split('/').pop()}\n\n${gitInfo}\n${contextSummary}\n${tasksSummary}\n${recentWork}\n${notes}\n\n## Continue from here:\n\n1. Run \\`stackmemory status\\` to check the current state\n2. Review any in-progress tasks above\n3. Check for any uncommitted changes with \\`git status\\`\n4. Resume work on the active context\n\n## Quick Commands:\n- \\`stackmemory context load --recent\\` - Load recent context\n- \\`stackmemory task list --state in_progress\\` - Show in-progress tasks\n- \\`stackmemory linear sync\\` - Sync with Linear if configured\n- \\`stackmemory log recent\\` - View recent activity\n\n---\nGenerated by stackmemory handoff at ${timestamp}\n`;\n \n // 7. Save handoff prompt\n const handoffPath = join(projectRoot, '.stackmemory', 'last-handoff.md');\n writeFileSync(handoffPath, handoffPrompt);\n \n // 8. Display the prompt\n console.log('\\n' + '='.repeat(60));\n console.log(handoffPrompt);\n console.log('='.repeat(60));\n \n // 9. Copy to clipboard if requested\n if (options.copy) {\n try {\n const copyCommand = process.platform === 'darwin' \n ? 'pbcopy' \n : process.platform === 'win32' \n ? 'clip' \n : 'xclip -selection clipboard';\n \n execSync(copyCommand, { \n input: handoffPrompt,\n cwd: projectRoot \n });\n \n console.log('\\n\u2705 Handoff prompt copied to clipboard!');\n } catch (err) {\n console.log('\\n\u26A0\uFE0F Could not copy to clipboard');\n }\n }\n \n console.log(`\\n\uD83D\uDCBE Handoff saved to: ${handoffPath}`);\n console.log('\uD83D\uDCCB Use this prompt when starting your next session');\n \n } catch (error) {\n logger.error('Handoff command failed', error as Error);\n console.error('\u274C Handoff failed:', (error as Error).message);\n process.exit(1);\n }\n });\n \n return cmd;\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Handoff command - Commits work and generates a prompt for the next session\n */\n\nimport { Command } from 'commander';\nimport { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport Database from 'better-sqlite3';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { PebblesTaskStore } from '../../features/tasks/pebbles-task-store.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport function createHandoffCommand(): Command {\n const cmd = new Command('handoff');\n\n cmd.description('Session handoff for continuity between Claude sessions');\n\n // Default action - capture handoff\n cmd\n .command('capture', { isDefault: true })\n .description('Commit current work and generate a handoff prompt')\n .option('-m, --message <message>', 'Custom commit message')\n .option('--no-commit', 'Skip git commit')\n .option('--copy', 'Copy the handoff prompt to clipboard')\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n // 1. Check git status\n let gitStatus = '';\n let hasChanges = false;\n\n try {\n gitStatus = execSync('git status --short', {\n encoding: 'utf-8',\n cwd: projectRoot,\n });\n hasChanges = gitStatus.trim().length > 0;\n } catch (err) {\n console.log('\u26A0\uFE0F Not in a git repository');\n }\n\n // 2. Commit if there are changes and not skipped\n if (hasChanges && options.commit !== false) {\n try {\n // Get current branch\n const currentBranch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n\n // Stage all changes\n execSync('git add -A', { cwd: projectRoot });\n\n // Generate or use custom commit message\n const commitMessage =\n options.message ||\n `chore: handoff checkpoint on ${currentBranch}`;\n\n // Commit\n execSync(`git commit -m \"${commitMessage}\"`, { cwd: projectRoot });\n\n console.log(`\u2705 Committed changes: \"${commitMessage}\"`);\n console.log(` Branch: ${currentBranch}`);\n } catch (err) {\n console.error(\n '\u274C Failed to commit changes:',\n (err as Error).message\n );\n }\n } else if (!hasChanges) {\n console.log('\u2139\uFE0F No changes to commit');\n }\n\n // 3. Gather context for handoff prompt\n let contextSummary = '';\n let tasksSummary = '';\n let recentWork = '';\n\n if (existsSync(dbPath)) {\n const db = new Database(dbPath);\n\n // Get recent context\n const frameManager = new FrameManager(db, 'cli-project');\n const activeFrames = frameManager.getActiveFramePath();\n\n if (activeFrames.length > 0) {\n contextSummary = 'Active context frames:\\n';\n activeFrames.forEach((frame) => {\n contextSummary += ` - ${frame.name} [${frame.type}]\\n`;\n });\n }\n\n // Get task status\n const taskStore = new PebblesTaskStore(projectRoot, db);\n const activeTasks = taskStore.getActiveTasks();\n\n const inProgress = activeTasks.filter(\n (t: any) => t.status === 'in_progress'\n );\n const todo = activeTasks.filter((t: any) => t.status === 'pending');\n const recentlyCompleted = activeTasks\n .filter((t: any) => t.status === 'completed' && t.completed_at)\n .sort(\n (a: any, b: any) => (b.completed_at || 0) - (a.completed_at || 0)\n )\n .slice(0, 3);\n\n if (inProgress.length > 0 || todo.length > 0) {\n tasksSummary = '\\nTasks:\\n';\n\n if (inProgress.length > 0) {\n tasksSummary += 'In Progress:\\n';\n inProgress.forEach((t: any) => {\n const externalId = t.external_refs?.linear?.id;\n tasksSummary += ` - ${t.title}${externalId ? ` [${externalId}]` : ''}\\n`;\n });\n }\n\n if (todo.length > 0) {\n tasksSummary += 'TODO:\\n';\n todo.slice(0, 5).forEach((t: any) => {\n const externalId = t.external_refs?.linear?.id;\n tasksSummary += ` - ${t.title}${externalId ? ` [${externalId}]` : ''}\\n`;\n });\n if (todo.length > 5) {\n tasksSummary += ` ... and ${todo.length - 5} more\\n`;\n }\n }\n }\n\n if (recentlyCompleted.length > 0) {\n recentWork = '\\nRecently Completed:\\n';\n recentlyCompleted.forEach((t: any) => {\n recentWork += ` \u2713 ${t.title}\\n`;\n });\n }\n\n // Get recent events\n const recentEvents = db\n .prepare(\n `\n SELECT event_type as type, payload as data, datetime(ts, 'unixepoch') as time\n FROM events\n ORDER BY ts DESC\n LIMIT 5\n `\n )\n .all() as any[];\n\n if (recentEvents.length > 0) {\n recentWork += '\\nRecent Activity:\\n';\n recentEvents.forEach((event) => {\n const data = JSON.parse(event.data);\n recentWork += ` - ${event.type}: ${data.message || data.name || 'activity'}\\n`;\n });\n }\n\n db.close();\n }\n\n // 4. Get current git info\n let gitInfo = '';\n try {\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n\n const lastCommit = execSync('git log -1 --oneline', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n\n gitInfo = `\\nGit Status:\\n Branch: ${branch}\\n Last commit: ${lastCommit}\\n`;\n } catch (err) {\n // Ignore git errors\n }\n\n // 5. Check for any blockers or notes\n let notes = '';\n const notesPath = join(projectRoot, '.stackmemory', 'handoff.md');\n if (existsSync(notesPath)) {\n const handoffNotes = readFileSync(notesPath, 'utf-8');\n if (handoffNotes.trim()) {\n notes = `\\nNotes from previous handoff:\\n${handoffNotes}\\n`;\n }\n }\n\n // 6. Generate the handoff prompt\n const timestamp = new Date().toISOString();\n const handoffPrompt = `# Session Handoff - ${timestamp}\n\n## Project: ${projectRoot.split('/').pop()}\n\n${gitInfo}\n${contextSummary}\n${tasksSummary}\n${recentWork}\n${notes}\n\n## Continue from here:\n\n1. Run \\`stackmemory status\\` to check the current state\n2. Review any in-progress tasks above\n3. Check for any uncommitted changes with \\`git status\\`\n4. Resume work on the active context\n\n## Quick Commands:\n- \\`stackmemory context load --recent\\` - Load recent context\n- \\`stackmemory task list --state in_progress\\` - Show in-progress tasks\n- \\`stackmemory linear sync\\` - Sync with Linear if configured\n- \\`stackmemory log recent\\` - View recent activity\n\n---\nGenerated by stackmemory handoff at ${timestamp}\n`;\n\n // 7. Save handoff prompt\n const handoffPath = join(\n projectRoot,\n '.stackmemory',\n 'last-handoff.md'\n );\n writeFileSync(handoffPath, handoffPrompt);\n\n // 8. Display the prompt\n console.log('\\n' + '='.repeat(60));\n console.log(handoffPrompt);\n console.log('='.repeat(60));\n\n // 9. Copy to clipboard if requested\n if (options.copy) {\n try {\n const copyCommand =\n process.platform === 'darwin'\n ? 'pbcopy'\n : process.platform === 'win32'\n ? 'clip'\n : 'xclip -selection clipboard';\n\n execSync(copyCommand, {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n\n console.log('\\n\u2705 Handoff prompt copied to clipboard!');\n } catch (err) {\n console.log('\\n\u26A0\uFE0F Could not copy to clipboard');\n }\n }\n\n console.log(`\\n\uD83D\uDCBE Handoff saved to: ${handoffPath}`);\n console.log('\uD83D\uDCCB Use this prompt when starting your next session');\n } catch (error) {\n logger.error('Handoff command failed', error as Error);\n console.error('\u274C Handoff failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n // Restore command\n cmd\n .command('restore')\n .description('Restore context from last handoff')\n .option('--no-copy', 'Do not copy prompt to clipboard')\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const handoffPath = join(\n projectRoot,\n '.stackmemory',\n 'last-handoff.md'\n );\n const metaPath = join(\n process.env.HOME || '~',\n '.stackmemory',\n 'handoffs',\n 'last-handoff-meta.json'\n );\n\n if (!existsSync(handoffPath)) {\n console.log('\u274C No handoff found in this project');\n console.log('\uD83D\uDCA1 Run \"stackmemory handoff\" to create one');\n return;\n }\n\n // Read handoff prompt\n const handoffPrompt = readFileSync(handoffPath, 'utf-8');\n\n // Display the prompt\n console.log('\\n' + '='.repeat(60));\n console.log('\uD83D\uDCCB RESTORED HANDOFF');\n console.log('='.repeat(60));\n console.log(handoffPrompt);\n console.log('='.repeat(60));\n\n // Check for metadata\n if (existsSync(metaPath)) {\n const metadata = JSON.parse(readFileSync(metaPath, 'utf-8'));\n console.log('\\n\uD83D\uDCCA Session Metadata:');\n console.log(` Timestamp: ${metadata.timestamp}`);\n console.log(` Reason: ${metadata.reason}`);\n console.log(` Duration: ${metadata.session_duration}s`);\n console.log(` Command: ${metadata.command}`);\n }\n\n // Check current git status\n try {\n const gitStatus = execSync('git status --short', {\n encoding: 'utf-8',\n }).trim();\n if (gitStatus) {\n console.log('\\n\u26A0\uFE0F Current uncommitted changes:');\n console.log(gitStatus);\n }\n } catch (err) {\n // Not a git repo\n }\n\n // Copy to clipboard unless disabled\n if (options.copy !== false) {\n try {\n const copyCommand =\n process.platform === 'darwin'\n ? 'pbcopy'\n : process.platform === 'win32'\n ? 'clip'\n : 'xclip -selection clipboard';\n\n execSync(copyCommand, {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n\n console.log('\\n\u2705 Handoff prompt copied to clipboard!');\n } catch (err) {\n console.log('\\n\u26A0\uFE0F Could not copy to clipboard');\n }\n }\n\n console.log('\\n\uD83D\uDE80 Ready to continue where you left off!');\n } catch (error) {\n logger.error('Handoff restore failed', error as Error);\n console.error('\u274C Restore failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n // Auto command - enable auto-capture\n cmd\n .command('auto')\n .description('Enable auto-capture on session termination')\n .option('--command <command>', 'Command to wrap with auto-handoff')\n .action(async (options) => {\n const scriptPath = join(\n __dirname,\n '..',\n '..',\n '..',\n 'scripts',\n 'stackmemory-auto-handoff.sh'\n );\n\n if (!existsSync(scriptPath)) {\n console.error('\u274C Auto-handoff script not found');\n console.log('\uD83D\uDCE6 Please ensure StackMemory is properly installed');\n return;\n }\n\n console.log('\uD83D\uDEE1\uFE0F StackMemory Auto-Handoff');\n console.log('\u2500'.repeat(50));\n\n if (options.command) {\n // Wrap specific command\n console.log(`Wrapping command: ${options.command}`);\n execSync(`${scriptPath} ${options.command}`, {\n stdio: 'inherit',\n env: { ...process.env, AUTO_CAPTURE_ON_EXIT: 'true' },\n });\n } else {\n // Interactive mode\n console.log('To enable auto-handoff for your current session:');\n console.log('');\n console.log(' For bash/zsh:');\n console.log(` source <(${scriptPath} --shell)`);\n console.log('');\n console.log(' Or wrap a command:');\n console.log(` ${scriptPath} claude`);\n console.log(` ${scriptPath} npm run dev`);\n console.log('');\n console.log(' Add to your shell profile for permanent setup:');\n console.log(\n ` echo 'alias claude=\"${scriptPath} claude\"' >> ~/.bashrc`\n );\n }\n });\n\n return cmd;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,132 @@
1
+ import chalk from "chalk";
2
+ import { LinearRestClient } from "../../integrations/linear/rest-client.js";
3
+ function registerLinearCreateCommand(parent) {
4
+ parent.command("linear:create").description("Create a new Linear task in the correct project").option("--api-key <key>", "Linear API key for target workspace").option("--title <title>", "Task title (required)").option("--description <desc>", "Task description").option("--priority <level>", "Priority: urgent(1), high(2), medium(3), low(4)", "3").option("--state <state>", "Initial state: backlog, todo, started", "backlog").action(async (options) => {
5
+ try {
6
+ const apiKey = options.apiKey || process.env.LINEAR_NEW_API_KEY;
7
+ if (!apiKey) {
8
+ console.error(chalk.red("\u274C API key required. Use --api-key or set LINEAR_NEW_API_KEY"));
9
+ return;
10
+ }
11
+ if (!options.title) {
12
+ console.error(chalk.red('\u274C Task title required. Use --title "Your task title"'));
13
+ return;
14
+ }
15
+ const client = new LinearRestClient(apiKey);
16
+ console.log(chalk.yellow("\u{1F504} Creating new Linear task..."));
17
+ const team = await client.getTeam();
18
+ console.log(chalk.cyan(`\u{1F3AF} Target team: ${team.name} (${team.key})`));
19
+ const createQuery = `
20
+ mutation CreateIssue($input: IssueCreateInput!) {
21
+ issueCreate(input: $input) {
22
+ success
23
+ issue {
24
+ id
25
+ identifier
26
+ title
27
+ description
28
+ state {
29
+ id
30
+ name
31
+ type
32
+ }
33
+ priority
34
+ url
35
+ createdAt
36
+ }
37
+ }
38
+ }
39
+ `;
40
+ const taskInput = {
41
+ title: options.title,
42
+ description: options.description || "",
43
+ teamId: team.id,
44
+ priority: parseInt(options.priority)
45
+ };
46
+ const response = await client.makeRequest(createQuery, { input: taskInput });
47
+ if (!response.data?.issueCreate?.success) {
48
+ throw new Error("Failed to create task in Linear");
49
+ }
50
+ const task = response.data.issueCreate.issue;
51
+ console.log(chalk.green("\n\u2705 Task created successfully!"));
52
+ console.log(chalk.blue(`\u{1F4CB} ${task.identifier}: ${task.title}`));
53
+ console.log(chalk.gray(` State: ${task.state.name}`));
54
+ console.log(chalk.gray(` Priority: ${task.priority}`));
55
+ console.log(chalk.gray(` URL: ${task.url}`));
56
+ if (options.description) {
57
+ console.log(chalk.gray(` Description: ${options.description}`));
58
+ }
59
+ } catch (error) {
60
+ console.error(chalk.red("\u274C Task creation failed:"), error.message);
61
+ }
62
+ });
63
+ parent.command("linear:quick").description("Quick task creation with prompts").option("--api-key <key>", "Linear API key for target workspace").action(async (options) => {
64
+ try {
65
+ const apiKey = options.apiKey || process.env.LINEAR_NEW_API_KEY;
66
+ if (!apiKey) {
67
+ console.error(chalk.red("\u274C API key required. Use --api-key or set LINEAR_NEW_API_KEY"));
68
+ return;
69
+ }
70
+ const readline = await import("readline");
71
+ const rl = readline.createInterface({
72
+ input: process.stdin,
73
+ output: process.stdout
74
+ });
75
+ const question = (prompt) => {
76
+ return new Promise((resolve) => {
77
+ rl.question(prompt, resolve);
78
+ });
79
+ };
80
+ console.log(chalk.blue("\u{1F4DD} Quick Linear Task Creation"));
81
+ console.log(chalk.gray("Press Ctrl+C to cancel at any time\n"));
82
+ const title = await question(chalk.yellow("Task title: "));
83
+ if (!title.trim()) {
84
+ console.log(chalk.red("\u274C Title is required"));
85
+ rl.close();
86
+ return;
87
+ }
88
+ const description = await question(chalk.yellow("Description (optional): "));
89
+ const priorityInput = await question(chalk.yellow("Priority (1=urgent, 2=high, 3=medium, 4=low) [3]: "));
90
+ const priority = priorityInput.trim() || "3";
91
+ rl.close();
92
+ console.log(chalk.yellow("\n\u{1F504} Creating task..."));
93
+ const client = new LinearRestClient(apiKey);
94
+ const team = await client.getTeam();
95
+ const createQuery = `
96
+ mutation CreateIssue($input: IssueCreateInput!) {
97
+ issueCreate(input: $input) {
98
+ success
99
+ issue {
100
+ id
101
+ identifier
102
+ title
103
+ state { name }
104
+ priority
105
+ url
106
+ }
107
+ }
108
+ }
109
+ `;
110
+ const taskInput = {
111
+ title: title.trim(),
112
+ description: description.trim() || void 0,
113
+ teamId: team.id,
114
+ priority: parseInt(priority)
115
+ };
116
+ const response = await client.makeRequest(createQuery, { input: taskInput });
117
+ if (!response.data?.issueCreate?.success) {
118
+ throw new Error("Failed to create task in Linear");
119
+ }
120
+ const task = response.data.issueCreate.issue;
121
+ console.log(chalk.green("\n\u2705 Task created successfully!"));
122
+ console.log(chalk.blue(`\u{1F4CB} ${task.identifier}: ${task.title}`));
123
+ console.log(chalk.gray(` URL: ${task.url}`));
124
+ } catch (error) {
125
+ console.error(chalk.red("\u274C Task creation failed:"), error.message);
126
+ }
127
+ });
128
+ }
129
+ export {
130
+ registerLinearCreateCommand
131
+ };
132
+ //# sourceMappingURL=linear-create.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/linear-create.ts"],
4
+ "sourcesContent": ["/**\n * Linear Task Creation Command\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { LinearRestClient } from '../../integrations/linear/rest-client.js';\n\nexport function registerLinearCreateCommand(parent: Command) {\n parent\n .command('linear:create')\n .description('Create a new Linear task in the correct project')\n .option('--api-key <key>', 'Linear API key for target workspace')\n .option('--title <title>', 'Task title (required)')\n .option('--description <desc>', 'Task description')\n .option('--priority <level>', 'Priority: urgent(1), high(2), medium(3), low(4)', '3')\n .option('--state <state>', 'Initial state: backlog, todo, started', 'backlog')\n .action(async (options) => {\n try {\n const apiKey = options.apiKey || process.env.LINEAR_NEW_API_KEY;\n \n if (!apiKey) {\n console.error(chalk.red('\u274C API key required. Use --api-key or set LINEAR_NEW_API_KEY'));\n return;\n }\n\n if (!options.title) {\n console.error(chalk.red('\u274C Task title required. Use --title \"Your task title\"'));\n return;\n }\n\n const client = new LinearRestClient(apiKey);\n \n console.log(chalk.yellow('\uD83D\uDD04 Creating new Linear task...'));\n \n // Get team info\n const team = await client.getTeam();\n console.log(chalk.cyan(`\uD83C\uDFAF Target team: ${team.name} (${team.key})`));\n\n // Create the task\n const createQuery = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n url\n createdAt\n }\n }\n }\n `;\n\n const taskInput = {\n title: options.title,\n description: options.description || '',\n teamId: team.id,\n priority: parseInt(options.priority)\n };\n\n const response = await client.makeRequest<{\n data: {\n issueCreate: {\n success: boolean;\n issue: any;\n };\n };\n }>(createQuery, { input: taskInput });\n\n if (!response.data?.issueCreate?.success) {\n throw new Error('Failed to create task in Linear');\n }\n\n const task = response.data.issueCreate.issue;\n \n console.log(chalk.green('\\n\u2705 Task created successfully!'));\n console.log(chalk.blue(`\uD83D\uDCCB ${task.identifier}: ${task.title}`));\n console.log(chalk.gray(` State: ${task.state.name}`));\n console.log(chalk.gray(` Priority: ${task.priority}`));\n console.log(chalk.gray(` URL: ${task.url}`));\n \n if (options.description) {\n console.log(chalk.gray(` Description: ${options.description}`));\n }\n\n } catch (error) {\n console.error(chalk.red('\u274C Task creation failed:'), (error as Error).message);\n }\n });\n\n parent\n .command('linear:quick')\n .description('Quick task creation with prompts')\n .option('--api-key <key>', 'Linear API key for target workspace')\n .action(async (options) => {\n try {\n const apiKey = options.apiKey || process.env.LINEAR_NEW_API_KEY;\n \n if (!apiKey) {\n console.error(chalk.red('\u274C API key required. Use --api-key or set LINEAR_NEW_API_KEY'));\n return;\n }\n\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n const question = (prompt: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(prompt, resolve);\n });\n };\n\n console.log(chalk.blue('\uD83D\uDCDD Quick Linear Task Creation'));\n console.log(chalk.gray('Press Ctrl+C to cancel at any time\\n'));\n\n const title = await question(chalk.yellow('Task title: '));\n if (!title.trim()) {\n console.log(chalk.red('\u274C Title is required'));\n rl.close();\n return;\n }\n\n const description = await question(chalk.yellow('Description (optional): '));\n const priorityInput = await question(chalk.yellow('Priority (1=urgent, 2=high, 3=medium, 4=low) [3]: '));\n const priority = priorityInput.trim() || '3';\n\n rl.close();\n\n console.log(chalk.yellow('\\n\uD83D\uDD04 Creating task...'));\n\n const client = new LinearRestClient(apiKey);\n const team = await client.getTeam();\n\n const createQuery = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n state { name }\n priority\n url\n }\n }\n }\n `;\n\n const taskInput = {\n title: title.trim(),\n description: description.trim() || undefined,\n teamId: team.id,\n priority: parseInt(priority)\n };\n\n const response = await client.makeRequest<{\n data: {\n issueCreate: {\n success: boolean;\n issue: any;\n };\n };\n }>(createQuery, { input: taskInput });\n\n if (!response.data?.issueCreate?.success) {\n throw new Error('Failed to create task in Linear');\n }\n\n const task = response.data.issueCreate.issue;\n \n console.log(chalk.green('\\n\u2705 Task created successfully!'));\n console.log(chalk.blue(`\uD83D\uDCCB ${task.identifier}: ${task.title}`));\n console.log(chalk.gray(` URL: ${task.url}`));\n\n } catch (error) {\n console.error(chalk.red('\u274C Task creation failed:'), (error as Error).message);\n }\n });\n}"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,69 @@
1
+ import chalk from "chalk";
2
+ import { LinearRestClient } from "../../integrations/linear/rest-client.js";
3
+ function registerLinearListCommand(parent) {
4
+ parent.command("linear:list").alias("linear:ls").description("List Linear tasks (fast, memory-cached)").option("--limit <n>", "Number of tasks to show", "20").option("--status <status>", "Filter by status (backlog, started, completed, etc.)").option("--my", "Show only tasks assigned to me").option("--cache", "Show cache stats only").option("--refresh", "Force refresh cache").option("--count", "Show count by status only").action(async (options) => {
5
+ try {
6
+ const apiKey = process.env.LINEAR_API_KEY;
7
+ if (!apiKey) {
8
+ console.log(chalk.yellow("\u26A0 Set LINEAR_API_KEY environment variable"));
9
+ return;
10
+ }
11
+ const restClient = new LinearRestClient(apiKey);
12
+ if (options.cache) {
13
+ const stats = restClient.getCacheStats();
14
+ console.log(chalk.cyan("\u{1F4CA} Cache Stats:"));
15
+ console.log(` Size: ${stats.size} tasks`);
16
+ console.log(` Age: ${Math.round(stats.age / 1e3)}s`);
17
+ console.log(` Fresh: ${stats.fresh ? "yes" : "no"}`);
18
+ console.log(` Last sync: ${new Date(stats.lastSync).toLocaleString()}`);
19
+ return;
20
+ }
21
+ if (options.count) {
22
+ const counts = await restClient.getTaskCounts();
23
+ console.log(chalk.cyan("\u{1F4CA} Task Counts:"));
24
+ Object.entries(counts).sort(([, a], [, b]) => b - a).forEach(([status, count]) => {
25
+ console.log(` ${status}: ${count}`);
26
+ });
27
+ const cacheStats2 = restClient.getCacheStats();
28
+ console.log(chalk.gray(`
29
+ Cache: ${cacheStats2.size} tasks, age: ${Math.round(cacheStats2.age / 1e3)}s`));
30
+ return;
31
+ }
32
+ let tasks;
33
+ if (options.my) {
34
+ tasks = await restClient.getMyTasks();
35
+ } else if (options.status) {
36
+ tasks = await restClient.getTasksByStatus(options.status);
37
+ } else {
38
+ tasks = await restClient.getAllTasks(options.refresh);
39
+ }
40
+ if (!tasks || tasks.length === 0) {
41
+ console.log(chalk.gray("No tasks found"));
42
+ return;
43
+ }
44
+ const limit = parseInt(options.limit);
45
+ const displayTasks = tasks.slice(0, limit);
46
+ console.log(chalk.cyan(`
47
+ \u{1F4CB} Linear Tasks (${displayTasks.length}/${tasks.length}):`));
48
+ displayTasks.forEach((task) => {
49
+ const priority = task.priority ? `P${task.priority}` : "";
50
+ const assignee = task.assignee ? ` @${task.assignee.name}` : "";
51
+ const statusColor = task.state.type === "completed" ? chalk.green : task.state.type === "started" ? chalk.yellow : chalk.gray;
52
+ console.log(`${chalk.blue(task.identifier)} ${task.title}`);
53
+ console.log(chalk.gray(` ${statusColor(task.state.name)} ${priority}${assignee}`));
54
+ });
55
+ const cacheStats = restClient.getCacheStats();
56
+ console.log(chalk.gray(`
57
+ ${displayTasks.length} shown, ${tasks.length} total \u2022 Cache: ${Math.round(cacheStats.age / 1e3)}s old`));
58
+ } catch (error) {
59
+ console.error(
60
+ chalk.red("Failed to list tasks:"),
61
+ error.message
62
+ );
63
+ }
64
+ });
65
+ }
66
+ export {
67
+ registerLinearListCommand
68
+ };
69
+ //# sourceMappingURL=linear-list.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/linear-list.ts"],
4
+ "sourcesContent": ["/**\n * Simple Linear task list command using memory cache\n */\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { LinearRestClient } from '../../integrations/linear/rest-client.js';\n\nexport function registerLinearListCommand(parent: Command) {\n parent\n .command('linear:list')\n .alias('linear:ls')\n .description('List Linear tasks (fast, memory-cached)')\n .option('--limit <n>', 'Number of tasks to show', '20')\n .option('--status <status>', 'Filter by status (backlog, started, completed, etc.)')\n .option('--my', 'Show only tasks assigned to me')\n .option('--cache', 'Show cache stats only')\n .option('--refresh', 'Force refresh cache')\n .option('--count', 'Show count by status only')\n .action(async (options) => {\n try {\n const apiKey = process.env.LINEAR_API_KEY;\n if (!apiKey) {\n console.log(chalk.yellow('\u26A0 Set LINEAR_API_KEY environment variable'));\n return;\n }\n\n const restClient = new LinearRestClient(apiKey);\n\n // Show cache stats if requested\n if (options.cache) {\n const stats = restClient.getCacheStats();\n console.log(chalk.cyan('\uD83D\uDCCA Cache Stats:'));\n console.log(` Size: ${stats.size} tasks`);\n console.log(` Age: ${Math.round(stats.age / 1000)}s`);\n console.log(` Fresh: ${stats.fresh ? 'yes' : 'no'}`);\n console.log(` Last sync: ${new Date(stats.lastSync).toLocaleString()}`);\n return;\n }\n\n // Show counts only\n if (options.count) {\n const counts = await restClient.getTaskCounts();\n console.log(chalk.cyan('\uD83D\uDCCA Task Counts:'));\n Object.entries(counts)\n .sort(([,a], [,b]) => b - a)\n .forEach(([status, count]) => {\n console.log(` ${status}: ${count}`);\n });\n \n const cacheStats = restClient.getCacheStats();\n console.log(chalk.gray(`\\nCache: ${cacheStats.size} tasks, age: ${Math.round(cacheStats.age / 1000)}s`));\n return;\n }\n\n let tasks;\n if (options.my) {\n tasks = await restClient.getMyTasks();\n } else if (options.status) {\n tasks = await restClient.getTasksByStatus(options.status);\n } else {\n tasks = await restClient.getAllTasks(options.refresh);\n }\n\n if (!tasks || tasks.length === 0) {\n console.log(chalk.gray('No tasks found'));\n return;\n }\n\n // Limit results\n const limit = parseInt(options.limit);\n const displayTasks = tasks.slice(0, limit);\n\n console.log(chalk.cyan(`\\n\uD83D\uDCCB Linear Tasks (${displayTasks.length}/${tasks.length}):`));\n \n displayTasks.forEach((task) => {\n const priority = task.priority ? `P${task.priority}` : '';\n const assignee = task.assignee ? ` @${task.assignee.name}` : '';\n const statusColor = task.state.type === 'completed' ? chalk.green : \n task.state.type === 'started' ? chalk.yellow : chalk.gray;\n \n console.log(`${chalk.blue(task.identifier)} ${task.title}`);\n console.log(chalk.gray(` ${statusColor(task.state.name)} ${priority}${assignee}`));\n });\n\n const cacheStats = restClient.getCacheStats();\n console.log(chalk.gray(`\\n${displayTasks.length} shown, ${tasks.length} total \u2022 Cache: ${Math.round(cacheStats.age / 1000)}s old`));\n } catch (error) {\n console.error(\n chalk.red('Failed to list tasks:'),\n (error as Error).message\n );\n }\n });\n}"],
5
+ "mappings": "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",
6
+ "names": ["cacheStats"]
7
+ }
@@ -0,0 +1,40 @@
1
+ import chalk from "chalk";
2
+ import { runMigration } from "../../integrations/linear/migration.js";
3
+ function registerLinearMigrateCommand(parent) {
4
+ parent.command("linear:migrate").description("Migrate STA- tasks from LiftCL to new Linear workspace").option("--source-key <key>", "Source workspace Linear API key").option("--target-key <key>", "Target workspace Linear API key").option("--dry-run", "Preview migration without making changes").option("--delete-source", "Delete tasks from source after successful migration").option("--batch-size <n>", "Number of tasks per batch", "3").option("--delay <ms>", "Delay between batches in milliseconds", "3000").action(async (options) => {
5
+ try {
6
+ const sourceKey = options.sourceKey || process.env.LINEAR_API_KEY;
7
+ const targetKey = options.targetKey;
8
+ if (!sourceKey) {
9
+ console.error(chalk.red("\u274C Source API key required. Use --source-key or set LINEAR_API_KEY"));
10
+ return;
11
+ }
12
+ if (!targetKey) {
13
+ console.error(chalk.red("\u274C Target API key required. Use --target-key"));
14
+ return;
15
+ }
16
+ console.log(chalk.blue("\u{1F680} Starting Linear Migration"));
17
+ console.log(chalk.gray(" This will migrate all STA- prefixed tasks"));
18
+ if (options.deleteSource) {
19
+ console.log(chalk.yellow(" \u26A0\uFE0F Tasks will be DELETED from source after migration"));
20
+ }
21
+ console.log();
22
+ await runMigration({
23
+ sourceApiKey: sourceKey,
24
+ targetApiKey: targetKey,
25
+ taskPrefix: "STA-",
26
+ deleteFromSource: options.deleteSource,
27
+ dryRun: options.dryRun,
28
+ batchSize: parseInt(options.batchSize),
29
+ delayMs: parseInt(options.delay)
30
+ });
31
+ } catch (error) {
32
+ console.error(chalk.red("Migration failed:"), error.message);
33
+ process.exit(1);
34
+ }
35
+ });
36
+ }
37
+ export {
38
+ registerLinearMigrateCommand
39
+ };
40
+ //# sourceMappingURL=linear-migrate.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/linear-migrate.ts"],
4
+ "sourcesContent": ["/**\n * Linear Migration Command\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { runMigration } from '../../integrations/linear/migration.js';\n\nexport function registerLinearMigrateCommand(parent: Command) {\n parent\n .command('linear:migrate')\n .description('Migrate STA- tasks from LiftCL to new Linear workspace')\n .option('--source-key <key>', 'Source workspace Linear API key')\n .option('--target-key <key>', 'Target workspace Linear API key') \n .option('--dry-run', 'Preview migration without making changes')\n .option('--delete-source', 'Delete tasks from source after successful migration')\n .option('--batch-size <n>', 'Number of tasks per batch', '3')\n .option('--delay <ms>', 'Delay between batches in milliseconds', '3000')\n .action(async (options) => {\n try {\n const sourceKey = options.sourceKey || process.env.LINEAR_API_KEY;\n const targetKey = options.targetKey;\n\n if (!sourceKey) {\n console.error(chalk.red('\u274C Source API key required. Use --source-key or set LINEAR_API_KEY'));\n return;\n }\n\n if (!targetKey) {\n console.error(chalk.red('\u274C Target API key required. Use --target-key'));\n return;\n }\n\n console.log(chalk.blue('\uD83D\uDE80 Starting Linear Migration'));\n console.log(chalk.gray(' This will migrate all STA- prefixed tasks'));\n if (options.deleteSource) {\n console.log(chalk.yellow(' \u26A0\uFE0F Tasks will be DELETED from source after migration'));\n }\n console.log();\n\n await runMigration({\n sourceApiKey: sourceKey,\n targetApiKey: targetKey,\n taskPrefix: 'STA-',\n deleteFromSource: options.deleteSource,\n dryRun: options.dryRun,\n batchSize: parseInt(options.batchSize),\n delayMs: parseInt(options.delay)\n });\n\n } catch (error) {\n console.error(chalk.red('Migration failed:'), (error as Error).message);\n process.exit(1);\n }\n });\n}"],
5
+ "mappings": "AAKA,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAEtB,SAAS,6BAA6B,QAAiB;AAC5D,SACG,QAAQ,gBAAgB,EACxB,YAAY,wDAAwD,EACpE,OAAO,sBAAsB,iCAAiC,EAC9D,OAAO,sBAAsB,iCAAiC,EAC9D,OAAO,aAAa,0CAA0C,EAC9D,OAAO,mBAAmB,qDAAqD,EAC/E,OAAO,oBAAoB,6BAA6B,GAAG,EAC3D,OAAO,gBAAgB,yCAAyC,MAAM,EACtE,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,YAAM,YAAY,QAAQ,aAAa,QAAQ,IAAI;AACnD,YAAM,YAAY,QAAQ;AAE1B,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAM,MAAM,IAAI,wEAAmE,CAAC;AAC5F;AAAA,MACF;AAEA,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAM,MAAM,IAAI,kDAA6C,CAAC;AACtE;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM,KAAK,qCAA8B,CAAC;AACtD,cAAQ,IAAI,MAAM,KAAK,8CAA8C,CAAC;AACtE,UAAI,QAAQ,cAAc;AACxB,gBAAQ,IAAI,MAAM,OAAO,oEAA0D,CAAC;AAAA,MACtF;AACA,cAAQ,IAAI;AAEZ,YAAM,aAAa;AAAA,QACjB,cAAc;AAAA,QACd,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,kBAAkB,QAAQ;AAAA,QAC1B,QAAQ,QAAQ;AAAA,QAChB,WAAW,SAAS,QAAQ,SAAS;AAAA,QACrC,SAAS,SAAS,QAAQ,KAAK;AAAA,MACjC,CAAC;AAAA,IAEH,SAAS,OAAO;AACd,cAAQ,MAAM,MAAM,IAAI,mBAAmB,GAAI,MAAgB,OAAO;AACtE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;",
6
+ "names": []
7
+ }