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

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 (203) hide show
  1. package/.pi/agents/task/agents-md-updater.md +24 -0
  2. package/.pi/agents/task/changelog-updater.md +29 -0
  3. package/.pi/agents/task/review-issue-fixer.md +25 -0
  4. package/.pi/workflows/github-pr-describe-post.yaml +24 -0
  5. package/.pi/workflows/github-pr-describe.yaml +23 -0
  6. package/.pi/workflows/github-pr-post-comment.yaml +19 -0
  7. package/.pi/workflows/github-pr-review-post.yaml +32 -0
  8. package/.pi/workflows/github-pr-review.yaml +23 -0
  9. package/.pi/workflows/github-pr-show-changes.yaml +25 -0
  10. package/.pi/workflows/gitlab-mr-describe-post.yaml +22 -0
  11. package/.pi/workflows/gitlab-mr-describe.yaml +21 -0
  12. package/.pi/workflows/gitlab-mr-post-comment.yaml +17 -0
  13. package/.pi/workflows/gitlab-mr-review-code-quality.yaml +31 -0
  14. package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +40 -0
  15. package/.pi/workflows/gitlab-mr-review-post.yaml +30 -0
  16. package/.pi/workflows/gitlab-mr-review.yaml +21 -0
  17. package/.pi/workflows/gitlab-mr-show-changes.yaml +23 -0
  18. package/.pi/workflows/local-changelog-update.yaml +23 -0
  19. package/.pi/workflows/local-fix-review-issues.yaml +42 -0
  20. package/.pi/workflows/local-review.yaml +17 -0
  21. package/.pi/workflows/local-staged-review.yaml +17 -0
  22. package/.pi/workflows/local-update-agents-md.yaml +24 -0
  23. package/.pi/workflows/tag-changelog-update.yaml +26 -0
  24. package/README.md +214 -101
  25. package/dist/ci/runner.d.ts.map +1 -1
  26. package/dist/ci/runner.js +7 -8
  27. package/dist/ci/runner.js.map +1 -1
  28. package/dist/cli/index.js +69 -341
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/init.d.ts.map +1 -1
  31. package/dist/cli/init.js +25 -23
  32. package/dist/cli/init.js.map +1 -1
  33. package/dist/cli/run-agent.d.ts +24 -0
  34. package/dist/cli/run-agent.d.ts.map +1 -0
  35. package/dist/cli/run-agent.js +139 -0
  36. package/dist/cli/run-agent.js.map +1 -0
  37. package/dist/cli/run-agent.test.d.ts +2 -0
  38. package/dist/cli/run-agent.test.d.ts.map +1 -0
  39. package/dist/cli/run-agent.test.js +204 -0
  40. package/dist/cli/run-agent.test.js.map +1 -0
  41. package/dist/cli/workflow.d.ts +51 -0
  42. package/dist/cli/workflow.d.ts.map +1 -0
  43. package/dist/cli/workflow.js +1229 -0
  44. package/dist/cli/workflow.js.map +1 -0
  45. package/dist/cli/workflow.test.d.ts +2 -0
  46. package/dist/cli/workflow.test.d.ts.map +1 -0
  47. package/dist/cli/workflow.test.js +1410 -0
  48. package/dist/cli/workflow.test.js.map +1 -0
  49. package/dist/lib/agent-id.d.ts +9 -0
  50. package/dist/lib/agent-id.d.ts.map +1 -0
  51. package/dist/lib/agent-id.js +32 -0
  52. package/dist/lib/agent-id.js.map +1 -0
  53. package/dist/lib/comment-formatter.d.ts +7 -1
  54. package/dist/lib/comment-formatter.d.ts.map +1 -1
  55. package/dist/lib/comment-formatter.js +42 -1
  56. package/dist/lib/comment-formatter.js.map +1 -1
  57. package/dist/lib/comment-formatter.test.js +33 -0
  58. package/dist/lib/comment-formatter.test.js.map +1 -1
  59. package/dist/lib/comment-manager.d.ts +4 -0
  60. package/dist/lib/comment-manager.d.ts.map +1 -1
  61. package/dist/lib/comment-manager.js +7 -1
  62. package/dist/lib/comment-manager.js.map +1 -1
  63. package/dist/lib/comment-poster.d.ts +2 -2
  64. package/dist/lib/comment-poster.d.ts.map +1 -1
  65. package/dist/lib/comment-poster.js +3 -3
  66. package/dist/lib/comment-poster.js.map +1 -1
  67. package/dist/lib/comment-poster.test.js +13 -3
  68. package/dist/lib/comment-poster.test.js.map +1 -1
  69. package/dist/lib/config-model-overrides.test.d.ts +0 -10
  70. package/dist/lib/config-model-overrides.test.d.ts.map +1 -1
  71. package/dist/lib/config-model-overrides.test.js +174 -210
  72. package/dist/lib/config-model-overrides.test.js.map +1 -1
  73. package/dist/lib/config.d.ts +111 -34
  74. package/dist/lib/config.d.ts.map +1 -1
  75. package/dist/lib/config.js +322 -83
  76. package/dist/lib/config.js.map +1 -1
  77. package/dist/lib/config.test.js +282 -2
  78. package/dist/lib/config.test.js.map +1 -1
  79. package/dist/lib/context-loader.d.ts +4 -4
  80. package/dist/lib/context-loader.d.ts.map +1 -1
  81. package/dist/lib/context-loader.js +10 -7
  82. package/dist/lib/context-loader.js.map +1 -1
  83. package/dist/lib/context-loader.test.js +31 -26
  84. package/dist/lib/context-loader.test.js.map +1 -1
  85. package/dist/lib/description-executor.js +1 -1
  86. package/dist/lib/description-executor.js.map +1 -1
  87. package/dist/lib/description-executor.test.js +10 -3
  88. package/dist/lib/description-executor.test.js.map +1 -1
  89. package/dist/lib/diff-lines.d.ts +9 -0
  90. package/dist/lib/diff-lines.d.ts.map +1 -0
  91. package/dist/lib/diff-lines.js +32 -0
  92. package/dist/lib/diff-lines.js.map +1 -0
  93. package/dist/lib/diff-lines.test.d.ts +2 -0
  94. package/dist/lib/diff-lines.test.d.ts.map +1 -0
  95. package/dist/lib/diff-lines.test.js +13 -0
  96. package/dist/lib/diff-lines.test.js.map +1 -0
  97. package/dist/lib/logger.d.ts +1 -1
  98. package/dist/lib/logger.d.ts.map +1 -1
  99. package/dist/lib/review-core.d.ts.map +1 -1
  100. package/dist/lib/review-core.js +22 -27
  101. package/dist/lib/review-core.js.map +1 -1
  102. package/dist/lib/review-core.test.js +37 -23
  103. package/dist/lib/review-core.test.js.map +1 -1
  104. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  105. package/dist/lib/review-orchestrator.js +11 -8
  106. package/dist/lib/review-orchestrator.js.map +1 -1
  107. package/dist/lib/review-orchestrator.test.js +27 -6
  108. package/dist/lib/review-orchestrator.test.js.map +1 -1
  109. package/dist/lib/unified-review-executor.d.ts +0 -2
  110. package/dist/lib/unified-review-executor.d.ts.map +1 -1
  111. package/dist/lib/unified-review-executor.js +7 -13
  112. package/dist/lib/unified-review-executor.js.map +1 -1
  113. package/dist/lib/unified-review-executor.test.js +2 -2
  114. package/dist/lib/unified-review-executor.test.js.map +1 -1
  115. package/dist/pi/sdk.d.ts.map +1 -1
  116. package/dist/pi/sdk.js +36 -11
  117. package/dist/pi/sdk.js.map +1 -1
  118. package/dist/pi/sdk.test.js +48 -9
  119. package/dist/pi/sdk.test.js.map +1 -1
  120. package/dist/runtime/agent-loader.d.ts +10 -6
  121. package/dist/runtime/agent-loader.d.ts.map +1 -1
  122. package/dist/runtime/agent-loader.js +53 -27
  123. package/dist/runtime/agent-loader.js.map +1 -1
  124. package/dist/runtime/agent-loader.test.js +116 -119
  125. package/dist/runtime/agent-loader.test.js.map +1 -1
  126. package/dist/runtime/built-in-paths.d.ts +1 -0
  127. package/dist/runtime/built-in-paths.d.ts.map +1 -1
  128. package/dist/runtime/built-in-paths.js +7 -0
  129. package/dist/runtime/built-in-paths.js.map +1 -1
  130. package/dist/runtime/client.d.ts +12 -0
  131. package/dist/runtime/client.d.ts.map +1 -1
  132. package/dist/runtime/client.js +83 -58
  133. package/dist/runtime/client.js.map +1 -1
  134. package/dist/runtime/client.test.js +264 -15
  135. package/dist/runtime/client.test.js.map +1 -1
  136. package/dist/runtime/path-config.d.ts +2 -2
  137. package/dist/runtime/path-config.d.ts.map +1 -1
  138. package/dist/runtime/path-config.js +8 -8
  139. package/dist/runtime/path-config.js.map +1 -1
  140. package/dist/runtime/path-config.test.js +14 -14
  141. package/dist/runtime/path-config.test.js.map +1 -1
  142. package/package.json +3 -3
  143. package/.pi/agents/review/documentation.md +0 -56
  144. package/.pi/agents/review/performance.md +0 -53
  145. package/.pi/agents/review/quality.md +0 -59
  146. package/.pi/agents/review/security.md +0 -53
  147. package/.pi/agents/review/style.md +0 -132
  148. package/dist/cli/describe-mr.d.ts +0 -11
  149. package/dist/cli/describe-mr.d.ts.map +0 -1
  150. package/dist/cli/describe-mr.js +0 -134
  151. package/dist/cli/describe-mr.js.map +0 -1
  152. package/dist/cli/describe-pr.d.ts +0 -12
  153. package/dist/cli/describe-pr.d.ts.map +0 -1
  154. package/dist/cli/describe-pr.js +0 -135
  155. package/dist/cli/describe-pr.js.map +0 -1
  156. package/dist/cli/post-comments.d.ts +0 -20
  157. package/dist/cli/post-comments.d.ts.map +0 -1
  158. package/dist/cli/post-comments.js +0 -225
  159. package/dist/cli/post-comments.js.map +0 -1
  160. package/dist/cli/review-local.d.ts +0 -13
  161. package/dist/cli/review-local.d.ts.map +0 -1
  162. package/dist/cli/review-local.integration.test.d.ts +0 -2
  163. package/dist/cli/review-local.integration.test.d.ts.map +0 -1
  164. package/dist/cli/review-local.integration.test.js +0 -343
  165. package/dist/cli/review-local.integration.test.js.map +0 -1
  166. package/dist/cli/review-local.js +0 -90
  167. package/dist/cli/review-local.js.map +0 -1
  168. package/dist/cli/review-local.live.e2e.test.d.ts +0 -2
  169. package/dist/cli/review-local.live.e2e.test.d.ts.map +0 -1
  170. package/dist/cli/review-local.live.e2e.test.js +0 -153
  171. package/dist/cli/review-local.live.e2e.test.js.map +0 -1
  172. package/dist/cli/review-local.test.d.ts +0 -2
  173. package/dist/cli/review-local.test.d.ts.map +0 -1
  174. package/dist/cli/review-local.test.js +0 -164
  175. package/dist/cli/review-local.test.js.map +0 -1
  176. package/dist/cli/review-mr.d.ts +0 -22
  177. package/dist/cli/review-mr.d.ts.map +0 -1
  178. package/dist/cli/review-mr.js +0 -181
  179. package/dist/cli/review-mr.js.map +0 -1
  180. package/dist/cli/review-mr.test.d.ts +0 -2
  181. package/dist/cli/review-mr.test.d.ts.map +0 -1
  182. package/dist/cli/review-mr.test.js +0 -142
  183. package/dist/cli/review-mr.test.js.map +0 -1
  184. package/dist/cli/review-pr.d.ts +0 -22
  185. package/dist/cli/review-pr.d.ts.map +0 -1
  186. package/dist/cli/review-pr.js +0 -181
  187. package/dist/cli/review-pr.js.map +0 -1
  188. package/dist/cli/review-pr.test.d.ts +0 -2
  189. package/dist/cli/review-pr.test.d.ts.map +0 -1
  190. package/dist/cli/review-pr.test.js +0 -137
  191. package/dist/cli/review-pr.test.js.map +0 -1
  192. package/dist/cli/review-url.d.ts +0 -35
  193. package/dist/cli/review-url.d.ts.map +0 -1
  194. package/dist/cli/review-url.js +0 -110
  195. package/dist/cli/review-url.js.map +0 -1
  196. package/dist/cli/review-url.test.d.ts +0 -2
  197. package/dist/cli/review-url.test.d.ts.map +0 -1
  198. package/dist/cli/review-url.test.js +0 -132
  199. package/dist/cli/review-url.test.js.map +0 -1
  200. package/dist/cli/show-changes.d.ts +0 -15
  201. package/dist/cli/show-changes.d.ts.map +0 -1
  202. package/dist/cli/show-changes.js +0 -184
  203. package/dist/cli/show-changes.js.map +0 -1
