reviewflow 3.17.0 → 3.19.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 (189) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/config/projectConfig.d.ts +8 -0
  3. package/dist/config/projectConfig.d.ts.map +1 -1
  4. package/dist/config/projectConfig.js +59 -7
  5. package/dist/config/projectConfig.js.map +1 -1
  6. package/dist/dashboard/index.html +303 -175
  7. package/dist/dashboard/modules/budgetSettings.d.ts.map +1 -1
  8. package/dist/dashboard/modules/budgetSettings.js +2 -4
  9. package/dist/dashboard/modules/budgetSettings.js.map +1 -1
  10. package/dist/dashboard/modules/desktopNotifications.d.ts.map +1 -1
  11. package/dist/dashboard/modules/desktopNotifications.js +1 -0
  12. package/dist/dashboard/modules/desktopNotifications.js.map +1 -1
  13. package/dist/dashboard/modules/i18n.d.ts.map +1 -1
  14. package/dist/dashboard/modules/i18n.js +12 -0
  15. package/dist/dashboard/modules/i18n.js.map +1 -1
  16. package/dist/dashboard/modules/pendingReviews.d.ts +49 -0
  17. package/dist/dashboard/modules/pendingReviews.d.ts.map +1 -0
  18. package/dist/dashboard/modules/pendingReviews.js +80 -0
  19. package/dist/dashboard/modules/pendingReviews.js.map +1 -0
  20. package/dist/dashboard/styles.css +162 -8
  21. package/dist/frameworks/config/configLoader.d.ts +2 -0
  22. package/dist/frameworks/config/configLoader.d.ts.map +1 -1
  23. package/dist/frameworks/config/configLoader.js +27 -2
  24. package/dist/frameworks/config/configLoader.js.map +1 -1
  25. package/dist/main/routes.d.ts.map +1 -1
  26. package/dist/main/routes.js +57 -2
  27. package/dist/main/routes.js.map +1 -1
  28. package/dist/main/websocket.d.ts +1 -0
  29. package/dist/main/websocket.d.ts.map +1 -1
  30. package/dist/main/websocket.js +11 -0
  31. package/dist/main/websocket.js.map +1 -1
  32. package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.d.ts.map +1 -1
  33. package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.js +24 -6
  34. package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.js.map +1 -1
  35. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts +2 -0
  36. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
  37. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js +54 -6
  38. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
  39. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts +6 -0
  40. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
  41. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js +76 -21
  42. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
  43. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.gateway.d.ts +8 -0
  44. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.gateway.d.ts.map +1 -0
  45. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.gateway.js +2 -0
  46. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.gateway.js.map +1 -0
  47. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.d.ts +29 -0
  48. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.d.ts.map +1 -0
  49. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.js +4 -0
  50. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.js.map +1 -0
  51. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.schema.d.ts +94 -0
  52. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.schema.d.ts.map +1 -0
  53. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.schema.js +40 -0
  54. package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.schema.js.map +1 -0
  55. package/dist/modules/review-execution/entities/progress/agentDefinition.type.d.ts +4 -0
  56. package/dist/modules/review-execution/entities/progress/agentDefinition.type.d.ts.map +1 -1
  57. package/dist/modules/review-execution/entities/progress/agentDefinition.type.js +42 -0
  58. package/dist/modules/review-execution/entities/progress/agentDefinition.type.js.map +1 -1
  59. package/dist/modules/review-execution/entities/progress/reviewFocus.type.d.ts +8 -0
  60. package/dist/modules/review-execution/entities/progress/reviewFocus.type.d.ts.map +1 -0
  61. package/dist/modules/review-execution/entities/progress/reviewFocus.type.js +30 -0
  62. package/dist/modules/review-execution/entities/progress/reviewFocus.type.js.map +1 -0
  63. package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.d.ts +13 -0
  64. package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.d.ts.map +1 -0
  65. package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.js +34 -0
  66. package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.js.map +1 -0
  67. package/dist/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.d.ts +16 -0
  68. package/dist/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.d.ts.map +1 -0
  69. package/dist/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.js +81 -0
  70. package/dist/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.js.map +1 -0
  71. package/dist/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.d.ts +25 -0
  72. package/dist/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.d.ts.map +1 -0
  73. package/dist/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.js +41 -0
  74. package/dist/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.js.map +1 -0
  75. package/dist/modules/review-execution/services/processorRegistry.d.ts +15 -0
  76. package/dist/modules/review-execution/services/processorRegistry.d.ts.map +1 -0
  77. package/dist/modules/review-execution/services/processorRegistry.js +23 -0
  78. package/dist/modules/review-execution/services/processorRegistry.js.map +1 -0
  79. package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.d.ts +32 -0
  80. package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.d.ts.map +1 -0
  81. package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.js +29 -0
  82. package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.js.map +1 -0
  83. package/dist/modules/review-execution/usecases/dismissPendingReview.usecase.d.ts +26 -0
  84. package/dist/modules/review-execution/usecases/dismissPendingReview.usecase.d.ts.map +1 -0
  85. package/dist/modules/review-execution/usecases/dismissPendingReview.usecase.js +22 -0
  86. package/dist/modules/review-execution/usecases/dismissPendingReview.usecase.js.map +1 -0
  87. package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.d.ts +36 -0
  88. package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.d.ts.map +1 -0
  89. package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.js +36 -0
  90. package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.js.map +1 -0
  91. package/dist/modules/review-execution/usecases/listPendingReviews.usecase.d.ts +11 -0
  92. package/dist/modules/review-execution/usecases/listPendingReviews.usecase.d.ts.map +1 -0
  93. package/dist/modules/review-execution/usecases/listPendingReviews.usecase.js +10 -0
  94. package/dist/modules/review-execution/usecases/listPendingReviews.usecase.js.map +1 -0
  95. package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.d.ts +2 -0
  96. package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.d.ts.map +1 -1
  97. package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.js +22 -4
  98. package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.js.map +1 -1
  99. package/dist/modules/tracking/usecases/tracking/checkFollowupNeeded.usecase.d.ts.map +1 -1
  100. package/dist/modules/tracking/usecases/tracking/checkFollowupNeeded.usecase.js +1 -3
  101. package/dist/modules/tracking/usecases/tracking/checkFollowupNeeded.usecase.js.map +1 -1
  102. package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.d.ts +2 -0
  103. package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.d.ts.map +1 -0
  104. package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.js +161 -0
  105. package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.js.map +1 -0
  106. package/dist/tests/acceptance/46-github-followup-review-on-push.acceptance.test.js +1 -0
  107. package/dist/tests/acceptance/46-github-followup-review-on-push.acceptance.test.js.map +1 -1
  108. package/dist/tests/acceptance/reviewFocus.acceptance.test.d.ts +2 -0
  109. package/dist/tests/acceptance/reviewFocus.acceptance.test.d.ts.map +1 -0
  110. package/dist/tests/acceptance/reviewFocus.acceptance.test.js +114 -0
  111. package/dist/tests/acceptance/reviewFocus.acceptance.test.js.map +1 -0
  112. package/dist/tests/factories/config.factory.d.ts.map +1 -1
  113. package/dist/tests/factories/config.factory.js +1 -0
  114. package/dist/tests/factories/config.factory.js.map +1 -1
  115. package/dist/tests/factories/pendingReviewRequest.factory.d.ts +5 -0
  116. package/dist/tests/factories/pendingReviewRequest.factory.d.ts.map +1 -0
  117. package/dist/tests/factories/pendingReviewRequest.factory.js +25 -0
  118. package/dist/tests/factories/pendingReviewRequest.factory.js.map +1 -0
  119. package/dist/tests/factories/projectConfig.factory.d.ts +21 -0
  120. package/dist/tests/factories/projectConfig.factory.d.ts.map +1 -0
  121. package/dist/tests/factories/projectConfig.factory.js +43 -0
  122. package/dist/tests/factories/projectConfig.factory.js.map +1 -0
  123. package/dist/tests/stubs/pendingReviewRequest.stub.d.ts +14 -0
  124. package/dist/tests/stubs/pendingReviewRequest.stub.d.ts.map +1 -0
  125. package/dist/tests/stubs/pendingReviewRequest.stub.js +29 -0
  126. package/dist/tests/stubs/pendingReviewRequest.stub.js.map +1 -0
  127. package/dist/tests/units/config/projectConfig.test.js +101 -1
  128. package/dist/tests/units/config/projectConfig.test.js.map +1 -1
  129. package/dist/tests/units/dashboard/modules/pendingReviews.test.d.ts +2 -0
  130. package/dist/tests/units/dashboard/modules/pendingReviews.test.d.ts.map +1 -0
  131. package/dist/tests/units/dashboard/modules/pendingReviews.test.js +60 -0
  132. package/dist/tests/units/dashboard/modules/pendingReviews.test.js.map +1 -0
  133. package/dist/tests/units/frameworks/config/configLoader.test.js +85 -0
  134. package/dist/tests/units/frameworks/config/configLoader.test.js.map +1 -1
  135. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js +1 -0
  136. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js.map +1 -1
  137. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +1 -0
  138. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
  139. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.d.ts +2 -0
  140. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.d.ts.map +1 -0
  141. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js +130 -0
  142. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js.map +1 -0
  143. package/dist/tests/units/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.test.d.ts +2 -0
  144. package/dist/tests/units/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.test.d.ts.map +1 -0
  145. package/dist/tests/units/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.test.js +32 -0
  146. package/dist/tests/units/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.test.js.map +1 -0
  147. package/dist/tests/units/modules/review-execution/entities/progress/agentDefinition.type.test.d.ts +2 -0
  148. package/dist/tests/units/modules/review-execution/entities/progress/agentDefinition.type.test.d.ts.map +1 -0
  149. package/dist/tests/units/modules/review-execution/entities/progress/agentDefinition.type.test.js +108 -0
  150. package/dist/tests/units/modules/review-execution/entities/progress/agentDefinition.type.test.js.map +1 -0
  151. package/dist/tests/units/modules/review-execution/entities/progress/reviewFocus.type.test.d.ts +2 -0
  152. package/dist/tests/units/modules/review-execution/entities/progress/reviewFocus.type.test.d.ts.map +1 -0
  153. package/dist/tests/units/modules/review-execution/entities/progress/reviewFocus.type.test.js +73 -0
  154. package/dist/tests/units/modules/review-execution/entities/progress/reviewFocus.type.test.js.map +1 -0
  155. package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.d.ts +2 -0
  156. package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.d.ts.map +1 -0
  157. package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.js +114 -0
  158. package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.js.map +1 -0
  159. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.test.d.ts +2 -0
  160. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.test.d.ts.map +1 -0
  161. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.test.js +67 -0
  162. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.test.js.map +1 -0
  163. package/dist/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.d.ts +2 -0
  164. package/dist/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.d.ts.map +1 -0
  165. package/dist/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.js +40 -0
  166. package/dist/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.js.map +1 -0
  167. package/dist/tests/units/modules/review-execution/services/processorRegistry.test.d.ts +2 -0
  168. package/dist/tests/units/modules/review-execution/services/processorRegistry.test.d.ts.map +1 -0
  169. package/dist/tests/units/modules/review-execution/services/processorRegistry.test.js +54 -0
  170. package/dist/tests/units/modules/review-execution/services/processorRegistry.test.js.map +1 -0
  171. package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.d.ts +2 -0
  172. package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.d.ts.map +1 -0
  173. package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js +86 -0
  174. package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js.map +1 -0
  175. package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.d.ts +2 -0
  176. package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.d.ts.map +1 -0
  177. package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.js +50 -0
  178. package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.js.map +1 -0
  179. package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.d.ts +2 -0
  180. package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.d.ts.map +1 -0
  181. package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js +134 -0
  182. package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js.map +1 -0
  183. package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.d.ts +2 -0
  184. package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.d.ts.map +1 -0
  185. package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.js +27 -0
  186. package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.js.map +1 -0
  187. package/dist/tests/units/usecases/tracking/checkFollowupNeeded.usecase.test.js +46 -11
  188. package/dist/tests/units/usecases/tracking/checkFollowupNeeded.usecase.test.js.map +1 -1
  189. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -5,6 +5,28 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.19.0](https://github.com/DGouron/review-flow/compare/reviewflow-v3.18.0...reviewflow-v3.19.0) (2026-05-24)
9
+
10
+
11
+ ### Added
12
+
13
+ * **review-execution:** add SPEC-174 semi-auto trigger mode ([#188](https://github.com/DGouron/review-flow/issues/188)) ([4971431](https://github.com/DGouron/review-flow/commit/497143115432a7be92d7bfd62fdf124e994d2875))
14
+
15
+ ## [3.18.0](https://github.com/DGouron/review-flow/compare/reviewflow-v3.17.1...reviewflow-v3.18.0) (2026-05-23)
16
+
17
+
18
+ ### Added
19
+
20
+ * **dashboard:** sidebar layout + Claude economics accordion ([#191](https://github.com/DGouron/review-flow/issues/191)) ([73f8b29](https://github.com/DGouron/review-flow/commit/73f8b29ce2678a6d67b78ee6da9ebbc72e95f402))
21
+ * **review-focus:** implement SPEC-48 (front/back/fullstack/doc) ([#189](https://github.com/DGouron/review-flow/issues/189)) ([d494b8f](https://github.com/DGouron/review-flow/commit/d494b8fcb3cb6046525a8232ae362a8013c7e916))
22
+
23
+ ## [3.17.1](https://github.com/DGouron/review-flow/compare/reviewflow-v3.17.0...reviewflow-v3.17.1) (2026-05-23)
24
+
25
+
26
+ ### Fixed
27
+
28
+ * [#171](https://github.com/DGouron/review-flow/issues/171) trigger followup review on push to reviewed branch ([#190](https://github.com/DGouron/review-flow/issues/190)) ([340da66](https://github.com/DGouron/review-flow/commit/340da665b556e434d70bf4c9cf0ee756f8346bea))
29
+
8
30
  ## [3.17.0](https://github.com/DGouron/review-flow/compare/reviewflow-v3.16.0...reviewflow-v3.17.0) (2026-05-23)
9
31
 
10
32
 
@@ -1,12 +1,14 @@
1
1
  import type { AgentDefinition } from '../modules/review-execution/entities/progress/agentDefinition.type.js';
2
2
  import type { Language } from '../modules/shared-kernel/entities/language/language.schema.js';
3
3
  import type { RoutingPolicy } from '../modules/review-execution/entities/modelRouting/modelRouting.schema.js';
4
+ import { type ReviewFocus } from '../modules/review-execution/entities/progress/reviewFocus.type.js';
4
5
  export interface ProjectConfig {
5
6
  github: boolean;
6
7
  gitlab: boolean;
7
8
  defaultModel: 'haiku' | 'sonnet' | 'opus';
8
9
  reviewSkill: string;
9
10
  reviewFollowupSkill: string;
11
+ reviewFocus?: ReviewFocus;
10
12
  language: Language;
11
13
  retentionDays: number;
12
14
  agents?: AgentDefinition[];
@@ -24,6 +26,12 @@ export declare function loadProjectConfig(localPath: string): ProjectConfig | un
24
26
  * Get agents from project config or undefined for defaults
25
27
  */
26
28
  export declare function getProjectAgents(localPath: string): AgentDefinition[] | undefined;
29
+ /**
30
+ * Resolve agents for a project: explicit agents array first, then focus-derived defaults.
31
+ * Returns undefined when no explicit array and no focus are configured, leaving the caller
32
+ * free to fall back to the legacy DEFAULT_AGENTS.
33
+ */
34
+ export declare function getProjectAgentsOrFocusDefaults(localPath: string): AgentDefinition[] | undefined;
27
35
  /**
28
36
  * Get language from project config, defaulting to 'en'
29
37
  */
@@ -1 +1 @@
1
- {"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../../src/config/projectConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sEAAsE,CAAC;AAC5G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yEAAyE,CAAC;AAE7G,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,eAAe,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAuDD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAgD9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,GAAG,SAAS,CAOjF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAO9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOjE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,GAAG,SAAS,CAOlF"}
1
+ {"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../../src/config/projectConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sEAAsE,CAAC;AAC5G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yEAAyE,CAAC;AAC7G,OAAO,EACL,KAAK,WAAW,EAKjB,MAAM,kEAAkE,CAAC;AAG1E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,eAAe,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAuED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAyE9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,GAAG,SAAS,CAOjF;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,GAChB,eAAe,EAAE,GAAG,SAAS,CAgB/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAO9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOjE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,GAAG,SAAS,CAOlF"}
@@ -1,5 +1,7 @@
1
1
  import { readFileSync, existsSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
+ import { REVIEW_FOCUS_VALUES, defaultAgentsForFocus, isReviewFocus, reviewSkillForFocus, } from '../modules/review-execution/entities/progress/reviewFocus.type.js';
4
+ import { logWarn } from '../frameworks/logging/logBuffer.js';
3
5
  /**
4
6
  * Validate agents array structure
5
7
  */
@@ -44,6 +46,18 @@ function parseRoutingPolicy(value) {
44
46
  }
45
47
  return undefined;
46
48
  }
49
+ function formatReviewFocusValues() {
50
+ return REVIEW_FOCUS_VALUES.map(value => `'${value}'`).join(', ');
51
+ }
52
+ function parseReviewFocus(value) {
53
+ if (value === undefined || value === null) {
54
+ return undefined;
55
+ }
56
+ if (!isReviewFocus(value)) {
57
+ throw new Error(`Invalid reviewFocus: must be ${formatReviewFocusValues()}`);
58
+ }
59
+ return value;
60
+ }
47
61
  /**
48
62
  * Load project configuration from .claude/reviews/config.json
49
63
  * @param localPath - Path to the project root directory
@@ -57,13 +71,24 @@ export function loadProjectConfig(localPath) {
57
71
  }
58
72
  const rawContent = readFileSync(configPath, 'utf-8');
59
73
  const parsed = JSON.parse(rawContent);
60
- // Validate required fields
61
- const requiredFields = ['github', 'gitlab', 'defaultModel', 'reviewSkill', 'reviewFollowupSkill'];
62
- for (const field of requiredFields) {
74
+ const reviewFocus = parseReviewFocus(parsed.reviewFocus);
75
+ const hasExplicitReviewSkill = typeof parsed.reviewSkill === 'string' && parsed.reviewSkill.length > 0;
76
+ // Validate required fields. reviewSkill is required UNLESS a valid reviewFocus is present.
77
+ const baseRequiredFields = ['github', 'gitlab', 'defaultModel', 'reviewFollowupSkill'];
78
+ for (const field of baseRequiredFields) {
63
79
  if (!(field in parsed)) {
64
80
  throw new Error(`Project config missing required field: ${field}`);
65
81
  }
66
82
  }
83
+ if (!hasExplicitReviewSkill && reviewFocus === undefined) {
84
+ throw new Error('Project config missing required field: reviewSkill');
85
+ }
86
+ if (hasExplicitReviewSkill && reviewFocus !== undefined) {
87
+ logWarn('Both reviewFocus and reviewSkill set — reviewSkill takes precedence', { reviewSkill: parsed.reviewSkill, reviewFocus });
88
+ }
89
+ const resolvedReviewSkill = hasExplicitReviewSkill
90
+ ? String(parsed.reviewSkill)
91
+ : reviewSkillForFocus(reviewFocus);
67
92
  // Validate agents if present
68
93
  if ('agents' in parsed && parsed.agents !== undefined) {
69
94
  if (!validateAgents(parsed.agents)) {
@@ -76,18 +101,22 @@ export function loadProjectConfig(localPath) {
76
101
  throw new Error('Invalid followupAgents format: must be array of { name: string, displayName: string }');
77
102
  }
78
103
  }
79
- return {
104
+ const config = {
80
105
  github: Boolean(parsed.github),
81
106
  gitlab: Boolean(parsed.gitlab),
82
107
  defaultModel: parsed.defaultModel === 'opus' ? 'opus' : parsed.defaultModel === 'haiku' ? 'haiku' : 'sonnet',
83
- reviewSkill: String(parsed.reviewSkill),
108
+ reviewSkill: resolvedReviewSkill,
84
109
  reviewFollowupSkill: String(parsed.reviewFollowupSkill),
85
110
  language: parsed.language === 'fr' ? 'fr' : 'en',
86
111
  retentionDays: parseRetentionDays(parsed.retentionDays),
87
- agents: parsed.agents,
88
- followupAgents: parsed.followupAgents,
112
+ agents: validateAgents(parsed.agents) ? parsed.agents : undefined,
113
+ followupAgents: validateAgents(parsed.followupAgents) ? parsed.followupAgents : undefined,
89
114
  routingPolicy: parseRoutingPolicy(parsed.routingPolicy),
90
115
  };
116
+ if (reviewFocus !== undefined) {
117
+ config.reviewFocus = reviewFocus;
118
+ }
119
+ return config;
91
120
  }
92
121
  /**
93
122
  * Get agents from project config or undefined for defaults
@@ -101,6 +130,29 @@ export function getProjectAgents(localPath) {
101
130
  return undefined;
102
131
  }
103
132
  }
133
+ /**
134
+ * Resolve agents for a project: explicit agents array first, then focus-derived defaults.
135
+ * Returns undefined when no explicit array and no focus are configured, leaving the caller
136
+ * free to fall back to the legacy DEFAULT_AGENTS.
137
+ */
138
+ export function getProjectAgentsOrFocusDefaults(localPath) {
139
+ try {
140
+ const config = loadProjectConfig(localPath);
141
+ if (!config) {
142
+ return undefined;
143
+ }
144
+ if (config.agents !== undefined) {
145
+ return config.agents;
146
+ }
147
+ if (config.reviewFocus !== undefined) {
148
+ return defaultAgentsForFocus(config.reviewFocus);
149
+ }
150
+ return undefined;
151
+ }
152
+ catch {
153
+ return undefined;
154
+ }
155
+ }
104
156
  /**
105
157
  * Get language from project config, defaulting to 'en'
106
158
  */
@@ -1 +1 @@
1
- {"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../../src/config/projectConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../../src/config/projectConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAEL,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,mBAAmB,GACpB,MAAM,kEAAkE,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAgB5D;;GAEG;AACH,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,MAAe;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACvC,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;YACxB,OAAO,WAAW,KAAK,QAAQ;YAC/B,IAAI,CAAC,MAAM,GAAG,CAAC;YACf,WAAW,CAAC,MAAM,GAAG,CAAC,CACvB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC3C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IAC7C,IACE,OAAO,aAAa,KAAK,QAAQ;QACjC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;QAC/B,aAAa,GAAG,CAAC;QACjB,OAAO,cAAc,KAAK,QAAQ;QAClC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC;QAChC,cAAc,GAAG,CAAC,EAClB,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,gCAAgC,uBAAuB,EAAE,EAAE,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IAExE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAA4B,CAAC;IAEjE,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzD,MAAM,sBAAsB,GAC1B,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAE1E,2FAA2F;IAC3F,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC;IACvF,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;QACvC,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,IAAI,CAAC,sBAAsB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,sBAAsB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,CACL,qEAAqE,EACrE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,CACjD,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,sBAAsB;QAChD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC,CAAC,mBAAmB,CAAC,WAA0B,CAAC,CAAC;IAEpD,6BAA6B;IAC7B,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACtD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,gBAAgB,IAAI,MAAM,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9B,YAAY,EAAE,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;QAC5G,WAAW,EAAE,mBAAmB;QAChC,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;QACvD,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAChD,aAAa,EAAE,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC;QACvD,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACjE,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;QACzF,aAAa,EAAE,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC;KACxD,CAAC;IAEF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,MAAM,EAAE,MAAM,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAC7C,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,qBAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,MAAM,EAAE,aAAa,IAAI,sBAAsB,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sBAAsB,CAAC;IAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,MAAM,EAAE,cAAc,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}