@stackmemoryai/stackmemory 0.5.58 → 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 (596) hide show
  1. package/dist/cli/commands/search.js +20 -3
  2. package/dist/cli/commands/search.js.map +2 -2
  3. package/dist/core/database/sqlite-adapter.js +13 -3
  4. package/dist/core/database/sqlite-adapter.js.map +2 -2
  5. package/dist/core/errors/error-utils.js +208 -0
  6. package/dist/core/errors/error-utils.js.map +7 -0
  7. package/dist/core/errors/index.js +13 -4
  8. package/dist/core/errors/index.js.map +2 -2
  9. package/dist/core/merge/unified-merge-resolver.js +303 -0
  10. package/dist/core/merge/unified-merge-resolver.js.map +7 -0
  11. package/dist/core/monitoring/logger.js +61 -9
  12. package/dist/core/monitoring/logger.js.map +2 -2
  13. package/dist/core/security/index.js +35 -0
  14. package/dist/core/security/index.js.map +7 -0
  15. package/dist/core/security/input-sanitizer.js +321 -0
  16. package/dist/core/security/input-sanitizer.js.map +7 -0
  17. package/dist/integrations/linear/client.js +5 -1
  18. package/dist/integrations/linear/client.js.map +2 -2
  19. package/dist/integrations/mcp/remote-server.js +27 -36
  20. package/dist/integrations/mcp/remote-server.js.map +2 -2
  21. package/dist/integrations/mcp/server.js +44 -29
  22. package/dist/integrations/mcp/server.js.map +3 -3
  23. package/dist/scripts/benchmark-performance.js +48 -0
  24. package/dist/scripts/benchmark-performance.js.map +7 -0
  25. package/dist/scripts/check-redis.js +42 -0
  26. package/dist/scripts/check-redis.js.map +7 -0
  27. package/dist/scripts/initialize.js +116 -0
  28. package/dist/scripts/initialize.js.map +7 -0
  29. package/dist/scripts/list-linear-tasks.js +124 -0
  30. package/dist/scripts/list-linear-tasks.js.map +7 -0
  31. package/dist/scripts/measure-handoff-impact.js +340 -0
  32. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  33. package/dist/scripts/query-chromadb.js +160 -0
  34. package/dist/scripts/query-chromadb.js.map +7 -0
  35. package/dist/scripts/show-linear-summary.js +119 -0
  36. package/dist/scripts/show-linear-summary.js.map +7 -0
  37. package/dist/scripts/simple-swarm-demo.js +90 -0
  38. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  39. package/dist/scripts/status.js +155 -0
  40. package/dist/scripts/status.js.map +7 -0
  41. package/dist/scripts/test-chromadb-sync.js +192 -0
  42. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  43. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  44. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  45. package/dist/scripts/test-ralph-iterations.js +121 -0
  46. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  47. package/dist/scripts/test-redis-storage.js +389 -0
  48. package/dist/scripts/test-redis-storage.js.map +7 -0
  49. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  50. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  51. package/dist/scripts/test-swarm-fixes.js +125 -0
  52. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  53. package/dist/scripts/test-swarm-tui.js +23 -0
  54. package/dist/scripts/test-swarm-tui.js.map +7 -0
  55. package/dist/scripts/test-tui-shortcuts.js +52 -0
  56. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  57. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  58. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  59. package/dist/src/agents/core/agent-task-manager.js +527 -0
  60. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  61. package/dist/src/agents/verifiers/base-verifier.js +133 -0
  62. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  63. package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
  64. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  65. package/dist/src/agents/verifiers/llm-judge.js +252 -0
  66. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  67. package/dist/src/cli/auto-detect.js +321 -0
  68. package/dist/src/cli/auto-detect.js.map +7 -0
  69. package/dist/src/cli/claude-sm-danger.js +21 -0
  70. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  71. package/dist/src/cli/claude-sm.js +1156 -0
  72. package/dist/src/cli/claude-sm.js.map +7 -0
  73. package/dist/src/cli/codex-sm-danger.js +21 -0
  74. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  75. package/dist/src/cli/codex-sm.js +349 -0
  76. package/dist/src/cli/codex-sm.js.map +7 -0
  77. package/dist/src/cli/commands/api.js +232 -0
  78. package/dist/src/cli/commands/api.js.map +7 -0
  79. package/dist/src/cli/commands/auto-background.js +180 -0
  80. package/dist/src/cli/commands/auto-background.js.map +7 -0
  81. package/dist/src/cli/commands/cleanup-processes.js +68 -0
  82. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  83. package/dist/src/cli/commands/clear.js +202 -0
  84. package/dist/src/cli/commands/clear.js.map +7 -0
  85. package/dist/src/cli/commands/config.js +445 -0
  86. package/dist/src/cli/commands/config.js.map +7 -0
  87. package/dist/src/cli/commands/context-rehydrate.js +751 -0
  88. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  89. package/dist/src/cli/commands/context.js +343 -0
  90. package/dist/src/cli/commands/context.js.map +7 -0
  91. package/dist/src/cli/commands/daemon.js +392 -0
  92. package/dist/src/cli/commands/daemon.js.map +7 -0
  93. package/dist/src/cli/commands/dashboard.js +210 -0
  94. package/dist/src/cli/commands/dashboard.js.map +7 -0
  95. package/dist/src/cli/commands/db.js +147 -0
  96. package/dist/src/cli/commands/db.js.map +7 -0
  97. package/dist/src/cli/commands/decision.js +266 -0
  98. package/dist/src/cli/commands/decision.js.map +7 -0
  99. package/dist/src/cli/commands/discovery.js +279 -0
  100. package/dist/src/cli/commands/discovery.js.map +7 -0
  101. package/dist/src/cli/commands/handoff.js +624 -0
  102. package/dist/src/cli/commands/handoff.js.map +7 -0
  103. package/dist/src/cli/commands/hooks.js +298 -0
  104. package/dist/src/cli/commands/hooks.js.map +7 -0
  105. package/dist/src/cli/commands/linear.js +529 -0
  106. package/dist/src/cli/commands/linear.js.map +7 -0
  107. package/dist/src/cli/commands/log.js +169 -0
  108. package/dist/src/cli/commands/log.js.map +7 -0
  109. package/dist/src/cli/commands/login.js +172 -0
  110. package/dist/src/cli/commands/login.js.map +7 -0
  111. package/dist/src/cli/commands/migrate.js +240 -0
  112. package/dist/src/cli/commands/migrate.js.map +7 -0
  113. package/dist/src/cli/commands/model.js +533 -0
  114. package/dist/src/cli/commands/model.js.map +7 -0
  115. package/dist/src/cli/commands/onboard.js +536 -0
  116. package/dist/src/cli/commands/onboard.js.map +7 -0
  117. package/dist/src/cli/commands/projects.js +199 -0
  118. package/dist/src/cli/commands/projects.js.map +7 -0
  119. package/dist/src/cli/commands/ralph.js +909 -0
  120. package/dist/src/cli/commands/ralph.js.map +7 -0
  121. package/dist/src/cli/commands/retrieval.js +248 -0
  122. package/dist/src/cli/commands/retrieval.js.map +7 -0
  123. package/dist/src/cli/commands/search.js +173 -0
  124. package/dist/src/cli/commands/search.js.map +7 -0
  125. package/dist/src/cli/commands/service.js +749 -0
  126. package/dist/src/cli/commands/service.js.map +7 -0
  127. package/dist/src/cli/commands/session.js +200 -0
  128. package/dist/src/cli/commands/session.js.map +7 -0
  129. package/dist/src/cli/commands/settings.js +306 -0
  130. package/dist/src/cli/commands/settings.js.map +7 -0
  131. package/dist/src/cli/commands/setup.js +701 -0
  132. package/dist/src/cli/commands/setup.js.map +7 -0
  133. package/dist/src/cli/commands/shell.js +249 -0
  134. package/dist/src/cli/commands/shell.js.map +7 -0
  135. package/dist/src/cli/commands/signup.js +50 -0
  136. package/dist/src/cli/commands/signup.js.map +7 -0
  137. package/dist/src/cli/commands/skills.js +470 -0
  138. package/dist/src/cli/commands/skills.js.map +7 -0
  139. package/dist/src/cli/commands/sms-notify.js +795 -0
  140. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  141. package/dist/src/cli/commands/storage-tier.js +183 -0
  142. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  143. package/dist/src/cli/commands/sweep.js +249 -0
  144. package/dist/src/cli/commands/sweep.js.map +7 -0
  145. package/dist/src/cli/commands/tasks.js +213 -0
  146. package/dist/src/cli/commands/tasks.js.map +7 -0
  147. package/dist/src/cli/commands/worktree.js +319 -0
  148. package/dist/src/cli/commands/worktree.js.map +7 -0
  149. package/dist/src/cli/index.js +594 -0
  150. package/dist/src/cli/index.js.map +7 -0
  151. package/dist/src/cli/opencode-sm.js +448 -0
  152. package/dist/src/cli/opencode-sm.js.map +7 -0
  153. package/dist/src/cli/utils/viewer.js +96 -0
  154. package/dist/src/cli/utils/viewer.js.map +7 -0
  155. package/dist/src/core/config/config-manager.js +398 -0
  156. package/dist/src/core/config/config-manager.js.map +7 -0
  157. package/dist/src/core/config/feature-flags.js +76 -0
  158. package/dist/src/core/config/feature-flags.js.map +7 -0
  159. package/dist/src/core/config/storage-config.js +115 -0
  160. package/dist/src/core/config/storage-config.js.map +7 -0
  161. package/dist/src/core/config/types.js +144 -0
  162. package/dist/src/core/config/types.js.map +7 -0
  163. package/dist/src/core/context/auto-context.js +80 -0
  164. package/dist/src/core/context/auto-context.js.map +7 -0
  165. package/dist/src/core/context/dual-stack-manager.js +870 -0
  166. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  167. package/dist/src/core/context/enhanced-rehydration.js +994 -0
  168. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  169. package/dist/src/core/context/frame-database.js +479 -0
  170. package/dist/src/core/context/frame-database.js.map +7 -0
  171. package/dist/src/core/context/frame-digest.js +250 -0
  172. package/dist/src/core/context/frame-digest.js.map +7 -0
  173. package/dist/src/core/context/frame-handoff-manager.js +778 -0
  174. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  175. package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
  176. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  177. package/dist/src/core/context/frame-recovery.js +302 -0
  178. package/dist/src/core/context/frame-recovery.js.map +7 -0
  179. package/dist/src/core/context/frame-stack.js +314 -0
  180. package/dist/src/core/context/frame-stack.js.map +7 -0
  181. package/dist/src/core/context/frame-types.js +5 -0
  182. package/dist/src/core/context/frame-types.js.map +7 -0
  183. package/dist/src/core/context/index.js +25 -0
  184. package/dist/src/core/context/index.js.map +7 -0
  185. package/dist/src/core/context/permission-manager.js +185 -0
  186. package/dist/src/core/context/permission-manager.js.map +7 -0
  187. package/dist/src/core/context/recursive-context-manager.js +592 -0
  188. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  189. package/dist/src/core/context/refactored-frame-manager.js +754 -0
  190. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  191. package/dist/src/core/context/shared-context-layer.js +621 -0
  192. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  193. package/dist/src/core/context/stack-merge-resolver.js +749 -0
  194. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  195. package/dist/src/core/context/validation.js +130 -0
  196. package/dist/src/core/context/validation.js.map +7 -0
  197. package/dist/src/core/database/batch-operations.js +384 -0
  198. package/dist/src/core/database/batch-operations.js.map +7 -0
  199. package/dist/src/core/database/connection-pool.js +330 -0
  200. package/dist/src/core/database/connection-pool.js.map +7 -0
  201. package/dist/src/core/database/database-adapter.js +60 -0
  202. package/dist/src/core/database/database-adapter.js.map +7 -0
  203. package/dist/src/core/database/migration-manager.js +614 -0
  204. package/dist/src/core/database/migration-manager.js.map +7 -0
  205. package/dist/src/core/database/query-cache.js +298 -0
  206. package/dist/src/core/database/query-cache.js.map +7 -0
  207. package/dist/src/core/database/query-router.js +430 -0
  208. package/dist/src/core/database/query-router.js.map +7 -0
  209. package/dist/src/core/database/sqlite-adapter.js +738 -0
  210. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  211. package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
  212. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  213. package/dist/src/core/digest/frame-digest-integration.js +176 -0
  214. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  215. package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
  216. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  217. package/dist/src/core/digest/index.js +9 -0
  218. package/dist/src/core/digest/index.js.map +7 -0
  219. package/dist/src/core/digest/types.js +25 -0
  220. package/dist/src/core/digest/types.js.map +7 -0
  221. package/dist/src/core/errors/error-utils.js +208 -0
  222. package/dist/src/core/errors/error-utils.js.map +7 -0
  223. package/dist/src/core/errors/index.js +521 -0
  224. package/dist/src/core/errors/index.js.map +7 -0
  225. package/dist/src/core/errors/recovery.js +269 -0
  226. package/dist/src/core/errors/recovery.js.map +7 -0
  227. package/dist/src/core/execution/parallel-executor.js +258 -0
  228. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  229. package/dist/src/core/frame/workflow-templates.js +319 -0
  230. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  231. package/dist/src/core/merge/conflict-detector.js +431 -0
  232. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  233. package/dist/src/core/merge/index.js +9 -0
  234. package/dist/src/core/merge/index.js.map +7 -0
  235. package/dist/src/core/merge/resolution-engine.js +558 -0
  236. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  237. package/dist/src/core/merge/stack-diff.js +532 -0
  238. package/dist/src/core/merge/stack-diff.js.map +7 -0
  239. package/dist/src/core/merge/types.js +5 -0
  240. package/dist/src/core/merge/types.js.map +7 -0
  241. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  242. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  243. package/dist/src/core/models/fallback-monitor.js +232 -0
  244. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  245. package/dist/src/core/models/model-router.js +340 -0
  246. package/dist/src/core/models/model-router.js.map +7 -0
  247. package/dist/src/core/monitoring/error-handler.js +49 -0
  248. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  249. package/dist/src/core/monitoring/logger.js +202 -0
  250. package/dist/src/core/monitoring/logger.js.map +7 -0
  251. package/dist/src/core/monitoring/metrics.js +172 -0
  252. package/dist/src/core/monitoring/metrics.js.map +7 -0
  253. package/dist/src/core/monitoring/progress-tracker.js +189 -0
  254. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  255. package/dist/src/core/monitoring/session-monitor.js +300 -0
  256. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  257. package/dist/src/core/performance/context-cache.js +273 -0
  258. package/dist/src/core/performance/context-cache.js.map +7 -0
  259. package/dist/src/core/performance/index.js +11 -0
  260. package/dist/src/core/performance/index.js.map +7 -0
  261. package/dist/src/core/performance/lazy-context-loader.js +327 -0
  262. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  263. package/dist/src/core/performance/monitor.js +221 -0
  264. package/dist/src/core/performance/monitor.js.map +7 -0
  265. package/dist/src/core/performance/optimized-frame-context.js +345 -0
  266. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  267. package/dist/src/core/performance/performance-benchmark.js +277 -0
  268. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  269. package/dist/src/core/performance/performance-profiler.js +370 -0
  270. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  271. package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
  272. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  273. package/dist/src/core/persistence/postgres-adapter.js +349 -0
  274. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  275. package/dist/src/core/projects/project-isolation.js +201 -0
  276. package/dist/src/core/projects/project-isolation.js.map +7 -0
  277. package/dist/src/core/projects/project-manager.js +697 -0
  278. package/dist/src/core/projects/project-manager.js.map +7 -0
  279. package/dist/src/core/query/query-parser.js +370 -0
  280. package/dist/src/core/query/query-parser.js.map +7 -0
  281. package/dist/src/core/query/query-templates.js +321 -0
  282. package/dist/src/core/query/query-templates.js.map +7 -0
  283. package/dist/src/core/retrieval/context-retriever.js +479 -0
  284. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  285. package/dist/src/core/retrieval/index.js +8 -0
  286. package/dist/src/core/retrieval/index.js.map +7 -0
  287. package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
  288. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  289. package/dist/src/core/retrieval/llm-provider.js +151 -0
  290. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  291. package/dist/src/core/retrieval/retrieval-audit.js +236 -0
  292. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  293. package/dist/src/core/retrieval/summary-generator.js +589 -0
  294. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  295. package/dist/src/core/retrieval/types.js +21 -0
  296. package/dist/src/core/retrieval/types.js.map +7 -0
  297. package/dist/src/core/security/index.js +35 -0
  298. package/dist/src/core/security/index.js.map +7 -0
  299. package/dist/src/core/security/input-sanitizer.js +321 -0
  300. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  301. package/dist/src/core/session/clear-survival.js +465 -0
  302. package/dist/src/core/session/clear-survival.js.map +7 -0
  303. package/dist/src/core/session/enhanced-handoff.js +792 -0
  304. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  305. package/dist/src/core/session/handoff-generator.js +343 -0
  306. package/dist/src/core/session/handoff-generator.js.map +7 -0
  307. package/dist/src/core/session/index.js +15 -0
  308. package/dist/src/core/session/index.js.map +7 -0
  309. package/dist/src/core/session/session-manager.js +347 -0
  310. package/dist/src/core/session/session-manager.js.map +7 -0
  311. package/dist/src/core/skills/index.js +7 -0
  312. package/dist/src/core/skills/index.js.map +7 -0
  313. package/dist/src/core/skills/skill-storage.js +764 -0
  314. package/dist/src/core/skills/skill-storage.js.map +7 -0
  315. package/dist/src/core/skills/types.js +193 -0
  316. package/dist/src/core/skills/types.js.map +7 -0
  317. package/dist/src/core/storage/chromadb-adapter.js +354 -0
  318. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  319. package/dist/src/core/storage/infinite-storage.js +510 -0
  320. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  321. package/dist/src/core/storage/remote-storage.js +489 -0
  322. package/dist/src/core/storage/remote-storage.js.map +7 -0
  323. package/dist/src/core/storage/two-tier-storage.js +766 -0
  324. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  325. package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
  326. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  327. package/dist/src/core/trace/db-trace-wrapper.js +247 -0
  328. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  329. package/dist/src/core/trace/debug-trace.js +417 -0
  330. package/dist/src/core/trace/debug-trace.js.map +7 -0
  331. package/dist/src/core/trace/index.js +109 -0
  332. package/dist/src/core/trace/index.js.map +7 -0
  333. package/dist/src/core/trace/linear-api-wrapper.js +178 -0
  334. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  335. package/dist/src/core/trace/trace-detector.js +528 -0
  336. package/dist/src/core/trace/trace-detector.js.map +7 -0
  337. package/dist/src/core/trace/trace-store.js +345 -0
  338. package/dist/src/core/trace/trace-store.js.map +7 -0
  339. package/dist/src/core/trace/types.js +77 -0
  340. package/dist/src/core/trace/types.js.map +7 -0
  341. package/dist/src/core/types.js +5 -0
  342. package/dist/src/core/types.js.map +7 -0
  343. package/dist/src/core/utils/async-mutex.js +114 -0
  344. package/dist/src/core/utils/async-mutex.js.map +7 -0
  345. package/dist/src/core/utils/compression.js +83 -0
  346. package/dist/src/core/utils/compression.js.map +7 -0
  347. package/dist/src/core/utils/update-checker.js +218 -0
  348. package/dist/src/core/utils/update-checker.js.map +7 -0
  349. package/dist/src/core/worktree/worktree-manager.js +465 -0
  350. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  351. package/dist/src/daemon/daemon-config.js +149 -0
  352. package/dist/src/daemon/daemon-config.js.map +7 -0
  353. package/dist/src/daemon/services/context-service.js +122 -0
  354. package/dist/src/daemon/services/context-service.js.map +7 -0
  355. package/dist/src/daemon/services/linear-service.js +136 -0
  356. package/dist/src/daemon/services/linear-service.js.map +7 -0
  357. package/dist/src/daemon/session-daemon.js +312 -0
  358. package/dist/src/daemon/session-daemon.js.map +7 -0
  359. package/dist/src/daemon/unified-daemon.js +276 -0
  360. package/dist/src/daemon/unified-daemon.js.map +7 -0
  361. package/dist/src/features/analytics/api/analytics-api.js +287 -0
  362. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  363. package/dist/src/features/analytics/core/analytics-service.js +282 -0
  364. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  365. package/dist/src/features/analytics/index.js +18 -0
  366. package/dist/src/features/analytics/index.js.map +7 -0
  367. package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
  368. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  369. package/dist/src/features/analytics/types/metrics.js +5 -0
  370. package/dist/src/features/analytics/types/metrics.js.map +7 -0
  371. package/dist/src/features/browser/browser-mcp.js +492 -0
  372. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  373. package/dist/src/features/sweep/index.js +20 -0
  374. package/dist/src/features/sweep/index.js.map +7 -0
  375. package/dist/src/features/sweep/prediction-client.js +155 -0
  376. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  377. package/dist/src/features/sweep/prompt-builder.js +85 -0
  378. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  379. package/dist/src/features/sweep/pty-wrapper.js +171 -0
  380. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  381. package/dist/src/features/sweep/state-watcher.js +87 -0
  382. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  383. package/dist/src/features/sweep/status-bar.js +88 -0
  384. package/dist/src/features/sweep/status-bar.js.map +7 -0
  385. package/dist/src/features/sweep/sweep-server-manager.js +226 -0
  386. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  387. package/dist/src/features/sweep/tab-interceptor.js +38 -0
  388. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  389. package/dist/src/features/sweep/types.js +18 -0
  390. package/dist/src/features/sweep/types.js.map +7 -0
  391. package/dist/src/features/tasks/linear-task-manager.js +487 -0
  392. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  393. package/dist/src/features/tasks/task-aware-context.js +410 -0
  394. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  395. package/dist/src/features/tui/simple-monitor.js +116 -0
  396. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  397. package/dist/src/features/tui/swarm-monitor.js +648 -0
  398. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  399. package/dist/src/features/web/client/stores/task-store.js +26 -0
  400. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  401. package/dist/src/features/web/server/index.js +194 -0
  402. package/dist/src/features/web/server/index.js.map +7 -0
  403. package/dist/src/hooks/auto-background.js +151 -0
  404. package/dist/src/hooks/auto-background.js.map +7 -0
  405. package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
  406. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  407. package/dist/src/hooks/config.js +150 -0
  408. package/dist/src/hooks/config.js.map +7 -0
  409. package/dist/src/hooks/daemon.js +364 -0
  410. package/dist/src/hooks/daemon.js.map +7 -0
  411. package/dist/src/hooks/events.js +58 -0
  412. package/dist/src/hooks/events.js.map +7 -0
  413. package/dist/src/hooks/index.js +12 -0
  414. package/dist/src/hooks/index.js.map +7 -0
  415. package/dist/src/hooks/linear-task-picker.js +186 -0
  416. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  417. package/dist/src/hooks/schemas.js +197 -0
  418. package/dist/src/hooks/schemas.js.map +7 -0
  419. package/dist/src/hooks/secure-fs.js +49 -0
  420. package/dist/src/hooks/secure-fs.js.map +7 -0
  421. package/dist/src/hooks/security-logger.js +155 -0
  422. package/dist/src/hooks/security-logger.js.map +7 -0
  423. package/dist/src/hooks/session-summary.js +222 -0
  424. package/dist/src/hooks/session-summary.js.map +7 -0
  425. package/dist/src/hooks/sms-action-runner.js +371 -0
  426. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  427. package/dist/src/hooks/sms-notify.js +506 -0
  428. package/dist/src/hooks/sms-notify.js.map +7 -0
  429. package/dist/src/hooks/sms-watcher.js +93 -0
  430. package/dist/src/hooks/sms-watcher.js.map +7 -0
  431. package/dist/src/hooks/sms-webhook.js +555 -0
  432. package/dist/src/hooks/sms-webhook.js.map +7 -0
  433. package/dist/src/hooks/whatsapp-commands.js +479 -0
  434. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  435. package/dist/src/hooks/whatsapp-scheduler.js +317 -0
  436. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  437. package/dist/src/hooks/whatsapp-sync.js +409 -0
  438. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  439. package/dist/src/index.js +25 -0
  440. package/dist/src/index.js.map +7 -0
  441. package/dist/src/integrations/anthropic/client.js +263 -0
  442. package/dist/src/integrations/anthropic/client.js.map +7 -0
  443. package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
  444. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  445. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
  446. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  447. package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
  448. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  449. package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
  450. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  451. package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
  452. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  453. package/dist/src/integrations/claude-code/subagent-client.js +511 -0
  454. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  455. package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
  456. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  457. package/dist/src/integrations/linear/auth.js +337 -0
  458. package/dist/src/integrations/linear/auth.js.map +7 -0
  459. package/dist/src/integrations/linear/auto-sync.js +258 -0
  460. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  461. package/dist/src/integrations/linear/client.js +634 -0
  462. package/dist/src/integrations/linear/client.js.map +7 -0
  463. package/dist/src/integrations/linear/config.js +130 -0
  464. package/dist/src/integrations/linear/config.js.map +7 -0
  465. package/dist/src/integrations/linear/migration.js +361 -0
  466. package/dist/src/integrations/linear/migration.js.map +7 -0
  467. package/dist/src/integrations/linear/oauth-server.js +454 -0
  468. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  469. package/dist/src/integrations/linear/rest-client.js +213 -0
  470. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  471. package/dist/src/integrations/linear/sync-manager.js +236 -0
  472. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  473. package/dist/src/integrations/linear/sync-service.js +231 -0
  474. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  475. package/dist/src/integrations/linear/sync.js +782 -0
  476. package/dist/src/integrations/linear/sync.js.map +7 -0
  477. package/dist/src/integrations/linear/types.js +5 -0
  478. package/dist/src/integrations/linear/types.js.map +7 -0
  479. package/dist/src/integrations/linear/unified-sync.js +589 -0
  480. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  481. package/dist/src/integrations/linear/webhook-handler.js +219 -0
  482. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  483. package/dist/src/integrations/linear/webhook-server.js +218 -0
  484. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  485. package/dist/src/integrations/linear/webhook.js +291 -0
  486. package/dist/src/integrations/linear/webhook.js.map +7 -0
  487. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
  488. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  489. package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
  490. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  491. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
  492. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  493. package/dist/src/integrations/mcp/handlers/index.js +166 -0
  494. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  495. package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
  496. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  497. package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
  498. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  499. package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
  500. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  501. package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
  502. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  503. package/dist/src/integrations/mcp/index.js +23 -0
  504. package/dist/src/integrations/mcp/index.js.map +7 -0
  505. package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
  506. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  507. package/dist/src/integrations/mcp/refactored-server.js +374 -0
  508. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  509. package/dist/src/integrations/mcp/remote-server.js +682 -0
  510. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  511. package/dist/src/integrations/mcp/schemas.js +147 -0
  512. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  513. package/dist/src/integrations/mcp/server.js +1975 -0
  514. package/dist/src/integrations/mcp/server.js.map +7 -0
  515. package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
  516. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  517. package/dist/src/integrations/mcp/tool-definitions.js +702 -0
  518. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  519. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
  520. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  521. package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
  522. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  523. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
  524. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  525. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
  526. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  527. package/dist/src/integrations/ralph/index.js +18 -0
  528. package/dist/src/integrations/ralph/index.js.map +7 -0
  529. package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
  530. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  531. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
  532. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  533. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
  534. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  535. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
  536. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  537. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
  538. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  539. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
  540. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  541. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
  542. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  543. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
  544. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  545. package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
  546. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  547. package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
  548. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  549. package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
  550. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  551. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
  552. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  553. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
  554. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  555. package/dist/src/integrations/ralph/types.js +5 -0
  556. package/dist/src/integrations/ralph/types.js.map +7 -0
  557. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
  558. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  559. package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
  560. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  561. package/dist/src/middleware/exponential-rate-limiter.js +289 -0
  562. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  563. package/dist/src/models/user.model.js +358 -0
  564. package/dist/src/models/user.model.js.map +7 -0
  565. package/dist/src/servers/production/auth-middleware.js +528 -0
  566. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  567. package/dist/src/services/config-service.js +65 -0
  568. package/dist/src/services/config-service.js.map +7 -0
  569. package/dist/src/services/context-service.js +194 -0
  570. package/dist/src/services/context-service.js.map +7 -0
  571. package/dist/src/skills/api-discovery.js +354 -0
  572. package/dist/src/skills/api-discovery.js.map +7 -0
  573. package/dist/src/skills/api-skill.js +475 -0
  574. package/dist/src/skills/api-skill.js.map +7 -0
  575. package/dist/src/skills/claude-skills.js +1061 -0
  576. package/dist/src/skills/claude-skills.js.map +7 -0
  577. package/dist/src/skills/dashboard-launcher.js +216 -0
  578. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  579. package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
  580. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  581. package/dist/src/skills/repo-ingestion-skill.js +609 -0
  582. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  583. package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
  584. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  585. package/dist/src/types/task.js +5 -0
  586. package/dist/src/types/task.js.map +7 -0
  587. package/dist/src/utils/env.js +50 -0
  588. package/dist/src/utils/env.js.map +7 -0
  589. package/dist/src/utils/formatting.js +62 -0
  590. package/dist/src/utils/formatting.js.map +7 -0
  591. package/dist/src/utils/process-cleanup.js +136 -0
  592. package/dist/src/utils/process-cleanup.js.map +7 -0
  593. package/package.json +3 -3
  594. package/scripts/initialize.ts +16 -7
  595. package/scripts/install.sh +14 -62
  596. package/scripts/status.ts +111 -46
