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.
Files changed (100) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +234 -0
  3. package/dist/commands/ask.d.ts +3 -0
  4. package/dist/commands/ask.d.ts.map +1 -0
  5. package/dist/commands/ask.js +32 -0
  6. package/dist/commands/ask.js.map +1 -0
  7. package/dist/commands/changes.d.ts +3 -0
  8. package/dist/commands/changes.d.ts.map +1 -0
  9. package/dist/commands/changes.js +57 -0
  10. package/dist/commands/changes.js.map +1 -0
  11. package/dist/commands/install.d.ts +3 -0
  12. package/dist/commands/install.d.ts.map +1 -0
  13. package/dist/commands/install.js +86 -0
  14. package/dist/commands/install.js.map +1 -0
  15. package/dist/commands/pr.d.ts +3 -0
  16. package/dist/commands/pr.d.ts.map +1 -0
  17. package/dist/commands/pr.js +53 -0
  18. package/dist/commands/pr.js.map +1 -0
  19. package/dist/commands/review.d.ts +3 -0
  20. package/dist/commands/review.d.ts.map +1 -0
  21. package/dist/commands/review.js +45 -0
  22. package/dist/commands/review.js.map +1 -0
  23. package/dist/commands/version.d.ts +3 -0
  24. package/dist/commands/version.d.ts.map +1 -0
  25. package/dist/commands/version.js +16 -0
  26. package/dist/commands/version.js.map +1 -0
  27. package/dist/config/env.d.ts +3 -0
  28. package/dist/config/env.d.ts.map +1 -0
  29. package/dist/config/env.js +20 -0
  30. package/dist/config/env.js.map +1 -0
  31. package/dist/config/gitreviewpilotConfig.d.ts +16 -0
  32. package/dist/config/gitreviewpilotConfig.d.ts.map +1 -0
  33. package/dist/config/gitreviewpilotConfig.js +78 -0
  34. package/dist/config/gitreviewpilotConfig.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +56 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/services/ai.service.d.ts +60 -0
  40. package/dist/services/ai.service.d.ts.map +1 -0
  41. package/dist/services/ai.service.js +396 -0
  42. package/dist/services/ai.service.js.map +1 -0
  43. package/dist/services/askService.d.ts +12 -0
  44. package/dist/services/askService.d.ts.map +1 -0
  45. package/dist/services/askService.js +68 -0
  46. package/dist/services/askService.js.map +1 -0
  47. package/dist/services/git.service.d.ts +12 -0
  48. package/dist/services/git.service.d.ts.map +1 -0
  49. package/dist/services/git.service.js +61 -0
  50. package/dist/services/git.service.js.map +1 -0
  51. package/dist/services/github.service.d.ts +46 -0
  52. package/dist/services/github.service.d.ts.map +1 -0
  53. package/dist/services/github.service.js +169 -0
  54. package/dist/services/github.service.js.map +1 -0
  55. package/dist/services/prReviewService.d.ts +29 -0
  56. package/dist/services/prReviewService.d.ts.map +1 -0
  57. package/dist/services/prReviewService.js +107 -0
  58. package/dist/services/prReviewService.js.map +1 -0
  59. package/dist/services/prService.d.ts +12 -0
  60. package/dist/services/prService.d.ts.map +1 -0
  61. package/dist/services/prService.js +8 -0
  62. package/dist/services/prService.js.map +1 -0
  63. package/dist/services/reviewErrors.d.ts +7 -0
  64. package/dist/services/reviewErrors.d.ts.map +1 -0
  65. package/dist/services/reviewErrors.js +13 -0
  66. package/dist/services/reviewErrors.js.map +1 -0
  67. package/dist/services/reviewService.d.ts +16 -0
  68. package/dist/services/reviewService.d.ts.map +1 -0
  69. package/dist/services/reviewService.js +109 -0
  70. package/dist/services/reviewService.js.map +1 -0
  71. package/dist/utils/cli.d.ts +16 -0
  72. package/dist/utils/cli.d.ts.map +1 -0
  73. package/dist/utils/cli.js +108 -0
  74. package/dist/utils/cli.js.map +1 -0
  75. package/dist/utils/diff.d.ts +21 -0
  76. package/dist/utils/diff.d.ts.map +1 -0
  77. package/dist/utils/diff.js +105 -0
  78. package/dist/utils/diff.js.map +1 -0
  79. package/dist/utils/formatter.d.ts +11 -0
  80. package/dist/utils/formatter.d.ts.map +1 -0
  81. package/dist/utils/formatter.js +186 -0
  82. package/dist/utils/formatter.js.map +1 -0
  83. package/dist/utils/logger.d.ts +7 -0
  84. package/dist/utils/logger.d.ts.map +1 -0
  85. package/dist/utils/logger.js +35 -0
  86. package/dist/utils/logger.js.map +1 -0
  87. package/dist/utils/repoContext.d.ts +26 -0
  88. package/dist/utils/repoContext.d.ts.map +1 -0
  89. package/dist/utils/repoContext.js +136 -0
  90. package/dist/utils/repoContext.js.map +1 -0
  91. package/dist/utils/spinner.d.ts +3 -0
  92. package/dist/utils/spinner.d.ts.map +1 -0
  93. package/dist/utils/spinner.js +5 -0
  94. package/dist/utils/spinner.js.map +1 -0
  95. package/dist/utils/structuredReview.d.ts +21 -0
  96. package/dist/utils/structuredReview.d.ts.map +1 -0
  97. package/dist/utils/structuredReview.js +59 -0
  98. package/dist/utils/structuredReview.js.map +1 -0
  99. package/gitreviewpilot.config.json +3 -0
  100. 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,8 @@
1
+ export async function fetchPullRequest(prNumber) {
2
+ return {
3
+ number: prNumber,
4
+ title: `Pull Request #${prNumber}`,
5
+ url: `https://github.com`
6
+ };
7
+ }
8
+ //# sourceMappingURL=prService.js.map
@@ -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"}