@stackmemoryai/stackmemory 0.5.57 → 0.5.59

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 (611) hide show
  1. package/bin/codex-smd +6 -0
  2. package/dist/cli/codex-sm-danger.js +21 -0
  3. package/dist/cli/codex-sm-danger.js.map +7 -0
  4. package/dist/cli/commands/handoff.js +33 -3
  5. package/dist/cli/commands/handoff.js.map +2 -2
  6. package/dist/cli/commands/search.js +20 -3
  7. package/dist/cli/commands/search.js.map +2 -2
  8. package/dist/core/database/sqlite-adapter.js +13 -3
  9. package/dist/core/database/sqlite-adapter.js.map +2 -2
  10. package/dist/core/errors/error-utils.js +208 -0
  11. package/dist/core/errors/error-utils.js.map +7 -0
  12. package/dist/core/errors/index.js +13 -4
  13. package/dist/core/errors/index.js.map +2 -2
  14. package/dist/core/merge/unified-merge-resolver.js +303 -0
  15. package/dist/core/merge/unified-merge-resolver.js.map +7 -0
  16. package/dist/core/monitoring/logger.js +61 -9
  17. package/dist/core/monitoring/logger.js.map +2 -2
  18. package/dist/core/security/index.js +35 -0
  19. package/dist/core/security/index.js.map +7 -0
  20. package/dist/core/security/input-sanitizer.js +321 -0
  21. package/dist/core/security/input-sanitizer.js.map +7 -0
  22. package/dist/core/session/enhanced-handoff.js +136 -2
  23. package/dist/core/session/enhanced-handoff.js.map +3 -3
  24. package/dist/integrations/linear/client.js +5 -1
  25. package/dist/integrations/linear/client.js.map +2 -2
  26. package/dist/integrations/mcp/remote-server.js +27 -36
  27. package/dist/integrations/mcp/remote-server.js.map +2 -2
  28. package/dist/integrations/mcp/server.js +44 -29
  29. package/dist/integrations/mcp/server.js.map +3 -3
  30. package/dist/scripts/benchmark-performance.js +48 -0
  31. package/dist/scripts/benchmark-performance.js.map +7 -0
  32. package/dist/scripts/check-redis.js +42 -0
  33. package/dist/scripts/check-redis.js.map +7 -0
  34. package/dist/scripts/initialize.js +116 -0
  35. package/dist/scripts/initialize.js.map +7 -0
  36. package/dist/scripts/list-linear-tasks.js +124 -0
  37. package/dist/scripts/list-linear-tasks.js.map +7 -0
  38. package/dist/scripts/measure-handoff-impact.js +340 -0
  39. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  40. package/dist/scripts/query-chromadb.js +160 -0
  41. package/dist/scripts/query-chromadb.js.map +7 -0
  42. package/dist/scripts/show-linear-summary.js +119 -0
  43. package/dist/scripts/show-linear-summary.js.map +7 -0
  44. package/dist/scripts/simple-swarm-demo.js +90 -0
  45. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  46. package/dist/scripts/status.js +155 -0
  47. package/dist/scripts/status.js.map +7 -0
  48. package/dist/scripts/test-chromadb-sync.js +192 -0
  49. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  50. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  51. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  52. package/dist/scripts/test-ralph-iterations.js +121 -0
  53. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  54. package/dist/scripts/test-redis-storage.js +389 -0
  55. package/dist/scripts/test-redis-storage.js.map +7 -0
  56. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  57. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  58. package/dist/scripts/test-swarm-fixes.js +125 -0
  59. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  60. package/dist/scripts/test-swarm-tui.js +23 -0
  61. package/dist/scripts/test-swarm-tui.js.map +7 -0
  62. package/dist/scripts/test-tui-shortcuts.js +52 -0
  63. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  64. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  65. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  66. package/dist/src/agents/core/agent-task-manager.js +527 -0
  67. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  68. package/dist/src/agents/verifiers/base-verifier.js +133 -0
  69. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  70. package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
  71. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  72. package/dist/src/agents/verifiers/llm-judge.js +252 -0
  73. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  74. package/dist/src/cli/auto-detect.js +321 -0
  75. package/dist/src/cli/auto-detect.js.map +7 -0
  76. package/dist/src/cli/claude-sm-danger.js +21 -0
  77. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  78. package/dist/src/cli/claude-sm.js +1156 -0
  79. package/dist/src/cli/claude-sm.js.map +7 -0
  80. package/dist/src/cli/codex-sm-danger.js +21 -0
  81. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  82. package/dist/src/cli/codex-sm.js +349 -0
  83. package/dist/src/cli/codex-sm.js.map +7 -0
  84. package/dist/src/cli/commands/api.js +232 -0
  85. package/dist/src/cli/commands/api.js.map +7 -0
  86. package/dist/src/cli/commands/auto-background.js +180 -0
  87. package/dist/src/cli/commands/auto-background.js.map +7 -0
  88. package/dist/src/cli/commands/cleanup-processes.js +68 -0
  89. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  90. package/dist/src/cli/commands/clear.js +202 -0
  91. package/dist/src/cli/commands/clear.js.map +7 -0
  92. package/dist/src/cli/commands/config.js +445 -0
  93. package/dist/src/cli/commands/config.js.map +7 -0
  94. package/dist/src/cli/commands/context-rehydrate.js +751 -0
  95. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  96. package/dist/src/cli/commands/context.js +343 -0
  97. package/dist/src/cli/commands/context.js.map +7 -0
  98. package/dist/src/cli/commands/daemon.js +392 -0
  99. package/dist/src/cli/commands/daemon.js.map +7 -0
  100. package/dist/src/cli/commands/dashboard.js +210 -0
  101. package/dist/src/cli/commands/dashboard.js.map +7 -0
  102. package/dist/src/cli/commands/db.js +147 -0
  103. package/dist/src/cli/commands/db.js.map +7 -0
  104. package/dist/src/cli/commands/decision.js +266 -0
  105. package/dist/src/cli/commands/decision.js.map +7 -0
  106. package/dist/src/cli/commands/discovery.js +279 -0
  107. package/dist/src/cli/commands/discovery.js.map +7 -0
  108. package/dist/src/cli/commands/handoff.js +624 -0
  109. package/dist/src/cli/commands/handoff.js.map +7 -0
  110. package/dist/src/cli/commands/hooks.js +298 -0
  111. package/dist/src/cli/commands/hooks.js.map +7 -0
  112. package/dist/src/cli/commands/linear.js +529 -0
  113. package/dist/src/cli/commands/linear.js.map +7 -0
  114. package/dist/src/cli/commands/log.js +169 -0
  115. package/dist/src/cli/commands/log.js.map +7 -0
  116. package/dist/src/cli/commands/login.js +172 -0
  117. package/dist/src/cli/commands/login.js.map +7 -0
  118. package/dist/src/cli/commands/migrate.js +240 -0
  119. package/dist/src/cli/commands/migrate.js.map +7 -0
  120. package/dist/src/cli/commands/model.js +533 -0
  121. package/dist/src/cli/commands/model.js.map +7 -0
  122. package/dist/src/cli/commands/onboard.js +536 -0
  123. package/dist/src/cli/commands/onboard.js.map +7 -0
  124. package/dist/src/cli/commands/projects.js +199 -0
  125. package/dist/src/cli/commands/projects.js.map +7 -0
  126. package/dist/src/cli/commands/ralph.js +909 -0
  127. package/dist/src/cli/commands/ralph.js.map +7 -0
  128. package/dist/src/cli/commands/retrieval.js +248 -0
  129. package/dist/src/cli/commands/retrieval.js.map +7 -0
  130. package/dist/src/cli/commands/search.js +173 -0
  131. package/dist/src/cli/commands/search.js.map +7 -0
  132. package/dist/src/cli/commands/service.js +749 -0
  133. package/dist/src/cli/commands/service.js.map +7 -0
  134. package/dist/src/cli/commands/session.js +200 -0
  135. package/dist/src/cli/commands/session.js.map +7 -0
  136. package/dist/src/cli/commands/settings.js +306 -0
  137. package/dist/src/cli/commands/settings.js.map +7 -0
  138. package/dist/src/cli/commands/setup.js +701 -0
  139. package/dist/src/cli/commands/setup.js.map +7 -0
  140. package/dist/src/cli/commands/shell.js +249 -0
  141. package/dist/src/cli/commands/shell.js.map +7 -0
  142. package/dist/src/cli/commands/signup.js +50 -0
  143. package/dist/src/cli/commands/signup.js.map +7 -0
  144. package/dist/src/cli/commands/skills.js +470 -0
  145. package/dist/src/cli/commands/skills.js.map +7 -0
  146. package/dist/src/cli/commands/sms-notify.js +795 -0
  147. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  148. package/dist/src/cli/commands/storage-tier.js +183 -0
  149. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  150. package/dist/src/cli/commands/sweep.js +249 -0
  151. package/dist/src/cli/commands/sweep.js.map +7 -0
  152. package/dist/src/cli/commands/tasks.js +213 -0
  153. package/dist/src/cli/commands/tasks.js.map +7 -0
  154. package/dist/src/cli/commands/worktree.js +319 -0
  155. package/dist/src/cli/commands/worktree.js.map +7 -0
  156. package/dist/src/cli/index.js +594 -0
  157. package/dist/src/cli/index.js.map +7 -0
  158. package/dist/src/cli/opencode-sm.js +448 -0
  159. package/dist/src/cli/opencode-sm.js.map +7 -0
  160. package/dist/src/cli/utils/viewer.js +96 -0
  161. package/dist/src/cli/utils/viewer.js.map +7 -0
  162. package/dist/src/core/config/config-manager.js +398 -0
  163. package/dist/src/core/config/config-manager.js.map +7 -0
  164. package/dist/src/core/config/feature-flags.js +76 -0
  165. package/dist/src/core/config/feature-flags.js.map +7 -0
  166. package/dist/src/core/config/storage-config.js +115 -0
  167. package/dist/src/core/config/storage-config.js.map +7 -0
  168. package/dist/src/core/config/types.js +144 -0
  169. package/dist/src/core/config/types.js.map +7 -0
  170. package/dist/src/core/context/auto-context.js +80 -0
  171. package/dist/src/core/context/auto-context.js.map +7 -0
  172. package/dist/src/core/context/dual-stack-manager.js +870 -0
  173. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  174. package/dist/src/core/context/enhanced-rehydration.js +994 -0
  175. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  176. package/dist/src/core/context/frame-database.js +479 -0
  177. package/dist/src/core/context/frame-database.js.map +7 -0
  178. package/dist/src/core/context/frame-digest.js +250 -0
  179. package/dist/src/core/context/frame-digest.js.map +7 -0
  180. package/dist/src/core/context/frame-handoff-manager.js +778 -0
  181. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  182. package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
  183. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  184. package/dist/src/core/context/frame-recovery.js +302 -0
  185. package/dist/src/core/context/frame-recovery.js.map +7 -0
  186. package/dist/src/core/context/frame-stack.js +314 -0
  187. package/dist/src/core/context/frame-stack.js.map +7 -0
  188. package/dist/src/core/context/frame-types.js +5 -0
  189. package/dist/src/core/context/frame-types.js.map +7 -0
  190. package/dist/src/core/context/index.js +25 -0
  191. package/dist/src/core/context/index.js.map +7 -0
  192. package/dist/src/core/context/permission-manager.js +185 -0
  193. package/dist/src/core/context/permission-manager.js.map +7 -0
  194. package/dist/src/core/context/recursive-context-manager.js +592 -0
  195. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  196. package/dist/src/core/context/refactored-frame-manager.js +754 -0
  197. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  198. package/dist/src/core/context/shared-context-layer.js +621 -0
  199. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  200. package/dist/src/core/context/stack-merge-resolver.js +749 -0
  201. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  202. package/dist/src/core/context/validation.js +130 -0
  203. package/dist/src/core/context/validation.js.map +7 -0
  204. package/dist/src/core/database/batch-operations.js +384 -0
  205. package/dist/src/core/database/batch-operations.js.map +7 -0
  206. package/dist/src/core/database/connection-pool.js +330 -0
  207. package/dist/src/core/database/connection-pool.js.map +7 -0
  208. package/dist/src/core/database/database-adapter.js +60 -0
  209. package/dist/src/core/database/database-adapter.js.map +7 -0
  210. package/dist/src/core/database/migration-manager.js +614 -0
  211. package/dist/src/core/database/migration-manager.js.map +7 -0
  212. package/dist/src/core/database/query-cache.js +298 -0
  213. package/dist/src/core/database/query-cache.js.map +7 -0
  214. package/dist/src/core/database/query-router.js +430 -0
  215. package/dist/src/core/database/query-router.js.map +7 -0
  216. package/dist/src/core/database/sqlite-adapter.js +738 -0
  217. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  218. package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
  219. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  220. package/dist/src/core/digest/frame-digest-integration.js +176 -0
  221. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  222. package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
  223. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  224. package/dist/src/core/digest/index.js +9 -0
  225. package/dist/src/core/digest/index.js.map +7 -0
  226. package/dist/src/core/digest/types.js +25 -0
  227. package/dist/src/core/digest/types.js.map +7 -0
  228. package/dist/src/core/errors/error-utils.js +208 -0
  229. package/dist/src/core/errors/error-utils.js.map +7 -0
  230. package/dist/src/core/errors/index.js +521 -0
  231. package/dist/src/core/errors/index.js.map +7 -0
  232. package/dist/src/core/errors/recovery.js +269 -0
  233. package/dist/src/core/errors/recovery.js.map +7 -0
  234. package/dist/src/core/execution/parallel-executor.js +258 -0
  235. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  236. package/dist/src/core/frame/workflow-templates.js +319 -0
  237. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  238. package/dist/src/core/merge/conflict-detector.js +431 -0
  239. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  240. package/dist/src/core/merge/index.js +9 -0
  241. package/dist/src/core/merge/index.js.map +7 -0
  242. package/dist/src/core/merge/resolution-engine.js +558 -0
  243. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  244. package/dist/src/core/merge/stack-diff.js +532 -0
  245. package/dist/src/core/merge/stack-diff.js.map +7 -0
  246. package/dist/src/core/merge/types.js +5 -0
  247. package/dist/src/core/merge/types.js.map +7 -0
  248. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  249. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  250. package/dist/src/core/models/fallback-monitor.js +232 -0
  251. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  252. package/dist/src/core/models/model-router.js +340 -0
  253. package/dist/src/core/models/model-router.js.map +7 -0
  254. package/dist/src/core/monitoring/error-handler.js +49 -0
  255. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  256. package/dist/src/core/monitoring/logger.js +202 -0
  257. package/dist/src/core/monitoring/logger.js.map +7 -0
  258. package/dist/src/core/monitoring/metrics.js +172 -0
  259. package/dist/src/core/monitoring/metrics.js.map +7 -0
  260. package/dist/src/core/monitoring/progress-tracker.js +189 -0
  261. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  262. package/dist/src/core/monitoring/session-monitor.js +300 -0
  263. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  264. package/dist/src/core/performance/context-cache.js +273 -0
  265. package/dist/src/core/performance/context-cache.js.map +7 -0
  266. package/dist/src/core/performance/index.js +11 -0
  267. package/dist/src/core/performance/index.js.map +7 -0
  268. package/dist/src/core/performance/lazy-context-loader.js +327 -0
  269. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  270. package/dist/src/core/performance/monitor.js +221 -0
  271. package/dist/src/core/performance/monitor.js.map +7 -0
  272. package/dist/src/core/performance/optimized-frame-context.js +345 -0
  273. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  274. package/dist/src/core/performance/performance-benchmark.js +277 -0
  275. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  276. package/dist/src/core/performance/performance-profiler.js +370 -0
  277. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  278. package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
  279. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  280. package/dist/src/core/persistence/postgres-adapter.js +349 -0
  281. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  282. package/dist/src/core/projects/project-isolation.js +201 -0
  283. package/dist/src/core/projects/project-isolation.js.map +7 -0
  284. package/dist/src/core/projects/project-manager.js +697 -0
  285. package/dist/src/core/projects/project-manager.js.map +7 -0
  286. package/dist/src/core/query/query-parser.js +370 -0
  287. package/dist/src/core/query/query-parser.js.map +7 -0
  288. package/dist/src/core/query/query-templates.js +321 -0
  289. package/dist/src/core/query/query-templates.js.map +7 -0
  290. package/dist/src/core/retrieval/context-retriever.js +479 -0
  291. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  292. package/dist/src/core/retrieval/index.js +8 -0
  293. package/dist/src/core/retrieval/index.js.map +7 -0
  294. package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
  295. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  296. package/dist/src/core/retrieval/llm-provider.js +151 -0
  297. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  298. package/dist/src/core/retrieval/retrieval-audit.js +236 -0
  299. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  300. package/dist/src/core/retrieval/summary-generator.js +589 -0
  301. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  302. package/dist/src/core/retrieval/types.js +21 -0
  303. package/dist/src/core/retrieval/types.js.map +7 -0
  304. package/dist/src/core/security/index.js +35 -0
  305. package/dist/src/core/security/index.js.map +7 -0
  306. package/dist/src/core/security/input-sanitizer.js +321 -0
  307. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  308. package/dist/src/core/session/clear-survival.js +465 -0
  309. package/dist/src/core/session/clear-survival.js.map +7 -0
  310. package/dist/src/core/session/enhanced-handoff.js +792 -0
  311. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  312. package/dist/src/core/session/handoff-generator.js +343 -0
  313. package/dist/src/core/session/handoff-generator.js.map +7 -0
  314. package/dist/src/core/session/index.js +15 -0
  315. package/dist/src/core/session/index.js.map +7 -0
  316. package/dist/src/core/session/session-manager.js +347 -0
  317. package/dist/src/core/session/session-manager.js.map +7 -0
  318. package/dist/src/core/skills/index.js +7 -0
  319. package/dist/src/core/skills/index.js.map +7 -0
  320. package/dist/src/core/skills/skill-storage.js +764 -0
  321. package/dist/src/core/skills/skill-storage.js.map +7 -0
  322. package/dist/src/core/skills/types.js +193 -0
  323. package/dist/src/core/skills/types.js.map +7 -0
  324. package/dist/src/core/storage/chromadb-adapter.js +354 -0
  325. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  326. package/dist/src/core/storage/infinite-storage.js +510 -0
  327. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  328. package/dist/src/core/storage/remote-storage.js +489 -0
  329. package/dist/src/core/storage/remote-storage.js.map +7 -0
  330. package/dist/src/core/storage/two-tier-storage.js +766 -0
  331. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  332. package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
  333. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  334. package/dist/src/core/trace/db-trace-wrapper.js +247 -0
  335. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  336. package/dist/src/core/trace/debug-trace.js +417 -0
  337. package/dist/src/core/trace/debug-trace.js.map +7 -0
  338. package/dist/src/core/trace/index.js +109 -0
  339. package/dist/src/core/trace/index.js.map +7 -0
  340. package/dist/src/core/trace/linear-api-wrapper.js +178 -0
  341. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  342. package/dist/src/core/trace/trace-detector.js +528 -0
  343. package/dist/src/core/trace/trace-detector.js.map +7 -0
  344. package/dist/src/core/trace/trace-store.js +345 -0
  345. package/dist/src/core/trace/trace-store.js.map +7 -0
  346. package/dist/src/core/trace/types.js +77 -0
  347. package/dist/src/core/trace/types.js.map +7 -0
  348. package/dist/src/core/types.js +5 -0
  349. package/dist/src/core/types.js.map +7 -0
  350. package/dist/src/core/utils/async-mutex.js +114 -0
  351. package/dist/src/core/utils/async-mutex.js.map +7 -0
  352. package/dist/src/core/utils/compression.js +83 -0
  353. package/dist/src/core/utils/compression.js.map +7 -0
  354. package/dist/src/core/utils/update-checker.js +218 -0
  355. package/dist/src/core/utils/update-checker.js.map +7 -0
  356. package/dist/src/core/worktree/worktree-manager.js +465 -0
  357. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  358. package/dist/src/daemon/daemon-config.js +149 -0
  359. package/dist/src/daemon/daemon-config.js.map +7 -0
  360. package/dist/src/daemon/services/context-service.js +122 -0
  361. package/dist/src/daemon/services/context-service.js.map +7 -0
  362. package/dist/src/daemon/services/linear-service.js +136 -0
  363. package/dist/src/daemon/services/linear-service.js.map +7 -0
  364. package/dist/src/daemon/session-daemon.js +312 -0
  365. package/dist/src/daemon/session-daemon.js.map +7 -0
  366. package/dist/src/daemon/unified-daemon.js +276 -0
  367. package/dist/src/daemon/unified-daemon.js.map +7 -0
  368. package/dist/src/features/analytics/api/analytics-api.js +287 -0
  369. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  370. package/dist/src/features/analytics/core/analytics-service.js +282 -0
  371. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  372. package/dist/src/features/analytics/index.js +18 -0
  373. package/dist/src/features/analytics/index.js.map +7 -0
  374. package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
  375. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  376. package/dist/src/features/analytics/types/metrics.js +5 -0
  377. package/dist/src/features/analytics/types/metrics.js.map +7 -0
  378. package/dist/src/features/browser/browser-mcp.js +492 -0
  379. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  380. package/dist/src/features/sweep/index.js +20 -0
  381. package/dist/src/features/sweep/index.js.map +7 -0
  382. package/dist/src/features/sweep/prediction-client.js +155 -0
  383. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  384. package/dist/src/features/sweep/prompt-builder.js +85 -0
  385. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  386. package/dist/src/features/sweep/pty-wrapper.js +171 -0
  387. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  388. package/dist/src/features/sweep/state-watcher.js +87 -0
  389. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  390. package/dist/src/features/sweep/status-bar.js +88 -0
  391. package/dist/src/features/sweep/status-bar.js.map +7 -0
  392. package/dist/src/features/sweep/sweep-server-manager.js +226 -0
  393. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  394. package/dist/src/features/sweep/tab-interceptor.js +38 -0
  395. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  396. package/dist/src/features/sweep/types.js +18 -0
  397. package/dist/src/features/sweep/types.js.map +7 -0
  398. package/dist/src/features/tasks/linear-task-manager.js +487 -0
  399. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  400. package/dist/src/features/tasks/task-aware-context.js +410 -0
  401. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  402. package/dist/src/features/tui/simple-monitor.js +116 -0
  403. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  404. package/dist/src/features/tui/swarm-monitor.js +648 -0
  405. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  406. package/dist/src/features/web/client/stores/task-store.js +26 -0
  407. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  408. package/dist/src/features/web/server/index.js +194 -0
  409. package/dist/src/features/web/server/index.js.map +7 -0
  410. package/dist/src/hooks/auto-background.js +151 -0
  411. package/dist/src/hooks/auto-background.js.map +7 -0
  412. package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
  413. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  414. package/dist/src/hooks/config.js +150 -0
  415. package/dist/src/hooks/config.js.map +7 -0
  416. package/dist/src/hooks/daemon.js +364 -0
  417. package/dist/src/hooks/daemon.js.map +7 -0
  418. package/dist/src/hooks/events.js +58 -0
  419. package/dist/src/hooks/events.js.map +7 -0
  420. package/dist/src/hooks/index.js +12 -0
  421. package/dist/src/hooks/index.js.map +7 -0
  422. package/dist/src/hooks/linear-task-picker.js +186 -0
  423. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  424. package/dist/src/hooks/schemas.js +197 -0
  425. package/dist/src/hooks/schemas.js.map +7 -0
  426. package/dist/src/hooks/secure-fs.js +49 -0
  427. package/dist/src/hooks/secure-fs.js.map +7 -0
  428. package/dist/src/hooks/security-logger.js +155 -0
  429. package/dist/src/hooks/security-logger.js.map +7 -0
  430. package/dist/src/hooks/session-summary.js +222 -0
  431. package/dist/src/hooks/session-summary.js.map +7 -0
  432. package/dist/src/hooks/sms-action-runner.js +371 -0
  433. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  434. package/dist/src/hooks/sms-notify.js +506 -0
  435. package/dist/src/hooks/sms-notify.js.map +7 -0
  436. package/dist/src/hooks/sms-watcher.js +93 -0
  437. package/dist/src/hooks/sms-watcher.js.map +7 -0
  438. package/dist/src/hooks/sms-webhook.js +555 -0
  439. package/dist/src/hooks/sms-webhook.js.map +7 -0
  440. package/dist/src/hooks/whatsapp-commands.js +479 -0
  441. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  442. package/dist/src/hooks/whatsapp-scheduler.js +317 -0
  443. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  444. package/dist/src/hooks/whatsapp-sync.js +409 -0
  445. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  446. package/dist/src/index.js +25 -0
  447. package/dist/src/index.js.map +7 -0
  448. package/dist/src/integrations/anthropic/client.js +263 -0
  449. package/dist/src/integrations/anthropic/client.js.map +7 -0
  450. package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
  451. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  452. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
  453. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  454. package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
  455. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  456. package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
  457. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  458. package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
  459. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  460. package/dist/src/integrations/claude-code/subagent-client.js +511 -0
  461. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  462. package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
  463. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  464. package/dist/src/integrations/linear/auth.js +337 -0
  465. package/dist/src/integrations/linear/auth.js.map +7 -0
  466. package/dist/src/integrations/linear/auto-sync.js +258 -0
  467. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  468. package/dist/src/integrations/linear/client.js +634 -0
  469. package/dist/src/integrations/linear/client.js.map +7 -0
  470. package/dist/src/integrations/linear/config.js +130 -0
  471. package/dist/src/integrations/linear/config.js.map +7 -0
  472. package/dist/src/integrations/linear/migration.js +361 -0
  473. package/dist/src/integrations/linear/migration.js.map +7 -0
  474. package/dist/src/integrations/linear/oauth-server.js +454 -0
  475. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  476. package/dist/src/integrations/linear/rest-client.js +213 -0
  477. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  478. package/dist/src/integrations/linear/sync-manager.js +236 -0
  479. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  480. package/dist/src/integrations/linear/sync-service.js +231 -0
  481. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  482. package/dist/src/integrations/linear/sync.js +782 -0
  483. package/dist/src/integrations/linear/sync.js.map +7 -0
  484. package/dist/src/integrations/linear/types.js +5 -0
  485. package/dist/src/integrations/linear/types.js.map +7 -0
  486. package/dist/src/integrations/linear/unified-sync.js +589 -0
  487. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  488. package/dist/src/integrations/linear/webhook-handler.js +219 -0
  489. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  490. package/dist/src/integrations/linear/webhook-server.js +218 -0
  491. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  492. package/dist/src/integrations/linear/webhook.js +291 -0
  493. package/dist/src/integrations/linear/webhook.js.map +7 -0
  494. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
  495. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  496. package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
  497. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  498. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
  499. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  500. package/dist/src/integrations/mcp/handlers/index.js +166 -0
  501. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  502. package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
  503. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  504. package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
  505. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  506. package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
  507. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  508. package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
  509. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  510. package/dist/src/integrations/mcp/index.js +23 -0
  511. package/dist/src/integrations/mcp/index.js.map +7 -0
  512. package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
  513. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  514. package/dist/src/integrations/mcp/refactored-server.js +374 -0
  515. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  516. package/dist/src/integrations/mcp/remote-server.js +682 -0
  517. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  518. package/dist/src/integrations/mcp/schemas.js +147 -0
  519. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  520. package/dist/src/integrations/mcp/server.js +1975 -0
  521. package/dist/src/integrations/mcp/server.js.map +7 -0
  522. package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
  523. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  524. package/dist/src/integrations/mcp/tool-definitions.js +702 -0
  525. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  526. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
  527. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  528. package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
  529. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  530. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
  531. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  532. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
  533. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  534. package/dist/src/integrations/ralph/index.js +18 -0
  535. package/dist/src/integrations/ralph/index.js.map +7 -0
  536. package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
  537. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  538. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
  539. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  540. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
  541. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  542. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
  543. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  544. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
  545. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  546. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
  547. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  548. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
  549. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  550. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
  551. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  552. package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
  553. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  554. package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
  555. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  556. package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
  557. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  558. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
  559. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  560. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
  561. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  562. package/dist/src/integrations/ralph/types.js +5 -0
  563. package/dist/src/integrations/ralph/types.js.map +7 -0
  564. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
  565. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  566. package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
  567. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  568. package/dist/src/middleware/exponential-rate-limiter.js +289 -0
  569. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  570. package/dist/src/models/user.model.js +358 -0
  571. package/dist/src/models/user.model.js.map +7 -0
  572. package/dist/src/servers/production/auth-middleware.js +528 -0
  573. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  574. package/dist/src/services/config-service.js +65 -0
  575. package/dist/src/services/config-service.js.map +7 -0
  576. package/dist/src/services/context-service.js +194 -0
  577. package/dist/src/services/context-service.js.map +7 -0
  578. package/dist/src/skills/api-discovery.js +354 -0
  579. package/dist/src/skills/api-discovery.js.map +7 -0
  580. package/dist/src/skills/api-skill.js +475 -0
  581. package/dist/src/skills/api-skill.js.map +7 -0
  582. package/dist/src/skills/claude-skills.js +1061 -0
  583. package/dist/src/skills/claude-skills.js.map +7 -0
  584. package/dist/src/skills/dashboard-launcher.js +216 -0
  585. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  586. package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
  587. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  588. package/dist/src/skills/repo-ingestion-skill.js +609 -0
  589. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  590. package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
  591. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  592. package/dist/src/types/task.js +5 -0
  593. package/dist/src/types/task.js.map +7 -0
  594. package/dist/src/utils/env.js +50 -0
  595. package/dist/src/utils/env.js.map +7 -0
  596. package/dist/src/utils/formatting.js +62 -0
  597. package/dist/src/utils/formatting.js.map +7 -0
  598. package/dist/src/utils/process-cleanup.js +136 -0
  599. package/dist/src/utils/process-cleanup.js.map +7 -0
  600. package/package.json +4 -3
  601. package/scripts/create-cleanup-issues.js +302 -0
  602. package/scripts/demos/browser-test.ts +39 -0
  603. package/scripts/demos/ralph-integration-demo.ts +244 -0
  604. package/scripts/demos/trace-demo.ts +214 -0
  605. package/scripts/demos/trace-detector.demo.ts +171 -0
  606. package/scripts/demos/trace-test.ts +67 -0
  607. package/scripts/initialize.ts +16 -7
  608. package/scripts/install.sh +14 -62
  609. package/scripts/status.ts +111 -46
  610. package/scripts/test-claude-config.sh +123 -0
  611. package/scripts/validate-claude-config.sh +155 -0
