@diff-review-system/drs 1.0.0 → 2.0.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 (287) 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 -130
  4. package/.opencode/agent/review/quality.md +36 -104
  5. package/.opencode/agent/review/security.md +32 -94
  6. package/.opencode/agent/review/style.md +26 -10
  7. package/.opencode/agent/review/unified-reviewer.md +74 -0
  8. package/.opencode/opencode.jsonc +4 -41
  9. package/.opencode/tool/write_json_output.ts +24 -0
  10. package/README.md +215 -82
  11. package/dist/ci/runner.d.ts.map +1 -1
  12. package/dist/ci/runner.js +4 -4
  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 +234 -20
  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 +337 -120
  27. package/dist/cli/init.js.map +1 -1
  28. package/dist/cli/post-comments.d.ts +15 -0
  29. package/dist/cli/post-comments.d.ts.map +1 -0
  30. package/dist/cli/post-comments.js +216 -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 +46 -63
  35. package/dist/cli/review-local.js.map +1 -1
  36. package/dist/cli/review-mr.d.ts +7 -0
  37. package/dist/cli/review-mr.d.ts.map +1 -1
  38. package/dist/cli/review-mr.js +88 -117
  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 +81 -114
  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/client.d.ts +199 -4
  49. package/dist/github/client.d.ts.map +1 -1
  50. package/dist/github/client.js +37 -2
  51. package/dist/github/client.js.map +1 -1
  52. package/dist/github/client.test.d.ts +2 -0
  53. package/dist/github/client.test.d.ts.map +1 -0
  54. package/dist/github/client.test.js +206 -0
  55. package/dist/github/client.test.js.map +1 -0
  56. package/dist/github/platform-adapter.d.ts +31 -0
  57. package/dist/github/platform-adapter.d.ts.map +1 -0
  58. package/dist/github/platform-adapter.js +129 -0
  59. package/dist/github/platform-adapter.js.map +1 -0
  60. package/dist/github/platform-adapter.test.d.ts +2 -0
  61. package/dist/github/platform-adapter.test.d.ts.map +1 -0
  62. package/dist/github/platform-adapter.test.js +40 -0
  63. package/dist/github/platform-adapter.test.js.map +1 -0
  64. package/dist/gitlab/client.d.ts +12 -0
  65. package/dist/gitlab/client.d.ts.map +1 -1
  66. package/dist/gitlab/client.js +19 -1
  67. package/dist/gitlab/client.js.map +1 -1
  68. package/dist/gitlab/diff-parser.test.d.ts +2 -0
  69. package/dist/gitlab/diff-parser.test.d.ts.map +1 -0
  70. package/dist/gitlab/diff-parser.test.js +315 -0
  71. package/dist/gitlab/diff-parser.test.js.map +1 -0
  72. package/dist/gitlab/platform-adapter.d.ts +27 -0
  73. package/dist/gitlab/platform-adapter.d.ts.map +1 -0
  74. package/dist/gitlab/platform-adapter.js +121 -0
  75. package/dist/gitlab/platform-adapter.js.map +1 -0
  76. package/dist/gitlab/platform-adapter.test.d.ts +2 -0
  77. package/dist/gitlab/platform-adapter.test.d.ts.map +1 -0
  78. package/dist/gitlab/platform-adapter.test.js +21 -0
  79. package/dist/gitlab/platform-adapter.test.js.map +1 -0
  80. package/dist/index.test.d.ts +2 -0
  81. package/dist/index.test.d.ts.map +1 -0
  82. package/dist/index.test.js +7 -0
  83. package/dist/index.test.js.map +1 -0
  84. package/dist/lib/change-summary.d.ts +8 -0
  85. package/dist/lib/change-summary.d.ts.map +1 -0
  86. package/dist/lib/change-summary.js +2 -0
  87. package/dist/lib/change-summary.js.map +1 -0
  88. package/dist/lib/code-quality-report.d.ts +44 -0
  89. package/dist/lib/code-quality-report.d.ts.map +1 -0
  90. package/dist/lib/code-quality-report.js +62 -0
  91. package/dist/lib/code-quality-report.js.map +1 -0
  92. package/dist/lib/code-quality-report.test.d.ts +2 -0
  93. package/dist/lib/code-quality-report.test.d.ts.map +1 -0
  94. package/dist/lib/code-quality-report.test.js +327 -0
  95. package/dist/lib/code-quality-report.test.js.map +1 -0
  96. package/dist/{gitlab → lib}/comment-formatter.d.ts +6 -3
  97. package/dist/lib/comment-formatter.d.ts.map +1 -0
  98. package/dist/{gitlab → lib}/comment-formatter.js +63 -16
  99. package/dist/lib/comment-formatter.js.map +1 -0
  100. package/dist/lib/comment-formatter.test.d.ts +2 -0
  101. package/dist/lib/comment-formatter.test.d.ts.map +1 -0
  102. package/dist/lib/comment-formatter.test.js +607 -0
  103. package/dist/lib/comment-formatter.test.js.map +1 -0
  104. package/dist/lib/comment-manager.d.ts +61 -0
  105. package/dist/lib/comment-manager.d.ts.map +1 -0
  106. package/dist/lib/comment-manager.js +91 -0
  107. package/dist/lib/comment-manager.js.map +1 -0
  108. package/dist/lib/comment-manager.test.d.ts +2 -0
  109. package/dist/lib/comment-manager.test.d.ts.map +1 -0
  110. package/dist/lib/comment-manager.test.js +618 -0
  111. package/dist/lib/comment-manager.test.js.map +1 -0
  112. package/dist/lib/comment-poster.d.ts +21 -0
  113. package/dist/lib/comment-poster.d.ts.map +1 -0
  114. package/dist/lib/comment-poster.js +96 -0
  115. package/dist/lib/comment-poster.js.map +1 -0
  116. package/dist/lib/comment-poster.test.d.ts +5 -0
  117. package/dist/lib/comment-poster.test.d.ts.map +1 -0
  118. package/dist/lib/comment-poster.test.js +215 -0
  119. package/dist/lib/comment-poster.test.js.map +1 -0
  120. package/dist/lib/config-model-overrides.test.d.ts +12 -0
  121. package/dist/lib/config-model-overrides.test.d.ts.map +1 -0
  122. package/dist/lib/config-model-overrides.test.js +254 -0
  123. package/dist/lib/config-model-overrides.test.js.map +1 -0
  124. package/dist/lib/config.d.ts +93 -8
  125. package/dist/lib/config.d.ts.map +1 -1
  126. package/dist/lib/config.js +178 -25
  127. package/dist/lib/config.js.map +1 -1
  128. package/dist/lib/config.test.d.ts +2 -0
  129. package/dist/lib/config.test.d.ts.map +1 -0
  130. package/dist/lib/config.test.js +36 -0
  131. package/dist/lib/config.test.js.map +1 -0
  132. package/dist/lib/context-compression.d.ts +19 -0
  133. package/dist/lib/context-compression.d.ts.map +1 -0
  134. package/dist/lib/context-compression.js +170 -0
  135. package/dist/lib/context-compression.js.map +1 -0
  136. package/dist/lib/context-compression.test.d.ts +2 -0
  137. package/dist/lib/context-compression.test.d.ts.map +1 -0
  138. package/dist/lib/context-compression.test.js +33 -0
  139. package/dist/lib/context-compression.test.js.map +1 -0
  140. package/dist/lib/context-loader.d.ts +29 -0
  141. package/dist/lib/context-loader.d.ts.map +1 -0
  142. package/dist/lib/context-loader.js +75 -0
  143. package/dist/lib/context-loader.js.map +1 -0
  144. package/dist/lib/context-loader.test.d.ts +2 -0
  145. package/dist/lib/context-loader.test.d.ts.map +1 -0
  146. package/dist/lib/context-loader.test.js +207 -0
  147. package/dist/lib/context-loader.test.js.map +1 -0
  148. package/dist/lib/describe-core.d.ts +9 -0
  149. package/dist/lib/describe-core.d.ts.map +1 -0
  150. package/dist/lib/describe-core.js +71 -0
  151. package/dist/lib/describe-core.js.map +1 -0
  152. package/dist/lib/describe-core.test.d.ts +2 -0
  153. package/dist/lib/describe-core.test.d.ts.map +1 -0
  154. package/dist/lib/describe-core.test.js +208 -0
  155. package/dist/lib/describe-core.test.js.map +1 -0
  156. package/dist/lib/describe-output-path.test.d.ts +2 -0
  157. package/dist/lib/describe-output-path.test.d.ts.map +1 -0
  158. package/dist/lib/describe-output-path.test.js +51 -0
  159. package/dist/lib/describe-output-path.test.js.map +1 -0
  160. package/dist/lib/describe-parser.d.ts +3 -0
  161. package/dist/lib/describe-parser.d.ts.map +1 -0
  162. package/dist/lib/describe-parser.js +163 -0
  163. package/dist/lib/describe-parser.js.map +1 -0
  164. package/dist/lib/describe-parser.test.d.ts +2 -0
  165. package/dist/lib/describe-parser.test.d.ts.map +1 -0
  166. package/dist/lib/describe-parser.test.js +282 -0
  167. package/dist/lib/describe-parser.test.js.map +1 -0
  168. package/dist/lib/description-executor.d.ts +22 -0
  169. package/dist/lib/description-executor.d.ts.map +1 -0
  170. package/dist/lib/description-executor.js +72 -0
  171. package/dist/lib/description-executor.js.map +1 -0
  172. package/dist/lib/description-formatter.d.ts +37 -0
  173. package/dist/lib/description-formatter.d.ts.map +1 -0
  174. package/dist/lib/description-formatter.js +219 -0
  175. package/dist/lib/description-formatter.js.map +1 -0
  176. package/dist/{gitlab → lib}/diff-parser.d.ts +11 -0
  177. package/dist/lib/diff-parser.d.ts.map +1 -0
  178. package/dist/{gitlab → lib}/diff-parser.js +40 -3
  179. package/dist/lib/diff-parser.js.map +1 -0
  180. package/dist/lib/issue-parser.d.ts +29 -0
  181. package/dist/lib/issue-parser.d.ts.map +1 -0
  182. package/dist/lib/issue-parser.js +153 -0
  183. package/dist/lib/issue-parser.js.map +1 -0
  184. package/dist/lib/issue-parser.test.d.ts +2 -0
  185. package/dist/lib/issue-parser.test.d.ts.map +1 -0
  186. package/dist/lib/issue-parser.test.js +281 -0
  187. package/dist/lib/issue-parser.test.js.map +1 -0
  188. package/dist/lib/json-output-schema.d.ts +207 -0
  189. package/dist/lib/json-output-schema.d.ts.map +1 -0
  190. package/dist/lib/json-output-schema.js +124 -0
  191. package/dist/lib/json-output-schema.js.map +1 -0
  192. package/dist/lib/json-output-schema.test.d.ts +2 -0
  193. package/dist/lib/json-output-schema.test.d.ts.map +1 -0
  194. package/dist/lib/json-output-schema.test.js +92 -0
  195. package/dist/lib/json-output-schema.test.js.map +1 -0
  196. package/dist/lib/json-output.d.ts +43 -0
  197. package/dist/lib/json-output.d.ts.map +1 -0
  198. package/dist/lib/json-output.js +34 -0
  199. package/dist/lib/json-output.js.map +1 -0
  200. package/dist/lib/output-paths.d.ts +6 -0
  201. package/dist/lib/output-paths.d.ts.map +1 -0
  202. package/dist/lib/output-paths.js +5 -0
  203. package/dist/lib/output-paths.js.map +1 -0
  204. package/dist/lib/platform-client.d.ts +130 -0
  205. package/dist/lib/platform-client.d.ts.map +1 -0
  206. package/dist/lib/platform-client.js +8 -0
  207. package/dist/lib/platform-client.js.map +1 -0
  208. package/dist/lib/position-validator.d.ts +36 -0
  209. package/dist/lib/position-validator.d.ts.map +1 -0
  210. package/dist/lib/position-validator.js +43 -0
  211. package/dist/lib/position-validator.js.map +1 -0
  212. package/dist/lib/repository-validator.d.ts +52 -0
  213. package/dist/lib/repository-validator.d.ts.map +1 -0
  214. package/dist/lib/repository-validator.js +219 -0
  215. package/dist/lib/repository-validator.js.map +1 -0
  216. package/dist/lib/repository-validator.test.d.ts +5 -0
  217. package/dist/lib/repository-validator.test.d.ts.map +1 -0
  218. package/dist/lib/repository-validator.test.js +341 -0
  219. package/dist/lib/repository-validator.test.js.map +1 -0
  220. package/dist/lib/review-core.d.ts +66 -0
  221. package/dist/lib/review-core.d.ts.map +1 -0
  222. package/dist/lib/review-core.js +449 -0
  223. package/dist/lib/review-core.js.map +1 -0
  224. package/dist/lib/review-core.test.d.ts +2 -0
  225. package/dist/lib/review-core.test.d.ts.map +1 -0
  226. package/dist/lib/review-core.test.js +552 -0
  227. package/dist/lib/review-core.test.js.map +1 -0
  228. package/dist/lib/review-orchestrator.d.ts +77 -0
  229. package/dist/lib/review-orchestrator.d.ts.map +1 -0
  230. package/dist/lib/review-orchestrator.js +124 -0
  231. package/dist/lib/review-orchestrator.js.map +1 -0
  232. package/dist/lib/review-orchestrator.test.d.ts +2 -0
  233. package/dist/lib/review-orchestrator.test.d.ts.map +1 -0
  234. package/dist/lib/review-orchestrator.test.js +413 -0
  235. package/dist/lib/review-orchestrator.test.js.map +1 -0
  236. package/dist/lib/review-output-path.test.d.ts +2 -0
  237. package/dist/lib/review-output-path.test.d.ts.map +1 -0
  238. package/dist/lib/review-output-path.test.js +83 -0
  239. package/dist/lib/review-output-path.test.js.map +1 -0
  240. package/dist/lib/review-parser.d.ts +2 -0
  241. package/dist/lib/review-parser.d.ts.map +1 -0
  242. package/dist/lib/review-parser.js +100 -0
  243. package/dist/lib/review-parser.js.map +1 -0
  244. package/dist/lib/unified-review-executor.d.ts +49 -0
  245. package/dist/lib/unified-review-executor.d.ts.map +1 -0
  246. package/dist/lib/unified-review-executor.js +158 -0
  247. package/dist/lib/unified-review-executor.js.map +1 -0
  248. package/dist/lib/unified-review-executor.test.d.ts +5 -0
  249. package/dist/lib/unified-review-executor.test.d.ts.map +1 -0
  250. package/dist/lib/unified-review-executor.test.js +344 -0
  251. package/dist/lib/unified-review-executor.test.js.map +1 -0
  252. package/dist/lib/write-json-output.d.ts +13 -0
  253. package/dist/lib/write-json-output.d.ts.map +1 -0
  254. package/dist/lib/write-json-output.js +37 -0
  255. package/dist/lib/write-json-output.js.map +1 -0
  256. package/dist/opencode/agent-loader.d.ts +3 -4
  257. package/dist/opencode/agent-loader.d.ts.map +1 -1
  258. package/dist/opencode/agent-loader.js +51 -42
  259. package/dist/opencode/agent-loader.js.map +1 -1
  260. package/dist/opencode/agent-skill-overlay.d.ts +11 -0
  261. package/dist/opencode/agent-skill-overlay.d.ts.map +1 -0
  262. package/dist/opencode/agent-skill-overlay.js +164 -0
  263. package/dist/opencode/agent-skill-overlay.js.map +1 -0
  264. package/dist/opencode/client.d.ts +14 -5
  265. package/dist/opencode/client.d.ts.map +1 -1
  266. package/dist/opencode/client.js +311 -32
  267. package/dist/opencode/client.js.map +1 -1
  268. package/dist/opencode/client.test.d.ts +2 -0
  269. package/dist/opencode/client.test.d.ts.map +1 -0
  270. package/dist/opencode/client.test.js +317 -0
  271. package/dist/opencode/client.test.js.map +1 -0
  272. package/dist/opencode/opencode-paths.d.ts +2 -0
  273. package/dist/opencode/opencode-paths.d.ts.map +1 -0
  274. package/dist/opencode/opencode-paths.js +7 -0
  275. package/dist/opencode/opencode-paths.js.map +1 -0
  276. package/dist/opencode/skill-loader.d.ts +6 -0
  277. package/dist/opencode/skill-loader.d.ts.map +1 -0
  278. package/dist/opencode/skill-loader.js +36 -0
  279. package/dist/opencode/skill-loader.js.map +1 -0
  280. package/package.json +29 -20
  281. package/.opencode/agent/github-reviewer.md +0 -62
  282. package/.opencode/agent/gitlab-reviewer.md +0 -62
  283. package/.opencode/agent/local-reviewer.md +0 -71
  284. package/dist/gitlab/comment-formatter.d.ts.map +0 -1
  285. package/dist/gitlab/comment-formatter.js.map +0 -1
  286. package/dist/gitlab/diff-parser.d.ts.map +0 -1
  287. package/dist/gitlab/diff-parser.js.map +0 -1