@@ -1,181 +0,0 @@
1
- import { resolveCursorFixLinkOptions } from '../lib/cursor-fix-link.js';
2
- import { createGitHubClient } from '../github/client.js';
3
- import { GitHubPlatformAdapter } from '../github/platform-adapter.js';
4
- import { executeUnifiedReview } from '../lib/unified-review-executor.js';
5
- /**
6
- * Parse a GitHub diff patch to extract valid line numbers for review comments.
7
- * GitHub only allows comments on lines that are in the diff (added, removed, or context).
8
- */
9
- function parseValidLinesFromPatch(patch) {
10
- const validLines = new Set();
11
- const lines = patch.split('\n');
12
- let currentLine = 0;
13
- for (const line of lines) {
14
- // Parse hunk header: @@ -old_start,old_count +new_start,new_count @@
15
- const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
16
- if (hunkMatch) {
17
- currentLine = parseInt(hunkMatch[1], 10);
18
- continue;
19
- }
20
- // Skip empty lines or lines without proper diff prefix
21
- if (!line || line.length === 0)
22
- continue;
23
- const prefix = line[0];
24
- if (prefix === '+') {
25
- // Added line - can comment on this
26
- validLines.add(currentLine);
27
- currentLine++;
28
- }
29
- else if (prefix === ' ') {
30
- // Context line - can comment on this
31
- validLines.add(currentLine);
32
- currentLine++;
33
- }
34
- else if (prefix === '-') {
35
- // Removed line - cannot comment on "new" version, skip
36
- continue;
37
- }
38
- }
39
- return validLines;
40
- }
41
- function parseStatusCodeFromMessage(message) {
42
- const match = message.match(/\b(401|403|404|422|429)\b/);
43
- return match ? parseInt(match[1], 10) : undefined;
44
- }
45
- function extractStatusCode(error) {
46
- if (!error || typeof error !== 'object') {
47
- return undefined;
48
- }
49
- const candidate = error;
50
- if (typeof candidate.statusCode === 'number') {
51
- return candidate.statusCode;
52
- }
53
- if (typeof candidate.status === 'number') {
54
- return candidate.status;
55
- }
56
- if (candidate.response && typeof candidate.response === 'object') {
57
- if (typeof candidate.response.statusCode === 'number') {
58
- return candidate.response.statusCode;
59
- }
60
- if (typeof candidate.response.status === 'number') {
61
- return candidate.response.status;
62
- }
63
- }
64
- if (candidate.cause && candidate.cause !== error) {
65
- return extractStatusCode(candidate.cause);
66
- }
67
- return undefined;
68
- }
69
- function mapGitHubContextError(error, options) {
70
- const rawMessage = error instanceof Error ? error.message : String(error);
71
- const normalized = rawMessage.toLowerCase();
72
- const statusCode = extractStatusCode(error) ?? parseStatusCodeFromMessage(rawMessage);
73
- const pullRequestRef = `${options.owner}/${options.repo}#${options.prNumber}`;
74
- if (normalized.includes('github_token environment variable is required')) {
75
- return new Error('GitHub authentication is required. Set GITHUB_TOKEN with a token that can access the target pull request.');
76
- }
77
- if (statusCode === 401 ||
78
- normalized.includes('unauthorized') ||
79
- normalized.includes('bad credentials')) {
80
- return new Error(`GitHub authentication failed for ${pullRequestRef}. Verify GITHUB_TOKEN and ensure it has permission to read the repository.`);
81
- }
82
- if (statusCode === 429 || normalized.includes('rate limit')) {
83
- return new Error(`GitHub API rate limit reached while loading ${pullRequestRef}. Retry after cooldown or use a token with higher API limits.`);
84
- }
85
- if (statusCode === 403 || normalized.includes('forbidden')) {
86
- return new Error(`GitHub authorization failed for ${pullRequestRef}. Ensure the token can access the repository and pull request.`);
87
- }
88
- if (statusCode === 404 || normalized.includes('not found')) {
89
- return new Error(`GitHub pull request not found: ${pullRequestRef}. Verify --owner/--repo/--pr values and token access.`);
90
- }
91
- if (statusCode === 422 ||
92
- normalized.includes('unprocessable entity') ||
93
- normalized.includes('validation failed')) {
94
- return new Error(`GitHub rejected pull request lookup for ${pullRequestRef}. Confirm the PR number and repository details are valid.`);
95
- }
96
- const connectivityError = normalized.includes('fetch failed') ||
97
- normalized.includes('econnrefused') ||
98
- normalized.includes('enotfound') ||
99
- normalized.includes('etimedout') ||
100
- normalized.includes('econnreset');
101
- if (connectivityError) {
102
- return new Error(`Unable to reach GitHub API while loading ${pullRequestRef}. Check network connectivity and retry.`);
103
- }
104
- return new Error(`Failed to load GitHub pull request context for ${pullRequestRef}: ${rawMessage}`);
105
- }
106
- async function loadPullRequestContext(platformClient, options) {
107
- const projectId = `${options.owner}/${options.repo}`;
108
- try {
109
- const pullRequest = await platformClient.getPullRequest(projectId, options.prNumber);
110
- const changedFiles = await platformClient.getChangedFiles(projectId, options.prNumber);
111
- return {
112
- pullRequest,
113
- changedFiles,
114
- };
115
- }
116
- catch (error) {
117
- throw mapGitHubContextError(error, options);
118
- }
119
- }
120
- /**
121
- * Review a GitHub pull request.
122
- */
123
- export async function reviewPR(config, options) {
124
- let platformClient;
125
- try {
126
- const githubClient = createGitHubClient();
127
- platformClient = new GitHubPlatformAdapter(githubClient);
128
- }
129
- catch (error) {
130
- throw mapGitHubContextError(error, options);
131
- }
132
- const projectId = `${options.owner}/${options.repo}`;
133
- const workingDir = process.cwd();
134
- const { pullRequest, changedFiles } = await loadPullRequestContext(platformClient, options);
135
- const cursorFixLinks = resolveCursorFixLinkOptions(config, projectId, workingDir, options.fixInCursor, options.skipFixInCursor);
136
- // Build a map of file -> valid line numbers (lines that are in the diff)
137
- const validLinesMap = new Map();
138
- for (const file of changedFiles) {
139
- if (file.patch && file.status !== 'removed') {
140
- const validLines = parseValidLinesFromPatch(file.patch);
141
- validLinesMap.set(file.filename, validLines);
142
- }
143
- }
144
- // Create line validator
145
- const lineValidator = {
146
- isValidLine(file, line) {
147
- const validLines = validLinesMap.get(file);
148
- return validLines !== undefined && validLines.has(line);
149
- },
150
- };
151
- // Create inline position builder
152
- const createInlinePosition = (issue, _platformData) => {
153
- return {
154
- path: issue.file,
155
- line: issue.line,
156
- commitSha: pullRequest.headSha,
157
- };
158
- };
159
- // Execute unified review
160
- await executeUnifiedReview(config, {
161
- platformClient,
162
- projectId,
163
- prNumber: options.prNumber,
164
- pullRequest,
165
- changedFiles,
166
- postComments: options.postComments,
167
- postErrorComment: options.postErrorComment,
168
- outputPath: options.outputPath,
169
- jsonOutput: options.jsonOutput,
170
- baseBranch: options.baseBranch,
171
- lineValidator,
172
- createInlinePosition,
173
- cursorFixLinks,
174
- workingDir,
175
- describe: options.describe,
176
- postDescription: options.postDescription,
177
- debug: options.debug,
178
- thinkingLevel: options.thinkingLevel,
179
- });
180
- }
181
- //# sourceMappingURL=review-pr.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-pr.js","sourceRoot":"","sources":["../../src/cli/review-pr.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=review-pr.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-pr.test.d.ts","sourceRoot":"","sources":["../../src/cli/review-pr.test.ts"],"names":[],"mappings":""}
@@ -1,137 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { reviewPR } from './review-pr.js';
3
- const { mockGitHubClient, createGitHubClient, executeUnifiedReview } = vi.hoisted(() => ({
4
- mockGitHubClient: {
5
- getPullRequest: vi.fn(),
6
- getPRFiles: vi.fn(),
7
- },
8
- createGitHubClient: vi.fn(),
9
- executeUnifiedReview: vi.fn(),
10
- }));
11
- vi.mock('../github/client.js', () => ({
12
- createGitHubClient,
13
- }));
14
- vi.mock('../lib/unified-review-executor.js', () => ({
15
- executeUnifiedReview,
16
- }));
17
- const baseConfig = {
18
- pi: {},
19
- gitlab: { url: 'https://gitlab.com', token: 'token' },
20
- github: { token: 'token' },
21
- review: {
22
- agents: ['security', 'quality'],
23
- ignorePatterns: [],
24
- },
25
- };
26
- const baseOptions = {
27
- owner: 'octocat',
28
- repo: 'hello-world',
29
- prNumber: 17,
30
- postComments: true,
31
- postErrorComment: true,
32
- describe: false,
33
- postDescription: false,
34
- };
35
- describe('review-pr', () => {
36
- beforeEach(() => {
37
- vi.clearAllMocks();
38
- createGitHubClient.mockReturnValue(mockGitHubClient);
39
- executeUnifiedReview.mockResolvedValue(undefined);
40
- mockGitHubClient.getPullRequest.mockResolvedValue({
41
- number: 17,
42
- title: 'Test PR',
43
- body: 'Test description',
44
- user: { login: 'octocat' },
45
- head: {
46
- ref: 'feature/pi-migration',
47
- sha: 'head-sha',
48
- },
49
- base: {
50
- ref: 'main',
51
- },
52
- });
53
- mockGitHubClient.getPRFiles.mockResolvedValue([
54
- {
55
- filename: 'src/app.ts',
56
- status: 'modified',
57
- additions: 2,
58
- deletions: 1,
59
- changes: 3,
60
- patch: '@@ -8,2 +8,3 @@\n context line\n+new line\n-removed line',
61
- },
62
- {
63
- filename: 'src/old.ts',
64
- status: 'removed',
65
- additions: 0,
66
- deletions: 5,
67
- changes: 5,
68
- patch: '@@ -1 +0,0 @@\n-old line',
69
- },
70
- ]);
71
- });
72
- it('loads PR context once and forwards diff-aware validators to unified review', async () => {
73
- await reviewPR(baseConfig, baseOptions);
74
- expect(createGitHubClient).toHaveBeenCalledTimes(1);
75
- expect(mockGitHubClient.getPullRequest).toHaveBeenCalledWith('octocat', 'hello-world', 17);
76
- expect(mockGitHubClient.getPRFiles).toHaveBeenCalledWith('octocat', 'hello-world', 17);
77
- const unifiedOptions = vi.mocked(executeUnifiedReview).mock.calls[0][1];
78
- expect(unifiedOptions.pullRequest).toEqual(expect.objectContaining({
79
- number: 17,
80
- title: 'Test PR',
81
- headSha: 'head-sha',
82
- }));
83
- expect(unifiedOptions.changedFiles).toEqual(expect.arrayContaining([
84
- expect.objectContaining({ filename: 'src/app.ts', status: 'modified' }),
85
- expect.objectContaining({ filename: 'src/old.ts', status: 'removed' }),
86
- ]));
87
- expect(unifiedOptions.lineValidator?.isValidLine('src/app.ts', 8)).toBe(true);
88
- expect(unifiedOptions.lineValidator?.isValidLine('src/app.ts', 9)).toBe(true);
89
- expect(unifiedOptions.lineValidator?.isValidLine('src/app.ts', 10)).toBe(false);
90
- expect(unifiedOptions.lineValidator?.isValidLine('src/old.ts', 1)).toBe(false);
91
- const inlinePosition = unifiedOptions.createInlinePosition?.({
92
- category: 'QUALITY',
93
- severity: 'HIGH',
94
- title: 'Example issue',
95
- file: 'src/app.ts',
96
- line: 9,
97
- problem: 'Problem',
98
- solution: 'Solution',
99
- agent: 'quality',
100
- }, {
101
- head: {
102
- sha: 'ignored-sha',
103
- },
104
- });
105
- expect(inlinePosition).toEqual({
106
- path: 'src/app.ts',
107
- line: 9,
108
- commitSha: 'head-sha',
109
- });
110
- });
111
- it('rejects with actionable guidance when GITHUB_TOKEN is missing', async () => {
112
- createGitHubClient.mockImplementationOnce(() => {
113
- throw new Error('GITHUB_TOKEN environment variable is required');
114
- });
115
- await expect(reviewPR(baseConfig, baseOptions)).rejects.toThrow('Set GITHUB_TOKEN');
116
- expect(executeUnifiedReview).not.toHaveBeenCalled();
117
- });
118
- it('maps GitHub authentication failures to actionable errors', async () => {
119
- const authError = Object.assign(new Error('Bad credentials'), { status: 401 });
120
- mockGitHubClient.getPullRequest.mockRejectedValueOnce(authError);
121
- await expect(reviewPR(baseConfig, baseOptions)).rejects.toThrow('GitHub authentication failed for octocat/hello-world#17');
122
- expect(executeUnifiedReview).not.toHaveBeenCalled();
123
- });
124
- it('maps GitHub not found failures with repository/pr remediation', async () => {
125
- const notFoundError = Object.assign(new Error('Not Found'), { status: 404 });
126
- mockGitHubClient.getPullRequest.mockRejectedValueOnce(notFoundError);
127
- await expect(reviewPR(baseConfig, baseOptions)).rejects.toThrow('GitHub pull request not found: octocat/hello-world#17');
128
- expect(executeUnifiedReview).not.toHaveBeenCalled();
129
- });
130
- it('maps GitHub rate limit failures with retry guidance', async () => {
131
- const rateLimitError = Object.assign(new Error('API rate limit exceeded'), { status: 403 });
132
- mockGitHubClient.getPRFiles.mockRejectedValueOnce(rateLimitError);
133
- await expect(reviewPR(baseConfig, baseOptions)).rejects.toThrow('GitHub API rate limit reached while loading octocat/hello-world#17');
134
- expect(executeUnifiedReview).not.toHaveBeenCalled();
135
- });
136
- });
137
- //# sourceMappingURL=review-pr.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-pr.test.js","sourceRoot":"","sources":["../../src/cli/review-pr.test.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- import type { DRSConfig } from '../lib/config.js';
2
- export interface ReviewUrlOptions {
3
- url: string;
4
- postComments: boolean;
5
- postErrorComment: boolean;
6
- fixInCursor?: boolean;
7
- skipFixInCursor?: boolean;
8
- describe: boolean;
9
- postDescription: boolean;
10
- codeQualityReport?: string;
11
- outputPath?: string;
12
- jsonOutput?: boolean;
13
- baseBranch?: string;
14
- debug?: boolean;
15
- thinkingLevel?: string;
16
- }
17
- export type ParsedReviewUrl = {
18
- platform: 'github';
19
- owner: string;
20
- repo: string;
21
- prNumber: number;
22
- } | {
23
- platform: 'gitlab';
24
- projectId: string;
25
- mrIid: number;
26
- };
27
- /**
28
- * Parse a GitHub or GitLab PR/MR URL into platform-specific identifiers.
29
- */
30
- export declare function parseReviewUrl(url: string): ParsedReviewUrl;
31
- /**
32
- * Route review execution based on PR/MR URL.
33
- */
34
- export declare function reviewByUrl(config: DRSConfig, options: ReviewUrlOptions): Promise<void>;
35
- //# sourceMappingURL=review-url.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-url.d.ts","sourceRoot":"","sources":["../../src/cli/review-url.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GACvB;IACE,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAaN;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAkE3D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C7F"}
@@ -1,110 +0,0 @@
1
- import chalk from 'chalk';
2
- import { reviewMR } from './review-mr.js';
3
- import { reviewPR } from './review-pr.js';
4
- function sanitizeUrlForError(url) {
5
- try {
6
- const parsed = new URL(url);
7
- parsed.username = '';
8
- parsed.password = '';
9
- return `${parsed.origin}${parsed.pathname}`;
10
- }
11
- catch {
12
- return url.replace(/:\/\/[^@/\s]+@/g, '://').replace(/[?#].*$/, '');
13
- }
14
- }
15
- /**
16
- * Parse a GitHub or GitLab PR/MR URL into platform-specific identifiers.
17
- */
18
- export function parseReviewUrl(url) {
19
- const safeUrl = sanitizeUrlForError(url);
20
- let parsedUrl;
21
- try {
22
- parsedUrl = new URL(url);
23
- }
24
- catch {
25
- throw new Error(`Invalid URL: ${safeUrl}`);
26
- }
27
- const pathParts = parsedUrl.pathname.split('/').filter(Boolean);
28
- // GitHub: /owner/repo/pull/<number>
29
- if (pathParts.length >= 4 && pathParts[2] === 'pull') {
30
- const owner = pathParts[0];
31
- const repo = pathParts[1];
32
- const prNumber = parseInt(pathParts[3] ?? '', 10);
33
- if (!owner || !repo || !Number.isSafeInteger(prNumber) || prNumber <= 0) {
34
- throw new Error(`Invalid GitHub PR URL format: ${safeUrl}. Expected https://<host>/<owner>/<repo>/pull/<number>.`);
35
- }
36
- return {
37
- platform: 'github',
38
- owner,
39
- repo,
40
- prNumber,
41
- };
42
- }
43
- // GitLab: /group/subgroup/repo/-/merge_requests/<number>
44
- const mergeRequestIndex = pathParts.indexOf('merge_requests');
45
- if (mergeRequestIndex >= 0) {
46
- if (mergeRequestIndex < 2 || pathParts[mergeRequestIndex - 1] !== '-') {
47
- throw new Error(`Invalid GitLab MR URL format: ${safeUrl}. Expected .../<group>/<repo>/-/merge_requests/<number>.`);
48
- }
49
- const mrIid = parseInt(pathParts[mergeRequestIndex + 1] ?? '', 10);
50
- if (!Number.isSafeInteger(mrIid) || mrIid <= 0) {
51
- throw new Error(`Invalid GitLab MR URL format: ${safeUrl}. Merge request IID must be a positive integer.`);
52
- }
53
- const repo = pathParts[mergeRequestIndex - 2];
54
- const ownerParts = pathParts.slice(0, mergeRequestIndex - 2);
55
- if (!repo || ownerParts.length === 0) {
56
- throw new Error(`Invalid GitLab MR URL format: ${safeUrl}. Expected .../<group>/<repo>/-/merge_requests/<number>.`);
57
- }
58
- return {
59
- platform: 'gitlab',
60
- projectId: `${ownerParts.join('/')}/${repo}`,
61
- mrIid,
62
- };
63
- }
64
- throw new Error(`Unsupported review URL: ${safeUrl}. Expected a GitHub pull request URL (.../pull/<number>) or GitLab merge request URL (.../-/merge_requests/<number>).`);
65
- }
66
- /**
67
- * Route review execution based on PR/MR URL.
68
- */
69
- export async function reviewByUrl(config, options) {
70
- const parsed = parseReviewUrl(options.url);
71
- if (parsed.platform === 'github') {
72
- if (options.codeQualityReport) {
73
- console.warn(chalk.yellow('⚠ --code-quality-report is only supported for GitLab MRs. Ignoring this option for GitHub PR reviews.'));
74
- }
75
- await reviewPR(config, {
76
- owner: parsed.owner,
77
- repo: parsed.repo,
78
- prNumber: parsed.prNumber,
79
- postComments: options.postComments,
80
- postErrorComment: options.postErrorComment,
81
- fixInCursor: options.fixInCursor,
82
- skipFixInCursor: options.skipFixInCursor,
83
- describe: options.describe,
84
- postDescription: options.postDescription,
85
- outputPath: options.outputPath,
86
- jsonOutput: options.jsonOutput,
87
- baseBranch: options.baseBranch,
88
- debug: options.debug,
89
- thinkingLevel: options.thinkingLevel,
90
- });
91
- return;
92
- }
93
- await reviewMR(config, {
94
- projectId: parsed.projectId,
95
- mrIid: parsed.mrIid,
96
- postComments: options.postComments,
97
- postErrorComment: options.postErrorComment,
98
- fixInCursor: options.fixInCursor,
99
- skipFixInCursor: options.skipFixInCursor,
100
- describe: options.describe,
101
- postDescription: options.postDescription,
102
- codeQualityReport: options.codeQualityReport,
103
- outputPath: options.outputPath,
104
- jsonOutput: options.jsonOutput,
105
- baseBranch: options.baseBranch,
106
- debug: options.debug,
107
- thinkingLevel: options.thinkingLevel,
108
- });
109
- }
110
- //# sourceMappingURL=review-url.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-url.js","sourceRoot":"","sources":["../../src/cli/review-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA+B1C,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEzC,IAAI,SAAc,CAAC;IACnB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhE,oCAAoC;IACpC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAElD,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,yDAAyD,CAClG,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,KAAK;YACL,IAAI;YACJ,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,yDAAyD;IACzD,MAAM,iBAAiB,GAAG,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9D,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;QAC3B,IAAI,iBAAiB,GAAG,CAAC,IAAI,SAAS,CAAC,iBAAiB,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,0DAA0D,CACnG,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,iBAAiB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,iDAAiD,CAC1F,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,0DAA0D,CACnG,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;YAC5C,KAAK;SACN,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2BAA2B,OAAO,uHAAuH,CAC1J,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB,EAAE,OAAyB;IAC5E,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE3C,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,uGAAuG,CACxG,CACF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=review-url.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-url.test.d.ts","sourceRoot":"","sources":["../../src/cli/review-url.test.ts"],"names":[],"mappings":""}
@@ -1,132 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { parseReviewUrl, reviewByUrl } from './review-url.js';
3
- const { reviewPR, reviewMR } = vi.hoisted(() => ({
4
- reviewPR: vi.fn(),
5
- reviewMR: vi.fn(),
6
- }));
7
- vi.mock('./review-pr.js', () => ({
8
- reviewPR,
9
- }));
10
- vi.mock('./review-mr.js', () => ({
11
- reviewMR,
12
- }));
13
- const baseConfig = {
14
- pi: {},
15
- gitlab: { url: 'https://gitlab.com', token: 'token' },
16
- github: { token: 'token' },
17
- review: {
18
- agents: ['security', 'quality'],
19
- ignorePatterns: [],
20
- },
21
- };
22
- describe('parseReviewUrl', () => {
23
- it('parses GitHub pull request URLs', () => {
24
- const parsed = parseReviewUrl('https://github.com/octocat/hello-world/pull/123');
25
- expect(parsed).toEqual({
26
- platform: 'github',
27
- owner: 'octocat',
28
- repo: 'hello-world',
29
- prNumber: 123,
30
- });
31
- });
32
- it('parses GitLab merge request URLs with subgroups', () => {
33
- const parsed = parseReviewUrl('https://gitlab.example.com/org/security/tools/drs/-/merge_requests/42');
34
- expect(parsed).toEqual({
35
- platform: 'gitlab',
36
- projectId: 'org/security/tools/drs',
37
- mrIid: 42,
38
- });
39
- });
40
- it('throws for unsupported URLs', () => {
41
- expect(() => parseReviewUrl('https://example.com/org/repo/issues/10')).toThrow('Unsupported review URL');
42
- });
43
- it('redacts URL credentials in error messages', () => {
44
- let message = '';
45
- try {
46
- parseReviewUrl('https://alice:super-secret-token@example.com/not-a-pr');
47
- }
48
- catch (error) {
49
- message = error instanceof Error ? error.message : String(error);
50
- }
51
- expect(message).toContain('Unsupported review URL: https://example.com/not-a-pr');
52
- expect(message).not.toContain('alice');
53
- expect(message).not.toContain('super-secret-token');
54
- });
55
- });
56
- describe('reviewByUrl', () => {
57
- beforeEach(() => {
58
- vi.clearAllMocks();
59
- reviewPR.mockResolvedValue(undefined);
60
- reviewMR.mockResolvedValue(undefined);
61
- });
62
- it('routes GitHub URLs to reviewPR', async () => {
63
- await reviewByUrl(baseConfig, {
64
- url: 'https://github.com/octocat/hello-world/pull/10',
65
- postComments: true,
66
- postErrorComment: true,
67
- describe: true,
68
- postDescription: false,
69
- outputPath: 'review.json',
70
- jsonOutput: true,
71
- baseBranch: 'release/2026-01',
72
- debug: true,
73
- });
74
- expect(reviewPR).toHaveBeenCalledWith(baseConfig, {
75
- owner: 'octocat',
76
- repo: 'hello-world',
77
- prNumber: 10,
78
- postComments: true,
79
- postErrorComment: true,
80
- describe: true,
81
- postDescription: false,
82
- outputPath: 'review.json',
83
- jsonOutput: true,
84
- baseBranch: 'release/2026-01',
85
- debug: true,
86
- });
87
- expect(reviewMR).not.toHaveBeenCalled();
88
- });
89
- it('routes GitLab URLs to reviewMR', async () => {
90
- await reviewByUrl(baseConfig, {
91
- url: 'https://gitlab.com/group/subgroup/repo/-/merge_requests/88',
92
- postComments: false,
93
- postErrorComment: false,
94
- describe: false,
95
- postDescription: false,
96
- codeQualityReport: 'gl-code-quality-report.json',
97
- outputPath: 'review.json',
98
- jsonOutput: false,
99
- baseBranch: 'main',
100
- debug: false,
101
- });
102
- expect(reviewMR).toHaveBeenCalledWith(baseConfig, {
103
- projectId: 'group/subgroup/repo',
104
- mrIid: 88,
105
- postComments: false,
106
- postErrorComment: false,
107
- describe: false,
108
- postDescription: false,
109
- codeQualityReport: 'gl-code-quality-report.json',
110
- outputPath: 'review.json',
111
- jsonOutput: false,
112
- baseBranch: 'main',
113
- debug: false,
114
- });
115
- expect(reviewPR).not.toHaveBeenCalled();
116
- });
117
- it('warns and ignores --code-quality-report for GitHub URLs', async () => {
118
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined);
119
- await reviewByUrl(baseConfig, {
120
- url: 'https://github.com/octocat/hello-world/pull/9',
121
- postComments: false,
122
- postErrorComment: false,
123
- describe: false,
124
- postDescription: false,
125
- codeQualityReport: 'gl-code-quality-report.json',
126
- jsonOutput: false,
127
- });
128
- expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('--code-quality-report is only supported for GitLab MRs'));
129
- warnSpy.mockRestore();
130
- });
131
- });
132
- //# sourceMappingURL=review-url.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-url.test.js","sourceRoot":"","sources":["../../src/cli/review-url.test.ts"],"names":[],"mappings":"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"}