@diff-review-system/drs 4.0.0-rc.4 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/.pi/agents/describe/pr-describer.md +14 -0
  2. package/.pi/agents/review/unified-reviewer.md +31 -1
  3. package/.pi/agents/task/agents-md-updater.md +3 -1
  4. package/.pi/agents/task/review-issue-fixer.md +18 -1
  5. package/.pi/agents/visual/pr-explainer.md +205 -0
  6. package/.pi/workflows/github-pr-describe.yaml +10 -7
  7. package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +148 -0
  8. package/.pi/workflows/github-pr-post-comment.yaml +10 -10
  9. package/.pi/workflows/github-pr-review-post.yaml +19 -8
  10. package/.pi/workflows/github-pr-review.yaml +348 -7
  11. package/.pi/workflows/github-pr-show-changes.yaml +8 -8
  12. package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +103 -0
  13. package/.pi/workflows/github-pr-visual-explain.yaml +35 -0
  14. package/.pi/workflows/gitlab-mr-describe.yaml +8 -5
  15. package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +144 -0
  16. package/.pi/workflows/gitlab-mr-post-comment.yaml +8 -8
  17. package/.pi/workflows/gitlab-mr-review.yaml +348 -5
  18. package/.pi/workflows/gitlab-mr-show-changes.yaml +6 -6
  19. package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +100 -0
  20. package/.pi/workflows/gitlab-mr-visual-explain.yaml +33 -0
  21. package/.pi/workflows/local-fix-review-issues.yaml +82 -13
  22. package/.pi/workflows/local-review.yaml +9 -2
  23. package/.pi/workflows/local-update-agents-md.yaml +1 -1
  24. package/.pi/workflows/local-visual-explain.yaml +31 -0
  25. package/.pi/workflows/release-changelog-finalize.yaml +47 -0
  26. package/.pi/workflows/tag-changelog-update.yaml +4 -4
  27. package/README.md +91 -27
  28. package/dist/ci/runner.d.ts.map +1 -1
  29. package/dist/ci/runner.js +3 -1
  30. package/dist/ci/runner.js.map +1 -1
  31. package/dist/cli/index.js +48 -6
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/cli/run-agent.d.ts +2 -0
  34. package/dist/cli/run-agent.d.ts.map +1 -1
  35. package/dist/cli/run-agent.js +4 -0
  36. package/dist/cli/run-agent.js.map +1 -1
  37. package/dist/cli/workflow.d.ts +56 -2
  38. package/dist/cli/workflow.d.ts.map +1 -1
  39. package/dist/cli/workflow.js +2165 -85
  40. package/dist/cli/workflow.js.map +1 -1
  41. package/dist/github/client.d.ts +12 -0
  42. package/dist/github/client.d.ts.map +1 -1
  43. package/dist/github/client.js +27 -0
  44. package/dist/github/client.js.map +1 -1
  45. package/dist/github/platform-adapter.d.ts +6 -1
  46. package/dist/github/platform-adapter.d.ts.map +1 -1
  47. package/dist/github/platform-adapter.js +84 -8
  48. package/dist/github/platform-adapter.js.map +1 -1
  49. package/dist/gitlab/client.d.ts +11 -0
  50. package/dist/gitlab/client.d.ts.map +1 -1
  51. package/dist/gitlab/client.js +11 -0
  52. package/dist/gitlab/client.js.map +1 -1
  53. package/dist/gitlab/platform-adapter.d.ts +3 -1
  54. package/dist/gitlab/platform-adapter.d.ts.map +1 -1
  55. package/dist/gitlab/platform-adapter.js +32 -1
  56. package/dist/gitlab/platform-adapter.js.map +1 -1
  57. package/dist/lib/comment-formatter.d.ts +8 -0
  58. package/dist/lib/comment-formatter.d.ts.map +1 -1
  59. package/dist/lib/comment-formatter.js +12 -4
  60. package/dist/lib/comment-formatter.js.map +1 -1
  61. package/dist/lib/comment-poster.d.ts.map +1 -1
  62. package/dist/lib/comment-poster.js +28 -1
  63. package/dist/lib/comment-poster.js.map +1 -1
  64. package/dist/lib/config.d.ts +50 -11
  65. package/dist/lib/config.d.ts.map +1 -1
  66. package/dist/lib/config.js +163 -28
  67. package/dist/lib/config.js.map +1 -1
  68. package/dist/lib/context-compression.d.ts +10 -0
  69. package/dist/lib/context-compression.d.ts.map +1 -1
  70. package/dist/lib/context-compression.js +101 -13
  71. package/dist/lib/context-compression.js.map +1 -1
  72. package/dist/lib/context-loader.d.ts +2 -1
  73. package/dist/lib/context-loader.d.ts.map +1 -1
  74. package/dist/lib/context-loader.js +70 -1
  75. package/dist/lib/context-loader.js.map +1 -1
  76. package/dist/lib/describe-core.d.ts.map +1 -1
  77. package/dist/lib/describe-core.js +3 -2
  78. package/dist/lib/describe-core.js.map +1 -1
  79. package/dist/lib/diff-lines.d.ts +9 -0
  80. package/dist/lib/diff-lines.d.ts.map +1 -1
  81. package/dist/lib/diff-lines.js +17 -9
  82. package/dist/lib/diff-lines.js.map +1 -1
  83. package/dist/lib/exit.js +4 -4
  84. package/dist/lib/exit.js.map +1 -1
  85. package/dist/lib/html-artifact.d.ts +14 -0
  86. package/dist/lib/html-artifact.d.ts.map +1 -0
  87. package/dist/lib/html-artifact.js +59 -0
  88. package/dist/lib/html-artifact.js.map +1 -0
  89. package/dist/lib/issue-parser.js +3 -3
  90. package/dist/lib/issue-parser.js.map +1 -1
  91. package/dist/lib/json-output-schema.d.ts +70 -0
  92. package/dist/lib/json-output-schema.d.ts.map +1 -1
  93. package/dist/lib/json-output-schema.js +40 -0
  94. package/dist/lib/json-output-schema.js.map +1 -1
  95. package/dist/lib/platform-client.d.ts +26 -0
  96. package/dist/lib/platform-client.d.ts.map +1 -1
  97. package/dist/lib/review-artifact.d.ts +69 -0
  98. package/dist/lib/review-artifact.d.ts.map +1 -0
  99. package/dist/lib/review-artifact.js +171 -0
  100. package/dist/lib/review-artifact.js.map +1 -0
  101. package/dist/lib/review-core.d.ts +6 -4
  102. package/dist/lib/review-core.d.ts.map +1 -1
  103. package/dist/lib/review-core.js +71 -151
  104. package/dist/lib/review-core.js.map +1 -1
  105. package/dist/lib/review-orchestrator.d.ts +23 -0
  106. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  107. package/dist/lib/review-orchestrator.js +20 -13
  108. package/dist/lib/review-orchestrator.js.map +1 -1
  109. package/dist/lib/review-usage.d.ts +4 -0
  110. package/dist/lib/review-usage.d.ts.map +1 -1
  111. package/dist/lib/review-usage.js +25 -0
  112. package/dist/lib/review-usage.js.map +1 -1
  113. package/dist/lib/trace-collector.d.ts +105 -0
  114. package/dist/lib/trace-collector.d.ts.map +1 -0
  115. package/dist/lib/trace-collector.js +255 -0
  116. package/dist/lib/trace-collector.js.map +1 -0
  117. package/dist/lib/trace-html.d.ts +3 -0
  118. package/dist/lib/trace-html.d.ts.map +1 -0
  119. package/dist/lib/trace-html.js +349 -0
  120. package/dist/lib/trace-html.js.map +1 -0
  121. package/dist/lib/workflow-artifacts.d.ts +54 -0
  122. package/dist/lib/workflow-artifacts.d.ts.map +1 -0
  123. package/dist/lib/workflow-artifacts.js +150 -0
  124. package/dist/lib/workflow-artifacts.js.map +1 -0
  125. package/dist/pi/sdk.d.ts.map +1 -1
  126. package/dist/pi/sdk.js +570 -6
  127. package/dist/pi/sdk.js.map +1 -1
  128. package/dist/runtime/agent-loader.js +2 -2
  129. package/dist/runtime/client.d.ts +2 -0
  130. package/dist/runtime/client.d.ts.map +1 -1
  131. package/dist/runtime/client.js +11 -5
  132. package/dist/runtime/client.js.map +1 -1
  133. package/package.json +21 -15
  134. package/.pi/workflows/github-pr-describe-post.yaml +0 -24
  135. package/.pi/workflows/gitlab-mr-describe-post.yaml +0 -22
  136. package/.pi/workflows/gitlab-mr-review-code-quality.yaml +0 -31
  137. package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +0 -40
  138. package/.pi/workflows/gitlab-mr-review-post.yaml +0 -30
  139. package/.pi/workflows/local-staged-review.yaml +0 -17
  140. package/dist/cli/run-agent.test.d.ts +0 -2
  141. package/dist/cli/run-agent.test.d.ts.map +0 -1
  142. package/dist/cli/run-agent.test.js +0 -204
  143. package/dist/cli/run-agent.test.js.map +0 -1
  144. package/dist/cli/workflow.test.d.ts +0 -2
  145. package/dist/cli/workflow.test.d.ts.map +0 -1
  146. package/dist/cli/workflow.test.js +0 -1410
  147. package/dist/cli/workflow.test.js.map +0 -1
  148. package/dist/github/client.test.d.ts +0 -2
  149. package/dist/github/client.test.d.ts.map +0 -1
  150. package/dist/github/client.test.js +0 -206
  151. package/dist/github/client.test.js.map +0 -1
  152. package/dist/github/platform-adapter.test.d.ts +0 -2
  153. package/dist/github/platform-adapter.test.d.ts.map +0 -1
  154. package/dist/github/platform-adapter.test.js +0 -40
  155. package/dist/github/platform-adapter.test.js.map +0 -1
  156. package/dist/gitlab/diff-parser.test.d.ts +0 -2
  157. package/dist/gitlab/diff-parser.test.d.ts.map +0 -1
  158. package/dist/gitlab/diff-parser.test.js +0 -315
  159. package/dist/gitlab/diff-parser.test.js.map +0 -1
  160. package/dist/gitlab/platform-adapter.test.d.ts +0 -2
  161. package/dist/gitlab/platform-adapter.test.d.ts.map +0 -1
  162. package/dist/gitlab/platform-adapter.test.js +0 -21
  163. package/dist/gitlab/platform-adapter.test.js.map +0 -1
  164. package/dist/index.test.d.ts +0 -2
  165. package/dist/index.test.d.ts.map +0 -1
  166. package/dist/index.test.js +0 -7
  167. package/dist/index.test.js.map +0 -1
  168. package/dist/lib/code-quality-report.test.d.ts +0 -2
  169. package/dist/lib/code-quality-report.test.d.ts.map +0 -1
  170. package/dist/lib/code-quality-report.test.js +0 -327
  171. package/dist/lib/code-quality-report.test.js.map +0 -1
  172. package/dist/lib/comment-formatter.test.d.ts +0 -2
  173. package/dist/lib/comment-formatter.test.d.ts.map +0 -1
  174. package/dist/lib/comment-formatter.test.js +0 -727
  175. package/dist/lib/comment-formatter.test.js.map +0 -1
  176. package/dist/lib/comment-manager.test.d.ts +0 -2
  177. package/dist/lib/comment-manager.test.d.ts.map +0 -1
  178. package/dist/lib/comment-manager.test.js +0 -680
  179. package/dist/lib/comment-manager.test.js.map +0 -1
  180. package/dist/lib/comment-poster.test.d.ts +0 -5
  181. package/dist/lib/comment-poster.test.d.ts.map +0 -1
  182. package/dist/lib/comment-poster.test.js +0 -255
  183. package/dist/lib/comment-poster.test.js.map +0 -1
  184. package/dist/lib/config-model-overrides.test.d.ts +0 -2
  185. package/dist/lib/config-model-overrides.test.d.ts.map +0 -1
  186. package/dist/lib/config-model-overrides.test.js +0 -218
  187. package/dist/lib/config-model-overrides.test.js.map +0 -1
  188. package/dist/lib/config.test.d.ts +0 -2
  189. package/dist/lib/config.test.d.ts.map +0 -1
  190. package/dist/lib/config.test.js +0 -353
  191. package/dist/lib/config.test.js.map +0 -1
  192. package/dist/lib/context-compression.test.d.ts +0 -2
  193. package/dist/lib/context-compression.test.d.ts.map +0 -1
  194. package/dist/lib/context-compression.test.js +0 -337
  195. package/dist/lib/context-compression.test.js.map +0 -1
  196. package/dist/lib/context-loader.test.d.ts +0 -2
  197. package/dist/lib/context-loader.test.d.ts.map +0 -1
  198. package/dist/lib/context-loader.test.js +0 -212
  199. package/dist/lib/context-loader.test.js.map +0 -1
  200. package/dist/lib/cursor-fix-link.test.d.ts +0 -2
  201. package/dist/lib/cursor-fix-link.test.d.ts.map +0 -1
  202. package/dist/lib/cursor-fix-link.test.js +0 -70
  203. package/dist/lib/cursor-fix-link.test.js.map +0 -1
  204. package/dist/lib/describe-core.test.d.ts +0 -2
  205. package/dist/lib/describe-core.test.d.ts.map +0 -1
  206. package/dist/lib/describe-core.test.js +0 -208
  207. package/dist/lib/describe-core.test.js.map +0 -1
  208. package/dist/lib/describe-output-path.test.d.ts +0 -2
  209. package/dist/lib/describe-output-path.test.d.ts.map +0 -1
  210. package/dist/lib/describe-output-path.test.js +0 -51
  211. package/dist/lib/describe-output-path.test.js.map +0 -1
  212. package/dist/lib/describe-parser.test.d.ts +0 -2
  213. package/dist/lib/describe-parser.test.d.ts.map +0 -1
  214. package/dist/lib/describe-parser.test.js +0 -282
  215. package/dist/lib/describe-parser.test.js.map +0 -1
  216. package/dist/lib/description-executor.test.d.ts +0 -2
  217. package/dist/lib/description-executor.test.d.ts.map +0 -1
  218. package/dist/lib/description-executor.test.js +0 -135
  219. package/dist/lib/description-executor.test.js.map +0 -1
  220. package/dist/lib/description-formatter.test.d.ts +0 -2
  221. package/dist/lib/description-formatter.test.d.ts.map +0 -1
  222. package/dist/lib/description-formatter.test.js +0 -57
  223. package/dist/lib/description-formatter.test.js.map +0 -1
  224. package/dist/lib/diff-lines.test.d.ts +0 -2
  225. package/dist/lib/diff-lines.test.d.ts.map +0 -1
  226. package/dist/lib/diff-lines.test.js +0 -13
  227. package/dist/lib/diff-lines.test.js.map +0 -1
  228. package/dist/lib/diff-parser.test.d.ts +0 -2
  229. package/dist/lib/diff-parser.test.d.ts.map +0 -1
  230. package/dist/lib/diff-parser.test.js +0 -335
  231. package/dist/lib/diff-parser.test.js.map +0 -1
  232. package/dist/lib/error-comment-poster.test.d.ts +0 -2
  233. package/dist/lib/error-comment-poster.test.d.ts.map +0 -1
  234. package/dist/lib/error-comment-poster.test.js +0 -128
  235. package/dist/lib/error-comment-poster.test.js.map +0 -1
  236. package/dist/lib/exit.test.d.ts +0 -2
  237. package/dist/lib/exit.test.d.ts.map +0 -1
  238. package/dist/lib/exit.test.js +0 -120
  239. package/dist/lib/exit.test.js.map +0 -1
  240. package/dist/lib/issue-parser.test.d.ts +0 -2
  241. package/dist/lib/issue-parser.test.d.ts.map +0 -1
  242. package/dist/lib/issue-parser.test.js +0 -281
  243. package/dist/lib/issue-parser.test.js.map +0 -1
  244. package/dist/lib/json-output-schema.test.d.ts +0 -2
  245. package/dist/lib/json-output-schema.test.d.ts.map +0 -1
  246. package/dist/lib/json-output-schema.test.js +0 -92
  247. package/dist/lib/json-output-schema.test.js.map +0 -1
  248. package/dist/lib/json-output.test.d.ts +0 -2
  249. package/dist/lib/json-output.test.d.ts.map +0 -1
  250. package/dist/lib/json-output.test.js +0 -141
  251. package/dist/lib/json-output.test.js.map +0 -1
  252. package/dist/lib/logger.test.d.ts +0 -2
  253. package/dist/lib/logger.test.d.ts.map +0 -1
  254. package/dist/lib/logger.test.js +0 -324
  255. package/dist/lib/logger.test.js.map +0 -1
  256. package/dist/lib/position-validator.test.d.ts +0 -2
  257. package/dist/lib/position-validator.test.d.ts.map +0 -1
  258. package/dist/lib/position-validator.test.js +0 -128
  259. package/dist/lib/position-validator.test.js.map +0 -1
  260. package/dist/lib/prompt-budget.test.d.ts +0 -2
  261. package/dist/lib/prompt-budget.test.d.ts.map +0 -1
  262. package/dist/lib/prompt-budget.test.js +0 -55
  263. package/dist/lib/prompt-budget.test.js.map +0 -1
  264. package/dist/lib/repository-validator.test.d.ts +0 -5
  265. package/dist/lib/repository-validator.test.d.ts.map +0 -1
  266. package/dist/lib/repository-validator.test.js +0 -341
  267. package/dist/lib/repository-validator.test.js.map +0 -1
  268. package/dist/lib/review-core.test.d.ts +0 -2
  269. package/dist/lib/review-core.test.d.ts.map +0 -1
  270. package/dist/lib/review-core.test.js +0 -614
  271. package/dist/lib/review-core.test.js.map +0 -1
  272. package/dist/lib/review-orchestrator.test.d.ts +0 -2
  273. package/dist/lib/review-orchestrator.test.d.ts.map +0 -1
  274. package/dist/lib/review-orchestrator.test.js +0 -552
  275. package/dist/lib/review-orchestrator.test.js.map +0 -1
  276. package/dist/lib/review-output-path.test.d.ts +0 -2
  277. package/dist/lib/review-output-path.test.d.ts.map +0 -1
  278. package/dist/lib/review-output-path.test.js +0 -83
  279. package/dist/lib/review-output-path.test.js.map +0 -1
  280. package/dist/lib/review-parser.test.d.ts +0 -2
  281. package/dist/lib/review-parser.test.d.ts.map +0 -1
  282. package/dist/lib/review-parser.test.js +0 -130
  283. package/dist/lib/review-parser.test.js.map +0 -1
  284. package/dist/lib/review-usage.test.d.ts +0 -2
  285. package/dist/lib/review-usage.test.d.ts.map +0 -1
  286. package/dist/lib/review-usage.test.js +0 -83
  287. package/dist/lib/review-usage.test.js.map +0 -1
  288. package/dist/lib/unified-review-executor.d.ts +0 -58
  289. package/dist/lib/unified-review-executor.d.ts.map +0 -1
  290. package/dist/lib/unified-review-executor.js +0 -201
  291. package/dist/lib/unified-review-executor.js.map +0 -1
  292. package/dist/lib/unified-review-executor.test.d.ts +0 -5
  293. package/dist/lib/unified-review-executor.test.d.ts.map +0 -1
  294. package/dist/lib/unified-review-executor.test.js +0 -472
  295. package/dist/lib/unified-review-executor.test.js.map +0 -1
  296. package/dist/lib/write-json-output.test.d.ts +0 -2
  297. package/dist/lib/write-json-output.test.d.ts.map +0 -1
  298. package/dist/lib/write-json-output.test.js +0 -259
  299. package/dist/lib/write-json-output.test.js.map +0 -1
  300. package/dist/pi/sdk.test.d.ts +0 -2
  301. package/dist/pi/sdk.test.d.ts.map +0 -1
  302. package/dist/pi/sdk.test.js +0 -488
  303. package/dist/pi/sdk.test.js.map +0 -1
  304. package/dist/runtime/agent-loader.test.d.ts +0 -2
  305. package/dist/runtime/agent-loader.test.d.ts.map +0 -1
  306. package/dist/runtime/agent-loader.test.js +0 -277
  307. package/dist/runtime/agent-loader.test.js.map +0 -1
  308. package/dist/runtime/client.test.d.ts +0 -2
  309. package/dist/runtime/client.test.d.ts.map +0 -1
  310. package/dist/runtime/client.test.js +0 -772
  311. package/dist/runtime/client.test.js.map +0 -1
  312. package/dist/runtime/path-config.test.d.ts +0 -2
  313. package/dist/runtime/path-config.test.d.ts.map +0 -1
  314. package/dist/runtime/path-config.test.js +0 -112
  315. package/dist/runtime/path-config.test.js.map +0 -1
