@diff-review-system/drs 1.1.2 → 2.1.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 (229) hide show
  1. package/.opencode/agent/describe/pr-describer.md +221 -0
  2. package/.opencode/agent/review/documentation.md +56 -0
  3. package/.opencode/agent/review/performance.md +32 -139
  4. package/.opencode/agent/review/quality.md +36 -113
  5. package/.opencode/agent/review/security.md +32 -97
  6. package/.opencode/agent/review/style.md +4 -0
  7. package/.opencode/agent/review/unified-reviewer.md +74 -0
  8. package/.opencode/opencode.jsonc +4 -29
  9. package/.opencode/tool/write_json_output.ts +24 -0
  10. package/README.md +48 -21
  11. package/dist/ci/runner.d.ts.map +1 -1
  12. package/dist/ci/runner.js +2 -0
  13. package/dist/ci/runner.js.map +1 -1
  14. package/dist/cli/describe-mr.d.ts +11 -0
  15. package/dist/cli/describe-mr.d.ts.map +1 -0
  16. package/dist/cli/describe-mr.js +104 -0
  17. package/dist/cli/describe-mr.js.map +1 -0
  18. package/dist/cli/describe-pr.d.ts +12 -0
  19. package/dist/cli/describe-pr.d.ts.map +1 -0
  20. package/dist/cli/describe-pr.js +105 -0
  21. package/dist/cli/describe-pr.js.map +1 -0
  22. package/dist/cli/index.js +222 -16
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/cli/init.d.ts +1 -1
  25. package/dist/cli/init.d.ts.map +1 -1
  26. package/dist/cli/init.js +273 -145
  27. package/dist/cli/init.js.map +1 -1
  28. package/dist/cli/post-comments.d.ts +16 -0
  29. package/dist/cli/post-comments.d.ts.map +1 -0
  30. package/dist/cli/post-comments.js +222 -0
  31. package/dist/cli/post-comments.js.map +1 -0
  32. package/dist/cli/review-local.d.ts +3 -0
  33. package/dist/cli/review-local.d.ts.map +1 -1
  34. package/dist/cli/review-local.js +44 -18
  35. package/dist/cli/review-local.js.map +1 -1
  36. package/dist/cli/review-mr.d.ts +6 -0
  37. package/dist/cli/review-mr.d.ts.map +1 -1
  38. package/dist/cli/review-mr.js +63 -7
  39. package/dist/cli/review-mr.js.map +1 -1
  40. package/dist/cli/review-pr.d.ts +6 -0
  41. package/dist/cli/review-pr.d.ts.map +1 -1
  42. package/dist/cli/review-pr.js +8 -1
  43. package/dist/cli/review-pr.js.map +1 -1
  44. package/dist/cli/show-changes.d.ts +15 -0
  45. package/dist/cli/show-changes.d.ts.map +1 -0
  46. package/dist/cli/show-changes.js +184 -0
  47. package/dist/cli/show-changes.js.map +1 -0
  48. package/dist/github/platform-adapter.d.ts.map +1 -1
  49. package/dist/github/platform-adapter.js +4 -2
  50. package/dist/github/platform-adapter.js.map +1 -1
  51. package/dist/gitlab/client.d.ts.map +1 -1
  52. package/dist/gitlab/client.js +1 -1
  53. package/dist/gitlab/client.js.map +1 -1
  54. package/dist/gitlab/platform-adapter.d.ts.map +1 -1
  55. package/dist/gitlab/platform-adapter.js +6 -5
  56. package/dist/gitlab/platform-adapter.js.map +1 -1
  57. package/dist/lib/change-summary.d.ts +8 -0
  58. package/dist/lib/change-summary.d.ts.map +1 -0
  59. package/dist/lib/change-summary.js +2 -0
  60. package/dist/lib/change-summary.js.map +1 -0
  61. package/dist/lib/comment-formatter.d.ts +3 -2
  62. package/dist/lib/comment-formatter.d.ts.map +1 -1
  63. package/dist/lib/comment-formatter.js +16 -2
  64. package/dist/lib/comment-formatter.js.map +1 -1
  65. package/dist/lib/comment-formatter.test.d.ts +2 -0
  66. package/dist/lib/comment-formatter.test.d.ts.map +1 -0
  67. package/dist/lib/comment-formatter.test.js +607 -0
  68. package/dist/lib/comment-formatter.test.js.map +1 -0
  69. package/dist/lib/comment-manager.test.d.ts +2 -0
  70. package/dist/lib/comment-manager.test.d.ts.map +1 -0
  71. package/dist/lib/comment-manager.test.js +618 -0
  72. package/dist/lib/comment-manager.test.js.map +1 -0
  73. package/dist/lib/comment-poster.d.ts +21 -0
  74. package/dist/lib/comment-poster.d.ts.map +1 -0
  75. package/dist/lib/comment-poster.js +96 -0
  76. package/dist/lib/comment-poster.js.map +1 -0
  77. package/dist/lib/comment-poster.test.d.ts +5 -0
  78. package/dist/lib/comment-poster.test.d.ts.map +1 -0
  79. package/dist/lib/comment-poster.test.js +215 -0
  80. package/dist/lib/comment-poster.test.js.map +1 -0
  81. package/dist/lib/config-model-overrides.test.js +71 -41
  82. package/dist/lib/config-model-overrides.test.js.map +1 -1
  83. package/dist/lib/config.d.ts +65 -7
  84. package/dist/lib/config.d.ts.map +1 -1
  85. package/dist/lib/config.js +122 -22
  86. package/dist/lib/config.js.map +1 -1
  87. package/dist/lib/config.test.js +31 -2
  88. package/dist/lib/config.test.js.map +1 -1
  89. package/dist/lib/context-compression.d.ts +19 -0
  90. package/dist/lib/context-compression.d.ts.map +1 -0
  91. package/dist/lib/context-compression.js +170 -0
  92. package/dist/lib/context-compression.js.map +1 -0
  93. package/dist/lib/context-compression.test.d.ts +2 -0
  94. package/dist/lib/context-compression.test.d.ts.map +1 -0
  95. package/dist/lib/context-compression.test.js +33 -0
  96. package/dist/lib/context-compression.test.js.map +1 -0
  97. package/dist/lib/context-loader.d.ts.map +1 -1
  98. package/dist/lib/context-loader.js +8 -1
  99. package/dist/lib/context-loader.js.map +1 -1
  100. package/dist/lib/context-loader.test.d.ts +2 -0
  101. package/dist/lib/context-loader.test.d.ts.map +1 -0
  102. package/dist/lib/context-loader.test.js +207 -0
  103. package/dist/lib/context-loader.test.js.map +1 -0
  104. package/dist/lib/describe-core.d.ts +9 -0
  105. package/dist/lib/describe-core.d.ts.map +1 -0
  106. package/dist/lib/describe-core.js +71 -0
  107. package/dist/lib/describe-core.js.map +1 -0
  108. package/dist/lib/describe-core.test.d.ts +2 -0
  109. package/dist/lib/describe-core.test.d.ts.map +1 -0
  110. package/dist/lib/describe-core.test.js +208 -0
  111. package/dist/lib/describe-core.test.js.map +1 -0
  112. package/dist/lib/describe-output-path.test.d.ts +2 -0
  113. package/dist/lib/describe-output-path.test.d.ts.map +1 -0
  114. package/dist/lib/describe-output-path.test.js +51 -0
  115. package/dist/lib/describe-output-path.test.js.map +1 -0
  116. package/dist/lib/describe-parser.d.ts +3 -0
  117. package/dist/lib/describe-parser.d.ts.map +1 -0
  118. package/dist/lib/describe-parser.js +163 -0
  119. package/dist/lib/describe-parser.js.map +1 -0
  120. package/dist/lib/describe-parser.test.d.ts +2 -0
  121. package/dist/lib/describe-parser.test.d.ts.map +1 -0
  122. package/dist/lib/describe-parser.test.js +282 -0
  123. package/dist/lib/describe-parser.test.js.map +1 -0
  124. package/dist/lib/description-executor.d.ts +22 -0
  125. package/dist/lib/description-executor.d.ts.map +1 -0
  126. package/dist/lib/description-executor.js +72 -0
  127. package/dist/lib/description-executor.js.map +1 -0
  128. package/dist/lib/description-formatter.d.ts +37 -0
  129. package/dist/lib/description-formatter.d.ts.map +1 -0
  130. package/dist/lib/description-formatter.js +219 -0
  131. package/dist/lib/description-formatter.js.map +1 -0
  132. package/dist/lib/diff-parser.d.ts +11 -0
  133. package/dist/lib/diff-parser.d.ts.map +1 -1
  134. package/dist/lib/diff-parser.js +37 -0
  135. package/dist/lib/diff-parser.js.map +1 -1
  136. package/dist/lib/issue-parser.d.ts +1 -1
  137. package/dist/lib/issue-parser.d.ts.map +1 -1
  138. package/dist/lib/issue-parser.js +16 -14
  139. package/dist/lib/issue-parser.js.map +1 -1
  140. package/dist/lib/json-output-schema.d.ts +207 -0
  141. package/dist/lib/json-output-schema.d.ts.map +1 -0
  142. package/dist/lib/json-output-schema.js +124 -0
  143. package/dist/lib/json-output-schema.js.map +1 -0
  144. package/dist/lib/json-output-schema.test.d.ts +2 -0
  145. package/dist/lib/json-output-schema.test.d.ts.map +1 -0
  146. package/dist/lib/json-output-schema.test.js +92 -0
  147. package/dist/lib/json-output-schema.test.js.map +1 -0
  148. package/dist/lib/json-output.d.ts +43 -0
  149. package/dist/lib/json-output.d.ts.map +1 -0
  150. package/dist/lib/json-output.js +34 -0
  151. package/dist/lib/json-output.js.map +1 -0
  152. package/dist/lib/output-paths.d.ts +6 -0
  153. package/dist/lib/output-paths.d.ts.map +1 -0
  154. package/dist/lib/output-paths.js +5 -0
  155. package/dist/lib/output-paths.js.map +1 -0
  156. package/dist/lib/platform-client.d.ts +1 -1
  157. package/dist/lib/platform-client.d.ts.map +1 -1
  158. package/dist/lib/repository-validator.d.ts +57 -0
  159. package/dist/lib/repository-validator.d.ts.map +1 -0
  160. package/dist/lib/repository-validator.js +225 -0
  161. package/dist/lib/repository-validator.js.map +1 -0
  162. package/dist/lib/repository-validator.test.d.ts +5 -0
  163. package/dist/lib/repository-validator.test.d.ts.map +1 -0
  164. package/dist/lib/repository-validator.test.js +341 -0
  165. package/dist/lib/repository-validator.test.js.map +1 -0
  166. package/dist/lib/review-core.d.ts +66 -0
  167. package/dist/lib/review-core.d.ts.map +1 -0
  168. package/dist/lib/review-core.js +449 -0
  169. package/dist/lib/review-core.js.map +1 -0
  170. package/dist/lib/review-core.test.d.ts +2 -0
  171. package/dist/lib/review-core.test.d.ts.map +1 -0
  172. package/dist/lib/review-core.test.js +552 -0
  173. package/dist/lib/review-core.test.js.map +1 -0
  174. package/dist/lib/review-orchestrator.d.ts +27 -10
  175. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  176. package/dist/lib/review-orchestrator.js +51 -110
  177. package/dist/lib/review-orchestrator.js.map +1 -1
  178. package/dist/lib/review-orchestrator.test.d.ts +2 -0
  179. package/dist/lib/review-orchestrator.test.d.ts.map +1 -0
  180. package/dist/lib/review-orchestrator.test.js +413 -0
  181. package/dist/lib/review-orchestrator.test.js.map +1 -0
  182. package/dist/lib/review-output-path.test.d.ts +2 -0
  183. package/dist/lib/review-output-path.test.d.ts.map +1 -0
  184. package/dist/lib/review-output-path.test.js +83 -0
  185. package/dist/lib/review-output-path.test.js.map +1 -0
  186. package/dist/lib/review-parser.d.ts +2 -0
  187. package/dist/lib/review-parser.d.ts.map +1 -0
  188. package/dist/lib/review-parser.js +100 -0
  189. package/dist/lib/review-parser.js.map +1 -0
  190. package/dist/lib/unified-review-executor.d.ts +21 -4
  191. package/dist/lib/unified-review-executor.d.ts.map +1 -1
  192. package/dist/lib/unified-review-executor.js +84 -151
  193. package/dist/lib/unified-review-executor.js.map +1 -1
  194. package/dist/lib/unified-review-executor.test.d.ts +5 -0
  195. package/dist/lib/unified-review-executor.test.d.ts.map +1 -0
  196. package/dist/lib/unified-review-executor.test.js +350 -0
  197. package/dist/lib/unified-review-executor.test.js.map +1 -0
  198. package/dist/lib/write-json-output.d.ts +13 -0
  199. package/dist/lib/write-json-output.d.ts.map +1 -0
  200. package/dist/lib/write-json-output.js +37 -0
  201. package/dist/lib/write-json-output.js.map +1 -0
  202. package/dist/opencode/agent-loader.d.ts +3 -4
  203. package/dist/opencode/agent-loader.d.ts.map +1 -1
  204. package/dist/opencode/agent-loader.js +48 -34
  205. package/dist/opencode/agent-loader.js.map +1 -1
  206. package/dist/opencode/agent-skill-overlay.d.ts +11 -0
  207. package/dist/opencode/agent-skill-overlay.d.ts.map +1 -0
  208. package/dist/opencode/agent-skill-overlay.js +164 -0
  209. package/dist/opencode/agent-skill-overlay.js.map +1 -0
  210. package/dist/opencode/client.d.ts +11 -3
  211. package/dist/opencode/client.d.ts.map +1 -1
  212. package/dist/opencode/client.js +237 -71
  213. package/dist/opencode/client.js.map +1 -1
  214. package/dist/opencode/client.test.d.ts +2 -0
  215. package/dist/opencode/client.test.d.ts.map +1 -0
  216. package/dist/opencode/client.test.js +317 -0
  217. package/dist/opencode/client.test.js.map +1 -0
  218. package/dist/opencode/opencode-paths.d.ts +2 -0
  219. package/dist/opencode/opencode-paths.d.ts.map +1 -0
  220. package/dist/opencode/opencode-paths.js +7 -0
  221. package/dist/opencode/opencode-paths.js.map +1 -0
  222. package/dist/opencode/skill-loader.d.ts +6 -0
  223. package/dist/opencode/skill-loader.d.ts.map +1 -0
  224. package/dist/opencode/skill-loader.js +36 -0
  225. package/dist/opencode/skill-loader.js.map +1 -0
  226. package/package.json +7 -7
  227. package/.opencode/agent/github-reviewer.md +0 -77
  228. package/.opencode/agent/gitlab-reviewer.md +0 -77
  229. package/.opencode/agent/local-reviewer.md +0 -63
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Core review execution logic shared between local and platform reviews
3
+ *
4
+ * This module contains the common agent execution logic to avoid duplication
5
+ * between review-orchestrator.ts (local) and unified-review-executor.ts (platform).
6
+ */
7
+ import type { DRSConfig } from './config.js';
8
+ import { calculateSummary, type ReviewIssue } from './comment-formatter.js';
9
+ import type { ChangeSummary } from './change-summary.js';
10
+ import type { OpencodeClient } from '../opencode/client.js';
11
+ /**
12
+ * File with optional diff content
13
+ */
14
+ export interface FileWithDiff {
15
+ /** File path */
16
+ filename: string;
17
+ /** Unified diff patch (if available from platform) */
18
+ patch?: string;
19
+ }
20
+ /**
21
+ * Result from running review agents
22
+ */
23
+ export interface AgentReviewResult {
24
+ /** All issues found by review agents */
25
+ issues: ReviewIssue[];
26
+ /** Calculated summary statistics */
27
+ summary: ReturnType<typeof calculateSummary>;
28
+ /** Diff-based change summary when available */
29
+ changeSummary?: ChangeSummary;
30
+ /** Number of files actually reviewed */
31
+ filesReviewed: number;
32
+ /** Agent execution results */
33
+ agentResults: AgentResult[];
34
+ }
35
+ export interface AgentResult {
36
+ agentType: string;
37
+ success: boolean;
38
+ issues: ReviewIssue[];
39
+ }
40
+ /**
41
+ * Build base review instructions for agents
42
+ *
43
+ * @param label - Human-readable label for the review (e.g., "PR/MR #123", "Local staged diff")
44
+ * @param files - List of files with optional diff content
45
+ * @param diffCommand - Fallback git diff command hint (used when diff not provided)
46
+ */
47
+ export declare function buildBaseInstructions(label: string, files: FileWithDiff[], diffCommand?: string, compressionSummary?: string): string;
48
+ export declare function runUnifiedReviewAgent(opencode: OpencodeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, any>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
49
+ export declare function runReviewAgents(opencode: OpencodeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, any>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
50
+ export declare function runReviewPipeline(opencode: OpencodeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, any>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
51
+ /**
52
+ * Display review summary to terminal
53
+ */
54
+ export declare function displayReviewSummary(result: {
55
+ issues: ReviewIssue[];
56
+ summary: ReturnType<typeof calculateSummary>;
57
+ filesReviewed: number;
58
+ changeSummary?: ChangeSummary;
59
+ }): void;
60
+ /**
61
+ * Check if review has blocking issues (CRITICAL or HIGH)
62
+ */
63
+ export declare function hasBlockingIssues(result: {
64
+ summary: ReturnType<typeof calculateSummary>;
65
+ }): boolean;
66
+ //# sourceMappingURL=review-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-core.d.ts","sourceRoot":"","sources":["../../src/lib/review-core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAA8B,MAAM,aAAa,CAAC;AAKzE,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,oCAAoC;IACpC,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC7C,+CAA+C;IAC/C,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AASD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,EACrB,WAAW,CAAC,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAoIR;AA+DD,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,SAAS,EACjB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAC3C,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,GACZ,OAAO,CAAC,iBAAiB,CAAC,CAyF5B;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,SAAS,EACjB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAC3C,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,GACZ,OAAO,CAAC,iBAAiB,CAAC,CAyH5B;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,SAAS,EACjB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAC3C,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,GACZ,OAAO,CAAC,iBAAiB,CAAC,CA+E5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,GAAG,IAAI,CAmCP;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;CAC9C,GAAG,OAAO,CAEV"}
@@ -0,0 +1,449 @@
1
+ /**
2
+ * Core review execution logic shared between local and platform reviews
3
+ *
4
+ * This module contains the common agent execution logic to avoid duplication
5
+ * between review-orchestrator.ts (local) and unified-review-executor.ts (platform).
6
+ */
7
+ import chalk from 'chalk';
8
+ import { getAgentNames } from './config.js';
9
+ import { buildReviewPrompt } from './context-loader.js';
10
+ import { parseReviewIssues } from './issue-parser.js';
11
+ import { parseReviewOutput } from './review-parser.js';
12
+ import { calculateSummary } from './comment-formatter.js';
13
+ import { loadReviewAgents } from '../opencode/agent-loader.js';
14
+ import { createIssueFingerprint } from './comment-manager.js';
15
+ const REVIEW_SEVERITY_ORDER = {
16
+ LOW: 1,
17
+ MEDIUM: 2,
18
+ HIGH: 3,
19
+ CRITICAL: 4,
20
+ };
21
+ /**
22
+ * Build base review instructions for agents
23
+ *
24
+ * @param label - Human-readable label for the review (e.g., "PR/MR #123", "Local staged diff")
25
+ * @param files - List of files with optional diff content
26
+ * @param diffCommand - Fallback git diff command hint (used when diff not provided)
27
+ */
28
+ export function buildBaseInstructions(label, files, diffCommand, compressionSummary) {
29
+ // Check if we have actual diff content
30
+ const filesWithDiffs = files.filter((f) => f.patch);
31
+ const hasDiffs = filesWithDiffs.length > 0;
32
+ const fileList = files.map((f) => `- ${f.filename}`).join('\n');
33
+ if (hasDiffs) {
34
+ // We have diff content from the platform - include it directly
35
+ const diffContent = filesWithDiffs
36
+ .map((f) => `### ${f.filename}\n\`\`\`diff\n${f.patch}\n\`\`\``)
37
+ .join('\n\n');
38
+ return `Review the following changed files from ${label}:
39
+
40
+ ${fileList}
41
+
42
+ ## Diff Content
43
+
44
+ The following shows exactly what changed in this PR/MR:
45
+
46
+ ${diffContent}
47
+
48
+ ${compressionSummary ? `${compressionSummary}\n\n` : ''}Output requirements:
49
+ - You MUST call the write_json_output tool with:
50
+ - outputType: "review_output"
51
+ - payload: the JSON object
52
+ - After calling the tool, return only the JSON pointer returned by the tool
53
+ (e.g. {"outputType":"review_output","outputPath":".drs/review-output.json"})
54
+ - Do not return raw JSON directly.
55
+ - Do not include markdown, code fences, or extra text.
56
+ - Follow this exact schema:
57
+ {
58
+ "timestamp": "ISO-8601 timestamp or descriptive string",
59
+ "summary": {
60
+ "filesReviewed": ${files.length},
61
+ "issuesFound": 0,
62
+ "bySeverity": {
63
+ "CRITICAL": 0,
64
+ "HIGH": 0,
65
+ "MEDIUM": 0,
66
+ "LOW": 0
67
+ },
68
+ "byCategory": {
69
+ "SECURITY": 0,
70
+ "QUALITY": 0,
71
+ "STYLE": 0,
72
+ "PERFORMANCE": 0,
73
+ "DOCUMENTATION": 0
74
+ }
75
+ },
76
+ "issues": [
77
+ {
78
+ "category": "SECURITY" | "QUALITY" | "STYLE" | "PERFORMANCE" | "DOCUMENTATION",
79
+ "severity": "CRITICAL" | "HIGH" | "MEDIUM" | "LOW",
80
+ "title": "Brief title",
81
+ "file": "path/to/file.ts",
82
+ "line": 42,
83
+ "problem": "Description of the problem",
84
+ "solution": "How to fix it",
85
+ "references": ["https://link1", "https://link2"],
86
+ "agent": "security" | "quality" | "style" | "performance" | "documentation" | "unified"
87
+ }
88
+ ]
89
+ }
90
+
91
+ **Instructions:**
92
+ 1. Analyze the diff content above to understand what lines were changed
93
+ 2. Use the Read tool to examine the full file for additional context if needed
94
+ 3. **IMPORTANT: Only report issues on lines that were actually changed or added (lines starting with + in the diff).** Do not report issues on unchanged code.
95
+ 4. Analyze the changed code for issues in your specialty area
96
+ 5. Populate summary counts based on the issues you report (use 0 when none).
97
+ 6. Focus on the changes - only report issues for newly added or modified lines (lines with + prefix in the diff).`;
98
+ }
99
+ // No diff content available - fall back to git diff command
100
+ const fallbackCommand = diffCommand || 'git diff HEAD~1 -- <file>';
101
+ return `Review the following changed files from ${label}:
102
+
103
+ ${fileList}
104
+
105
+ Output requirements:
106
+ - You MUST call the write_json_output tool with:
107
+ - outputType: "review_output"
108
+ - payload: the JSON object
109
+ - After calling the tool, return only the JSON pointer returned by the tool
110
+ (e.g. {"outputType":"review_output","outputPath":".drs/review-output.json"})
111
+ - Do not return raw JSON directly.
112
+ - Do not include markdown, code fences, or extra text.
113
+ - Follow this exact schema:
114
+ {
115
+ "timestamp": "ISO-8601 timestamp or descriptive string",
116
+ "summary": {
117
+ "filesReviewed": ${files.length},
118
+ "issuesFound": 0,
119
+ "bySeverity": {
120
+ "CRITICAL": 0,
121
+ "HIGH": 0,
122
+ "MEDIUM": 0,
123
+ "LOW": 0
124
+ },
125
+ "byCategory": {
126
+ "SECURITY": 0,
127
+ "QUALITY": 0,
128
+ "STYLE": 0,
129
+ "PERFORMANCE": 0,
130
+ "DOCUMENTATION": 0
131
+ }
132
+ },
133
+ "issues": [
134
+ {
135
+ "category": "SECURITY" | "QUALITY" | "STYLE" | "PERFORMANCE" | "DOCUMENTATION",
136
+ "severity": "CRITICAL" | "HIGH" | "MEDIUM" | "LOW",
137
+ "title": "Brief title",
138
+ "file": "path/to/file.ts",
139
+ "line": 42,
140
+ "problem": "Description of the problem",
141
+ "solution": "How to fix it",
142
+ "references": ["https://link1", "https://link2"],
143
+ "agent": "security" | "quality" | "style" | "performance" | "documentation" | "unified"
144
+ }
145
+ ]
146
+ }
147
+
148
+ **Instructions:**
149
+ 1. First, use the Bash tool to run \`${fallbackCommand}\` to see what lines were actually changed
150
+ 2. Use the Read tool to examine the full file for context
151
+ 3. **IMPORTANT: Only report issues on lines that were actually changed or added.** Do not report issues on existing code that was not modified.
152
+ 4. Analyze the changed code for issues in your specialty area
153
+ 5. Populate summary counts based on the issues you report (use 0 when none).
154
+ 6. Focus on the changes - only report issues for newly added or modified lines.`;
155
+ }
156
+ /**
157
+ * Get information about configured review agents
158
+ */
159
+ function getConfiguredAgentInfo(config, workingDir) {
160
+ const configuredNames = getAgentNames(config);
161
+ const allAgents = loadReviewAgents(workingDir);
162
+ return configuredNames
163
+ .map((name) => {
164
+ const fullName = `review/${name}`;
165
+ const agent = allAgents.find((a) => a.name === fullName);
166
+ return {
167
+ name,
168
+ description: agent?.description || `${name} review agent`,
169
+ };
170
+ })
171
+ .filter((a) => a !== null);
172
+ }
173
+ function renderAgentMessage(content, maxLines = 6, maxChars = 320) {
174
+ const trimmed = content.trim();
175
+ if (!trimmed) {
176
+ return '';
177
+ }
178
+ const lines = trimmed.split('\n');
179
+ const limitedLines = lines.slice(0, maxLines).join('\n');
180
+ const limitedChars = limitedLines.length > maxChars ? `${limitedLines.slice(0, maxChars)}…` : limitedLines;
181
+ return limitedChars;
182
+ }
183
+ function resolveReviewMode(config) {
184
+ return config.review.mode ?? 'multi-agent';
185
+ }
186
+ function shouldEscalateHybrid(issues, threshold) {
187
+ return issues.some((issue) => REVIEW_SEVERITY_ORDER[issue.severity] >= REVIEW_SEVERITY_ORDER[threshold]);
188
+ }
189
+ function mergeIssues(primary, secondary) {
190
+ const seen = new Set();
191
+ const merged = [];
192
+ for (const issue of [...primary, ...secondary]) {
193
+ const fingerprint = createIssueFingerprint(issue);
194
+ if (seen.has(fingerprint)) {
195
+ continue;
196
+ }
197
+ seen.add(fingerprint);
198
+ merged.push(issue);
199
+ }
200
+ return merged;
201
+ }
202
+ export async function runUnifiedReviewAgent(opencode, config, baseInstructions, reviewLabel, filteredFiles, additionalContext = {}, workingDir = process.cwd(), debug = false) {
203
+ const agentType = 'unified-reviewer';
204
+ const agentName = `review/${agentType}`;
205
+ console.log(chalk.bold('🎯 Selected Agents: unified-reviewer\n'));
206
+ console.log(chalk.gray('Running unified review...\n'));
207
+ try {
208
+ const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, reviewLabel, filteredFiles, workingDir);
209
+ if (debug) {
210
+ console.log(chalk.gray('┌── DEBUG: Message sent to review agent'));
211
+ console.log(chalk.gray(`│ Agent: ${agentName}`));
212
+ console.log(chalk.gray('│ Prompt:'));
213
+ console.log(chalk.gray('─'.repeat(60)));
214
+ console.log(reviewPrompt);
215
+ console.log(chalk.gray('─'.repeat(60)));
216
+ console.log(chalk.gray(`└── End message for ${agentName}\n`));
217
+ }
218
+ const session = await opencode.createSession({
219
+ agent: agentName,
220
+ message: reviewPrompt,
221
+ context: {
222
+ ...additionalContext,
223
+ files: filteredFiles,
224
+ },
225
+ });
226
+ const agentIssues = [];
227
+ let fullResponse = '';
228
+ for await (const message of opencode.streamMessages(session.id)) {
229
+ if (message.role === 'assistant') {
230
+ fullResponse += message.content;
231
+ if (debug) {
232
+ console.log(chalk.gray(`┌── DEBUG: Full response from ${agentName}`));
233
+ console.log(message.content);
234
+ console.log(chalk.gray(`└── End response for ${agentName}\n`));
235
+ }
236
+ else {
237
+ const snippet = renderAgentMessage(message.content);
238
+ if (snippet) {
239
+ console.log(chalk.gray(`[unified] ${snippet}\n`));
240
+ }
241
+ }
242
+ }
243
+ }
244
+ await opencode.closeSession(session.id);
245
+ try {
246
+ const reviewOutput = await parseReviewOutput(workingDir, debug, fullResponse);
247
+ const parsedIssues = parseReviewIssues(JSON.stringify(reviewOutput), 'unified');
248
+ if (parsedIssues.length > 0) {
249
+ agentIssues.push(...parsedIssues);
250
+ console.log(chalk.green(`✓ [unified] Found ${parsedIssues.length} issue(s)`));
251
+ }
252
+ }
253
+ catch (parseError) {
254
+ console.error(chalk.red('Failed to parse unified review output'));
255
+ if (debug) {
256
+ console.log(chalk.dim('Unified agent output:'), fullResponse);
257
+ }
258
+ const reason = parseError instanceof Error ? `: ${parseError.message}` : '';
259
+ throw new Error(`Unified review agent did not return valid JSON output${reason}`);
260
+ }
261
+ const summary = calculateSummary(filteredFiles.length, agentIssues);
262
+ return {
263
+ issues: agentIssues,
264
+ summary,
265
+ filesReviewed: filteredFiles.length,
266
+ agentResults: [{ agentType, success: true, issues: agentIssues }],
267
+ };
268
+ }
269
+ catch (error) {
270
+ console.error(chalk.red(`✗ unified-reviewer agent failed: ${error}`));
271
+ return {
272
+ issues: [],
273
+ summary: calculateSummary(filteredFiles.length, []),
274
+ filesReviewed: filteredFiles.length,
275
+ agentResults: [{ agentType, success: false, issues: [] }],
276
+ };
277
+ }
278
+ }
279
+ export async function runReviewAgents(opencode, config, baseInstructions, reviewLabel, filteredFiles, additionalContext = {}, workingDir = process.cwd(), debug = false) {
280
+ console.log(chalk.gray('Starting code analysis...\n'));
281
+ const configuredAgentInfo = getConfiguredAgentInfo(config, workingDir);
282
+ if (configuredAgentInfo.length > 0) {
283
+ console.log(chalk.bold('🧰 Available Review Agents'));
284
+ configuredAgentInfo.forEach((agent) => {
285
+ console.log(` • ${chalk.cyan(agent.name)} - ${agent.description}`);
286
+ });
287
+ console.log('');
288
+ }
289
+ const agentNames = getAgentNames(config);
290
+ console.log(chalk.bold(`🎯 Selected Agents: ${agentNames.join(', ') || 'None'}\n`));
291
+ const agentResults = [];
292
+ for (const agentType of agentNames) {
293
+ const agentName = `review/${agentType}`;
294
+ console.log(chalk.gray(`Running ${agentType} review...\n`));
295
+ try {
296
+ // Build prompt with global and agent-specific context
297
+ const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, reviewLabel, filteredFiles, workingDir);
298
+ if (debug) {
299
+ console.log(chalk.gray('┌── DEBUG: Message sent to review agent'));
300
+ console.log(chalk.gray(`│ Agent: ${agentName}`));
301
+ console.log(chalk.gray('│ Prompt:'));
302
+ console.log(chalk.gray('─'.repeat(60)));
303
+ console.log(reviewPrompt);
304
+ console.log(chalk.gray('─'.repeat(60)));
305
+ console.log(chalk.gray(`└── End message for ${agentName}\n`));
306
+ }
307
+ const session = await opencode.createSession({
308
+ agent: agentName,
309
+ message: reviewPrompt,
310
+ context: {
311
+ ...additionalContext,
312
+ files: filteredFiles,
313
+ },
314
+ });
315
+ const agentIssues = [];
316
+ let fullResponse = '';
317
+ // Collect results from this agent
318
+ for await (const message of opencode.streamMessages(session.id)) {
319
+ if (message.role === 'assistant') {
320
+ fullResponse += message.content;
321
+ if (debug) {
322
+ console.log(chalk.gray(`┌── DEBUG: Full response from ${agentName}`));
323
+ console.log(message.content);
324
+ console.log(chalk.gray(`└── End response for ${agentName}\n`));
325
+ }
326
+ else {
327
+ const snippet = renderAgentMessage(message.content);
328
+ if (snippet) {
329
+ console.log(chalk.gray(`[${agentType}] ${snippet}\n`));
330
+ }
331
+ }
332
+ }
333
+ }
334
+ await opencode.closeSession(session.id);
335
+ const reviewOutput = await parseReviewOutput(workingDir, debug, fullResponse);
336
+ const parsedIssues = parseReviewIssues(JSON.stringify(reviewOutput), agentType);
337
+ if (parsedIssues.length > 0) {
338
+ agentIssues.push(...parsedIssues);
339
+ console.log(chalk.green(`✓ [${agentType}] Found ${parsedIssues.length} issue(s)`));
340
+ }
341
+ agentResults.push({ agentType, success: true, issues: agentIssues });
342
+ }
343
+ catch (error) {
344
+ console.error(chalk.red(`✗ ${agentType} agent failed: ${error}`));
345
+ agentResults.push({ agentType, success: false, issues: [] });
346
+ }
347
+ }
348
+ // Check agent results
349
+ const successfulAgents = agentResults.filter((r) => r.success);
350
+ const failedAgents = agentResults.filter((r) => !r.success);
351
+ if (successfulAgents.length === 0) {
352
+ console.error(chalk.red('\n✗ All review agents failed!\n'));
353
+ console.error(chalk.yellow('This usually means:\n' +
354
+ ' 1. Model configuration is incorrect or missing\n' +
355
+ ' 2. API credentials are invalid or missing\n' +
356
+ ' 3. Models are not accessible or timed out\n' +
357
+ ' 4. Agents cannot find files to review\n'));
358
+ throw new Error('All review agents failed');
359
+ }
360
+ if (failedAgents.length > 0) {
361
+ console.log(chalk.yellow(`\n⚠️ ${failedAgents.length} of ${agentResults.length} agents failed: ${failedAgents.map((r) => r.agentType).join(', ')}\n`));
362
+ }
363
+ // Flatten all issues from successful agents
364
+ const issues = [];
365
+ agentResults.forEach((result) => issues.push(...result.issues));
366
+ const summary = calculateSummary(filteredFiles.length, issues);
367
+ return {
368
+ issues,
369
+ summary,
370
+ filesReviewed: filteredFiles.length,
371
+ agentResults,
372
+ };
373
+ }
374
+ export async function runReviewPipeline(opencode, config, baseInstructions, reviewLabel, filteredFiles, additionalContext = {}, workingDir = process.cwd(), debug = false) {
375
+ const mode = resolveReviewMode(config);
376
+ if (mode === 'unified') {
377
+ return runUnifiedReviewAgent(opencode, config, baseInstructions, reviewLabel, filteredFiles, additionalContext, workingDir, debug);
378
+ }
379
+ if (mode === 'multi-agent') {
380
+ return runReviewAgents(opencode, config, baseInstructions, reviewLabel, filteredFiles, additionalContext, workingDir, debug);
381
+ }
382
+ const unifiedResult = await runUnifiedReviewAgent(opencode, config, baseInstructions, reviewLabel, filteredFiles, additionalContext, workingDir, debug);
383
+ const unifiedSuccess = unifiedResult.agentResults.every((result) => result.success);
384
+ const threshold = config.review.unified?.severityThreshold ?? 'HIGH';
385
+ const shouldEscalate = unifiedSuccess
386
+ ? shouldEscalateHybrid(unifiedResult.issues, threshold)
387
+ : true;
388
+ if (!shouldEscalate) {
389
+ console.log(chalk.gray(`Hybrid mode: no issues at or above ${threshold}, skipping deep review.\n`));
390
+ return unifiedResult;
391
+ }
392
+ if (!unifiedSuccess) {
393
+ console.log(chalk.yellow('Hybrid mode: unified review failed, falling back to deep review.\n'));
394
+ }
395
+ else {
396
+ console.log(chalk.yellow('Hybrid mode: escalating to deep review agents.\n'));
397
+ }
398
+ const deepResult = await runReviewAgents(opencode, config, baseInstructions, reviewLabel, filteredFiles, additionalContext, workingDir, debug);
399
+ const mergedIssues = mergeIssues(unifiedResult.issues, deepResult.issues);
400
+ const summary = calculateSummary(filteredFiles.length, mergedIssues);
401
+ return {
402
+ issues: mergedIssues,
403
+ summary,
404
+ filesReviewed: filteredFiles.length,
405
+ agentResults: [...unifiedResult.agentResults, ...deepResult.agentResults],
406
+ };
407
+ }
408
+ /**
409
+ * Display review summary to terminal
410
+ */
411
+ export function displayReviewSummary(result) {
412
+ console.log(chalk.bold('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
413
+ console.log(chalk.bold('📊 Review Summary'));
414
+ console.log(chalk.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
415
+ if (result.changeSummary) {
416
+ console.log(chalk.bold('🧭 Change Summary'));
417
+ console.log(` ${result.changeSummary.description}`);
418
+ console.log(` Type: ${result.changeSummary.type}`);
419
+ console.log(` Complexity: ${result.changeSummary.complexity}`);
420
+ console.log(` Risk level: ${result.changeSummary.riskLevel}`);
421
+ if (result.changeSummary.subsystems.length > 0) {
422
+ console.log(` Subsystems: ${result.changeSummary.subsystems.join(', ')}`);
423
+ }
424
+ console.log('');
425
+ }
426
+ console.log(` Files reviewed: ${chalk.cyan(result.summary.filesReviewed)}`);
427
+ console.log(` Issues found: ${chalk.yellow(result.summary.issuesFound)}`);
428
+ if (result.summary.issuesFound > 0) {
429
+ console.log(` 🔴 Critical: ${chalk.red(result.summary.bySeverity.CRITICAL)}`);
430
+ console.log(` 🟡 High: ${chalk.yellow(result.summary.bySeverity.HIGH)}`);
431
+ console.log(` 🟠 Medium: ${chalk.hex('#FFA500')(result.summary.bySeverity.MEDIUM)}`);
432
+ console.log(` ⚪ Low: ${chalk.gray(result.summary.bySeverity.LOW)}`);
433
+ console.log('');
434
+ console.log(' By category:');
435
+ console.log(` 🔒 Security: ${chalk.cyan(result.summary.byCategory.SECURITY)}`);
436
+ console.log(` 📊 Quality: ${chalk.cyan(result.summary.byCategory.QUALITY)}`);
437
+ console.log(` ✨ Style: ${chalk.cyan(result.summary.byCategory.STYLE)}`);
438
+ console.log(` ⚡ Performance: ${chalk.cyan(result.summary.byCategory.PERFORMANCE)}`);
439
+ console.log(` 📝 Documentation: ${chalk.cyan(result.summary.byCategory.DOCUMENTATION)}`);
440
+ }
441
+ console.log('');
442
+ }
443
+ /**
444
+ * Check if review has blocking issues (CRITICAL or HIGH)
445
+ */
446
+ export function hasBlockingIssues(result) {
447
+ return result.summary.bySeverity.CRITICAL > 0 || result.summary.bySeverity.HIGH > 0;
448
+ }
449
+ //# sourceMappingURL=review-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-core.js","sourceRoot":"","sources":["../../src/lib/review-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=review-core.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-core.test.d.ts","sourceRoot":"","sources":["../../src/lib/review-core.test.ts"],"names":[],"mappings":""}