@stackmemoryai/stackmemory 0.2.8 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/dist/agents/core/agent-task-manager.js +512 -0
  2. package/dist/agents/core/agent-task-manager.js.map +7 -0
  3. package/dist/agents/verifiers/base-verifier.js +129 -0
  4. package/dist/agents/verifiers/base-verifier.js.map +7 -0
  5. package/dist/agents/verifiers/formatter-verifier.js +126 -0
  6. package/dist/agents/verifiers/formatter-verifier.js.map +7 -0
  7. package/dist/agents/verifiers/llm-judge.js +248 -0
  8. package/dist/agents/verifiers/llm-judge.js.map +7 -0
  9. package/dist/cli/__tests__/index.test.js +290 -0
  10. package/dist/cli/__tests__/index.test.js.map +7 -0
  11. package/dist/cli/auto-detect.js +317 -0
  12. package/dist/cli/auto-detect.js.map +7 -0
  13. package/dist/cli/browser-test.js +29 -0
  14. package/dist/cli/browser-test.js.map +7 -0
  15. package/dist/cli/claude-sm.js +369 -0
  16. package/dist/cli/claude-sm.js.map +7 -0
  17. package/dist/cli/codex-sm.js +283 -0
  18. package/dist/cli/codex-sm.js.map +7 -0
  19. package/dist/cli/commands/agent.js +286 -0
  20. package/dist/cli/commands/agent.js.map +7 -0
  21. package/dist/cli/commands/config.js +199 -0
  22. package/dist/cli/commands/config.js.map +7 -0
  23. package/dist/cli/commands/context.js +327 -0
  24. package/dist/cli/commands/context.js.map +7 -0
  25. package/dist/cli/commands/handoff.js +191 -0
  26. package/dist/cli/commands/handoff.js.map +7 -0
  27. package/dist/cli/commands/linear-test.js +115 -0
  28. package/dist/cli/commands/linear-test.js.map +7 -0
  29. package/dist/cli/commands/linear.js +378 -0
  30. package/dist/cli/commands/linear.js.map +7 -0
  31. package/dist/cli/commands/log.js +165 -0
  32. package/dist/cli/commands/log.js.map +7 -0
  33. package/dist/cli/commands/onboard.js +349 -0
  34. package/dist/cli/commands/onboard.js.map +7 -0
  35. package/dist/cli/commands/projects.js +195 -0
  36. package/dist/cli/commands/projects.js.map +7 -0
  37. package/dist/cli/commands/search.js +152 -0
  38. package/dist/cli/commands/search.js.map +7 -0
  39. package/dist/cli/commands/session.js +179 -0
  40. package/dist/cli/commands/session.js.map +7 -0
  41. package/dist/cli/commands/tasks.js +205 -0
  42. package/dist/cli/commands/tasks.js.map +7 -0
  43. package/dist/cli/commands/webhook.js +131 -0
  44. package/dist/cli/commands/webhook.js.map +7 -0
  45. package/dist/cli/commands/worktree.js +276 -0
  46. package/dist/cli/commands/worktree.js.map +7 -0
  47. package/dist/cli/index.js +953 -0
  48. package/dist/cli/index.js.map +7 -0
  49. package/dist/cli/utils/viewer.js +92 -0
  50. package/dist/cli/utils/viewer.js.map +7 -0
  51. package/dist/core/config/__tests__/config-manager.test.js +248 -0
  52. package/dist/core/config/__tests__/config-manager.test.js.map +7 -0
  53. package/dist/core/config/config-manager.js +368 -0
  54. package/dist/core/config/config-manager.js.map +7 -0
  55. package/dist/core/config/types.js +140 -0
  56. package/dist/core/config/types.js.map +7 -0
  57. package/dist/core/context/__tests__/frame-manager.test.js +879 -0
  58. package/dist/core/context/__tests__/frame-manager.test.js.map +7 -0
  59. package/dist/core/context/auto-context.js +72 -0
  60. package/dist/core/context/auto-context.js.map +7 -0
  61. package/dist/core/context/compaction-handler.js +326 -0
  62. package/dist/core/context/compaction-handler.js.map +7 -0
  63. package/dist/core/context/frame-database.js +376 -0
  64. package/dist/core/context/frame-database.js.map +7 -0
  65. package/dist/core/context/frame-digest.js +239 -0
  66. package/dist/core/context/frame-digest.js.map +7 -0
  67. package/dist/core/context/frame-manager.js +682 -0
  68. package/dist/core/context/frame-manager.js.map +7 -0
  69. package/dist/core/context/frame-stack.js +270 -0
  70. package/dist/core/context/frame-stack.js.map +7 -0
  71. package/dist/core/context/frame-types.js +1 -0
  72. package/dist/core/context/frame-types.js.map +7 -0
  73. package/dist/core/context/index.js +33 -0
  74. package/dist/core/context/index.js.map +7 -0
  75. package/dist/core/context/model-aware-compaction.js +619 -0
  76. package/dist/core/context/model-aware-compaction.js.map +7 -0
  77. package/dist/core/context/refactored-frame-manager.js +393 -0
  78. package/dist/core/context/refactored-frame-manager.js.map +7 -0
  79. package/dist/core/database/batch-operations.js +329 -0
  80. package/dist/core/database/batch-operations.js.map +7 -0
  81. package/dist/core/database/connection-pool.js +224 -0
  82. package/dist/core/database/connection-pool.js.map +7 -0
  83. package/dist/core/database/query-cache.js +284 -0
  84. package/dist/core/database/query-cache.js.map +7 -0
  85. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +379 -0
  86. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +7 -0
  87. package/dist/core/digest/__tests__/frame-digest-integration.test.js +230 -0
  88. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +7 -0
  89. package/dist/core/digest/enhanced-hybrid-digest.js +267 -0
  90. package/dist/core/digest/enhanced-hybrid-digest.js.map +7 -0
  91. package/dist/core/digest/frame-digest-integration.js +172 -0
  92. package/dist/core/digest/frame-digest-integration.js.map +7 -0
  93. package/dist/core/digest/hybrid-digest-generator.js +549 -0
  94. package/dist/core/digest/hybrid-digest-generator.js.map +7 -0
  95. package/dist/core/digest/index.js +5 -0
  96. package/dist/core/digest/index.js.map +7 -0
  97. package/dist/core/digest/types.js +21 -0
  98. package/dist/core/digest/types.js.map +7 -0
  99. package/dist/core/errors/__tests__/error-handling.test.js +270 -0
  100. package/dist/core/errors/__tests__/error-handling.test.js.map +7 -0
  101. package/dist/core/errors/index.js +239 -0
  102. package/dist/core/errors/index.js.map +7 -0
  103. package/dist/core/errors/recovery.js +258 -0
  104. package/dist/core/errors/recovery.js.map +7 -0
  105. package/dist/core/merge/__tests__/conflict-scenarios.test.js +414 -0
  106. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +7 -0
  107. package/dist/core/merge/conflict-detector.js +424 -0
  108. package/dist/core/merge/conflict-detector.js.map +7 -0
  109. package/dist/core/merge/index.js +5 -0
  110. package/dist/core/merge/index.js.map +7 -0
  111. package/dist/core/merge/resolution-engine.js +565 -0
  112. package/dist/core/merge/resolution-engine.js.map +7 -0
  113. package/dist/core/merge/stack-diff.js +528 -0
  114. package/dist/core/merge/stack-diff.js.map +7 -0
  115. package/dist/core/merge/types.js +1 -0
  116. package/dist/core/merge/types.js.map +7 -0
  117. package/dist/core/monitoring/error-handler.js +278 -0
  118. package/dist/core/monitoring/error-handler.js.map +7 -0
  119. package/dist/core/monitoring/logger.js +115 -0
  120. package/dist/core/monitoring/logger.js.map +7 -0
  121. package/dist/core/monitoring/metrics.js +157 -0
  122. package/dist/core/monitoring/metrics.js.map +7 -0
  123. package/dist/core/monitoring/progress-tracker.js +174 -0
  124. package/dist/core/monitoring/progress-tracker.js.map +7 -0
  125. package/dist/core/performance/context-cache.js +269 -0
  126. package/dist/core/performance/context-cache.js.map +7 -0
  127. package/dist/core/performance/index.js +7 -0
  128. package/dist/core/performance/index.js.map +7 -0
  129. package/dist/core/performance/lazy-context-loader.js +319 -0
  130. package/dist/core/performance/lazy-context-loader.js.map +7 -0
  131. package/dist/core/performance/monitor.js +217 -0
  132. package/dist/core/performance/monitor.js.map +7 -0
  133. package/dist/core/performance/optimized-frame-context.js +326 -0
  134. package/dist/core/performance/optimized-frame-context.js.map +7 -0
  135. package/dist/core/performance/performance-benchmark.js +269 -0
  136. package/dist/core/performance/performance-benchmark.js.map +7 -0
  137. package/dist/core/performance/performance-profiler.js +318 -0
  138. package/dist/core/performance/performance-profiler.js.map +7 -0
  139. package/dist/core/performance/streaming-jsonl-parser.js +187 -0
  140. package/dist/core/performance/streaming-jsonl-parser.js.map +7 -0
  141. package/dist/core/persistence/postgres-adapter.js +345 -0
  142. package/dist/core/persistence/postgres-adapter.js.map +7 -0
  143. package/dist/core/projects/project-manager.js +699 -0
  144. package/dist/core/projects/project-manager.js.map +7 -0
  145. package/dist/core/query/__tests__/query-parser.test.js +301 -0
  146. package/dist/core/query/__tests__/query-parser.test.js.map +7 -0
  147. package/dist/core/query/__tests__/query-templates.test.js +210 -0
  148. package/dist/core/query/__tests__/query-templates.test.js.map +7 -0
  149. package/dist/core/query/query-parser.js +366 -0
  150. package/dist/core/query/query-parser.js.map +7 -0
  151. package/dist/core/query/query-templates.js +317 -0
  152. package/dist/core/query/query-templates.js.map +7 -0
  153. package/dist/core/retrieval/index.js +4 -0
  154. package/dist/core/retrieval/index.js.map +7 -0
  155. package/dist/core/retrieval/llm-context-retrieval.js +577 -0
  156. package/dist/core/retrieval/llm-context-retrieval.js.map +7 -0
  157. package/dist/core/retrieval/summary-generator.js +585 -0
  158. package/dist/core/retrieval/summary-generator.js.map +7 -0
  159. package/dist/core/retrieval/types.js +17 -0
  160. package/dist/core/retrieval/types.js.map +7 -0
  161. package/dist/core/session/index.js +11 -0
  162. package/dist/core/session/index.js.map +7 -0
  163. package/dist/core/session/session-manager.js +297 -0
  164. package/dist/core/session/session-manager.js.map +7 -0
  165. package/dist/core/trace/cli-trace-wrapper.js +110 -0
  166. package/dist/core/trace/cli-trace-wrapper.js.map +7 -0
  167. package/dist/core/trace/db-trace-wrapper.js +215 -0
  168. package/dist/core/trace/db-trace-wrapper.js.map +7 -0
  169. package/dist/core/trace/debug-trace.js +385 -0
  170. package/dist/core/trace/debug-trace.js.map +7 -0
  171. package/dist/core/trace/index.js +158 -0
  172. package/dist/core/trace/index.js.map +7 -0
  173. package/dist/core/trace/linear-api-wrapper.js +169 -0
  174. package/dist/core/trace/linear-api-wrapper.js.map +7 -0
  175. package/dist/core/trace/trace-demo.js +135 -0
  176. package/dist/core/trace/trace-demo.js.map +7 -0
  177. package/dist/core/trace/trace-detector.demo.js +138 -0
  178. package/dist/core/trace/trace-detector.demo.js.map +7 -0
  179. package/dist/core/trace/trace-detector.js +386 -0
  180. package/dist/core/trace/trace-detector.js.map +7 -0
  181. package/dist/core/trace/trace-detector.test.js +401 -0
  182. package/dist/core/trace/trace-detector.test.js.map +7 -0
  183. package/dist/core/trace/trace-store.js +341 -0
  184. package/dist/core/trace/trace-store.js.map +7 -0
  185. package/dist/core/trace/types.js +73 -0
  186. package/dist/core/trace/types.js.map +7 -0
  187. package/dist/core/types.js +1 -0
  188. package/dist/core/types.js.map +7 -0
  189. package/dist/core/utils/update-checker.js +214 -0
  190. package/dist/core/utils/update-checker.js.map +7 -0
  191. package/dist/core/worktree/worktree-manager.js +450 -0
  192. package/dist/core/worktree/worktree-manager.js.map +7 -0
  193. package/dist/features/analytics/api/analytics-api.js +283 -0
  194. package/dist/features/analytics/api/analytics-api.js.map +7 -0
  195. package/dist/features/analytics/core/analytics-service.js +267 -0
  196. package/dist/features/analytics/core/analytics-service.js.map +7 -0
  197. package/dist/features/analytics/index.js +14 -0
  198. package/dist/features/analytics/index.js.map +7 -0
  199. package/dist/features/analytics/queries/metrics-queries.js +273 -0
  200. package/dist/features/analytics/queries/metrics-queries.js.map +7 -0
  201. package/dist/features/analytics/types/metrics.js +1 -0
  202. package/dist/features/analytics/types/metrics.js.map +7 -0
  203. package/dist/features/browser/browser-mcp.js +488 -0
  204. package/dist/features/browser/browser-mcp.js.map +7 -0
  205. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +747 -0
  206. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +7 -0
  207. package/dist/features/tasks/pebbles-task-store.js +647 -0
  208. package/dist/features/tasks/pebbles-task-store.js.map +7 -0
  209. package/dist/features/tasks/task-aware-context.js +406 -0
  210. package/dist/features/tasks/task-aware-context.js.map +7 -0
  211. package/dist/index.js +21 -0
  212. package/dist/index.js.map +7 -0
  213. package/dist/integrations/linear/__tests__/auth.test.js +558 -0
  214. package/dist/integrations/linear/__tests__/auth.test.js.map +7 -0
  215. package/dist/integrations/linear/__tests__/sync-service.test.js +760 -0
  216. package/dist/integrations/linear/__tests__/sync-service.test.js.map +7 -0
  217. package/dist/integrations/linear/auth.js +308 -0
  218. package/dist/integrations/linear/auth.js.map +7 -0
  219. package/dist/integrations/linear/auto-sync.js +244 -0
  220. package/dist/integrations/linear/auto-sync.js.map +7 -0
  221. package/dist/integrations/linear/client.js +448 -0
  222. package/dist/integrations/linear/client.js.map +7 -0
  223. package/dist/integrations/linear/config.js +115 -0
  224. package/dist/integrations/linear/config.js.map +7 -0
  225. package/dist/integrations/linear/sync-manager.js +233 -0
  226. package/dist/integrations/linear/sync-manager.js.map +7 -0
  227. package/dist/integrations/linear/sync-service.js +214 -0
  228. package/dist/integrations/linear/sync-service.js.map +7 -0
  229. package/dist/integrations/linear/sync.js +565 -0
  230. package/dist/integrations/linear/sync.js.map +7 -0
  231. package/dist/integrations/linear/types.js +1 -0
  232. package/dist/integrations/linear/types.js.map +7 -0
  233. package/dist/integrations/linear/webhook-server.js +204 -0
  234. package/dist/integrations/linear/webhook-server.js.map +7 -0
  235. package/dist/integrations/linear/webhook.js +269 -0
  236. package/dist/integrations/linear/webhook.js.map +7 -0
  237. package/dist/integrations/mcp/__tests__/server.test.js +798 -0
  238. package/dist/integrations/mcp/__tests__/server.test.js.map +7 -0
  239. package/dist/integrations/mcp/handlers/context-handlers.js +253 -0
  240. package/dist/integrations/mcp/handlers/context-handlers.js.map +7 -0
  241. package/dist/integrations/mcp/handlers/index.js +134 -0
  242. package/dist/integrations/mcp/handlers/index.js.map +7 -0
  243. package/dist/integrations/mcp/handlers/linear-handlers.js +243 -0
  244. package/dist/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  245. package/dist/integrations/mcp/handlers/task-handlers.js +235 -0
  246. package/dist/integrations/mcp/handlers/task-handlers.js.map +7 -0
  247. package/dist/integrations/mcp/handlers/trace-handlers.js +304 -0
  248. package/dist/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  249. package/dist/integrations/mcp/index.js +19 -0
  250. package/dist/integrations/mcp/index.js.map +7 -0
  251. package/dist/integrations/mcp/refactored-server.js +331 -0
  252. package/dist/integrations/mcp/refactored-server.js.map +7 -0
  253. package/dist/integrations/mcp/server.js +1621 -0
  254. package/dist/integrations/mcp/server.js.map +7 -0
  255. package/dist/integrations/mcp/tool-definitions.js +562 -0
  256. package/dist/integrations/mcp/tool-definitions.js.map +7 -0
  257. package/dist/integrations/mcp/trace-test.js +44 -0
  258. package/dist/integrations/mcp/trace-test.js.map +7 -0
  259. package/dist/integrations/pg-aiguide/embedding-provider.js +174 -0
  260. package/dist/integrations/pg-aiguide/embedding-provider.js.map +7 -0
  261. package/dist/integrations/pg-aiguide/semantic-search.js +183 -0
  262. package/dist/integrations/pg-aiguide/semantic-search.js.map +7 -0
  263. package/dist/integrations/pg-aiguide/timescale-analytics.js +220 -0
  264. package/dist/integrations/pg-aiguide/timescale-analytics.js.map +7 -0
  265. package/dist/mcp/stackmemory-mcp-server.js +550 -0
  266. package/dist/mcp/stackmemory-mcp-server.js.map +7 -0
  267. package/dist/middleware/exponential-rate-limiter.js +285 -0
  268. package/dist/middleware/exponential-rate-limiter.js.map +7 -0
  269. package/dist/models/user.model.js +351 -0
  270. package/dist/models/user.model.js.map +7 -0
  271. package/dist/scripts/benchmark-performance.d.ts +7 -0
  272. package/dist/scripts/benchmark-performance.d.ts.map +1 -0
  273. package/dist/scripts/benchmark-performance.js +44 -0
  274. package/dist/scripts/benchmark-performance.js.map +1 -0
  275. package/dist/scripts/cleanup-duplicate-tasks.d.ts +12 -0
  276. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +1 -0
  277. package/dist/scripts/cleanup-duplicate-tasks.js +215 -0
  278. package/dist/scripts/cleanup-duplicate-tasks.js.map +1 -0
  279. package/dist/servers/production/auth-middleware.js +513 -0
  280. package/dist/servers/production/auth-middleware.js.map +7 -0
  281. package/dist/servers/railway/index.js +390 -0
  282. package/dist/servers/railway/index.js.map +7 -0
  283. package/dist/services/config-service.js +62 -0
  284. package/dist/services/config-service.js.map +7 -0
  285. package/dist/services/context-service.js +191 -0
  286. package/dist/services/context-service.js.map +7 -0
  287. package/dist/src/agents/core/agent-task-manager.d.ts +154 -0
  288. package/dist/src/agents/core/agent-task-manager.d.ts.map +1 -0
  289. package/dist/src/agents/core/agent-task-manager.js +504 -0
  290. package/dist/src/agents/core/agent-task-manager.js.map +1 -0
  291. package/dist/src/agents/verifiers/base-verifier.d.ts +112 -0
  292. package/dist/src/agents/verifiers/base-verifier.d.ts.map +1 -0
  293. package/dist/src/agents/verifiers/base-verifier.js +130 -0
  294. package/dist/src/agents/verifiers/base-verifier.js.map +1 -0
  295. package/dist/src/agents/verifiers/formatter-verifier.d.ts +14 -0
  296. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +1 -0
  297. package/dist/src/agents/verifiers/formatter-verifier.js +107 -0
  298. package/dist/src/agents/verifiers/formatter-verifier.js.map +1 -0
  299. package/dist/src/agents/verifiers/llm-judge.d.ts +46 -0
  300. package/dist/src/agents/verifiers/llm-judge.d.ts.map +1 -0
  301. package/dist/src/agents/verifiers/llm-judge.js +248 -0
  302. package/dist/src/agents/verifiers/llm-judge.js.map +1 -0
  303. package/dist/src/cli/claude-sm.js +55 -0
  304. package/dist/src/cli/claude-sm.js.map +1 -1
  305. package/dist/src/cli/commands/agent.d.ts +9 -0
  306. package/dist/src/cli/commands/agent.d.ts.map +1 -0
  307. package/dist/src/cli/commands/agent.js +303 -0
  308. package/dist/src/cli/commands/agent.js.map +1 -0
  309. package/dist/src/cli/commands/handoff.d.ts +6 -0
  310. package/dist/src/cli/commands/handoff.d.ts.map +1 -0
  311. package/dist/src/cli/commands/handoff.js +212 -0
  312. package/dist/src/cli/commands/handoff.js.map +1 -0
  313. package/dist/src/cli/index.d.ts.map +1 -1
  314. package/dist/src/cli/index.js +4 -0
  315. package/dist/src/cli/index.js.map +1 -1
  316. package/dist/src/core/context/compaction-handler.d.ts.map +1 -1
  317. package/dist/src/core/context/compaction-handler.js +1 -1
  318. package/dist/src/core/context/compaction-handler.js.map +1 -1
  319. package/dist/src/core/context/frame-database.d.ts +59 -0
  320. package/dist/src/core/context/frame-database.d.ts.map +1 -0
  321. package/dist/src/core/context/frame-database.js +333 -0
  322. package/dist/src/core/context/frame-database.js.map +1 -0
  323. package/dist/src/core/context/frame-digest.d.ts +59 -0
  324. package/dist/src/core/context/frame-digest.d.ts.map +1 -0
  325. package/dist/src/core/context/frame-digest.js +264 -0
  326. package/dist/src/core/context/frame-digest.js.map +1 -0
  327. package/dist/src/core/context/frame-manager.d.ts +2 -0
  328. package/dist/src/core/context/frame-manager.d.ts.map +1 -1
  329. package/dist/src/core/context/frame-manager.js +7 -0
  330. package/dist/src/core/context/frame-manager.js.map +1 -1
  331. package/dist/src/core/context/frame-stack.d.ts +85 -0
  332. package/dist/src/core/context/frame-stack.d.ts.map +1 -0
  333. package/dist/src/core/context/frame-stack.js +287 -0
  334. package/dist/src/core/context/frame-stack.js.map +1 -0
  335. package/dist/src/core/context/frame-types.d.ts +67 -0
  336. package/dist/src/core/context/frame-types.d.ts.map +1 -0
  337. package/dist/src/core/context/frame-types.js +6 -0
  338. package/dist/src/core/context/frame-types.js.map +1 -0
  339. package/dist/src/core/context/index.d.ts +11 -0
  340. package/dist/src/core/context/index.d.ts.map +1 -0
  341. package/dist/src/core/context/index.js +14 -0
  342. package/dist/src/core/context/index.js.map +1 -0
  343. package/dist/src/core/context/refactored-frame-manager.d.ts +99 -0
  344. package/dist/src/core/context/refactored-frame-manager.d.ts.map +1 -0
  345. package/dist/src/core/context/refactored-frame-manager.js +340 -0
  346. package/dist/src/core/context/refactored-frame-manager.js.map +1 -0
  347. package/dist/src/core/database/batch-operations.d.ts +118 -0
  348. package/dist/src/core/database/batch-operations.d.ts.map +1 -0
  349. package/dist/src/core/database/batch-operations.js +339 -0
  350. package/dist/src/core/database/batch-operations.js.map +1 -0
  351. package/dist/src/core/database/connection-pool.d.ts +79 -0
  352. package/dist/src/core/database/connection-pool.d.ts.map +1 -0
  353. package/dist/src/core/database/connection-pool.js +236 -0
  354. package/dist/src/core/database/connection-pool.js.map +1 -0
  355. package/dist/src/core/database/query-cache.d.ts +135 -0
  356. package/dist/src/core/database/query-cache.d.ts.map +1 -0
  357. package/dist/src/core/database/query-cache.js +294 -0
  358. package/dist/src/core/database/query-cache.js.map +1 -0
  359. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +125 -0
  360. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +1 -0
  361. package/dist/src/core/digest/enhanced-hybrid-digest.js +282 -0
  362. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +1 -0
  363. package/dist/src/core/digest/frame-digest-integration.d.ts +67 -0
  364. package/dist/src/core/digest/frame-digest-integration.d.ts.map +1 -0
  365. package/dist/src/core/digest/frame-digest-integration.js +198 -0
  366. package/dist/src/core/digest/frame-digest-integration.js.map +1 -0
  367. package/dist/src/core/digest/hybrid-digest-generator.d.ts +76 -0
  368. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -0
  369. package/dist/src/core/digest/hybrid-digest-generator.js +629 -0
  370. package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -0
  371. package/dist/src/core/digest/index.d.ts +9 -0
  372. package/dist/src/core/digest/index.d.ts.map +1 -0
  373. package/dist/src/core/digest/index.js +9 -0
  374. package/dist/src/core/digest/index.js.map +1 -0
  375. package/dist/src/core/digest/types.d.ts +154 -0
  376. package/dist/src/core/digest/types.d.ts.map +1 -0
  377. package/dist/src/core/digest/types.js +18 -0
  378. package/dist/src/core/digest/types.js.map +1 -0
  379. package/dist/src/core/errors/index.d.ts +13 -5
  380. package/dist/src/core/errors/index.d.ts.map +1 -1
  381. package/dist/src/core/errors/index.js +13 -5
  382. package/dist/src/core/errors/index.js.map +1 -1
  383. package/dist/src/core/merge/conflict-detector.d.ts +122 -0
  384. package/dist/src/core/merge/conflict-detector.d.ts.map +1 -0
  385. package/dist/src/core/merge/conflict-detector.js +468 -0
  386. package/dist/src/core/merge/conflict-detector.js.map +1 -0
  387. package/dist/src/core/merge/index.d.ts +9 -0
  388. package/dist/src/core/merge/index.d.ts.map +1 -0
  389. package/dist/src/core/merge/index.js +9 -0
  390. package/dist/src/core/merge/index.js.map +1 -0
  391. package/dist/src/core/merge/resolution-engine.d.ts +120 -0
  392. package/dist/src/core/merge/resolution-engine.d.ts.map +1 -0
  393. package/dist/src/core/merge/resolution-engine.js +573 -0
  394. package/dist/src/core/merge/resolution-engine.js.map +1 -0
  395. package/dist/src/core/merge/stack-diff.d.ts +97 -0
  396. package/dist/src/core/merge/stack-diff.d.ts.map +1 -0
  397. package/dist/src/core/merge/stack-diff.js +516 -0
  398. package/dist/src/core/merge/stack-diff.js.map +1 -0
  399. package/dist/src/core/merge/types.d.ts +110 -0
  400. package/dist/src/core/merge/types.d.ts.map +1 -0
  401. package/dist/src/core/merge/types.js +6 -0
  402. package/dist/src/core/merge/types.js.map +1 -0
  403. package/dist/src/core/monitoring/logger.d.ts +2 -2
  404. package/dist/src/core/monitoring/logger.d.ts.map +1 -1
  405. package/dist/src/core/monitoring/logger.js +10 -5
  406. package/dist/src/core/monitoring/logger.js.map +1 -1
  407. package/dist/src/core/monitoring/metrics.d.ts +3 -0
  408. package/dist/src/core/monitoring/metrics.d.ts.map +1 -1
  409. package/dist/src/core/monitoring/metrics.js +142 -3
  410. package/dist/src/core/monitoring/metrics.js.map +1 -1
  411. package/dist/src/core/performance/context-cache.d.ts +109 -0
  412. package/dist/src/core/performance/context-cache.d.ts.map +1 -0
  413. package/dist/src/core/performance/context-cache.js +280 -0
  414. package/dist/src/core/performance/context-cache.js.map +1 -0
  415. package/dist/src/core/performance/index.d.ts +3 -0
  416. package/dist/src/core/performance/index.d.ts.map +1 -0
  417. package/dist/src/core/performance/index.js +3 -0
  418. package/dist/src/core/performance/index.js.map +1 -0
  419. package/dist/src/core/performance/lazy-context-loader.d.ts +93 -0
  420. package/dist/src/core/performance/lazy-context-loader.d.ts.map +1 -0
  421. package/dist/src/core/performance/lazy-context-loader.js +332 -0
  422. package/dist/src/core/performance/lazy-context-loader.js.map +1 -0
  423. package/dist/src/core/performance/monitor.d.ts +48 -0
  424. package/dist/src/core/performance/monitor.d.ts.map +1 -0
  425. package/dist/src/core/performance/monitor.js +226 -0
  426. package/dist/src/core/performance/monitor.js.map +1 -0
  427. package/dist/src/core/performance/optimized-frame-context.d.ts +74 -0
  428. package/dist/src/core/performance/optimized-frame-context.d.ts.map +1 -0
  429. package/dist/src/core/performance/optimized-frame-context.js +330 -0
  430. package/dist/src/core/performance/optimized-frame-context.js.map +1 -0
  431. package/dist/src/core/performance/performance-benchmark.d.ts +50 -0
  432. package/dist/src/core/performance/performance-benchmark.d.ts.map +1 -0
  433. package/dist/src/core/performance/performance-benchmark.js +290 -0
  434. package/dist/src/core/performance/performance-benchmark.js.map +1 -0
  435. package/dist/src/core/performance/performance-profiler.d.ts +151 -0
  436. package/dist/src/core/performance/performance-profiler.d.ts.map +1 -0
  437. package/dist/src/core/performance/performance-profiler.js +346 -0
  438. package/dist/src/core/performance/performance-profiler.js.map +1 -0
  439. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +41 -0
  440. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +1 -0
  441. package/dist/src/core/performance/streaming-jsonl-parser.js +193 -0
  442. package/dist/src/core/performance/streaming-jsonl-parser.js.map +1 -0
  443. package/dist/src/core/persistence/postgres-adapter.d.ts +31 -0
  444. package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -0
  445. package/dist/src/core/persistence/postgres-adapter.js +330 -0
  446. package/dist/src/core/persistence/postgres-adapter.js.map +1 -0
  447. package/dist/src/core/query/query-parser.d.ts +5 -0
  448. package/dist/src/core/query/query-parser.d.ts.map +1 -1
  449. package/dist/src/core/query/query-parser.js +86 -18
  450. package/dist/src/core/query/query-parser.js.map +1 -1
  451. package/dist/src/core/query/query-templates.d.ts +44 -0
  452. package/dist/src/core/query/query-templates.d.ts.map +1 -0
  453. package/dist/src/core/query/query-templates.js +326 -0
  454. package/dist/src/core/query/query-templates.js.map +1 -0
  455. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +5 -3
  456. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -1
  457. package/dist/src/core/retrieval/llm-context-retrieval.js +73 -21
  458. package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -1
  459. package/dist/src/core/trace/cli-trace-wrapper.d.ts +23 -0
  460. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +1 -0
  461. package/dist/src/core/trace/cli-trace-wrapper.js +141 -0
  462. package/dist/src/core/trace/cli-trace-wrapper.js.map +1 -0
  463. package/dist/src/core/trace/db-trace-wrapper.d.ts +36 -0
  464. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +1 -0
  465. package/dist/src/core/trace/db-trace-wrapper.js +252 -0
  466. package/dist/src/core/trace/db-trace-wrapper.js.map +1 -0
  467. package/dist/src/core/trace/debug-trace.d.ts +84 -0
  468. package/dist/src/core/trace/debug-trace.d.ts.map +1 -0
  469. package/dist/src/core/trace/debug-trace.js +402 -0
  470. package/dist/src/core/trace/debug-trace.js.map +1 -0
  471. package/dist/src/core/trace/error-test.d.ts +6 -0
  472. package/dist/src/core/trace/error-test.d.ts.map +1 -0
  473. package/dist/src/core/trace/error-test.js +128 -0
  474. package/dist/src/core/trace/error-test.js.map +1 -0
  475. package/dist/src/core/trace/index.d.ts +25 -0
  476. package/dist/src/core/trace/index.d.ts.map +1 -0
  477. package/dist/src/core/trace/index.js +121 -0
  478. package/dist/src/core/trace/index.js.map +1 -0
  479. package/dist/src/core/trace/linear-api-wrapper.d.ts +17 -0
  480. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +1 -0
  481. package/dist/src/core/trace/linear-api-wrapper.js +205 -0
  482. package/dist/src/core/trace/linear-api-wrapper.js.map +1 -0
  483. package/dist/src/core/trace/performance-test.d.ts +6 -0
  484. package/dist/src/core/trace/performance-test.d.ts.map +1 -0
  485. package/dist/src/core/trace/performance-test.js +111 -0
  486. package/dist/src/core/trace/performance-test.js.map +1 -0
  487. package/dist/src/core/trace/trace-demo.d.ts +8 -0
  488. package/dist/src/core/trace/trace-demo.d.ts.map +1 -0
  489. package/dist/src/core/trace/trace-demo.js +154 -0
  490. package/dist/src/core/trace/trace-demo.js.map +1 -0
  491. package/dist/src/core/trace/trace-detector.d.ts +2 -2
  492. package/dist/src/core/trace/trace-detector.d.ts.map +1 -1
  493. package/dist/src/core/trace/trace-detector.demo.js +6 -6
  494. package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
  495. package/dist/src/core/trace/trace-detector.js +3 -3
  496. package/dist/src/core/trace/trace-detector.js.map +1 -1
  497. package/dist/src/core/types.d.ts +35 -0
  498. package/dist/src/core/types.d.ts.map +1 -0
  499. package/dist/src/core/types.js +2 -0
  500. package/dist/src/core/types.js.map +1 -0
  501. package/dist/src/features/tasks/pebbles-task-store.d.ts +9 -2
  502. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
  503. package/dist/src/features/tasks/pebbles-task-store.js +97 -18
  504. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
  505. package/dist/src/integrations/linear/auth.d.ts.map +1 -1
  506. package/dist/src/integrations/linear/auth.js.map +1 -1
  507. package/dist/src/integrations/linear/client.d.ts +15 -1
  508. package/dist/src/integrations/linear/client.d.ts.map +1 -1
  509. package/dist/src/integrations/linear/client.js +85 -3
  510. package/dist/src/integrations/linear/client.js.map +1 -1
  511. package/dist/src/integrations/linear/sync-manager.d.ts +2 -0
  512. package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -1
  513. package/dist/src/integrations/linear/sync-manager.js +16 -4
  514. package/dist/src/integrations/linear/sync-manager.js.map +1 -1
  515. package/dist/src/integrations/linear/sync-service.d.ts +23 -2
  516. package/dist/src/integrations/linear/sync-service.d.ts.map +1 -1
  517. package/dist/src/integrations/linear/sync-service.js +44 -25
  518. package/dist/src/integrations/linear/sync-service.js.map +1 -1
  519. package/dist/src/integrations/linear/sync.d.ts +6 -0
  520. package/dist/src/integrations/linear/sync.d.ts.map +1 -1
  521. package/dist/src/integrations/linear/sync.js +27 -2
  522. package/dist/src/integrations/linear/sync.js.map +1 -1
  523. package/dist/src/integrations/linear/types.d.ts +16 -1
  524. package/dist/src/integrations/linear/types.d.ts.map +1 -1
  525. package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -1
  526. package/dist/src/integrations/linear/webhook-server.js +10 -8
  527. package/dist/src/integrations/linear/webhook-server.js.map +1 -1
  528. package/dist/src/integrations/linear/webhook.d.ts +13 -0
  529. package/dist/src/integrations/linear/webhook.d.ts.map +1 -1
  530. package/dist/src/integrations/linear/webhook.js +101 -14
  531. package/dist/src/integrations/linear/webhook.js.map +1 -1
  532. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +39 -0
  533. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +1 -0
  534. package/dist/src/integrations/mcp/handlers/context-handlers.js +266 -0
  535. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +1 -0
  536. package/dist/src/integrations/mcp/handlers/index.d.ts +37 -0
  537. package/dist/src/integrations/mcp/handlers/index.d.ts.map +1 -0
  538. package/dist/src/integrations/mcp/handlers/index.js +134 -0
  539. package/dist/src/integrations/mcp/handlers/index.js.map +1 -0
  540. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +33 -0
  541. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +1 -0
  542. package/dist/src/integrations/mcp/handlers/linear-handlers.js +251 -0
  543. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +1 -0
  544. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +42 -0
  545. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +1 -0
  546. package/dist/src/integrations/mcp/handlers/task-handlers.js +238 -0
  547. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +1 -0
  548. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +41 -0
  549. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +1 -0
  550. package/dist/src/integrations/mcp/handlers/trace-handlers.js +298 -0
  551. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +1 -0
  552. package/dist/src/integrations/mcp/index.d.ts +13 -0
  553. package/dist/src/integrations/mcp/index.d.ts.map +1 -0
  554. package/dist/src/integrations/mcp/index.js +17 -0
  555. package/dist/src/integrations/mcp/index.js.map +1 -0
  556. package/dist/src/integrations/mcp/refactored-server.d.ts +76 -0
  557. package/dist/src/integrations/mcp/refactored-server.d.ts.map +1 -0
  558. package/dist/src/integrations/mcp/refactored-server.js +351 -0
  559. package/dist/src/integrations/mcp/refactored-server.js.map +1 -0
  560. package/dist/src/integrations/mcp/server.js +2 -2
  561. package/dist/src/integrations/mcp/server.js.map +1 -1
  562. package/dist/src/integrations/mcp/tool-definitions.d.ts +44 -0
  563. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +1 -0
  564. package/dist/src/integrations/mcp/tool-definitions.js +563 -0
  565. package/dist/src/integrations/mcp/tool-definitions.js.map +1 -0
  566. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +48 -0
  567. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +1 -0
  568. package/dist/src/integrations/pg-aiguide/embedding-provider.js +190 -0
  569. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +1 -0
  570. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +34 -0
  571. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -0
  572. package/dist/src/integrations/pg-aiguide/semantic-search.js +176 -0
  573. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -0
  574. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +44 -0
  575. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +1 -0
  576. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +215 -0
  577. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +1 -0
  578. package/dist/src/mcp/stackmemory-mcp-server.d.ts +9 -0
  579. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +1 -0
  580. package/dist/src/mcp/stackmemory-mcp-server.js +519 -0
  581. package/dist/src/mcp/stackmemory-mcp-server.js.map +1 -0
  582. package/dist/src/middleware/exponential-rate-limiter.d.ts +78 -0
  583. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +1 -0
  584. package/dist/src/middleware/exponential-rate-limiter.js +293 -0
  585. package/dist/src/middleware/exponential-rate-limiter.js.map +1 -0
  586. package/dist/src/models/user.model.d.ts +62 -0
  587. package/dist/src/models/user.model.d.ts.map +1 -0
  588. package/dist/src/models/user.model.js +311 -0
  589. package/dist/src/models/user.model.js.map +1 -0
  590. package/dist/src/servers/production/auth-middleware.d.ts +12 -2
  591. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
  592. package/dist/src/servers/production/auth-middleware.js +240 -28
  593. package/dist/src/servers/production/auth-middleware.js.map +1 -1
  594. package/dist/src/servers/railway/index.js.map +1 -1
  595. package/dist/src/services/context-service.d.ts.map +1 -1
  596. package/dist/src/services/context-service.js +86 -1
  597. package/dist/src/services/context-service.js.map +1 -1
  598. package/dist/src/validation/schemas.d.ts +633 -0
  599. package/dist/src/validation/schemas.d.ts.map +1 -0
  600. package/dist/src/validation/schemas.js +347 -0
  601. package/dist/src/validation/schemas.js.map +1 -0
  602. package/dist/types/task.js +1 -0
  603. package/dist/types/task.js.map +7 -0
  604. package/dist/utils/logger.js +52 -0
  605. package/dist/utils/logger.js.map +7 -0
  606. package/dist/validation/schemas.js +218 -0
  607. package/dist/validation/schemas.js.map +7 -0
  608. package/package.json +12 -3
