reviewflow 3.6.0 → 3.8.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 (598) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/config/projectConfig.d.ts +2 -0
  3. package/dist/config/projectConfig.d.ts.map +1 -1
  4. package/dist/config/projectConfig.js +17 -0
  5. package/dist/config/projectConfig.js.map +1 -1
  6. package/dist/entities/backfill/backfillProgress.d.ts +7 -0
  7. package/dist/entities/backfill/backfillProgress.d.ts.map +1 -0
  8. package/dist/entities/backfill/backfillProgress.js +2 -0
  9. package/dist/entities/backfill/backfillProgress.js.map +1 -0
  10. package/dist/entities/cleanup/retentionPolicy.valueObject.d.ts +8 -0
  11. package/dist/entities/cleanup/retentionPolicy.valueObject.d.ts.map +1 -0
  12. package/dist/entities/cleanup/retentionPolicy.valueObject.js +21 -0
  13. package/dist/entities/cleanup/retentionPolicy.valueObject.js.map +1 -0
  14. package/dist/entities/diffStats/diffStats.d.ts +6 -0
  15. package/dist/entities/diffStats/diffStats.d.ts.map +1 -0
  16. package/dist/entities/diffStats/diffStats.js +2 -0
  17. package/dist/entities/diffStats/diffStats.js.map +1 -0
  18. package/dist/entities/diffStats/diffStatsFetch.gateway.d.ts +5 -0
  19. package/dist/entities/diffStats/diffStatsFetch.gateway.d.ts.map +1 -0
  20. package/dist/entities/diffStats/diffStatsFetch.gateway.js +2 -0
  21. package/dist/entities/diffStats/diffStatsFetch.gateway.js.map +1 -0
  22. package/dist/entities/insight/aiInsight.d.ts +6 -0
  23. package/dist/entities/insight/aiInsight.d.ts.map +1 -0
  24. package/dist/entities/insight/aiInsight.js +2 -0
  25. package/dist/entities/insight/aiInsight.js.map +1 -0
  26. package/dist/entities/insight/aiInsight.schema.d.ts +55 -0
  27. package/dist/entities/insight/aiInsight.schema.d.ts.map +1 -0
  28. package/dist/entities/insight/aiInsight.schema.js +25 -0
  29. package/dist/entities/insight/aiInsight.schema.js.map +1 -0
  30. package/dist/entities/insight/developerInsight.d.ts +8 -0
  31. package/dist/entities/insight/developerInsight.d.ts.map +1 -0
  32. package/dist/entities/insight/developerInsight.guard.d.ts +221 -0
  33. package/dist/entities/insight/developerInsight.guard.d.ts.map +1 -0
  34. package/dist/entities/insight/developerInsight.guard.js +13 -0
  35. package/dist/entities/insight/developerInsight.guard.js.map +1 -0
  36. package/dist/entities/insight/developerInsight.js +2 -0
  37. package/dist/entities/insight/developerInsight.js.map +1 -0
  38. package/dist/entities/insight/developerInsight.schema.d.ts +157 -0
  39. package/dist/entities/insight/developerInsight.schema.d.ts.map +1 -0
  40. package/dist/entities/insight/developerInsight.schema.js +43 -0
  41. package/dist/entities/insight/developerInsight.schema.js.map +1 -0
  42. package/dist/entities/insight/developerTitle.d.ts +12 -0
  43. package/dist/entities/insight/developerTitle.d.ts.map +1 -0
  44. package/dist/entities/insight/developerTitle.js +11 -0
  45. package/dist/entities/insight/developerTitle.js.map +1 -0
  46. package/dist/entities/insight/insightCategory.d.ts +10 -0
  47. package/dist/entities/insight/insightCategory.d.ts.map +1 -0
  48. package/dist/entities/insight/insightCategory.js +4 -0
  49. package/dist/entities/insight/insightCategory.js.map +1 -0
  50. package/dist/entities/insight/insightTrend.d.ts +9 -0
  51. package/dist/entities/insight/insightTrend.d.ts.map +1 -0
  52. package/dist/entities/insight/insightTrend.js +4 -0
  53. package/dist/entities/insight/insightTrend.js.map +1 -0
  54. package/dist/entities/insight/insights.gateway.d.ts +6 -0
  55. package/dist/entities/insight/insights.gateway.d.ts.map +1 -0
  56. package/dist/entities/insight/insights.gateway.js +2 -0
  57. package/dist/entities/insight/insights.gateway.js.map +1 -0
  58. package/dist/entities/insight/persistedInsightsData.d.ts +5 -0
  59. package/dist/entities/insight/persistedInsightsData.d.ts.map +1 -0
  60. package/dist/entities/insight/persistedInsightsData.guard.d.ts +271 -0
  61. package/dist/entities/insight/persistedInsightsData.guard.d.ts.map +1 -0
  62. package/dist/entities/insight/persistedInsightsData.guard.js +13 -0
  63. package/dist/entities/insight/persistedInsightsData.guard.js.map +1 -0
  64. package/dist/entities/insight/persistedInsightsData.js +2 -0
  65. package/dist/entities/insight/persistedInsightsData.js.map +1 -0
  66. package/dist/entities/insight/persistedInsightsData.schema.d.ts +84 -0
  67. package/dist/entities/insight/persistedInsightsData.schema.d.ts.map +1 -0
  68. package/dist/entities/insight/persistedInsightsData.schema.js +40 -0
  69. package/dist/entities/insight/persistedInsightsData.schema.js.map +1 -0
  70. package/dist/entities/insight/teamInsight.d.ts +5 -0
  71. package/dist/entities/insight/teamInsight.d.ts.map +1 -0
  72. package/dist/entities/insight/teamInsight.guard.d.ts +71 -0
  73. package/dist/entities/insight/teamInsight.guard.d.ts.map +1 -0
  74. package/dist/entities/insight/teamInsight.guard.js +13 -0
  75. package/dist/entities/insight/teamInsight.guard.js.map +1 -0
  76. package/dist/entities/insight/teamInsight.js +2 -0
  77. package/dist/entities/insight/teamInsight.js.map +1 -0
  78. package/dist/entities/insight/teamInsight.schema.d.ts +31 -0
  79. package/dist/entities/insight/teamInsight.schema.d.ts.map +1 -0
  80. package/dist/entities/insight/teamInsight.schema.js +17 -0
  81. package/dist/entities/insight/teamInsight.schema.js.map +1 -0
  82. package/dist/entities/packageVersion/packageVersion.d.ts +21 -0
  83. package/dist/entities/packageVersion/packageVersion.d.ts.map +1 -0
  84. package/dist/entities/packageVersion/packageVersion.gateway.d.ts +4 -0
  85. package/dist/entities/packageVersion/packageVersion.gateway.d.ts.map +1 -0
  86. package/dist/entities/packageVersion/packageVersion.gateway.js +2 -0
  87. package/dist/entities/packageVersion/packageVersion.gateway.js.map +1 -0
  88. package/dist/entities/packageVersion/packageVersion.guard.d.ts +7 -0
  89. package/dist/entities/packageVersion/packageVersion.guard.d.ts.map +1 -0
  90. package/dist/entities/packageVersion/packageVersion.guard.js +13 -0
  91. package/dist/entities/packageVersion/packageVersion.guard.js.map +1 -0
  92. package/dist/entities/packageVersion/packageVersion.js +2 -0
  93. package/dist/entities/packageVersion/packageVersion.js.map +1 -0
  94. package/dist/entities/packageVersion/packageVersion.schema.d.ts +12 -0
  95. package/dist/entities/packageVersion/packageVersion.schema.d.ts.map +1 -0
  96. package/dist/entities/packageVersion/packageVersion.schema.js +11 -0
  97. package/dist/entities/packageVersion/packageVersion.schema.js.map +1 -0
  98. package/dist/entities/packageVersion/selfUpdateCommand.gateway.d.ts +9 -0
  99. package/dist/entities/packageVersion/selfUpdateCommand.gateway.d.ts.map +1 -0
  100. package/dist/entities/packageVersion/selfUpdateCommand.gateway.js +2 -0
  101. package/dist/entities/packageVersion/selfUpdateCommand.gateway.js.map +1 -0
  102. package/dist/entities/packageVersion/versionCache.gateway.d.ts +7 -0
  103. package/dist/entities/packageVersion/versionCache.gateway.d.ts.map +1 -0
  104. package/dist/entities/packageVersion/versionCache.gateway.js +2 -0
  105. package/dist/entities/packageVersion/versionCache.gateway.js.map +1 -0
  106. package/dist/entities/review/reviewFile.gateway.d.ts +18 -0
  107. package/dist/entities/review/reviewFile.gateway.d.ts.map +1 -0
  108. package/dist/entities/review/reviewFile.gateway.js +2 -0
  109. package/dist/entities/review/reviewFile.gateway.js.map +1 -0
  110. package/dist/entities/stats/projectStats.d.ts +39 -0
  111. package/dist/entities/stats/projectStats.d.ts.map +1 -0
  112. package/dist/entities/stats/projectStats.js +2 -0
  113. package/dist/entities/stats/projectStats.js.map +1 -0
  114. package/dist/entities/stats/recalculateBody.guard.d.ts +11 -0
  115. package/dist/entities/stats/recalculateBody.guard.d.ts.map +1 -0
  116. package/dist/entities/stats/recalculateBody.guard.js +9 -0
  117. package/dist/entities/stats/recalculateBody.guard.js.map +1 -0
  118. package/dist/entities/stats/stats.gateway.d.ts +7 -0
  119. package/dist/entities/stats/stats.gateway.d.ts.map +1 -0
  120. package/dist/entities/stats/stats.gateway.js +2 -0
  121. package/dist/entities/stats/stats.gateway.js.map +1 -0
  122. package/dist/entities/tracking/reviewEvent.d.ts +2 -0
  123. package/dist/entities/tracking/reviewEvent.d.ts.map +1 -1
  124. package/dist/entities/tracking/reviewRequestTracking.gateway.d.ts +19 -0
  125. package/dist/entities/tracking/reviewRequestTracking.gateway.d.ts.map +1 -0
  126. package/dist/entities/tracking/reviewRequestTracking.gateway.js +2 -0
  127. package/dist/entities/tracking/reviewRequestTracking.gateway.js.map +1 -0
  128. package/dist/frameworks/claude/claudeInsightsInvoker.d.ts +3 -0
  129. package/dist/frameworks/claude/claudeInsightsInvoker.d.ts.map +1 -0
  130. package/dist/frameworks/claude/claudeInsightsInvoker.js +58 -0
  131. package/dist/frameworks/claude/claudeInsightsInvoker.js.map +1 -0
  132. package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
  133. package/dist/frameworks/claude/claudeInvoker.js +15 -1
  134. package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
  135. package/dist/frameworks/scheduler/cleanupScheduler.d.ts +16 -0
  136. package/dist/frameworks/scheduler/cleanupScheduler.d.ts.map +1 -0
  137. package/dist/frameworks/scheduler/cleanupScheduler.js +35 -0
  138. package/dist/frameworks/scheduler/cleanupScheduler.js.map +1 -0
  139. package/dist/interface-adapters/controllers/http/cleanup.routes.d.ts +16 -0
  140. package/dist/interface-adapters/controllers/http/cleanup.routes.d.ts.map +1 -0
  141. package/dist/interface-adapters/controllers/http/cleanup.routes.js +44 -0
  142. package/dist/interface-adapters/controllers/http/cleanup.routes.js.map +1 -0
  143. package/dist/interface-adapters/controllers/http/health.routes.d.ts +3 -1
  144. package/dist/interface-adapters/controllers/http/health.routes.d.ts.map +1 -1
  145. package/dist/interface-adapters/controllers/http/health.routes.js +5 -1
  146. package/dist/interface-adapters/controllers/http/health.routes.js.map +1 -1
  147. package/dist/interface-adapters/controllers/http/insights.routes.d.ts +20 -0
  148. package/dist/interface-adapters/controllers/http/insights.routes.d.ts.map +1 -0
  149. package/dist/interface-adapters/controllers/http/insights.routes.js +73 -0
  150. package/dist/interface-adapters/controllers/http/insights.routes.js.map +1 -0
  151. package/dist/interface-adapters/controllers/http/mrTrackingAdvanced.routes.d.ts.map +1 -1
  152. package/dist/interface-adapters/controllers/http/mrTrackingAdvanced.routes.js +13 -2
  153. package/dist/interface-adapters/controllers/http/mrTrackingAdvanced.routes.js.map +1 -1
  154. package/dist/interface-adapters/controllers/http/settings.routes.d.ts.map +1 -1
  155. package/dist/interface-adapters/controllers/http/settings.routes.js +3 -0
  156. package/dist/interface-adapters/controllers/http/settings.routes.js.map +1 -1
  157. package/dist/interface-adapters/controllers/http/stats.routes.d.ts +20 -6
  158. package/dist/interface-adapters/controllers/http/stats.routes.d.ts.map +1 -1
  159. package/dist/interface-adapters/controllers/http/stats.routes.js +35 -2
  160. package/dist/interface-adapters/controllers/http/stats.routes.js.map +1 -1
  161. package/dist/interface-adapters/controllers/http/version.routes.d.ts +19 -0
  162. package/dist/interface-adapters/controllers/http/version.routes.d.ts.map +1 -0
  163. package/dist/interface-adapters/controllers/http/version.routes.js +21 -0
  164. package/dist/interface-adapters/controllers/http/version.routes.js.map +1 -0
  165. package/dist/interface-adapters/controllers/webhook/github.controller.d.ts +2 -0
  166. package/dist/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
  167. package/dist/interface-adapters/controllers/webhook/github.controller.js +9 -3
  168. package/dist/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
  169. package/dist/interface-adapters/controllers/webhook/gitlab.controller.d.ts +2 -0
  170. package/dist/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
  171. package/dist/interface-adapters/controllers/webhook/gitlab.controller.js +17 -5
  172. package/dist/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
  173. package/dist/interface-adapters/gateways/diffStatsFetch.github.gateway.d.ts +10 -0
  174. package/dist/interface-adapters/gateways/diffStatsFetch.github.gateway.d.ts.map +1 -0
  175. package/dist/interface-adapters/gateways/diffStatsFetch.github.gateway.js +26 -0
  176. package/dist/interface-adapters/gateways/diffStatsFetch.github.gateway.js.map +1 -0
  177. package/dist/interface-adapters/gateways/diffStatsFetch.gitlab.gateway.d.ts +10 -0
  178. package/dist/interface-adapters/gateways/diffStatsFetch.gitlab.gateway.d.ts.map +1 -0
  179. package/dist/interface-adapters/gateways/diffStatsFetch.gitlab.gateway.js +28 -0
  180. package/dist/interface-adapters/gateways/diffStatsFetch.gitlab.gateway.js.map +1 -0
  181. package/dist/interface-adapters/gateways/fileSystem/insights.fileSystem.d.ts +7 -0
  182. package/dist/interface-adapters/gateways/fileSystem/insights.fileSystem.d.ts.map +1 -0
  183. package/dist/interface-adapters/gateways/fileSystem/insights.fileSystem.js +33 -0
  184. package/dist/interface-adapters/gateways/fileSystem/insights.fileSystem.js.map +1 -0
  185. package/dist/interface-adapters/gateways/fileSystem/reviewLogFile.fileSystem.gateway.d.ts +7 -0
  186. package/dist/interface-adapters/gateways/fileSystem/reviewLogFile.fileSystem.gateway.d.ts.map +1 -0
  187. package/dist/interface-adapters/gateways/fileSystem/reviewLogFile.fileSystem.gateway.js +47 -0
  188. package/dist/interface-adapters/gateways/fileSystem/reviewLogFile.fileSystem.gateway.js.map +1 -0
  189. package/dist/interface-adapters/gateways/fileSystem/stats.fileSystem.d.ts +2 -2
  190. package/dist/interface-adapters/gateways/fileSystem/stats.fileSystem.d.ts.map +1 -1
  191. package/dist/interface-adapters/gateways/packageVersion.npm.gateway.d.ts +7 -0
  192. package/dist/interface-adapters/gateways/packageVersion.npm.gateway.d.ts.map +1 -0
  193. package/dist/interface-adapters/gateways/packageVersion.npm.gateway.js +25 -0
  194. package/dist/interface-adapters/gateways/packageVersion.npm.gateway.js.map +1 -0
  195. package/dist/interface-adapters/gateways/reviewFile.gateway.d.ts +1 -17
  196. package/dist/interface-adapters/gateways/reviewFile.gateway.d.ts.map +1 -1
  197. package/dist/interface-adapters/gateways/reviewLogFile.gateway.d.ts +12 -0
  198. package/dist/interface-adapters/gateways/reviewLogFile.gateway.d.ts.map +1 -0
  199. package/dist/interface-adapters/gateways/reviewLogFile.gateway.js +2 -0
  200. package/dist/interface-adapters/gateways/reviewLogFile.gateway.js.map +1 -0
  201. package/dist/interface-adapters/gateways/reviewRequestTracking.gateway.d.ts +1 -18
  202. package/dist/interface-adapters/gateways/reviewRequestTracking.gateway.d.ts.map +1 -1
  203. package/dist/interface-adapters/gateways/selfUpdate.cli.gateway.d.ts +20 -0
  204. package/dist/interface-adapters/gateways/selfUpdate.cli.gateway.d.ts.map +1 -0
  205. package/dist/interface-adapters/gateways/selfUpdate.cli.gateway.js +58 -0
  206. package/dist/interface-adapters/gateways/selfUpdate.cli.gateway.js.map +1 -0
  207. package/dist/interface-adapters/gateways/stats.gateway.d.ts +1 -6
  208. package/dist/interface-adapters/gateways/stats.gateway.d.ts.map +1 -1
  209. package/dist/interface-adapters/gateways/versionCache.memory.gateway.d.ts +12 -0
  210. package/dist/interface-adapters/gateways/versionCache.memory.gateway.d.ts.map +1 -0
  211. package/dist/interface-adapters/gateways/versionCache.memory.gateway.js +22 -0
  212. package/dist/interface-adapters/gateways/versionCache.memory.gateway.js.map +1 -0
  213. package/dist/interface-adapters/presenters/insights.presenter.d.ts +41 -0
  214. package/dist/interface-adapters/presenters/insights.presenter.d.ts.map +1 -0
  215. package/dist/interface-adapters/presenters/insights.presenter.js +36 -0
  216. package/dist/interface-adapters/presenters/insights.presenter.js.map +1 -0
  217. package/dist/interface-adapters/views/dashboard/index.html +599 -40
  218. package/dist/interface-adapters/views/dashboard/modules/cleanup.d.ts +10 -0
  219. package/dist/interface-adapters/views/dashboard/modules/cleanup.d.ts.map +1 -0
  220. package/dist/interface-adapters/views/dashboard/modules/cleanup.js +45 -0
  221. package/dist/interface-adapters/views/dashboard/modules/cleanup.js.map +1 -0
  222. package/dist/interface-adapters/views/dashboard/modules/collapsibleList.d.ts +13 -0
  223. package/dist/interface-adapters/views/dashboard/modules/collapsibleList.d.ts.map +1 -0
  224. package/dist/interface-adapters/views/dashboard/modules/collapsibleList.js +71 -0
  225. package/dist/interface-adapters/views/dashboard/modules/collapsibleList.js.map +1 -0
  226. package/dist/interface-adapters/views/dashboard/modules/developerSheet.d.ts +14 -0
  227. package/dist/interface-adapters/views/dashboard/modules/developerSheet.d.ts.map +1 -0
  228. package/dist/interface-adapters/views/dashboard/modules/developerSheet.js +359 -0
  229. package/dist/interface-adapters/views/dashboard/modules/developerSheet.js.map +1 -0
  230. package/dist/interface-adapters/views/dashboard/modules/i18n.d.ts.map +1 -1
  231. package/dist/interface-adapters/views/dashboard/modules/i18n.js +296 -0
  232. package/dist/interface-adapters/views/dashboard/modules/i18n.js.map +1 -1
  233. package/dist/interface-adapters/views/dashboard/modules/insightsReport.d.ts +7 -0
  234. package/dist/interface-adapters/views/dashboard/modules/insightsReport.d.ts.map +1 -0
  235. package/dist/interface-adapters/views/dashboard/modules/insightsReport.js +509 -0
  236. package/dist/interface-adapters/views/dashboard/modules/insightsReport.js.map +1 -0
  237. package/dist/interface-adapters/views/dashboard/modules/mrSheet.d.ts +25 -0
  238. package/dist/interface-adapters/views/dashboard/modules/mrSheet.d.ts.map +1 -0
  239. package/dist/interface-adapters/views/dashboard/modules/mrSheet.js +414 -0
  240. package/dist/interface-adapters/views/dashboard/modules/mrSheet.js.map +1 -0
  241. package/dist/interface-adapters/views/dashboard/modules/sharedViewHelpers.d.ts +40 -0
  242. package/dist/interface-adapters/views/dashboard/modules/sharedViewHelpers.d.ts.map +1 -0
  243. package/dist/interface-adapters/views/dashboard/modules/sharedViewHelpers.js +106 -0
  244. package/dist/interface-adapters/views/dashboard/modules/sharedViewHelpers.js.map +1 -0
  245. package/dist/interface-adapters/views/dashboard/modules/statsCharts.d.ts +35 -0
  246. package/dist/interface-adapters/views/dashboard/modules/statsCharts.d.ts.map +1 -0
  247. package/dist/interface-adapters/views/dashboard/modules/statsCharts.js +476 -0
  248. package/dist/interface-adapters/views/dashboard/modules/statsCharts.js.map +1 -0
  249. package/dist/interface-adapters/views/dashboard/modules/teamTab.d.ts +13 -0
  250. package/dist/interface-adapters/views/dashboard/modules/teamTab.d.ts.map +1 -0
  251. package/dist/interface-adapters/views/dashboard/modules/teamTab.js +296 -0
  252. package/dist/interface-adapters/views/dashboard/modules/teamTab.js.map +1 -0
  253. package/dist/interface-adapters/views/dashboard/modules/versionUpdate.d.ts +16 -0
  254. package/dist/interface-adapters/views/dashboard/modules/versionUpdate.d.ts.map +1 -0
  255. package/dist/interface-adapters/views/dashboard/modules/versionUpdate.js +54 -0
  256. package/dist/interface-adapters/views/dashboard/modules/versionUpdate.js.map +1 -0
  257. package/dist/interface-adapters/views/dashboard/styles.css +1906 -0
  258. package/dist/main/dependencies.d.ts +4 -0
  259. package/dist/main/dependencies.d.ts.map +1 -1
  260. package/dist/main/dependencies.js +4 -0
  261. package/dist/main/dependencies.js.map +1 -1
  262. package/dist/main/routes.d.ts.map +1 -1
  263. package/dist/main/routes.js +68 -2
  264. package/dist/main/routes.js.map +1 -1
  265. package/dist/main/server.d.ts.map +1 -1
  266. package/dist/main/server.js +8 -0
  267. package/dist/main/server.js.map +1 -1
  268. package/dist/main/websocket.d.ts +2 -0
  269. package/dist/main/websocket.d.ts.map +1 -1
  270. package/dist/main/websocket.js +13 -0
  271. package/dist/main/websocket.js.map +1 -1
  272. package/dist/services/statsService.d.ts +8 -32
  273. package/dist/services/statsService.d.ts.map +1 -1
  274. package/dist/services/statsService.js +60 -36
  275. package/dist/services/statsService.js.map +1 -1
  276. package/dist/shared/foundation/commandExecutor.d.ts +2 -0
  277. package/dist/shared/foundation/commandExecutor.d.ts.map +1 -0
  278. package/dist/shared/foundation/commandExecutor.js +2 -0
  279. package/dist/shared/foundation/commandExecutor.js.map +1 -0
  280. package/dist/tests/factories/developerInsight.factory.d.ts +6 -0
  281. package/dist/tests/factories/developerInsight.factory.d.ts.map +1 -0
  282. package/dist/tests/factories/developerInsight.factory.js +61 -0
  283. package/dist/tests/factories/developerInsight.factory.js.map +1 -0
  284. package/dist/tests/factories/diffStats.factory.d.ts +5 -0
  285. package/dist/tests/factories/diffStats.factory.d.ts.map +1 -0
  286. package/dist/tests/factories/diffStats.factory.js +11 -0
  287. package/dist/tests/factories/diffStats.factory.js.map +1 -0
  288. package/dist/tests/factories/packageVersion.factory.d.ts +7 -0
  289. package/dist/tests/factories/packageVersion.factory.d.ts.map +1 -0
  290. package/dist/tests/factories/packageVersion.factory.js +18 -0
  291. package/dist/tests/factories/packageVersion.factory.js.map +1 -0
  292. package/dist/tests/factories/persistedInsightsData.factory.d.ts +11 -0
  293. package/dist/tests/factories/persistedInsightsData.factory.d.ts.map +1 -0
  294. package/dist/tests/factories/persistedInsightsData.factory.js +41 -0
  295. package/dist/tests/factories/persistedInsightsData.factory.js.map +1 -0
  296. package/dist/tests/factories/projectStats.factory.d.ts +3 -1
  297. package/dist/tests/factories/projectStats.factory.d.ts.map +1 -1
  298. package/dist/tests/factories/projectStats.factory.js +17 -3
  299. package/dist/tests/factories/projectStats.factory.js.map +1 -1
  300. package/dist/tests/factories/teamInsight.factory.d.ts +6 -0
  301. package/dist/tests/factories/teamInsight.factory.d.ts.map +1 -0
  302. package/dist/tests/factories/teamInsight.factory.js +35 -0
  303. package/dist/tests/factories/teamInsight.factory.js.map +1 -0
  304. package/dist/tests/stubs/diffStatsFetch.stub.d.ts +11 -0
  305. package/dist/tests/stubs/diffStatsFetch.stub.d.ts.map +1 -0
  306. package/dist/tests/stubs/diffStatsFetch.stub.js +19 -0
  307. package/dist/tests/stubs/diffStatsFetch.stub.js.map +1 -0
  308. package/dist/tests/stubs/insights.stub.d.ts +9 -0
  309. package/dist/tests/stubs/insights.stub.d.ts.map +1 -0
  310. package/dist/tests/stubs/insights.stub.js +13 -0
  311. package/dist/tests/stubs/insights.stub.js.map +1 -0
  312. package/dist/tests/stubs/packageVersion.stub.d.ts +7 -0
  313. package/dist/tests/stubs/packageVersion.stub.d.ts.map +1 -0
  314. package/dist/tests/stubs/packageVersion.stub.js +10 -0
  315. package/dist/tests/stubs/packageVersion.stub.js.map +1 -0
  316. package/dist/tests/stubs/reviewFile.stub.d.ts +1 -1
  317. package/dist/tests/stubs/reviewFile.stub.d.ts.map +1 -1
  318. package/dist/tests/stubs/reviewLogFile.stub.d.ts +15 -0
  319. package/dist/tests/stubs/reviewLogFile.stub.d.ts.map +1 -0
  320. package/dist/tests/stubs/reviewLogFile.stub.js +35 -0
  321. package/dist/tests/stubs/reviewLogFile.stub.js.map +1 -0
  322. package/dist/tests/stubs/reviewRequestTracking.stub.d.ts +1 -1
  323. package/dist/tests/stubs/reviewRequestTracking.stub.d.ts.map +1 -1
  324. package/dist/tests/stubs/selfUpdate.stub.d.ts +14 -0
  325. package/dist/tests/stubs/selfUpdate.stub.d.ts.map +1 -0
  326. package/dist/tests/stubs/selfUpdate.stub.js +20 -0
  327. package/dist/tests/stubs/selfUpdate.stub.js.map +1 -0
  328. package/dist/tests/stubs/stats.stub.d.ts +2 -2
  329. package/dist/tests/stubs/stats.stub.d.ts.map +1 -1
  330. package/dist/tests/stubs/versionCache.stub.d.ts +11 -0
  331. package/dist/tests/stubs/versionCache.stub.d.ts.map +1 -0
  332. package/dist/tests/stubs/versionCache.stub.js +18 -0
  333. package/dist/tests/stubs/versionCache.stub.js.map +1 -0
  334. package/dist/tests/units/config/projectConfig.test.js +60 -1
  335. package/dist/tests/units/config/projectConfig.test.js.map +1 -1
  336. package/dist/tests/units/entities/backfill/backfillProgress.test.d.ts +2 -0
  337. package/dist/tests/units/entities/backfill/backfillProgress.test.d.ts.map +1 -0
  338. package/dist/tests/units/entities/backfill/backfillProgress.test.js +40 -0
  339. package/dist/tests/units/entities/backfill/backfillProgress.test.js.map +1 -0
  340. package/dist/tests/units/entities/cleanup/retentionPolicy.valueObject.test.d.ts +2 -0
  341. package/dist/tests/units/entities/cleanup/retentionPolicy.valueObject.test.d.ts.map +1 -0
  342. package/dist/tests/units/entities/cleanup/retentionPolicy.valueObject.test.js +47 -0
  343. package/dist/tests/units/entities/cleanup/retentionPolicy.valueObject.test.js.map +1 -0
  344. package/dist/tests/units/entities/diffStats/diffStats.test.d.ts +2 -0
  345. package/dist/tests/units/entities/diffStats/diffStats.test.d.ts.map +1 -0
  346. package/dist/tests/units/entities/diffStats/diffStats.test.js +27 -0
  347. package/dist/tests/units/entities/diffStats/diffStats.test.js.map +1 -0
  348. package/dist/tests/units/entities/insight/aiInsight.schema.test.d.ts +2 -0
  349. package/dist/tests/units/entities/insight/aiInsight.schema.test.d.ts.map +1 -0
  350. package/dist/tests/units/entities/insight/aiInsight.schema.test.js +123 -0
  351. package/dist/tests/units/entities/insight/aiInsight.schema.test.js.map +1 -0
  352. package/dist/tests/units/entities/insight/developerInsight.schema.test.d.ts +2 -0
  353. package/dist/tests/units/entities/insight/developerInsight.schema.test.d.ts.map +1 -0
  354. package/dist/tests/units/entities/insight/developerInsight.schema.test.js +140 -0
  355. package/dist/tests/units/entities/insight/developerInsight.schema.test.js.map +1 -0
  356. package/dist/tests/units/entities/insight/developerTitle.test.d.ts +2 -0
  357. package/dist/tests/units/entities/insight/developerTitle.test.d.ts.map +1 -0
  358. package/dist/tests/units/entities/insight/developerTitle.test.js +23 -0
  359. package/dist/tests/units/entities/insight/developerTitle.test.js.map +1 -0
  360. package/dist/tests/units/entities/insight/insightCategory.test.d.ts +2 -0
  361. package/dist/tests/units/entities/insight/insightCategory.test.d.ts.map +1 -0
  362. package/dist/tests/units/entities/insight/insightCategory.test.js +16 -0
  363. package/dist/tests/units/entities/insight/insightCategory.test.js.map +1 -0
  364. package/dist/tests/units/entities/insight/insightTrend.test.d.ts +2 -0
  365. package/dist/tests/units/entities/insight/insightTrend.test.d.ts.map +1 -0
  366. package/dist/tests/units/entities/insight/insightTrend.test.js +16 -0
  367. package/dist/tests/units/entities/insight/insightTrend.test.js.map +1 -0
  368. package/dist/tests/units/entities/insight/persistedInsightsData.schema.test.d.ts +2 -0
  369. package/dist/tests/units/entities/insight/persistedInsightsData.schema.test.d.ts.map +1 -0
  370. package/dist/tests/units/entities/insight/persistedInsightsData.schema.test.js +160 -0
  371. package/dist/tests/units/entities/insight/persistedInsightsData.schema.test.js.map +1 -0
  372. package/dist/tests/units/entities/insight/teamInsight.schema.test.d.ts +2 -0
  373. package/dist/tests/units/entities/insight/teamInsight.schema.test.d.ts.map +1 -0
  374. package/dist/tests/units/entities/insight/teamInsight.schema.test.js +57 -0
  375. package/dist/tests/units/entities/insight/teamInsight.schema.test.js.map +1 -0
  376. package/dist/tests/units/entities/packageVersion/packageVersion.test.d.ts +2 -0
  377. package/dist/tests/units/entities/packageVersion/packageVersion.test.d.ts.map +1 -0
  378. package/dist/tests/units/entities/packageVersion/packageVersion.test.js +154 -0
  379. package/dist/tests/units/entities/packageVersion/packageVersion.test.js.map +1 -0
  380. package/dist/tests/units/factories/packageVersion.factory.test.d.ts +2 -0
  381. package/dist/tests/units/factories/packageVersion.factory.test.d.ts.map +1 -0
  382. package/dist/tests/units/factories/packageVersion.factory.test.js +37 -0
  383. package/dist/tests/units/factories/packageVersion.factory.test.js.map +1 -0
  384. package/dist/tests/units/frameworks/scheduler/cleanupScheduler.test.d.ts +2 -0
  385. package/dist/tests/units/frameworks/scheduler/cleanupScheduler.test.d.ts.map +1 -0
  386. package/dist/tests/units/frameworks/scheduler/cleanupScheduler.test.js +74 -0
  387. package/dist/tests/units/frameworks/scheduler/cleanupScheduler.test.js.map +1 -0
  388. package/dist/tests/units/interface-adapters/controllers/http/cleanup.routes.test.d.ts +2 -0
  389. package/dist/tests/units/interface-adapters/controllers/http/cleanup.routes.test.d.ts.map +1 -0
  390. package/dist/tests/units/interface-adapters/controllers/http/cleanup.routes.test.js +62 -0
  391. package/dist/tests/units/interface-adapters/controllers/http/cleanup.routes.test.js.map +1 -0
  392. package/dist/tests/units/interface-adapters/controllers/http/health.routes.test.d.ts +2 -0
  393. package/dist/tests/units/interface-adapters/controllers/http/health.routes.test.d.ts.map +1 -0
  394. package/dist/tests/units/interface-adapters/controllers/http/health.routes.test.js +96 -0
  395. package/dist/tests/units/interface-adapters/controllers/http/health.routes.test.js.map +1 -0
  396. package/dist/tests/units/interface-adapters/controllers/http/insights.routes.test.d.ts +2 -0
  397. package/dist/tests/units/interface-adapters/controllers/http/insights.routes.test.d.ts.map +1 -0
  398. package/dist/tests/units/interface-adapters/controllers/http/insights.routes.test.js +390 -0
  399. package/dist/tests/units/interface-adapters/controllers/http/insights.routes.test.js.map +1 -0
  400. package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.d.ts +2 -0
  401. package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.d.ts.map +1 -0
  402. package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.js +25 -0
  403. package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.js.map +1 -0
  404. package/dist/tests/units/interface-adapters/controllers/http/statsRecalculate.routes.test.d.ts +2 -0
  405. package/dist/tests/units/interface-adapters/controllers/http/statsRecalculate.routes.test.d.ts.map +1 -0
  406. package/dist/tests/units/interface-adapters/controllers/http/statsRecalculate.routes.test.js +82 -0
  407. package/dist/tests/units/interface-adapters/controllers/http/statsRecalculate.routes.test.js.map +1 -0
  408. package/dist/tests/units/interface-adapters/controllers/http/version.routes.test.d.ts +2 -0
  409. package/dist/tests/units/interface-adapters/controllers/http/version.routes.test.d.ts.map +1 -0
  410. package/dist/tests/units/interface-adapters/controllers/http/version.routes.test.js +108 -0
  411. package/dist/tests/units/interface-adapters/controllers/http/version.routes.test.js.map +1 -0
  412. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js +3 -0
  413. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js.map +1 -1
  414. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +1 -0
  415. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
  416. package/dist/tests/units/interface-adapters/gateways/diffStatsFetch.github.gateway.test.d.ts +2 -0
  417. package/dist/tests/units/interface-adapters/gateways/diffStatsFetch.github.gateway.test.d.ts.map +1 -0
  418. package/dist/tests/units/interface-adapters/gateways/diffStatsFetch.github.gateway.test.js +63 -0
  419. package/dist/tests/units/interface-adapters/gateways/diffStatsFetch.github.gateway.test.js.map +1 -0
  420. package/dist/tests/units/interface-adapters/gateways/diffStatsFetch.gitlab.gateway.test.d.ts +2 -0
  421. package/dist/tests/units/interface-adapters/gateways/diffStatsFetch.gitlab.gateway.test.d.ts.map +1 -0
  422. package/dist/tests/units/interface-adapters/gateways/diffStatsFetch.gitlab.gateway.test.js +94 -0
  423. package/dist/tests/units/interface-adapters/gateways/diffStatsFetch.gitlab.gateway.test.js.map +1 -0
  424. package/dist/tests/units/interface-adapters/gateways/insights.gateway.test.d.ts +2 -0
  425. package/dist/tests/units/interface-adapters/gateways/insights.gateway.test.d.ts.map +1 -0
  426. package/dist/tests/units/interface-adapters/gateways/insights.gateway.test.js +117 -0
  427. package/dist/tests/units/interface-adapters/gateways/insights.gateway.test.js.map +1 -0
  428. package/dist/tests/units/interface-adapters/gateways/packageVersion.npm.gateway.test.d.ts +2 -0
  429. package/dist/tests/units/interface-adapters/gateways/packageVersion.npm.gateway.test.d.ts.map +1 -0
  430. package/dist/tests/units/interface-adapters/gateways/packageVersion.npm.gateway.test.js +42 -0
  431. package/dist/tests/units/interface-adapters/gateways/packageVersion.npm.gateway.test.js.map +1 -0
  432. package/dist/tests/units/interface-adapters/gateways/reviewLogFile.fileSystem.test.d.ts +2 -0
  433. package/dist/tests/units/interface-adapters/gateways/reviewLogFile.fileSystem.test.d.ts.map +1 -0
  434. package/dist/tests/units/interface-adapters/gateways/reviewLogFile.fileSystem.test.js +65 -0
  435. package/dist/tests/units/interface-adapters/gateways/reviewLogFile.fileSystem.test.js.map +1 -0
  436. package/dist/tests/units/interface-adapters/gateways/reviewLogFile.gateway.test.d.ts +2 -0
  437. package/dist/tests/units/interface-adapters/gateways/reviewLogFile.gateway.test.d.ts.map +1 -0
  438. package/dist/tests/units/interface-adapters/gateways/reviewLogFile.gateway.test.js +63 -0
  439. package/dist/tests/units/interface-adapters/gateways/reviewLogFile.gateway.test.js.map +1 -0
  440. package/dist/tests/units/interface-adapters/gateways/reviewRequestTracking.gateway.test.js +2 -0
  441. package/dist/tests/units/interface-adapters/gateways/reviewRequestTracking.gateway.test.js.map +1 -1
  442. package/dist/tests/units/interface-adapters/gateways/selfUpdate.cli.gateway.test.d.ts +2 -0
  443. package/dist/tests/units/interface-adapters/gateways/selfUpdate.cli.gateway.test.d.ts.map +1 -0
  444. package/dist/tests/units/interface-adapters/gateways/selfUpdate.cli.gateway.test.js +101 -0
  445. package/dist/tests/units/interface-adapters/gateways/selfUpdate.cli.gateway.test.js.map +1 -0
  446. package/dist/tests/units/interface-adapters/gateways/versionCache.memory.gateway.test.d.ts +2 -0
  447. package/dist/tests/units/interface-adapters/gateways/versionCache.memory.gateway.test.d.ts.map +1 -0
  448. package/dist/tests/units/interface-adapters/gateways/versionCache.memory.gateway.test.js +38 -0
  449. package/dist/tests/units/interface-adapters/gateways/versionCache.memory.gateway.test.js.map +1 -0
  450. package/dist/tests/units/interface-adapters/presenters/insights.presenter.test.d.ts +2 -0
  451. package/dist/tests/units/interface-adapters/presenters/insights.presenter.test.d.ts.map +1 -0
  452. package/dist/tests/units/interface-adapters/presenters/insights.presenter.test.js +194 -0
  453. package/dist/tests/units/interface-adapters/presenters/insights.presenter.test.js.map +1 -0
  454. package/dist/tests/units/interface-adapters/views/dashboard/modules/developerSheet.test.d.ts +2 -0
  455. package/dist/tests/units/interface-adapters/views/dashboard/modules/developerSheet.test.d.ts.map +1 -0
  456. package/dist/tests/units/interface-adapters/views/dashboard/modules/developerSheet.test.js +224 -0
  457. package/dist/tests/units/interface-adapters/views/dashboard/modules/developerSheet.test.js.map +1 -0
  458. package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.js +29 -0
  459. package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.js.map +1 -1
  460. package/dist/tests/units/interface-adapters/views/dashboard/modules/insightsReport.test.d.ts +2 -0
  461. package/dist/tests/units/interface-adapters/views/dashboard/modules/insightsReport.test.d.ts.map +1 -0
  462. package/dist/tests/units/interface-adapters/views/dashboard/modules/insightsReport.test.js +326 -0
  463. package/dist/tests/units/interface-adapters/views/dashboard/modules/insightsReport.test.js.map +1 -0
  464. package/dist/tests/units/interface-adapters/views/dashboard/modules/teamTab.test.d.ts +2 -0
  465. package/dist/tests/units/interface-adapters/views/dashboard/modules/teamTab.test.d.ts.map +1 -0
  466. package/dist/tests/units/interface-adapters/views/dashboard/modules/teamTab.test.js +336 -0
  467. package/dist/tests/units/interface-adapters/views/dashboard/modules/teamTab.test.js.map +1 -0
  468. package/dist/tests/units/services/statsService.addReview.test.d.ts +2 -0
  469. package/dist/tests/units/services/statsService.addReview.test.d.ts.map +1 -0
  470. package/dist/tests/units/services/statsService.addReview.test.js +103 -0
  471. package/dist/tests/units/services/statsService.addReview.test.js.map +1 -0
  472. package/dist/tests/units/services/statsService.diffStats.test.d.ts +2 -0
  473. package/dist/tests/units/services/statsService.diffStats.test.d.ts.map +1 -0
  474. package/dist/tests/units/services/statsService.diffStats.test.js +61 -0
  475. package/dist/tests/units/services/statsService.diffStats.test.js.map +1 -0
  476. package/dist/tests/units/stubs/packageVersion.stub.test.d.ts +2 -0
  477. package/dist/tests/units/stubs/packageVersion.stub.test.d.ts.map +1 -0
  478. package/dist/tests/units/stubs/packageVersion.stub.test.js +20 -0
  479. package/dist/tests/units/stubs/packageVersion.stub.test.js.map +1 -0
  480. package/dist/tests/units/stubs/selfUpdate.stub.test.d.ts +2 -0
  481. package/dist/tests/units/stubs/selfUpdate.stub.test.d.ts.map +1 -0
  482. package/dist/tests/units/stubs/selfUpdate.stub.test.js +30 -0
  483. package/dist/tests/units/stubs/selfUpdate.stub.test.js.map +1 -0
  484. package/dist/tests/units/stubs/versionCache.stub.test.d.ts +2 -0
  485. package/dist/tests/units/stubs/versionCache.stub.test.d.ts.map +1 -0
  486. package/dist/tests/units/stubs/versionCache.stub.test.js +34 -0
  487. package/dist/tests/units/stubs/versionCache.stub.test.js.map +1 -0
  488. package/dist/tests/units/usecases/cleanup/cleanupExpiredReviews.usecase.test.d.ts +2 -0
  489. package/dist/tests/units/usecases/cleanup/cleanupExpiredReviews.usecase.test.d.ts.map +1 -0
  490. package/dist/tests/units/usecases/cleanup/cleanupExpiredReviews.usecase.test.js +83 -0
  491. package/dist/tests/units/usecases/cleanup/cleanupExpiredReviews.usecase.test.js.map +1 -0
  492. package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.d.ts +2 -0
  493. package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.d.ts.map +1 -0
  494. package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.js +172 -0
  495. package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.js.map +1 -0
  496. package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.d.ts +2 -0
  497. package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.d.ts.map +1 -0
  498. package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.js +449 -0
  499. package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.js.map +1 -0
  500. package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.d.ts +2 -0
  501. package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.d.ts.map +1 -0
  502. package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.js +326 -0
  503. package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.js.map +1 -0
  504. package/dist/tests/units/usecases/insights/computeTeamInsights.usecase.test.d.ts +2 -0
  505. package/dist/tests/units/usecases/insights/computeTeamInsights.usecase.test.d.ts.map +1 -0
  506. package/dist/tests/units/usecases/insights/computeTeamInsights.usecase.test.js +172 -0
  507. package/dist/tests/units/usecases/insights/computeTeamInsights.usecase.test.js.map +1 -0
  508. package/dist/tests/units/usecases/insights/generateAiInsights.usecase.test.d.ts +2 -0
  509. package/dist/tests/units/usecases/insights/generateAiInsights.usecase.test.d.ts.map +1 -0
  510. package/dist/tests/units/usecases/insights/generateAiInsights.usecase.test.js +253 -0
  511. package/dist/tests/units/usecases/insights/generateAiInsights.usecase.test.js.map +1 -0
  512. package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.d.ts +2 -0
  513. package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.d.ts.map +1 -0
  514. package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.js +160 -0
  515. package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.js.map +1 -0
  516. package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.d.ts +2 -0
  517. package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.d.ts.map +1 -0
  518. package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.js +125 -0
  519. package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.js.map +1 -0
  520. package/dist/tests/units/usecases/stats/backfillDiffStats.usecase.test.d.ts +2 -0
  521. package/dist/tests/units/usecases/stats/backfillDiffStats.usecase.test.d.ts.map +1 -0
  522. package/dist/tests/units/usecases/stats/backfillDiffStats.usecase.test.js +186 -0
  523. package/dist/tests/units/usecases/stats/backfillDiffStats.usecase.test.js.map +1 -0
  524. package/dist/tests/units/usecases/stats/recalculateProjectStats.usecase.test.d.ts +2 -0
  525. package/dist/tests/units/usecases/stats/recalculateProjectStats.usecase.test.d.ts.map +1 -0
  526. package/dist/tests/units/usecases/stats/recalculateProjectStats.usecase.test.js +130 -0
  527. package/dist/tests/units/usecases/stats/recalculateProjectStats.usecase.test.js.map +1 -0
  528. package/dist/tests/units/usecases/stats/recalculateWithBackfill.usecase.test.d.ts +2 -0
  529. package/dist/tests/units/usecases/stats/recalculateWithBackfill.usecase.test.d.ts.map +1 -0
  530. package/dist/tests/units/usecases/stats/recalculateWithBackfill.usecase.test.js +138 -0
  531. package/dist/tests/units/usecases/stats/recalculateWithBackfill.usecase.test.js.map +1 -0
  532. package/dist/tests/units/usecases/tracking/recordReviewCompletion.usecase.test.js +31 -2
  533. package/dist/tests/units/usecases/tracking/recordReviewCompletion.usecase.test.js.map +1 -1
  534. package/dist/tests/units/usecases/version/checkVersion.usecase.test.d.ts +2 -0
  535. package/dist/tests/units/usecases/version/checkVersion.usecase.test.d.ts.map +1 -0
  536. package/dist/tests/units/usecases/version/checkVersion.usecase.test.js +63 -0
  537. package/dist/tests/units/usecases/version/checkVersion.usecase.test.js.map +1 -0
  538. package/dist/tests/units/usecases/version/triggerSelfUpdate.usecase.test.d.ts +2 -0
  539. package/dist/tests/units/usecases/version/triggerSelfUpdate.usecase.test.d.ts.map +1 -0
  540. package/dist/tests/units/usecases/version/triggerSelfUpdate.usecase.test.js +26 -0
  541. package/dist/tests/units/usecases/version/triggerSelfUpdate.usecase.test.js.map +1 -0
  542. package/dist/usecases/cleanup/cleanupExpiredReviews.usecase.d.ts +13 -0
  543. package/dist/usecases/cleanup/cleanupExpiredReviews.usecase.d.ts.map +1 -0
  544. package/dist/usecases/cleanup/cleanupExpiredReviews.usecase.js +41 -0
  545. package/dist/usecases/cleanup/cleanupExpiredReviews.usecase.js.map +1 -0
  546. package/dist/usecases/insights/buildAiInsightsPrompt.d.ts +12 -0
  547. package/dist/usecases/insights/buildAiInsightsPrompt.d.ts.map +1 -0
  548. package/dist/usecases/insights/buildAiInsightsPrompt.js +220 -0
  549. package/dist/usecases/insights/buildAiInsightsPrompt.js.map +1 -0
  550. package/dist/usecases/insights/computeDeveloperInsights.usecase.d.ts +4 -0
  551. package/dist/usecases/insights/computeDeveloperInsights.usecase.d.ts.map +1 -0
  552. package/dist/usecases/insights/computeDeveloperInsights.usecase.js +226 -0
  553. package/dist/usecases/insights/computeDeveloperInsights.usecase.js.map +1 -0
  554. package/dist/usecases/insights/computeInsightsWithPersistence.usecase.d.ts +12 -0
  555. package/dist/usecases/insights/computeInsightsWithPersistence.usecase.d.ts.map +1 -0
  556. package/dist/usecases/insights/computeInsightsWithPersistence.usecase.js +340 -0
  557. package/dist/usecases/insights/computeInsightsWithPersistence.usecase.js.map +1 -0
  558. package/dist/usecases/insights/computeTeamInsights.usecase.d.ts +4 -0
  559. package/dist/usecases/insights/computeTeamInsights.usecase.d.ts.map +1 -0
  560. package/dist/usecases/insights/computeTeamInsights.usecase.js +111 -0
  561. package/dist/usecases/insights/computeTeamInsights.usecase.js.map +1 -0
  562. package/dist/usecases/insights/generateAiInsights.usecase.d.ts +27 -0
  563. package/dist/usecases/insights/generateAiInsights.usecase.d.ts.map +1 -0
  564. package/dist/usecases/insights/generateAiInsights.usecase.js +65 -0
  565. package/dist/usecases/insights/generateAiInsights.usecase.js.map +1 -0
  566. package/dist/usecases/insights/getInsightsWithAiStatus.usecase.d.ts +18 -0
  567. package/dist/usecases/insights/getInsightsWithAiStatus.usecase.d.ts.map +1 -0
  568. package/dist/usecases/insights/getInsightsWithAiStatus.usecase.js +56 -0
  569. package/dist/usecases/insights/getInsightsWithAiStatus.usecase.js.map +1 -0
  570. package/dist/usecases/insights/insightLevelComputation.service.d.ts +41 -0
  571. package/dist/usecases/insights/insightLevelComputation.service.d.ts.map +1 -0
  572. package/dist/usecases/insights/insightLevelComputation.service.js +313 -0
  573. package/dist/usecases/insights/insightLevelComputation.service.js.map +1 -0
  574. package/dist/usecases/stats/backfillDiffStats.usecase.d.ts +18 -0
  575. package/dist/usecases/stats/backfillDiffStats.usecase.d.ts.map +1 -0
  576. package/dist/usecases/stats/backfillDiffStats.usecase.js +43 -0
  577. package/dist/usecases/stats/backfillDiffStats.usecase.js.map +1 -0
  578. package/dist/usecases/stats/recalculateProjectStats.usecase.d.ts +7 -0
  579. package/dist/usecases/stats/recalculateProjectStats.usecase.d.ts.map +1 -0
  580. package/dist/usecases/stats/recalculateProjectStats.usecase.js +47 -0
  581. package/dist/usecases/stats/recalculateProjectStats.usecase.js.map +1 -0
  582. package/dist/usecases/stats/recalculateWithBackfill.usecase.d.ts +22 -0
  583. package/dist/usecases/stats/recalculateWithBackfill.usecase.d.ts.map +1 -0
  584. package/dist/usecases/stats/recalculateWithBackfill.usecase.js +33 -0
  585. package/dist/usecases/stats/recalculateWithBackfill.usecase.js.map +1 -0
  586. package/dist/usecases/tracking/recordReviewCompletion.usecase.d.ts +2 -0
  587. package/dist/usecases/tracking/recordReviewCompletion.usecase.d.ts.map +1 -1
  588. package/dist/usecases/tracking/recordReviewCompletion.usecase.js +1 -0
  589. package/dist/usecases/tracking/recordReviewCompletion.usecase.js.map +1 -1
  590. package/dist/usecases/version/checkVersion.usecase.d.ts +13 -0
  591. package/dist/usecases/version/checkVersion.usecase.d.ts.map +1 -0
  592. package/dist/usecases/version/checkVersion.usecase.js +20 -0
  593. package/dist/usecases/version/checkVersion.usecase.js.map +1 -0
  594. package/dist/usecases/version/triggerSelfUpdate.usecase.d.ts +7 -0
  595. package/dist/usecases/version/triggerSelfUpdate.usecase.d.ts.map +1 -0
  596. package/dist/usecases/version/triggerSelfUpdate.usecase.js +12 -0
  597. package/dist/usecases/version/triggerSelfUpdate.usecase.js.map +1 -0
  598. package/package.json +1 -1
