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