@@ -1,83 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-output-path.test.js","sourceRoot":"","sources":["../../src/lib/review-output-path.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=review-parser.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-parser.test.d.ts","sourceRoot":"","sources":["../../src/lib/review-parser.test.ts"],"names":[],"mappings":""}
@@ -1,130 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { writeFile, mkdir, rm } from 'fs/promises';
3
- import { join } from 'path';
4
- import { tmpdir } from 'os';
5
- import { parseReviewOutput } from './review-parser.js';
6
- // ── Helpers ──────────────────────────────────────────────────────
7
- let testDir;
8
- beforeEach(async () => {
9
- testDir = join(tmpdir(), `drs-review-parser-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
10
- await mkdir(join(testDir, '.drs'), { recursive: true });
11
- });
12
- afterEach(async () => {
13
- await rm(testDir, { recursive: true, force: true });
14
- });
15
- const REVIEW_JSON = {
16
- issues: [
17
- {
18
- category: 'SECURITY',
19
- severity: 'HIGH',
20
- title: 'SQL Injection',
21
- file: 'src/db.ts',
22
- line: 10,
23
- problem: 'Unsanitized input',
24
- solution: 'Use parameterized queries',
25
- },
26
- ],
27
- };
28
- // ── parseReviewOutput ────────────────────────────────────────────
29
- describe('parseReviewOutput', () => {
30
- describe('rawOutput inline JSON', () => {
31
- it('parses raw output with JSON in a fenced code block', async () => {
32
- const raw = `Here are my findings:
33
-
34
- \`\`\`json
35
- ${JSON.stringify(REVIEW_JSON, null, 2)}
36
- \`\`\`
37
-
38
- That's it.`;
39
- const result = await parseReviewOutput(testDir, false, raw);
40
- expect(result).toEqual(REVIEW_JSON);
41
- });
42
- it('parses simple non-nested JSON from raw output', async () => {
43
- // Simple JSON without nested objects parses correctly
44
- const simpleReview = { summary: 'No issues found', issueCount: 0 };
45
- const raw = JSON.stringify(simpleReview);
46
- const result = await parseReviewOutput(testDir, false, raw);
47
- expect(result).toEqual(simpleReview);
48
- });
49
- it('prefers inline JSON over file when raw output has fenced JSON', async () => {
50
- const fileJson = { issues: [{ title: 'from file' }] };
51
- await writeFile(join(testDir, '.drs/review-output.json'), JSON.stringify(fileJson));
52
- const raw = `\`\`\`json\n${JSON.stringify(REVIEW_JSON, null, 2)}\n\`\`\``;
53
- const result = await parseReviewOutput(testDir, false, raw);
54
- expect(result).toEqual(REVIEW_JSON);
55
- });
56
- });
57
- describe('output pointer', () => {
58
- it('follows outputType pointer to default review path', async () => {
59
- await writeFile(join(testDir, '.drs/review-output.json'), JSON.stringify(REVIEW_JSON));
60
- const raw = JSON.stringify({ outputType: 'review_output' });
61
- const result = await parseReviewOutput(testDir, false, raw);
62
- expect(result).toEqual(REVIEW_JSON);
63
- });
64
- it('follows outputPath pointer to custom file', async () => {
65
- const customPath = '.drs/custom-review.json';
66
- await writeFile(join(testDir, customPath), JSON.stringify(REVIEW_JSON));
67
- const raw = JSON.stringify({ outputPath: customPath });
68
- const result = await parseReviewOutput(testDir, false, raw);
69
- expect(result).toEqual(REVIEW_JSON);
70
- });
71
- it('falls back to default path when pointer file does not exist', async () => {
72
- await writeFile(join(testDir, '.drs/review-output.json'), JSON.stringify(REVIEW_JSON));
73
- const raw = JSON.stringify({ outputPath: '.drs/missing.json' });
74
- const result = await parseReviewOutput(testDir, false, raw);
75
- expect(result).toEqual(REVIEW_JSON);
76
- });
77
- it('throws for unexpected outputType', async () => {
78
- const raw = JSON.stringify({ outputType: 'describe_output' });
79
- await expect(parseReviewOutput(testDir, false, raw)).rejects.toThrow('Unexpected output type for review output');
80
- });
81
- });
82
- describe('default file path fallback', () => {
83
- it('reads from .drs/review-output.json when no rawOutput', async () => {
84
- await writeFile(join(testDir, '.drs/review-output.json'), JSON.stringify(REVIEW_JSON));
85
- const result = await parseReviewOutput(testDir, false);
86
- expect(result).toEqual(REVIEW_JSON);
87
- });
88
- it('throws when no rawOutput and default file is missing', async () => {
89
- await expect(parseReviewOutput(testDir, false)).rejects.toThrow('Review output file not found');
90
- });
91
- });
92
- describe('debug logging', () => {
93
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
- let consoleSpy;
95
- beforeEach(() => {
96
- consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
97
- });
98
- afterEach(() => {
99
- consoleSpy.mockRestore();
100
- });
101
- it('logs when loading from pointer path', async () => {
102
- await writeFile(join(testDir, '.drs/review-output.json'), JSON.stringify(REVIEW_JSON));
103
- const raw = JSON.stringify({ outputType: 'review_output' });
104
- await parseReviewOutput(testDir, true, raw);
105
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Review output loaded from'));
106
- });
107
- it('logs parse failure for invalid JSON in raw output', async () => {
108
- await writeFile(join(testDir, '.drs/review-output.json'), JSON.stringify(REVIEW_JSON));
109
- await parseReviewOutput(testDir, true, 'not valid json at all');
110
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Review output pointer parse failed'));
111
- });
112
- it('logs fallback when pointer file is missing', async () => {
113
- await writeFile(join(testDir, '.drs/review-output.json'), JSON.stringify(REVIEW_JSON));
114
- const raw = JSON.stringify({ outputPath: '.drs/nonexistent.json' });
115
- await parseReviewOutput(testDir, true, raw);
116
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('not found at .drs/nonexistent.json'));
117
- });
118
- });
119
- describe('security', () => {
120
- it('rejects path traversal in outputPath', async () => {
121
- const raw = JSON.stringify({ outputPath: '../../../etc/passwd' });
122
- await expect(parseReviewOutput(testDir, false, raw)).rejects.toThrow('Refusing to read outside working directory');
123
- });
124
- it('rejects absolute path in outputPath', async () => {
125
- const raw = JSON.stringify({ outputPath: '/etc/passwd' });
126
- await expect(parseReviewOutput(testDir, false, raw)).rejects.toThrow('Refusing to read outside working directory');
127
- });
128
- });
129
- });
130
- //# sourceMappingURL=review-parser.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-parser.test.js","sourceRoot":"","sources":["../../src/lib/review-parser.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=review-usage.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-usage.test.d.ts","sourceRoot":"","sources":["../../src/lib/review-usage.test.ts"],"names":[],"mappings":""}
@@ -1,83 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { addUsageSummary, aggregateAgentUsage, applyUsageMessage, createAgentUsageSummary, createEmptyUsageSummary, formatModelIdentifier, } from './review-usage.js';
3
- describe('review-usage', () => {
4
- it('adds usage values with sensible defaults', () => {
5
- const base = createEmptyUsageSummary();
6
- const total = addUsageSummary(base, {
7
- input: 10,
8
- output: 2,
9
- cacheRead: 3,
10
- cost: 0.5,
11
- });
12
- expect(total).toEqual({
13
- input: 10,
14
- output: 2,
15
- cacheRead: 3,
16
- cacheWrite: 0,
17
- totalTokens: 15,
18
- cost: 0.5,
19
- });
20
- });
21
- it('aggregates per-agent usage into run totals', () => {
22
- const result = aggregateAgentUsage([
23
- {
24
- agentType: 'security',
25
- turns: 1,
26
- usage: {
27
- input: 100,
28
- output: 10,
29
- cacheRead: 0,
30
- cacheWrite: 0,
31
- totalTokens: 110,
32
- cost: 0.01,
33
- },
34
- },
35
- {
36
- agentType: 'quality',
37
- turns: 1,
38
- usage: {
39
- input: 200,
40
- output: 20,
41
- cacheRead: 5,
42
- cacheWrite: 0,
43
- totalTokens: 225,
44
- cost: 0.02,
45
- },
46
- },
47
- ]);
48
- expect(result.total).toEqual({
49
- input: 300,
50
- output: 30,
51
- cacheRead: 5,
52
- cacheWrite: 0,
53
- totalTokens: 335,
54
- cost: 0.03,
55
- });
56
- expect(result.agents).toHaveLength(2);
57
- });
58
- it('applies usage messages and tracks turns/model', () => {
59
- const base = createAgentUsageSummary('describe/pr-describer');
60
- const next = applyUsageMessage(base, {
61
- provider: 'opencode',
62
- model: 'glm-5-free',
63
- usage: {
64
- input: 50,
65
- output: 10,
66
- cacheRead: 0,
67
- cacheWrite: 0,
68
- totalTokens: 60,
69
- cost: 0.002,
70
- },
71
- });
72
- expect(next.turns).toBe(1);
73
- expect(next.model).toBe('opencode/glm-5-free');
74
- expect(next.usage.totalTokens).toBe(60);
75
- expect(next.usage.cost).toBe(0.002);
76
- });
77
- it('formats provider/model identifiers', () => {
78
- expect(formatModelIdentifier('opencode', 'glm-5-free')).toBe('opencode/glm-5-free');
79
- expect(formatModelIdentifier(undefined, 'gpt-4o')).toBe('gpt-4o');
80
- expect(formatModelIdentifier(undefined, undefined)).toBeUndefined();
81
- });
82
- });
83
- //# sourceMappingURL=review-usage.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-usage.test.js","sourceRoot":"","sources":["../../src/lib/review-usage.test.ts"],"names":[],"mappings":"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"}
@@ -1,58 +0,0 @@
1
- /**
2
- * Unified review executor for GitHub and GitLab
3
- *
4
- * This module provides a platform-agnostic way to execute code reviews
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.
9
- */
10
- import { type DRSConfig } from './config.js';
11
- import type { ReviewIssue } from './comment-formatter.js';
12
- import type { CursorFixLinkOptions } from './cursor-fix-link.js';
13
- import type { PlatformClient, PullRequest, FileChange, LineValidator, InlineCommentPosition } from './platform-client.js';
14
- export { enforceRepoBranchMatch } from './repository-validator.js';
15
- export { postReviewComments } from './comment-poster.js';
16
- export interface UnifiedReviewOptions {
17
- /** Platform client (GitHub or GitLab adapter) */
18
- platformClient: PlatformClient;
19
- /** Project ID (e.g., "owner/repo" for GitHub, project ID for GitLab) */
20
- projectId: string;
21
- /** PR/MR number */
22
- prNumber: number;
23
- /** Optional pre-fetched PR/MR details (used to avoid duplicate platform calls) */
24
- pullRequest?: PullRequest;
25
- /** Optional pre-fetched changed files (used to avoid duplicate platform calls) */
26
- changedFiles?: FileChange[];
27
- /** Whether to post comments to the platform */
28
- postComments: boolean;
29
- /** Optional path to output GitLab code quality report JSON */
30
- codeQualityReport?: string;
31
- /** Optional path to write JSON results file */
32
- outputPath?: string;
33
- /** Output results as JSON to console */
34
- jsonOutput?: boolean;
35
- /** Override base branch used for diff command hints */
36
- baseBranch?: string;
37
- /** Optional line validator for checking which lines can be commented */
38
- lineValidator?: LineValidator;
39
- /** Optional function to create inline comment position data */
40
- createInlinePosition?: (issue: ReviewIssue, platformData: unknown) => InlineCommentPosition;
41
- /** Optional Cursor deeplink settings for posted issue comments */
42
- cursorFixLinks?: CursorFixLinkOptions;
43
- /** Working directory for file access */
44
- workingDir?: string;
45
- /** Generate PR/MR description during review */
46
- describe?: boolean;
47
- /** Post generated description during review */
48
- postDescription?: boolean;
49
- /** Debug mode - print runtime configuration */
50
- debug?: boolean;
51
- /** Reasoning effort level for the model */
52
- thinkingLevel?: string;
53
- }
54
- /**
55
- * Execute a unified code review for any platform
56
- */
57
- export declare function executeUnifiedReview(config: DRSConfig, options: UnifiedReviewOptions): Promise<void>;
58
- //# sourceMappingURL=unified-review-executor.d.ts.map
@@ -1 +0,0 @@
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;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAOjE,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,aAAa,EACb,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAoB9B,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,kFAAkF;IAClF,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,kFAAkF;IAClF,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,+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,kEAAkE;IAClE,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,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,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Of"}
@@ -1,201 +0,0 @@
1
- /**
2
- * Unified review executor for GitHub and GitLab
3
- *
4
- * This module provides a platform-agnostic way to execute code reviews
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.
9
- */
10
- import chalk from 'chalk';
11
- import { writeFile } from 'fs/promises';
12
- import { exitProcess } from './exit.js';
13
- import { getDescriberModelOverride, getModelOverrides, getUnifiedModelOverride, } from './config.js';
14
- import { connectToRuntime, filterIgnoredFiles, getReviewBudgetModelIds, } from './review-orchestrator.js';
15
- import { buildBaseInstructions, runReviewPipeline, displayReviewSummary } from './review-core.js';
16
- import { generateCodeQualityReport, formatCodeQualityReport } from './code-quality-report.js';
17
- import { formatReviewJson, writeReviewJson, printReviewJson } from './json-output.js';
18
- import { resolveWithinWorkingDir } from './path-utils.js';
19
- import { enforceRepoBranchMatch, resolveBaseBranch, getCanonicalDiffCommand, } from './repository-validator.js';
20
- import { postReviewComments } from './comment-poster.js';
21
- import { prepareDiffsForAgent, formatCompressionSummary, resolveCompressionBudget, } from './context-compression.js';
22
- import { runDescribeIfEnabled } from './description-executor.js';
23
- import { formatDescribeSummary } from './description-formatter.js';
24
- import { removeErrorComment } from './error-comment-poster.js';
25
- // Re-export functions for backward compatibility
26
- export { enforceRepoBranchMatch } from './repository-validator.js';
27
- export { postReviewComments } from './comment-poster.js';
28
- /**
29
- * Execute a unified code review for any platform
30
- */
31
- export async function executeUnifiedReview(config, options) {
32
- const { platformClient, projectId, prNumber, postComments } = options;
33
- // Track runtime client for cleanup
34
- let runtimeClient = null;
35
- try {
36
- console.log(chalk.bold.cyan('\n📋 DRS | Code Review Analysis\n'));
37
- // Fetch PR/MR details
38
- console.log(chalk.gray(`Fetching PR/MR #${prNumber}...\n`));
39
- const pr = options.pullRequest ?? (await platformClient.getPullRequest(projectId, prNumber));
40
- await enforceRepoBranchMatch(options.workingDir ?? process.cwd(), projectId, pr, {
41
- skipRepoCheck: config.review.skipRepoCheck,
42
- skipBranchCheck: config.review.skipBranchCheck,
43
- });
44
- const allFiles = options.changedFiles ?? (await platformClient.getChangedFiles(projectId, prNumber));
45
- console.log(chalk.bold(`PR/MR: ${pr.title}`));
46
- console.log(chalk.gray(`Author: ${pr.author}`));
47
- console.log(chalk.gray(`Branch: ${pr.sourceBranch} → ${pr.targetBranch}`));
48
- console.log(chalk.gray(`Files changed: ${allFiles.length}\n`));
49
- if (allFiles.length === 0) {
50
- console.log(chalk.yellow('✓ No changes to review\n'));
51
- return;
52
- }
53
- // Get list of changed files (excluding deleted files)
54
- const changedFileNames = allFiles
55
- .filter((file) => file.status !== 'removed')
56
- .map((file) => file.filename);
57
- if (changedFileNames.length === 0) {
58
- console.log(chalk.yellow('✓ No files to review after filtering\n'));
59
- return;
60
- }
61
- // Filter files by ignore patterns
62
- const filteredFileNames = filterIgnoredFiles(changedFileNames, config);
63
- const filteredFiles = filteredFileNames;
64
- const ignoredCount = changedFileNames.length - filteredFiles.length;
65
- if (ignoredCount > 0) {
66
- console.log(chalk.gray(`Ignoring ${ignoredCount} file(s) based on patterns\n`));
67
- }
68
- if (filteredFiles.length === 0) {
69
- console.log(chalk.yellow('✓ No files to review after filtering\n'));
70
- return;
71
- }
72
- const agentModelOverrides = getModelOverrides(config);
73
- const unifiedModelOverrides = getUnifiedModelOverride(config);
74
- const reviewOverrides = {
75
- ...agentModelOverrides,
76
- ...unifiedModelOverrides,
77
- };
78
- const describeEnabled = options.describe ?? config.review.describe?.enabled ?? false;
79
- const postDescriptionEnabled = options.postDescription ?? false;
80
- const describeOverrides = describeEnabled ? getDescriberModelOverride(config) : {};
81
- const modelOverrides = { ...reviewOverrides, ...describeOverrides };
82
- // Connect to runtime
83
- runtimeClient = await connectToRuntime(config, options.workingDir ?? process.cwd(), {
84
- debug: options.debug,
85
- modelOverrides,
86
- thinkingLevel: options.thinkingLevel,
87
- });
88
- const describeFileNames = allFiles
89
- .filter((file) => file.status !== 'removed')
90
- .map((file) => file.filename);
91
- const filteredDescribeFileNames = new Set(filterIgnoredFiles(describeFileNames, config));
92
- const filesForDescribe = allFiles
93
- .filter((file) => filteredDescribeFileNames.has(file.filename))
94
- .map((file) => ({
95
- filename: file.filename,
96
- patch: file.patch,
97
- }));
98
- let describeResult = null;
99
- if (describeEnabled) {
100
- describeResult = await runDescribeIfEnabled(runtimeClient, config, platformClient, projectId, pr, filesForDescribe, postDescriptionEnabled, options.workingDir ?? process.cwd(), options.debug);
101
- }
102
- // Build change context from describe output for review agents
103
- const describeSummary = describeResult ? formatDescribeSummary(describeResult) : undefined;
104
- // Build instructions for platform review - pass actual diff content from platform
105
- const reviewLabel = `PR/MR #${prNumber}`;
106
- const baseBranchResolution = resolveBaseBranch(options.baseBranch, pr.targetBranch);
107
- const fallbackDiffCommand = getCanonicalDiffCommand(pr, baseBranchResolution);
108
- const patchByFilename = new Map(allFiles.map((file) => [file.filename, file.patch]));
109
- const filesForInstructions = filteredFiles.map((filename) => ({
110
- filename,
111
- patch: patchByFilename.get(filename),
112
- }));
113
- const reviewModelIds = getReviewBudgetModelIds(config, agentModelOverrides, unifiedModelOverrides);
114
- const contextWindow = runtimeClient.getMinContextWindow(reviewModelIds);
115
- const compressionOptions = resolveCompressionBudget(contextWindow, config.contextCompression);
116
- const compression = prepareDiffsForAgent(filesForInstructions, compressionOptions);
117
- const compressionSummary = formatCompressionSummary(compression);
118
- if (compressionSummary) {
119
- console.log(chalk.yellow('⚠ Diff content trimmed to fit token budget.\n'));
120
- }
121
- let baseInstructions = buildBaseInstructions(reviewLabel, compression.files, fallbackDiffCommand, compressionSummary);
122
- if (baseBranchResolution.resolvedBaseBranch) {
123
- baseInstructions = `${baseInstructions}\n\nBase branch resolved to: ${baseBranchResolution.resolvedBaseBranch} (${baseBranchResolution.source})`;
124
- }
125
- // Run agents using shared core logic
126
- const result = await runReviewPipeline(runtimeClient, config, baseInstructions, reviewLabel, filteredFiles, { prNumber, describeSummary }, options.workingDir ?? process.cwd(), options.debug ?? false);
127
- // Display summary
128
- displayReviewSummary(result);
129
- // Post comments to platform if requested
130
- if (postComments) {
131
- // Remove any previous error comment on successful review
132
- await removeErrorComment(platformClient, projectId, prNumber);
133
- await postReviewComments(platformClient, projectId, prNumber, result.summary, result.issues, result.changeSummary, result.usage, pr.platformData, options.lineValidator, options.createInlinePosition, options.cursorFixLinks, {
134
- headSha: pr.headSha,
135
- sourceBranch: pr.sourceBranch,
136
- targetBranch: pr.targetBranch,
137
- });
138
- }
139
- // Generate code quality report if requested
140
- if (options.codeQualityReport) {
141
- await generateAndWriteCodeQualityReport(result.issues, options.codeQualityReport, options.workingDir ?? process.cwd());
142
- }
143
- // Handle JSON output
144
- const wantsJsonOutput = options.jsonOutput ?? options.outputPath;
145
- if (wantsJsonOutput) {
146
- const jsonOutput = formatReviewJson(result.summary, result.issues, {
147
- source: `${options.prNumber}`,
148
- project: options.projectId,
149
- branch: {
150
- source: pr.sourceBranch,
151
- target: pr.targetBranch,
152
- },
153
- }, result.usage);
154
- if (options.outputPath) {
155
- await writeReviewJson(jsonOutput, options.outputPath, options.workingDir ?? process.cwd());
156
- console.log(chalk.green(`\n✓ Review results written to ${options.outputPath}\n`));
157
- }
158
- if (options.jsonOutput) {
159
- printReviewJson(jsonOutput);
160
- }
161
- }
162
- // Exit with error code if critical issues found
163
- if (result.summary.bySeverity.CRITICAL > 0) {
164
- console.log(chalk.red.bold('⚠️ Critical issues found!\n'));
165
- await runtimeClient.shutdown();
166
- exitProcess(1);
167
- }
168
- else if (result.summary.issuesFound === 0) {
169
- console.log(chalk.green('✓ No issues found! Code looks good.\n'));
170
- }
171
- }
172
- catch (error) {
173
- // Handle "all agents failed" error
174
- if (error instanceof Error && error.message === 'All review agents failed') {
175
- if (runtimeClient) {
176
- await runtimeClient.shutdown();
177
- }
178
- exitProcess(1);
179
- }
180
- throw error;
181
- }
182
- finally {
183
- // Shutdown runtime client if it was initialized
184
- if (runtimeClient) {
185
- await runtimeClient.shutdown();
186
- }
187
- }
188
- }
189
- /**
190
- * Generate and write GitLab code quality report
191
- */
192
- async function generateAndWriteCodeQualityReport(issues, reportPath, workingDir) {
193
- console.log(chalk.gray('Generating code quality report...\n'));
194
- const report = generateCodeQualityReport(issues);
195
- const jsonContent = formatCodeQualityReport(report);
196
- const fullPath = resolveWithinWorkingDir(workingDir, reportPath, 'write');
197
- await writeFile(fullPath, jsonContent, 'utf-8');
198
- console.log(chalk.green(`✓ Code quality report written to ${reportPath}`));
199
- console.log(chalk.gray(` Total issues: ${report.length}\n`));
200
- }
201
- //# sourceMappingURL=unified-review-executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unified-review-executor.js","sourceRoot":"","sources":["../../src/lib/unified-review-executor.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for unified-review-executor.ts
3
- */
4
- export {};
5
- //# sourceMappingURL=unified-review-executor.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unified-review-executor.test.d.ts","sourceRoot":"","sources":["../../src/lib/unified-review-executor.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}