@@ -13,6 +13,10 @@
13
13
  <div class="logo"><i data-lucide="bot"></i></div>
14
14
  <h1>Reviewflow</h1>
15
15
  <div class="header-actions">
16
+ <div class="version-update-wrapper">
17
+ <div id="version-update-area" class="version-update-area"></div>
18
+ <div id="version-manual-update-container"></div>
19
+ </div>
16
20
  <button id="check-claude-btn" class="btn btn-primary" onclick="checkClaudeStatus()">
17
21
  <i data-lucide="search"></i> <span id="i18n-check-claude"></span>
18
22
  </button>
@@ -145,12 +149,27 @@
145
149
  <div class="section-header clickable" onclick="toggleStats()" role="button" tabindex="0" onkeydown="activateOnKeydown(event)">
146
150
  <i data-lucide="bar-chart-3"></i> <span id="i18n-section-stats"></span>
147
151
  <span id="stats-toggle" class="toggle-icon collapsed"><i data-lucide="chevron-down"></i></span>
152
+ <button id="recalculate-btn" class="btn btn-sm btn-secondary" onclick="event.stopPropagation(); recalculateStats()" style="margin-left: auto; font-size: 0.75rem; padding: 2px 8px;">
153
+ <i data-lucide="refresh-cw" style="width: 12px; height: 12px;"></i>
154
+ <span id="recalculate-label"></span>
155
+ </button>
156
+ <span id="backfill-progress" class="badge-count hidden" style="margin-left: 4px;"></span>
148
157
  </div>