@@ -1,128 +1,99 @@
1
- import chalk from 'chalk';
2
1
  import { createGitLabClient } from '../gitlab/client.js';
3
- import { createOpencodeClientInstance } from '../opencode/client.js';
4
- import { parseDiff, getChangedFiles } from '../gitlab/diff-parser.js';
5
- import { formatSummaryComment, formatIssueComment, calculateSummary, } from '../gitlab/comment-formatter.js';
2
+ import { GitLabPlatformAdapter } from '../gitlab/platform-adapter.js';
3
+ import { executeUnifiedReview } from '../lib/unified-review-executor.js';
6
4
  /**
7
- * Review a GitLab merge request
5
+ * Parse a GitLab diff to extract valid line numbers for review comments
6
+ * GitLab only allows comments on lines that are in the diff (added or context)
8
7
  */
9
- export async function reviewMR(config, options) {
10
- console.log(chalk.bold.cyan('\n🔍 DRS GitLab MR Review\n'));
11
- // Initialize GitLab client
12
- const gitlab = createGitLabClient();
13
- // Fetch MR details
14
- console.log(chalk.gray(`Fetching MR !${options.mrIid} from project ${options.projectId}...\n`));
15
- const mr = await gitlab.getMergeRequest(options.projectId, options.mrIid);
16
- const changes = await gitlab.getMRChanges(options.projectId, options.mrIid);
17
- console.log(chalk.bold(`MR: ${mr.title}`));
18
- console.log(chalk.gray(`Author: ${mr.author?.name || 'Unknown'}`));
19
- console.log(chalk.gray(`Branch: ${mr.source_branch} → ${mr.target_branch}`));
20
- console.log(chalk.gray(`Files changed: ${changes.length}\n`));
21
- if (changes.length === 0) {
22
- console.log(chalk.yellow('✓ No changes to review\n'));
23
- return;
24
- }
25
- // Parse diffs
26
- const diffs = changes.map(change => parseDiff(change.diff)).flat();
27
- const changedFiles = getChangedFiles(diffs);
28
- // Connect to OpenCode (or start in-process if serverUrl is empty)
29
- console.log(chalk.gray('Connecting to OpenCode server...\n'));
30
- const opencode = await createOpencodeClientInstance({
31
- baseUrl: config.opencode.serverUrl || undefined,
32
- });
33
- // Create review session
34
- console.log(chalk.gray('Starting AI review...\n'));
35
- const agentsList = config.review.agents.join(',');
36
- const session = await opencode.createSession({
37
- agent: 'gitlab-reviewer',
38
- message: `Review MR !${options.mrIid} in project ${options.projectId}. Agents: ${agentsList}. Files: ${changedFiles.join(', ')}`,
39
- context: {
40
- projectId: options.projectId,
41
- mrIid: options.mrIid,
42
- files: changedFiles,
43
- agents: config.review.agents,
44
- mr: {
45
- title: mr.title,
46
- description: mr.description,
47
- author: mr.author?.name,
48
- sourceBranch: mr.source_branch,
49
- targetBranch: mr.target_branch,
50
- },
51
- },
52
- });
53
- // Stream and collect results
54
- const issues = [];
55
- try {
56
- for await (const message of opencode.streamMessages(session.id)) {
57
- if (message.role === 'assistant') {
58
- // Parse issues from assistant messages
59
- // TODO: Implement structured output parsing once OpenCode SDK supports it
60
- console.log(message.content);
61
- // For now, we'll display raw output
62
- // In production, parse structured JSON responses from agents
63
- }
8
+ function parseValidLinesFromDiff(diff) {
9
+ const validLines = new Set();
10
+ const lines = diff.split('\n');
11
+ let currentLine = 0;
12
+ for (const line of lines) {
13
+ // Parse hunk header: @@ -old_start,old_count +new_start,new_count @@
14
+ const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
15
+ if (hunkMatch) {
16
+ currentLine = parseInt(hunkMatch[1], 10);
17
+ continue;
64
18
  }
65
- // Display and post summary
66
- const summary = calculateSummary(changedFiles.length, issues);
67
- console.log(chalk.bold('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
68
- console.log(chalk.bold('📊 Review Summary'));
69
- console.log(chalk.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
70
- console.log(` Files reviewed: ${chalk.cyan(summary.filesReviewed)}`);
71
- console.log(` Issues found: ${chalk.yellow(summary.issuesFound)}`);
72
- if (summary.issuesFound > 0) {
73
- console.log(` 🔴 Critical: ${chalk.red(summary.bySeverity.CRITICAL)}`);
74
- console.log(` 🟡 High: ${chalk.yellow(summary.bySeverity.HIGH)}`);
75
- console.log(` 🟠 Medium: ${chalk.hex('#FFA500')(summary.bySeverity.MEDIUM)}`);
76
- console.log(` ⚪ Low: ${chalk.gray(summary.bySeverity.LOW)}`);
77
- }
78
- console.log('');
79
- // Post comments to GitLab if requested
80
- if (options.postComments) {
81
- console.log(chalk.gray('Posting review comments to GitLab...\n'));
82
- // Post summary comment
83
- const summaryComment = formatSummaryComment(summary, issues);
84
- await gitlab.createMRComment(options.projectId, options.mrIid, summaryComment);
85
- // Post individual issue comments as discussion threads
86
- for (const issue of issues) {
87
- const diffRefs = mr.diff_refs;
88
- if (issue.line && diffRefs && diffRefs.base_sha && diffRefs.head_sha && diffRefs.start_sha) {
89
- try {
90
- await gitlab.createMRDiscussionThread(options.projectId, options.mrIid, formatIssueComment(issue), {
91
- baseSha: diffRefs.base_sha,
92
- headSha: diffRefs.head_sha,
93
- startSha: diffRefs.start_sha,
94
- newPath: issue.file,
95
- newLine: issue.line,
96
- });
97
- }
98
- catch (error) {
99
- // If line-specific comment fails, post as general comment
100
- console.warn(chalk.yellow(`Warning: Could not post line comment for ${issue.file}:${issue.line}`));
101
- await gitlab.createMRComment(options.projectId, options.mrIid, formatIssueComment(issue));
102
- }
103
- }
104
- else {
105
- // Post as general comment if no line number
106
- await gitlab.createMRComment(options.projectId, options.mrIid, formatIssueComment(issue));
107
- }
108
- }
109
- // Add ai-reviewed label
110
- await gitlab.addLabel(options.projectId, options.mrIid, ['ai-reviewed']);
111
- console.log(chalk.green('✓ Review posted to GitLab MR\n'));
19
+ // Skip empty lines or lines without proper diff prefix
20
+ if (!line || line.length === 0)
21
+ continue;
22
+ const prefix = line[0];
23
+ if (prefix === '+') {
24
+ // Added line - can comment on this
25
+ validLines.add(currentLine);
26
+ currentLine++;
112
27
  }
113
- // Exit with error code if critical issues found
114
- if (summary.bySeverity.CRITICAL > 0) {
115
- console.log(chalk.red.bold('⚠️ Critical issues found!\n'));
116
- process.exit(1);
28
+ else if (prefix === ' ') {
29
+ // Context line - can comment on this
30
+ validLines.add(currentLine);
31
+ currentLine++;
117
32
  }
118
- else if (summary.issuesFound === 0) {
119
- console.log(chalk.green('✓ No issues found! MR looks good.\n'));
33
+ else if (prefix === '-') {
34
+ // Removed line - cannot comment on "new" version, skip
35
+ continue;
120
36
  }
121
37
  }
122
- finally {
123
- // Clean up session and shutdown in-process server if applicable
124
- await opencode.closeSession(session.id);
125
- await opencode.shutdown();
38
+ return validLines;
39
+ }
40
+ /**
41
+ * Review a GitLab merge request
42
+ */
43
+ export async function reviewMR(config, options) {
44
+ // Create GitLab client and adapter
45
+ const gitlabClient = createGitLabClient();
46
+ const platformClient = new GitLabPlatformAdapter(gitlabClient);
47
+ // Fetch MR details to get diff refs
48
+ const mr = await gitlabClient.getMergeRequest(options.projectId, options.mrIid);
49
+ // Fetch MR changes to build valid lines map
50
+ const changes = await gitlabClient.getMRChanges(options.projectId, options.mrIid);
51
+ // Build a map of file -> valid line numbers (lines that are in the diff)
52
+ const validLinesMap = new Map();
53
+ for (const change of changes) {
54
+ if (change.diff && !change.deletedFile) {
55
+ const validLines = parseValidLinesFromDiff(change.diff);
56
+ validLinesMap.set(change.newPath, validLines);
57
+ }
126
58
  }
59
+ // Create line validator - only allow comments on lines that are in the diff
60
+ const diffRefs = mr.diff_refs;
61
+ const lineValidator = {
62
+ isValidLine(file, line) {
63
+ if (!diffRefs?.base_sha || !diffRefs.head_sha || !diffRefs.start_sha) {
64
+ return false;
65
+ }
66
+ const validLines = validLinesMap.get(file);
67
+ return validLines !== undefined && validLines.has(line);
68
+ },
69
+ };
70
+ // Create inline position builder
71
+ const createInlinePosition = (issue, platformData) => {
72
+ const data = platformData;
73
+ const refs = data.diff_refs;
74
+ return {
75
+ path: issue.file,
76
+ line: issue.line,
77
+ baseSha: refs?.base_sha,
78
+ headSha: refs?.head_sha,
79
+ startSha: refs?.start_sha,
80
+ };
81
+ };
82
+ // Execute unified review
83
+ await executeUnifiedReview(config, {
84
+ platformClient,
85
+ projectId: options.projectId,
86
+ prNumber: options.mrIid,
87
+ postComments: options.postComments,
88
+ codeQualityReport: options.codeQualityReport,
89
+ outputPath: options.outputPath,
90
+ jsonOutput: options.jsonOutput,
91
+ baseBranch: options.baseBranch,
92
+ lineValidator,
93
+ createInlinePosition,
94
+ describe: options.describe,
95
+ postDescription: options.postDescription,
96
+ debug: options.debug,
97
+ });
127
98
  }
128
99
  //# sourceMappingURL=review-mr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-mr.js","sourceRoot":"","sources":["../../src/cli/review-mr.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-mr.js","sourceRoot":"","sources":["../../src/cli/review-mr.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,12 @@ export interface ReviewPROptions {
4
4
  repo: string;
5
5
  prNumber: number;
6
6
  postComments: boolean;
7
+ describe: boolean;
8
+ postDescription: boolean;
9
+ outputPath?: string;
10
+ jsonOutput?: boolean;
11
+ baseBranch?: string;
12
+ debug?: boolean;
7
13
  }
8
14
  /**
9
15
  * Review a GitHub pull request
@@ -1 +1 @@
1
- {"version":3,"file":"review-pr.d.ts","sourceRoot":"","sources":["../../src/cli/review-pr.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAWlD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0JzF"}
1
+ {"version":3,"file":"review-pr.d.ts","sourceRoot":"","sources":["../../src/cli/review-pr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAOlD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAwCD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDzF"}
@@ -1,125 +1,92 @@
1
- import chalk from 'chalk';
2
1
  import { createGitHubClient } from '../github/client.js';
3
- import { createOpencodeClientInstance } from '../opencode/client.js';
4
- import { parseDiff, getChangedFiles } from '../gitlab/diff-parser.js';
5
- import { formatSummaryComment, formatIssueComment, calculateSummary, } from '../gitlab/comment-formatter.js';
2
+ import { GitHubPlatformAdapter } from '../github/platform-adapter.js';
3
+ import { executeUnifiedReview } from '../lib/unified-review-executor.js';
6
4
  /**
7
- * Review a GitHub pull request
5
+ * Parse a GitHub diff patch to extract valid line numbers for review comments
6
+ * GitHub only allows comments on lines that are in the diff (added, removed, or context)
8
7
  */
9
- export async function reviewPR(config, options) {
10
- console.log(chalk.bold.cyan('\n🔍 DRS GitHub PR Review\n'));
11
- // Initialize GitHub client
12
- const github = createGitHubClient();
13
- // Fetch PR details
14
- console.log(chalk.gray(`Fetching PR #${options.prNumber} from ${options.owner}/${options.repo}...\n`));
15
- const pr = await github.getPullRequest(options.owner, options.repo, options.prNumber);
16
- const files = await github.getPRFiles(options.owner, options.repo, options.prNumber);
17
- console.log(chalk.bold(`PR: ${pr.title}`));
18
- console.log(chalk.gray(`Author: ${pr.user?.login || 'Unknown'}`));
19
- console.log(chalk.gray(`Branch: ${pr.head.ref} → ${pr.base.ref}`));
20
- console.log(chalk.gray(`Files changed: ${files.length}\n`));
21
- if (files.length === 0) {
22
- console.log(chalk.yellow('✓ No changes to review\n'));
23
- return;
24
- }
25
- // Parse diffs
26
- const diffs = files
27
- .filter(file => file.patch) // Only files with diffs
28
- .map(file => parseDiff(file.patch || ''))
29
- .flat();
30
- const changedFiles = getChangedFiles(diffs);
31
- // Connect to OpenCode (or start in-process if serverUrl is empty)
32
- console.log(chalk.gray('Connecting to OpenCode server...\n'));
33
- const opencode = await createOpencodeClientInstance({
34
- baseUrl: config.opencode.serverUrl || undefined,
35
- });
36
- // Create review session
37
- console.log(chalk.gray('Starting AI review...\n'));
38
- const agentsList = config.review.agents.join(',');
39
- const session = await opencode.createSession({
40
- agent: 'github-reviewer',
41
- message: `Review PR #${options.prNumber} in ${options.owner}/${options.repo}. Agents: ${agentsList}. Files: ${changedFiles.join(', ')}`,
42
- context: {
43
- owner: options.owner,
44
- repo: options.repo,
45
- prNumber: options.prNumber,
46
- files: changedFiles,
47
- agents: config.review.agents,
48
- pr: {
49
- title: pr.title,
50
- description: pr.body,
51
- author: pr.user?.login,
52
- headRef: pr.head.ref,
53
- baseRef: pr.base.ref,
54
- },
55
- },
56
- });
57
- // Stream and collect results
58
- const issues = [];
59
- try {
60
- for await (const message of opencode.streamMessages(session.id)) {
61
- if (message.role === 'assistant') {
62
- // Parse issues from assistant messages
63
- // TODO: Implement structured output parsing once OpenCode SDK supports it
64
- console.log(message.content);
65
- // For now, we'll display raw output
66
- // In production, parse structured JSON responses from agents
67
- }
8
+ function parseValidLinesFromPatch(patch) {
9
+ const validLines = new Set();
10
+ const lines = patch.split('\n');
11
+ let currentLine = 0;
12
+ for (const line of lines) {
13
+ // Parse hunk header: @@ -old_start,old_count +new_start,new_count @@
14
+ const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
15
+ if (hunkMatch) {
16
+ currentLine = parseInt(hunkMatch[1], 10);
17
+ continue;
68
18
  }
69
- // Display and post summary
70
- const summary = calculateSummary(changedFiles.length, issues);
71
- console.log(chalk.bold('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
72
- console.log(chalk.bold('📊 Review Summary'));
73
- console.log(chalk.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
74
- console.log(` Files reviewed: ${chalk.cyan(summary.filesReviewed)}`);
75
- console.log(` Issues found: ${chalk.yellow(summary.issuesFound)}`);
76
- if (summary.issuesFound > 0) {
77
- console.log(` 🔴 Critical: ${chalk.red(summary.bySeverity.CRITICAL)}`);
78
- console.log(` 🟡 High: ${chalk.yellow(summary.bySeverity.HIGH)}`);
79
- console.log(` 🟠 Medium: ${chalk.hex('#FFA500')(summary.bySeverity.MEDIUM)}`);
80
- console.log(` ⚪ Low: ${chalk.gray(summary.bySeverity.LOW)}`);
19
+ // Skip empty lines or lines without proper diff prefix
20
+ if (!line || line.length === 0)
21
+ continue;
22
+ const prefix = line[0];
23
+ if (prefix === '+') {
24
+ // Added line - can comment on this
25
+ validLines.add(currentLine);
26
+ currentLine++;
81
27
  }
82
- console.log('');
83
- // Post comments to GitHub if requested
84
- if (options.postComments) {
85
- console.log(chalk.gray('Posting review comments to GitHub...\n'));
86
- // Post summary comment
87
- const summaryComment = formatSummaryComment(summary, issues);
88
- await github.createPRComment(options.owner, options.repo, options.prNumber, summaryComment);
89
- // Post individual issue comments as review comments
90
- for (const issue of issues) {
91
- if (issue.line && pr.head.sha) {
92
- try {
93
- await github.createPRReviewComment(options.owner, options.repo, options.prNumber, formatIssueComment(issue), pr.head.sha, issue.file, issue.line);
94
- }
95
- catch (error) {
96
- // If line-specific comment fails, post as general comment
97
- console.warn(chalk.yellow(`Warning: Could not post line comment for ${issue.file}:${issue.line}`));
98
- await github.createPRComment(options.owner, options.repo, options.prNumber, formatIssueComment(issue));
99
- }
100
- }
101
- else {
102
- // Post as general comment if no line number
103
- await github.createPRComment(options.owner, options.repo, options.prNumber, formatIssueComment(issue));
104
- }
105
- }
106
- // Add ai-reviewed label
107
- await github.addLabels(options.owner, options.repo, options.prNumber, ['ai-reviewed']);
108
- console.log(chalk.green('✓ Review posted to GitHub PR\n'));
28
+ else if (prefix === ' ') {
29
+ // Context line - can comment on this
30
+ validLines.add(currentLine);
31
+ currentLine++;
109
32
  }
110
- // Exit with error code if critical issues found
111
- if (summary.bySeverity.CRITICAL > 0) {
112
- console.log(chalk.red.bold('⚠️ Critical issues found!\n'));
113
- process.exit(1);
114
- }
115
- else if (summary.issuesFound === 0) {
116
- console.log(chalk.green('✓ No issues found! PR looks good.\n'));
33
+ else if (prefix === '-') {
34
+ // Removed line - cannot comment on "new" version, skip
35
+ continue;
117
36
  }
118
37
  }
119
- finally {
120
- // Clean up session and shutdown in-process server if applicable
121
- await opencode.closeSession(session.id);
122
- await opencode.shutdown();
38
+ return validLines;
39
+ }
40
+ /**
41
+ * Review a GitHub pull request
42
+ */
43
+ export async function reviewPR(config, options) {
44
+ // Create GitHub client and adapter
45
+ const githubClient = createGitHubClient();
46
+ const platformClient = new GitHubPlatformAdapter(githubClient);
47
+ // Project ID in format "owner/repo"
48
+ const projectId = `${options.owner}/${options.repo}`;
49
+ // Fetch files to build line validator
50
+ const files = await githubClient.getPRFiles(options.owner, options.repo, options.prNumber);
51
+ // Build a map of file -> valid line numbers (lines that are in the diff)
52
+ const validLinesMap = new Map();
53
+ for (const file of files) {
54
+ if (file.patch && file.status !== 'removed') {
55
+ const validLines = parseValidLinesFromPatch(file.patch);
56
+ validLinesMap.set(file.filename, validLines);
57
+ }
123
58
  }
59
+ // Create line validator
60
+ const lineValidator = {
61
+ isValidLine(file, line) {
62
+ const validLines = validLinesMap.get(file);
63
+ return validLines !== undefined && validLines.has(line);
64
+ },
65
+ };
66
+ // Create inline position builder
67
+ const createInlinePosition = (issue, platformData) => {
68
+ const data = platformData;
69
+ return {
70
+ path: issue.file,
71
+ line: issue.line,
72
+ commitSha: data.head.sha,
73
+ };
74
+ };
75
+ // Execute unified review
76
+ await executeUnifiedReview(config, {
77
+ platformClient,
78
+ projectId,
79
+ prNumber: options.prNumber,
80
+ postComments: options.postComments,
81
+ outputPath: options.outputPath,
82
+ jsonOutput: options.jsonOutput,
83
+ baseBranch: options.baseBranch,
84
+ lineValidator,
85
+ createInlinePosition,
86
+ workingDir: process.cwd(),
87
+ describe: options.describe,
88
+ postDescription: options.postDescription,
89
+ debug: options.debug,
90
+ });
124
91
  }
125
92
  //# sourceMappingURL=review-pr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-pr.js","sourceRoot":"","sources":["../../src/cli/review-pr.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-pr.js","sourceRoot":"","sources":["../../src/cli/review-pr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { DRSConfig } from '../lib/config.js';
2
+ export interface ShowChangesOptions {
3
+ owner?: string;
4
+ repo?: string;
5
+ prNumber?: number;
6
+ projectId?: string;
7
+ mrIid?: number;
8
+ baseBranch?: string;
9
+ file?: string;
10
+ outputPath?: string;
11
+ jsonOutput?: boolean;
12
+ workingDir?: string;
13
+ }
14
+ export declare function showChanges(config: DRSConfig, options: ShowChangesOptions): Promise<void>;
15
+ //# sourceMappingURL=show-changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-changes.d.ts","sourceRoot":"","sources":["../../src/cli/show-changes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQlD,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyGD,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqH/F"}