secondpair 0.1.3 → 0.1.5
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/README.md +26 -3
- package/dist/bitbucket/auth.d.ts +13 -0
- package/dist/bitbucket/auth.js +37 -0
- package/dist/bitbucket/auth.js.map +1 -0
- package/dist/bitbucket/comments.d.ts +20 -14
- package/dist/bitbucket/comments.js +59 -45
- package/dist/bitbucket/comments.js.map +1 -1
- package/dist/cli.js +104 -43
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.js +68 -4
- package/dist/config.js.map +1 -1
- package/dist/diff/github.d.ts +2 -0
- package/dist/diff/github.js +10 -0
- package/dist/diff/github.js.map +1 -1
- package/dist/finding-id.d.ts +5 -3
- package/dist/finding-id.js +18 -11
- package/dist/finding-id.js.map +1 -1
- package/dist/github/auth.d.ts +4 -0
- package/dist/github/auth.js +16 -0
- package/dist/github/auth.js.map +1 -0
- package/dist/github/comments.d.ts +11 -2
- package/dist/github/comments.js +30 -4
- package/dist/github/comments.js.map +1 -1
- package/dist/gitlab/auth.d.ts +11 -0
- package/dist/gitlab/auth.js +22 -0
- package/dist/gitlab/auth.js.map +1 -0
- package/dist/gitlab/comments.d.ts +10 -9
- package/dist/gitlab/comments.js +34 -27
- package/dist/gitlab/comments.js.map +1 -1
- package/dist/host.d.ts +3 -0
- package/dist/host.js +15 -0
- package/dist/host.js.map +1 -0
- package/dist/llm/prompt.d.ts +21 -0
- package/dist/llm/prompt.js +57 -1
- package/dist/llm/prompt.js.map +1 -1
- package/dist/report/cli.d.ts +8 -3
- package/dist/report/cli.js +11 -1
- package/dist/report/cli.js.map +1 -1
- package/dist/report/json.d.ts +5 -0
- package/dist/report/json.js +2 -0
- package/dist/report/json.js.map +1 -1
- package/dist/retry.d.ts +1 -0
- package/dist/retry.js +16 -0
- package/dist/retry.js.map +1 -0
- package/dist/review-state.d.ts +16 -0
- package/dist/review-state.js +24 -0
- package/dist/review-state.js.map +1 -0
- package/dist/review.d.ts +29 -0
- package/dist/review.js +165 -29
- package/dist/review.js.map +1 -1
- package/dist/specialized-review.d.ts +29 -0
- package/dist/specialized-review.js +50 -0
- package/dist/specialized-review.js.map +1 -0
- package/dist/types.d.ts +18 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -29,8 +29,10 @@ npx secondpair review --base main # review branch vs main
|
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
Nothing to configure to get useful output — defaults are sane
|
|
32
|
-
(`fail_on:
|
|
33
|
-
|
|
32
|
+
(`fail_on: off`, `min_confidence: 0.5`). CI never fails on findings until you
|
|
33
|
+
opt in (`fail_on: high` or `--fail-on high`); until then it's report/post
|
|
34
|
+
only. Add `.pr-review.yml` only when you want to change them (see
|
|
35
|
+
[Config](#config)).
|
|
34
36
|
|
|
35
37
|
## Reviewing a real PR (posting comments + CI gate)
|
|
36
38
|
|
|
@@ -76,11 +78,12 @@ before posting, on top of run-to-run fingerprint reconciliation.
|
|
|
76
78
|
## Config (`.pr-review.yml`, optional)
|
|
77
79
|
|
|
78
80
|
```yaml
|
|
79
|
-
fail_on:
|
|
81
|
+
fail_on: off # critical|high|medium|low|info|off — CI exit-1 threshold; default "off" never fails, still posts/reports
|
|
80
82
|
min_confidence: 0.5
|
|
81
83
|
ignore: ["**/*.generated.ts", "vendor/**"]
|
|
82
84
|
context_token_budget: 8000 # repocairn context injected per chunk
|
|
83
85
|
context_snippets: 3
|
|
86
|
+
signal_detector: true # deterministic hook/error-handling/control-flow scan, injected as prompt context
|
|
84
87
|
categories: # turn any off
|
|
85
88
|
bug: true
|
|
86
89
|
security: true
|
|
@@ -92,12 +95,32 @@ limits:
|
|
|
92
95
|
max_findings_per_file: 5
|
|
93
96
|
max_total: 30
|
|
94
97
|
self_critique: false # extra LLM pass that only drops findings, never adds
|
|
98
|
+
huge_pr_token_threshold: 120000 # diff tokens above which review switches to critical/high-only + split suggestion; null disables
|
|
99
|
+
parallel_agents: true # split each chunk into concurrent security/correctness/quality lens calls (more LLM calls, specialized findings); set false for one sequential call
|
|
95
100
|
redact_secrets: true # strip secrets from diff/context before they reach the LLM
|
|
96
101
|
redact_patterns: [] # extra regexes, on top of built-in AWS/GitHub-token/PEM/etc
|
|
97
102
|
write_suppressions: false # persist "won't fix" replies to .pr-review-suppressions.yml
|
|
98
103
|
custom_instructions: ""
|
|
104
|
+
custom_instructions_file: ".pr-review-instructions.md" # optional guide file (any name/extension — .md, .mdc, ...); if it exists, its content REPLACES custom_instructions above
|
|
99
105
|
```
|
|
100
106
|
|
|
107
|
+
Prefer a standalone file over the inline `custom_instructions` string once your
|
|
108
|
+
rules grow past a line or two — easier to edit/review, and each
|
|
109
|
+
project/company can keep its own review guide (house style, focus areas,
|
|
110
|
+
things to always flag) without touching the YAML. None of this is mandatory
|
|
111
|
+
— missing files just fall through to the next source. Precedence (highest
|
|
112
|
+
first):
|
|
113
|
+
|
|
114
|
+
1. `.secondpair/instructions.mdc` or `.secondpair/instructions.md` — same
|
|
115
|
+
convention as `.claude`/`.cursor`/`.repocairn`. Nothing to configure, just
|
|
116
|
+
drop the file in.
|
|
117
|
+
2. `custom_instructions_file` (default `.pr-review-instructions.md`)
|
|
118
|
+
3. inline `custom_instructions` above
|
|
119
|
+
|
|
120
|
+
This only adds to the "CUSTOM REVIEW INSTRUCTIONS" prompt section — it never
|
|
121
|
+
replaces secondpair's own review guidelines (what counts as a finding,
|
|
122
|
+
severity, output format), only layers project-specific guidance on top.
|
|
123
|
+
|
|
101
124
|
Suppress a finding permanently: reply "won't fix" (or react 👎) on its PR
|
|
102
125
|
comment, or hand-edit `.pr-review-suppressions.yml` with the finding id
|
|
103
126
|
from the report.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface BbRef {
|
|
2
|
+
workspace: string;
|
|
3
|
+
repoSlug: string;
|
|
4
|
+
prId: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve Bitbucket Cloud auth from the environment:
|
|
8
|
+
* BITBUCKET_TOKEN / BITBUCKET_ACCESS_TOKEN -> Bearer (repository access token)
|
|
9
|
+
* BITBUCKET_USERNAME + BITBUCKET_APP_PASSWORD -> Basic (app password)
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveBbAuthHeader(): string;
|
|
12
|
+
/** Resolve workspace/repo/PR id from flags or Bitbucket Pipelines env vars. */
|
|
13
|
+
export declare function resolveBbRef(repoSlug: string | undefined, pr: number | undefined): BbRef;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve Bitbucket Cloud auth from the environment:
|
|
3
|
+
* BITBUCKET_TOKEN / BITBUCKET_ACCESS_TOKEN -> Bearer (repository access token)
|
|
4
|
+
* BITBUCKET_USERNAME + BITBUCKET_APP_PASSWORD -> Basic (app password)
|
|
5
|
+
*/
|
|
6
|
+
export function resolveBbAuthHeader() {
|
|
7
|
+
const env = process.env;
|
|
8
|
+
const token = env.BITBUCKET_TOKEN || env.BITBUCKET_ACCESS_TOKEN;
|
|
9
|
+
if (token)
|
|
10
|
+
return `Bearer ${token}`;
|
|
11
|
+
if (env.BITBUCKET_USERNAME && env.BITBUCKET_APP_PASSWORD) {
|
|
12
|
+
const basic = Buffer.from(`${env.BITBUCKET_USERNAME}:${env.BITBUCKET_APP_PASSWORD}`).toString("base64");
|
|
13
|
+
return `Basic ${basic}`;
|
|
14
|
+
}
|
|
15
|
+
throw new Error("Bitbucket auth required: set BITBUCKET_TOKEN (repository access token with pullrequest:write) " +
|
|
16
|
+
"or BITBUCKET_USERNAME + BITBUCKET_APP_PASSWORD.");
|
|
17
|
+
}
|
|
18
|
+
/** Resolve workspace/repo/PR id from flags or Bitbucket Pipelines env vars. */
|
|
19
|
+
export function resolveBbRef(repoSlug, pr) {
|
|
20
|
+
const env = process.env;
|
|
21
|
+
let workspace;
|
|
22
|
+
let slug;
|
|
23
|
+
if (repoSlug) {
|
|
24
|
+
[workspace, slug] = repoSlug.split("/");
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
workspace = env.BITBUCKET_WORKSPACE;
|
|
28
|
+
slug = env.BITBUCKET_REPO_SLUG;
|
|
29
|
+
}
|
|
30
|
+
const prId = pr ?? (env.BITBUCKET_PR_ID ? parseInt(env.BITBUCKET_PR_ID, 10) : undefined);
|
|
31
|
+
if (!workspace || !slug || prId == null || Number.isNaN(prId)) {
|
|
32
|
+
throw new Error("Bitbucket PR not identified. Pass --repo workspace/repo_slug and --pr <id>, " +
|
|
33
|
+
"or run inside Bitbucket Pipelines (BITBUCKET_WORKSPACE / BITBUCKET_REPO_SLUG / BITBUCKET_PR_ID).");
|
|
34
|
+
}
|
|
35
|
+
return { workspace, repoSlug: slug, prId };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/bitbucket/auth.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,sBAAsB,CAAC;IAChE,IAAI,KAAK;QAAE,OAAO,UAAU,KAAK,EAAE,CAAC;IACpC,IAAI,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,sBAAsB,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAC3F,QAAQ,CACT,CAAC;QACF,OAAO,SAAS,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,KAAK,CACb,gGAAgG;QAC9F,iDAAiD,CACpD,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,QAA4B,EAAE,EAAsB;IAC/E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,IAAI,SAA6B,CAAC;IAClC,IAAI,IAAwB,CAAC;IAC7B,IAAI,QAAQ,EAAE,CAAC;QACb,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,GAAG,CAAC,mBAAmB,CAAC;QACpC,IAAI,GAAG,GAAG,CAAC,mBAAmB,CAAC;IACjC,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzF,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,8EAA8E;YAC5E,kGAAkG,CACrG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
+
import { type ReviewState } from "../review-state.js";
|
|
1
2
|
import type { Finding, ReviewResult } from "../types.js";
|
|
2
|
-
|
|
3
|
-
workspace: string;
|
|
4
|
-
repoSlug: string;
|
|
5
|
-
prId: number;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Resolve Bitbucket Cloud auth from the environment:
|
|
9
|
-
* BITBUCKET_TOKEN / BITBUCKET_ACCESS_TOKEN -> Bearer (repository access token)
|
|
10
|
-
* BITBUCKET_USERNAME + BITBUCKET_APP_PASSWORD -> Basic (app password)
|
|
11
|
-
*/
|
|
12
|
-
export declare function resolveBbAuthHeader(): string;
|
|
13
|
-
/** Resolve workspace/repo/PR id from flags or Bitbucket Pipelines env vars. */
|
|
14
|
-
export declare function resolveBbRef(repoSlug: string | undefined, pr: number | undefined): BbRef;
|
|
3
|
+
import { type BbRef } from "./auth.js";
|
|
15
4
|
/** Fetch the unified diff of a Bitbucket Cloud pull request. */
|
|
16
5
|
export declare function getBbPrDiff(ref: BbRef): Promise<string>;
|
|
6
|
+
export declare function getBbPrHeadSha(ref: BbRef): Promise<string>;
|
|
7
|
+
/** Paths changed between two commits (diffstat, paginated). */
|
|
8
|
+
export declare function listBbChangedFiles(ref: BbRef, fromSha: string, toSha: string): Promise<Set<string>>;
|
|
17
9
|
interface BbComment {
|
|
18
10
|
id?: number;
|
|
19
11
|
content?: {
|
|
@@ -29,21 +21,35 @@ interface BbComment {
|
|
|
29
21
|
}
|
|
30
22
|
export declare function listBbComments(ref: BbRef): Promise<BbComment[]>;
|
|
31
23
|
export declare function listBbFindingIds(ref: BbRef): Promise<Set<string>>;
|
|
24
|
+
/**
|
|
25
|
+
* Recover the full review state (head sha + every active finding) embedded
|
|
26
|
+
* in the most recent summary comment — the source of truth for soft-match
|
|
27
|
+
* reconciliation and incremental (changed-files-only) re-review, since no
|
|
28
|
+
* local report file survives between fresh Pipelines checkouts.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getBbReviewState(ref: BbRef): Promise<ReviewState | null>;
|
|
32
31
|
export declare function listBbWontFixFindingIds(ref: BbRef): Promise<Set<string>>;
|
|
33
32
|
/** Bitbucket Cloud exposes no API for resolving pull-request comment threads. */
|
|
34
33
|
export declare function resolveBbCommentsForIds(_ref: BbRef, _ids: Iterable<string>, log?: (msg: string) => void): Promise<number>;
|
|
35
34
|
/** Bitbucket markdown has no GitHub suggestion blocks — render fixes as code fences. */
|
|
36
35
|
export declare function formatBbCommentBody(f: Finding): string;
|
|
37
|
-
export declare function formatBbSummaryBody(result: ReviewResult
|
|
36
|
+
export declare function formatBbSummaryBody(result: ReviewResult & {
|
|
37
|
+
highLevelReview?: boolean;
|
|
38
|
+
}, failed: boolean, headSha?: string): string;
|
|
38
39
|
export interface PostBbReviewOptions {
|
|
39
40
|
ref: BbRef;
|
|
40
41
|
result: ReviewResult;
|
|
41
42
|
failed: boolean;
|
|
43
|
+
/** Current PR head sha, embedded in the summary comment for the next incremental review. */
|
|
44
|
+
headSha?: string;
|
|
42
45
|
log?: (msg: string) => void;
|
|
43
46
|
}
|
|
44
47
|
/**
|
|
45
48
|
* Post findings to a Bitbucket Cloud PR: one summary comment plus one inline
|
|
46
49
|
* comment per *new* finding. Persistent findings (same pr-review-id) are skipped.
|
|
50
|
+
* The summary is re-posted every run (not just the first) so its embedded
|
|
51
|
+
* review state — head sha + every active finding — stays current for the
|
|
52
|
+
* next run's incremental diff and reconciliation.
|
|
47
53
|
*/
|
|
48
54
|
export declare function postBbReview(opts: PostBbReviewOptions): Promise<void>;
|
|
49
55
|
export {};
|
|
@@ -1,43 +1,9 @@
|
|
|
1
1
|
import { collectIdsFromBodies, embedFindingId, parseFindingId } from "../finding-id.js";
|
|
2
2
|
import { AGENT_MARKER, SEVERITY_EMOJI } from "../github/comments.js";
|
|
3
|
+
import { embedReviewState, parseReviewState } from "../review-state.js";
|
|
3
4
|
import { collectWontFixIds } from "../suppress-signals.js";
|
|
5
|
+
import { resolveBbAuthHeader } from "./auth.js";
|
|
4
6
|
const API = "https://api.bitbucket.org/2.0";
|
|
5
|
-
/**
|
|
6
|
-
* Resolve Bitbucket Cloud auth from the environment:
|
|
7
|
-
* BITBUCKET_TOKEN / BITBUCKET_ACCESS_TOKEN -> Bearer (repository access token)
|
|
8
|
-
* BITBUCKET_USERNAME + BITBUCKET_APP_PASSWORD -> Basic (app password)
|
|
9
|
-
*/
|
|
10
|
-
export function resolveBbAuthHeader() {
|
|
11
|
-
const env = process.env;
|
|
12
|
-
const token = env.BITBUCKET_TOKEN || env.BITBUCKET_ACCESS_TOKEN;
|
|
13
|
-
if (token)
|
|
14
|
-
return `Bearer ${token}`;
|
|
15
|
-
if (env.BITBUCKET_USERNAME && env.BITBUCKET_APP_PASSWORD) {
|
|
16
|
-
const basic = Buffer.from(`${env.BITBUCKET_USERNAME}:${env.BITBUCKET_APP_PASSWORD}`).toString("base64");
|
|
17
|
-
return `Basic ${basic}`;
|
|
18
|
-
}
|
|
19
|
-
throw new Error("Bitbucket auth required: set BITBUCKET_TOKEN (repository access token with pullrequest:write) " +
|
|
20
|
-
"or BITBUCKET_USERNAME + BITBUCKET_APP_PASSWORD.");
|
|
21
|
-
}
|
|
22
|
-
/** Resolve workspace/repo/PR id from flags or Bitbucket Pipelines env vars. */
|
|
23
|
-
export function resolveBbRef(repoSlug, pr) {
|
|
24
|
-
const env = process.env;
|
|
25
|
-
let workspace;
|
|
26
|
-
let slug;
|
|
27
|
-
if (repoSlug) {
|
|
28
|
-
[workspace, slug] = repoSlug.split("/");
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
workspace = env.BITBUCKET_WORKSPACE;
|
|
32
|
-
slug = env.BITBUCKET_REPO_SLUG;
|
|
33
|
-
}
|
|
34
|
-
const prId = pr ?? (env.BITBUCKET_PR_ID ? parseInt(env.BITBUCKET_PR_ID, 10) : undefined);
|
|
35
|
-
if (!workspace || !slug || prId == null || Number.isNaN(prId)) {
|
|
36
|
-
throw new Error("Bitbucket PR not identified. Pass --repo workspace/repo_slug and --pr <id>, " +
|
|
37
|
-
"or run inside Bitbucket Pipelines (BITBUCKET_WORKSPACE / BITBUCKET_REPO_SLUG / BITBUCKET_PR_ID).");
|
|
38
|
-
}
|
|
39
|
-
return { workspace, repoSlug: slug, prId };
|
|
40
|
-
}
|
|
41
7
|
async function bbFetch(url, init = {}) {
|
|
42
8
|
const res = await fetch(url, {
|
|
43
9
|
...init,
|
|
@@ -59,6 +25,31 @@ export async function getBbPrDiff(ref) {
|
|
|
59
25
|
const res = await bbFetch(`${API}/repositories/${ref.workspace}/${ref.repoSlug}/pullrequests/${ref.prId}/diff`, { headers: { accept: "text/plain" } });
|
|
60
26
|
return res.text();
|
|
61
27
|
}
|
|
28
|
+
export async function getBbPrHeadSha(ref) {
|
|
29
|
+
const res = await bbFetch(`${API}/repositories/${ref.workspace}/${ref.repoSlug}/pullrequests/${ref.prId}`);
|
|
30
|
+
const data = (await res.json());
|
|
31
|
+
const sha = data.source?.commit?.hash;
|
|
32
|
+
if (!sha)
|
|
33
|
+
throw new Error("Bitbucket PR response had no source commit hash.");
|
|
34
|
+
return sha;
|
|
35
|
+
}
|
|
36
|
+
/** Paths changed between two commits (diffstat, paginated). */
|
|
37
|
+
export async function listBbChangedFiles(ref, fromSha, toSha) {
|
|
38
|
+
const paths = new Set();
|
|
39
|
+
let url = `${API}/repositories/${ref.workspace}/${ref.repoSlug}/diffstat/${fromSha}..${toSha}?pagelen=100`;
|
|
40
|
+
while (url) {
|
|
41
|
+
const res = await bbFetch(url);
|
|
42
|
+
const page = (await res.json());
|
|
43
|
+
for (const v of page.values ?? []) {
|
|
44
|
+
if (v.new?.path)
|
|
45
|
+
paths.add(v.new.path);
|
|
46
|
+
if (v.old?.path)
|
|
47
|
+
paths.add(v.old.path);
|
|
48
|
+
}
|
|
49
|
+
url = page.next ?? null;
|
|
50
|
+
}
|
|
51
|
+
return paths;
|
|
52
|
+
}
|
|
62
53
|
export async function listBbComments(ref) {
|
|
63
54
|
const comments = [];
|
|
64
55
|
let url = `${API}/repositories/${ref.workspace}/${ref.repoSlug}/pullrequests/${ref.prId}/comments?pagelen=100`;
|
|
@@ -74,6 +65,22 @@ export async function listBbFindingIds(ref) {
|
|
|
74
65
|
const existing = await listBbComments(ref);
|
|
75
66
|
return collectIdsFromBodies(existing.filter((c) => c.content?.raw?.includes(AGENT_MARKER)).map((c) => c.content?.raw ?? ""));
|
|
76
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Recover the full review state (head sha + every active finding) embedded
|
|
70
|
+
* in the most recent summary comment — the source of truth for soft-match
|
|
71
|
+
* reconciliation and incremental (changed-files-only) re-review, since no
|
|
72
|
+
* local report file survives between fresh Pipelines checkouts.
|
|
73
|
+
*/
|
|
74
|
+
export async function getBbReviewState(ref) {
|
|
75
|
+
const existing = await listBbComments(ref);
|
|
76
|
+
const summaries = existing.filter((c) => c.content?.raw?.includes(AGENT_MARKER) && c.inline == null);
|
|
77
|
+
for (let i = summaries.length - 1; i >= 0; i--) {
|
|
78
|
+
const state = parseReviewState(summaries[i].content?.raw ?? "");
|
|
79
|
+
if (state)
|
|
80
|
+
return state;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
77
84
|
export async function listBbWontFixFindingIds(ref) {
|
|
78
85
|
const comments = await listBbComments(ref);
|
|
79
86
|
const byId = new Map(comments.flatMap((comment) => (comment.id == null ? [] : [[comment.id, comment]])));
|
|
@@ -113,7 +120,7 @@ export function formatBbCommentBody(f) {
|
|
|
113
120
|
body = embedFindingId(body, f.id);
|
|
114
121
|
return body;
|
|
115
122
|
}
|
|
116
|
-
export function formatBbSummaryBody(result, failed) {
|
|
123
|
+
export function formatBbSummaryBody(result, failed, headSha) {
|
|
117
124
|
const counts = {};
|
|
118
125
|
for (const f of result.findings)
|
|
119
126
|
counts[f.severity] = (counts[f.severity] ?? 0) + 1;
|
|
@@ -122,24 +129,34 @@ export function formatBbSummaryBody(result, failed) {
|
|
|
122
129
|
: Object.entries(counts)
|
|
123
130
|
.map(([sev, n]) => `${SEVERITY_EMOJI[sev]} ${n} ${sev}`)
|
|
124
131
|
.join(" · ");
|
|
132
|
+
const highLevelLine = result.highLevelReview
|
|
133
|
+
? "\n⚠️ **Large diff** — high-level review only (critical/high severity). Consider splitting this PR."
|
|
134
|
+
: "";
|
|
125
135
|
const recon = result.reconciliation;
|
|
126
136
|
const reconLine = recon
|
|
127
137
|
? `\n_Lifecycle:_ ${recon.new.length} new · ${recon.persistent.length} persistent · ${recon.resolved.length} resolved · ${recon.suppressed.length} suppressed`
|
|
128
138
|
: "";
|
|
129
|
-
|
|
139
|
+
let body = [
|
|
130
140
|
"## PR Review Agent",
|
|
131
141
|
"",
|
|
132
142
|
result.summary.trim(),
|
|
133
143
|
"",
|
|
134
144
|
countLine,
|
|
145
|
+
highLevelLine,
|
|
135
146
|
reconLine,
|
|
136
147
|
failed ? "\n❌ **Check failed**: findings at or above the configured severity threshold." : "",
|
|
137
148
|
AGENT_MARKER,
|
|
138
149
|
].join("\n");
|
|
150
|
+
if (headSha)
|
|
151
|
+
body = embedReviewState(body, { headSha, findings: result.findings });
|
|
152
|
+
return body;
|
|
139
153
|
}
|
|
140
154
|
/**
|
|
141
155
|
* Post findings to a Bitbucket Cloud PR: one summary comment plus one inline
|
|
142
156
|
* comment per *new* finding. Persistent findings (same pr-review-id) are skipped.
|
|
157
|
+
* The summary is re-posted every run (not just the first) so its embedded
|
|
158
|
+
* review state — head sha + every active finding — stays current for the
|
|
159
|
+
* next run's incremental diff and reconciliation.
|
|
143
160
|
*/
|
|
144
161
|
export async function postBbReview(opts) {
|
|
145
162
|
const { ref, result, log = () => { } } = opts;
|
|
@@ -147,13 +164,10 @@ export async function postBbReview(opts) {
|
|
|
147
164
|
const existing = await listBbComments(ref);
|
|
148
165
|
const mine = existing.filter((c) => c.content?.raw?.includes(AGENT_MARKER));
|
|
149
166
|
const existingIds = collectIdsFromBodies(mine.map((c) => c.content?.raw ?? ""));
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
body: JSON.stringify({ content: { raw: formatBbSummaryBody(result, opts.failed) } }),
|
|
155
|
-
});
|
|
156
|
-
}
|
|
167
|
+
await bbFetch(commentsUrl, {
|
|
168
|
+
method: "POST",
|
|
169
|
+
body: JSON.stringify({ content: { raw: formatBbSummaryBody(result, opts.failed, opts.headSha) } }),
|
|
170
|
+
});
|
|
157
171
|
const toPost = result.findingsToPost ?? result.findings;
|
|
158
172
|
let posted = 0;
|
|
159
173
|
let skipped = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/bitbucket/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/bitbucket/comments.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -3,12 +3,16 @@ import { Command } from "commander";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import pc from "picocolors";
|
|
5
5
|
import { getModel, runIndex } from "repocairn";
|
|
6
|
-
import { getBbPrDiff, listBbFindingIds, listBbWontFixFindingIds, postBbReview,
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import { getBbPrDiff, getBbPrHeadSha, getBbReviewState, listBbChangedFiles, listBbFindingIds, listBbWontFixFindingIds, postBbReview, } from "./bitbucket/comments.js";
|
|
7
|
+
import { resolveBbRef } from "./bitbucket/auth.js";
|
|
8
|
+
import { getGlMrDiff, getGlReviewState, listGlChangedFiles, listGlFindingIds, listGlWontFixFindingIds, postGlReview, } from "./gitlab/comments.js";
|
|
9
|
+
import { resolveGlRef } from "./gitlab/auth.js";
|
|
10
|
+
import { applyCliOverrides, loadConfig } from "./config.js";
|
|
11
|
+
import { getPrDiff, getPrHeadSha, listChangedFiles, makeOctokit, parseRepoSlug, } from "./diff/github.js";
|
|
12
|
+
import { resolveGhRepoSlug, resolveGhToken } from "./github/auth.js";
|
|
10
13
|
import { getLocalDiff } from "./diff/local.js";
|
|
11
|
-
import { listPostedFindingIds, listWontFixFindingIds, postReview } from "./github/comments.js";
|
|
14
|
+
import { getReviewState, listPostedFindingIds, listWontFixFindingIds, postReview, } from "./github/comments.js";
|
|
15
|
+
import { detectHost } from "./host.js";
|
|
12
16
|
import { formatReport, shouldFail } from "./report/cli.js";
|
|
13
17
|
import { buildJsonReport, formatRunSummaryLine, loadPreviousFindings, loadPreviousIds, writeJsonReport, } from "./report/json.js";
|
|
14
18
|
import { runReview } from "./review.js";
|
|
@@ -49,7 +53,7 @@ program
|
|
|
49
53
|
.option("--host <host>", "github | bitbucket | gitlab (default: detected from CI env vars, else github)")
|
|
50
54
|
.option("--json <path>", "write findings JSON to this path", "pr-review-report.json")
|
|
51
55
|
.option("--post", "post findings as inline PR review comments", false)
|
|
52
|
-
.option("--fail-on <severity>", `exit 1 at/above this severity (${SEVERITIES.join("|")}); overrides config`)
|
|
56
|
+
.option("--fail-on <severity>", `exit 1 at/above this severity (${SEVERITIES.join("|")}|off); overrides config`)
|
|
53
57
|
.option("--no-context", "review the diff without codemap context")
|
|
54
58
|
.option("--dir <path>", "repository root", process.cwd())
|
|
55
59
|
.option("--config <path>", "path to .pr-review.yml")
|
|
@@ -57,27 +61,13 @@ program
|
|
|
57
61
|
.option("--write-suppressions", "append won’t-fix finding ids to .pr-review-suppressions.yml", false)
|
|
58
62
|
.action(async (opts) => {
|
|
59
63
|
const cwd = path.resolve(opts.dir);
|
|
60
|
-
const config = await loadConfig(cwd, opts.config)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
config.fail_on = opts.failOn;
|
|
68
|
-
}
|
|
69
|
-
const env = process.env;
|
|
70
|
-
const host = opts.host ??
|
|
71
|
-
(env.BITBUCKET_WORKSPACE || env.BITBUCKET_PR_ID
|
|
72
|
-
? "bitbucket"
|
|
73
|
-
: env.GITLAB_CI
|
|
74
|
-
? "gitlab"
|
|
75
|
-
: "github");
|
|
76
|
-
if (host !== "github" && host !== "bitbucket" && host !== "gitlab") {
|
|
77
|
-
throw new Error(`--host must be github, bitbucket, or gitlab, got "${opts.host}".`);
|
|
78
|
-
}
|
|
79
|
-
const bbPrAvailable = host === "bitbucket" && (opts.pr != null || env.BITBUCKET_PR_ID);
|
|
80
|
-
const glMrAvailable = host === "gitlab" && (opts.pr != null || env.CI_MERGE_REQUEST_IID);
|
|
64
|
+
const config = applyCliOverrides(await loadConfig(cwd, opts.config), {
|
|
65
|
+
failOn: opts.failOn,
|
|
66
|
+
writeSuppressions: opts.writeSuppressions,
|
|
67
|
+
});
|
|
68
|
+
const host = detectHost(opts.host);
|
|
69
|
+
const bbPrAvailable = host === "bitbucket" && (opts.pr != null || process.env.BITBUCKET_PR_ID);
|
|
70
|
+
const glMrAvailable = host === "gitlab" && (opts.pr != null || process.env.CI_MERGE_REQUEST_IID);
|
|
81
71
|
let diffText;
|
|
82
72
|
let changeDescription;
|
|
83
73
|
let prRef = null;
|
|
@@ -100,10 +90,8 @@ program
|
|
|
100
90
|
changeDescription = `PR #${bbRef.prId} in ${bbRef.workspace}/${bbRef.repoSlug}`;
|
|
101
91
|
}
|
|
102
92
|
else if (opts.pr != null) {
|
|
103
|
-
const slug = opts.repo
|
|
104
|
-
|
|
105
|
-
throw new Error("Pass --repo owner/name or set GITHUB_REPOSITORY when using --pr.");
|
|
106
|
-
octokit = makeOctokit(process.env.GITHUB_TOKEN);
|
|
93
|
+
const slug = resolveGhRepoSlug(opts.repo);
|
|
94
|
+
octokit = makeOctokit(resolveGhToken());
|
|
107
95
|
prRef = { ...parseRepoSlug(slug), pull_number: opts.pr };
|
|
108
96
|
log(`Fetching diff for ${slug}#${opts.pr}…`);
|
|
109
97
|
diffText = await getPrDiff(octokit, prRef);
|
|
@@ -142,18 +130,89 @@ program
|
|
|
142
130
|
log(`Warning: could not scan won’t-fix replies: ${e instanceof Error ? e.message : e}`);
|
|
143
131
|
}
|
|
144
132
|
const suppressedIds = new Set([...suppressions.ids, ...ephemeral]);
|
|
133
|
+
// Only files changed since the last reviewed commit go back through the
|
|
134
|
+
// LLM; everything else carries its prior findings forward untouched.
|
|
135
|
+
// Recovered from the state blob embedded in the last summary comment/review
|
|
136
|
+
// (see review-state.ts) — the only thing that survives a fresh CI checkout.
|
|
137
|
+
let changedFiles;
|
|
138
|
+
const carryForwardFindings = [];
|
|
139
|
+
let currentHeadSha;
|
|
145
140
|
if (opts.post) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
141
|
+
try {
|
|
142
|
+
if (glRef && glDiffRefs) {
|
|
143
|
+
currentHeadSha = glDiffRefs.head_sha;
|
|
144
|
+
const prev = await getGlReviewState(glRef);
|
|
145
|
+
if (prev) {
|
|
146
|
+
for (const f of prev.findings)
|
|
147
|
+
if (f.id)
|
|
148
|
+
previousIds.add(f.id);
|
|
149
|
+
if (prev.headSha !== currentHeadSha) {
|
|
150
|
+
changedFiles = await listGlChangedFiles(glRef, prev.headSha, currentHeadSha);
|
|
151
|
+
for (const f of prev.findings) {
|
|
152
|
+
(changedFiles.has(f.file) ? previousFindings : carryForwardFindings).push(f);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
changedFiles = new Set();
|
|
157
|
+
carryForwardFindings.push(...prev.findings);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
for (const id of await listGlFindingIds(glRef))
|
|
162
|
+
previousIds.add(id);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else if (bbRef) {
|
|
166
|
+
currentHeadSha = await getBbPrHeadSha(bbRef);
|
|
167
|
+
const prev = await getBbReviewState(bbRef);
|
|
168
|
+
if (prev) {
|
|
169
|
+
for (const f of prev.findings)
|
|
170
|
+
if (f.id)
|
|
171
|
+
previousIds.add(f.id);
|
|
172
|
+
if (prev.headSha !== currentHeadSha) {
|
|
173
|
+
changedFiles = await listBbChangedFiles(bbRef, prev.headSha, currentHeadSha);
|
|
174
|
+
for (const f of prev.findings) {
|
|
175
|
+
(changedFiles.has(f.file) ? previousFindings : carryForwardFindings).push(f);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
changedFiles = new Set();
|
|
180
|
+
carryForwardFindings.push(...prev.findings);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
for (const id of await listBbFindingIds(bbRef))
|
|
185
|
+
previousIds.add(id);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (prRef && octokit) {
|
|
189
|
+
currentHeadSha = await getPrHeadSha(octokit, prRef);
|
|
190
|
+
const prev = await getReviewState(octokit, prRef);
|
|
191
|
+
if (prev) {
|
|
192
|
+
for (const f of prev.findings)
|
|
193
|
+
if (f.id)
|
|
194
|
+
previousIds.add(f.id);
|
|
195
|
+
if (prev.headSha !== currentHeadSha) {
|
|
196
|
+
changedFiles = await listChangedFiles(octokit, prRef, prev.headSha, currentHeadSha);
|
|
197
|
+
for (const f of prev.findings) {
|
|
198
|
+
(changedFiles.has(f.file) ? previousFindings : carryForwardFindings).push(f);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
changedFiles = new Set();
|
|
203
|
+
carryForwardFindings.push(...prev.findings);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
for (const id of await listPostedFindingIds(octokit, prRef))
|
|
208
|
+
previousIds.add(id);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
153
211
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
212
|
+
catch (e) {
|
|
213
|
+
log(`Warning: incremental diff unavailable, falling back to a full review: ${e instanceof Error ? e.message : e}`);
|
|
214
|
+
changedFiles = undefined;
|
|
215
|
+
carryForwardFindings.length = 0;
|
|
157
216
|
}
|
|
158
217
|
}
|
|
159
218
|
const result = await runReview({
|
|
@@ -165,6 +224,8 @@ program
|
|
|
165
224
|
previousIds,
|
|
166
225
|
previousFindings,
|
|
167
226
|
suppressedIds,
|
|
227
|
+
changedFiles,
|
|
228
|
+
carryForwardFindings,
|
|
168
229
|
log,
|
|
169
230
|
});
|
|
170
231
|
if (config.write_suppressions && ephemeral.size) {
|
|
@@ -186,10 +247,10 @@ program
|
|
|
186
247
|
await postGlReview({ ref: glRef, diffRefs: glDiffRefs, result, failed, log });
|
|
187
248
|
}
|
|
188
249
|
else if (bbRef) {
|
|
189
|
-
await postBbReview({ ref: bbRef, result, failed, log });
|
|
250
|
+
await postBbReview({ ref: bbRef, result, failed, headSha: currentHeadSha, log });
|
|
190
251
|
}
|
|
191
252
|
else if (prRef && octokit) {
|
|
192
|
-
const headSha = await getPrHeadSha(octokit, prRef);
|
|
253
|
+
const headSha = currentHeadSha ?? (await getPrHeadSha(octokit, prRef));
|
|
193
254
|
await postReview({ octokit, pr: prRef, headSha, result, failed, log });
|
|
194
255
|
}
|
|
195
256
|
else {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|