149
158
  <div id="project-stats" class="section-content stats-grid hidden">
150
159
  <div class="empty-state" id="i18n-empty-stats"></div>
151
160
  </div>
152
161
  </div>
153
162
 
163
+ <div id="team-section" class="section hidden">
164
+ <div class="section-header clickable" onclick="toggleTeamSection()" role="button" tabindex="0" onkeydown="activateOnKeydown(event)">
165
+ <i data-lucide="users"></i> <span id="i18n-section-team"></span>
166
+ <span id="team-toggle" class="toggle-icon collapsed"><i data-lucide="chevron-down"></i></span>
167
+ </div>
168
+ <div id="team-tab-content" class="section-content hidden">
169
+ <div class="empty-state" id="i18n-empty-team"></div>
170
+ </div>
171
+ </div>
172
+
154
173
  <div class="section" id="active-reviews-section">
155
174
  <div class="section-header">
156
175
  <i data-lucide="file-search"></i> <span id="i18n-section-active-reviews"></span>
@@ -206,6 +225,13 @@
206
225
  </div>
207
226
  </div>
208
227
 
228
+ <div class="section" id="cleanup-section">
229
+ <div class="section-header">
230
+ <i data-lucide="trash-2"></i> <span>Nettoyage</span>
231
+ </div>
232
+ <div class="section-content" id="cleanup-content"></div>
233
+ </div>
234
+
209
235
  <div class="refresh-info">
