gitreviewpilot 0.1.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/LICENSE +22 -0
- package/README.md +234 -0
- package/dist/commands/ask.d.ts +3 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +32 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/changes.d.ts +3 -0
- package/dist/commands/changes.d.ts.map +1 -0
- package/dist/commands/changes.js +57 -0
- package/dist/commands/changes.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +86 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/pr.d.ts +3 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +53 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +45 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +16 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/config/env.d.ts +3 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +20 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/gitreviewpilotConfig.d.ts +16 -0
- package/dist/config/gitreviewpilotConfig.d.ts.map +1 -0
- package/dist/config/gitreviewpilotConfig.js +78 -0
- package/dist/config/gitreviewpilotConfig.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/services/ai.service.d.ts +60 -0
- package/dist/services/ai.service.d.ts.map +1 -0
- package/dist/services/ai.service.js +396 -0
- package/dist/services/ai.service.js.map +1 -0
- package/dist/services/askService.d.ts +12 -0
- package/dist/services/askService.d.ts.map +1 -0
- package/dist/services/askService.js +68 -0
- package/dist/services/askService.js.map +1 -0
- package/dist/services/git.service.d.ts +12 -0
- package/dist/services/git.service.d.ts.map +1 -0
- package/dist/services/git.service.js +61 -0
- package/dist/services/git.service.js.map +1 -0
- package/dist/services/github.service.d.ts +46 -0
- package/dist/services/github.service.d.ts.map +1 -0
- package/dist/services/github.service.js +169 -0
- package/dist/services/github.service.js.map +1 -0
- package/dist/services/prReviewService.d.ts +29 -0
- package/dist/services/prReviewService.d.ts.map +1 -0
- package/dist/services/prReviewService.js +107 -0
- package/dist/services/prReviewService.js.map +1 -0
- package/dist/services/prService.d.ts +12 -0
- package/dist/services/prService.d.ts.map +1 -0
- package/dist/services/prService.js +8 -0
- package/dist/services/prService.js.map +1 -0
- package/dist/services/reviewErrors.d.ts +7 -0
- package/dist/services/reviewErrors.d.ts.map +1 -0
- package/dist/services/reviewErrors.js +13 -0
- package/dist/services/reviewErrors.js.map +1 -0
- package/dist/services/reviewService.d.ts +16 -0
- package/dist/services/reviewService.d.ts.map +1 -0
- package/dist/services/reviewService.js +109 -0
- package/dist/services/reviewService.js.map +1 -0
- package/dist/utils/cli.d.ts +16 -0
- package/dist/utils/cli.d.ts.map +1 -0
- package/dist/utils/cli.js +108 -0
- package/dist/utils/cli.js.map +1 -0
- package/dist/utils/diff.d.ts +21 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +105 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/formatter.d.ts +11 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +186 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/repoContext.d.ts +26 -0
- package/dist/utils/repoContext.d.ts.map +1 -0
- package/dist/utils/repoContext.js +136 -0
- package/dist/utils/repoContext.js.map +1 -0
- package/dist/utils/spinner.d.ts +3 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +5 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/structuredReview.d.ts +21 -0
- package/dist/utils/structuredReview.d.ts.map +1 -0
- package/dist/utils/structuredReview.js +59 -0
- package/dist/utils/structuredReview.js.map +1 -0
- package/gitreviewpilot.config.json +3 -0
- package/package.json +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.service.js","sourceRoot":"","sources":["../../src/services/ai.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type RepoContextOptions } from "../utils/repoContext.js";
|
|
2
|
+
export type AskOptions = {
|
|
3
|
+
context?: RepoContextOptions;
|
|
4
|
+
};
|
|
5
|
+
export type AskResult = {
|
|
6
|
+
answer: string;
|
|
7
|
+
includedFiles: string[];
|
|
8
|
+
scannedFiles: number;
|
|
9
|
+
truncatedFiles: string[];
|
|
10
|
+
};
|
|
11
|
+
export declare function askQuestion(question: string, options?: AskOptions): Promise<AskResult>;
|
|
12
|
+
//# sourceMappingURL=askService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"askService.d.ts","sourceRoot":"","sources":["../../src/services/askService.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIpF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAgCF,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAoChG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { analyze, LlmApiError } from "./ai.service.js";
|
|
2
|
+
import { buildRepoContext } from "../utils/repoContext.js";
|
|
3
|
+
import { ReviewError } from "./reviewErrors.js";
|
|
4
|
+
import { focusDirectiveForPrompt } from "../config/gitreviewpilotConfig.js";
|
|
5
|
+
function sleep(ms) {
|
|
6
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
7
|
+
}
|
|
8
|
+
function buildAskPrompt(context, question, includedFiles) {
|
|
9
|
+
const fileList = includedFiles.length ? includedFiles.map((f) => `- ${f}`).join("\n") : "(none)";
|
|
10
|
+
const focusLine = focusDirectiveForPrompt("Prioritize correctness and helpfulness, and keep the answer concise.");
|
|
11
|
+
return [
|
|
12
|
+
"You are a senior software engineer.",
|
|
13
|
+
"Answer the user's question using only the provided repository context.",
|
|
14
|
+
"Be concise and direct.",
|
|
15
|
+
focusLine,
|
|
16
|
+
"When you make a claim tied to code, cite the relevant file path(s) from the included files list.",
|
|
17
|
+
"If context is insufficient, say what's missing and which files would likely contain it.",
|
|
18
|
+
"",
|
|
19
|
+
"Included files:",
|
|
20
|
+
fileList,
|
|
21
|
+
"",
|
|
22
|
+
"Context:",
|
|
23
|
+
"```",
|
|
24
|
+
context.trim(),
|
|
25
|
+
"```",
|
|
26
|
+
"",
|
|
27
|
+
"Question:",
|
|
28
|
+
question.trim()
|
|
29
|
+
].join("\n");
|
|
30
|
+
}
|
|
31
|
+
export async function askQuestion(question, options = {}) {
|
|
32
|
+
const repo = await buildRepoContext(question, options.context);
|
|
33
|
+
if (!repo.context.trim()) {
|
|
34
|
+
throw new ReviewError("FILE_READ_FAILED", "No repository context could be built (no matching files found or all files were excluded).");
|
|
35
|
+
}
|
|
36
|
+
const prompt = buildAskPrompt(repo.context, question, repo.includedFiles);
|
|
37
|
+
try {
|
|
38
|
+
let answer;
|
|
39
|
+
try {
|
|
40
|
+
answer = await analyze(prompt);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
// If the provider indicates rate limiting with a Retry-After, wait once and retry.
|
|
44
|
+
if (err instanceof LlmApiError && err.retryAfterMs !== undefined) {
|
|
45
|
+
const waitMs = Math.max(0, Math.min(err.retryAfterMs, 30_000));
|
|
46
|
+
if (waitMs > 0)
|
|
47
|
+
await sleep(waitMs);
|
|
48
|
+
answer = await analyze(prompt);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
answer,
|
|
56
|
+
includedFiles: repo.includedFiles,
|
|
57
|
+
scannedFiles: repo.scannedFiles,
|
|
58
|
+
truncatedFiles: repo.truncatedFiles
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
if (err instanceof LlmApiError) {
|
|
63
|
+
throw new ReviewError("AI_FAILED", err.message, err.details, err);
|
|
64
|
+
}
|
|
65
|
+
throw new ReviewError("AI_FAILED", err instanceof Error ? err.message : String(err), undefined, err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=askService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"askService.js","sourceRoot":"","sources":["../../src/services/askService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type ExecResult = {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function git(args: string[], options?: {
|
|
6
|
+
cwd?: string;
|
|
7
|
+
}): Promise<ExecResult>;
|
|
8
|
+
export declare function ensureGitRepo(): Promise<void>;
|
|
9
|
+
export declare function currentBranchUpstreamRef(): Promise<string>;
|
|
10
|
+
export declare function unifiedDiffAgainstUpstream(): Promise<string>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=git.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.service.d.ts","sourceRoot":"","sources":["../../src/services/git.service.ts"],"names":[],"mappings":"AAMA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAcrD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAezF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAGnD;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAahE;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAMlE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { CliError } from "../utils/cli.js";
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
function toExecError(err) {
|
|
6
|
+
if (err instanceof Error) {
|
|
7
|
+
const anyErr = err;
|
|
8
|
+
return {
|
|
9
|
+
message: err.message,
|
|
10
|
+
...(anyErr.code ? { code: anyErr.code } : {}),
|
|
11
|
+
...(anyErr.stderr ? { stderr: anyErr.stderr } : {})
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return { message: String(err) };
|
|
15
|
+
}
|
|
16
|
+
export async function git(args, options) {
|
|
17
|
+
try {
|
|
18
|
+
const { stdout, stderr } = await execFileAsync("git", args, {
|
|
19
|
+
cwd: options?.cwd,
|
|
20
|
+
windowsHide: true,
|
|
21
|
+
maxBuffer: 10 * 1024 * 1024
|
|
22
|
+
});
|
|
23
|
+
return { stdout: String(stdout ?? ""), stderr: String(stderr ?? "") };
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const e = toExecError(err);
|
|
27
|
+
if (e.code === "ENOENT") {
|
|
28
|
+
throw new CliError("GIT_NOT_FOUND", "git was not found on PATH.", e.stderr, err);
|
|
29
|
+
}
|
|
30
|
+
throw new CliError("GIT_FAILED", `git ${args.join(" ")} failed.`, e.stderr ?? e.message, err);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function ensureGitRepo() {
|
|
34
|
+
const { stdout } = await git(["rev-parse", "--is-inside-work-tree"]);
|
|
35
|
+
if (stdout.trim() !== "true")
|
|
36
|
+
throw new CliError("NOT_A_GIT_REPO", "Not inside a git repository.");
|
|
37
|
+
}
|
|
38
|
+
export async function currentBranchUpstreamRef() {
|
|
39
|
+
try {
|
|
40
|
+
const { stdout } = await git(["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]);
|
|
41
|
+
const ref = stdout.trim();
|
|
42
|
+
if (!ref)
|
|
43
|
+
throw new CliError("UPSTREAM_NOT_SET", "No upstream branch is configured for the current branch.");
|
|
44
|
+
return ref;
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err instanceof CliError && err.code === "GIT_FAILED") {
|
|
48
|
+
// git throws when upstream isn't set; map it to a more helpful message.
|
|
49
|
+
throw new CliError("UPSTREAM_NOT_SET", "No upstream branch is configured for the current branch.", err.details, err);
|
|
50
|
+
}
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function unifiedDiffAgainstUpstream() {
|
|
55
|
+
await ensureGitRepo();
|
|
56
|
+
await currentBranchUpstreamRef();
|
|
57
|
+
// --unified=0 makes diffs closer to PR-style hunks and reduces tokens.
|
|
58
|
+
const { stdout } = await git(["diff", "--unified=0", "@{u}...HEAD"]);
|
|
59
|
+
return stdout;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=git.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.service.js","sourceRoot":"","sources":["../../src/services/git.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAI1C,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,GAAiD,CAAC;QACjE,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,OAA0B;IAClE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE;YAC1D,GAAG,EAAE,OAAO,EAAE,GAAG;YACjB,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IACxE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM;QAAE,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,8BAA8B,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0DAA0D,CAAC,CAAC;QAC7G,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACzD,wEAAwE;YACxE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0DAA0D,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,MAAM,aAAa,EAAE,CAAC;IACtB,MAAM,wBAAwB,EAAE,CAAC;IACjC,uEAAuE;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type GitHubRepoRef = {
|
|
2
|
+
owner: string;
|
|
3
|
+
repo: string;
|
|
4
|
+
};
|
|
5
|
+
export type PullRequest = {
|
|
6
|
+
number: number;
|
|
7
|
+
title: string;
|
|
8
|
+
htmlUrl: string;
|
|
9
|
+
state: string;
|
|
10
|
+
draft: boolean;
|
|
11
|
+
userLogin: string | null;
|
|
12
|
+
baseRef: string;
|
|
13
|
+
headRef: string;
|
|
14
|
+
};
|
|
15
|
+
export type GitHubClientOptions = {
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
token?: string;
|
|
19
|
+
};
|
|
20
|
+
export declare class GitHubApiError extends Error {
|
|
21
|
+
readonly status: number | undefined;
|
|
22
|
+
readonly requestId: string | undefined;
|
|
23
|
+
readonly documentationUrl: string | undefined;
|
|
24
|
+
readonly details: string | undefined;
|
|
25
|
+
constructor(args: {
|
|
26
|
+
message: string;
|
|
27
|
+
status?: number;
|
|
28
|
+
requestId?: string;
|
|
29
|
+
documentationUrl?: string;
|
|
30
|
+
details?: string;
|
|
31
|
+
cause?: unknown;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export declare function parseRepoRef(input: string): GitHubRepoRef;
|
|
35
|
+
export declare class GitHubClient {
|
|
36
|
+
private readonly baseUrl;
|
|
37
|
+
private readonly timeoutMs;
|
|
38
|
+
private readonly token;
|
|
39
|
+
constructor(options?: GitHubClientOptions);
|
|
40
|
+
private buildHeaders;
|
|
41
|
+
private getText;
|
|
42
|
+
private toApiError;
|
|
43
|
+
fetchPullRequest(repo: GitHubRepoRef, prNumber: number): Promise<PullRequest>;
|
|
44
|
+
fetchPullRequestDiff(repo: GitHubRepoRef, prNumber: number): Promise<string>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=github.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.service.d.ts","sourceRoot":"","sources":["../../src/services/github.service.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAoDF,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEzB,IAAI,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;CASF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CASzD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;gBAE/B,OAAO,GAAE,mBAAwB;IAM7C,OAAO,CAAC,YAAY;YAUN,OAAO;IAmBrB,OAAO,CAAC,UAAU;IAmCZ,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAyC7E,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQnF"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
function normalizeBaseUrl(url) {
|
|
2
|
+
return url.replace(/\/+$/g, "");
|
|
3
|
+
}
|
|
4
|
+
function parsePositiveInt(value, fallback) {
|
|
5
|
+
if (!value)
|
|
6
|
+
return fallback;
|
|
7
|
+
const n = Number(value);
|
|
8
|
+
return Number.isFinite(n) && n > 0 ? Math.floor(n) : fallback;
|
|
9
|
+
}
|
|
10
|
+
function getEnvFirst(...names) {
|
|
11
|
+
for (const name of names) {
|
|
12
|
+
const v = process.env[name];
|
|
13
|
+
if (v && v.trim())
|
|
14
|
+
return v.trim();
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
async function fetchTextWithTimeout(input, init, timeoutMs) {
|
|
19
|
+
const controller = new AbortController();
|
|
20
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
21
|
+
try {
|
|
22
|
+
const res = await fetch(input, { ...init, signal: controller.signal });
|
|
23
|
+
const text = await res.text();
|
|
24
|
+
return { res, text };
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
clearTimeout(timeout);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function safeJsonParse(text) {
|
|
31
|
+
try {
|
|
32
|
+
return text ? JSON.parse(text) : undefined;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function parseGitHubMessage(text) {
|
|
39
|
+
const data = safeJsonParse(text);
|
|
40
|
+
const msg = data?.message?.trim();
|
|
41
|
+
return msg ? msg : undefined;
|
|
42
|
+
}
|
|
43
|
+
export class GitHubApiError extends Error {
|
|
44
|
+
status;
|
|
45
|
+
requestId;
|
|
46
|
+
documentationUrl;
|
|
47
|
+
details;
|
|
48
|
+
constructor(args) {
|
|
49
|
+
super(args.message);
|
|
50
|
+
this.name = "GitHubApiError";
|
|
51
|
+
this.status = args.status;
|
|
52
|
+
this.requestId = args.requestId;
|
|
53
|
+
this.documentationUrl = args.documentationUrl;
|
|
54
|
+
this.details = args.details;
|
|
55
|
+
if (args.cause !== undefined)
|
|
56
|
+
this.cause = args.cause;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function parseRepoRef(input) {
|
|
60
|
+
const raw = (input ?? "").trim();
|
|
61
|
+
const m = raw.match(/^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)$/);
|
|
62
|
+
if (!m) {
|
|
63
|
+
throw new GitHubApiError({
|
|
64
|
+
message: `Invalid repo "${input}". Expected "owner/repo".`
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return { owner: m[1], repo: m[2] };
|
|
68
|
+
}
|
|
69
|
+
export class GitHubClient {
|
|
70
|
+
baseUrl;
|
|
71
|
+
timeoutMs;
|
|
72
|
+
token;
|
|
73
|
+
constructor(options = {}) {
|
|
74
|
+
this.baseUrl = normalizeBaseUrl(options.baseUrl ?? getEnvFirst("GITREVIEWPILOT_GITHUB_BASE_URL") ?? "https://api.github.com");
|
|
75
|
+
this.timeoutMs = options.timeoutMs ?? parsePositiveInt(getEnvFirst("GITREVIEWPILOT_GITHUB_TIMEOUT_MS"), 20_000);
|
|
76
|
+
this.token = options.token ?? getEnvFirst("GITREVIEWPILOT_GITHUB_TOKEN", "GITHUB_TOKEN");
|
|
77
|
+
}
|
|
78
|
+
buildHeaders(accept) {
|
|
79
|
+
const headers = {
|
|
80
|
+
Accept: accept,
|
|
81
|
+
"User-Agent": "gitreviewpilot",
|
|
82
|
+
"X-GitHub-Api-Version": "2022-11-28"
|
|
83
|
+
};
|
|
84
|
+
if (this.token)
|
|
85
|
+
headers.Authorization = `Bearer ${this.token}`;
|
|
86
|
+
return headers;
|
|
87
|
+
}
|
|
88
|
+
async getText(path, accept) {
|
|
89
|
+
const url = `${this.baseUrl}${path}`;
|
|
90
|
+
try {
|
|
91
|
+
return await fetchTextWithTimeout(url, {
|
|
92
|
+
method: "GET",
|
|
93
|
+
headers: this.buildHeaders(accept)
|
|
94
|
+
}, this.timeoutMs);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (err instanceof DOMException && err.name === "AbortError") {
|
|
98
|
+
throw new GitHubApiError({ message: `GitHub request timed out after ${this.timeoutMs}ms.`, cause: err });
|
|
99
|
+
}
|
|
100
|
+
throw new GitHubApiError({ message: err instanceof Error ? err.message : String(err), cause: err });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
toApiError(res, text) {
|
|
104
|
+
const msg = parseGitHubMessage(text);
|
|
105
|
+
const requestId = res.headers.get("x-github-request-id") ?? undefined;
|
|
106
|
+
const docUrl = safeJsonParse(text)?.documentation_url;
|
|
107
|
+
const base = msg ?? (text ? text.slice(0, 500) : "Request failed");
|
|
108
|
+
const authHint = res.status === 401
|
|
109
|
+
? "Check GITREVIEWPILOT_GITHUB_TOKEN / GITHUB_TOKEN."
|
|
110
|
+
: res.status === 403
|
|
111
|
+
? "This may be rate limiting or missing permissions."
|
|
112
|
+
: "";
|
|
113
|
+
const rateLimitHint = (() => {
|
|
114
|
+
if (res.status !== 403)
|
|
115
|
+
return "";
|
|
116
|
+
const remaining = res.headers.get("x-ratelimit-remaining");
|
|
117
|
+
const reset = res.headers.get("x-ratelimit-reset");
|
|
118
|
+
if (remaining === "0" && reset) {
|
|
119
|
+
const resetMs = Number(reset) * 1000;
|
|
120
|
+
if (Number.isFinite(resetMs)) {
|
|
121
|
+
const inMin = Math.max(0, Math.round((resetMs - Date.now()) / 60000));
|
|
122
|
+
return ` Rate limit exceeded; try again in ~${inMin} min.`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return "";
|
|
126
|
+
})();
|
|
127
|
+
const notFoundHint = res.status === 404 ? " Check that the repo exists and the PR number is valid." : "";
|
|
128
|
+
return new GitHubApiError({
|
|
129
|
+
status: res.status,
|
|
130
|
+
message: `GitHub API error (${res.status}): ${base}${notFoundHint}${authHint ? ` ${authHint}` : ""}${rateLimitHint}`,
|
|
131
|
+
...(requestId ? { requestId } : {}),
|
|
132
|
+
...(docUrl ? { documentationUrl: docUrl } : {}),
|
|
133
|
+
...(text ? { details: text } : {})
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async fetchPullRequest(repo, prNumber) {
|
|
137
|
+
const { res, text } = await this.getText(`/repos/${encodeURIComponent(repo.owner)}/${encodeURIComponent(repo.repo)}/pulls/${prNumber}`, "application/vnd.github+json");
|
|
138
|
+
if (!res.ok)
|
|
139
|
+
throw this.toApiError(res, text);
|
|
140
|
+
const data = safeJsonParse(text);
|
|
141
|
+
const number = data?.number;
|
|
142
|
+
const title = data?.title;
|
|
143
|
+
const htmlUrl = data?.html_url;
|
|
144
|
+
if (!number || !title || !htmlUrl) {
|
|
145
|
+
throw new GitHubApiError({
|
|
146
|
+
status: res.status,
|
|
147
|
+
message: "GitHub returned an unexpected PR payload.",
|
|
148
|
+
details: text
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
number,
|
|
153
|
+
title,
|
|
154
|
+
htmlUrl,
|
|
155
|
+
state: data?.state ?? "unknown",
|
|
156
|
+
draft: Boolean(data?.draft),
|
|
157
|
+
userLogin: data?.user?.login ?? null,
|
|
158
|
+
baseRef: data?.base?.ref ?? "",
|
|
159
|
+
headRef: data?.head?.ref ?? ""
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
async fetchPullRequestDiff(repo, prNumber) {
|
|
163
|
+
const { res, text } = await this.getText(`/repos/${encodeURIComponent(repo.owner)}/${encodeURIComponent(repo.repo)}/pulls/${prNumber}`, "application/vnd.github.v3.diff");
|
|
164
|
+
if (!res.ok)
|
|
165
|
+
throw this.toApiError(res, text);
|
|
166
|
+
return text;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=github.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.service.js","sourceRoot":"","sources":["../../src/services/github.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type GitHubRepoRef, type PullRequest } from "./github.service.js";
|
|
2
|
+
export type ReviewPullRequestOptions = {
|
|
3
|
+
maxChars?: number;
|
|
4
|
+
github?: {
|
|
5
|
+
token?: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export type ReviewedPullRequest = {
|
|
11
|
+
repo: GitHubRepoRef;
|
|
12
|
+
pr: PullRequest;
|
|
13
|
+
changedFiles: string[];
|
|
14
|
+
diffChars: number;
|
|
15
|
+
minimizedDiffChars: number;
|
|
16
|
+
truncated: boolean;
|
|
17
|
+
maxChars: number;
|
|
18
|
+
minimizedDiff: string;
|
|
19
|
+
aiRaw: string;
|
|
20
|
+
};
|
|
21
|
+
export declare class PrReviewError extends Error {
|
|
22
|
+
readonly code: "INVALID_REPO" | "INVALID_PR_NUMBER" | "GITHUB_AUTH_MISSING" | "GITHUB_FAILED" | "DIFF_EMPTY" | "AI_FAILED";
|
|
23
|
+
readonly details: string | undefined;
|
|
24
|
+
constructor(code: PrReviewError["code"], message: string, details?: string, cause?: unknown);
|
|
25
|
+
}
|
|
26
|
+
export declare function parsePrNumber(prNumberRaw: string): number;
|
|
27
|
+
export declare function parseRepoOrThrow(repoRaw: string): GitHubRepoRef;
|
|
28
|
+
export declare function reviewPullRequest(repoRaw: string, prNumberRaw: string, options?: ReviewPullRequestOptions): Promise<ReviewedPullRequest>;
|
|
29
|
+
//# sourceMappingURL=prReviewService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prReviewService.d.ts","sourceRoot":"","sources":["../../src/services/prReviewService.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvH,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,WAAW,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EACT,cAAc,GACd,mBAAmB,GACnB,qBAAqB,GACrB,eAAe,GACf,YAAY,GACZ,WAAW,CAAC;IAChB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;gBAGnC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,OAAO;CAQlB;AASD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAS/D;AAgDD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,mBAAmB,CAAC,CA8B9B"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { analyze, buildPRReviewPrompt, LlmApiError } from "./ai.service.js";
|
|
2
|
+
import { GitHubApiError, GitHubClient, parseRepoRef } from "./github.service.js";
|
|
3
|
+
import { parseUnifiedDiff, toMinimizedDiff, truncateToChars } from "../utils/diff.js";
|
|
4
|
+
export class PrReviewError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
details;
|
|
7
|
+
constructor(code, message, details, cause) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "PrReviewError";
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.details = details;
|
|
12
|
+
if (cause !== undefined)
|
|
13
|
+
this.cause = cause;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function normalizeMaxChars(input) {
|
|
17
|
+
const n = input ?? 12_000;
|
|
18
|
+
// Allow very small values for troubleshooting provider limits.
|
|
19
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
20
|
+
return 12_000;
|
|
21
|
+
return Math.floor(n);
|
|
22
|
+
}
|
|
23
|
+
export function parsePrNumber(prNumberRaw) {
|
|
24
|
+
const n = Number(prNumberRaw);
|
|
25
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
26
|
+
throw new PrReviewError("INVALID_PR_NUMBER", `Invalid prNumber: ${prNumberRaw} (expected a positive integer)`);
|
|
27
|
+
}
|
|
28
|
+
return n;
|
|
29
|
+
}
|
|
30
|
+
export function parseRepoOrThrow(repoRaw) {
|
|
31
|
+
try {
|
|
32
|
+
return parseRepoRef(repoRaw);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (err instanceof GitHubApiError) {
|
|
36
|
+
throw new PrReviewError("INVALID_REPO", err.message, err.details, err);
|
|
37
|
+
}
|
|
38
|
+
throw new PrReviewError("INVALID_REPO", err instanceof Error ? err.message : String(err), undefined, err);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function fetchPrAndDiff(client, repo, prNumber) {
|
|
42
|
+
try {
|
|
43
|
+
const [pr, diff] = await Promise.all([
|
|
44
|
+
client.fetchPullRequest(repo, prNumber),
|
|
45
|
+
client.fetchPullRequestDiff(repo, prNumber)
|
|
46
|
+
]);
|
|
47
|
+
return { pr, diff };
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
if (err instanceof GitHubApiError) {
|
|
51
|
+
const missingTokenHint = (err.status === 401 || err.status === 403) && !process.env.GITREVIEWPILOT_GITHUB_TOKEN && !process.env.GITHUB_TOKEN;
|
|
52
|
+
if (missingTokenHint) {
|
|
53
|
+
throw new PrReviewError("GITHUB_AUTH_MISSING", "Missing GitHub token. Set GITREVIEWPILOT_GITHUB_TOKEN (preferred) or GITHUB_TOKEN.", err.details, err);
|
|
54
|
+
}
|
|
55
|
+
throw new PrReviewError("GITHUB_FAILED", err.message, err.details, err);
|
|
56
|
+
}
|
|
57
|
+
throw new PrReviewError("GITHUB_FAILED", err instanceof Error ? err.message : String(err), undefined, err);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function minimizeDiff(diff) {
|
|
61
|
+
const files = parseUnifiedDiff(diff);
|
|
62
|
+
const changedFiles = files
|
|
63
|
+
.map((f) => f.newPath ?? f.oldPath ?? "(unknown file)")
|
|
64
|
+
.filter((v, i, arr) => Boolean(v) && arr.indexOf(v) === i);
|
|
65
|
+
const minimized = toMinimizedDiff(files).trim();
|
|
66
|
+
return { minimized, minimizedChars: minimized.length, changedFiles };
|
|
67
|
+
}
|
|
68
|
+
async function analyzeDiff(minimizedDiff) {
|
|
69
|
+
const prompt = buildPRReviewPrompt(minimizedDiff);
|
|
70
|
+
try {
|
|
71
|
+
return await analyze(prompt);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (err instanceof LlmApiError) {
|
|
75
|
+
throw new PrReviewError("AI_FAILED", err.message, err.details, err);
|
|
76
|
+
}
|
|
77
|
+
throw new PrReviewError("AI_FAILED", err instanceof Error ? err.message : String(err), undefined, err);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function reviewPullRequest(repoRaw, prNumberRaw, options = {}) {
|
|
81
|
+
const repo = parseRepoOrThrow(repoRaw);
|
|
82
|
+
const prNumber = parsePrNumber(prNumberRaw);
|
|
83
|
+
const maxChars = normalizeMaxChars(options.maxChars);
|
|
84
|
+
const client = new GitHubClient(options.github);
|
|
85
|
+
const { pr, diff } = await fetchPrAndDiff(client, repo, prNumber);
|
|
86
|
+
const { minimized, minimizedChars, changedFiles } = minimizeDiff(diff);
|
|
87
|
+
if (!minimized) {
|
|
88
|
+
throw new PrReviewError("DIFF_EMPTY", "PR diff was empty or contained no textual hunks to review.");
|
|
89
|
+
}
|
|
90
|
+
const truncated = truncateToChars(minimized, maxChars);
|
|
91
|
+
const minimizedForAi = truncated.truncated
|
|
92
|
+
? `${truncated.text}\n\n[Note: diff was truncated to ${maxChars.toLocaleString()} characters for analysis.]`
|
|
93
|
+
: truncated.text;
|
|
94
|
+
const aiRaw = await analyzeDiff(minimizedForAi);
|
|
95
|
+
return {
|
|
96
|
+
repo,
|
|
97
|
+
pr,
|
|
98
|
+
changedFiles,
|
|
99
|
+
diffChars: diff.length,
|
|
100
|
+
minimizedDiffChars: minimizedChars,
|
|
101
|
+
truncated: truncated.truncated,
|
|
102
|
+
maxChars,
|
|
103
|
+
minimizedDiff: truncated.text,
|
|
104
|
+
aiRaw
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=prReviewService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prReviewService.js","sourceRoot":"","sources":["../../src/services/prReviewService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deprecated: use `reviewPullRequest` (GitHub-backed) instead.
|
|
3
|
+
*
|
|
4
|
+
* Kept temporarily for backwards compatibility with any external imports.
|
|
5
|
+
*/
|
|
6
|
+
export type PullRequestInfo = {
|
|
7
|
+
number: number;
|
|
8
|
+
title: string;
|
|
9
|
+
url: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function fetchPullRequest(prNumber: number): Promise<PullRequestInfo>;
|
|
12
|
+
//# sourceMappingURL=prService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prService.d.ts","sourceRoot":"","sources":["../../src/services/prService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAMjF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prService.js","sourceRoot":"","sources":["../../src/services/prService.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,iBAAiB,QAAQ,EAAE;QAClC,GAAG,EAAE,oBAAoB;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ReviewErrorCode = "FILE_NOT_FOUND" | "NOT_A_FILE" | "PERMISSION_DENIED" | "FILE_READ_FAILED" | "AI_FAILED";
|
|
2
|
+
export declare class ReviewError extends Error {
|
|
3
|
+
readonly code: ReviewErrorCode;
|
|
4
|
+
readonly details: string | undefined;
|
|
5
|
+
constructor(code: ReviewErrorCode, message: string, details?: string, cause?: unknown);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=reviewErrors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewErrors.d.ts","sourceRoot":"","sources":["../../src/services/reviewErrors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACvB,gBAAgB,GAChB,YAAY,GACZ,mBAAmB,GACnB,kBAAkB,GAClB,WAAW,CAAC;AAEhB,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEzB,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAOtF"}
|