@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
@@ -0,0 +1,92 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import Ajv from 'ajv';
3
+ import { describeOutputSchema, reviewOutputSchema } from './json-output-schema.js';
4
+ const ajv = new Ajv({ allErrors: true });
5
+ const validateDescribe = ajv.compile(describeOutputSchema);
6
+ const validateReview = ajv.compile(reviewOutputSchema);
7
+ describe('json-output schemas', () => {
8
+ it('validates describe output schema', () => {
9
+ const payload = {
10
+ type: 'feature',
11
+ title: 'Add describe output validation tooling',
12
+ summary: ['Adds schema validation for describe output'],
13
+ walkthrough: [
14
+ {
15
+ file: 'src/lib/describe-core.ts',
16
+ changeType: 'modified',
17
+ semanticLabel: 'feature',
18
+ title: 'Require tool-based output',
19
+ changes: ['Adds write_json_output requirement'],
20
+ significance: 'major',
21
+ },
22
+ ],
23
+ labels: ['feature', 'describe'],
24
+ recommendations: ['Add unit tests for schema validation'],
25
+ };
26
+ const isValid = validateDescribe(payload);
27
+ expect(isValid).toBe(true);
28
+ expect(validateDescribe.errors).toBeNull();
29
+ });
30
+ it('rejects describe output with invalid type', () => {
31
+ const payload = {
32
+ type: 'invalid',
33
+ title: 'Bad type',
34
+ summary: ['Invalid type'],
35
+ };
36
+ const isValid = validateDescribe(payload);
37
+ expect(isValid).toBe(false);
38
+ });
39
+ it('validates review output schema', () => {
40
+ const payload = {
41
+ timestamp: new Date().toISOString(),
42
+ summary: {
43
+ filesReviewed: 3,
44
+ issuesFound: 2,
45
+ bySeverity: {
46
+ CRITICAL: 0,
47
+ HIGH: 1,
48
+ MEDIUM: 1,
49
+ LOW: 0,
50
+ },
51
+ byCategory: {
52
+ SECURITY: 1,
53
+ QUALITY: 1,
54
+ STYLE: 0,
55
+ PERFORMANCE: 0,
56
+ DOCUMENTATION: 0,
57
+ },
58
+ },
59
+ issues: [
60
+ {
61
+ category: 'SECURITY',
62
+ severity: 'HIGH',
63
+ title: 'Avoid plaintext secrets',
64
+ file: 'src/config.ts',
65
+ problem: 'Secret is stored in code.',
66
+ solution: 'Use environment variables.',
67
+ agent: 'review/security',
68
+ },
69
+ ],
70
+ metadata: {
71
+ source: 'PR #123',
72
+ project: 'org/repo',
73
+ branch: {
74
+ source: 'feature',
75
+ target: 'main',
76
+ },
77
+ },
78
+ };
79
+ const isValid = validateReview(payload);
80
+ expect(isValid).toBe(true);
81
+ expect(validateReview.errors).toBeNull();
82
+ });
83
+ it('rejects review output with missing summary', () => {
84
+ const payload = {
85
+ timestamp: new Date().toISOString(),
86
+ issues: [],
87
+ };
88
+ const isValid = validateReview(payload);
89
+ expect(isValid).toBe(false);
90
+ });
91
+ });
92
+ //# sourceMappingURL=json-output-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output-schema.test.js","sourceRoot":"","sources":["../../src/lib/json-output-schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * JSON output formatting for review results
3
+ *
4
+ * Provides structured JSON output for review results when
5
+ * not posting comments or generating code quality reports.
6
+ */
7
+ import type { ReviewIssue, ReviewSummary } from './comment-formatter.js';
8
+ /**
9
+ * JSON output structure for review results
10
+ */
11
+ export interface ReviewJsonOutput {
12
+ /** Timestamp of the review */
13
+ timestamp: string;
14
+ /** Review summary statistics */
15
+ summary: ReviewSummary;
16
+ /** All issues found */
17
+ issues: ReviewIssue[];
18
+ /** Metadata about the review */
19
+ metadata?: {
20
+ /** Source of the review (PR number, MR iid, or local) */
21
+ source?: string;
22
+ /** Project identifier */
23
+ project?: string;
24
+ /** Branch information */
25
+ branch?: {
26
+ source?: string;
27
+ target?: string;
28
+ };
29
+ };
30
+ }
31
+ /**
32
+ * Format review results as JSON output
33
+ */
34
+ export declare function formatReviewJson(summary: ReviewSummary, issues: ReviewIssue[], metadata?: ReviewJsonOutput['metadata']): ReviewJsonOutput;
35
+ /**
36
+ * Write review results to a JSON file
37
+ */
38
+ export declare function writeReviewJson(output: ReviewJsonOutput, outputPath: string, workingDir?: string): Promise<void>;
39
+ /**
40
+ * Print review results as JSON to console
41
+ */
42
+ export declare function printReviewJson(output: ReviewJsonOutput): void;
43
+ //# sourceMappingURL=json-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,OAAO,EAAE,aAAa,CAAC;IACvB,uBAAuB;IACvB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gCAAgC;IAChC,QAAQ,CAAC,EAAE;QACT,yDAAyD;QACzD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,yBAAyB;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,yBAAyB;QACzB,MAAM,CAAC,EAAE;YACP,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,WAAW,EAAE,EACrB,QAAQ,CAAC,EAAE,gBAAgB,CAAC,UAAU,CAAC,GACtC,gBAAgB,CAOlB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAE9D"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * JSON output formatting for review results
3
+ *
4
+ * Provides structured JSON output for review results when
5
+ * not posting comments or generating code quality reports.
6
+ */
7
+ import { writeFile } from 'fs/promises';
8
+ import { resolve } from 'path';
9
+ /**
10
+ * Format review results as JSON output
11
+ */
12
+ export function formatReviewJson(summary, issues, metadata) {
13
+ return {
14
+ timestamp: new Date().toISOString(),
15
+ summary,
16
+ issues,
17
+ metadata,
18
+ };
19
+ }
20
+ /**
21
+ * Write review results to a JSON file
22
+ */
23
+ export async function writeReviewJson(output, outputPath, workingDir = process.cwd()) {
24
+ const fullPath = resolve(workingDir, outputPath);
25
+ const jsonContent = JSON.stringify(output, null, 2);
26
+ await writeFile(fullPath, jsonContent, 'utf-8');
27
+ }
28
+ /**
29
+ * Print review results as JSON to console
30
+ */
31
+ export function printReviewJson(output) {
32
+ console.log(JSON.stringify(output, null, 2));
33
+ }
34
+ //# sourceMappingURL=json-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AA2B/B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAsB,EACtB,MAAqB,EACrB,QAAuC;IAEvC,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;QACP,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAwB,EACxB,UAAkB,EAClB,aAAqB,OAAO,CAAC,GAAG,EAAE;IAElC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAwB;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const OUTPUT_PATHS: {
2
+ readonly describe_output: ".drs/describe-output.json";
3
+ readonly review_output: ".drs/review-output.json";
4
+ };
5
+ export type OutputType = keyof typeof OUTPUT_PATHS;
6
+ //# sourceMappingURL=output-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-paths.d.ts","sourceRoot":"","sources":["../../src/lib/output-paths.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export const OUTPUT_PATHS = {
2
+ describe_output: '.drs/describe-output.json',
3
+ review_output: '.drs/review-output.json',
4
+ };
5
+ //# sourceMappingURL=output-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-paths.js","sourceRoot":"","sources":["../../src/lib/output-paths.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,eAAe,EAAE,2BAA2B;IAC5C,aAAa,EAAE,yBAAyB;CAChC,CAAC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Platform abstraction layer for GitHub and GitLab
3
+ *
4
+ * This module provides common interfaces for interacting with different
5
+ * code review platforms (GitHub, GitLab) in a unified way.
6
+ */
7
+ /**
8
+ * Represents a file change in a pull/merge request
9
+ */
10
+ export interface FileChange {
11
+ /** Path to the file */
12
+ filename: string;
13
+ /** Type of change */
14
+ status: 'added' | 'removed' | 'modified' | 'renamed' | 'copied' | 'changed' | 'unchanged';
15
+ /** Number of lines added */
16
+ additions: number;
17
+ /** Number of lines deleted */
18
+ deletions: number;
19
+ /** Unified diff patch */
20
+ patch?: string;
21
+ /** Previous filename (for renamed files) */
22
+ previousFilename?: string;
23
+ }
24
+ /**
25
+ * Represents a pull/merge request
26
+ */
27
+ export interface PullRequest {
28
+ /** PR/MR number or ID */
29
+ number: number;
30
+ /** Title */
31
+ title: string;
32
+ /** Description/body */
33
+ description?: string;
34
+ /** Author username or name */
35
+ author: string;
36
+ /** Source branch */
37
+ sourceBranch: string;
38
+ /** Target branch */
39
+ targetBranch: string;
40
+ /** Head commit SHA */
41
+ headSha: string;
42
+ /** Additional platform-specific data */
43
+ platformData?: unknown;
44
+ }
45
+ /**
46
+ * Represents a comment on a PR/MR
47
+ */
48
+ export interface Comment {
49
+ /** Comment ID */
50
+ id: number | string;
51
+ /** Comment body/content */
52
+ body: string;
53
+ }
54
+ /**
55
+ * Position data for inline comments
56
+ */
57
+ export interface InlineCommentPosition {
58
+ /** File path */
59
+ path: string;
60
+ /** Line number in the new version */
61
+ line: number;
62
+ /** Commit SHA (GitHub) or diff refs (GitLab) */
63
+ commitSha?: string;
64
+ baseSha?: string;
65
+ headSha?: string;
66
+ startSha?: string;
67
+ }
68
+ /**
69
+ * Common interface for platform clients (GitHub, GitLab, etc.)
70
+ */
71
+ export interface PlatformClient {
72
+ /**
73
+ * Get pull/merge request details
74
+ */
75
+ getPullRequest(projectId: string, prNumber: number): Promise<PullRequest>;
76
+ /**
77
+ * Get list of changed files in a PR/MR
78
+ */
79
+ getChangedFiles(projectId: string, prNumber: number): Promise<FileChange[]>;
80
+ /**
81
+ * Get existing comments on the PR/MR
82
+ */
83
+ getComments(projectId: string, prNumber: number): Promise<Comment[]>;
84
+ /**
85
+ * Get existing inline/review comments
86
+ */
87
+ getInlineComments(projectId: string, prNumber: number): Promise<Comment[]>;
88
+ /**
89
+ * Create a general comment on the PR/MR
90
+ */
91
+ createComment(projectId: string, prNumber: number, body: string): Promise<void>;
92
+ /**
93
+ * Update an existing comment
94
+ */
95
+ updateComment(projectId: string, prNumber: number, commentId: number | string, body: string): Promise<void>;
96
+ /**
97
+ * Create an inline comment at a specific line
98
+ */
99
+ createInlineComment(projectId: string, prNumber: number, body: string, position: InlineCommentPosition): Promise<void>;
100
+ /**
101
+ * Create multiple inline comments in bulk (if supported)
102
+ * Falls back to individual comments if not supported
103
+ */
104
+ createBulkInlineComments(projectId: string, prNumber: number, comments: Array<{
105
+ body: string;
106
+ position: InlineCommentPosition;
107
+ }>): Promise<void>;
108
+ /**
109
+ * Add labels to the PR/MR
110
+ */
111
+ addLabels(projectId: string, prNumber: number, labels: string[]): Promise<void>;
112
+ /**
113
+ * Check if PR/MR has a specific label
114
+ */
115
+ hasLabel(projectId: string, prNumber: number, label: string): Promise<boolean>;
116
+ }
117
+ /**
118
+ * Validator for checking if a line can be commented on
119
+ */
120
+ export interface LineValidator {
121
+ /**
122
+ * Check if a line number is valid for commenting
123
+ */
124
+ isValidLine(file: string, line: number): boolean;
125
+ }
126
+ /**
127
+ * Factory function type for creating platform clients
128
+ */
129
+ export type PlatformClientFactory = () => PlatformClient;
130
+ //# sourceMappingURL=platform-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-client.d.ts","sourceRoot":"","sources":["../../src/lib/platform-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Platform abstraction layer for GitHub and GitLab
3
+ *
4
+ * This module provides common interfaces for interacting with different
5
+ * code review platforms (GitHub, GitLab) in a unified way.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=platform-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-client.js","sourceRoot":"","sources":["../../src/lib/platform-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Position validation utilities for platform-specific inline comment requirements
3
+ */
4
+ import type { InlineCommentPosition } from './platform-client.js';
5
+ /**
6
+ * Result of position validation
7
+ */
8
+ export interface PositionValidationResult {
9
+ isValid: boolean;
10
+ error?: string;
11
+ }
12
+ /**
13
+ * Base interface for position validators
14
+ */
15
+ export interface PositionValidator {
16
+ validate(position: InlineCommentPosition): PositionValidationResult;
17
+ }
18
+ /**
19
+ * GitHub position validator
20
+ * Requires: commitSha
21
+ */
22
+ export declare class GitHubPositionValidator implements PositionValidator {
23
+ validate(position: InlineCommentPosition): PositionValidationResult;
24
+ }
25
+ /**
26
+ * GitLab position validator
27
+ * Requires: baseSha, headSha, startSha
28
+ */
29
+ export declare class GitLabPositionValidator implements PositionValidator {
30
+ validate(position: InlineCommentPosition): PositionValidationResult;
31
+ }
32
+ /**
33
+ * Helper to validate and throw if invalid
34
+ */
35
+ export declare function validatePositionOrThrow(position: InlineCommentPosition, validator: PositionValidator): void;
36
+ //# sourceMappingURL=position-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position-validator.d.ts","sourceRoot":"","sources":["../../src/lib/position-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,wBAAwB,CAAC;CACrE;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,wBAAwB;CASpE;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,wBAAwB;CASpE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,qBAAqB,EAC/B,SAAS,EAAE,iBAAiB,GAC3B,IAAI,CAKN"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Position validation utilities for platform-specific inline comment requirements
3
+ */
4
+ /**
5
+ * GitHub position validator
6
+ * Requires: commitSha
7
+ */
8
+ export class GitHubPositionValidator {
9
+ validate(position) {
10
+ if (!position.commitSha) {
11
+ return {
12
+ isValid: false,
13
+ error: 'GitHub requires commitSha for inline comments',
14
+ };
15
+ }
16
+ return { isValid: true };
17
+ }
18
+ }
19
+ /**
20
+ * GitLab position validator
21
+ * Requires: baseSha, headSha, startSha
22
+ */
23
+ export class GitLabPositionValidator {
24
+ validate(position) {
25
+ if (!position.baseSha || !position.headSha || !position.startSha) {
26
+ return {
27
+ isValid: false,
28
+ error: 'GitLab requires baseSha, headSha, and startSha for inline comments',
29
+ };
30
+ }
31
+ return { isValid: true };
32
+ }
33
+ }
34
+ /**
35
+ * Helper to validate and throw if invalid
36
+ */
37
+ export function validatePositionOrThrow(position, validator) {
38
+ const result = validator.validate(position);
39
+ if (!result.isValid) {
40
+ throw new Error(result.error);
41
+ }
42
+ }
43
+ //# sourceMappingURL=position-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position-validator.js","sourceRoot":"","sources":["../../src/lib/position-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAClC,QAAQ,CAAC,QAA+B;QACtC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,+CAA+C;aACvD,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAClC,QAAQ,CAAC,QAA+B;QACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oEAAoE;aAC5E,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAA+B,EAC/B,SAA4B;IAE5B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Repository validation utilities for PR/MR reviews
3
+ *
4
+ * This module handles repository and branch validation to ensure
5
+ * that reviews are run from the correct repository and branch.
6
+ */
7
+ import type { PullRequest } from './platform-client.js';
8
+ export interface RepoInfo {
9
+ host?: string;
10
+ repoPath?: string;
11
+ remoteUrl?: string;
12
+ }
13
+ export interface BaseBranchResolution {
14
+ baseBranch?: string;
15
+ resolvedBaseBranch?: string;
16
+ source?: string;
17
+ }
18
+ /**
19
+ * Normalize a repository path by removing leading slashes and .git suffix
20
+ */
21
+ export declare function normalizeRepoPath(path: string): string;
22
+ /**
23
+ * Parse a git remote URL to extract host and repository path
24
+ */
25
+ export declare function parseRemoteUrl(remoteUrl: string): RepoInfo | null;
26
+ /**
27
+ * Extract expected repository info from PR/MR platform data
28
+ */
29
+ export declare function getExpectedRepoInfo(pr: {
30
+ platformData?: unknown;
31
+ }, projectId: string): RepoInfo | null;
32
+ /**
33
+ * Normalize a base branch name by adding origin/ prefix if needed
34
+ */
35
+ export declare function normalizeBaseBranch(baseBranch?: string): string | undefined;
36
+ /**
37
+ * Resolve the base branch from CLI, environment variables, or PR/MR data
38
+ */
39
+ export declare function resolveBaseBranch(cliBaseBranch?: string, targetBranch?: string): BaseBranchResolution;
40
+ /**
41
+ * Generate a canonical git diff command for documentation purposes
42
+ */
43
+ export declare function getCanonicalDiffCommand(pr: PullRequest, baseBranchResolution: BaseBranchResolution): string;
44
+ /**
45
+ * Enforce that the current working directory matches the PR/MR repository and branch
46
+ *
47
+ * This prevents accidentally reviewing the wrong repository or branch.
48
+ *
49
+ * @throws Error if repository or branch doesn't match
50
+ */
51
+ export declare function enforceRepoBranchMatch(workingDir: string, projectId: string, pr: PullRequest): Promise<void>;
52
+ //# sourceMappingURL=repository-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-validator.d.ts","sourceRoot":"","sources":["../../src/lib/repository-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CA8BjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,EAC9B,SAAS,EAAE,MAAM,GAChB,QAAQ,GAAG,IAAI,CAyCjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG3E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,CAAC,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE,MAAM,GACpB,oBAAoB,CAoDtB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,WAAW,EACf,oBAAoB,EAAE,oBAAoB,GACzC,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,IAAI,CAAC,CAiEf"}