210
236
  <span id="connection-mode"></span> • <span id="i18n-connection-fallback"></span>
211
237
  <span class="refresh-separator"> • </span>
@@ -226,6 +252,16 @@
226
252
 
227
253
  <div id="toast-container" class="toast-container"></div>
228
254
 
255
+ <div id="mr-sheet-overlay" class="sheet-overlay" onclick="closeMrSheet()"></div>
256
+ <div id="mr-sheet" class="sheet-panel">
257
+ <div id="mr-sheet-content" class="sheet-content"></div>
258
+ </div>
259
+
260
+ <div id="dev-sheet-overlay" class="sheet-overlay" onclick="closeDevSheet()"></div>
261
+ <div id="dev-sheet" class="sheet-panel">
262
+ <div id="dev-sheet-content" class="sheet-content"></div>
263
+ </div>
264
+
229
265
  <script type="module">
230
266
  import { t, setLanguage, getLanguage } from './modules/i18n.js';
231
267
  import { formatTime, formatDuration, formatPhase, formatLogTime } from './modules/formatting.js';
@@ -240,6 +276,14 @@
240
276
  import { rankPendingFixForNowLane } from './modules/priority.js';
241
277
  import { getQualityProgress, getQualityTrend } from './modules/quality.js';
242
278
  import { createSessionMetricsState, trackSessionAction, updatePriorityItemTracking, getSessionMetricsSnapshot } from './modules/sessionMetrics.js';
