@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 @@
1
+ {"version":3,"file":"review-orchestrator.test.js","sourceRoot":"","sources":["../../src/lib/review-orchestrator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=review-output-path.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-output-path.test.d.ts","sourceRoot":"","sources":["../../src/lib/review-output-path.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'fs/promises';
3
+ import { dirname, join } from 'path';
4
+ import { tmpdir } from 'os';
5
+ import { writeJsonOutput } from './write-json-output.js';
6
+ import { parseReviewOutput } from './review-parser.js';
7
+ import { OUTPUT_PATHS } from './output-paths.js';
8
+ describe('review output path integration', () => {
9
+ let workingDir;
10
+ beforeEach(async () => {
11
+ workingDir = await mkdtemp(join(tmpdir(), 'drs-review-'));
12
+ });
13
+ afterEach(async () => {
14
+ await rm(workingDir, { recursive: true, force: true });
15
+ });
16
+ it('writes review output to deterministic path and reads it', async () => {
17
+ const payload = {
18
+ timestamp: '2024-01-01T00:00:00.000Z',
19
+ summary: {
20
+ filesReviewed: 2,
21
+ issuesFound: 0,
22
+ bySeverity: {
23
+ CRITICAL: 0,
24
+ HIGH: 0,
25
+ MEDIUM: 0,
26
+ LOW: 0,
27
+ },
28
+ byCategory: {
29
+ SECURITY: 0,
30
+ QUALITY: 0,
31
+ STYLE: 0,
32
+ PERFORMANCE: 0,
33
+ DOCUMENTATION: 0,
34
+ },
35
+ },
36
+ issues: [],
37
+ };
38
+ const pointer = await writeJsonOutput({
39
+ outputType: 'review_output',
40
+ payload,
41
+ pretty: false,
42
+ workingDir,
43
+ });
44
+ const expectedPath = join(workingDir, OUTPUT_PATHS.review_output);
45
+ const fileContents = JSON.parse(await readFile(expectedPath, 'utf-8'));
46
+ expect(fileContents).toEqual(payload);
47
+ expect(pointer).toEqual({
48
+ outputType: 'review_output',
49
+ outputPath: OUTPUT_PATHS.review_output,
50
+ });
51
+ const parsed = await parseReviewOutput(workingDir, false, JSON.stringify(pointer));
52
+ expect(parsed).toEqual(payload);
53
+ });
54
+ it('reads review output from default path without pointer', async () => {
55
+ const payload = {
56
+ timestamp: '2024-01-01T00:00:00.000Z',
57
+ summary: {
58
+ filesReviewed: 1,
59
+ issuesFound: 0,
60
+ bySeverity: {
61
+ CRITICAL: 0,
62
+ HIGH: 0,
63
+ MEDIUM: 0,
64
+ LOW: 0,
65
+ },
66
+ byCategory: {
67
+ SECURITY: 0,
68
+ QUALITY: 0,
69
+ STYLE: 0,
70
+ PERFORMANCE: 0,
71
+ DOCUMENTATION: 0,
72
+ },
73
+ },
74
+ issues: [],
75
+ };
76
+ const expectedPath = join(workingDir, OUTPUT_PATHS.review_output);
77
+ await mkdir(dirname(expectedPath), { recursive: true });
78
+ await writeFile(expectedPath, JSON.stringify(payload), 'utf-8');
79
+ const parsed = await parseReviewOutput(workingDir);
80
+ expect(parsed).toEqual(payload);
81
+ });
82
+ });
83
+ //# sourceMappingURL=review-output-path.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-output-path.test.js","sourceRoot":"","sources":["../../src/lib/review-output-path.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function parseReviewOutput(workingDir?: string, debug?: boolean, rawOutput?: string): Promise<unknown>;
2
+ //# sourceMappingURL=review-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-parser.d.ts","sourceRoot":"","sources":["../../src/lib/review-parser.ts"],"names":[],"mappings":"AAmFA,wBAAsB,iBAAiB,CACrC,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAyClB"}
@@ -0,0 +1,100 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { resolve } from 'path';
3
+ import { OUTPUT_PATHS } from './output-paths.js';
4
+ import { parseJsonFromAgentOutput } from './describe-parser.js';
5
+ function isOutputPointer(value) {
6
+ return !!value && typeof value === 'object' && ('outputType' in value || 'outputPath' in value);
7
+ }
8
+ const REVIEW_OUTPUT_PATH = OUTPUT_PATHS.review_output;
9
+ function resolveWithinWorkingDir(workingDir, targetPath) {
10
+ const root = resolve(workingDir);
11
+ const fullPath = resolve(workingDir, targetPath);
12
+ const rootWithSlash = root.endsWith('/') ? root : `${root}/`;
13
+ if (fullPath !== root && !fullPath.startsWith(rootWithSlash)) {
14
+ throw new Error(`Refusing to read outside working directory: ${targetPath}`);
15
+ }
16
+ return fullPath;
17
+ }
18
+ async function readJsonIfExists(workingDir, targetPath) {
19
+ const resolvedPath = resolveWithinWorkingDir(workingDir, targetPath);
20
+ try {
21
+ const fileContents = await readFile(resolvedPath, 'utf-8');
22
+ return JSON.parse(fileContents);
23
+ }
24
+ catch (error) {
25
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
26
+ return null;
27
+ }
28
+ throw error;
29
+ }
30
+ }
31
+ function resolveReviewOutputPath(pointer) {
32
+ if (!pointer) {
33
+ return null;
34
+ }
35
+ if (pointer.outputType && pointer.outputType !== 'review_output') {
36
+ throw new Error(`Unexpected output type for review output: ${pointer.outputType}`);
37
+ }
38
+ if (pointer.outputPath) {
39
+ return pointer.outputPath;
40
+ }
41
+ if (pointer.outputType) {
42
+ return OUTPUT_PATHS[pointer.outputType];
43
+ }
44
+ return null;
45
+ }
46
+ function parseReviewOutputPointer(raw, debug) {
47
+ try {
48
+ const parsed = parseJsonFromAgentOutput(raw);
49
+ if (isOutputPointer(parsed)) {
50
+ return parsed;
51
+ }
52
+ if (debug) {
53
+ console.log('Review output pointer not found in agent output.');
54
+ }
55
+ }
56
+ catch (error) {
57
+ if (debug) {
58
+ console.log(`Review output pointer parse failed: ${error instanceof Error ? error.message : String(error)}`);
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ export async function parseReviewOutput(workingDir = process.cwd(), debug = false, rawOutput) {
64
+ if (rawOutput) {
65
+ try {
66
+ const parsed = parseJsonFromAgentOutput(rawOutput);
67
+ if (parsed && !isOutputPointer(parsed)) {
68
+ return parsed;
69
+ }
70
+ }
71
+ catch (error) {
72
+ if (debug) {
73
+ console.log(`Review output JSON parse failed: ${error instanceof Error ? error.message : String(error)}`);
74
+ }
75
+ }
76
+ }
77
+ const pointer = rawOutput ? parseReviewOutputPointer(rawOutput, debug) : null;
78
+ const pointerPath = resolveReviewOutputPath(pointer);
79
+ if (pointerPath) {
80
+ const pointerOutput = await readJsonIfExists(workingDir, pointerPath);
81
+ if (pointerOutput) {
82
+ if (debug) {
83
+ console.log(`Review output loaded from ${pointerPath}`);
84
+ }
85
+ return pointerOutput;
86
+ }
87
+ if (debug) {
88
+ console.log(`Review output not found at ${pointerPath}, falling back to default path.`);
89
+ }
90
+ }
91
+ const defaultOutput = await readJsonIfExists(workingDir, REVIEW_OUTPUT_PATH);
92
+ if (defaultOutput) {
93
+ if (debug) {
94
+ console.log(`Review output loaded from ${REVIEW_OUTPUT_PATH}`);
95
+ }
96
+ return defaultOutput;
97
+ }
98
+ throw new Error(`Review output file not found at ${REVIEW_OUTPUT_PATH}`);
99
+ }
100
+ //# sourceMappingURL=review-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-parser.js","sourceRoot":"","sources":["../../src/lib/review-parser.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,16 @@
2
2
  * Unified review executor for GitHub and GitLab
3
3
  *
4
4
  * This module provides a platform-agnostic way to execute code reviews
5
- * by using the PlatformClient interface.
5
+ * by using the PlatformClient interface. It handles platform-specific
6
+ * features like posting comments and generating reports.
7
+ *
8
+ * Uses shared core logic from review-core.ts.
6
9
  */
7
- import type { DRSConfig } from './config.js';
8
- import { type ReviewIssue } from './comment-formatter.js';
10
+ import { type DRSConfig } from './config.js';
11
+ import type { ReviewIssue } from './comment-formatter.js';
9
12
  import type { PlatformClient, LineValidator, InlineCommentPosition } from './platform-client.js';
13
+ export { enforceRepoBranchMatch } from './repository-validator.js';
14
+ export { postReviewComments } from './comment-poster.js';
10
15
  export interface UnifiedReviewOptions {
11
16
  /** Platform client (GitHub or GitLab adapter) */
12
17
  platformClient: PlatformClient;
@@ -18,12 +23,24 @@ export interface UnifiedReviewOptions {
18
23
  postComments: boolean;
19
24
  /** Optional path to output GitLab code quality report JSON */
20
25
  codeQualityReport?: string;
26
+ /** Optional path to write JSON results file */
27
+ outputPath?: string;
28
+ /** Output results as JSON to console */
29
+ jsonOutput?: boolean;
30
+ /** Override base branch used for diff command hints */
31
+ baseBranch?: string;
21
32
  /** Optional line validator for checking which lines can be commented */
22
33
  lineValidator?: LineValidator;
23
34
  /** Optional function to create inline comment position data */
24
- createInlinePosition?: (issue: ReviewIssue, platformData: any) => InlineCommentPosition;
35
+ createInlinePosition?: (issue: ReviewIssue, platformData: unknown) => InlineCommentPosition;
25
36
  /** Working directory for file access */
26
37
  workingDir?: string;
38
+ /** Generate PR/MR description during review */
39
+ describe?: boolean;
40
+ /** Post generated description during review */
41
+ postDescription?: boolean;
42
+ /** Debug mode - print OpenCode configuration */
43
+ debug?: boolean;
27
44
  }
28
45
  /**
29
46
  * Execute a unified code review for any platform
@@ -1 +1 @@
1
- {"version":3,"file":"unified-review-executor.d.ts","sourceRoot":"","sources":["../../src/lib/unified-review-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAahC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGjG,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,cAAc,EAAE,cAAc,CAAC;IAC/B,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,YAAY,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,KAAK,qBAAqB,CAAC;IACxF,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuMf"}
1
+ {"version":3,"file":"unified-review-executor.d.ts","sourceRoot":"","sources":["../../src/lib/unified-review-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAYjG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,cAAc,EAAE,cAAc,CAAC;IAC/B,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,YAAY,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,KAAK,qBAAqB,CAAC;IAC5F,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqLf"}
@@ -2,18 +2,25 @@
2
2
  * Unified review executor for GitHub and GitLab
3
3
  *
4
4
  * This module provides a platform-agnostic way to execute code reviews
5
- * by using the PlatformClient interface.
5
+ * by using the PlatformClient interface. It handles platform-specific
6
+ * features like posting comments and generating reports.
7
+ *
8
+ * Uses shared core logic from review-core.ts.
6
9
  */
7
10
  import chalk from 'chalk';
8
11
  import { writeFile } from 'fs/promises';
9
12
  import { resolve } from 'path';
10
- import { getAgentNames } from './config.js';
11
- import { buildReviewPrompt } from './context-loader.js';
12
- import { parseReviewIssues } from './issue-parser.js';
13
- import { formatSummaryComment, formatIssueComment, calculateSummary, } from './comment-formatter.js';
14
- import { BOT_COMMENT_ID, createIssueFingerprint, findExistingSummaryComment, prepareIssuesForPosting, } from './comment-manager.js';
15
- import { connectToOpenCode, displayReviewSummary, filterIgnoredFiles, } from './review-orchestrator.js';
13
+ import { getDescriberModelOverride, getModelOverrides, getUnifiedModelOverride, } from './config.js';
14
+ import { connectToOpenCode, filterIgnoredFiles } from './review-orchestrator.js';
15
+ import { buildBaseInstructions, runReviewPipeline, displayReviewSummary } from './review-core.js';
16
16
  import { generateCodeQualityReport, formatCodeQualityReport } from './code-quality-report.js';
17
+ import { formatReviewJson, writeReviewJson, printReviewJson } from './json-output.js';
18
+ import { enforceRepoBranchMatch, resolveBaseBranch, getCanonicalDiffCommand, } from './repository-validator.js';
19
+ import { postReviewComments } from './comment-poster.js';
20
+ import { runDescribeIfEnabled } from './description-executor.js';
21
+ // Re-export functions for backward compatibility
22
+ export { enforceRepoBranchMatch } from './repository-validator.js';
23
+ export { postReviewComments } from './comment-poster.js';
17
24
  /**
18
25
  * Execute a unified code review for any platform
19
26
  */
@@ -23,6 +30,10 @@ export async function executeUnifiedReview(config, options) {
23
30
  // Fetch PR/MR details
24
31
  console.log(chalk.gray(`Fetching PR/MR #${prNumber}...\n`));
25
32
  const pr = await platformClient.getPullRequest(projectId, prNumber);
33
+ await enforceRepoBranchMatch(options.workingDir || process.cwd(), projectId, pr, {
34
+ skipRepoCheck: config.review.skipRepoCheck,
35
+ skipBranchCheck: config.review.skipBranchCheck,
36
+ });
26
37
  const allFiles = await platformClient.getChangedFiles(projectId, prNumber);
27
38
  console.log(chalk.bold(`PR/MR: ${pr.title}`));
28
39
  console.log(chalk.gray(`Author: ${pr.author}`));
@@ -33,15 +44,17 @@ export async function executeUnifiedReview(config, options) {
33
44
  return;
34
45
  }
35
46
  // Get list of changed files (excluding deleted files)
36
- const changedFiles = allFiles
47
+ const changedFileNames = allFiles
37
48
  .filter((file) => file.status !== 'removed')
38
49
  .map((file) => file.filename);
39
- if (changedFiles.length === 0) {
50
+ if (changedFileNames.length === 0) {
40
51
  console.log(chalk.yellow('✓ No files to review after filtering\n'));
41
52
  return;
42
53
  }
43
- const filteredFiles = filterIgnoredFiles(changedFiles, config);
44
- const ignoredCount = changedFiles.length - filteredFiles.length;
54
+ // Filter files by ignore patterns
55
+ const filteredFileNames = filterIgnoredFiles(changedFileNames, config);
56
+ const filteredFiles = filteredFileNames;
57
+ const ignoredCount = changedFileNames.length - filteredFiles.length;
45
58
  if (ignoredCount > 0) {
46
59
  console.log(chalk.gray(`Ignoring ${ignoredCount} file(s) based on patterns\n`));
47
60
  }
@@ -49,170 +62,90 @@ export async function executeUnifiedReview(config, options) {
49
62
  console.log(chalk.yellow('✓ No files to review after filtering\n'));
50
63
  return;
51
64
  }
65
+ const reviewOverrides = {
66
+ ...getModelOverrides(config),
67
+ ...getUnifiedModelOverride(config),
68
+ };
69
+ const describeEnabled = options.describe ?? config.review.describe?.enabled ?? false;
70
+ const postDescriptionEnabled = options.postDescription ?? config.review.describe?.postDescription ?? false;
71
+ const describeOverrides = describeEnabled ? getDescriberModelOverride(config) : {};
72
+ const modelOverrides = { ...reviewOverrides, ...describeOverrides };
52
73
  // Connect to OpenCode
53
- const opencode = await connectToOpenCode(config, options.workingDir || process.cwd());
74
+ const opencode = await connectToOpenCode(config, options.workingDir || process.cwd(), {
75
+ debug: options.debug,
76
+ modelOverrides,
77
+ });
54
78
  try {
55
- // Execute review
56
- console.log(chalk.gray('Starting code analysis...\n'));
57
- const issues = [];
58
- // Base instructions for review agents
59
- const baseInstructions = `Review the following files from PR/MR #${prNumber}:
60
-
61
- ${filteredFiles.map((f) => `- ${f}`).join('\n')}
62
-
63
- **Instructions:**
64
- 1. Use the Read tool to examine each changed file
65
- 2. Analyze the code for issues in your specialty area
66
- 3. Output your findings in this JSON format:
67
-
68
- \`\`\`json
69
- {
70
- "issues": [
71
- {
72
- "category": "SECURITY" | "QUALITY" | "STYLE" | "PERFORMANCE",
73
- "severity": "CRITICAL" | "HIGH" | "MEDIUM" | "LOW",
74
- "title": "Brief title",
75
- "file": "path/to/file.ts",
76
- "line": 42,
77
- "problem": "Description of the problem",
78
- "solution": "How to fix it",
79
- "agent": "security" | "quality" | "style" | "performance"
80
- }
81
- ]
82
- }
83
- \`\`\`
84
-
85
- Be thorough and identify all issues. Include line numbers when possible.`;
86
- // Invoke all configured review agents in parallel for faster execution
87
- const agentNames = getAgentNames(config);
88
- const agentPromises = agentNames.map(async (agentType) => {
89
- const agentName = `review/${agentType}`;
90
- console.log(chalk.gray(`Running ${agentType} review...\n`));
91
- try {
92
- // Build prompt with global and agent-specific context
93
- const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, `PR/MR #${prNumber}`, filteredFiles);
94
- const session = await opencode.createSession({
95
- agent: agentName,
96
- message: reviewPrompt,
97
- context: {
98
- files: filteredFiles,
99
- prNumber,
100
- },
101
- });
102
- const agentIssues = [];
103
- // Collect results from this agent
104
- for await (const message of opencode.streamMessages(session.id)) {
105
- if (message.role === 'assistant') {
106
- // Parse issues from response
107
- const parsedIssues = parseReviewIssues(message.content);
108
- if (parsedIssues.length > 0) {
109
- agentIssues.push(...parsedIssues);
110
- console.log(chalk.green(`✓ [${agentType}] Found ${parsedIssues.length} issue(s)`));
111
- }
112
- }
113
- }
114
- await opencode.closeSession(session.id);
115
- return { agentType, success: true, issues: agentIssues };
116
- }
117
- catch (error) {
118
- console.error(chalk.red(`✗ ${agentType} agent failed: ${error}`));
119
- return { agentType, success: false, issues: [] };
120
- }
121
- });
122
- // Wait for all agents to complete in parallel
123
- const agentResults = await Promise.all(agentPromises);
124
- // Check if all agents failed
125
- const successfulAgents = agentResults.filter((r) => r.success);
126
- const failedAgents = agentResults.filter((r) => !r.success);
127
- if (successfulAgents.length === 0) {
128
- console.error(chalk.red('\n✗ All review agents failed!\n'));
129
- console.error(chalk.yellow('This usually means:\n' +
130
- ' 1. Model configuration is incorrect or missing\n' +
131
- ' 2. API credentials are invalid or missing\n' +
132
- ' 3. Models are not accessible or timed out\n' +
133
- ' 4. Agents cannot find files to review\n'));
134
- await opencode.shutdown();
135
- process.exit(1);
79
+ const filesForDescribe = allFiles.map((file) => ({
80
+ filename: file.filename,
81
+ patch: file.patch,
82
+ }));
83
+ if (describeEnabled) {
84
+ await runDescribeIfEnabled(opencode, config, platformClient, projectId, pr, filesForDescribe, postDescriptionEnabled, options.workingDir || process.cwd(), options.debug);
136
85
  }
137
- if (failedAgents.length > 0) {
138
- console.log(chalk.yellow(`\n⚠️ ${failedAgents.length} of ${agentResults.length} agents failed: ${failedAgents.map((r) => r.agentType).join(', ')}\n`));
86
+ // Build instructions for platform review - pass actual diff content from platform
87
+ const reviewLabel = `PR/MR #${prNumber}`;
88
+ const baseBranchResolution = resolveBaseBranch(options.baseBranch, pr.targetBranch);
89
+ const fallbackDiffCommand = getCanonicalDiffCommand(pr, baseBranchResolution);
90
+ const filesForInstructions = filteredFiles.map((filename) => ({ filename }));
91
+ let baseInstructions = buildBaseInstructions(reviewLabel, filesForInstructions, fallbackDiffCommand);
92
+ if (baseBranchResolution.resolvedBaseBranch) {
93
+ baseInstructions = `${baseInstructions}\n\nBase branch resolved to: ${baseBranchResolution.resolvedBaseBranch} (${baseBranchResolution.source})`;
139
94
  }
140
- // Flatten all issues from successful agents
141
- agentResults.forEach((result) => issues.push(...result.issues));
95
+ // Run agents using shared core logic
96
+ const result = await runReviewPipeline(opencode, config, baseInstructions, reviewLabel, filteredFiles, { prNumber }, options.workingDir || process.cwd(), options.debug || false);
142
97
  // Display summary
143
- const summary = calculateSummary(filteredFiles.length, issues);
144
- displayReviewSummary({ issues, summary, filesReviewed: filteredFiles.length });
98
+ displayReviewSummary(result);
145
99
  // Post comments to platform if requested
146
100
  if (postComments) {
147
- await postReviewComments(platformClient, projectId, prNumber, summary, issues, pr.platformData, options.lineValidator, options.createInlinePosition);
101
+ await postReviewComments(platformClient, projectId, prNumber, result.summary, result.issues, result.changeSummary, pr.platformData, options.lineValidator, options.createInlinePosition);
148
102
  }
149
103
  // Generate code quality report if requested
150
104
  if (options.codeQualityReport) {
151
- await generateAndWriteCodeQualityReport(issues, options.codeQualityReport, options.workingDir || process.cwd());
105
+ await generateAndWriteCodeQualityReport(result.issues, options.codeQualityReport, options.workingDir || process.cwd());
106
+ }
107
+ // Handle JSON output
108
+ const wantsJsonOutput = options.jsonOutput || options.outputPath;
109
+ if (wantsJsonOutput) {
110
+ const jsonOutput = formatReviewJson(result.summary, result.issues, {
111
+ source: `${options.prNumber}`,
112
+ project: options.projectId,
113
+ branch: {
114
+ source: pr.sourceBranch,
115
+ target: pr.targetBranch,
116
+ },
117
+ });
118
+ if (options.outputPath) {
119
+ await writeReviewJson(jsonOutput, options.outputPath, options.workingDir || process.cwd());
120
+ console.log(chalk.green(`\n✓ Review results written to ${options.outputPath}\n`));
121
+ }
122
+ if (options.jsonOutput) {
123
+ printReviewJson(jsonOutput);
124
+ }
152
125
  }
153
126
  // Exit with error code if critical issues found
154
- if (summary.bySeverity.CRITICAL > 0) {
127
+ if (result.summary.bySeverity.CRITICAL > 0) {
155
128
  console.log(chalk.red.bold('⚠️ Critical issues found!\n'));
156
129
  await opencode.shutdown();
157
130
  process.exit(1);
158
131
  }
159
- else if (summary.issuesFound === 0) {
132
+ else if (result.summary.issuesFound === 0) {
160
133
  console.log(chalk.green('✓ No issues found! Code looks good.\n'));
161
134
  }
162
135
  }
136
+ catch (error) {
137
+ // Handle "all agents failed" error
138
+ if (error instanceof Error && error.message === 'All review agents failed') {
139
+ await opencode.shutdown();
140
+ process.exit(1);
141
+ }
142
+ throw error;
143
+ }
163
144
  finally {
164
145
  // Shutdown OpenCode
165
146
  await opencode.shutdown();
166
147
  }
167
148
  }
168
- /**
169
- * Post review comments to the platform
170
- */
171
- async function postReviewComments(platformClient, projectId, prNumber, summary, issues, platformData, lineValidator, createInlinePosition) {
172
- console.log(chalk.gray('Fetching existing comments...\n'));
173
- // Fetch existing comments to prevent duplicates
174
- const [existingComments, existingInlineComments] = await Promise.all([
175
- platformClient.getComments(projectId, prNumber),
176
- platformClient.getInlineComments(projectId, prNumber),
177
- ]);
178
- // Find our existing summary comment
179
- const allComments = [
180
- ...existingComments.map((c) => ({ id: c.id, body: c.body })),
181
- ...existingInlineComments.map((c) => ({ id: c.id, body: c.body })),
182
- ];
183
- const existingSummary = findExistingSummaryComment(existingComments.map((c) => ({ id: c.id, body: c.body })));
184
- // Post or update summary comment
185
- console.log(chalk.gray('Posting review summary...\n'));
186
- const summaryComment = formatSummaryComment(summary, issues, BOT_COMMENT_ID);
187
- if (existingSummary) {
188
- await platformClient.updateComment(projectId, prNumber, existingSummary.id, summaryComment);
189
- console.log(chalk.green('✓ Updated existing review summary'));
190
- }
191
- else {
192
- await platformClient.createComment(projectId, prNumber, summaryComment);
193
- console.log(chalk.green('✓ Posted new review summary'));
194
- }
195
- // Prepare issues for posting: filter to CRITICAL/HIGH, deduplicate, validate lines
196
- const prepared = prepareIssuesForPosting(issues, allComments, (issue) => {
197
- if (!issue.line || !lineValidator)
198
- return false;
199
- return lineValidator.isValidLine(issue.file, issue.line);
200
- });
201
- if (prepared.deduplicatedCount > 0) {
202
- console.log(chalk.gray(`Skipped ${prepared.deduplicatedCount} duplicate issue(s) already commented\n`));
203
- }
204
- // Post inline comments for new CRITICAL/HIGH issues
205
- if (prepared.inlineIssues.length > 0 && createInlinePosition) {
206
- const inlineComments = prepared.inlineIssues.map((issue) => ({
207
- body: formatIssueComment(issue, createIssueFingerprint(issue)),
208
- position: createInlinePosition(issue, platformData),
209
- }));
210
- await platformClient.createBulkInlineComments(projectId, prNumber, inlineComments);
211
- }
212
- // Add ai-reviewed label
213
- await platformClient.addLabels(projectId, prNumber, ['ai-reviewed']);
214
- console.log(chalk.green('✓ Review posted\n'));
215
- }
216
149
  /**
217
150
  * Generate and write GitLab code quality report
218
151
  */