@@ -0,0 +1,699 @@
1
+ import { execSync } from "child_process";
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
3
+ import { join, basename, dirname } from "path";
4
+ import { homedir } from "os";
5
+ import Database from "better-sqlite3";
6
+ import { logger } from "../monitoring/logger.js";
7
+ import {
8
+ DatabaseError,
9
+ ProjectError,
10
+ ErrorCode,
11
+ createErrorHandler
12
+ } from "../errors/index.js";
13
+ import { retry } from "../errors/recovery.js";
14
+ class ProjectManager {
15
+ static instance;
16
+ db;
17
+ configPath;
18
+ organizations = /* @__PURE__ */ new Map();
19
+ projectCache = /* @__PURE__ */ new Map();
20
+ currentProject;
21
+ constructor() {
22
+ this.configPath = join(homedir(), ".stackmemory");
23
+ this.ensureDirectoryStructure();
24
+ this.initializeDatabase();
25
+ this.loadOrganizations();
26
+ this.autoDiscoverOrganizations();
27
+ }
28
+ static getInstance() {
29
+ if (!ProjectManager.instance) {
30
+ ProjectManager.instance = new ProjectManager();
31
+ }
32
+ return ProjectManager.instance;
33
+ }
34
+ /**
35
+ * Auto-detect project from current directory
36
+ */
37
+ async detectProject(projectPath) {
38
+ const path = projectPath || process.cwd();
39
+ const errorHandler = createErrorHandler({
40
+ operation: "detectProject",
41
+ projectPath: path
42
+ });
43
+ try {
44
+ const cached = this.projectCache.get(path);
45
+ if (cached && this.isCacheValid(cached)) {
46
+ return cached;
47
+ }
48
+ const project = await this.analyzeProject(path);
49
+ if (project.gitRemote) {
50
+ project.organization = this.extractOrganization(project.gitRemote);
51
+ project.accountType = this.determineAccountType(
52
+ project.gitRemote,
53
+ project.organization
54
+ );
55
+ project.isPrivate = this.isPrivateRepo(project.gitRemote);
56
+ }
57
+ project.primaryLanguage = this.detectPrimaryLanguage(path);
58
+ project.framework = this.detectFramework(path);
59
+ await retry(
60
+ () => Promise.resolve(this.saveProject(project)),
61
+ {
62
+ maxAttempts: 3,
63
+ initialDelay: 100,
64
+ onRetry: (attempt, error) => {
65
+ logger.warn(`Retrying project save (attempt ${attempt})`, {
66
+ projectId: project.id,
67
+ error: error instanceof Error ? error.message : String(error)
68
+ });
69
+ }
70
+ }
71
+ );
72
+ this.projectCache.set(path, project);
73
+ this.currentProject = project;
74
+ logger.info("Project auto-detected", {
75
+ id: project.id,
76
+ org: project.organization,
77
+ type: project.accountType
78
+ });
79
+ return project;
80
+ } catch (error) {
81
+ const wrappedError = errorHandler(error, {
82
+ projectPath: path,
83
+ operation: "detectProject"
84
+ });
85
+ throw new ProjectError(
86
+ `Failed to detect project at path: ${path}`,
87
+ ErrorCode.PROJECT_INVALID_PATH,
88
+ {
89
+ projectPath: path,
90
+ operation: "detectProject"
91
+ }
92
+ );
93
+ }
94
+ }
95
+ /**
96
+ * Analyze project directory
97
+ */
98
+ async analyzeProject(projectPath) {
99
+ const gitInfo = this.getGitInfo(projectPath);
100
+ const projectName = gitInfo.name || basename(projectPath);
101
+ return {
102
+ id: this.generateProjectId(gitInfo.remote || projectPath),
103
+ name: projectName,
104
+ path: projectPath,
105
+ gitRemote: gitInfo.remote,
106
+ organization: void 0,
107
+ accountType: "personal",
108
+ isPrivate: false,
109
+ lastAccessed: /* @__PURE__ */ new Date(),
110
+ metadata: {
111
+ branch: gitInfo.branch,
112
+ lastCommit: gitInfo.lastCommit,
113
+ isDirty: gitInfo.isDirty
114
+ }
115
+ };
116
+ }
117
+ /**
118
+ * Extract Git information
119
+ */
120
+ getGitInfo(projectPath) {
121
+ const info = {};
122
+ const errorHandler = createErrorHandler({
123
+ operation: "getGitInfo",
124
+ projectPath
125
+ });
126
+ try {
127
+ info.remote = execSync("git config --get remote.origin.url", {
128
+ cwd: projectPath,
129
+ encoding: "utf-8",
130
+ timeout: 5e3
131
+ // 5 second timeout
132
+ }).trim();
133
+ info.branch = execSync("git branch --show-current", {
134
+ cwd: projectPath,
135
+ encoding: "utf-8",
136
+ timeout: 5e3
137
+ }).trim();
138
+ info.lastCommit = execSync("git log -1 --format=%H", {
139
+ cwd: projectPath,
140
+ encoding: "utf-8",
141
+ timeout: 5e3
142
+ }).trim();
143
+ const status = execSync("git status --porcelain", {
144
+ cwd: projectPath,
145
+ encoding: "utf-8",
146
+ timeout: 5e3
147
+ });
148
+ info.isDirty = status.length > 0;
149
+ const match = info.remote.match(/\/([^\/]+?)(\.git)?$/);
150
+ info.name = match ? match[1] : basename(projectPath);
151
+ } catch (error) {
152
+ logger.debug("Git info extraction failed, using directory name", {
153
+ projectPath,
154
+ error: error instanceof Error ? error.message : String(error)
155
+ });
156
+ info.name = basename(projectPath);
157
+ }
158
+ return info;
159
+ }
160
+ /**
161
+ * Extract organization from Git remote
162
+ */
163
+ extractOrganization(gitRemote) {
164
+ const githubMatch = gitRemote.match(/github\.com[:/]([^/]+)\//);
165
+ if (githubMatch) return githubMatch[1];
166
+ const gitlabMatch = gitRemote.match(/gitlab\.com[:/]([^/]+)\//);
167
+ if (gitlabMatch) return gitlabMatch[1];
168
+ const bitbucketMatch = gitRemote.match(/bitbucket\.org[:/]([^/]+)\//);
169
+ if (bitbucketMatch) return bitbucketMatch[1];
170
+ const customMatch = gitRemote.match(/@([^:]+)[:/]([^/]+)\//);
171
+ if (customMatch) return customMatch[2];
172
+ return "unknown";
173
+ }
174
+ /**
175
+ * Determine account type based on patterns
176
+ */
177
+ determineAccountType(gitRemote, organization) {
178
+ for (const [, org] of this.organizations) {
179
+ if (org.githubOrgs.includes(organization || "")) {
180
+ return org.accountType;
181
+ }
182
+ for (const domain of org.domains) {
183
+ if (gitRemote.includes(domain)) {
184
+ return org.accountType;
185
+ }
186
+ }
187
+ }
188
+ if (organization) {
189
+ if (organization.includes("corp") || organization.includes("company") || organization.includes("team") || organization.includes("work")) {
190
+ return "work";
191
+ }
192
+ if (organization.includes("apache") || organization.includes("mozilla") || organization.includes("foundation") || gitRemote.includes("gitlab.freedesktop")) {
193
+ return "opensource";
194
+ }
195
+ const username = this.getCurrentGitUser();
196
+ if (username && organization.toLowerCase() === username.toLowerCase()) {
197
+ return "personal";
198
+ }
199
+ }
200
+ if (this.isPrivateRepo(gitRemote)) {
201
+ const currentPath = process.cwd();
202
+ if (currentPath.includes("/work/") || currentPath.includes("/Work/") || currentPath.includes("/company/") || currentPath.includes("/job/")) {
203
+ return "work";
204
+ }
205
+ }
206
+ return "personal";
207
+ }
208
+ /**
209
+ * Check if repository is private
210
+ */
211
+ isPrivateRepo(gitRemote) {
212
+ if (gitRemote.startsWith("git@")) {
213
+ return true;
214
+ }
215
+ if (gitRemote.includes("@")) {
216
+ return true;
217
+ }
218
+ return false;
219
+ }
220
+ /**
221
+ * Detect primary programming language
222
+ */
223
+ detectPrimaryLanguage(projectPath) {
224
+ const checks = [
225
+ { file: "package.json", language: "JavaScript/TypeScript" },
226
+ { file: "Cargo.toml", language: "Rust" },
227
+ { file: "go.mod", language: "Go" },
228
+ { file: "pom.xml", language: "Java" },
229
+ { file: "requirements.txt", language: "Python" },
230
+ { file: "Gemfile", language: "Ruby" },
231
+ { file: "composer.json", language: "PHP" },
232
+ { file: "*.csproj", language: "C#" },
233
+ { file: "Podfile", language: "Swift/Objective-C" }
234
+ ];
235
+ for (const check of checks) {
236
+ if (check.file.includes("*")) {
237
+ try {
238
+ const files = execSync(
239
+ `find ${projectPath} -maxdepth 2 -name "${check.file}" 2>/dev/null`,
240
+ {
241
+ encoding: "utf-8"
242
+ }
243
+ );
244
+ if (files.trim()) return check.language;
245
+ } catch {
246
+ }
247
+ } else if (existsSync(join(projectPath, check.file))) {
248
+ return check.language;
249
+ }
250
+ }
251
+ return void 0;
252
+ }
253
+ /**
254
+ * Detect framework
255
+ */
256
+ detectFramework(projectPath) {
257
+ const packageJsonPath = join(projectPath, "package.json");
258
+ if (existsSync(packageJsonPath)) {
259
+ try {
260
+ const pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
261
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
262
+ if (deps["next"]) return "Next.js";
263
+ if (deps["react"]) return "React";
264
+ if (deps["vue"]) return "Vue";
265
+ if (deps["@angular/core"]) return "Angular";
266
+ if (deps["express"]) return "Express";
267
+ if (deps["fastify"]) return "Fastify";
268
+ if (deps["@nestjs/core"]) return "NestJS";
269
+ } catch {
270
+ }
271
+ }
272
+ if (existsSync(join(projectPath, "Cargo.toml"))) {
273
+ const cargo = readFileSync(join(projectPath, "Cargo.toml"), "utf-8");
274
+ if (cargo.includes("actix-web")) return "Actix";
275
+ if (cargo.includes("rocket")) return "Rocket";
276
+ }
277
+ return void 0;
278
+ }
279
+ /**
280
+ * Get current Git user
281
+ */
282
+ getCurrentGitUser() {
283
+ try {
284
+ const email = execSync("git config --global user.email", {
285
+ encoding: "utf-8"
286
+ }).trim();
287
+ const username = email.split("@")[0];
288
+ return username;
289
+ } catch {
290
+ return void 0;
291
+ }
292
+ }
293
+ /**
294
+ * Generate unique project ID
295
+ */
296
+ generateProjectId(identifier) {
297
+ const cleaned = identifier.replace(/\.git$/, "").replace(/[^a-zA-Z0-9-]/g, "-").toLowerCase();
298
+ return cleaned.substring(cleaned.length - 50);
299
+ }
300
+ /**
301
+ * Initialize database
302
+ */
303
+ initializeDatabase() {
304
+ const dbPath = join(this.configPath, "projects.db");
305
+ const errorHandler = createErrorHandler({
306
+ operation: "initializeDatabase",
307
+ dbPath
308
+ });
309
+ try {
310
+ this.db = new Database(dbPath);
311
+ this.db.exec(`
312
+ CREATE TABLE IF NOT EXISTS projects (
313
+ id TEXT PRIMARY KEY,
314
+ name TEXT NOT NULL,
315
+ path TEXT NOT NULL UNIQUE,
316
+ git_remote TEXT,
317
+ organization TEXT,
318
+ account_type TEXT,
319
+ is_private BOOLEAN,
320
+ primary_language TEXT,
321
+ framework TEXT,
322
+ last_accessed DATETIME,
323
+ metadata JSON,
324
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
325
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
326
+ );
327
+
328
+ CREATE TABLE IF NOT EXISTS organizations (
329
+ name TEXT PRIMARY KEY,
330
+ type TEXT,
331
+ account_type TEXT,
332
+ config JSON,
333
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
334
+ );
335
+
336
+ CREATE TABLE IF NOT EXISTS project_contexts (
337
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
338
+ project_id TEXT NOT NULL,
339
+ context_type TEXT,
340
+ content TEXT,
341
+ metadata JSON,
342
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
343
+ FOREIGN KEY (project_id) REFERENCES projects(id)
344
+ );
345
+
346
+ CREATE INDEX IF NOT EXISTS idx_projects_org ON projects(organization);
347
+ CREATE INDEX IF NOT EXISTS idx_projects_type ON projects(account_type);
348
+ CREATE INDEX IF NOT EXISTS idx_contexts_project ON project_contexts(project_id);
349
+ `);
350
+ } catch (error) {
351
+ const dbError = errorHandler(error, {
352
+ dbPath,
353
+ operation: "initializeDatabase"
354
+ });
355
+ throw new DatabaseError(
356
+ "Failed to initialize projects database",
357
+ ErrorCode.DB_MIGRATION_FAILED,
358
+ {
359
+ dbPath,
360
+ configPath: this.configPath,
361
+ operation: "initializeDatabase"
362
+ },
363
+ error instanceof Error ? error : void 0
364
+ );
365
+ }
366
+ }
367
+ /**
368
+ * Save project to database
369
+ */
370
+ saveProject(project) {
371
+ try {
372
+ const stmt = this.db.prepare(`
373
+ INSERT OR REPLACE INTO projects
374
+ (id, name, path, git_remote, organization, account_type, is_private,
375
+ primary_language, framework, last_accessed, metadata, updated_at)
376
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
377
+ `);
378
+ stmt.run(
379
+ project.id,
380
+ project.name,
381
+ project.path,
382
+ project.gitRemote,
383
+ project.organization,
384
+ project.accountType,
385
+ project.isPrivate ? 1 : 0,
386
+ project.primaryLanguage,
387
+ project.framework,
388
+ project.lastAccessed.toISOString(),
389
+ JSON.stringify(project.metadata)
390
+ );
391
+ } catch (error) {
392
+ throw new DatabaseError(
393
+ `Failed to save project: ${project.name}`,
394
+ ErrorCode.DB_QUERY_FAILED,
395
+ {
396
+ projectId: project.id,
397
+ projectName: project.name,
398
+ projectPath: project.path,
399
+ operation: "saveProject"
400
+ },
401
+ error instanceof Error ? error : void 0
402
+ );
403
+ }
404
+ }
405
+ /**
406
+ * Load organizations configuration
407
+ */
408
+ loadOrganizations() {
409
+ const configFile = join(this.configPath, "organizations.json");
410
+ if (existsSync(configFile)) {
411
+ try {
412
+ const config = JSON.parse(readFileSync(configFile, "utf-8"));
413
+ for (const org of config.organizations || []) {
414
+ this.organizations.set(org.name, org);
415
+ }
416
+ } catch (error) {
417
+ logger.error(
418
+ "Failed to load organizations config",
419
+ error instanceof Error ? error : void 0
420
+ );
421
+ }
422
+ }
423
+ }
424
+ /**
425
+ * Auto-discover organizations from existing projects
426
+ */
427
+ autoDiscoverOrganizations() {
428
+ const errorHandler = createErrorHandler({
429
+ operation: "autoDiscoverOrganizations"
430
+ });
431
+ try {
432
+ const stmt = this.db.prepare(`
433
+ SELECT DISTINCT organization, account_type, COUNT(*) as project_count
434
+ FROM projects
435
+ WHERE organization IS NOT NULL
436
+ GROUP BY organization, account_type
437
+ `);
438
+ const orgs = stmt.all();
439
+ for (const org of orgs) {
440
+ if (!this.organizations.has(org.organization)) {
441
+ this.organizations.set(org.organization, {
442
+ name: org.organization,
443
+ type: org.account_type === "work" ? "company" : "personal",
444
+ domains: [],
445
+ githubOrgs: [org.organization],
446
+ accountType: org.account_type,
447
+ autoPatterns: []
448
+ });
449
+ }
450
+ }
451
+ } catch (error) {
452
+ const wrappedError = errorHandler(error, {
453
+ operation: "autoDiscoverOrganizations"
454
+ });
455
+ logger.error(
456
+ "Failed to auto-discover organizations",
457
+ error instanceof Error ? error : new Error(String(error)),
458
+ {
459
+ operation: "autoDiscoverOrganizations"
460
+ }
461
+ );
462
+ }
463
+ }
464
+ /**
465
+ * Ensure directory structure exists
466
+ */
467
+ ensureDirectoryStructure() {
468
+ const dirs = [
469
+ this.configPath,
470
+ join(this.configPath, "accounts"),
471
+ join(this.configPath, "accounts", "personal"),
472
+ join(this.configPath, "accounts", "work"),
473
+ join(this.configPath, "accounts", "opensource"),
474
+ join(this.configPath, "accounts", "client"),
475
+ join(this.configPath, "contexts"),
476
+ join(this.configPath, "patterns")
477
+ ];
478
+ for (const dir of dirs) {
479
+ if (!existsSync(dir)) {
480
+ mkdirSync(dir, { recursive: true });
481
+ }
482
+ }
483
+ }
484
+ /**
485
+ * Check if cache is still valid
486
+ */
487
+ isCacheValid(project) {
488
+ const cacheAge = Date.now() - project.lastAccessed.getTime();
489
+ return cacheAge < 5 * 60 * 1e3;
490
+ }
491
+ /**
492
+ * Get all projects
493
+ */
494
+ getAllProjects() {
495
+ try {
496
+ const stmt = this.db.prepare(`
497
+ SELECT * FROM projects
498
+ ORDER BY last_accessed DESC
499
+ `);
500
+ const projects = stmt.all();
501
+ return projects.map((p) => ({
502
+ ...p,
503
+ isPrivate: p.is_private === 1,
504
+ lastAccessed: new Date(p.last_accessed),
505
+ metadata: JSON.parse(p.metadata || "{}")
506
+ }));
507
+ } catch (error) {
508
+ throw new DatabaseError(
509
+ "Failed to get all projects",
510
+ ErrorCode.DB_QUERY_FAILED,
511
+ {
512
+ operation: "getAllProjects"
513
+ },
514
+ error instanceof Error ? error : void 0
515
+ );
516
+ }
517
+ }
518
+ /**
519
+ * Get projects by organization
520
+ */
521
+ getProjectsByOrganization(organization) {
522
+ try {
523
+ const stmt = this.db.prepare(`
524
+ SELECT * FROM projects
525
+ WHERE organization = ?
526
+ ORDER BY last_accessed DESC
527
+ `);
528
+ const projects = stmt.all(organization);
529
+ return projects.map((p) => ({
530
+ ...p,
531
+ isPrivate: p.is_private === 1,
532
+ lastAccessed: new Date(p.last_accessed),
533
+ metadata: JSON.parse(p.metadata || "{}")
534
+ }));
535
+ } catch (error) {
536
+ throw new DatabaseError(
537
+ `Failed to get projects by organization: ${organization}`,
538
+ ErrorCode.DB_QUERY_FAILED,
539
+ {
540
+ organization,
541
+ operation: "getProjectsByOrganization"
542
+ },
543
+ error instanceof Error ? error : void 0
544
+ );
545
+ }
546
+ }
547
+ /**
548
+ * Get projects by account type
549
+ */
550
+ getProjectsByAccountType(accountType) {
551
+ try {
552
+ const stmt = this.db.prepare(`
553
+ SELECT * FROM projects
554
+ WHERE account_type = ?
555
+ ORDER BY last_accessed DESC
556
+ `);
557
+ const projects = stmt.all(accountType);
558
+ return projects.map((p) => ({
559
+ ...p,
560
+ isPrivate: p.is_private === 1,
561
+ lastAccessed: new Date(p.last_accessed),
562
+ metadata: JSON.parse(p.metadata || "{}")
563
+ }));
564
+ } catch (error) {
565
+ throw new DatabaseError(
566
+ `Failed to get projects by account type: ${accountType}`,
567
+ ErrorCode.DB_QUERY_FAILED,
568
+ {
569
+ accountType,
570
+ operation: "getProjectsByAccountType"
571
+ },
572
+ error instanceof Error ? error : void 0
573
+ );
574
+ }
575
+ }
576
+ /**
577
+ * Get current project
578
+ */
579
+ getCurrentProject() {
580
+ if (!this.currentProject) {
581
+ this.detectProject();
582
+ }
583
+ return this.currentProject;
584
+ }
585
+ /**
586
+ * Save organization config
587
+ */
588
+ saveOrganization(org) {
589
+ const errorHandler = createErrorHandler({
590
+ operation: "saveOrganization",
591
+ orgName: org.name
592
+ });
593
+ try {
594
+ this.organizations.set(org.name, org);
595
+ const configFile = join(this.configPath, "organizations.json");
596
+ const config = {
597
+ organizations: Array.from(this.organizations.values())
598
+ };
599
+ writeFileSync(configFile, JSON.stringify(config, null, 2));
600
+ const stmt = this.db.prepare(`
601
+ INSERT OR REPLACE INTO organizations (name, type, account_type, config)
602
+ VALUES (?, ?, ?, ?)
603
+ `);
604
+ stmt.run(org.name, org.type, org.accountType, JSON.stringify(org));
605
+ } catch (error) {
606
+ const wrappedError = errorHandler(error, {
607
+ orgName: org.name,
608
+ operation: "saveOrganization"
609
+ });
610
+ throw new DatabaseError(
611
+ `Failed to save organization: ${org.name}`,
612
+ ErrorCode.DB_QUERY_FAILED,
613
+ {
614
+ orgName: org.name,
615
+ operation: "saveOrganization"
616
+ },
617
+ error instanceof Error ? error : void 0
618
+ );
619
+ }
620
+ }
621
+ /**
622
+ * Auto-categorize all Git repositories in home directory
623
+ */
624
+ async scanAndCategorizeAllProjects(basePaths) {
625
+ const paths = basePaths || [
626
+ join(homedir(), "Dev"),
627
+ join(homedir(), "dev"),
628
+ join(homedir(), "Projects"),
629
+ join(homedir(), "projects"),
630
+ join(homedir(), "Work"),
631
+ join(homedir(), "work"),
632
+ join(homedir(), "Documents/GitHub"),
633
+ join(homedir(), "code")
634
+ ];
635
+ logger.info("Scanning for Git repositories...");
636
+ for (const basePath of paths) {
637
+ if (!existsSync(basePath)) continue;
638
+ try {
639
+ const gitDirs = execSync(
640
+ `find ${basePath} -type d -name .git -maxdepth 4 2>/dev/null`,
641
+ { encoding: "utf-8", timeout: 3e4 }
642
+ // 30 second timeout
643
+ ).trim().split("\n").filter(Boolean);
644
+ for (const gitDir of gitDirs) {
645
+ const projectPath = dirname(gitDir);
646
+ try {
647
+ await this.detectProject(projectPath);
648
+ logger.info(`Discovered project: ${projectPath}`);
649
+ } catch (error) {
650
+ logger.warn(
651
+ `Failed to analyze project: ${projectPath}`,
652
+ {
653
+ projectPath,
654
+ error: error instanceof Error ? error.message : String(error),
655
+ operation: "scanAndCategorizeAllProjects"
656
+ }
657
+ );
658
+ }
659
+ }
660
+ } catch (error) {
661
+ logger.warn(
662
+ `Failed to scan ${basePath}`,
663
+ error instanceof Error ? { error } : void 0
664
+ );
665
+ }
666
+ }
667
+ logger.info(`Scan complete. Found ${this.projectCache.size} projects`);
668
+ }
669
+ /**
670
+ * Generate summary report
671
+ */
672
+ generateReport() {
673
+ const allProjects = this.getAllProjects();
674
+ const report = {
675
+ total: allProjects.length,
676
+ byAccountType: {},
677
+ byOrganization: {},
678
+ byLanguage: {},
679
+ byFramework: {}
680
+ };
681
+ for (const project of allProjects) {
682
+ report.byAccountType[project.accountType] = (report.byAccountType[project.accountType] || 0) + 1;
683
+ if (project.organization) {
684
+ report.byOrganization[project.organization] = (report.byOrganization[project.organization] || 0) + 1;
685
+ }
686
+ if (project.primaryLanguage) {
687
+ report.byLanguage[project.primaryLanguage] = (report.byLanguage[project.primaryLanguage] || 0) + 1;
688
+ }
689
+ if (project.framework) {
690
+ report.byFramework[project.framework] = (report.byFramework[project.framework] || 0) + 1;
691
+ }
692
+ }
693
+ return JSON.stringify(report, null, 2);
694
+ }
695
+ }
696
+ export {
697
+ ProjectManager
698
+ };
699
+ //# sourceMappingURL=project-manager.js.map