279
+ import { renderCleanupSection, handleCleanupClick } from './modules/cleanup.js';
280
+ import { renderVersionUpdateArea, setVersionCheckState } from './modules/versionUpdate.js';
281
+ import { renderCollapsibleList, toggleCollapsibleList } from './modules/collapsibleList.js';
282
+ import { renderMrSheetContent, drawScoreTimeline, drawIssuesBreakdown } from './modules/mrSheet.js';
283
+ import { drawScoreTrendChart, drawReviewActivityChart, drawScoreDistributionChart, animateCounter } from './modules/statsCharts.js';
284
+ import { renderTeamTab, fetchAndRenderTeamTab } from './modules/teamTab.js';
285
+ import { renderDeveloperSheetContent, drawRadarChart } from './modules/developerSheet.js';
286
+ import { buildInsightsReport } from './modules/insightsReport.js';
243
287
 
244
288
  const API_URL = window.location.origin;
245
289
  const WS_URL = `ws://${window.location.host}/ws`;
@@ -250,9 +294,14 @@
250
294
  let logsVisible = false;
251
295
 
252
296
  let currentData = { activeReviews: [], recentReviews: [], logs: [], reviewFiles: [], pendingFix: [], pendingApproval: [] };
297
+ const mrDataStore = new Map();
253
298
  let loadedReviews = {};
254
299
  let statsCollapsed = true;
300
+ let currentStatsReviews = [];
301
+ let currentDevFilter = 'all';
255
302
  let focusStripCompact = false;
303
+ let teamCollapsed = true;
304
+ let currentInsightsData = null;
256
305
  const loadingState = { status: 0, reviewFiles: 0, stats: 0, mrTracking: 0 };
257
306
  let hasLoadedStatusOnce = false;
258
307
  const secondarySections = ['active-followups-section', 'pending-approval-section', 'completed-reviews-section'];
@@ -702,21 +751,13 @@
702
751
  }
703
752
 
704
753
  function updateLogs() {
705
- const logsEl = document.getElementById('logs-content');
706
- const errorCount = currentData.logs.filter(l => l.level === 'error' || l.level === 'warn').length;
707
- const errorBadge = document.getElementById('error-count');
708
-
709
- if (errorCount > 0) {
710
- errorBadge.textContent = t('logs.errorCount', { count: errorCount });
711
- errorBadge.classList.remove('hidden');
712
- } else {
713
- errorBadge.classList.add('hidden');
714
- }
715
-
716
- if (currentData.logs.length === 0) {
717
- logsEl.innerHTML = `<div class="empty-state">${t('empty.logs')}</div>`;
718
- } else {
719
- logsEl.innerHTML = currentData.logs.slice().reverse().map(renderLog).join('');
754
+ const sheetLogsEl = document.querySelector('.sheet-logs-content');
755
+ if (sheetLogsEl && logsVisible) {
756
+ if (currentData.logs.length === 0) {
757
+ sheetLogsEl.innerHTML = `<div class="empty-state">${t('empty.logs')}</div>`;
758
+ } else {
759
+ sheetLogsEl.innerHTML = currentData.logs.slice().reverse().map(renderLog).join('');
760
+ }
720
761
  }
721
762
  }
722
763
 
@@ -829,19 +870,23 @@
829
870
 
830
871
  if (data.summary) {
831
872
  const s = data.summary;
873
+ const reviews = data.stats?.reviews || [];
832
874
  const trendIcon = (trend) => trend === 'up'
833
875
  ? '<span class="stat-trend up"><i data-lucide="trending-up"></i></span>'
834
876
  : trend === 'down'
835
877
  ? '<span class="stat-trend down"><i data-lucide="trending-down"></i></span>'
836
878
  : '<span class="stat-trend flat"><i data-lucide="minus"></i></span>';
837
879
 
880
+ const numericScore = parseFloat(s.averageScore);
881
+ const isScoreNumeric = !isNaN(numericScore);
882
+
838
883
  statsEl.innerHTML = `
839
884
  <div class="stat-card metric-reviews">
840
- <div class="stat-value"><span class="stat-main">${s.totalReviews}</span></div>
885
+ <div class="stat-value"><span class="stat-main" data-target="${s.totalReviews}">0</span></div>
841
886
  <div class="stat-label"><i data-lucide="file-search"></i> ${t('stats.reviews')}</div>
842
887
  </div>
843
888
  <div class="stat-card metric-score">
844
- <div class="stat-value"><span class="stat-main">${s.averageScore}</span><span class="stat-denominator">/10</span>${trendIcon(s.trend.score)}</div>
889
+ <div class="stat-value"><span class="stat-main" ${isScoreNumeric ? `data-target="${numericScore}" data-suffix="/10"` : ''}>${isScoreNumeric ? '0' : s.averageScore}</span>${!isScoreNumeric ? '<span class="stat-denominator">/10</span>' : ''}${trendIcon(s.trend.score)}</div>
845
890
  <div class="stat-label"><i data-lucide="star"></i> ${t('stats.averageScore')}</div>
846
891
  </div>
847
892
  <div class="stat-card metric-time">
@@ -853,15 +898,57 @@
853
898
  <div class="stat-label"><i data-lucide="clock"></i> ${t('stats.averageTime')}</div>
854
899
  </div>
855
900
  <div class="stat-card warning metric-blocking">
856
- <div class="stat-value"><span class="stat-main">${s.totalBlocking}</span>${trendIcon(s.trend.blocking)}</div>
901
+ <div class="stat-value"><span class="stat-main" data-target="${s.totalBlocking}">0</span>${trendIcon(s.trend.blocking)}</div>
857
902
  <div class="stat-label"><i data-lucide="octagon-alert"></i> ${t('stats.blocking')}</div>
858
903
  </div>
859
904
  <div class="stat-card metric-warnings">
860
- <div class="stat-value"><span class="stat-main">${s.totalWarnings}</span></div>
905
+ <div class="stat-value"><span class="stat-main" data-target="${s.totalWarnings}">0</span></div>
861
906
  <div class="stat-label"><i data-lucide="alert-triangle"></i> ${t('stats.warnings')}</div>
862
907
  </div>
908
+ <div class="stats-charts-row">
909
+ <div class="stats-chart-card">
910
+ <div class="stats-chart-title"><i data-lucide="trending-up"></i> ${t('stats.scoreTrend')}</div>
911
+ <div class="dev-filter" id="dev-filter-container">
912
+ <button class="dev-filter-btn ${currentDevFilter === 'all' ? 'active' : ''}" data-dev="all" onclick="filterScoreTrend('all')">${t('stats.allDevs')}</button>
913
+ ${[...new Set(reviews.map(r => r.assignedBy).filter(Boolean))].map(dev =>
914
+ '<button class="dev-filter-btn ' + (currentDevFilter === dev ? 'active' : '') + '" data-dev="' + dev + '" onclick="filterScoreTrend(\'' + dev + '\')">' + dev + '</button>'
915
+ ).join('')}
916
+ </div>
917
+ <canvas id="stats-score-trend" class="stats-canvas"></canvas>
918
+ </div>
919
+ <div class="stats-chart-card">
920
+ <div class="stats-chart-title"><i data-lucide="bar-chart-3"></i> ${t('stats.reviewActivity')}</div>
921
+ <canvas id="stats-activity" class="stats-canvas"></canvas>
922
+ </div>
923
+ </div>
924
+ <div class="stats-charts-row">
925
+ <div class="stats-chart-card full-width">
926
+ <div class="stats-chart-title"><i data-lucide="pie-chart"></i> ${t('stats.scoreDistribution')}</div>
927
+ <canvas id="stats-distribution" class="stats-canvas-wide"></canvas>
928
+ </div>
929
+ </div>
863
930
  `;
864
931
  refreshIcons();
932
+
933
+ statsEl.querySelectorAll('.stat-main[data-target]').forEach(element => {
934
+ const target = parseFloat(element.dataset.target);
935
+ if (!isNaN(target)) {
936
+ animateCounter(element, target, 800, element.dataset.suffix || '');
937
+ }
938
+ });
939
+
940
+ currentStatsReviews = reviews;
941
+
942
+ requestAnimationFrame(() => {
943
+ if (reviews.length) {
944
+ const trendReviews = currentDevFilter === 'all'
945
+ ? reviews
946
+ : reviews.filter(r => r.assignedBy === currentDevFilter);
947
+ drawScoreTrendChart('stats-score-trend', trendReviews);
948
+ drawReviewActivityChart('stats-activity', reviews);
949
+ drawScoreDistributionChart('stats-distribution', reviews);
950
+ }
951
+ });
865
952
  } else {
866
953
  statsEl.innerHTML = `<div class="empty-state">${t('empty.statsNoData')}</div>`;
867
954
  }
@@ -885,7 +972,10 @@
885
972
  }
886
973
 
887
974
  completedSection?.classList.remove('hidden');
888
- recentEl.innerHTML = currentData.reviewFiles.map(renderReviewFile).join('');
975
+ recentEl.innerHTML = renderCollapsibleList(
976
+ currentData.reviewFiles.map(renderReviewFile),
977
+ 'completed-reviews', t
978
+ );
889
979
  applySectionExpansion('completed-reviews-section');
890
980
  refreshIcons();
891
981
  }
@@ -1044,19 +1134,58 @@
1044
1134
  }
1045
1135
 
1046
1136
  function toggleLogs() {
1047
- logsVisible = !logsVisible;
1048
- const logsSection = document.getElementById('logs-section');
1049
- const btn = document.getElementById('toggle-logs-btn');
1050
-
1051
- if (logsVisible) {
1052
- logsSection.classList.remove('hidden');
1053
- btn.innerHTML = `<i data-lucide="scroll-text"></i> ${t('header.hideLogs')}`;
1054
- fetchLogs();
1055
- } else {
1056
- logsSection.classList.add('hidden');
1057
- btn.innerHTML = `<i data-lucide="scroll-text"></i> ${t('header.logs')}`;
1137
+ const sheetPanel = document.getElementById('mr-sheet');
1138
+ const isOpen = sheetPanel.classList.contains('open') && logsVisible;
1139
+
1140
+ if (isOpen) {
1141
+ closeMrSheet();
1142
+ logsVisible = false;
1143
+ return;
1058
1144
  }
1059
- refreshIcons();
1145
+
1146
+ logsVisible = true;
1147
+ const openLogsSheet = () => {
1148
+ const contentEl = document.getElementById('mr-sheet-content');
1149
+ contentEl.innerHTML = renderLogsSheetContent();
1150
+ document.getElementById('mr-sheet-overlay').classList.add('open');
1151
+ sheetPanel.classList.add('open');
1152
+ document.body.style.overflow = 'hidden';
1153
+ refreshIcons();
1154
+ };
1155
+ fetchLogs().then(openLogsSheet).catch(openLogsSheet);
1156
+ }
1157
+
1158
+ function renderLogsSheetContent() {
1159
+ const errorCount = currentData.logs.filter(l => l.level === 'error' || l.level === 'warn').length;
1160
+ const errorBadge = errorCount > 0
1161
+ ? ` <span class="section-header badge-count">${t('logs.errorCount', { count: errorCount })}</span>`
1162
+ : '';
1163
+
1164
+ const logsHtml = currentData.logs.length === 0
1165
+ ? `<div class="empty-state">${t('empty.logs')}</div>`
1166
+ : currentData.logs.slice().reverse().map(renderLog).join('');
1167
+
1168
+ return `
1169
+ <button class="sheet-close" onclick="closeMrSheet()"><i data-lucide="x"></i></button>
1170
+ <div class="sheet-mr-header">
1171
+ <div>
1172
+ <div class="sheet-mr-title"><i data-lucide="scroll-text"></i> ${t('section.logs')}${errorBadge}</div>
1173
+ </div>
1174
+ </div>
1175
+ <div class="sheet-logs-body">
1176
+ <div class="sheet-logs-content section-content logs">${logsHtml}</div>
1177
+ </div>
1178
+ <div class="sheet-logs-footer">
1179
+ <button class="btn btn-secondary sheet-clear-btn" onclick="clearLogs()">
1180
+ <i data-lucide="trash-2"></i> ${t('logs.clear')}
1181
+ </button>
1182
+ </div>
1183
+ `;
1184
+ }
1185
+
1186
+ function clearLogs() {
1187
+ currentData.logs = [];
1188
+ updateLogs();
1060
1189
  }
1061
1190
 
1062
1191
  function toggleStats() {
@@ -1073,6 +1202,214 @@
1073
1202
  }
1074
1203
  }
1075
1204
 
1205
+ function toggleTeamSection() {
1206
+ teamCollapsed = !teamCollapsed;
1207
+ const content = document.getElementById('team-tab-content');
1208
+ const toggle = document.getElementById('team-toggle');
1209
+
1210
+ if (teamCollapsed) {
1211
+ content.classList.add('hidden');
1212
+ toggle.classList.add('collapsed');
1213
+ } else {
1214
+ content.classList.remove('hidden');
1215
+ toggle.classList.remove('collapsed');
1216
+ }
1217
+ }
1218
+
1219
+ let teamAnalysisCollapsed = false;
1220
+
1221
+ function toggleTeamAnalysis() {
1222
+ teamAnalysisCollapsed = !teamAnalysisCollapsed;
1223
+ const body = document.getElementById('team-analysis-body');
1224
+ const toggle = document.getElementById('team-analysis-toggle');
1225
+ if (body) {
1226
+ body.classList.toggle('hidden', teamAnalysisCollapsed);
1227
+ }
1228
+ if (toggle) {
1229
+ toggle.classList.toggle('collapsed', teamAnalysisCollapsed);
1230
+ }
1231
+ refreshIcons();
1232
+ }
1233
+
1234
+ let aiGenerationInProgress = false;
1235
+
1236
+ async function fetchTeamInsights() {
1237
+ if (!currentProjectPath) return;
1238
+ if (aiGenerationInProgress) return;
1239
+ const container = document.getElementById('team-tab-content');
1240
+ if (!container) return;
1241
+
1242
+ container.innerHTML = `<div class="empty-state team-loading">${icon('loader-circle', 'spinning')} ${t('team.loading')}</div>`;
1243
+ refreshIcons();
1244
+
1245
+ try {
1246
+ const response = await fetch(`${API_URL}/api/insights?path=${encodeURIComponent(currentProjectPath)}`);
1247
+ const data = await response.json();
1248
+ currentInsightsData = data;
1249
+
1250
+ container.innerHTML = renderTeamTab(data, t);
1251
+ refreshIcons();
1252
+
1253
+ setTimeout(() => {
1254
+ container.querySelectorAll('.stat-bar-fill[data-target-width]').forEach((bar) => {
1255
+ bar.style.width = bar.dataset.targetWidth;
1256
+ });
1257
+ }, 50);
1258
+ } catch (error) {
1259
+ console.error('Error fetching team insights:', error);
1260
+ container.innerHTML = `<div class="empty-state">${t('team.noData')}</div>`;
1261
+ }
1262
+ }
1263
+
1264
+ async function generateAiInsights() {
1265
+ if (!currentProjectPath || aiGenerationInProgress) return;
1266
+ aiGenerationInProgress = true;
1267
+ const button = document.querySelector('.ai-generate-btn');
1268
+ if (button) {
1269
+ button.disabled = true;
1270
+ button.classList.add('loading');
1271
+ button.innerHTML = `${icon('loader-circle', 'spinning')} ${t('ai.generating')}`;
1272
+ refreshIcons();
1273
+ }
1274
+ try {
1275
+ const response = await fetch(`${API_URL}/api/insights/generate`, {
1276
+ method: 'POST',
1277
+ headers: { 'Content-Type': 'application/json' },
1278
+ body: JSON.stringify({ path: currentProjectPath, language: getLanguage() }),
1279
+ });
1280
+ if (!response.ok) {
1281
+ const errorData = await response.json().catch(() => ({}));
1282
+ throw new Error(errorData.error || t('ai.error'));
1283
+ }
1284
+ aiGenerationInProgress = false;
1285
+ await fetchTeamInsights();
1286
+ } catch (error) {
1287
+ aiGenerationInProgress = false;
1288
+ console.error('Error generating AI insights:', error);
1289
+ showToast(error.message || t('ai.error'), 'error');
1290
+ if (button) {
1291
+ button.disabled = false;
1292
+ button.classList.remove('loading');
1293
+ button.innerHTML = `${icon('sparkles')} ${t('ai.generate')}`;
1294
+ refreshIcons();
1295
+ }
1296
+ }
1297
+ }
1298
+
1299
+ function openDevSheet(encodedName) {
1300
+ const developerName = decodeURIComponent(encodedName);
1301
+ if (!currentInsightsData || !currentInsightsData.developers) return;
1302
+ const developer = currentInsightsData.developers.find(
1303
+ (dev) => dev.developerName === developerName
1304
+ );
1305
+ if (!developer) return;
1306
+
1307
+ const aiDevelopers = currentInsightsData.aiInsights?.developers || [];
1308
+ const aiDeveloper = aiDevelopers.find(
1309
+ (aiDev) => aiDev.developerName === developerName
1310
+ ) || null;
1311
+
1312
+ const contentEl = document.getElementById('dev-sheet-content');
1313
+ contentEl.innerHTML = renderDeveloperSheetContent(developer, t, aiDeveloper);
1314
+
1315
+ document.getElementById('dev-sheet-overlay').classList.add('open');
1316
+ document.getElementById('dev-sheet').classList.add('open');
1317
+ document.body.style.overflow = 'hidden';
1318
+
1319
+ refreshIcons();
1320
+
1321
+ requestAnimationFrame(() => {
1322
+ drawRadarChart('dev-radar-canvas', developer.categoryLevels, t);
1323
+ const developerReviews = currentStatsReviews.filter(
1324
+ (review) => review.assignedBy === developerName
1325
+ );
1326
+ drawScoreTrendChart('dev-score-trend-canvas', developerReviews);
1327
+ contentEl.querySelectorAll('.stat-bar-fill[data-target-width]').forEach((bar) => {
1328
+ setTimeout(() => { bar.style.width = bar.dataset.targetWidth; }, 50);
1329
+ });
1330
+ });
1331
+ }
1332
+
1333
+ function closeDevSheet() {
1334
+ document.getElementById('dev-sheet-overlay').classList.remove('open');
1335
+ document.getElementById('dev-sheet').classList.remove('open');
1336
+ document.body.style.overflow = '';
1337
+ }
1338
+
1339
+ function exportInsightsPdf() {
1340
+ if (!currentInsightsData || currentInsightsData.isEmpty) return;
1341
+
1342
+ const reportHtml = buildInsightsReport(currentInsightsData, t);
1343
+
1344
+ const iframe = document.createElement('iframe');
1345
+ iframe.style.position = 'fixed';
1346
+ iframe.style.right = '0';
1347
+ iframe.style.bottom = '0';
1348
+ iframe.style.width = '0';
1349
+ iframe.style.height = '0';
1350
+ iframe.style.border = 'none';
1351
+ document.body.appendChild(iframe);
1352
+
1353
+ const document_ = iframe.contentDocument || iframe.contentWindow.document;
1354
+ document_.open();
1355
+ document_.write(reportHtml);
1356
+ document_.close();
1357
+
1358
+ iframe.contentWindow.addEventListener('afterprint', () => {
1359
+ if (iframe.parentNode) document.body.removeChild(iframe);
1360
+ });
1361
+
1362
+ setTimeout(() => {
1363
+ iframe.contentWindow.print();
1364
+ setTimeout(() => {
1365
+ if (iframe.parentNode) document.body.removeChild(iframe);
1366
+ }, 60000);
1367
+ }, 250);
1368
+ }
1369
+
1370
+ async function recalculateStats() {
1371
+ if (!currentProjectPath) return;
1372
+ const button = document.getElementById('recalculate-btn');
1373
+ const progressBadge = document.getElementById('backfill-progress');
1374
+ if (button) button.disabled = true;
1375
+
1376
+ try {
1377
+ const response = await fetch(`${API_URL}/api/stats/recalculate`, {
1378
+ method: 'POST',
1379
+ headers: { 'Content-Type': 'application/json' },
1380
+ body: JSON.stringify({ path: currentProjectPath, backfill: true }),
1381
+ });
1382
+
1383
+ if (!response.ok) {
1384
+ throw new Error('Recalculation failed');
1385
+ }
1386
+
1387
+ if (progressBadge) {
1388
+ progressBadge.textContent = '...';
1389
+ progressBadge.classList.remove('hidden');
1390
+ }
1391
+ } catch (error) {
1392
+ console.error('Error recalculating stats:', error);
1393
+ if (button) button.disabled = false;
1394
+ if (progressBadge) progressBadge.classList.add('hidden');
1395
+ }
1396
+ }
1397
+ window.recalculateStats = recalculateStats;
1398
+
1399
+ function filterScoreTrend(selectedDev) {
1400
+ currentDevFilter = selectedDev;
1401
+ document.querySelectorAll('.dev-filter-btn').forEach(btn => {
1402
+ btn.classList.toggle('active', btn.dataset.dev === selectedDev);
1403
+ });
1404
+
1405
+ const filtered = selectedDev === 'all'
1406
+ ? currentStatsReviews
1407
+ : currentStatsReviews.filter(r => r.assignedBy === selectedDev);
1408
+
1409
+ drawScoreTrendChart('stats-score-trend', filtered);
1410
+ }
1411
+ window.filterScoreTrend = filterScoreTrend;
1412
+
1076
1413
  function renderMrItem(mr, type) {
1077
1414
  const mrPrefix = mr.platform === 'github' ? '#' : '!';
1078
1415
  const encodedMrId = encodeURIComponent(String(mr.id ?? ''));
@@ -1112,7 +1449,7 @@
1112
1449
 
1113
1450
  return `
1114
1451
  <div class="mr-item-accordion" data-mr-id="${mr.id}">
1115
- <div class="mr-item-header" onclick="toggleMrAccordion('${accordionId}')" role="button" tabindex="0" onkeydown="activateOnKeydown(event)">
1452
+ <div class="mr-item-header" onclick="openMrSheet('${encodedMrId}')" role="button" tabindex="0" onkeydown="activateOnKeydown(event)">
1116
1453
  <div class="review-status ${type === 'pending-fix' ? 'running' : (type === 'pending-approval' && mr.totalWarnings > 0) ? 'warnings' : 'completed'}"></div>
1117
1454
  <div class="mr-info">
1118
1455
  <div class="mr-title">
@@ -1259,10 +1596,16 @@
1259
1596
  ? renderNowLane(queueLanesModel.nowLaneItem)
1260
1597
  : `<div class="empty-state">${t('queueLane.emptyNow')}</div>`;
1261
1598
  const needsFixContent = queueLanesModel.needsFixItems.length > 0
1262
- ? queueLanesModel.needsFixItems.map((mergeRequest) => renderMrItem(mergeRequest, 'pending-fix')).join('')
1599
+ ? renderCollapsibleList(
1600
+ queueLanesModel.needsFixItems.map((mergeRequest) => renderMrItem(mergeRequest, 'pending-fix')),
1601
+ 'needs-fix', t
1602
+ )
1263
1603
  : `<div class="empty-state">${t('queueLane.emptyNeedsFix')}</div>`;
1264
1604
  const readyToApproveContent = queueLanesModel.readyToApproveItems.length > 0
1265
- ? queueLanesModel.readyToApproveItems.map((mergeRequest) => renderMrItem(mergeRequest, 'pending-approval')).join('')
1605
+ ? renderCollapsibleList(
1606
+ queueLanesModel.readyToApproveItems.map((mergeRequest) => renderMrItem(mergeRequest, 'pending-approval')),
1607
+ 'ready-to-approve', t
1608
+ )
1266
1609
  : `<div class="empty-state">${t('queueLane.emptyReadyToApprove')}</div>`;
1267
1610
 
1268
1611
  return `
@@ -1323,6 +1666,11 @@
1323
1666
  pendingFixSection.classList.remove('hidden');
1324
1667
  const rankedPendingFix = rankPendingFixForNowLane(currentData.pendingFix);
1325
1668
  const queueLanesModel = buildQueueLanesModel(rankedPendingFix, currentData.pendingApproval);
1669
+
1670
+ mrDataStore.clear();
1671
+ if (queueLanesModel.nowLaneItem) mrDataStore.set(queueLanesModel.nowLaneItem.id, { ...queueLanesModel.nowLaneItem, _sheetType: 'pending-fix' });
1672
+ queueLanesModel.needsFixItems.forEach(mr => mrDataStore.set(mr.id, { ...mr, _sheetType: 'pending-fix' }));
1673
+ queueLanesModel.readyToApproveItems.forEach(mr => mrDataStore.set(mr.id, { ...mr, _sheetType: 'pending-approval' }));
1326
1674
  sessionMetrics = updatePriorityItemTracking(sessionMetrics, {
1327
1675
  nowLaneItemId: queueLanesModel.nowLaneItem?.id ?? null,
1328
1676
  pendingFixIds: rankedPendingFix.map((mergeRequest) => String(mergeRequest.id)),
@@ -1529,6 +1877,26 @@
1529
1877
  case 'log':
1530
1878
  handleLogMessage(message.log);
1531
1879
  break;
1880
+ case 'backfill-progress': {
1881
+ const progressBadge = document.getElementById('backfill-progress');
1882
+ if (progressBadge) {
1883
+ progressBadge.textContent = t('stats.backfillProgress', { completed: message.data.completed, total: message.data.total });
1884
+ progressBadge.classList.remove('hidden');
1885
+ }
1886
+ break;
1887
+ }
1888
+ case 'backfill-complete': {
1889
+ const completeBadge = document.getElementById('backfill-progress');
1890
+ const recalcButton = document.getElementById('recalculate-btn');
1891
+ if (completeBadge) {
1892
+ completeBadge.textContent = t('stats.backfillComplete');
1893
+ setTimeout(() => completeBadge.classList.add('hidden'), 3000);
1894
+ }
1895
+ if (recalcButton) recalcButton.disabled = false;
1896
+ fetchProjectStats();
1897
+ fetchTeamInsights();
1898
+ break;
1899
+ }
1532
1900
  case 'pong':
1533
1901
  break;
1534
1902
  }
@@ -1569,6 +1937,14 @@
1569
1937
  currentData.activeReviews = data.jobs?.active || [];
1570
1938
  currentData.recentReviews = data.jobs?.recent || [];
1571
1939
  dispatchReviewNotifications(currentData.activeReviews, currentData.recentReviews);
1940
+ const versionUpdateArea = document.getElementById('version-update-area');
1941
+ if (versionUpdateArea) {
1942
+ versionUpdateArea.innerHTML = renderVersionUpdateArea(
1943
+ { currentVersion: data.version || '?', updateAvailable: data.updateAvailable || false, latestVersion: data.latestVersion || null },
1944
+ t
1945
+ );
1946
+ if (typeof lucide !== 'undefined') lucide.createIcons();
1947
+ }
1572
1948
  if (!wsConnected) updateConnectionStatus('online', 'connection.onlinePolling');
1573
1949
  updateUI();
1574
1950
  } catch (error) {
@@ -1762,8 +2138,10 @@
1762
2138
  fetchReviewFiles();
1763
2139
  fetchProjectStats();
1764
2140
  fetchMrTracking();
2141
+ fetchTeamInsights();
1765
2142
 
1766
2143
  document.getElementById('stats-section').classList.remove('hidden');
2144
+ document.getElementById('team-section').classList.remove('hidden');
1767
2145
 
1768
2146
  const platformIcon = activePlatform === 'gitlab' ? '<i data-lucide="gitlab"></i> GitLab' : '<i data-lucide="github"></i> GitHub';
1769
2147
  info.innerHTML = `
@@ -1811,16 +2189,41 @@
1811
2189
  }
1812
2190
  }
1813
2191
 
1814
- function initProjectLoader() {
2192
+ async function syncServerRepositories() {
2193
+ try {
2194
+ const response = await fetch(`${API_URL}/api/repositories`);
2195
+ const data = await response.json();
2196
+ if (!data.repositories) return;
2197
+
2198
+ const stored = getStoredProjects();
2199
+ for (const repository of data.repositories) {
2200
+ if (repository.enabled && !stored.includes(repository.localPath)) {
2201
+ stored.push(repository.localPath);
2202
+ }
2203
+ }
2204
+ saveProjects(stored);
2205
+ updateProjectSelect();
2206
+ } catch {
2207
+ // Server unreachable — use localStorage only
2208
+ }
2209
+ }
2210
+
2211
+ async function initProjectLoader() {
2212
+ await syncServerRepositories();
1815
2213
  updateProjectSelect();
1816
2214
  const lastProject = localStorage.getItem(STORAGE_KEY_CURRENT);
1817
2215
  if (lastProject) {
1818
2216
  loadProjectConfigFromPath(lastProject);
1819
2217
  } else {
1820
- document.getElementById('recent-reviews').innerHTML =
1821
- `<div class="empty-state">${t('empty.reviewsNoProject')}</div>`;
1822
- document.getElementById('project-stats').innerHTML =
1823
- `<div class="empty-state">${t('empty.statsNoProject')}</div>`;
2218
+ const storedProjects = getStoredProjects();
2219
+ if (storedProjects.length > 0) {
2220
+ loadProjectConfigFromPath(storedProjects[0]);
2221
+ } else {
2222
+ document.getElementById('recent-reviews').innerHTML =
2223
+ `<div class="empty-state">${t('empty.reviewsNoProject')}</div>`;
2224
+ document.getElementById('project-stats').innerHTML =
2225
+ `<div class="empty-state">${t('empty.statsNoProject')}</div>`;
2226
+ }
1824
2227
  }
1825
2228
  }
1826
2229
 
@@ -1996,6 +2399,12 @@
1996
2399
  const sectionStats = document.getElementById('i18n-section-stats');
1997
2400
  if (sectionStats) sectionStats.textContent = t('section.stats');
1998
2401
 
2402
+ const recalculateLabel = document.getElementById('recalculate-label');
2403
+ if (recalculateLabel) recalculateLabel.textContent = t('stats.recalculate');
2404
+
2405
+ const sectionTeam = document.getElementById('i18n-section-team');
2406
+ if (sectionTeam) sectionTeam.textContent = t('team.title');
2407
+
1999
2408
  const sectionActiveReviews = document.getElementById('i18n-section-active-reviews');
2000
2409
  if (sectionActiveReviews) sectionActiveReviews.textContent = t('section.activeReviews');
2001
2410
 
@@ -2030,6 +2439,9 @@
2030
2439
  const emptyPendingApproval = document.getElementById('i18n-empty-pending-approval');
2031
2440
  if (emptyPendingApproval) emptyPendingApproval.textContent = t('empty.pendingApproval');
2032
2441
 
2442
+ const emptyTeam = document.getElementById('i18n-empty-team');
2443
+ if (emptyTeam) emptyTeam.textContent = t('team.noData');
2444
+
2033
2445
  const emptyLoading = document.getElementById('i18n-empty-loading');
2034
2446
  if (emptyLoading) emptyLoading.textContent = t('status.loading');
2035
2447
 
@@ -2055,7 +2467,137 @@
2055
2467
  updateProjectSelect();
2056
2468
  }
2057
2469
 
2470
+ async function checkForUpdates() {
2471
+ setVersionCheckState('checking', t);
2472
+ try {
2473
+ const response = await fetch(`${API_URL}/api/version/check`);
2474
+ const data = await response.json();
2475
+ const versionUpdateArea = document.getElementById('version-update-area');
2476
+ if (versionUpdateArea) {
2477
+ versionUpdateArea.innerHTML = renderVersionUpdateArea(
2478
+ { currentVersion: data.currentVersion || '?', updateAvailable: data.updateAvailable || false, latestVersion: data.latestVersion || null },
2479
+ t
2480
+ );
2481
+ if (typeof lucide !== 'undefined') lucide.createIcons();
2482
+ }
2483
+ if (!data.updateAvailable) {
2484
+ showToast(t('version.upToDate'), 'success');
2485
+ }
2486
+ } catch (error) {
2487
+ console.error('Error checking for updates:', error);
2488
+ showToast(t('version.updateFailed'), 'error');
2489
+ } finally {
2490
+ setVersionCheckState('idle', t);
2491
+ }
2492
+ }
2493
+
2494
+ async function triggerVersionUpdate() {
2495
+ setVersionCheckState('updating', t);
2496
+ try {
2497
+ const response = await fetch(`${API_URL}/api/version/update`, { method: 'POST' });
2498
+ const data = await response.json();
2499
+ if (data.status === 'started') {
2500
+ setVersionCheckState('restarting', t);
2501
+ showToast(t('version.restarting'), 'info');
2502
+ setTimeout(() => {
2503
+ const checkInterval = setInterval(async () => {
2504
+ try {
2505
+ const healthResponse = await fetch(`${API_URL}/health`);
2506
+ if (healthResponse.ok) {
2507
+ clearInterval(checkInterval);
2508
+ window.location.reload();
2509
+ }
2510
+ } catch {
2511
+ // Server still restarting, keep polling
2512
+ }
2513
+ }, 2000);
2514
+ setTimeout(() => clearInterval(checkInterval), 60000);
2515
+ }, 3000);
2516
+ } else if (data.status === 'permission-denied') {
2517
+ setVersionCheckState('idle', t);
2518
+ showManualUpdateCommand(data.command);
2519
+ } else {
2520
+ showToast(data.error || t('version.updateFailed'), 'error');
2521
+ setVersionCheckState('idle', t);
2522
+ }
2523
+ } catch (error) {
2524
+ console.error('Error triggering update:', error);
2525
+ showToast(t('version.updateFailed'), 'error');
2526
+ setVersionCheckState('idle', t);
2527
+ }
2528
+ }
2529
+
2530
+ function showManualUpdateCommand(command) {
2531
+ const container = document.getElementById('version-manual-update-container');
2532
+ if (!container) return;
2533
+
2534
+ if (container.children.length > 0) {
2535
+ container.innerHTML = '';
2536
+ return;
2537
+ }
2538
+
2539
+ container.innerHTML = `
2540
+ <div class="version-manual-dropdown">
2541
+ <p>${t('version.permissionDenied')}</p>
2542
+ <div class="version-command-row">
2543
+ <code>${command}</code>
2544
+ <button class="btn btn-icon btn-copy" title="${t('version.copyCommand')}" onclick="copyUpdateCommand('${command}')">
2545
+ <i data-lucide="copy"></i>
2546
+ </button>
2547
+ </div>
2548
+ </div>
2549
+ `;
2550
+ refreshIcons();
2551
+ }
2552
+
2553
+ function copyUpdateCommand(command) {
2554
+ navigator.clipboard.writeText(command).then(() => {
2555
+ showToast(t('version.commandCopied'), 'success');
2556
+ });
2557
+ }
2558
+
2559
+ function openMrSheet(encodedMrId) {
2560
+ const mrId = safeDecodeURIComponent(encodedMrId);
2561
+ const mr = mrDataStore.get(mrId);
2562
+ if (!mr) return;
2563
+
2564
+ const contentEl = document.getElementById('mr-sheet-content');
2565
+ contentEl.innerHTML = renderMrSheetContent(mr, t, mr._sheetType);
2566
+
2567
+ document.getElementById('mr-sheet-overlay').classList.add('open');
2568
+ document.getElementById('mr-sheet').classList.add('open');
2569
+ document.body.style.overflow = 'hidden';
2570
+
2571
+ refreshIcons();
2572
+
2573
+ requestAnimationFrame(() => {
2574
+ if (mr.reviews?.length) {
2575
+ drawScoreTimeline('sheet-score-canvas', mr.reviews);
2576
+ }
2577
+ const totalResolved = (mr.openThreads ?? 0) === 0 ? 1 : 0;
2578
+ drawIssuesBreakdown('sheet-issues-canvas', mr.totalBlocking || 0, mr.totalWarnings || 0, totalResolved);
2579
+ });
2580
+ }
2581
+
2582
+ function closeMrSheet() {
2583
+ document.getElementById('mr-sheet-overlay').classList.remove('open');
2584
+ document.getElementById('mr-sheet').classList.remove('open');
2585
+ document.body.style.overflow = '';
2586
+ logsVisible = false;
2587
+ }
2588
+
2589
+ document.addEventListener('keydown', (e) => {
2590
+ if (e.key === 'Escape') {
2591
+ closeMrSheet();
2592
+ closeDevSheet();
2593
+ }
2594
+ });
2595
+
2058
2596
  // Expose functions to HTML onclick handlers
2597
+ window.checkForUpdates = checkForUpdates;
2598
+ window.triggerVersionUpdate = triggerVersionUpdate;
2599
+ window.copyUpdateCommand = copyUpdateCommand;
2600
+ window.toggleCollapsibleList = toggleCollapsibleList;
2059
2601
  window.checkClaudeStatus = checkClaudeStatus;
2060
2602
  window.toggleLogs = toggleLogs;
2061
2603
  window.toggleStats = toggleStats;
@@ -2079,6 +2621,22 @@
2079
2621
  window.toggleSection = toggleSection;
2080
2622
  window.onUsefulLinkAction = onUsefulLinkAction;
2081
2623
  window.activateOnKeydown = activateOnKeydown;
2624
+ window.handleCleanupClick = handleCleanupClick;
2625
+ window.openMrSheet = openMrSheet;
2626
+ window.closeMrSheet = closeMrSheet;
2627
+ window.openDevSheet = openDevSheet;
2628
+ window.closeDevSheet = closeDevSheet;
2629
+ window.generateAiInsights = generateAiInsights;
2630
+ window.exportInsightsPdf = exportInsightsPdf;
2631
+ window.toggleTeamAnalysis = toggleTeamAnalysis;
2632
+ window.toggleTeamSection = toggleTeamSection;
2633
+ window.clearLogs = clearLogs;
2634
+
2635
+ // Init cleanup section
2636
+ const cleanupContent = document.getElementById('cleanup-content');
2637
+ if (cleanupContent) {
2638
+ cleanupContent.innerHTML = renderCleanupSection(14);
2639
+ }
2082
2640
 
2083
2641
  // Init
2084
2642
  if (typeof Notification !== 'undefined' && Notification.permission === 'default') {
@@ -2102,6 +2660,7 @@
2102
2660
  fetchReviewFiles();
2103
2661
  fetchProjectStats();
2104
2662
  fetchMrTracking();
2663
+ fetchTeamInsights();
2105
2664
  }, 30000);
2106
2665
 
2107
2666
  setInterval(() => {