@stackmemoryai/stackmemory 0.2.4 → 0.2.7

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 (331) hide show
  1. package/README.md +353 -83
  2. package/dist/index.js +382 -0
  3. package/dist/scripts/cancel-duplicate-tasks.d.ts +7 -0
  4. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +1 -0
  5. package/dist/scripts/cancel-duplicate-tasks.js +171 -0
  6. package/dist/scripts/cancel-duplicate-tasks.js.map +1 -0
  7. package/dist/scripts/list-linear-tasks.d.ts +6 -0
  8. package/dist/scripts/list-linear-tasks.d.ts.map +1 -0
  9. package/dist/scripts/list-linear-tasks.js +122 -0
  10. package/dist/scripts/list-linear-tasks.js.map +1 -0
  11. package/dist/scripts/merge-linear-duplicates-safe.d.ts +7 -0
  12. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +1 -0
  13. package/dist/scripts/merge-linear-duplicates-safe.js +265 -0
  14. package/dist/scripts/merge-linear-duplicates-safe.js.map +1 -0
  15. package/dist/scripts/merge-linear-duplicates.d.ts +7 -0
  16. package/dist/scripts/merge-linear-duplicates.d.ts.map +1 -0
  17. package/dist/scripts/merge-linear-duplicates.js +126 -0
  18. package/dist/scripts/merge-linear-duplicates.js.map +1 -0
  19. package/dist/scripts/show-linear-summary.d.ts +6 -0
  20. package/dist/scripts/show-linear-summary.d.ts.map +1 -0
  21. package/dist/scripts/show-linear-summary.js +117 -0
  22. package/dist/scripts/show-linear-summary.js.map +1 -0
  23. package/dist/src/analytics/api/analytics-api.d.ts +24 -0
  24. package/dist/src/analytics/api/analytics-api.d.ts.map +1 -0
  25. package/dist/src/analytics/api/analytics-api.js +279 -0
  26. package/dist/src/analytics/api/analytics-api.js.map +1 -0
  27. package/dist/src/analytics/core/analytics-service.d.ts +23 -0
  28. package/dist/src/analytics/core/analytics-service.d.ts.map +1 -0
  29. package/dist/src/analytics/core/analytics-service.js +160 -0
  30. package/dist/src/analytics/core/analytics-service.js.map +1 -0
  31. package/dist/src/analytics/index.d.ts +12 -0
  32. package/dist/src/analytics/index.d.ts.map +1 -0
  33. package/dist/src/analytics/index.js +11 -0
  34. package/dist/src/analytics/index.js.map +1 -0
  35. package/dist/src/analytics/queries/metrics-queries.d.ts +11 -0
  36. package/dist/src/analytics/queries/metrics-queries.d.ts.map +1 -0
  37. package/dist/src/analytics/queries/metrics-queries.js +179 -0
  38. package/dist/src/analytics/queries/metrics-queries.js.map +1 -0
  39. package/dist/src/analytics/types/metrics.d.ts +60 -0
  40. package/dist/src/analytics/types/metrics.d.ts.map +1 -0
  41. package/dist/src/analytics/types/metrics.js +2 -0
  42. package/dist/src/analytics/types/metrics.js.map +1 -0
  43. package/dist/src/cli/__tests__/index.test.d.ts +5 -0
  44. package/dist/src/cli/__tests__/index.test.d.ts.map +1 -0
  45. package/dist/src/cli/__tests__/index.test.js +726 -0
  46. package/dist/src/cli/__tests__/index.test.js.map +1 -0
  47. package/dist/src/cli/analytics-viewer.d.ts +3 -0
  48. package/dist/src/cli/analytics-viewer.d.ts.map +1 -0
  49. package/dist/src/cli/analytics-viewer.js +89 -0
  50. package/dist/src/cli/analytics-viewer.js.map +1 -0
  51. package/dist/src/cli/auto-detect.d.ts +61 -0
  52. package/dist/src/cli/auto-detect.d.ts.map +1 -0
  53. package/dist/src/cli/auto-detect.js +350 -0
  54. package/dist/src/cli/auto-detect.js.map +1 -0
  55. package/dist/src/cli/browser-test.d.ts +6 -0
  56. package/dist/src/cli/browser-test.d.ts.map +1 -0
  57. package/dist/src/cli/browser-test.js +32 -0
  58. package/dist/src/cli/browser-test.js.map +1 -0
  59. package/dist/src/cli/claude-sm.d.ts +7 -0
  60. package/dist/src/cli/claude-sm.d.ts.map +1 -0
  61. package/dist/src/cli/claude-sm.js +357 -0
  62. package/dist/src/cli/claude-sm.js.map +1 -0
  63. package/dist/src/cli/cli.js +157 -0
  64. package/dist/src/cli/cli.js.map +1 -1
  65. package/dist/src/cli/commands/context.d.ts +7 -0
  66. package/dist/src/cli/commands/context.d.ts.map +1 -0
  67. package/dist/src/cli/commands/context.js +365 -0
  68. package/dist/src/cli/commands/context.js.map +1 -0
  69. package/dist/src/cli/commands/linear-test.d.ts +6 -0
  70. package/dist/src/cli/commands/linear-test.d.ts.map +1 -0
  71. package/dist/src/cli/commands/linear-test.js +123 -0
  72. package/dist/src/cli/commands/linear-test.js.map +1 -0
  73. package/dist/src/cli/commands/linear.d.ts +6 -0
  74. package/dist/src/cli/commands/linear.d.ts.map +1 -0
  75. package/dist/src/cli/commands/linear.js +317 -0
  76. package/dist/src/cli/commands/linear.js.map +1 -0
  77. package/dist/src/cli/commands/log.d.ts +7 -0
  78. package/dist/src/cli/commands/log.d.ts.map +1 -0
  79. package/dist/src/cli/commands/log.js +168 -0
  80. package/dist/src/cli/commands/log.js.map +1 -0
  81. package/dist/src/cli/commands/onboard.d.ts +8 -0
  82. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  83. package/dist/src/cli/commands/onboard.js +363 -0
  84. package/dist/src/cli/commands/onboard.js.map +1 -0
  85. package/dist/src/cli/commands/projects.d.ts +8 -0
  86. package/dist/src/cli/commands/projects.d.ts.map +1 -0
  87. package/dist/src/cli/commands/projects.js +220 -0
  88. package/dist/src/cli/commands/projects.js.map +1 -0
  89. package/dist/src/cli/commands/search.d.ts +7 -0
  90. package/dist/src/cli/commands/search.d.ts.map +1 -0
  91. package/dist/src/cli/commands/search.js +162 -0
  92. package/dist/src/cli/commands/search.js.map +1 -0
  93. package/dist/src/cli/commands/session.d.ts +7 -0
  94. package/dist/src/cli/commands/session.d.ts.map +1 -0
  95. package/dist/src/cli/commands/session.js +222 -0
  96. package/dist/src/cli/commands/session.js.map +1 -0
  97. package/dist/src/cli/commands/tasks.d.ts +7 -0
  98. package/dist/src/cli/commands/tasks.d.ts.map +1 -0
  99. package/dist/src/cli/commands/tasks.js +229 -0
  100. package/dist/src/cli/commands/tasks.js.map +1 -0
  101. package/dist/src/cli/commands/webhook.d.ts +3 -0
  102. package/dist/src/cli/commands/webhook.d.ts.map +1 -0
  103. package/dist/src/cli/commands/webhook.js +157 -0
  104. package/dist/src/cli/commands/webhook.js.map +1 -0
  105. package/dist/src/cli/commands/worktree.d.ts +8 -0
  106. package/dist/src/cli/commands/worktree.d.ts.map +1 -0
  107. package/dist/src/cli/commands/worktree.js +339 -0
  108. package/dist/src/cli/commands/worktree.js.map +1 -0
  109. package/dist/src/cli/index.d.ts +8 -0
  110. package/dist/src/cli/index.d.ts.map +1 -0
  111. package/dist/src/cli/index.js +944 -0
  112. package/dist/src/cli/index.js.map +1 -0
  113. package/dist/src/cli/project-commands.d.ts +8 -0
  114. package/dist/src/cli/project-commands.d.ts.map +1 -0
  115. package/dist/src/cli/project-commands.js +212 -0
  116. package/dist/src/cli/project-commands.js.map +1 -0
  117. package/dist/src/cli/utils/viewer.d.ts +3 -0
  118. package/dist/src/cli/utils/viewer.d.ts.map +1 -0
  119. package/dist/src/cli/utils/viewer.js +91 -0
  120. package/dist/src/cli/utils/viewer.js.map +1 -0
  121. package/dist/src/core/context/__tests__/frame-manager.test.d.ts +5 -0
  122. package/dist/src/core/context/__tests__/frame-manager.test.d.ts.map +1 -0
  123. package/dist/src/core/context/__tests__/frame-manager.test.js +892 -0
  124. package/dist/src/core/context/__tests__/frame-manager.test.js.map +1 -0
  125. package/dist/src/core/context/auto-context.d.ts +22 -0
  126. package/dist/src/core/context/auto-context.d.ts.map +1 -0
  127. package/dist/src/core/context/auto-context.js +77 -0
  128. package/dist/src/core/context/auto-context.js.map +1 -0
  129. package/dist/src/core/context/frame-manager.d.ts +110 -0
  130. package/dist/src/core/context/frame-manager.d.ts.map +1 -0
  131. package/dist/src/core/context/frame-manager.js +593 -0
  132. package/dist/src/core/context/frame-manager.js.map +1 -0
  133. package/dist/src/core/errors/__tests__/error-handling.test.d.ts +5 -0
  134. package/dist/src/core/errors/__tests__/error-handling.test.d.ts.map +1 -0
  135. package/dist/src/core/errors/__tests__/error-handling.test.js +239 -0
  136. package/dist/src/core/errors/__tests__/error-handling.test.js.map +1 -0
  137. package/dist/src/core/errors/index.d.ts +135 -0
  138. package/dist/src/core/errors/index.d.ts.map +1 -0
  139. package/dist/src/core/errors/index.js +274 -0
  140. package/dist/src/core/errors/index.js.map +1 -0
  141. package/dist/src/core/errors/recovery.d.ts +86 -0
  142. package/dist/src/core/errors/recovery.d.ts.map +1 -0
  143. package/dist/src/core/errors/recovery.js +274 -0
  144. package/dist/src/core/errors/recovery.js.map +1 -0
  145. package/dist/src/core/logger.test.js +1 -1
  146. package/dist/src/core/logger.test.js.map +1 -1
  147. package/dist/src/core/monitoring/error-handler.d.ts +46 -0
  148. package/dist/src/core/monitoring/error-handler.d.ts.map +1 -0
  149. package/dist/src/core/monitoring/error-handler.js +212 -0
  150. package/dist/src/core/monitoring/error-handler.js.map +1 -0
  151. package/dist/src/core/monitoring/logger.d.ts +24 -0
  152. package/dist/src/core/monitoring/logger.d.ts.map +1 -0
  153. package/dist/src/core/monitoring/logger.js +121 -0
  154. package/dist/src/core/monitoring/logger.js.map +1 -0
  155. package/dist/src/core/monitoring/metrics.d.ts +7 -0
  156. package/dist/src/core/monitoring/metrics.d.ts.map +1 -0
  157. package/dist/src/core/monitoring/metrics.js +13 -0
  158. package/dist/src/core/monitoring/metrics.js.map +1 -0
  159. package/dist/src/core/monitoring/progress-tracker.d.ts +95 -0
  160. package/dist/src/core/monitoring/progress-tracker.d.ts.map +1 -0
  161. package/dist/src/core/monitoring/progress-tracker.js +178 -0
  162. package/dist/src/core/monitoring/progress-tracker.js.map +1 -0
  163. package/dist/src/core/project-manager.d.ts +130 -0
  164. package/dist/src/core/project-manager.d.ts.map +1 -0
  165. package/dist/src/core/project-manager.js +582 -0
  166. package/dist/src/core/project-manager.js.map +1 -0
  167. package/dist/src/core/projects/project-manager.d.ts +130 -0
  168. package/dist/src/core/projects/project-manager.d.ts.map +1 -0
  169. package/dist/src/core/projects/project-manager.js +709 -0
  170. package/dist/src/core/projects/project-manager.js.map +1 -0
  171. package/dist/src/core/session/index.d.ts +2 -0
  172. package/dist/src/core/session/index.d.ts.map +1 -0
  173. package/dist/src/core/session/index.js +2 -0
  174. package/dist/src/core/session/index.js.map +1 -0
  175. package/dist/src/core/session/session-manager.d.ts +69 -0
  176. package/dist/src/core/session/session-manager.d.ts.map +1 -0
  177. package/dist/src/core/session/session-manager.js +311 -0
  178. package/dist/src/core/session/session-manager.js.map +1 -0
  179. package/dist/src/core/utils/update-checker.d.ts +38 -0
  180. package/dist/src/core/utils/update-checker.d.ts.map +1 -0
  181. package/dist/src/core/utils/update-checker.js +213 -0
  182. package/dist/src/core/utils/update-checker.js.map +1 -0
  183. package/dist/src/core/worktree/worktree-manager.d.ts +110 -0
  184. package/dist/src/core/worktree/worktree-manager.d.ts.map +1 -0
  185. package/dist/src/core/worktree/worktree-manager.js +456 -0
  186. package/dist/src/core/worktree/worktree-manager.js.map +1 -0
  187. package/dist/src/features/analytics/api/analytics-api.d.ts +24 -0
  188. package/dist/src/features/analytics/api/analytics-api.d.ts.map +1 -0
  189. package/dist/src/features/analytics/api/analytics-api.js +289 -0
  190. package/dist/src/features/analytics/api/analytics-api.js.map +1 -0
  191. package/dist/src/features/analytics/core/analytics-service.d.ts +29 -0
  192. package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -0
  193. package/dist/src/features/analytics/core/analytics-service.js +275 -0
  194. package/dist/src/features/analytics/core/analytics-service.js.map +1 -0
  195. package/dist/src/features/analytics/index.d.ts +12 -0
  196. package/dist/src/features/analytics/index.d.ts.map +1 -0
  197. package/dist/src/features/analytics/index.js +11 -0
  198. package/dist/src/features/analytics/index.js.map +1 -0
  199. package/dist/src/features/analytics/queries/metrics-queries.d.ts +11 -0
  200. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -0
  201. package/dist/src/features/analytics/queries/metrics-queries.js +240 -0
  202. package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -0
  203. package/dist/src/features/analytics/types/metrics.d.ts +60 -0
  204. package/dist/src/features/analytics/types/metrics.d.ts.map +1 -0
  205. package/dist/src/features/analytics/types/metrics.js +2 -0
  206. package/dist/src/features/analytics/types/metrics.js.map +1 -0
  207. package/dist/src/features/browser/browser-mcp.d.ts +94 -0
  208. package/dist/src/features/browser/browser-mcp.d.ts.map +1 -0
  209. package/dist/src/features/browser/browser-mcp.js +459 -0
  210. package/dist/src/features/browser/browser-mcp.js.map +1 -0
  211. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts +5 -0
  212. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts.map +1 -0
  213. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js +712 -0
  214. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js.map +1 -0
  215. package/dist/src/features/tasks/pebbles-task-store.d.ts +121 -0
  216. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -0
  217. package/dist/src/features/tasks/pebbles-task-store.js +493 -0
  218. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -0
  219. package/dist/src/features/tasks/task-aware-context.d.ts +103 -0
  220. package/dist/src/features/tasks/task-aware-context.d.ts.map +1 -0
  221. package/dist/src/features/tasks/task-aware-context.js +412 -0
  222. package/dist/src/features/tasks/task-aware-context.js.map +1 -0
  223. package/dist/src/index.d.ts +4 -4
  224. package/dist/src/index.d.ts.map +1 -1
  225. package/dist/src/index.js +4 -4
  226. package/dist/src/index.js.map +1 -1
  227. package/dist/src/integrations/browser-mcp.d.ts +94 -0
  228. package/dist/src/integrations/browser-mcp.d.ts.map +1 -0
  229. package/dist/src/integrations/browser-mcp.js +431 -0
  230. package/dist/src/integrations/browser-mcp.js.map +1 -0
  231. package/dist/src/integrations/linear/__tests__/auth.test.d.ts +5 -0
  232. package/dist/src/integrations/linear/__tests__/auth.test.d.ts.map +1 -0
  233. package/dist/src/integrations/linear/__tests__/auth.test.js +517 -0
  234. package/dist/src/integrations/linear/__tests__/auth.test.js.map +1 -0
  235. package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts +5 -0
  236. package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts.map +1 -0
  237. package/dist/src/integrations/linear/__tests__/sync-service.test.js +700 -0
  238. package/dist/src/integrations/linear/__tests__/sync-service.test.js.map +1 -0
  239. package/dist/src/integrations/linear/auth.d.ts +99 -0
  240. package/dist/src/integrations/linear/auth.d.ts.map +1 -0
  241. package/dist/src/integrations/linear/auth.js +319 -0
  242. package/dist/src/integrations/linear/auth.js.map +1 -0
  243. package/dist/src/integrations/linear/auto-sync.d.ts +77 -0
  244. package/dist/src/integrations/linear/auto-sync.d.ts.map +1 -0
  245. package/dist/src/integrations/linear/auto-sync.js +268 -0
  246. package/dist/src/integrations/linear/auto-sync.js.map +1 -0
  247. package/dist/src/integrations/linear/client.d.ts +113 -0
  248. package/dist/src/integrations/linear/client.d.ts.map +1 -0
  249. package/dist/src/integrations/linear/client.js +364 -0
  250. package/dist/src/integrations/linear/client.js.map +1 -0
  251. package/dist/src/integrations/linear/config.d.ts +51 -0
  252. package/dist/src/integrations/linear/config.d.ts.map +1 -0
  253. package/dist/src/integrations/linear/config.js +103 -0
  254. package/dist/src/integrations/linear/config.js.map +1 -0
  255. package/dist/src/integrations/linear/sync-service.d.ts +25 -0
  256. package/dist/src/integrations/linear/sync-service.d.ts.map +1 -0
  257. package/dist/src/integrations/linear/sync-service.js +198 -0
  258. package/dist/src/integrations/linear/sync-service.js.map +1 -0
  259. package/dist/src/integrations/linear/sync.d.ts +119 -0
  260. package/dist/src/integrations/linear/sync.d.ts.map +1 -0
  261. package/dist/src/integrations/linear/sync.js +538 -0
  262. package/dist/src/integrations/linear/sync.js.map +1 -0
  263. package/dist/src/integrations/linear/types.d.ts +75 -0
  264. package/dist/src/integrations/linear/types.d.ts.map +1 -0
  265. package/dist/src/integrations/linear/types.js +2 -0
  266. package/dist/src/integrations/linear/types.js.map +1 -0
  267. package/dist/src/integrations/linear/webhook-server.d.ts +32 -0
  268. package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -0
  269. package/dist/src/integrations/linear/webhook-server.js +188 -0
  270. package/dist/src/integrations/linear/webhook-server.js.map +1 -0
  271. package/dist/src/integrations/linear/webhook.d.ts +95 -0
  272. package/dist/src/integrations/linear/webhook.d.ts.map +1 -0
  273. package/dist/src/integrations/linear/webhook.js +204 -0
  274. package/dist/src/integrations/linear/webhook.js.map +1 -0
  275. package/dist/src/integrations/mcp/__tests__/server.test.d.ts +5 -0
  276. package/dist/src/integrations/mcp/__tests__/server.test.d.ts.map +1 -0
  277. package/dist/src/integrations/mcp/__tests__/server.test.js +790 -0
  278. package/dist/src/integrations/mcp/__tests__/server.test.js.map +1 -0
  279. package/dist/src/integrations/mcp/server.d.ts +46 -0
  280. package/dist/src/integrations/mcp/server.d.ts.map +1 -0
  281. package/dist/src/integrations/mcp/server.js +1264 -0
  282. package/dist/src/integrations/mcp/server.js.map +1 -0
  283. package/dist/src/mcp/mcp-server.d.ts +1 -0
  284. package/dist/src/mcp/mcp-server.d.ts.map +1 -1
  285. package/dist/src/mcp/mcp-server.js +11 -0
  286. package/dist/src/mcp/mcp-server.js.map +1 -1
  287. package/dist/src/railway/index.d.ts +7 -0
  288. package/dist/src/railway/index.d.ts.map +1 -0
  289. package/dist/src/railway/index.js +401 -0
  290. package/dist/src/railway/index.js.map +1 -0
  291. package/dist/src/runway/auth/auth-middleware.d.ts +66 -0
  292. package/dist/src/runway/auth/auth-middleware.d.ts.map +1 -0
  293. package/dist/src/runway/auth/auth-middleware.js +337 -0
  294. package/dist/src/runway/auth/auth-middleware.js.map +1 -0
  295. package/dist/src/runway/server/runway-mcp-server.d.ts +46 -0
  296. package/dist/src/runway/server/runway-mcp-server.d.ts.map +1 -0
  297. package/dist/src/runway/server/runway-mcp-server.js +601 -0
  298. package/dist/src/runway/server/runway-mcp-server.js.map +1 -0
  299. package/dist/src/runway.bak/auth/auth-middleware.d.ts +66 -0
  300. package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +1 -0
  301. package/dist/src/runway.bak/auth/auth-middleware.js +337 -0
  302. package/dist/src/runway.bak/auth/auth-middleware.js.map +1 -0
  303. package/dist/src/runway.bak/server/runway-mcp-server.d.ts +46 -0
  304. package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +1 -0
  305. package/dist/src/runway.bak/server/runway-mcp-server.js +601 -0
  306. package/dist/src/runway.bak/server/runway-mcp-server.js.map +1 -0
  307. package/dist/src/servers/production/auth-middleware.d.ts +66 -0
  308. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -0
  309. package/dist/src/servers/production/auth-middleware.js +346 -0
  310. package/dist/src/servers/production/auth-middleware.js.map +1 -0
  311. package/dist/src/servers/railway/index.d.ts +7 -0
  312. package/dist/src/servers/railway/index.d.ts.map +1 -0
  313. package/dist/src/servers/railway/index.js +401 -0
  314. package/dist/src/servers/railway/index.js.map +1 -0
  315. package/dist/src/services/config-service.d.ts +44 -0
  316. package/dist/src/services/config-service.d.ts.map +1 -0
  317. package/dist/src/services/config-service.js +61 -0
  318. package/dist/src/services/config-service.js.map +1 -0
  319. package/dist/src/services/context-service.d.ts +17 -0
  320. package/dist/src/services/context-service.d.ts.map +1 -0
  321. package/dist/src/services/context-service.js +88 -0
  322. package/dist/src/services/context-service.js.map +1 -0
  323. package/dist/src/types/task.d.ts +17 -0
  324. package/dist/src/types/task.d.ts.map +1 -0
  325. package/dist/src/types/task.js +2 -0
  326. package/dist/src/types/task.js.map +1 -0
  327. package/dist/src/utils/logger.d.ts +13 -0
  328. package/dist/src/utils/logger.d.ts.map +1 -0
  329. package/dist/src/utils/logger.js +52 -0
  330. package/dist/src/utils/logger.js.map +1 -0
  331. package/package.json +40 -5
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Search Command for StackMemory CLI
3
+ * Search across tasks and context
4
+ */
5
+ import { Command } from 'commander';
6
+ import Database from 'better-sqlite3';
7
+ import { join } from 'path';
8
+ import { existsSync } from 'fs';
9
+ export function createSearchCommand() {
10
+ const search = new Command('search')
11
+ .alias('find')
12
+ .description('Search across tasks and context')
13
+ .argument('<query>', 'Search query')
14
+ .option('-t, --tasks', 'Search only tasks')
15
+ .option('-c, --context', 'Search only context')
16
+ .option('-l, --limit <n>', 'Limit results', '20')
17
+ .action(async (query, options) => {
18
+ const projectRoot = process.cwd();
19
+ const dbPath = join(projectRoot, '.stackmemory', 'context.db');
20
+ if (!existsSync(dbPath)) {
21
+ console.log('❌ StackMemory not initialized. Run "stackmemory init" first.');
22
+ return;
23
+ }
24
+ const db = new Database(dbPath);
25
+ const limit = parseInt(options.limit);
26
+ const searchTasks = !options.context || options.tasks;
27
+ const searchContext = !options.tasks || options.context;
28
+ console.log(`\n🔍 Searching for "${query}"...\n`);
29
+ let totalResults = 0;
30
+ // Search tasks
31
+ if (searchTasks) {
32
+ try {
33
+ const tasks = db
34
+ .prepare(`
35
+ SELECT id, title, description, status, priority, created_at
36
+ FROM task_cache
37
+ WHERE title LIKE ? OR description LIKE ?
38
+ ORDER BY created_at DESC
39
+ LIMIT ?
40
+ `)
41
+ .all(`%${query}%`, `%${query}%`, limit);
42
+ if (tasks.length > 0) {
43
+ console.log(`📋 Tasks (${tasks.length})\n`);
44
+ const priorityIcon = {
45
+ urgent: '🔴',
46
+ high: '🟠',
47
+ medium: '🟡',
48
+ low: '🟢',
49
+ };
50
+ const statusIcon = {
51
+ pending: '⏳',
52
+ in_progress: '🔄',
53
+ completed: '✅',
54
+ blocked: '🚫',
55
+ };
56
+ tasks.forEach((task) => {
57
+ const pIcon = priorityIcon[task.priority] || '⚪';
58
+ const sIcon = statusIcon[task.status] || '⚪';
59
+ console.log(`${sIcon} ${pIcon} ${task.title}`);
60
+ // Highlight match in description
61
+ if (task.description) {
62
+ const desc = task.description.split('\n')[0];
63
+ const matchIdx = desc
64
+ .toLowerCase()
65
+ .indexOf(query.toLowerCase());
66
+ if (matchIdx >= 0) {
67
+ const start = Math.max(0, matchIdx - 20);
68
+ const end = Math.min(desc.length, matchIdx + query.length + 20);
69
+ const snippet = (start > 0 ? '...' : '') +
70
+ desc.slice(start, end) +
71
+ (end < desc.length ? '...' : '');
72
+ console.log(` ${snippet}`);
73
+ }
74
+ }
75
+ });
76
+ console.log('');
77
+ totalResults += tasks.length;
78
+ }
79
+ }
80
+ catch (error) {
81
+ // Task table might not exist
82
+ }
83
+ }
84
+ // Search context/frames
85
+ if (searchContext) {
86
+ try {
87
+ const contexts = db
88
+ .prepare(`
89
+ SELECT id, type, name, metadata, created_at
90
+ FROM frames
91
+ WHERE name LIKE ? OR metadata LIKE ?
92
+ ORDER BY created_at DESC
93
+ LIMIT ?
94
+ `)
95
+ .all(`%${query}%`, `%${query}%`, limit);
96
+ if (contexts.length > 0) {
97
+ console.log(`📁 Context Frames (${contexts.length})\n`);
98
+ const typeIcon = {
99
+ session: '🔷',
100
+ task: '📋',
101
+ command: '⚡',
102
+ file: '📄',
103
+ decision: '💡',
104
+ };
105
+ contexts.forEach((ctx) => {
106
+ const icon = typeIcon[ctx.type] || '📦';
107
+ const date = new Date(ctx.created_at * 1000).toLocaleDateString();
108
+ console.log(`${icon} [${ctx.type}] ${ctx.name || ctx.id.slice(0, 10)}`);
109
+ console.log(` Created: ${date}`);
110
+ });
111
+ console.log('');
112
+ totalResults += contexts.length;
113
+ }
114
+ }
115
+ catch (error) {
116
+ // Frames table might not exist
117
+ }
118
+ }
119
+ // Search decisions/observations in events
120
+ if (searchContext) {
121
+ try {
122
+ const events = db
123
+ .prepare(`
124
+ SELECT id, type, data, timestamp
125
+ FROM events
126
+ WHERE data LIKE ?
127
+ ORDER BY timestamp DESC
128
+ LIMIT ?
129
+ `)
130
+ .all(`%${query}%`, limit);
131
+ if (events.length > 0) {
132
+ console.log(`📝 Events (${events.length})\n`);
133
+ events.forEach((evt) => {
134
+ const date = new Date(evt.timestamp * 1000).toLocaleDateString();
135
+ let data = {};
136
+ try {
137
+ data = JSON.parse(evt.data);
138
+ }
139
+ catch { }
140
+ const summary = data.content || data.message || data.decision || evt.type;
141
+ console.log(`⚡ [${evt.type}] ${String(summary).slice(0, 60)}`);
142
+ console.log(` ${date}`);
143
+ });
144
+ console.log('');
145
+ totalResults += events.length;
146
+ }
147
+ }
148
+ catch (error) {
149
+ // Events table might not exist
150
+ }
151
+ }
152
+ db.close();
153
+ if (totalResults === 0) {
154
+ console.log('No results found.\n');
155
+ }
156
+ else {
157
+ console.log(`Found ${totalResults} results.\n`);
158
+ }
159
+ });
160
+ return search;
161
+ }
162
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/cli/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Session Management CLI Commands
3
+ * Provides commands for managing StackMemory sessions
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function createSessionCommands(): Command;
7
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,IAAI,OAAO,CAqM/C"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Session Management CLI Commands
3
+ * Provides commands for managing StackMemory sessions
4
+ */
5
+ import { Command } from 'commander';
6
+ import { sessionManager } from '../../core/session/index.js';
7
+ import { logger } from '../../core/monitoring/logger.js';
8
+ import chalk from 'chalk';
9
+ export function createSessionCommands() {
10
+ const sessionCommand = new Command('session')
11
+ .description('Manage StackMemory sessions');
12
+ sessionCommand
13
+ .command('list')
14
+ .description('List all sessions')
15
+ .option('--project', 'Show only sessions for current project')
16
+ .option('--active', 'Show only active sessions')
17
+ .option('--all', 'Show all sessions including closed')
18
+ .action(async (options) => {
19
+ try {
20
+ await sessionManager.initialize();
21
+ const filter = {};
22
+ if (options.project) {
23
+ const projectHash = await getProjectHash();
24
+ filter.projectId = projectHash;
25
+ }
26
+ if (options.active && !options.all) {
27
+ filter.state = 'active';
28
+ }
29
+ const sessions = await sessionManager.listSessions(filter);
30
+ if (sessions.length === 0) {
31
+ console.log('No sessions found');
32
+ return;
33
+ }
34
+ console.log(chalk.bold('\n📋 StackMemory Sessions:\n'));
35
+ sessions.forEach(session => {
36
+ const age = formatAge(Date.now() - session.lastActiveAt);
37
+ const status = session.state === 'active' ? chalk.green('●') :
38
+ session.state === 'suspended' ? chalk.yellow('●') : chalk.gray('●');
39
+ console.log(`${status} ${chalk.bold(session.sessionId.slice(0, 8))}`);
40
+ console.log(` Project: ${session.projectId}`);
41
+ if (session.branch) {
42
+ console.log(` Branch: ${session.branch}`);
43
+ }
44
+ console.log(` State: ${session.state}`);
45
+ console.log(` Last active: ${age} ago`);
46
+ console.log('');
47
+ });
48
+ console.log(chalk.gray(`Total: ${sessions.length} session(s)`));
49
+ }
50
+ catch (error) {
51
+ logger.error('Failed to list sessions', error);
52
+ console.error('❌ Failed to list sessions:', error.message);
53
+ process.exit(1);
54
+ }
55
+ });
56
+ sessionCommand
57
+ .command('current')
58
+ .description('Show current session information')
59
+ .action(async () => {
60
+ try {
61
+ await sessionManager.initialize();
62
+ const session = sessionManager.getCurrentSession();
63
+ if (!session) {
64
+ console.log('No active session');
65
+ return;
66
+ }
67
+ const duration = formatDuration(Date.now() - session.startedAt);
68
+ console.log(chalk.bold('\n🔍 Current Session:\n'));
69
+ console.log(`Session ID: ${chalk.cyan(session.sessionId)}`);
70
+ console.log(`Run ID: ${session.runId}`);
71
+ console.log(`Project: ${session.projectId}`);
72
+ if (session.branch) {
73
+ console.log(`Branch: ${session.branch}`);
74
+ }
75
+ console.log(`State: ${session.state}`);
76
+ console.log(`Duration: ${duration}`);
77
+ if (session.metadata.user) {
78
+ console.log(`User: ${session.metadata.user}`);
79
+ }
80
+ if (session.metadata.tags && session.metadata.tags.length > 0) {
81
+ console.log(`Tags: ${session.metadata.tags.join(', ')}`);
82
+ }
83
+ }
84
+ catch (error) {
85
+ logger.error('Failed to show current session', error);
86
+ console.error('❌ Failed to show current session:', error.message);
87
+ process.exit(1);
88
+ }
89
+ });
90
+ sessionCommand
91
+ .command('switch <sessionId>')
92
+ .description('Switch to a different session')
93
+ .action(async (sessionId) => {
94
+ try {
95
+ await sessionManager.initialize();
96
+ // Suspend current session
97
+ const current = sessionManager.getCurrentSession();
98
+ if (current) {
99
+ await sessionManager.suspendSession();
100
+ console.log(`Suspended session: ${current.sessionId.slice(0, 8)}`);
101
+ }
102
+ // Resume target session
103
+ const session = await sessionManager.resumeSession(sessionId);
104
+ console.log(chalk.green(`✅ Switched to session: ${session.sessionId.slice(0, 8)}`));
105
+ console.log(` Project: ${session.projectId}`);
106
+ if (session.branch) {
107
+ console.log(` Branch: ${session.branch}`);
108
+ }
109
+ }
110
+ catch (error) {
111
+ logger.error('Failed to switch session', error);
112
+ console.error('❌ Failed to switch session:', error.message);
113
+ process.exit(1);
114
+ }
115
+ });
116
+ sessionCommand
117
+ .command('suspend [sessionId]')
118
+ .description('Suspend a session (current if not specified)')
119
+ .action(async (sessionId) => {
120
+ try {
121
+ await sessionManager.initialize();
122
+ await sessionManager.suspendSession(sessionId);
123
+ const id = sessionId || sessionManager.getCurrentSession()?.sessionId;
124
+ console.log(chalk.yellow(`⏸️ Suspended session: ${id?.slice(0, 8)}`));
125
+ }
126
+ catch (error) {
127
+ logger.error('Failed to suspend session', error);
128
+ console.error('❌ Failed to suspend session:', error.message);
129
+ process.exit(1);
130
+ }
131
+ });
132
+ sessionCommand
133
+ .command('resume <sessionId>')
134
+ .description('Resume a suspended session')
135
+ .action(async (sessionId) => {
136
+ try {
137
+ await sessionManager.initialize();
138
+ const session = await sessionManager.resumeSession(sessionId);
139
+ console.log(chalk.green(`▶️ Resumed session: ${session.sessionId.slice(0, 8)}`));
140
+ console.log(` Project: ${session.projectId}`);
141
+ if (session.branch) {
142
+ console.log(` Branch: ${session.branch}`);
143
+ }
144
+ }
145
+ catch (error) {
146
+ logger.error('Failed to resume session', error);
147
+ console.error('❌ Failed to resume session:', error.message);
148
+ process.exit(1);
149
+ }
150
+ });
151
+ sessionCommand
152
+ .command('merge <sourceId> <targetId>')
153
+ .description('Merge two sessions')
154
+ .action(async (sourceId, targetId) => {
155
+ try {
156
+ await sessionManager.initialize();
157
+ const merged = await sessionManager.mergeSessions(sourceId, targetId);
158
+ console.log(chalk.green(`✅ Merged sessions successfully`));
159
+ console.log(` Target: ${merged.sessionId.slice(0, 8)}`);
160
+ console.log(` Source ${sourceId.slice(0, 8)} has been closed`);
161
+ }
162
+ catch (error) {
163
+ logger.error('Failed to merge sessions', error);
164
+ console.error('❌ Failed to merge sessions:', error.message);
165
+ process.exit(1);
166
+ }
167
+ });
168
+ sessionCommand
169
+ .command('cleanup')
170
+ .description('Clean up old closed sessions')
171
+ .option('--days <days>', 'Remove sessions older than N days', '30')
172
+ .action(async (options) => {
173
+ try {
174
+ await sessionManager.initialize();
175
+ const days = parseInt(options.days);
176
+ const maxAge = days * 24 * 60 * 60 * 1000;
177
+ const cleaned = await sessionManager.cleanupStaleSessions(maxAge);
178
+ console.log(chalk.green(`✅ Cleaned up ${cleaned} old session(s)`));
179
+ }
180
+ catch (error) {
181
+ logger.error('Failed to cleanup sessions', error);
182
+ console.error('❌ Failed to cleanup sessions:', error.message);
183
+ process.exit(1);
184
+ }
185
+ });
186
+ return sessionCommand;
187
+ }
188
+ // Helper functions
189
+ async function getProjectHash() {
190
+ const crypto = await import('crypto');
191
+ const cwd = process.cwd();
192
+ const hash = crypto.createHash('sha256');
193
+ hash.update(cwd);
194
+ return hash.digest('hex').substring(0, 12);
195
+ }
196
+ function formatAge(ms) {
197
+ const seconds = Math.floor(ms / 1000);
198
+ const minutes = Math.floor(seconds / 60);
199
+ const hours = Math.floor(minutes / 60);
200
+ const days = Math.floor(hours / 24);
201
+ if (days > 0)
202
+ return `${days}d`;
203
+ if (hours > 0)
204
+ return `${hours}h`;
205
+ if (minutes > 0)
206
+ return `${minutes}m`;
207
+ return `${seconds}s`;
208
+ }
209
+ function formatDuration(ms) {
210
+ const seconds = Math.floor(ms / 1000);
211
+ const minutes = Math.floor(seconds / 60);
212
+ const hours = Math.floor(minutes / 60);
213
+ const h = hours;
214
+ const m = minutes % 60;
215
+ const s = seconds % 60;
216
+ if (h > 0)
217
+ return `${h}h ${m}m ${s}s`;
218
+ if (m > 0)
219
+ return `${m}m ${s}s`;
220
+ return `${s}s`;
221
+ }
222
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/cli/commands/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Enhanced Task Commands for StackMemory CLI
3
+ * Provides task management directly from command line
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function createTaskCommands(): Command;
7
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,kBAAkB,IAAI,OAAO,CA8N5C"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Enhanced Task Commands for StackMemory CLI
3
+ * Provides task management directly from command line
4
+ */
5
+ import { Command } from 'commander';
6
+ import Database from 'better-sqlite3';
7
+ import { join } from 'path';
8
+ import { existsSync } from 'fs';
9
+ import { PebblesTaskStore, } from '../../features/tasks/pebbles-task-store.js';
10
+ function getTaskStore(projectRoot) {
11
+ const dbPath = join(projectRoot, '.stackmemory', 'context.db');
12
+ if (!existsSync(dbPath)) {
13
+ console.log('❌ StackMemory not initialized. Run "stackmemory init" first.');
14
+ return null;
15
+ }
16
+ const db = new Database(dbPath);
17
+ return new PebblesTaskStore(projectRoot, db);
18
+ }
19
+ export function createTaskCommands() {
20
+ const tasks = new Command('tasks')
21
+ .alias('task')
22
+ .description('Manage tasks from command line');
23
+ // List tasks
24
+ tasks
25
+ .command('list')
26
+ .alias('ls')
27
+ .description('List tasks')
28
+ .option('-s, --status <status>', 'Filter by status (pending, in_progress, completed, blocked)')
29
+ .option('-p, --priority <priority>', 'Filter by priority (urgent, high, medium, low)')
30
+ .option('-q, --query <text>', 'Search in title/description')
31
+ .option('-l, --limit <n>', 'Limit results', '20')
32
+ .option('-a, --all', 'Include completed tasks')
33
+ .action(async (options) => {
34
+ const projectRoot = process.cwd();
35
+ const taskStore = getTaskStore(projectRoot);
36
+ if (!taskStore)
37
+ return;
38
+ try {
39
+ // Get all tasks from DB
40
+ const db = new Database(join(projectRoot, '.stackmemory', 'context.db'));
41
+ let query = 'SELECT * FROM task_cache WHERE 1=1';
42
+ const params = [];
43
+ if (!options.all && !options.status) {
44
+ query += " AND status NOT IN ('completed', 'cancelled')";
45
+ }
46
+ if (options.status) {
47
+ query += ' AND status = ?';
48
+ params.push(options.status);
49
+ }
50
+ if (options.priority) {
51
+ query += ' AND priority = ?';
52
+ params.push(options.priority);
53
+ }
54
+ if (options.query) {
55
+ query += ' AND (title LIKE ? OR description LIKE ?)';
56
+ params.push(`%${options.query}%`, `%${options.query}%`);
57
+ }
58
+ query += ' ORDER BY priority ASC, created_at DESC LIMIT ?';
59
+ params.push(parseInt(options.limit));
60
+ const rows = db.prepare(query).all(...params);
61
+ db.close();
62
+ if (rows.length === 0) {
63
+ console.log('📝 No tasks found');
64
+ return;
65
+ }
66
+ console.log(`\n📋 Tasks (${rows.length})\n`);
67
+ const priorityIcon = {
68
+ urgent: '🔴',
69
+ high: '🟠',
70
+ medium: '🟡',
71
+ low: '🟢',
72
+ };
73
+ const statusIcon = {
74
+ pending: '⏳',
75
+ in_progress: '🔄',
76
+ completed: '✅',
77
+ blocked: '🚫',
78
+ cancelled: '❌',
79
+ };
80
+ rows.forEach((row, i) => {
81
+ const pIcon = priorityIcon[row.priority] || '⚪';
82
+ const sIcon = statusIcon[row.status] || '⚪';
83
+ const id = row.id.slice(0, 10);
84
+ console.log(`${sIcon} ${pIcon} [${id}] ${row.title}`);
85
+ if (row.description) {
86
+ const desc = row.description.split('\n')[0].slice(0, 60);
87
+ console.log(` ${desc}${row.description.length > 60 ? '...' : ''}`);
88
+ }
89
+ });
90
+ console.log('');
91
+ }
92
+ catch (error) {
93
+ console.error('❌ Failed to list tasks:', error.message);
94
+ }
95
+ });
96
+ // Add task
97
+ tasks
98
+ .command('add <title>')
99
+ .description('Add a new task')
100
+ .option('-d, --description <text>', 'Task description')
101
+ .option('-p, --priority <priority>', 'Priority (urgent, high, medium, low)', 'medium')
102
+ .option('-t, --tags <tags>', 'Comma-separated tags')
103
+ .action(async (title, options) => {
104
+ const projectRoot = process.cwd();
105
+ const taskStore = getTaskStore(projectRoot);
106
+ if (!taskStore)
107
+ return;
108
+ try {
109
+ const taskId = taskStore.createTask({
110
+ title,
111
+ description: options.description,
112
+ priority: options.priority,
113
+ frameId: 'cli',
114
+ tags: options.tags
115
+ ? options.tags.split(',').map((t) => t.trim())
116
+ : [],
117
+ });
118
+ console.log(`✅ Created task: ${taskId.slice(0, 10)}`);
119
+ console.log(` Title: ${title}`);
120
+ console.log(` Priority: ${options.priority}`);
121
+ }
122
+ catch (error) {
123
+ console.error('❌ Failed to add task:', error.message);
124
+ }
125
+ });
126
+ // Start task (set to in_progress)
127
+ tasks
128
+ .command('start <taskId>')
129
+ .description('Start working on a task')
130
+ .action(async (taskId) => {
131
+ const projectRoot = process.cwd();
132
+ const taskStore = getTaskStore(projectRoot);
133
+ if (!taskStore)
134
+ return;
135
+ try {
136
+ // Find task by partial ID
137
+ const task = findTaskByPartialId(projectRoot, taskId);
138
+ if (!task) {
139
+ console.log(`❌ Task not found: ${taskId}`);
140
+ return;
141
+ }
142
+ taskStore.updateTaskStatus(task.id, 'in_progress', 'Started from CLI');
143
+ console.log(`🔄 Started: ${task.title}`);
144
+ }
145
+ catch (error) {
146
+ console.error('❌ Failed to start task:', error.message);
147
+ }
148
+ });
149
+ // Complete task
150
+ tasks
151
+ .command('done <taskId>')
152
+ .alias('complete')
153
+ .description('Mark task as completed')
154
+ .action(async (taskId) => {
155
+ const projectRoot = process.cwd();
156
+ const taskStore = getTaskStore(projectRoot);
157
+ if (!taskStore)
158
+ return;
159
+ try {
160
+ const task = findTaskByPartialId(projectRoot, taskId);
161
+ if (!task) {
162
+ console.log(`❌ Task not found: ${taskId}`);
163
+ return;
164
+ }
165
+ taskStore.updateTaskStatus(task.id, 'completed', 'Completed from CLI');
166
+ console.log(`✅ Completed: ${task.title}`);
167
+ }
168
+ catch (error) {
169
+ console.error('❌ Failed to complete task:', error.message);
170
+ }
171
+ });
172
+ // Show task details
173
+ tasks
174
+ .command('show <taskId>')
175
+ .description('Show task details')
176
+ .action(async (taskId) => {
177
+ const projectRoot = process.cwd();
178
+ try {
179
+ const task = findTaskByPartialId(projectRoot, taskId);
180
+ if (!task) {
181
+ console.log(`❌ Task not found: ${taskId}`);
182
+ return;
183
+ }
184
+ console.log(`\n📋 Task Details\n`);
185
+ console.log(`ID: ${task.id}`);
186
+ console.log(`Title: ${task.title}`);
187
+ console.log(`Status: ${task.status}`);
188
+ console.log(`Priority: ${task.priority}`);
189
+ console.log(`Created: ${new Date(task.created_at * 1000).toLocaleString()}`);
190
+ if (task.completed_at) {
191
+ console.log(`Completed: ${new Date(task.completed_at * 1000).toLocaleString()}`);
192
+ }
193
+ if (task.description) {
194
+ console.log(`\nDescription:\n${task.description}`);
195
+ }
196
+ const tags = JSON.parse(task.tags || '[]');
197
+ if (tags.length > 0) {
198
+ console.log(`\nTags: ${tags.join(', ')}`);
199
+ }
200
+ console.log('');
201
+ }
202
+ catch (error) {
203
+ console.error('❌ Failed to show task:', error.message);
204
+ }
205
+ });
206
+ return tasks;
207
+ }
208
+ function findTaskByPartialId(projectRoot, partialId) {
209
+ const dbPath = join(projectRoot, '.stackmemory', 'context.db');
210
+ if (!existsSync(dbPath))
211
+ return null;
212
+ const db = new Database(dbPath);
213
+ // Try exact match first, then partial
214
+ let row = db.prepare('SELECT * FROM task_cache WHERE id = ?').get(partialId);
215
+ if (!row) {
216
+ row = db
217
+ .prepare('SELECT * FROM task_cache WHERE id LIKE ?')
218
+ .get(`${partialId}%`);
219
+ }
220
+ // Also try matching Linear identifier in title
221
+ if (!row && partialId.match(/^ENG-\d+$/i)) {
222
+ row = db
223
+ .prepare('SELECT * FROM task_cache WHERE title LIKE ?')
224
+ .get(`%[${partialId.toUpperCase()}]%`);
225
+ }
226
+ db.close();
227
+ return row || null;
228
+ }
229
+ //# sourceMappingURL=tasks.js.map