@@ -0,0 +1,465 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { execSync } from "child_process";
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
7
+ import { join, basename, dirname } from "path";
8
+ import { homedir } from "os";
9
+ import Database from "better-sqlite3";
10
+ import { logger } from "../monitoring/logger.js";
11
+ import { ProjectManager } from "../projects/project-manager.js";
12
+ import {
13
+ createErrorHandler
14
+ } from "../errors/index.js";
15
+ class WorktreeManager {
16
+ static instance;
17
+ config;
18
+ configPath;
19
+ worktreeCache = /* @__PURE__ */ new Map();
20
+ contextMap = /* @__PURE__ */ new Map();
21
+ db;
22
+ constructor() {
23
+ this.configPath = join(homedir(), ".stackmemory", "worktree-config.json");
24
+ this.config = this.loadConfig();
25
+ try {
26
+ if (this.config.enabled) {
27
+ this.initialize();
28
+ }
29
+ } catch (error) {
30
+ logger.error(
31
+ "Failed to initialize WorktreeManager",
32
+ error instanceof Error ? error : new Error(String(error)),
33
+ {
34
+ configPath: this.configPath
35
+ }
36
+ );
37
+ this.config.enabled = false;
38
+ }
39
+ }
40
+ static getInstance() {
41
+ if (!WorktreeManager.instance) {
42
+ WorktreeManager.instance = new WorktreeManager();
43
+ }
44
+ return WorktreeManager.instance;
45
+ }
46
+ /**
47
+ * Initialize worktree management
48
+ */
49
+ initialize() {
50
+ const dbPath = join(homedir(), ".stackmemory", "worktrees.db");
51
+ const errorHandler = createErrorHandler({
52
+ operation: "initialize",
53
+ dbPath
54
+ });
55
+ try {
56
+ this.db = new Database(dbPath);
57
+ this.db.exec(`
58
+ CREATE TABLE IF NOT EXISTS worktrees (
59
+ id TEXT PRIMARY KEY,
60
+ path TEXT NOT NULL UNIQUE,
61
+ branch TEXT NOT NULL,
62
+ commit TEXT,
63
+ is_main BOOLEAN,
64
+ is_bare BOOLEAN,
65
+ is_detached BOOLEAN,
66
+ linked_path TEXT,
67
+ context_id TEXT UNIQUE,
68
+ project_id TEXT,
69
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
70
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
71
+ );
72
+
73
+ CREATE TABLE IF NOT EXISTS worktree_contexts (
74
+ context_id TEXT PRIMARY KEY,
75
+ worktree_id TEXT NOT NULL,
76
+ project_id TEXT,
77
+ branch TEXT,
78
+ context_path TEXT,
79
+ db_path TEXT,
80
+ last_synced DATETIME,
81
+ metadata JSON,
82
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
83
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id)
84
+ );
85
+
86
+ CREATE TABLE IF NOT EXISTS context_sync (
87
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
88
+ source_context TEXT,
89
+ target_context TEXT,
90
+ sync_type TEXT, -- 'push', 'pull', 'merge'
91
+ data JSON,
92
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
93
+ );
94
+
95
+ CREATE INDEX IF NOT EXISTS idx_worktrees_project ON worktrees(project_id);
96
+ CREATE INDEX IF NOT EXISTS idx_contexts_worktree ON worktree_contexts(worktree_id);
97
+ `);
98
+ } catch (error) {
99
+ errorHandler(error);
100
+ }
101
+ }
102
+ /**
103
+ * Load configuration
104
+ */
105
+ loadConfig() {
106
+ if (existsSync(this.configPath)) {
107
+ try {
108
+ return JSON.parse(readFileSync(this.configPath, "utf-8"));
109
+ } catch (error) {
110
+ logger.error("Failed to load worktree config", error);
111
+ }
112
+ }
113
+ return {
114
+ enabled: false,
115
+ autoDetect: true,
116
+ isolateContexts: true,
117
+ shareGlobalContext: false,
118
+ syncInterval: 15,
119
+ maxWorktrees: 10
120
+ };
121
+ }
122
+ /**
123
+ * Save configuration
124
+ */
125
+ saveConfig(config) {
126
+ this.config = { ...this.config, ...config };
127
+ const configDir = dirname(this.configPath);
128
+ if (!existsSync(configDir)) {
129
+ mkdirSync(configDir, { recursive: true });
130
+ }
131
+ writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));
132
+ if (config.enabled && !this.db) {
133
+ this.initialize();
134
+ }
135
+ logger.info("Worktree configuration updated", { config: this.config });
136
+ }
137
+ /**
138
+ * Detect git worktrees in current repository
139
+ */
140
+ detectWorktrees(repoPath) {
141
+ const path = repoPath || process.cwd();
142
+ try {
143
+ const output = execSync("git worktree list --porcelain", {
144
+ cwd: path,
145
+ encoding: "utf-8"
146
+ });
147
+ const worktrees = [];
148
+ const lines = output.split("\n");
149
+ let currentWorktree = {};
150
+ for (const line of lines) {
151
+ if (line.startsWith("worktree ")) {
152
+ if (currentWorktree.path) {
153
+ worktrees.push(this.finalizeWorktreeInfo(currentWorktree));
154
+ }
155
+ currentWorktree = { path: line.substring(9) };
156
+ } else if (line.startsWith("HEAD ")) {
157
+ currentWorktree.commit = line.substring(5);
158
+ } else if (line.startsWith("branch ")) {
159
+ currentWorktree.branch = line.substring(7);
160
+ } else if (line === "bare") {
161
+ currentWorktree.isBare = true;
162
+ } else if (line === "detached") {
163
+ currentWorktree.isDetached = true;
164
+ }
165
+ }
166
+ if (currentWorktree.path) {
167
+ worktrees.push(this.finalizeWorktreeInfo(currentWorktree));
168
+ }
169
+ if (worktrees.length > 0) {
170
+ const mainPath = this.getMainWorktreePath(path);
171
+ worktrees.forEach((wt) => {
172
+ wt.isMainWorktree = wt.path === mainPath;
173
+ if (!wt.isMainWorktree) {
174
+ wt.linkedPath = mainPath;
175
+ }
176
+ });
177
+ }
178
+ worktrees.forEach((wt) => {
179
+ this.worktreeCache.set(wt.path, wt);
180
+ if (this.config.enabled) {
181
+ this.saveWorktree(wt);
182
+ }
183
+ });
184
+ logger.info(`Detected ${worktrees.length} worktrees`, {
185
+ count: worktrees.length,
186
+ branches: worktrees.map((w) => w.branch).filter(Boolean)
187
+ });
188
+ return worktrees;
189
+ } catch (error) {
190
+ logger.debug("Not a git repository or git worktree not available");
191
+ return [];
192
+ }
193
+ }
194
+ /**
195
+ * Get main worktree path
196
+ */
197
+ getMainWorktreePath(path) {
198
+ try {
199
+ const gitDir = execSync("git rev-parse --git-common-dir", {
200
+ cwd: path,
201
+ encoding: "utf-8"
202
+ }).trim();
203
+ if (gitDir.includes("/.git/worktrees/")) {
204
+ const mainGitDir = gitDir.replace(/\/\.git\/worktrees\/.*$/, "");
205
+ return mainGitDir;
206
+ }
207
+ return dirname(gitDir);
208
+ } catch {
209
+ return path;
210
+ }
211
+ }
212
+ /**
213
+ * Finalize worktree info with defaults
214
+ */
215
+ finalizeWorktreeInfo(partial) {
216
+ return {
217
+ path: partial.path || "",
218
+ branch: partial.branch || "detached",
219
+ commit: partial.commit || "",
220
+ isMainWorktree: partial.isMainWorktree || false,
221
+ isBare: partial.isBare || false,
222
+ isDetached: partial.isDetached || false,
223
+ linkedPath: partial.linkedPath,
224
+ contextId: this.generateContextId(
225
+ partial.path || "",
226
+ partial.branch || ""
227
+ )
228
+ };
229
+ }
230
+ /**
231
+ * Generate unique context ID for worktree
232
+ */
233
+ generateContextId(path, branch) {
234
+ const repoName = basename(dirname(path));
235
+ const sanitizedBranch = branch.replace(/[^a-zA-Z0-9-]/g, "_");
236
+ return `${repoName}-${sanitizedBranch}-${Buffer.from(path).toString("base64").substring(0, 8)}`;
237
+ }
238
+ /**
239
+ * Save worktree to database
240
+ */
241
+ async saveWorktree(worktree) {
242
+ if (!this.db) return;
243
+ const projectManager = ProjectManager.getInstance();
244
+ const project = await projectManager.detectProject(worktree.path);
245
+ const stmt = this.db.prepare(`
246
+ INSERT OR REPLACE INTO worktrees
247
+ (id, path, branch, commit, is_main, is_bare, is_detached, linked_path, context_id, project_id, updated_at)
248
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
249
+ `);
250
+ stmt.run(
251
+ worktree.contextId,
252
+ worktree.path,
253
+ worktree.branch,
254
+ worktree.commit,
255
+ worktree.isMainWorktree ? 1 : 0,
256
+ worktree.isBare ? 1 : 0,
257
+ worktree.isDetached ? 1 : 0,
258
+ worktree.linkedPath,
259
+ worktree.contextId,
260
+ project.id
261
+ );
262
+ }
263
+ /**
264
+ * Get or create context for worktree
265
+ */
266
+ getWorktreeContext(worktreePath) {
267
+ const cached = this.contextMap.get(worktreePath);
268
+ if (cached) {
269
+ return cached;
270
+ }
271
+ const worktree = this.worktreeCache.get(worktreePath) || this.detectWorktrees(worktreePath).find(
272
+ (w) => w.path === worktreePath
273
+ );
274
+ if (!worktree) {
275
+ throw new Error(`No worktree found at path: ${worktreePath}`);
276
+ }
277
+ const contextBasePath = this.config.isolateContexts ? join(homedir(), ".stackmemory", "worktrees", worktree.contextId) : join(worktreePath, ".stackmemory");
278
+ if (!existsSync(contextBasePath)) {
279
+ mkdirSync(contextBasePath, { recursive: true });
280
+ }
281
+ const context = {
282
+ worktreeId: worktree.contextId,
283
+ projectId: "",
284
+ // Will be filled by project manager
285
+ branch: worktree.branch,
286
+ contextPath: contextBasePath,
287
+ dbPath: join(contextBasePath, "context.db"),
288
+ lastSynced: /* @__PURE__ */ new Date(),
289
+ metadata: {
290
+ isMainWorktree: worktree.isMainWorktree,
291
+ linkedPath: worktree.linkedPath
292
+ }
293
+ };
294
+ if (this.db && this.config.enabled) {
295
+ this.saveContext(context);
296
+ }
297
+ this.contextMap.set(worktreePath, context);
298
+ logger.info("Created worktree context", {
299
+ worktree: worktree.branch,
300
+ path: contextBasePath
301
+ });
302
+ return context;
303
+ }
304
+ /**
305
+ * Save context to database
306
+ */
307
+ saveContext(context) {
308
+ if (!this.db) return;
309
+ const stmt = this.db.prepare(`
310
+ INSERT OR REPLACE INTO worktree_contexts
311
+ (context_id, worktree_id, project_id, branch, context_path, db_path, last_synced, metadata)
312
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
313
+ `);
314
+ stmt.run(
315
+ context.worktreeId,
316
+ context.worktreeId,
317
+ context.projectId,
318
+ context.branch,
319
+ context.contextPath,
320
+ context.dbPath,
321
+ context.lastSynced.toISOString(),
322
+ JSON.stringify(context.metadata)
323
+ );
324
+ }
325
+ /**
326
+ * Sync contexts between worktrees
327
+ */
328
+ async syncContexts(sourceWorktree, targetWorktree, syncType = "merge") {
329
+ const source = this.getWorktreeContext(sourceWorktree);
330
+ const target = this.getWorktreeContext(targetWorktree);
331
+ logger.info("Syncing contexts between worktrees", {
332
+ source: source.branch,
333
+ target: target.branch,
334
+ type: syncType
335
+ });
336
+ const sourceDb = new Database(source.dbPath);
337
+ const targetDb = new Database(target.dbPath);
338
+ try {
339
+ const contexts = sourceDb.prepare(
340
+ `
341
+ SELECT * FROM contexts
342
+ WHERE created_at > datetime('now', '-7 days')
343
+ ORDER BY created_at DESC
344
+ `
345
+ ).all();
346
+ if (syncType === "push" || syncType === "merge") {
347
+ this.mergeContexts(contexts, targetDb, syncType === "merge");
348
+ }
349
+ if (syncType === "pull") {
350
+ const targetContexts = targetDb.prepare(
351
+ `
352
+ SELECT * FROM contexts
353
+ WHERE created_at > datetime('now', '-7 days')
354
+ ORDER BY created_at DESC
355
+ `
356
+ ).all();
357
+ this.mergeContexts(targetContexts, sourceDb, false);
358
+ }
359
+ if (this.db) {
360
+ const stmt = this.db.prepare(`
361
+ INSERT INTO context_sync (source_context, target_context, sync_type, data)
362
+ VALUES (?, ?, ?, ?)
363
+ `);
364
+ stmt.run(
365
+ source.worktreeId,
366
+ target.worktreeId,
367
+ syncType,
368
+ JSON.stringify({ count: contexts.length })
369
+ );
370
+ }
371
+ logger.info("Context sync completed", {
372
+ synced: contexts.length,
373
+ type: syncType
374
+ });
375
+ } finally {
376
+ sourceDb.close();
377
+ targetDb.close();
378
+ }
379
+ }
380
+ /**
381
+ * Merge contexts into target database
382
+ */
383
+ mergeContexts(contexts, targetDb, bidirectional) {
384
+ const stmt = targetDb.prepare(`
385
+ INSERT OR REPLACE INTO contexts (id, type, content, metadata, created_at)
386
+ VALUES (?, ?, ?, ?, ?)
387
+ `);
388
+ for (const ctx of contexts) {
389
+ try {
390
+ stmt.run(ctx.id, ctx.type, ctx.content, ctx.metadata, ctx.created_at);
391
+ } catch (error) {
392
+ logger.warn("Failed to merge context", { id: ctx.id, error });
393
+ }
394
+ }
395
+ }
396
+ /**
397
+ * List all active worktrees
398
+ */
399
+ listActiveWorktrees() {
400
+ if (!this.db) {
401
+ return Array.from(this.worktreeCache.values());
402
+ }
403
+ const stmt = this.db.prepare(`
404
+ SELECT * FROM worktrees
405
+ ORDER BY is_main DESC, branch ASC
406
+ `);
407
+ const rows = stmt.all();
408
+ return rows.map((row) => ({
409
+ path: row.path,
410
+ branch: row.branch,
411
+ commit: row.commit,
412
+ isMainWorktree: row.is_main === 1,
413
+ isBare: row.is_bare === 1,
414
+ isDetached: row.is_detached === 1,
415
+ linkedPath: row.linked_path,
416
+ contextId: row.context_id
417
+ }));
418
+ }
419
+ /**
420
+ * Clean up stale worktree contexts
421
+ */
422
+ cleanupStaleContexts() {
423
+ if (!this.db) return;
424
+ const activeWorktrees = this.detectWorktrees();
425
+ const activePaths = new Set(activeWorktrees.map((w) => w.path));
426
+ const stmt = this.db.prepare("SELECT * FROM worktrees");
427
+ const stored = stmt.all();
428
+ const deleteStmt = this.db.prepare("DELETE FROM worktrees WHERE id = ?");
429
+ const deleteContextStmt = this.db.prepare(
430
+ "DELETE FROM worktree_contexts WHERE worktree_id = ?"
431
+ );
432
+ for (const worktree of stored) {
433
+ if (!activePaths.has(worktree.path)) {
434
+ deleteStmt.run(worktree.id);
435
+ deleteContextStmt.run(worktree.id);
436
+ logger.info("Cleaned up stale worktree context", {
437
+ path: worktree.path,
438
+ branch: worktree.branch
439
+ });
440
+ }
441
+ }
442
+ }
443
+ /**
444
+ * Get configuration
445
+ */
446
+ getConfig() {
447
+ return { ...this.config };
448
+ }
449
+ /**
450
+ * Check if worktree support is enabled
451
+ */
452
+ isEnabled() {
453
+ return this.config.enabled;
454
+ }
455
+ /**
456
+ * Enable or disable worktree support
457
+ */
458
+ setEnabled(enabled) {
459
+ this.saveConfig({ enabled });
460
+ }
461
+ }
462
+ export {
463
+ WorktreeManager
464
+ };
465
+ //# sourceMappingURL=worktree-manager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/worktree/worktree-manager.ts"],
4
+ "sourcesContent": ["/**\n * Git Worktree Manager for StackMemory\n * Manages multiple instances across git worktrees with context isolation\n */\n\nimport { execSync } from 'child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join, basename, dirname, resolve } from 'path';\nimport { homedir } from 'os';\nimport Database from 'better-sqlite3';\nimport { logger } from '../monitoring/logger.js';\nimport { ProjectManager } from '../projects/project-manager.js';\nimport {\n DatabaseError,\n SystemError,\n ErrorCode,\n createErrorHandler,\n} from '../errors/index.js';\nimport { retry } from '../errors/recovery.js';\n\nexport interface WorktreeInfo {\n path: string;\n branch: string;\n commit: string;\n isMainWorktree: boolean;\n isBare: boolean;\n isDetached: boolean;\n linkedPath?: string; // Path to main worktree\n contextId: string; // Unique context identifier\n}\n\nexport interface WorktreeConfig {\n enabled: boolean;\n autoDetect: boolean;\n isolateContexts: boolean;\n shareGlobalContext: boolean;\n syncInterval?: number; // Minutes between syncs\n maxWorktrees?: number;\n}\n\nexport interface WorktreeContext {\n worktreeId: string;\n projectId: string;\n branch: string;\n contextPath: string;\n dbPath: string;\n lastSynced: Date;\n metadata: Record<string, any>;\n}\n\nexport class WorktreeManager {\n private static instance: WorktreeManager;\n private config: WorktreeConfig;\n private configPath: string;\n private worktreeCache: Map<string, WorktreeInfo> = new Map();\n private contextMap: Map<string, WorktreeContext> = new Map();\n private db?: Database.Database;\n\n private constructor() {\n this.configPath = join(homedir(), '.stackmemory', 'worktree-config.json');\n this.config = this.loadConfig();\n\n try {\n if (this.config.enabled) {\n this.initialize();\n }\n } catch (error: unknown) {\n logger.error(\n 'Failed to initialize WorktreeManager',\n error instanceof Error ? error : new Error(String(error)),\n {\n configPath: this.configPath,\n }\n );\n // Don't throw here - allow the manager to be created without worktree support\n this.config.enabled = false;\n }\n }\n\n static getInstance(): WorktreeManager {\n if (!WorktreeManager.instance) {\n WorktreeManager.instance = new WorktreeManager();\n }\n return WorktreeManager.instance;\n }\n\n /**\n * Initialize worktree management\n */\n private initialize(): void {\n const dbPath = join(homedir(), '.stackmemory', 'worktrees.db');\n const errorHandler = createErrorHandler({\n operation: 'initialize',\n dbPath,\n });\n\n try {\n this.db = new Database(dbPath);\n\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS worktrees (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL UNIQUE,\n branch TEXT NOT NULL,\n commit TEXT,\n is_main BOOLEAN,\n is_bare BOOLEAN,\n is_detached BOOLEAN,\n linked_path TEXT,\n context_id TEXT UNIQUE,\n project_id TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n );\n\n CREATE TABLE IF NOT EXISTS worktree_contexts (\n context_id TEXT PRIMARY KEY,\n worktree_id TEXT NOT NULL,\n project_id TEXT,\n branch TEXT,\n context_path TEXT,\n db_path TEXT,\n last_synced DATETIME,\n metadata JSON,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (worktree_id) REFERENCES worktrees(id)\n );\n\n CREATE TABLE IF NOT EXISTS context_sync (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source_context TEXT,\n target_context TEXT,\n sync_type TEXT, -- 'push', 'pull', 'merge'\n data JSON,\n synced_at DATETIME DEFAULT CURRENT_TIMESTAMP\n );\n\n CREATE INDEX IF NOT EXISTS idx_worktrees_project ON worktrees(project_id);\n CREATE INDEX IF NOT EXISTS idx_contexts_worktree ON worktree_contexts(worktree_id);\n `);\n } catch (error: unknown) {\n errorHandler(error);\n }\n }\n\n /**\n * Load configuration\n */\n private loadConfig(): WorktreeConfig {\n if (existsSync(this.configPath)) {\n try {\n return JSON.parse(readFileSync(this.configPath, 'utf-8'));\n } catch (error: unknown) {\n logger.error('Failed to load worktree config', error as Error);\n }\n }\n\n // Default config\n return {\n enabled: false,\n autoDetect: true,\n isolateContexts: true,\n shareGlobalContext: false,\n syncInterval: 15,\n maxWorktrees: 10,\n };\n }\n\n /**\n * Save configuration\n */\n saveConfig(config: Partial<WorktreeConfig>): void {\n this.config = { ...this.config, ...config };\n\n const configDir = dirname(this.configPath);\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n\n // Reinitialize if just enabled\n if (config.enabled && !this.db) {\n this.initialize();\n }\n\n logger.info('Worktree configuration updated', { config: this.config });\n }\n\n /**\n * Detect git worktrees in current repository\n */\n detectWorktrees(repoPath?: string): WorktreeInfo[] {\n const path = repoPath || process.cwd();\n\n try {\n // Get worktree list\n const output = execSync('git worktree list --porcelain', {\n cwd: path,\n encoding: 'utf-8',\n });\n\n const worktrees: WorktreeInfo[] = [];\n const lines = output.split('\\n');\n let currentWorktree: Partial<WorktreeInfo> = {};\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n if (currentWorktree.path) {\n worktrees.push(this.finalizeWorktreeInfo(currentWorktree));\n }\n currentWorktree = { path: line.substring(9) };\n } else if (line.startsWith('HEAD ')) {\n currentWorktree.commit = line.substring(5);\n } else if (line.startsWith('branch ')) {\n currentWorktree.branch = line.substring(7);\n } else if (line === 'bare') {\n currentWorktree.isBare = true;\n } else if (line === 'detached') {\n currentWorktree.isDetached = true;\n }\n }\n\n // Add last worktree\n if (currentWorktree.path) {\n worktrees.push(this.finalizeWorktreeInfo(currentWorktree));\n }\n\n // Determine main worktree\n if (worktrees.length > 0) {\n const mainPath = this.getMainWorktreePath(path);\n worktrees.forEach((wt) => {\n wt.isMainWorktree = wt.path === mainPath;\n if (!wt.isMainWorktree) {\n wt.linkedPath = mainPath;\n }\n });\n }\n\n // Cache results\n worktrees.forEach((wt) => {\n this.worktreeCache.set(wt.path, wt);\n if (this.config.enabled) {\n this.saveWorktree(wt);\n }\n });\n\n logger.info(`Detected ${worktrees.length} worktrees`, {\n count: worktrees.length,\n branches: worktrees.map((w: any) => w.branch).filter(Boolean),\n });\n\n return worktrees;\n } catch (error: unknown) {\n logger.debug('Not a git repository or git worktree not available');\n return [];\n }\n }\n\n /**\n * Get main worktree path\n */\n private getMainWorktreePath(path: string): string {\n try {\n const gitDir = execSync('git rev-parse --git-common-dir', {\n cwd: path,\n encoding: 'utf-8',\n }).trim();\n\n // If it's a worktree, find the main repo\n if (gitDir.includes('/.git/worktrees/')) {\n const mainGitDir = gitDir.replace(/\\/\\.git\\/worktrees\\/.*$/, '');\n return mainGitDir;\n }\n\n // It's the main worktree\n return dirname(gitDir);\n } catch {\n return path;\n }\n }\n\n /**\n * Finalize worktree info with defaults\n */\n private finalizeWorktreeInfo(partial: Partial<WorktreeInfo>): WorktreeInfo {\n return {\n path: partial.path || '',\n branch: partial.branch || 'detached',\n commit: partial.commit || '',\n isMainWorktree: partial.isMainWorktree || false,\n isBare: partial.isBare || false,\n isDetached: partial.isDetached || false,\n linkedPath: partial.linkedPath,\n contextId: this.generateContextId(\n partial.path || '',\n partial.branch || ''\n ),\n };\n }\n\n /**\n * Generate unique context ID for worktree\n */\n private generateContextId(path: string, branch: string): string {\n const repoName = basename(dirname(path));\n const sanitizedBranch = branch.replace(/[^a-zA-Z0-9-]/g, '_');\n return `${repoName}-${sanitizedBranch}-${Buffer.from(path).toString('base64').substring(0, 8)}`;\n }\n\n /**\n * Save worktree to database\n */\n private async saveWorktree(worktree: WorktreeInfo): Promise<void> {\n if (!this.db) return;\n\n const projectManager = ProjectManager.getInstance();\n const project = await projectManager.detectProject(worktree.path);\n\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO worktrees \n (id, path, branch, commit, is_main, is_bare, is_detached, linked_path, context_id, project_id, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)\n `);\n\n stmt.run(\n worktree.contextId,\n worktree.path,\n worktree.branch,\n worktree.commit,\n worktree.isMainWorktree ? 1 : 0,\n worktree.isBare ? 1 : 0,\n worktree.isDetached ? 1 : 0,\n worktree.linkedPath,\n worktree.contextId,\n project.id\n );\n }\n\n /**\n * Get or create context for worktree\n */\n getWorktreeContext(worktreePath: string): WorktreeContext {\n // Check cache\n const cached = this.contextMap.get(worktreePath);\n if (cached) {\n return cached;\n }\n\n const worktree =\n this.worktreeCache.get(worktreePath) ||\n this.detectWorktrees(worktreePath).find(\n (w: any) => w.path === worktreePath\n );\n\n if (!worktree) {\n throw new Error(`No worktree found at path: ${worktreePath}`);\n }\n\n // Create isolated context path\n const contextBasePath = this.config.isolateContexts\n ? join(homedir(), '.stackmemory', 'worktrees', worktree.contextId)\n : join(worktreePath, '.stackmemory');\n\n // Ensure directory exists\n if (!existsSync(contextBasePath)) {\n mkdirSync(contextBasePath, { recursive: true });\n }\n\n const context: WorktreeContext = {\n worktreeId: worktree.contextId,\n projectId: '', // Will be filled by project manager\n branch: worktree.branch,\n contextPath: contextBasePath,\n dbPath: join(contextBasePath, 'context.db'),\n lastSynced: new Date(),\n metadata: {\n isMainWorktree: worktree.isMainWorktree,\n linkedPath: worktree.linkedPath,\n },\n };\n\n // Save to database\n if (this.db && this.config.enabled) {\n this.saveContext(context);\n }\n\n // Cache it\n this.contextMap.set(worktreePath, context);\n\n logger.info('Created worktree context', {\n worktree: worktree.branch,\n path: contextBasePath,\n });\n\n return context;\n }\n\n /**\n * Save context to database\n */\n private saveContext(context: WorktreeContext): void {\n if (!this.db) return;\n\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO worktree_contexts\n (context_id, worktree_id, project_id, branch, context_path, db_path, last_synced, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n context.worktreeId,\n context.worktreeId,\n context.projectId,\n context.branch,\n context.contextPath,\n context.dbPath,\n context.lastSynced.toISOString(),\n JSON.stringify(context.metadata)\n );\n }\n\n /**\n * Sync contexts between worktrees\n */\n async syncContexts(\n sourceWorktree: string,\n targetWorktree: string,\n syncType: 'push' | 'pull' | 'merge' = 'merge'\n ): Promise<void> {\n const source = this.getWorktreeContext(sourceWorktree);\n const target = this.getWorktreeContext(targetWorktree);\n\n logger.info('Syncing contexts between worktrees', {\n source: source.branch,\n target: target.branch,\n type: syncType,\n });\n\n // Open both databases\n const sourceDb = new Database(source.dbPath);\n const targetDb = new Database(target.dbPath);\n\n try {\n // Get contexts from source\n const contexts = sourceDb\n .prepare(\n `\n SELECT * FROM contexts \n WHERE created_at > datetime('now', '-7 days')\n ORDER BY created_at DESC\n `\n )\n .all();\n\n // Sync based on type\n if (syncType === 'push' || syncType === 'merge') {\n this.mergeContexts(contexts, targetDb, syncType === 'merge');\n }\n\n if (syncType === 'pull') {\n const targetContexts = targetDb\n .prepare(\n `\n SELECT * FROM contexts \n WHERE created_at > datetime('now', '-7 days')\n ORDER BY created_at DESC\n `\n )\n .all();\n\n this.mergeContexts(targetContexts, sourceDb, false);\n }\n\n // Log sync operation\n if (this.db) {\n const stmt = this.db.prepare(`\n INSERT INTO context_sync (source_context, target_context, sync_type, data)\n VALUES (?, ?, ?, ?)\n `);\n\n stmt.run(\n source.worktreeId,\n target.worktreeId,\n syncType,\n JSON.stringify({ count: contexts.length })\n );\n }\n\n logger.info('Context sync completed', {\n synced: contexts.length,\n type: syncType,\n });\n } finally {\n sourceDb.close();\n targetDb.close();\n }\n }\n\n /**\n * Merge contexts into target database\n */\n private mergeContexts(\n contexts: any[],\n targetDb: Database.Database,\n bidirectional: boolean\n ): void {\n const stmt = targetDb.prepare(`\n INSERT OR REPLACE INTO contexts (id, type, content, metadata, created_at)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n for (const ctx of contexts) {\n try {\n stmt.run(ctx.id, ctx.type, ctx.content, ctx.metadata, ctx.created_at);\n } catch (error: unknown) {\n logger.warn('Failed to merge context', { id: ctx.id, error });\n }\n }\n }\n\n /**\n * List all active worktrees\n */\n listActiveWorktrees(): WorktreeInfo[] {\n if (!this.db) {\n return Array.from(this.worktreeCache.values());\n }\n\n const stmt = this.db.prepare(`\n SELECT * FROM worktrees\n ORDER BY is_main DESC, branch ASC\n `);\n\n const rows = stmt.all() as any[];\n\n return rows.map((row: any) => ({\n path: row.path,\n branch: row.branch,\n commit: row.commit,\n isMainWorktree: row.is_main === 1,\n isBare: row.is_bare === 1,\n isDetached: row.is_detached === 1,\n linkedPath: row.linked_path,\n contextId: row.context_id,\n }));\n }\n\n /**\n * Clean up stale worktree contexts\n */\n cleanupStaleContexts(): void {\n if (!this.db) return;\n\n const activeWorktrees = this.detectWorktrees();\n const activePaths = new Set(activeWorktrees.map((w: any) => w.path));\n\n // Get all stored worktrees\n const stmt = this.db.prepare('SELECT * FROM worktrees');\n const stored = stmt.all() as any[];\n\n // Remove stale entries\n const deleteStmt = this.db.prepare('DELETE FROM worktrees WHERE id = ?');\n const deleteContextStmt = this.db.prepare(\n 'DELETE FROM worktree_contexts WHERE worktree_id = ?'\n );\n\n for (const worktree of stored) {\n if (!activePaths.has(worktree.path)) {\n deleteStmt.run(worktree.id);\n deleteContextStmt.run(worktree.id);\n\n logger.info('Cleaned up stale worktree context', {\n path: worktree.path,\n branch: worktree.branch,\n });\n }\n }\n }\n\n /**\n * Get configuration\n */\n getConfig(): WorktreeConfig {\n return { ...this.config };\n }\n\n /**\n * Check if worktree support is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n /**\n * Enable or disable worktree support\n */\n setEnabled(enabled: boolean): void {\n this.saveConfig({ enabled });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,149 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
6
+ import { join } from "path";
7
+ import { homedir } from "os";
8
+ const DEFAULT_DAEMON_CONFIG = {
9
+ version: "1.0.0",
10
+ context: {
11
+ enabled: true,
12
+ interval: 15,
13
+ // 15 minutes
14
+ checkpointMessage: "Auto-checkpoint"
15
+ },
16
+ linear: {
17
+ enabled: false,
18
+ // Disabled by default, requires setup
19
+ interval: 60,
20
+ // 60 minutes
21
+ quietHours: { start: 22, end: 7 },
22
+ retryAttempts: 3,
23
+ retryDelay: 3e4
24
+ },
25
+ fileWatch: {
26
+ enabled: false,
27
+ // Disabled by default
28
+ interval: 0,
29
+ // Not interval-based
30
+ paths: ["."],
31
+ extensions: [".ts", ".js", ".tsx", ".jsx", ".py", ".go", ".rs"],
32
+ ignore: ["node_modules", ".git", "dist", "build", ".stackmemory"],
33
+ debounceMs: 2e3
34
+ },
35
+ heartbeatInterval: 60,
36
+ // 1 minute
37
+ inactivityTimeout: 0,
38
+ // Disabled by default
39
+ logLevel: "info"
40
+ };
41
+ function getDaemonDir() {
42
+ const dir = join(homedir(), ".stackmemory", "daemon");
43
+ if (!existsSync(dir)) {
44
+ mkdirSync(dir, { recursive: true });
45
+ }
46
+ return dir;
47
+ }
48
+ function getLogsDir() {
49
+ const dir = join(homedir(), ".stackmemory", "logs");
50
+ if (!existsSync(dir)) {
51
+ mkdirSync(dir, { recursive: true });
52
+ }
53
+ return dir;
54
+ }
55
+ function getDaemonPaths() {
56
+ const daemonDir = getDaemonDir();
57
+ const logsDir = getLogsDir();
58
+ return {
59
+ pidFile: join(daemonDir, "daemon.pid"),
60
+ statusFile: join(daemonDir, "daemon.status"),
61
+ configFile: join(daemonDir, "config.json"),
62
+ logFile: join(logsDir, "daemon.log")
63
+ };
64
+ }
65
+ function loadDaemonConfig() {
66
+ const { configFile } = getDaemonPaths();
67
+ if (!existsSync(configFile)) {
68
+ return { ...DEFAULT_DAEMON_CONFIG };
69
+ }
70
+ try {
71
+ const content = readFileSync(configFile, "utf8");
72
+ const config = JSON.parse(content);
73
+ return {
74
+ ...DEFAULT_DAEMON_CONFIG,
75
+ ...config,
76
+ context: { ...DEFAULT_DAEMON_CONFIG.context, ...config.context },
77
+ linear: { ...DEFAULT_DAEMON_CONFIG.linear, ...config.linear },
78
+ fileWatch: { ...DEFAULT_DAEMON_CONFIG.fileWatch, ...config.fileWatch }
79
+ };
80
+ } catch {
81
+ return { ...DEFAULT_DAEMON_CONFIG };
82
+ }
83
+ }
84
+ function saveDaemonConfig(config) {
85
+ const { configFile } = getDaemonPaths();
86
+ const currentConfig = loadDaemonConfig();
87
+ const newConfig = {
88
+ ...currentConfig,
89
+ ...config,
90
+ context: { ...currentConfig.context, ...config.context },
91
+ linear: { ...currentConfig.linear, ...config.linear },
92
+ fileWatch: { ...currentConfig.fileWatch, ...config.fileWatch }
93
+ };
94
+ writeFileSync(configFile, JSON.stringify(newConfig, null, 2));
95
+ }
96
+ function readDaemonStatus() {
97
+ const { statusFile, pidFile } = getDaemonPaths();
98
+ const defaultStatus = {
99
+ running: false,
100
+ services: {
101
+ context: { enabled: false },
102
+ linear: { enabled: false },
103
+ fileWatch: { enabled: false }
104
+ },
105
+ errors: []
106
+ };
107
+ if (!existsSync(pidFile)) {
108
+ return defaultStatus;
109
+ }
110
+ try {
111
+ const pidContent = readFileSync(pidFile, "utf8").trim();
112
+ const pid = parseInt(pidContent, 10);
113
+ try {
114
+ process.kill(pid, 0);
115
+ } catch {
116
+ return defaultStatus;
117
+ }
118
+ if (!existsSync(statusFile)) {
119
+ return { ...defaultStatus, running: true, pid };
120
+ }
121
+ const content = readFileSync(statusFile, "utf8");
122
+ const status = JSON.parse(content);
123
+ return {
124
+ ...status,
125
+ running: true,
126
+ pid,
127
+ uptime: status.startTime ? Date.now() - status.startTime : void 0
128
+ };
129
+ } catch {
130
+ return defaultStatus;
131
+ }
132
+ }
133
+ function writeDaemonStatus(status) {
134
+ const { statusFile } = getDaemonPaths();
135
+ const currentStatus = readDaemonStatus();
136
+ const newStatus = { ...currentStatus, ...status };
137
+ writeFileSync(statusFile, JSON.stringify(newStatus, null, 2));
138
+ }
139
+ export {
140
+ DEFAULT_DAEMON_CONFIG,
141
+ getDaemonDir,
142
+ getDaemonPaths,
143
+ getLogsDir,
144
+ loadDaemonConfig,
145
+ readDaemonStatus,
146
+ saveDaemonConfig,
147
+ writeDaemonStatus
148
+ };
149
+ //# sourceMappingURL=daemon-config.js.map