@@ -0,0 +1,130 @@
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 { readFileSync, writeFileSync, existsSync } from "fs";
6
+ import { join } from "path";
7
+ import { logger } from "../../core/monitoring/logger.js";
8
+ import { ProjectIsolationManager } from "../../core/projects/project-isolation.js";
9
+ class LinearConfigManager {
10
+ configPath;
11
+ projectRoot;
12
+ isolationManager;
13
+ constructor(projectRoot) {
14
+ this.projectRoot = projectRoot;
15
+ this.configPath = join(
16
+ projectRoot,
17
+ ".stackmemory",
18
+ "linear-auto-sync.json"
19
+ );
20
+ this.isolationManager = ProjectIsolationManager.getInstance();
21
+ }
22
+ /**
23
+ * Load configuration from file
24
+ */
25
+ loadConfig() {
26
+ if (!existsSync(this.configPath)) {
27
+ return null;
28
+ }
29
+ try {
30
+ const configData = readFileSync(this.configPath, "utf8");
31
+ return JSON.parse(configData);
32
+ } catch (error) {
33
+ logger.error(
34
+ "Failed to load Linear auto-sync configuration:",
35
+ error
36
+ );
37
+ return null;
38
+ }
39
+ }
40
+ /**
41
+ * Save configuration to file
42
+ */
43
+ saveConfig(config) {
44
+ const existingConfig = this.loadConfig() || this.getDefaultConfig();
45
+ const updatedConfig = {
46
+ ...existingConfig,
47
+ ...config,
48
+ lastUpdated: Date.now()
49
+ };
50
+ try {
51
+ writeFileSync(this.configPath, JSON.stringify(updatedConfig, null, 2));
52
+ logger.info("Linear auto-sync configuration saved");
53
+ } catch (error) {
54
+ logger.error(
55
+ "Failed to save Linear auto-sync configuration:",
56
+ error
57
+ );
58
+ throw error;
59
+ }
60
+ }
61
+ /**
62
+ * Get default configuration with project isolation
63
+ */
64
+ getDefaultConfig() {
65
+ const projectId = this.isolationManager.getProjectIdentification(this.projectRoot);
66
+ return {
67
+ enabled: true,
68
+ interval: 5,
69
+ // 5 minutes
70
+ direction: "bidirectional",
71
+ conflictResolution: "newest_wins",
72
+ retryAttempts: 3,
73
+ retryDelay: 3e4,
74
+ // 30 seconds
75
+ quietHours: {
76
+ start: 22,
77
+ // 10 PM
78
+ end: 7
79
+ // 7 AM
80
+ },
81
+ // Project isolation from stable identification
82
+ teamId: projectId.linearTeamId,
83
+ organization: projectId.linearOrganization,
84
+ workspaceFilter: projectId.workspaceFilter,
85
+ projectPrefix: projectId.projectPrefix,
86
+ lastUpdated: Date.now()
87
+ };
88
+ }
89
+ /**
90
+ * Convert to AutoSyncConfig format
91
+ */
92
+ toAutoSyncConfig(config) {
93
+ const persistedConfig = config || this.loadConfig() || this.getDefaultConfig();
94
+ return {
95
+ enabled: persistedConfig.enabled,
96
+ direction: persistedConfig.direction,
97
+ defaultTeamId: void 0,
98
+ // Will be set by sync engine
99
+ autoSync: true,
100
+ conflictResolution: persistedConfig.conflictResolution,
101
+ syncInterval: persistedConfig.interval,
102
+ interval: persistedConfig.interval,
103
+ retryAttempts: persistedConfig.retryAttempts,
104
+ retryDelay: persistedConfig.retryDelay,
105
+ quietHours: persistedConfig.quietHours
106
+ };
107
+ }
108
+ /**
109
+ * Update specific configuration values
110
+ */
111
+ updateConfig(updates) {
112
+ this.saveConfig(updates);
113
+ }
114
+ /**
115
+ * Check if configuration exists
116
+ */
117
+ hasConfig() {
118
+ return existsSync(this.configPath);
119
+ }
120
+ /**
121
+ * Reset to default configuration
122
+ */
123
+ resetConfig() {
124
+ this.saveConfig(this.getDefaultConfig());
125
+ }
126
+ }
127
+ export {
128
+ LinearConfigManager
129
+ };
130
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/integrations/linear/config.ts"],
4
+ "sourcesContent": ["/**\n * Linear Auto-Sync Configuration Management\n * Handles persistent configuration for auto-sync service\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { AutoSyncConfig } from './auto-sync.js';\nimport { ProjectIsolationManager } from '../../core/projects/project-isolation.js';\n\nexport interface PersistedSyncConfig {\n enabled: boolean;\n interval: number;\n direction: 'bidirectional' | 'to_linear' | 'from_linear';\n conflictResolution:\n | 'linear_wins'\n | 'stackmemory_wins'\n | 'manual'\n | 'newest_wins';\n retryAttempts: number;\n retryDelay: number;\n quietHours?: {\n start: number;\n end: number;\n };\n // Project isolation settings\n teamId?: string;\n organization?: string;\n workspaceFilter?: string;\n projectPrefix?: string;\n lastUpdated: number;\n}\n\nexport class LinearConfigManager {\n private configPath: string;\n private projectRoot: string;\n private isolationManager: ProjectIsolationManager;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n this.configPath = join(\n projectRoot,\n '.stackmemory',\n 'linear-auto-sync.json'\n );\n this.isolationManager = ProjectIsolationManager.getInstance();\n }\n\n /**\n * Load configuration from file\n */\n loadConfig(): PersistedSyncConfig | null {\n if (!existsSync(this.configPath)) {\n return null;\n }\n\n try {\n const configData = readFileSync(this.configPath, 'utf8');\n return JSON.parse(configData);\n } catch (error: unknown) {\n logger.error(\n 'Failed to load Linear auto-sync configuration:',\n error as Error\n );\n return null;\n }\n }\n\n /**\n * Save configuration to file\n */\n saveConfig(config: Partial<PersistedSyncConfig>): void {\n const existingConfig = this.loadConfig() || this.getDefaultConfig();\n\n const updatedConfig: PersistedSyncConfig = {\n ...existingConfig,\n ...config,\n lastUpdated: Date.now(),\n };\n\n try {\n writeFileSync(this.configPath, JSON.stringify(updatedConfig, null, 2));\n logger.info('Linear auto-sync configuration saved');\n } catch (error: unknown) {\n logger.error(\n 'Failed to save Linear auto-sync configuration:',\n error as Error\n );\n throw error;\n }\n }\n\n /**\n * Get default configuration with project isolation\n */\n getDefaultConfig(): PersistedSyncConfig {\n // Get stable project identification\n const projectId = this.isolationManager.getProjectIdentification(this.projectRoot);\n \n return {\n enabled: true,\n interval: 5, // 5 minutes\n direction: 'bidirectional',\n conflictResolution: 'newest_wins',\n retryAttempts: 3,\n retryDelay: 30000, // 30 seconds\n quietHours: {\n start: 22, // 10 PM\n end: 7, // 7 AM\n },\n // Project isolation from stable identification\n teamId: projectId.linearTeamId,\n organization: projectId.linearOrganization,\n workspaceFilter: projectId.workspaceFilter,\n projectPrefix: projectId.projectPrefix,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Convert to AutoSyncConfig format\n */\n toAutoSyncConfig(config?: PersistedSyncConfig): AutoSyncConfig {\n const persistedConfig =\n config || this.loadConfig() || this.getDefaultConfig();\n\n return {\n enabled: persistedConfig.enabled,\n direction: persistedConfig.direction,\n defaultTeamId: undefined, // Will be set by sync engine\n autoSync: true,\n conflictResolution: persistedConfig.conflictResolution,\n syncInterval: persistedConfig.interval,\n interval: persistedConfig.interval,\n retryAttempts: persistedConfig.retryAttempts,\n retryDelay: persistedConfig.retryDelay,\n quietHours: persistedConfig.quietHours,\n };\n }\n\n /**\n * Update specific configuration values\n */\n updateConfig(updates: Partial<PersistedSyncConfig>): void {\n this.saveConfig(updates);\n }\n\n /**\n * Check if configuration exists\n */\n hasConfig(): boolean {\n return existsSync(this.configPath);\n }\n\n /**\n * Reset to default configuration\n */\n resetConfig(): void {\n this.saveConfig(this.getDefaultConfig());\n }\n}\n"],
5
+ "mappings": ";;;;AAKA,SAAS,cAAc,eAAe,kBAAkB;AACxD,SAAS,YAAY;AACrB,SAAS,cAAc;AAEvB,SAAS,+BAA+B;AAyBjC,MAAM,oBAAoB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,aAAqB;AAC/B,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,mBAAmB,wBAAwB,YAAY;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAyC;AACvC,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,aAAa,aAAa,KAAK,YAAY,MAAM;AACvD,aAAO,KAAK,MAAM,UAAU;AAAA,IAC9B,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAA4C;AACrD,UAAM,iBAAiB,KAAK,WAAW,KAAK,KAAK,iBAAiB;AAElE,UAAM,gBAAqC;AAAA,MACzC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,aAAa,KAAK,IAAI;AAAA,IACxB;AAEA,QAAI;AACF,oBAAc,KAAK,YAAY,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AACrE,aAAO,KAAK,sCAAsC;AAAA,IACpD,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAwC;AAEtC,UAAM,YAAY,KAAK,iBAAiB,yBAAyB,KAAK,WAAW;AAEjF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,MACV,WAAW;AAAA,MACX,oBAAoB;AAAA,MACpB,eAAe;AAAA,MACf,YAAY;AAAA;AAAA,MACZ,YAAY;AAAA,QACV,OAAO;AAAA;AAAA,QACP,KAAK;AAAA;AAAA,MACP;AAAA;AAAA,MAEA,QAAQ,UAAU;AAAA,MAClB,cAAc,UAAU;AAAA,MACxB,iBAAiB,UAAU;AAAA,MAC3B,eAAe,UAAU;AAAA,MACzB,aAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAA8C;AAC7D,UAAM,kBACJ,UAAU,KAAK,WAAW,KAAK,KAAK,iBAAiB;AAEvD,WAAO;AAAA,MACL,SAAS,gBAAgB;AAAA,MACzB,WAAW,gBAAgB;AAAA,MAC3B,eAAe;AAAA;AAAA,MACf,UAAU;AAAA,MACV,oBAAoB,gBAAgB;AAAA,MACpC,cAAc,gBAAgB;AAAA,MAC9B,UAAU,gBAAgB;AAAA,MAC1B,eAAe,gBAAgB;AAAA,MAC/B,YAAY,gBAAgB;AAAA,MAC5B,YAAY,gBAAgB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAA6C;AACxD,SAAK,WAAW,OAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,WAAW,KAAK,UAAU;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAoB;AAClB,SAAK,WAAW,KAAK,iBAAiB,CAAC;AAAA,EACzC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,361 @@
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 { LinearRestClient } from "./rest-client.js";
6
+ import { logger } from "../../core/monitoring/logger.js";
7
+ import { IntegrationError, ErrorCode } from "../../core/errors/index.js";
8
+ import chalk from "chalk";
9
+ class LinearMigrator {
10
+ sourceClient;
11
+ targetClient;
12
+ config;
13
+ constructor(config) {
14
+ this.config = config;
15
+ this.sourceClient = new LinearRestClient(config.sourceApiKey);
16
+ this.targetClient = new LinearRestClient(config.targetApiKey);
17
+ }
18
+ /**
19
+ * Test connections to both workspaces
20
+ */
21
+ async testConnections() {
22
+ const result = {
23
+ source: { success: false },
24
+ target: { success: false }
25
+ };
26
+ try {
27
+ const sourceViewer = await this.sourceClient.getViewer();
28
+ const sourceTeam = await this.sourceClient.getTeam();
29
+ result.source = {
30
+ success: true,
31
+ info: {
32
+ user: sourceViewer,
33
+ team: sourceTeam
34
+ }
35
+ };
36
+ } catch (error) {
37
+ result.source = {
38
+ success: false,
39
+ error: error.message
40
+ };
41
+ }
42
+ try {
43
+ const targetViewer = await this.targetClient.getViewer();
44
+ const targetTeam = await this.targetClient.getTeam();
45
+ result.target = {
46
+ success: true,
47
+ info: {
48
+ user: targetViewer,
49
+ team: targetTeam
50
+ }
51
+ };
52
+ } catch (error) {
53
+ result.target = {
54
+ success: false,
55
+ error: error.message
56
+ };
57
+ }
58
+ return result;
59
+ }
60
+ /**
61
+ * Migrate all tasks from source to target workspace
62
+ */
63
+ async migrate() {
64
+ const result = {
65
+ totalTasks: 0,
66
+ exported: 0,
67
+ imported: 0,
68
+ failed: 0,
69
+ deleted: 0,
70
+ deleteFailed: 0,
71
+ errors: [],
72
+ taskMappings: []
73
+ };
74
+ try {
75
+ console.log(chalk.yellow("Starting Linear workspace migration..."));
76
+ const sourceTasks = await this.sourceClient.getAllTasks(true);
77
+ result.totalTasks = sourceTasks.length;
78
+ console.log(
79
+ chalk.cyan(`Found ${sourceTasks.length} tasks in source workspace`)
80
+ );
81
+ let tasksToMigrate = sourceTasks;
82
+ if (this.config.taskPrefix) {
83
+ tasksToMigrate = sourceTasks.filter(
84
+ (task) => task.identifier.startsWith(this.config.taskPrefix)
85
+ );
86
+ console.log(
87
+ chalk.cyan(
88
+ `Filtered to ${tasksToMigrate.length} tasks with prefix "${this.config.taskPrefix}"`
89
+ )
90
+ );
91
+ }
92
+ if (this.config.includeStates?.length) {
93
+ tasksToMigrate = tasksToMigrate.filter(
94
+ (task) => this.config.includeStates.includes(task.state.type)
95
+ );
96
+ const stateStr = this.config.includeStates.join(", ");
97
+ console.log(
98
+ chalk.cyan(
99
+ `Further filtered to ${tasksToMigrate.length} tasks matching states: ${stateStr}`
100
+ )
101
+ );
102
+ }
103
+ result.exported = tasksToMigrate.length;
104
+ if (this.config.dryRun) {
105
+ console.log(chalk.yellow("DRY RUN - No tasks will be created"));
106
+ tasksToMigrate.forEach((task) => {
107
+ result.taskMappings.push({
108
+ sourceId: task.id,
109
+ sourceIdentifier: task.identifier,
110
+ targetId: "DRY_RUN",
111
+ targetIdentifier: "DRY_RUN"
112
+ });
113
+ });
114
+ result.imported = tasksToMigrate.length;
115
+ return result;
116
+ }
117
+ const targetTeam = await this.targetClient.getTeam();
118
+ console.log(
119
+ chalk.cyan(`Target team: ${targetTeam.name} (${targetTeam.key})`)
120
+ );
121
+ const batchSize = this.config.batchSize || 5;
122
+ const delayMs = this.config.delayMs || 2e3;
123
+ for (let i = 0; i < tasksToMigrate.length; i += batchSize) {
124
+ const batch = tasksToMigrate.slice(i, i + batchSize);
125
+ console.log(
126
+ chalk.yellow(
127
+ `Processing batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(tasksToMigrate.length / batchSize)}`
128
+ )
129
+ );
130
+ for (const task of batch) {
131
+ try {
132
+ const newTask = await this.migrateTask(task, targetTeam.id);
133
+ const mapping = {
134
+ sourceId: task.id,
135
+ sourceIdentifier: task.identifier,
136
+ targetId: newTask.id,
137
+ targetIdentifier: newTask.identifier,
138
+ deleted: false
139
+ };
140
+ result.imported++;
141
+ console.log(
142
+ chalk.green(
143
+ `${task.identifier} \u2192 ${newTask.identifier}: ${task.title}`
144
+ )
145
+ );
146
+ if (this.config.deleteFromSource) {
147
+ try {
148
+ await this.deleteTask(task.id);
149
+ mapping.deleted = true;
150
+ result.deleted++;
151
+ console.log(
152
+ chalk.gray(`Deleted ${task.identifier} from source`)
153
+ );
154
+ } catch (deleteError) {
155
+ result.deleteFailed++;
156
+ result.errors.push(
157
+ `Delete failed for ${task.identifier}: ${deleteError.message}`
158
+ );
159
+ console.log(
160
+ chalk.yellow(
161
+ `Failed to delete ${task.identifier} from source: ${deleteError.message}`
162
+ )
163
+ );
164
+ }
165
+ }
166
+ result.taskMappings.push(mapping);
167
+ } catch (error) {
168
+ const errorMsg = error.message;
169
+ result.errors.push(`${task.identifier}: ${errorMsg}`);
170
+ result.taskMappings.push({
171
+ sourceId: task.id,
172
+ sourceIdentifier: task.identifier,
173
+ error: errorMsg
174
+ });
175
+ result.failed++;
176
+ console.log(chalk.red(`${task.identifier}: ${errorMsg}`));
177
+ }
178
+ }
179
+ if (i + batchSize < tasksToMigrate.length) {
180
+ console.log(chalk.gray(`Waiting ${delayMs}ms before next batch...`));
181
+ await this.delay(delayMs);
182
+ }
183
+ }
184
+ } catch (error) {
185
+ result.errors.push(`Migration failed: ${error.message}`);
186
+ logger.error("Migration failed:", error);
187
+ }
188
+ return result;
189
+ }
190
+ /**
191
+ * Migrate a single task
192
+ */
193
+ async migrateTask(sourceTask, targetTeamId) {
194
+ const stateMapping = {
195
+ backlog: "backlog",
196
+ unstarted: "unstarted",
197
+ started: "started",
198
+ completed: "completed",
199
+ canceled: "canceled"
200
+ };
201
+ const createTaskQuery = `
202
+ mutation CreateIssue($input: IssueCreateInput!) {
203
+ issueCreate(input: $input) {
204
+ success
205
+ issue {
206
+ id
207
+ identifier
208
+ title
209
+ description
210
+ state {
211
+ id
212
+ name
213
+ type
214
+ }
215
+ priority
216
+ createdAt
217
+ updatedAt
218
+ url
219
+ }
220
+ }
221
+ }
222
+ `;
223
+ const taskInput = {
224
+ title: `[MIGRATED] ${sourceTask.title}`,
225
+ description: this.formatMigratedDescription(sourceTask),
226
+ teamId: targetTeamId,
227
+ priority: this.mapPriority(sourceTask.priority)
228
+ };
229
+ const response = await this.targetClient.makeRequest(createTaskQuery, { input: taskInput });
230
+ if (!response.data?.issueCreate?.success) {
231
+ throw new IntegrationError(
232
+ "Failed to create task in target workspace",
233
+ ErrorCode.LINEAR_SYNC_FAILED,
234
+ { sourceTaskId: sourceTask.id, sourceIdentifier: sourceTask.identifier }
235
+ );
236
+ }
237
+ return response.data.issueCreate.issue;
238
+ }
239
+ /**
240
+ * Format description with migration context
241
+ */
242
+ formatMigratedDescription(sourceTask) {
243
+ let description = sourceTask.description || "";
244
+ description += `
245
+
246
+ ---
247
+ **Migration Info:**
248
+ `;
249
+ description += `- Original ID: ${sourceTask.identifier}
250
+ `;
251
+ description += `- Migrated: ${(/* @__PURE__ */ new Date()).toISOString()}
252
+ `;
253
+ description += `- Original State: ${sourceTask.state.name}
254
+ `;
255
+ if (sourceTask.assignee) {
256
+ description += `- Original Assignee: ${sourceTask.assignee.name}
257
+ `;
258
+ }
259
+ if (sourceTask.estimate) {
260
+ description += `- Original Estimate: ${sourceTask.estimate} points
261
+ `;
262
+ }
263
+ return description;
264
+ }
265
+ /**
266
+ * Map priority values
267
+ */
268
+ mapPriority(priority) {
269
+ return priority || 0;
270
+ }
271
+ /**
272
+ * Delete a task from the source workspace
273
+ */
274
+ async deleteTask(taskId) {
275
+ const deleteQuery = `
276
+ mutation DeleteIssue($id: String!) {
277
+ issueDelete(id: $id) {
278
+ success
279
+ }
280
+ }
281
+ `;
282
+ const response = await this.sourceClient.makeRequest(deleteQuery, {
283
+ id: taskId
284
+ });
285
+ if (!response.data?.issueDelete?.success) {
286
+ throw new IntegrationError(
287
+ "Failed to delete task from source workspace",
288
+ ErrorCode.LINEAR_SYNC_FAILED,
289
+ { taskId }
290
+ );
291
+ }
292
+ }
293
+ /**
294
+ * Delay helper
295
+ */
296
+ delay(ms) {
297
+ return new Promise((resolve) => setTimeout(resolve, ms));
298
+ }
299
+ }
300
+ async function runMigration(config) {
301
+ const migrator = new LinearMigrator(config);
302
+ console.log(chalk.blue("Testing connections..."));
303
+ const connectionTest = await migrator.testConnections();
304
+ if (!connectionTest.source.success) {
305
+ console.error(
306
+ chalk.red(`Source connection failed: ${connectionTest.source.error}`)
307
+ );
308
+ return;
309
+ }
310
+ if (!connectionTest.target.success) {
311
+ console.error(
312
+ chalk.red(`Target connection failed: ${connectionTest.target.error}`)
313
+ );
314
+ return;
315
+ }
316
+ console.log(chalk.green("Both connections successful"));
317
+ console.log(
318
+ chalk.cyan(
319
+ `Source: ${connectionTest.source.info.user.name} @ ${connectionTest.source.info.team.name}`
320
+ )
321
+ );
322
+ console.log(
323
+ chalk.cyan(
324
+ `Target: ${connectionTest.target.info.user.name} @ ${connectionTest.target.info.team.name}`
325
+ )
326
+ );
327
+ const result = await migrator.migrate();
328
+ console.log(chalk.blue("\nMigration Summary:"));
329
+ console.log(` Total tasks: ${result.totalTasks}`);
330
+ console.log(` Exported: ${result.exported}`);
331
+ console.log(chalk.green(` Imported: ${result.imported}`));
332
+ console.log(chalk.red(` Failed: ${result.failed}`));
333
+ if (config.deleteFromSource) {
334
+ console.log(chalk.gray(` Deleted: ${result.deleted}`));
335
+ if (result.deleteFailed > 0) {
336
+ console.log(chalk.yellow(` Delete failed: ${result.deleteFailed}`));
337
+ }
338
+ }
339
+ if (result.errors.length > 0) {
340
+ console.log(chalk.red("\nErrors:"));
341
+ result.errors.forEach((error) => console.log(chalk.red(` - ${error}`)));
342
+ }
343
+ if (result.imported > 0) {
344
+ console.log(
345
+ chalk.green(
346
+ `
347
+ Migration completed! ${result.imported} tasks migrated successfully.`
348
+ )
349
+ );
350
+ if (config.deleteFromSource && result.deleted > 0) {
351
+ console.log(
352
+ chalk.gray(` ${result.deleted} tasks deleted from source workspace.`)
353
+ );
354
+ }
355
+ }
356
+ }
357
+ export {
358
+ LinearMigrator,
359
+ runMigration
360
+ };
361
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/integrations/linear/migration.ts"],
4
+ "sourcesContent": ["/**\n * Linear Workspace Migration Tool\n * Migrates all tasks from one Linear workspace to another\n */\n\nimport { LinearRestClient } from './rest-client.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { IntegrationError, ErrorCode } from '../../core/errors/index.js';\nimport chalk from 'chalk';\n\nexport interface MigrationConfig {\n sourceApiKey: string;\n targetApiKey: string;\n dryRun?: boolean;\n includeStates?: string[]; // Filter by state\n taskPrefix?: string; // Only migrate tasks with this identifier prefix (e.g., \"STA-\")\n deleteFromSource?: boolean; // Delete tasks from source after successful migration\n batchSize?: number;\n delayMs?: number; // Delay between API calls\n}\n\nexport interface MigrationResult {\n totalTasks: number;\n exported: number;\n imported: number;\n failed: number;\n deleted: number;\n deleteFailed: number;\n errors: string[];\n taskMappings: Array<{\n sourceId: string;\n sourceIdentifier: string;\n targetId?: string;\n targetIdentifier?: string;\n deleted?: boolean;\n error?: string;\n }>;\n}\n\nexport class LinearMigrator {\n private sourceClient: LinearRestClient;\n private targetClient: LinearRestClient;\n private config: MigrationConfig;\n\n constructor(config: MigrationConfig) {\n this.config = config;\n this.sourceClient = new LinearRestClient(config.sourceApiKey);\n this.targetClient = new LinearRestClient(config.targetApiKey);\n }\n\n /**\n * Test connections to both workspaces\n */\n async testConnections(): Promise<{\n source: { success: boolean; info?: any; error?: string };\n target: { success: boolean; info?: any; error?: string };\n }> {\n const result = {\n source: { success: false } as any,\n target: { success: false } as any,\n };\n\n // Test source connection\n try {\n const sourceViewer = await this.sourceClient.getViewer();\n const sourceTeam = await this.sourceClient.getTeam();\n result.source = {\n success: true,\n info: {\n user: sourceViewer,\n team: sourceTeam,\n },\n };\n } catch (error: unknown) {\n result.source = {\n success: false,\n error: (error as Error).message,\n };\n }\n\n // Test target connection\n try {\n const targetViewer = await this.targetClient.getViewer();\n const targetTeam = await this.targetClient.getTeam();\n result.target = {\n success: true,\n info: {\n user: targetViewer,\n team: targetTeam,\n },\n };\n } catch (error: unknown) {\n result.target = {\n success: false,\n error: (error as Error).message,\n };\n }\n\n return result;\n }\n\n /**\n * Migrate all tasks from source to target workspace\n */\n async migrate(): Promise<MigrationResult> {\n const result: MigrationResult = {\n totalTasks: 0,\n exported: 0,\n imported: 0,\n failed: 0,\n deleted: 0,\n deleteFailed: 0,\n errors: [],\n taskMappings: [],\n };\n\n try {\n console.log(chalk.yellow('Starting Linear workspace migration...'));\n\n // Get all tasks from source\n const sourceTasks = await this.sourceClient.getAllTasks(true); // Force refresh\n result.totalTasks = sourceTasks.length;\n console.log(\n chalk.cyan(`Found ${sourceTasks.length} tasks in source workspace`)\n );\n\n // Filter by prefix (e.g., \"STA-\" tasks only)\n let tasksToMigrate = sourceTasks;\n if (this.config.taskPrefix) {\n tasksToMigrate = sourceTasks.filter((task: any) =>\n task.identifier.startsWith(this.config.taskPrefix!)\n );\n console.log(\n chalk.cyan(\n `Filtered to ${tasksToMigrate.length} tasks with prefix \"${this.config.taskPrefix}\"`\n )\n );\n }\n\n // Filter by states if specified\n if (this.config.includeStates?.length) {\n tasksToMigrate = tasksToMigrate.filter((task: any) =>\n this.config.includeStates!.includes(task.state.type)\n );\n const stateStr = this.config.includeStates.join(', ');\n console.log(\n chalk.cyan(\n `Further filtered to ${tasksToMigrate.length} tasks matching states: ${stateStr}`\n )\n );\n }\n\n result.exported = tasksToMigrate.length;\n\n if (this.config.dryRun) {\n console.log(chalk.yellow('DRY RUN - No tasks will be created'));\n tasksToMigrate.forEach((task) => {\n result.taskMappings.push({\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n targetId: 'DRY_RUN',\n targetIdentifier: 'DRY_RUN',\n });\n });\n result.imported = tasksToMigrate.length;\n return result;\n }\n\n // Get target team info\n const targetTeam = await this.targetClient.getTeam();\n console.log(\n chalk.cyan(`Target team: ${targetTeam.name} (${targetTeam.key})`)\n );\n\n // Migrate tasks in batches\n const batchSize = this.config.batchSize || 5;\n const delayMs = this.config.delayMs || 2000;\n\n for (let i = 0; i < tasksToMigrate.length; i += batchSize) {\n const batch = tasksToMigrate.slice(i, i + batchSize);\n console.log(\n chalk.yellow(\n `Processing batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(tasksToMigrate.length / batchSize)}`\n )\n );\n\n for (const task of batch) {\n try {\n const newTask = await this.migrateTask(task, targetTeam.id);\n const mapping = {\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n targetId: newTask.id,\n targetIdentifier: newTask.identifier,\n deleted: false,\n };\n\n result.imported++;\n console.log(\n chalk.green(\n `${task.identifier} \u2192 ${newTask.identifier}: ${task.title}`\n )\n );\n\n // Delete from source if configured\n if (this.config.deleteFromSource) {\n try {\n await this.deleteTask(task.id);\n mapping.deleted = true;\n result.deleted++;\n console.log(\n chalk.gray(`Deleted ${task.identifier} from source`)\n );\n } catch (deleteError: unknown) {\n result.deleteFailed++;\n result.errors.push(\n `Delete failed for ${task.identifier}: ${(deleteError as Error).message}`\n );\n console.log(\n chalk.yellow(\n `Failed to delete ${task.identifier} from source: ${(deleteError as Error).message}`\n )\n );\n }\n }\n\n result.taskMappings.push(mapping);\n } catch (error: unknown) {\n const errorMsg = (error as Error).message;\n result.errors.push(`${task.identifier}: ${errorMsg}`);\n result.taskMappings.push({\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n error: errorMsg,\n });\n result.failed++;\n console.log(chalk.red(`${task.identifier}: ${errorMsg}`));\n }\n }\n\n // Delay between batches to avoid rate limits\n if (i + batchSize < tasksToMigrate.length) {\n console.log(chalk.gray(`Waiting ${delayMs}ms before next batch...`));\n await this.delay(delayMs);\n }\n }\n } catch (error: unknown) {\n result.errors.push(`Migration failed: ${(error as Error).message}`);\n logger.error('Migration failed:', error as Error);\n }\n\n return result;\n }\n\n /**\n * Migrate a single task\n */\n private async migrateTask(\n sourceTask: any,\n targetTeamId: string\n ): Promise<any> {\n // Map states from source to target format\n const stateMapping: Record<string, string> = {\n backlog: 'backlog',\n unstarted: 'unstarted',\n started: 'started',\n completed: 'completed',\n canceled: 'canceled',\n };\n\n // Create task in target workspace using GraphQL\n const createTaskQuery = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n // Prepare task input\n const taskInput = {\n title: `[MIGRATED] ${sourceTask.title}`,\n description: this.formatMigratedDescription(sourceTask),\n teamId: targetTeamId,\n priority: this.mapPriority(sourceTask.priority),\n };\n\n const response = await this.targetClient.makeRequest<{\n data: {\n issueCreate: {\n success: boolean;\n issue: any;\n };\n };\n }>(createTaskQuery, { input: taskInput });\n\n if (!response.data?.issueCreate?.success) {\n throw new IntegrationError(\n 'Failed to create task in target workspace',\n ErrorCode.LINEAR_SYNC_FAILED,\n { sourceTaskId: sourceTask.id, sourceIdentifier: sourceTask.identifier }\n );\n }\n\n return response.data.issueCreate.issue;\n }\n\n /**\n * Format description with migration context\n */\n private formatMigratedDescription(sourceTask: any): string {\n let description = sourceTask.description || '';\n\n description += `\\n\\n---\\n**Migration Info:**\\n`;\n description += `- Original ID: ${sourceTask.identifier}\\n`;\n description += `- Migrated: ${new Date().toISOString()}\\n`;\n description += `- Original State: ${sourceTask.state.name}\\n`;\n\n if (sourceTask.assignee) {\n description += `- Original Assignee: ${sourceTask.assignee.name}\\n`;\n }\n\n if (sourceTask.estimate) {\n description += `- Original Estimate: ${sourceTask.estimate} points\\n`;\n }\n\n return description;\n }\n\n /**\n * Map priority values\n */\n private mapPriority(priority?: number): number {\n // Linear priorities: 0=none, 1=urgent, 2=high, 3=medium, 4=low\n return priority || 0;\n }\n\n /**\n * Delete a task from the source workspace\n */\n private async deleteTask(taskId: string): Promise<void> {\n const deleteQuery = `\n mutation DeleteIssue($id: String!) {\n issueDelete(id: $id) {\n success\n }\n }\n `;\n\n const response = await (this.sourceClient as any).makeRequest(deleteQuery, {\n id: taskId,\n });\n\n if (!response.data?.issueDelete?.success) {\n throw new IntegrationError(\n 'Failed to delete task from source workspace',\n ErrorCode.LINEAR_SYNC_FAILED,\n { taskId }\n );\n }\n }\n\n /**\n * Delay helper\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * CLI function to run migration\n */\nexport async function runMigration(config: MigrationConfig): Promise<void> {\n const migrator = new LinearMigrator(config);\n\n console.log(chalk.blue('Testing connections...'));\n const connectionTest = await migrator.testConnections();\n\n if (!connectionTest.source.success) {\n console.error(\n chalk.red(`Source connection failed: ${connectionTest.source.error}`)\n );\n return;\n }\n\n if (!connectionTest.target.success) {\n console.error(\n chalk.red(`Target connection failed: ${connectionTest.target.error}`)\n );\n return;\n }\n\n console.log(chalk.green('Both connections successful'));\n console.log(\n chalk.cyan(\n `Source: ${connectionTest.source.info.user.name} @ ${connectionTest.source.info.team.name}`\n )\n );\n console.log(\n chalk.cyan(\n `Target: ${connectionTest.target.info.user.name} @ ${connectionTest.target.info.team.name}`\n )\n );\n\n const result = await migrator.migrate();\n\n console.log(chalk.blue('\\nMigration Summary:'));\n console.log(` Total tasks: ${result.totalTasks}`);\n console.log(` Exported: ${result.exported}`);\n console.log(chalk.green(` Imported: ${result.imported}`));\n console.log(chalk.red(` Failed: ${result.failed}`));\n if (config.deleteFromSource) {\n console.log(chalk.gray(` Deleted: ${result.deleted}`));\n if (result.deleteFailed > 0) {\n console.log(chalk.yellow(` Delete failed: ${result.deleteFailed}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log(chalk.red('\\nErrors:'));\n result.errors.forEach((error) => console.log(chalk.red(` - ${error}`)));\n }\n\n if (result.imported > 0) {\n console.log(\n chalk.green(\n `\\nMigration completed! ${result.imported} tasks migrated successfully.`\n )\n );\n if (config.deleteFromSource && result.deleted > 0) {\n console.log(\n chalk.gray(` ${result.deleted} tasks deleted from source workspace.`)\n );\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }