reviewflow 3.7.0 → 3.8.1

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 (290) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +28 -0
  3. package/dist/entities/insight/aiInsight.d.ts +6 -0
  4. package/dist/entities/insight/aiInsight.d.ts.map +1 -0
  5. package/dist/entities/insight/aiInsight.js +2 -0
  6. package/dist/entities/insight/aiInsight.js.map +1 -0
  7. package/dist/entities/insight/aiInsight.schema.d.ts +55 -0
  8. package/dist/entities/insight/aiInsight.schema.d.ts.map +1 -0
  9. package/dist/entities/insight/aiInsight.schema.js +25 -0
  10. package/dist/entities/insight/aiInsight.schema.js.map +1 -0
  11. package/dist/entities/insight/developerInsight.d.ts +8 -0
  12. package/dist/entities/insight/developerInsight.d.ts.map +1 -0
  13. package/dist/entities/insight/developerInsight.guard.d.ts +221 -0
  14. package/dist/entities/insight/developerInsight.guard.d.ts.map +1 -0
  15. package/dist/entities/insight/developerInsight.guard.js +13 -0
  16. package/dist/entities/insight/developerInsight.guard.js.map +1 -0
  17. package/dist/entities/insight/developerInsight.js +2 -0
  18. package/dist/entities/insight/developerInsight.js.map +1 -0
  19. package/dist/entities/insight/developerInsight.schema.d.ts +157 -0
  20. package/dist/entities/insight/developerInsight.schema.d.ts.map +1 -0
  21. package/dist/entities/insight/developerInsight.schema.js +43 -0
  22. package/dist/entities/insight/developerInsight.schema.js.map +1 -0
  23. package/dist/entities/insight/developerTitle.d.ts +12 -0
  24. package/dist/entities/insight/developerTitle.d.ts.map +1 -0
  25. package/dist/entities/insight/developerTitle.js +11 -0
  26. package/dist/entities/insight/developerTitle.js.map +1 -0
  27. package/dist/entities/insight/insightCategory.d.ts +10 -0
  28. package/dist/entities/insight/insightCategory.d.ts.map +1 -0
  29. package/dist/entities/insight/insightCategory.js +4 -0
  30. package/dist/entities/insight/insightCategory.js.map +1 -0
  31. package/dist/entities/insight/insightTrend.d.ts +9 -0
  32. package/dist/entities/insight/insightTrend.d.ts.map +1 -0
  33. package/dist/entities/insight/insightTrend.js +4 -0
  34. package/dist/entities/insight/insightTrend.js.map +1 -0
  35. package/dist/entities/insight/insights.gateway.d.ts +6 -0
  36. package/dist/entities/insight/insights.gateway.d.ts.map +1 -0
  37. package/dist/entities/insight/insights.gateway.js +2 -0
  38. package/dist/entities/insight/insights.gateway.js.map +1 -0
  39. package/dist/entities/insight/persistedInsightsData.d.ts +5 -0
  40. package/dist/entities/insight/persistedInsightsData.d.ts.map +1 -0
  41. package/dist/entities/insight/persistedInsightsData.guard.d.ts +271 -0
  42. package/dist/entities/insight/persistedInsightsData.guard.d.ts.map +1 -0
  43. package/dist/entities/insight/persistedInsightsData.guard.js +13 -0
  44. package/dist/entities/insight/persistedInsightsData.guard.js.map +1 -0
  45. package/dist/entities/insight/persistedInsightsData.js +2 -0
  46. package/dist/entities/insight/persistedInsightsData.js.map +1 -0
  47. package/dist/entities/insight/persistedInsightsData.schema.d.ts +84 -0
  48. package/dist/entities/insight/persistedInsightsData.schema.d.ts.map +1 -0
  49. package/dist/entities/insight/persistedInsightsData.schema.js +40 -0
  50. package/dist/entities/insight/persistedInsightsData.schema.js.map +1 -0
  51. package/dist/entities/insight/teamInsight.d.ts +5 -0
  52. package/dist/entities/insight/teamInsight.d.ts.map +1 -0
  53. package/dist/entities/insight/teamInsight.guard.d.ts +71 -0
  54. package/dist/entities/insight/teamInsight.guard.d.ts.map +1 -0
  55. package/dist/entities/insight/teamInsight.guard.js +13 -0
  56. package/dist/entities/insight/teamInsight.guard.js.map +1 -0
  57. package/dist/entities/insight/teamInsight.js +2 -0
  58. package/dist/entities/insight/teamInsight.js.map +1 -0
  59. package/dist/entities/insight/teamInsight.schema.d.ts +31 -0
  60. package/dist/entities/insight/teamInsight.schema.d.ts.map +1 -0
  61. package/dist/entities/insight/teamInsight.schema.js +17 -0
  62. package/dist/entities/insight/teamInsight.schema.js.map +1 -0
  63. package/dist/entities/packageVersion/packageVersion.d.ts +3 -0
  64. package/dist/entities/packageVersion/packageVersion.d.ts.map +1 -1
  65. package/dist/entities/packageVersion/selfUpdateCommand.gateway.d.ts +2 -1
  66. package/dist/entities/packageVersion/selfUpdateCommand.gateway.d.ts.map +1 -1
  67. package/dist/entities/review/reviewFile.gateway.d.ts +18 -0
  68. package/dist/entities/review/reviewFile.gateway.d.ts.map +1 -0
  69. package/dist/entities/review/reviewFile.gateway.js +2 -0
  70. package/dist/entities/review/reviewFile.gateway.js.map +1 -0
  71. package/dist/entities/stats/projectStats.d.ts +3 -0
  72. package/dist/entities/stats/projectStats.d.ts.map +1 -1
  73. package/dist/entities/tracking/reviewRequestTracking.gateway.d.ts +19 -0
  74. package/dist/entities/tracking/reviewRequestTracking.gateway.d.ts.map +1 -0
  75. package/dist/entities/tracking/reviewRequestTracking.gateway.js +2 -0
  76. package/dist/entities/tracking/reviewRequestTracking.gateway.js.map +1 -0
  77. package/dist/frameworks/claude/claudeInsightsInvoker.d.ts +3 -0
  78. package/dist/frameworks/claude/claudeInsightsInvoker.d.ts.map +1 -0
  79. package/dist/frameworks/claude/claudeInsightsInvoker.js +58 -0
  80. package/dist/frameworks/claude/claudeInsightsInvoker.js.map +1 -0
  81. package/dist/interface-adapters/controllers/http/insights.routes.d.ts +20 -0
  82. package/dist/interface-adapters/controllers/http/insights.routes.d.ts.map +1 -0
  83. package/dist/interface-adapters/controllers/http/insights.routes.js +73 -0
  84. package/dist/interface-adapters/controllers/http/insights.routes.js.map +1 -0
  85. package/dist/interface-adapters/controllers/http/settings.routes.d.ts.map +1 -1
  86. package/dist/interface-adapters/controllers/http/settings.routes.js +3 -0
  87. package/dist/interface-adapters/controllers/http/settings.routes.js.map +1 -1
  88. package/dist/interface-adapters/controllers/http/version.routes.d.ts +1 -0
  89. package/dist/interface-adapters/controllers/http/version.routes.d.ts.map +1 -1
  90. package/dist/interface-adapters/controllers/http/version.routes.js +4 -1
  91. package/dist/interface-adapters/controllers/http/version.routes.js.map +1 -1
  92. package/dist/interface-adapters/gateways/fileSystem/insights.fileSystem.d.ts +7 -0
  93. package/dist/interface-adapters/gateways/fileSystem/insights.fileSystem.d.ts.map +1 -0
  94. package/dist/interface-adapters/gateways/fileSystem/insights.fileSystem.js +33 -0
  95. package/dist/interface-adapters/gateways/fileSystem/insights.fileSystem.js.map +1 -0
  96. package/dist/interface-adapters/gateways/reviewFile.gateway.d.ts +1 -17
  97. package/dist/interface-adapters/gateways/reviewFile.gateway.d.ts.map +1 -1
  98. package/dist/interface-adapters/gateways/reviewRequestTracking.gateway.d.ts +1 -18
  99. package/dist/interface-adapters/gateways/reviewRequestTracking.gateway.d.ts.map +1 -1
  100. package/dist/interface-adapters/gateways/selfUpdate.cli.gateway.d.ts +3 -2
  101. package/dist/interface-adapters/gateways/selfUpdate.cli.gateway.d.ts.map +1 -1
  102. package/dist/interface-adapters/gateways/selfUpdate.cli.gateway.js +29 -15
  103. package/dist/interface-adapters/gateways/selfUpdate.cli.gateway.js.map +1 -1
  104. package/dist/interface-adapters/presenters/insights.presenter.d.ts +41 -0
  105. package/dist/interface-adapters/presenters/insights.presenter.d.ts.map +1 -0
  106. package/dist/interface-adapters/presenters/insights.presenter.js +36 -0
  107. package/dist/interface-adapters/presenters/insights.presenter.js.map +1 -0
  108. package/dist/interface-adapters/views/dashboard/index.html +242 -2
  109. package/dist/interface-adapters/views/dashboard/modules/developerSheet.d.ts +14 -0
  110. package/dist/interface-adapters/views/dashboard/modules/developerSheet.d.ts.map +1 -0
  111. package/dist/interface-adapters/views/dashboard/modules/developerSheet.js +359 -0
  112. package/dist/interface-adapters/views/dashboard/modules/developerSheet.js.map +1 -0
  113. package/dist/interface-adapters/views/dashboard/modules/i18n.d.ts.map +1 -1
  114. package/dist/interface-adapters/views/dashboard/modules/i18n.js +201 -1
  115. package/dist/interface-adapters/views/dashboard/modules/i18n.js.map +1 -1
  116. package/dist/interface-adapters/views/dashboard/modules/insightsReport.d.ts +7 -0
  117. package/dist/interface-adapters/views/dashboard/modules/insightsReport.d.ts.map +1 -0
  118. package/dist/interface-adapters/views/dashboard/modules/insightsReport.js +509 -0
  119. package/dist/interface-adapters/views/dashboard/modules/insightsReport.js.map +1 -0
  120. package/dist/interface-adapters/views/dashboard/modules/sharedViewHelpers.d.ts +40 -0
  121. package/dist/interface-adapters/views/dashboard/modules/sharedViewHelpers.d.ts.map +1 -0
  122. package/dist/interface-adapters/views/dashboard/modules/sharedViewHelpers.js +106 -0
  123. package/dist/interface-adapters/views/dashboard/modules/sharedViewHelpers.js.map +1 -0
  124. package/dist/interface-adapters/views/dashboard/modules/teamTab.d.ts +13 -0
  125. package/dist/interface-adapters/views/dashboard/modules/teamTab.d.ts.map +1 -0
  126. package/dist/interface-adapters/views/dashboard/modules/teamTab.js +296 -0
  127. package/dist/interface-adapters/views/dashboard/modules/teamTab.js.map +1 -0
  128. package/dist/interface-adapters/views/dashboard/styles.css +967 -0
  129. package/dist/main/dependencies.d.ts +2 -0
  130. package/dist/main/dependencies.d.ts.map +1 -1
  131. package/dist/main/dependencies.js +2 -0
  132. package/dist/main/dependencies.js.map +1 -1
  133. package/dist/main/routes.d.ts.map +1 -1
  134. package/dist/main/routes.js +13 -0
  135. package/dist/main/routes.js.map +1 -1
  136. package/dist/services/statsService.d.ts.map +1 -1
  137. package/dist/services/statsService.js +46 -27
  138. package/dist/services/statsService.js.map +1 -1
  139. package/dist/tests/factories/developerInsight.factory.d.ts +6 -0
  140. package/dist/tests/factories/developerInsight.factory.d.ts.map +1 -0
  141. package/dist/tests/factories/developerInsight.factory.js +61 -0
  142. package/dist/tests/factories/developerInsight.factory.js.map +1 -0
  143. package/dist/tests/factories/persistedInsightsData.factory.d.ts +11 -0
  144. package/dist/tests/factories/persistedInsightsData.factory.d.ts.map +1 -0
  145. package/dist/tests/factories/persistedInsightsData.factory.js +41 -0
  146. package/dist/tests/factories/persistedInsightsData.factory.js.map +1 -0
  147. package/dist/tests/factories/teamInsight.factory.d.ts +6 -0
  148. package/dist/tests/factories/teamInsight.factory.d.ts.map +1 -0
  149. package/dist/tests/factories/teamInsight.factory.js +35 -0
  150. package/dist/tests/factories/teamInsight.factory.js.map +1 -0
  151. package/dist/tests/stubs/insights.stub.d.ts +9 -0
  152. package/dist/tests/stubs/insights.stub.d.ts.map +1 -0
  153. package/dist/tests/stubs/insights.stub.js +13 -0
  154. package/dist/tests/stubs/insights.stub.js.map +1 -0
  155. package/dist/tests/stubs/reviewFile.stub.d.ts +1 -1
  156. package/dist/tests/stubs/reviewFile.stub.d.ts.map +1 -1
  157. package/dist/tests/stubs/reviewRequestTracking.stub.d.ts +1 -1
  158. package/dist/tests/stubs/reviewRequestTracking.stub.d.ts.map +1 -1
  159. package/dist/tests/stubs/selfUpdate.stub.d.ts +4 -2
  160. package/dist/tests/stubs/selfUpdate.stub.d.ts.map +1 -1
  161. package/dist/tests/stubs/selfUpdate.stub.js +6 -4
  162. package/dist/tests/stubs/selfUpdate.stub.js.map +1 -1
  163. package/dist/tests/units/entities/insight/aiInsight.schema.test.d.ts +2 -0
  164. package/dist/tests/units/entities/insight/aiInsight.schema.test.d.ts.map +1 -0
  165. package/dist/tests/units/entities/insight/aiInsight.schema.test.js +123 -0
  166. package/dist/tests/units/entities/insight/aiInsight.schema.test.js.map +1 -0
  167. package/dist/tests/units/entities/insight/developerInsight.schema.test.d.ts +2 -0
  168. package/dist/tests/units/entities/insight/developerInsight.schema.test.d.ts.map +1 -0
  169. package/dist/tests/units/entities/insight/developerInsight.schema.test.js +140 -0
  170. package/dist/tests/units/entities/insight/developerInsight.schema.test.js.map +1 -0
  171. package/dist/tests/units/entities/insight/developerTitle.test.d.ts +2 -0
  172. package/dist/tests/units/entities/insight/developerTitle.test.d.ts.map +1 -0
  173. package/dist/tests/units/entities/insight/developerTitle.test.js +23 -0
  174. package/dist/tests/units/entities/insight/developerTitle.test.js.map +1 -0
  175. package/dist/tests/units/entities/insight/insightCategory.test.d.ts +2 -0
  176. package/dist/tests/units/entities/insight/insightCategory.test.d.ts.map +1 -0
  177. package/dist/tests/units/entities/insight/insightCategory.test.js +16 -0
  178. package/dist/tests/units/entities/insight/insightCategory.test.js.map +1 -0
  179. package/dist/tests/units/entities/insight/insightTrend.test.d.ts +2 -0
  180. package/dist/tests/units/entities/insight/insightTrend.test.d.ts.map +1 -0
  181. package/dist/tests/units/entities/insight/insightTrend.test.js +16 -0
  182. package/dist/tests/units/entities/insight/insightTrend.test.js.map +1 -0
  183. package/dist/tests/units/entities/insight/persistedInsightsData.schema.test.d.ts +2 -0
  184. package/dist/tests/units/entities/insight/persistedInsightsData.schema.test.d.ts.map +1 -0
  185. package/dist/tests/units/entities/insight/persistedInsightsData.schema.test.js +160 -0
  186. package/dist/tests/units/entities/insight/persistedInsightsData.schema.test.js.map +1 -0
  187. package/dist/tests/units/entities/insight/teamInsight.schema.test.d.ts +2 -0
  188. package/dist/tests/units/entities/insight/teamInsight.schema.test.d.ts.map +1 -0
  189. package/dist/tests/units/entities/insight/teamInsight.schema.test.js +57 -0
  190. package/dist/tests/units/entities/insight/teamInsight.schema.test.js.map +1 -0
  191. package/dist/tests/units/interface-adapters/controllers/http/insights.routes.test.d.ts +2 -0
  192. package/dist/tests/units/interface-adapters/controllers/http/insights.routes.test.d.ts.map +1 -0
  193. package/dist/tests/units/interface-adapters/controllers/http/insights.routes.test.js +390 -0
  194. package/dist/tests/units/interface-adapters/controllers/http/insights.routes.test.js.map +1 -0
  195. package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.d.ts +2 -0
  196. package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.d.ts.map +1 -0
  197. package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.js +25 -0
  198. package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.js.map +1 -0
  199. package/dist/tests/units/interface-adapters/controllers/http/version.routes.test.js +25 -0
  200. package/dist/tests/units/interface-adapters/controllers/http/version.routes.test.js.map +1 -1
  201. package/dist/tests/units/interface-adapters/gateways/insights.gateway.test.d.ts +2 -0
  202. package/dist/tests/units/interface-adapters/gateways/insights.gateway.test.d.ts.map +1 -0
  203. package/dist/tests/units/interface-adapters/gateways/insights.gateway.test.js +117 -0
  204. package/dist/tests/units/interface-adapters/gateways/insights.gateway.test.js.map +1 -0
  205. package/dist/tests/units/interface-adapters/gateways/selfUpdate.cli.gateway.test.js +84 -16
  206. package/dist/tests/units/interface-adapters/gateways/selfUpdate.cli.gateway.test.js.map +1 -1
  207. package/dist/tests/units/interface-adapters/presenters/insights.presenter.test.d.ts +2 -0
  208. package/dist/tests/units/interface-adapters/presenters/insights.presenter.test.d.ts.map +1 -0
  209. package/dist/tests/units/interface-adapters/presenters/insights.presenter.test.js +194 -0
  210. package/dist/tests/units/interface-adapters/presenters/insights.presenter.test.js.map +1 -0
  211. package/dist/tests/units/interface-adapters/views/dashboard/modules/developerSheet.test.d.ts +2 -0
  212. package/dist/tests/units/interface-adapters/views/dashboard/modules/developerSheet.test.d.ts.map +1 -0
  213. package/dist/tests/units/interface-adapters/views/dashboard/modules/developerSheet.test.js +224 -0
  214. package/dist/tests/units/interface-adapters/views/dashboard/modules/developerSheet.test.js.map +1 -0
  215. package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.js +29 -0
  216. package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.js.map +1 -1
  217. package/dist/tests/units/interface-adapters/views/dashboard/modules/insightsReport.test.d.ts +2 -0
  218. package/dist/tests/units/interface-adapters/views/dashboard/modules/insightsReport.test.d.ts.map +1 -0
  219. package/dist/tests/units/interface-adapters/views/dashboard/modules/insightsReport.test.js +326 -0
  220. package/dist/tests/units/interface-adapters/views/dashboard/modules/insightsReport.test.js.map +1 -0
  221. package/dist/tests/units/interface-adapters/views/dashboard/modules/teamTab.test.d.ts +2 -0
  222. package/dist/tests/units/interface-adapters/views/dashboard/modules/teamTab.test.d.ts.map +1 -0
  223. package/dist/tests/units/interface-adapters/views/dashboard/modules/teamTab.test.js +336 -0
  224. package/dist/tests/units/interface-adapters/views/dashboard/modules/teamTab.test.js.map +1 -0
  225. package/dist/tests/units/services/statsService.addReview.test.d.ts +2 -0
  226. package/dist/tests/units/services/statsService.addReview.test.d.ts.map +1 -0
  227. package/dist/tests/units/services/statsService.addReview.test.js +103 -0
  228. package/dist/tests/units/services/statsService.addReview.test.js.map +1 -0
  229. package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.d.ts +2 -0
  230. package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.d.ts.map +1 -0
  231. package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.js +172 -0
  232. package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.js.map +1 -0
  233. package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.d.ts +2 -0
  234. package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.d.ts.map +1 -0
  235. package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.js +449 -0
  236. package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.js.map +1 -0
  237. package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.d.ts +2 -0
  238. package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.d.ts.map +1 -0
  239. package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.js +326 -0
  240. package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.js.map +1 -0
  241. package/dist/tests/units/usecases/insights/computeTeamInsights.usecase.test.d.ts +2 -0
  242. package/dist/tests/units/usecases/insights/computeTeamInsights.usecase.test.d.ts.map +1 -0
  243. package/dist/tests/units/usecases/insights/computeTeamInsights.usecase.test.js +172 -0
  244. package/dist/tests/units/usecases/insights/computeTeamInsights.usecase.test.js.map +1 -0
  245. package/dist/tests/units/usecases/insights/generateAiInsights.usecase.test.d.ts +2 -0
  246. package/dist/tests/units/usecases/insights/generateAiInsights.usecase.test.d.ts.map +1 -0
  247. package/dist/tests/units/usecases/insights/generateAiInsights.usecase.test.js +253 -0
  248. package/dist/tests/units/usecases/insights/generateAiInsights.usecase.test.js.map +1 -0
  249. package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.d.ts +2 -0
  250. package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.d.ts.map +1 -0
  251. package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.js +160 -0
  252. package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.js.map +1 -0
  253. package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.d.ts +2 -0
  254. package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.d.ts.map +1 -0
  255. package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.js +125 -0
  256. package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.js.map +1 -0
  257. package/dist/tests/units/usecases/version/triggerSelfUpdate.usecase.test.js +5 -0
  258. package/dist/tests/units/usecases/version/triggerSelfUpdate.usecase.test.js.map +1 -1
  259. package/dist/usecases/insights/buildAiInsightsPrompt.d.ts +12 -0
  260. package/dist/usecases/insights/buildAiInsightsPrompt.d.ts.map +1 -0
  261. package/dist/usecases/insights/buildAiInsightsPrompt.js +220 -0
  262. package/dist/usecases/insights/buildAiInsightsPrompt.js.map +1 -0
  263. package/dist/usecases/insights/computeDeveloperInsights.usecase.d.ts +4 -0
  264. package/dist/usecases/insights/computeDeveloperInsights.usecase.d.ts.map +1 -0
  265. package/dist/usecases/insights/computeDeveloperInsights.usecase.js +226 -0
  266. package/dist/usecases/insights/computeDeveloperInsights.usecase.js.map +1 -0
  267. package/dist/usecases/insights/computeInsightsWithPersistence.usecase.d.ts +12 -0
  268. package/dist/usecases/insights/computeInsightsWithPersistence.usecase.d.ts.map +1 -0
  269. package/dist/usecases/insights/computeInsightsWithPersistence.usecase.js +340 -0
  270. package/dist/usecases/insights/computeInsightsWithPersistence.usecase.js.map +1 -0
  271. package/dist/usecases/insights/computeTeamInsights.usecase.d.ts +4 -0
  272. package/dist/usecases/insights/computeTeamInsights.usecase.d.ts.map +1 -0
  273. package/dist/usecases/insights/computeTeamInsights.usecase.js +111 -0
  274. package/dist/usecases/insights/computeTeamInsights.usecase.js.map +1 -0
  275. package/dist/usecases/insights/generateAiInsights.usecase.d.ts +27 -0
  276. package/dist/usecases/insights/generateAiInsights.usecase.d.ts.map +1 -0
  277. package/dist/usecases/insights/generateAiInsights.usecase.js +65 -0
  278. package/dist/usecases/insights/generateAiInsights.usecase.js.map +1 -0
  279. package/dist/usecases/insights/getInsightsWithAiStatus.usecase.d.ts +18 -0
  280. package/dist/usecases/insights/getInsightsWithAiStatus.usecase.d.ts.map +1 -0
  281. package/dist/usecases/insights/getInsightsWithAiStatus.usecase.js +56 -0
  282. package/dist/usecases/insights/getInsightsWithAiStatus.usecase.js.map +1 -0
  283. package/dist/usecases/insights/insightLevelComputation.service.d.ts +41 -0
  284. package/dist/usecases/insights/insightLevelComputation.service.d.ts.map +1 -0
  285. package/dist/usecases/insights/insightLevelComputation.service.js +313 -0
  286. package/dist/usecases/insights/insightLevelComputation.service.js.map +1 -0
  287. package/dist/usecases/version/triggerSelfUpdate.usecase.d.ts.map +1 -1
  288. package/dist/usecases/version/triggerSelfUpdate.usecase.js +3 -0
  289. package/dist/usecases/version/triggerSelfUpdate.usecase.js.map +1 -1
  290. package/package.json +1 -1
@@ -0,0 +1,359 @@
1
+ import { escapeHtml } from './html.js';
2
+ import { icon } from './icons.js';
3
+ import {
4
+ getAvatarBorderClass,
5
+ renderLevelRing,
6
+ renderStatBar,
7
+ } from './sharedViewHelpers.js';
8
+
9
+ const CATEGORY_KEYS = ['quality', 'responsiveness', 'codeVolume', 'iteration'];
10
+
11
+ const RADAR_CSS_SIZE = 400;
12
+ const RADAR_MAX_RADIUS = 120;
13
+ const RADAR_LABEL_OFFSET = 32;
14
+
15
+ const COLORS = {
16
+ textPrimary: '#e8efff',
17
+ textMuted: '#8393b0',
18
+ focus: '#7ad8ff',
19
+ success: '#62d3a8',
20
+ warning: '#f4bc71',
21
+ danger: '#f07f88',
22
+ gridLine: 'rgba(131, 147, 176, 0.15)',
23
+ areaFill: 'rgba(122, 216, 255, 0.15)',
24
+ areaStroke: 'rgba(122, 216, 255, 0.6)',
25
+ };
26
+
27
+ /**
28
+ * @param {number} value
29
+ * @param {number} [decimals]
30
+ * @returns {string}
31
+ */
32
+ function formatNumber(value, decimals = 1) {
33
+ return Number(value).toFixed(decimals);
34
+ }
35
+
36
+ /**
37
+ * @param {object} metrics
38
+ * @param {(key: string, params?: Record<string, string|number>) => string} translate
39
+ * @returns {string}
40
+ */
41
+ function renderMetricsSection(metrics, translate) {
42
+ if (!metrics) return '';
43
+
44
+ const qualityRate = Math.round(metrics.firstReviewQualityRate * 100);
45
+
46
+ return `
47
+ <div class="sheet-section">
48
+ <div class="sheet-section-title">${icon('bar-chart-2')} ${translate('devSheet.metrics')}</div>
49
+ <div class="sheet-stats-grid">
50
+ <div class="sheet-stat-card dev-score">
51
+ <div class="sheet-stat-label">${icon('star')} ${translate('devSheet.metrics.averageScore')}</div>
52
+ <div class="sheet-stat-value">${formatNumber(metrics.averageScore)}<span class="sheet-stat-unit">/10</span></div>
53
+ </div>
54
+ <div class="sheet-stat-card dev-blocking">
55
+ <div class="sheet-stat-label">${icon('shield-alert')} ${translate('devSheet.metrics.blockingPerReview')}</div>
56
+ <div class="sheet-stat-value">${formatNumber(metrics.averageBlocking)}</div>
57
+ </div>
58
+ <div class="sheet-stat-card dev-warnings">
59
+ <div class="sheet-stat-label">${icon('alert-triangle')} ${translate('devSheet.metrics.warningsPerReview')}</div>
60
+ <div class="sheet-stat-value">${formatNumber(metrics.averageWarnings)}</div>
61
+ </div>
62
+ <div class="sheet-stat-card dev-quality">
63
+ <div class="sheet-stat-label">${icon('zap')} ${translate('devSheet.metrics.firstPassQuality')}</div>
64
+ <div class="sheet-stat-value">${qualityRate}<span class="sheet-stat-unit">%</span></div>
65
+ </div>
66
+ </div>
67
+ ${metrics.averageAdditions > 0 ? `
68
+ <div class="dev-sheet-diff-row">
69
+ <span class="dev-sheet-additions">+${Math.round(metrics.averageAdditions)}</span>
70
+ <span class="dev-sheet-deletions">-${Math.round(metrics.averageDeletions)}</span>
71
+ </div>
72
+ ` : ''}
73
+ </div>
74
+ `;
75
+ }
76
+
77
+ /**
78
+ * @param {Array<{category: string, type: string, descriptionKey: string, params: object|null}>} descriptions
79
+ * @param {string} type
80
+ * @param {(key: string, params?: Record<string, string|number>) => string} translate
81
+ * @returns {string}
82
+ */
83
+ function renderInsightDescriptions(descriptions, type, translate) {
84
+ const filtered = (descriptions || []).filter((description) => description.type === type);
85
+ if (filtered.length === 0) return '';
86
+
87
+ const iconName = type === 'strength' ? 'check-circle' : 'alert-circle';
88
+ const itemClass = type === 'strength' ? 'strength' : 'weakness';
89
+
90
+ return filtered.map((description) => {
91
+ const text = translate(description.descriptionKey, description.params || {});
92
+ return `<li class="dev-sheet-list-item ${itemClass}">${icon(iconName)} ${escapeHtml(text)}</li>`;
93
+ }).join('');
94
+ }
95
+
96
+ /**
97
+ * @param {object|null} aiDeveloper
98
+ * @param {(key: string, params?: Record<string, string|number>) => string} translate
99
+ * @returns {string}
100
+ */
101
+ function renderAiAnalysisSection(aiDeveloper, translate) {
102
+ if (!aiDeveloper) {
103
+ return `
104
+ <div class="ai-section ai-no-insights">
105
+ <span class="ai-no-insights-text">${icon('sparkles', 'ai-sparkle-icon')} ${translate('ai.noInsights')}</span>
106
+ </div>
107
+ `;
108
+ }
109
+
110
+ const strengthsList = aiDeveloper.strengths.map(
111
+ (strength) => `<li class="ai-list-item">${icon('check-circle', 'ai-list-icon')} ${escapeHtml(strength)}</li>`
112
+ ).join('');
113
+
114
+ const weaknessesList = aiDeveloper.weaknesses.map(
115
+ (weakness) => `<li class="ai-list-item">${icon('alert-circle', 'ai-list-icon')} ${escapeHtml(weakness)}</li>`
116
+ ).join('');
117
+
118
+ const recommendationsList = aiDeveloper.recommendations.map(
119
+ (recommendation) => `<li class="ai-list-item">${icon('lightbulb', 'ai-list-icon')} ${escapeHtml(recommendation)}</li>`
120
+ ).join('');
121
+
122
+ return `
123
+ <div class="ai-section">
124
+ <div class="sheet-section-title">${icon('sparkles', 'ai-sparkle-icon')} ${translate('ai.section')}</div>
125
+ <div class="ai-section-group">
126
+ <div class="ai-section-label">${icon('user')} ${translate('ai.summary')}</div>
127
+ <div class="ai-summary">${escapeHtml(aiDeveloper.summary)}</div>
128
+ </div>
129
+ ${aiDeveloper.strengths.length > 0 ? `
130
+ <div class="ai-section-group">
131
+ <div class="ai-section-label">${icon('check-circle')} ${translate('ai.strengths')}</div>
132
+ <ul class="ai-list">${strengthsList}</ul>
133
+ </div>
134
+ ` : ''}
135
+ ${aiDeveloper.weaknesses.length > 0 ? `
136
+ <div class="ai-section-group">
137
+ <div class="ai-section-label">${icon('alert-circle')} ${translate('ai.weaknesses')}</div>
138
+ <ul class="ai-list">${weaknessesList}</ul>
139
+ </div>
140
+ ` : ''}
141
+ ${aiDeveloper.recommendations.length > 0 ? `
142
+ <div class="ai-section-group">
143
+ <div class="ai-section-label">${icon('lightbulb')} ${translate('ai.recommendations')}</div>
144
+ <ul class="ai-list">${recommendationsList}</ul>
145
+ </div>
146
+ ` : ''}
147
+ </div>
148
+ `;
149
+ }
150
+
151
+ /**
152
+ * @param {object} developer
153
+ * @param {(key: string, params?: Record<string, string|number>) => string} translate
154
+ * @param {object|null} [aiDeveloper]
155
+ * @returns {string}
156
+ */
157
+ export function renderDeveloperSheetContent(developer, translate, aiDeveloper) {
158
+ const initial = developer.developerName.charAt(0).toUpperCase();
159
+ const avatarBorderClass = getAvatarBorderClass(developer.overallLevel);
160
+
161
+ const statBarsHtml = CATEGORY_KEYS.map(
162
+ (key) => renderStatBar(developer.categoryLevels[key], key, translate)
163
+ ).join('');
164
+
165
+ const hasDescriptions = developer.insightDescriptions && developer.insightDescriptions.length > 0;
166
+
167
+ const strengthsHtml = hasDescriptions
168
+ ? renderInsightDescriptions(developer.insightDescriptions, 'strength', translate)
169
+ : developer.strengths.map(
170
+ (category) => `<li class="dev-sheet-list-item strength">${icon('check-circle')} ${translate('category.' + category)}</li>`
171
+ ).join('');
172
+
173
+ const weaknessesHtml = hasDescriptions
174
+ ? renderInsightDescriptions(developer.insightDescriptions, 'weakness', translate)
175
+ : developer.weaknesses.map(
176
+ (category) => `<li class="dev-sheet-list-item weakness">${icon('alert-circle')} ${translate('category.' + category)}</li>`
177
+ ).join('');
178
+
179
+ const topPriorityHtml = developer.topPriority
180
+ ? `<span class="dev-sheet-priority-value">${icon('target')} ${translate('category.' + developer.topPriority)}</span>`
181
+ : `<span class="dev-sheet-priority-empty">${translate('devSheet.noTopPriority')}</span>`;
182
+
183
+ const metricsHtml = renderMetricsSection(developer.metrics, translate);
184
+
185
+ const titleHtml = aiDeveloper
186
+ ? `<div class="dev-sheet-title ai-title">${icon('sparkles', 'ai-sparkle-icon')} ${escapeHtml(aiDeveloper.title)}</div>
187
+ <div class="ai-title-explanation">${icon('info', 'ai-explanation-icon')} ${translate('ai.titleExplanation')}: ${escapeHtml(aiDeveloper.titleExplanation)}</div>`
188
+ : `<div class="dev-sheet-title">${translate('title.' + developer.title)}</div>`;
189
+
190
+ const aiSectionHtml = renderAiAnalysisSection(aiDeveloper || null, translate);
191
+
192
+ return `
193
+ <button class="sheet-close" onclick="closeDevSheet()" aria-label="Close">
194
+ ${icon('x')}
195
+ </button>
196
+
197
+ <div class="dev-sheet-header">
198
+ <div class="dev-sheet-avatar ${avatarBorderClass}">${escapeHtml(initial)}</div>
199
+ <div class="dev-sheet-identity">
200
+ <div class="dev-sheet-name">${escapeHtml(developer.developerName)}</div>
201
+ ${titleHtml}
202
+ </div>
203
+ ${renderLevelRing(developer.overallLevel, 64, translate('team.overallLevel') + ' ' + developer.overallLevel + '/10')}
204
+ </div>
205
+
206
+ ${metricsHtml}
207
+
208
+ <div class="sheet-section">
209
+ <div class="radar-chart-container">
210
+ <canvas id="dev-radar-canvas" width="${RADAR_CSS_SIZE}" height="${RADAR_CSS_SIZE}"></canvas>
211
+ </div>
212
+ </div>
213
+
214
+ <div class="sheet-section">
215
+ <div class="dev-sheet-bars">
216
+ ${statBarsHtml}
217
+ </div>
218
+ </div>
219
+
220
+ <div class="sheet-section">
221
+ <div class="sheet-section-title">${icon('trending-up')} ${translate('devSheet.scoreTrend')}</div>
222
+ <div class="sheet-canvas-wrap">
223
+ <canvas id="dev-score-trend-canvas" width="460" height="180"></canvas>
224
+ </div>
225
+ </div>
226
+
227
+ ${aiSectionHtml}
228
+
229
+ <div class="dev-sheet-insights-grid">
230
+ <div class="sheet-section">
231
+ <div class="sheet-section-title">${icon('thumbs-up')} ${translate('devSheet.strengths')}</div>
232
+ <ul class="dev-sheet-list">${strengthsHtml || '<li class="dev-sheet-list-empty">-</li>'}</ul>
233
+ </div>
234
+
235
+ <div class="sheet-section">
236
+ <div class="sheet-section-title">${icon('alert-triangle')} ${translate('devSheet.weaknesses')}</div>
237
+ <ul class="dev-sheet-list">${weaknessesHtml || '<li class="dev-sheet-list-empty">-</li>'}</ul>
238
+ </div>
239
+ </div>
240
+
241
+ <div class="sheet-section">
242
+ <div class="sheet-section-title">${icon('target')} ${translate('devSheet.topPriority')}</div>
243
+ ${topPriorityHtml}
244
+ </div>
245
+
246
+ <div class="dev-sheet-review-badge">
247
+ ${icon('file-search')} ${translate('devSheet.reviewCount', { count: developer.reviewCount })}
248
+ </div>
249
+ `;
250
+ }
251
+
252
+ /**
253
+ * @param {string} canvasId
254
+ * @param {object} categoryLevels
255
+ * @param {(key: string, params?: Record<string, string|number>) => string} translate
256
+ */
257
+ export function drawRadarChart(canvasId, categoryLevels, translate) {
258
+ const canvas = document.getElementById(canvasId);
259
+ if (!canvas) return;
260
+ const ctx = canvas.getContext('2d');
261
+ if (!ctx) return;
262
+
263
+ const dpr = window.devicePixelRatio || 1;
264
+ const cssSize = RADAR_CSS_SIZE;
265
+ canvas.width = cssSize * dpr;
266
+ canvas.height = cssSize * dpr;
267
+ canvas.style.width = `${cssSize}px`;
268
+ canvas.style.height = `${cssSize}px`;
269
+ ctx.scale(dpr, dpr);
270
+
271
+ const centerX = cssSize / 2;
272
+ const centerY = cssSize / 2;
273
+ const maxRadius = RADAR_MAX_RADIUS;
274
+
275
+ const axes = [
276
+ { key: 'quality', angle: -Math.PI / 2 },
277
+ { key: 'responsiveness', angle: 0 },
278
+ { key: 'iteration', angle: Math.PI / 2 },
279
+ { key: 'codeVolume', angle: Math.PI },
280
+ ];
281
+
282
+ for (let ring = 2; ring <= 10; ring += 2) {
283
+ const radius = (ring / 10) * maxRadius;
284
+ ctx.beginPath();
285
+ for (let axisIndex = 0; axisIndex < axes.length; axisIndex++) {
286
+ const angle = axes[axisIndex].angle;
287
+ const pointX = centerX + Math.cos(angle) * radius;
288
+ const pointY = centerY + Math.sin(angle) * radius;
289
+ if (axisIndex === 0) {
290
+ ctx.moveTo(pointX, pointY);
291
+ } else {
292
+ ctx.lineTo(pointX, pointY);
293
+ }
294
+ }
295
+ ctx.closePath();
296
+ ctx.strokeStyle = COLORS.gridLine;
297
+ ctx.lineWidth = 0.5;
298
+ ctx.stroke();
299
+ }
300
+
301
+ for (const axis of axes) {
302
+ ctx.beginPath();
303
+ ctx.moveTo(centerX, centerY);
304
+ ctx.lineTo(
305
+ centerX + Math.cos(axis.angle) * maxRadius,
306
+ centerY + Math.sin(axis.angle) * maxRadius
307
+ );
308
+ ctx.strokeStyle = COLORS.gridLine;
309
+ ctx.lineWidth = 0.5;
310
+ ctx.stroke();
311
+ }
312
+
313
+ ctx.beginPath();
314
+ for (let axisIndex = 0; axisIndex < axes.length; axisIndex++) {
315
+ const axis = axes[axisIndex];
316
+ const level = categoryLevels[axis.key]?.level || 0;
317
+ const radius = (level / 10) * maxRadius;
318
+ const pointX = centerX + Math.cos(axis.angle) * radius;
319
+ const pointY = centerY + Math.sin(axis.angle) * radius;
320
+ if (axisIndex === 0) {
321
+ ctx.moveTo(pointX, pointY);
322
+ } else {
323
+ ctx.lineTo(pointX, pointY);
324
+ }
325
+ }
326
+ ctx.closePath();
327
+ ctx.fillStyle = COLORS.areaFill;
328
+ ctx.fill();
329
+ ctx.strokeStyle = COLORS.areaStroke;
330
+ ctx.lineWidth = 2;
331
+ ctx.stroke();
332
+
333
+ for (const axis of axes) {
334
+ const level = categoryLevels[axis.key]?.level || 0;
335
+ const radius = (level / 10) * maxRadius;
336
+ const pointX = centerX + Math.cos(axis.angle) * radius;
337
+ const pointY = centerY + Math.sin(axis.angle) * radius;
338
+
339
+ ctx.beginPath();
340
+ ctx.arc(pointX, pointY, 4, 0, Math.PI * 2);
341
+ ctx.fillStyle = COLORS.focus;
342
+ ctx.fill();
343
+ ctx.strokeStyle = COLORS.textPrimary;
344
+ ctx.lineWidth = 1.5;
345
+ ctx.stroke();
346
+ }
347
+
348
+ ctx.font = '11px system-ui, -apple-system, sans-serif';
349
+ ctx.fillStyle = COLORS.textMuted;
350
+ ctx.textAlign = 'center';
351
+ ctx.textBaseline = 'middle';
352
+
353
+ for (const axis of axes) {
354
+ const labelRadius = maxRadius + RADAR_LABEL_OFFSET;
355
+ const labelX = centerX + Math.cos(axis.angle) * labelRadius;
356
+ const labelY = centerY + Math.sin(axis.angle) * labelRadius;
357
+ ctx.fillText(translate('category.' + axis.key), labelX, labelY);
358
+ }
359
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"developerSheet.js","sourceRoot":"","sources":["../../../../../src/interface-adapters/views/dashboard/modules/developerSheet.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAE/E,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,MAAM,MAAM,GAAG;IACb,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,2BAA2B;IACrC,QAAQ,EAAE,2BAA2B;IACrC,UAAU,EAAE,0BAA0B;CACvC,CAAC;AAEF;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,CAAC;IACvC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,OAAO,EAAE,SAAS;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAC;IAErE,OAAO;;yCAEgC,IAAI,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,kBAAkB,CAAC;;;0CAGnD,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,+BAA+B,CAAC;0CAC1D,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC;;;0CAGlC,IAAI,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,oCAAoC,CAAC;0CACvE,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC;;;0CAGrC,IAAI,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC,oCAAoC,CAAC;0CACzE,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC;;;0CAGrC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,mCAAmC,CAAC;0CAC7D,WAAW;;;QAG7C,OAAO,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC;;+CAEQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;+CACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;;OAE5E,CAAC,CAAC,CAAC,EAAE;;GAET,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,YAAY,EAAE,IAAI,EAAE,SAAS;IAC9D,MAAM,QAAQ,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,QAAQ,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;IAEhE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO,kCAAkC,SAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;IACnG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,WAAW,EAAE,SAAS;IACrD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;;4CAEiC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,IAAI,SAAS,CAAC,eAAe,CAAC;;KAExG,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAC7C,CAAC,QAAQ,EAAE,EAAE,CAAC,4BAA4B,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAC9G,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,MAAM,cAAc,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAC/C,CAAC,QAAQ,EAAE,EAAE,CAAC,4BAA4B,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAC9G,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,MAAM,mBAAmB,GAAG,WAAW,CAAC,eAAe,CAAC,GAAG,CACzD,CAAC,cAAc,EAAE,EAAE,CAAC,4BAA4B,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,UAAU,CAAC,cAAc,CAAC,OAAO,CACvH,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,OAAO;;yCAEgC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,IAAI,SAAS,CAAC,YAAY,CAAC;;wCAE/D,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,YAAY,CAAC;kCAC7C,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC;;QAEzD,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;0CAED,IAAI,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC;gCAC3D,aAAa;;OAEtC,CAAC,CAAC,CAAC,EAAE;QACJ,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;0CAEF,IAAI,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,eAAe,CAAC;gCAC5D,cAAc;;OAEvC,CAAC,CAAC,CAAC,EAAE;QACJ,WAAW,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;0CAEP,IAAI,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,oBAAoB,CAAC;gCAC9D,mBAAmB;;OAE5C,CAAC,CAAC,CAAC,EAAE;;GAET,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW;IAC3E,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAEvE,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CACpC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CACtE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,MAAM,eAAe,GAAG,SAAS,CAAC,mBAAmB,IAAI,SAAS,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;IAElG,MAAM,aAAa,GAAG,eAAe;QACnC,CAAC,CAAC,yBAAyB,CAAC,SAAS,CAAC,mBAAmB,EAAE,UAAU,EAAE,SAAS,CAAC;QACjF,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CACrB,CAAC,QAAQ,EAAE,EAAE,CAAC,4CAA4C,IAAI,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAC3H,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,cAAc,GAAG,eAAe;QACpC,CAAC,CAAC,yBAAyB,CAAC,SAAS,CAAC,mBAAmB,EAAE,UAAU,EAAE,SAAS,CAAC;QACjF,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CACtB,CAAC,QAAQ,EAAE,EAAE,CAAC,4CAA4C,IAAI,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAC3H,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,eAAe,GAAG,SAAS,CAAC,WAAW;QAC3C,CAAC,CAAC,0CAA0C,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,SAAS;QACrH,CAAC,CAAC,0CAA0C,SAAS,CAAC,wBAAwB,CAAC,SAAS,CAAC;IAE3F,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEvE,MAAM,SAAS,GAAG,WAAW;QAC3B,CAAC,CAAC,yCAAyC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC;2CACxE,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,IAAI,SAAS,CAAC,qBAAqB,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ;QACnK,CAAC,CAAC,gCAAgC,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;IAElF,MAAM,aAAa,GAAG,uBAAuB,CAAC,WAAW,IAAI,IAAI,EAAE,SAAS,CAAC,CAAC;IAE9E,OAAO;;QAED,IAAI,CAAC,GAAG,CAAC;;;;qCAIoB,iBAAiB,KAAK,UAAU,CAAC,OAAO,CAAC;;sCAExC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC;UAC/D,SAAS;;QAEX,eAAe,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC;;;MAGpH,WAAW;;;;+CAI8B,cAAc,aAAa,cAAc;;;;;;UAM9E,YAAY;;;;;yCAKmB,IAAI,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,qBAAqB,CAAC;;;;;;MAM1F,aAAa;;;;2CAIwB,IAAI,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,oBAAoB,CAAC;qCAC1D,aAAa,IAAI,yCAAyC;;;;2CAIpD,IAAI,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC,qBAAqB,CAAC;qCAChE,cAAc,IAAI,yCAAyC;;;;;yCAKvD,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,sBAAsB,CAAC;QACpF,eAAe;;;;QAIf,IAAI,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC;;GAE/F,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,cAAc,CAAC;IAC/B,MAAM,CAAC,KAAK,GAAG,OAAO,GAAG,GAAG,CAAC;IAC7B,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,OAAO,IAAI,CAAC;IACpC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC;IACrC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEpB,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,gBAAgB,CAAC;IAEnC,MAAM,IAAI,GAAG;QACX,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE;QACvC,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE;QACnC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE;QACxC,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;KACtC,CAAC;IAEF,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC;QACvC,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YAClD,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YAClD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,GAAG,CAAC,MAAM,CACR,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,EAC1C,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,CAC3C,CAAC;QACF,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAED,GAAG,CAAC,SAAS,EAAE,CAAC;IAChB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QACvD,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QACvD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,GAAG,CAAC,SAAS,EAAE,CAAC;IAChB,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;IAChC,GAAG,CAAC,IAAI,EAAE,CAAC;IACX,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;IACpC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;IAClB,GAAG,CAAC,MAAM,EAAE,CAAC;IAEb,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QACvD,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QAEvD,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3C,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7B,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACrC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAED,GAAG,CAAC,IAAI,GAAG,2CAA2C,CAAC;IACvD,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACjC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;IACzB,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,SAAS,GAAG,kBAAkB,CAAC;QACnD,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;QAC5D,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;QAC5D,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/interface-adapters/views/dashboard/modules/i18n.js"],"names":[],"mappings":"AA4jBA,6BAA6B;AAC7B,+BADc,IAAI,GAAG,IAAI,CAGxB;AAED,oCAAoC;AACpC,sCADY,IAAI,GAAG,IAAI,QAGtB;AAED;;;;GAIG;AACH,uBAJW,MAAM,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAC7B,MAAM,CAUlB"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/interface-adapters/views/dashboard/modules/i18n.js"],"names":[],"mappings":"AAowBA,6BAA6B;AAC7B,+BADc,IAAI,GAAG,IAAI,CAGxB;AAED,oCAAoC;AACpC,sCADY,IAAI,GAAG,IAAI,QAGtB;AAED;;;;GAIG;AACH,uBAJW,MAAM,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAC7B,MAAM,CAUlB"}
@@ -276,6 +276,103 @@ const translations = {
276
276
  'stats.allDevs': 'All',
277
277
  'stats.filterByDev': 'Filter by developer',
278
278
 
279
+ // Team tab
280
+ 'team.title': 'Team',
281
+ 'team.insights': 'Team Insights',
282
+ 'team.strengths': 'Strengths',
283
+ 'team.weaknesses': 'Areas to improve',
284
+ 'team.tips': 'Tips',
285
+ 'team.noData': 'No review data yet. Reviews will appear here once the first review is completed.',
286
+ 'team.insufficientData': '{{current}}/{{required}} reviews — more data needed',
287
+ 'team.notEnoughDevs': 'Not enough developers for team comparison',
288
+ 'team.loading': 'Loading team insights...',
289
+ 'team.overallLevel': 'Level',
290
+ 'team.reviews': '{{count}} reviews',
291
+ 'team.healthStrip.developers': 'Number of developers',
292
+ 'team.healthStrip.reviews': 'Total reviews analyzed',
293
+ 'team.healthStrip.avgLevel': 'Average team level',
294
+
295
+ // Categories
296
+ 'category.quality': 'Quality',
297
+ 'category.responsiveness': 'Responsiveness',
298
+ 'category.codeVolume': 'Code Volume',
299
+ 'category.iteration': 'Iteration',
300
+
301
+ // Titles (RPG)
302
+ 'title.architect': 'The Architect',
303
+ 'title.firefighter': 'The Firefighter',
304
+ 'title.workhorse': 'The Workhorse',
305
+ 'title.sentinel': 'The Sentinel',
306
+ 'title.polyvalent': 'The Polyvalent',
307
+ 'title.risingStar': 'The Rising Star',
308
+
309
+ // Trends
310
+ 'trend.improving': 'Improving',
311
+ 'trend.declining': 'Declining',
312
+ 'trend.stable': 'Stable',
313
+
314
+ // Developer sheet
315
+ 'devSheet.strengths': 'Strengths',
316
+ 'devSheet.weaknesses': 'Areas to improve',
317
+ 'devSheet.topPriority': 'Top Priority',
318
+ 'devSheet.noTopPriority': 'No priority — great job!',
319
+ 'devSheet.scoreTrend': 'Score Trend',
320
+ 'devSheet.reviewCount': '{{count}} reviews analyzed',
321
+ 'devSheet.metrics': 'Key Metrics',
322
+ 'devSheet.metrics.averageScore': 'Average score',
323
+ 'devSheet.metrics.blockingPerReview': 'Blocking per review',
324
+ 'devSheet.metrics.warningsPerReview': 'Warnings per review',
325
+ 'devSheet.metrics.averageAdditions': 'Avg additions',
326
+ 'devSheet.metrics.averageDeletions': 'Avg deletions',
327
+ 'devSheet.metrics.firstPassQuality': 'First-pass quality',
328
+
329
+ // Insight descriptions
330
+ 'insight.quality.highScore': 'Average score {{score}}/10 — {{percent}}% above team average',
331
+ 'insight.quality.lowScore': 'Average score {{score}}/10 — {{percent}}% below team average',
332
+ 'insight.quality.lowBlocking': 'Only {{blocking}} blocking issues per review on average',
333
+ 'insight.quality.highBlocking': '{{blocking}} blocking issues per review — {{percent}}% above team',
334
+ 'insight.responsiveness.fast': 'Reviews completed in {{duration}} avg — {{percent}}% faster than team',
335
+ 'insight.responsiveness.slow': 'Reviews take {{duration}} avg — {{percent}}% slower than team',
336
+ 'insight.codeVolume.high': 'Handles {{lines}} lines per review on average',
337
+ 'insight.codeVolume.low': 'Small changes with {{lines}} lines per review',
338
+ 'insight.iteration.good': '{{rate}}% of reviews need no followup — strong first-pass quality',
339
+ 'insight.iteration.poor': '{{rate}}% of reviews have blocking issues — multiple iterations needed',
340
+ 'insight.quality.improving': 'Quality is on an upward trend — keep it up',
341
+ 'insight.responsiveness.improving': 'Responsiveness is improving — reviews are getting faster',
342
+ 'insight.codeVolume.improving': 'Code volume is increasing — handling larger changes',
343
+ 'insight.iteration.improving': 'Iteration efficiency is improving — fewer blocking issues recently',
344
+
345
+ // AI insights
346
+ 'ai.generate': 'Generate AI Insights',
347
+ 'ai.refresh': 'Refresh AI Insights',
348
+ 'ai.generating': 'Generating...',
349
+ 'ai.lastGenerated': 'AI insights from {{date}}',
350
+ 'ai.newDataAvailable': 'New reviews available',
351
+ 'ai.section': 'AI Analysis',
352
+ 'ai.noInsights': 'Generate AI insights for detailed analysis',
353
+ 'ai.teamAnalysis': 'Team Analysis',
354
+ 'ai.strengths': 'Strengths',
355
+ 'ai.weaknesses': 'Areas to improve',
356
+ 'ai.recommendations': 'Recommendations',
357
+ 'ai.dynamics': 'Team Dynamics',
358
+ 'ai.summary': 'Profile',
359
+ 'ai.error': 'Error generating insights',
360
+ 'ai.titleExplanation': 'Why this title',
361
+
362
+ // Export PDF
363
+ 'export.pdf': 'Export PDF',
364
+ 'export.title': 'Team Insights Report',
365
+ 'export.generatedAt': 'Generated on {{date}}',
366
+ 'export.generatedBy': 'Generated by ReviewFlow',
367
+ 'export.teamSection': 'Team Analysis',
368
+ 'export.developerSection': 'Developer Profiles',
369
+ 'export.metrics': 'Key Metrics',
370
+ 'export.avgScore': 'Avg Score',
371
+ 'export.avgBlocking': 'Avg Blocking',
372
+ 'export.firstPassRate': 'First-Pass Quality',
373
+ 'export.avgDuration': 'Avg Duration',
374
+ 'export.overallLevel': 'Overall Level',
375
+
279
376
  // Version update
280
377
  'version.updateAvailable': 'Update to v{{version}}',
281
378
  'version.checking': 'Checking...',
@@ -284,6 +381,9 @@ const translations = {
284
381
  'version.updateFailed': 'Update failed',
285
382
  'version.restarting': 'Restarting server...',
286
383
  'version.checkTooltip': 'Check for updates',
384
+ 'version.permissionDenied': 'Permission denied. Run this command manually:',
385
+ 'version.copyCommand': 'Copy command',
386
+ 'version.commandCopied': 'Command copied!',
287
387
  },
288
388
  fr: {
289
389
  // Time
@@ -555,11 +655,108 @@ const translations = {
555
655
  'stats.allDevs': 'Tous',
556
656
  'stats.filterByDev': 'Filtrer par développeur',
557
657
 
558
- // Version update
559
658
  // Collapsible lists
560
659
  'collapsible.showMore': 'Afficher {{count}} de plus...',
561
660
  'collapsible.showLess': 'Réduire',
562
661
 
662
+ // Team tab
663
+ 'team.title': 'Équipe',
664
+ 'team.insights': 'Insights équipe',
665
+ 'team.strengths': 'Points forts',
666
+ 'team.weaknesses': "Axes d'amélioration",
667
+ 'team.tips': 'Conseils',
668
+ 'team.noData': 'Pas encore de données de review. Les reviews apparaîtront ici une fois la première review terminée.',
669
+ 'team.insufficientData': '{{current}}/{{required}} reviews — plus de données nécessaires',
670
+ 'team.notEnoughDevs': "Pas assez de développeurs pour une comparaison d'équipe",
671
+ 'team.loading': 'Chargement des insights équipe...',
672
+ 'team.overallLevel': 'Niveau',
673
+ 'team.reviews': '{{count}} reviews',
674
+ 'team.healthStrip.developers': 'Nombre de développeurs',
675
+ 'team.healthStrip.reviews': 'Reviews totales analysées',
676
+ 'team.healthStrip.avgLevel': "Niveau moyen de l'équipe",
677
+
678
+ // Categories
679
+ 'category.quality': 'Qualité',
680
+ 'category.responsiveness': 'Réactivité',
681
+ 'category.codeVolume': 'Volume de code',
682
+ 'category.iteration': 'Itération',
683
+
684
+ // Titles (RPG)
685
+ 'title.architect': "L'Architecte",
686
+ 'title.firefighter': 'Le Pompier',
687
+ 'title.workhorse': 'Le Bosseur',
688
+ 'title.sentinel': 'La Sentinelle',
689
+ 'title.polyvalent': 'Le Polyvalent',
690
+ 'title.risingStar': "L'Étoile Montante",
691
+
692
+ // Trends
693
+ 'trend.improving': 'En amélioration',
694
+ 'trend.declining': 'En déclin',
695
+ 'trend.stable': 'Stable',
696
+
697
+ // Developer sheet
698
+ 'devSheet.strengths': 'Points forts',
699
+ 'devSheet.weaknesses': "Axes d'amélioration",
700
+ 'devSheet.topPriority': 'Priorité',
701
+ 'devSheet.noTopPriority': 'Aucune priorité — excellent travail !',
702
+ 'devSheet.scoreTrend': 'Tendance du score',
703
+ 'devSheet.reviewCount': '{{count}} reviews analysées',
704
+ 'devSheet.metrics': 'Indicateurs clés',
705
+ 'devSheet.metrics.averageScore': 'Score moyen',
706
+ 'devSheet.metrics.blockingPerReview': 'Bloquants par review',
707
+ 'devSheet.metrics.warningsPerReview': 'Avertissements par review',
708
+ 'devSheet.metrics.averageAdditions': 'Ajouts moyens',
709
+ 'devSheet.metrics.averageDeletions': 'Suppressions moyennes',
710
+ 'devSheet.metrics.firstPassQuality': 'Qualité 1re passe',
711
+
712
+ // Insight descriptions
713
+ 'insight.quality.highScore': 'Score moyen {{score}}/10 — {{percent}}% au-dessus de la moyenne équipe',
714
+ 'insight.quality.lowScore': 'Score moyen {{score}}/10 — {{percent}}% en-dessous de la moyenne équipe',
715
+ 'insight.quality.lowBlocking': 'Seulement {{blocking}} problèmes bloquants par review en moyenne',
716
+ 'insight.quality.highBlocking': '{{blocking}} problèmes bloquants par review — {{percent}}% au-dessus de l\'équipe',
717
+ 'insight.responsiveness.fast': 'Reviews complétées en {{duration}} en moyenne — {{percent}}% plus rapide que l\'équipe',
718
+ 'insight.responsiveness.slow': 'Les reviews prennent {{duration}} en moyenne — {{percent}}% plus lent que l\'équipe',
719
+ 'insight.codeVolume.high': 'Gère {{lines}} lignes par review en moyenne',
720
+ 'insight.codeVolume.low': 'Petits changements avec {{lines}} lignes par review',
721
+ 'insight.iteration.good': '{{rate}}% des reviews sans besoin de suivi — excellente qualité de première passe',
722
+ 'insight.iteration.poor': '{{rate}}% des reviews ont des problèmes bloquants — plusieurs itérations nécessaires',
723
+ 'insight.quality.improving': 'La qualité est en hausse — continuez comme ça',
724
+ 'insight.responsiveness.improving': 'La réactivité s\'améliore — les reviews sont de plus en plus rapides',
725
+ 'insight.codeVolume.improving': 'Le volume de code augmente — gestion de changements plus importants',
726
+ 'insight.iteration.improving': 'L\'efficacité d\'itération s\'améliore — moins de problèmes bloquants récemment',
727
+
728
+ // AI insights
729
+ 'ai.generate': 'Générer les insights IA',
730
+ 'ai.refresh': 'Actualiser les insights IA',
731
+ 'ai.generating': 'Génération en cours...',
732
+ 'ai.lastGenerated': 'Insights IA du {{date}}',
733
+ 'ai.newDataAvailable': 'Nouvelles reviews disponibles',
734
+ 'ai.section': 'Analyse IA',
735
+ 'ai.noInsights': 'Générer les insights IA pour une analyse détaillée',
736
+ 'ai.teamAnalysis': 'Analyse d\'équipe',
737
+ 'ai.strengths': 'Points forts',
738
+ 'ai.weaknesses': 'Axes d\'amélioration',
739
+ 'ai.recommendations': 'Recommandations',
740
+ 'ai.dynamics': 'Dynamique d\'équipe',
741
+ 'ai.summary': 'Profil',
742
+ 'ai.error': 'Erreur lors de la génération des insights',
743
+ 'ai.titleExplanation': 'Pourquoi ce titre',
744
+
745
+ // Export PDF
746
+ 'export.pdf': 'Exporter PDF',
747
+ 'export.title': "Rapport d'insights \u00e9quipe",
748
+ 'export.generatedAt': 'G\u00e9n\u00e9r\u00e9 le {{date}}',
749
+ 'export.generatedBy': 'G\u00e9n\u00e9r\u00e9 par ReviewFlow',
750
+ 'export.teamSection': "Analyse d'\u00e9quipe",
751
+ 'export.developerSection': 'Profils d\u00e9veloppeurs',
752
+ 'export.metrics': 'M\u00e9triques cl\u00e9s',
753
+ 'export.avgScore': 'Score moyen',
754
+ 'export.avgBlocking': 'Bloquants moyens',
755
+ 'export.firstPassRate': 'Qualit\u00e9 premi\u00e8re passe',
756
+ 'export.avgDuration': 'Dur\u00e9e moyenne',
757
+ 'export.overallLevel': 'Niveau global',
758
+
759
+ // Version update
563
760
  'version.updateAvailable': 'Mettre à jour vers v{{version}}',
564
761
  'version.checking': 'Vérification...',
565
762
  'version.updating': 'Mise à jour...',
@@ -567,6 +764,9 @@ const translations = {
567
764
  'version.updateFailed': 'Échec de la mise à jour',
568
765
  'version.restarting': 'Redémarrage du serveur...',
569
766
  'version.checkTooltip': 'Vérifier les mises à jour',
767
+ 'version.permissionDenied': 'Permission refusée. Exécutez cette commande manuellement :',
768
+ 'version.copyCommand': 'Copier la commande',
769
+ 'version.commandCopied': 'Commande copiée !',
570
770
  },
571
771
  };
572
772