secondpair 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +4 -14
- package/dist/bitbucket/comments.js +5 -36
- package/dist/bitbucket/comments.js.map +1 -1
- package/dist/cli.js +17 -29
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.js +66 -4
- package/dist/config.js.map +1 -1
- package/dist/finding-id.d.ts +1 -1
- package/dist/finding-id.js +4 -4
- 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 +4 -2
- package/dist/github/comments.js +8 -1
- 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 +1 -9
- package/dist/gitlab/comments.js +1 -20
- 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 +6 -0
- package/dist/llm/prompt.js +42 -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.d.ts +16 -0
- package/dist/review.js +80 -19
- 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 +16 -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,17 +1,5 @@
|
|
|
1
1
|
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;
|
|
2
|
+
import { type BbRef } from "./auth.js";
|
|
15
3
|
/** Fetch the unified diff of a Bitbucket Cloud pull request. */
|
|
16
4
|
export declare function getBbPrDiff(ref: BbRef): Promise<string>;
|
|
17
5
|
interface BbComment {
|
|
@@ -34,7 +22,9 @@ export declare function listBbWontFixFindingIds(ref: BbRef): Promise<Set<string>
|
|
|
34
22
|
export declare function resolveBbCommentsForIds(_ref: BbRef, _ids: Iterable<string>, log?: (msg: string) => void): Promise<number>;
|
|
35
23
|
/** Bitbucket markdown has no GitHub suggestion blocks — render fixes as code fences. */
|
|
36
24
|
export declare function formatBbCommentBody(f: Finding): string;
|
|
37
|
-
export declare function formatBbSummaryBody(result: ReviewResult
|
|
25
|
+
export declare function formatBbSummaryBody(result: ReviewResult & {
|
|
26
|
+
highLevelReview?: boolean;
|
|
27
|
+
}, failed: boolean): string;
|
|
38
28
|
export interface PostBbReviewOptions {
|
|
39
29
|
ref: BbRef;
|
|
40
30
|
result: ReviewResult;
|
|
@@ -1,43 +1,8 @@
|
|
|
1
1
|
import { collectIdsFromBodies, embedFindingId, parseFindingId } from "../finding-id.js";
|
|
2
2
|
import { AGENT_MARKER, SEVERITY_EMOJI } from "../github/comments.js";
|
|
3
3
|
import { collectWontFixIds } from "../suppress-signals.js";
|
|
4
|
+
import { resolveBbAuthHeader } from "./auth.js";
|
|
4
5
|
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
6
|
async function bbFetch(url, init = {}) {
|
|
42
7
|
const res = await fetch(url, {
|
|
43
8
|
...init,
|
|
@@ -122,6 +87,9 @@ export function formatBbSummaryBody(result, failed) {
|
|
|
122
87
|
: Object.entries(counts)
|
|
123
88
|
.map(([sev, n]) => `${SEVERITY_EMOJI[sev]} ${n} ${sev}`)
|
|
124
89
|
.join(" · ");
|
|
90
|
+
const highLevelLine = result.highLevelReview
|
|
91
|
+
? "\n⚠️ **Large diff** — high-level review only (critical/high severity). Consider splitting this PR."
|
|
92
|
+
: "";
|
|
125
93
|
const recon = result.reconciliation;
|
|
126
94
|
const reconLine = recon
|
|
127
95
|
? `\n_Lifecycle:_ ${recon.new.length} new · ${recon.persistent.length} persistent · ${recon.resolved.length} resolved · ${recon.suppressed.length} suppressed`
|
|
@@ -132,6 +100,7 @@ export function formatBbSummaryBody(result, failed) {
|
|
|
132
100
|
result.summary.trim(),
|
|
133
101
|
"",
|
|
134
102
|
countLine,
|
|
103
|
+
highLevelLine,
|
|
135
104
|
reconLine,
|
|
136
105
|
failed ? "\n❌ **Check failed**: findings at or above the configured severity threshold." : "",
|
|
137
106
|
AGENT_MARKER,
|
|
@@ -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 {
|
|
6
|
+
import { getBbPrDiff, listBbFindingIds, listBbWontFixFindingIds, postBbReview } from "./bitbucket/comments.js";
|
|
7
|
+
import { resolveBbRef } from "./bitbucket/auth.js";
|
|
8
|
+
import { getGlMrDiff, listGlFindingIds, listGlWontFixFindingIds, postGlReview } from "./gitlab/comments.js";
|
|
9
|
+
import { resolveGlRef } from "./gitlab/auth.js";
|
|
10
|
+
import { applyCliOverrides, loadConfig } from "./config.js";
|
|
9
11
|
import { getPrDiff, getPrHeadSha, makeOctokit, parseRepoSlug } from "./diff/github.js";
|
|
12
|
+
import { resolveGhRepoSlug, resolveGhToken } from "./github/auth.js";
|
|
10
13
|
import { getLocalDiff } from "./diff/local.js";
|
|
11
14
|
import { 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);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
12
12
|
context_token_budget: z.ZodOptional<z.ZodNumber>;
|
|
13
13
|
context_snippets: z.ZodOptional<z.ZodNumber>;
|
|
14
14
|
custom_instructions: z.ZodOptional<z.ZodString>;
|
|
15
|
+
custom_instructions_file: z.ZodOptional<z.ZodString>;
|
|
15
16
|
categories: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
|
|
16
17
|
[x: string]: string;
|
|
17
18
|
}> & z.core.$partial, z.ZodBoolean>>;
|
|
@@ -24,10 +25,19 @@ declare const configSchema: z.ZodObject<{
|
|
|
24
25
|
redact_secrets: z.ZodOptional<z.ZodBoolean>;
|
|
25
26
|
redact_patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
26
27
|
write_suppressions: z.ZodOptional<z.ZodBoolean>;
|
|
28
|
+
huge_pr_token_threshold: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
29
|
+
signal_detector: z.ZodOptional<z.ZodBoolean>;
|
|
30
|
+
parallel_agents: z.ZodOptional<z.ZodBoolean>;
|
|
27
31
|
}, z.core.$strict>;
|
|
28
32
|
export declare const CONFIG_FILENAME = ".pr-review.yml";
|
|
33
|
+
export declare const SECONDPAIR_DIR = ".secondpair";
|
|
29
34
|
/** Load .pr-review.yml from the repo root, merged over defaults. */
|
|
30
35
|
export declare function loadConfig(cwd: string, configPath?: string): Promise<ReviewConfig>;
|
|
31
36
|
export declare function mergeConfig(partial: z.infer<typeof configSchema>): ReviewConfig;
|
|
37
|
+
/** Apply CLI-flag overrides (e.g. --fail-on, --write-suppressions) onto a loaded config. */
|
|
38
|
+
export declare function applyCliOverrides(config: ReviewConfig, overrides: {
|
|
39
|
+
failOn?: string;
|
|
40
|
+
writeSuppressions?: boolean;
|
|
41
|
+
}): ReviewConfig;
|
|
32
42
|
/** True when the path matches repocairn's built-in ignores or this config's patterns. */
|
|
33
43
|
export declare function isIgnored(filePath: string, config: ReviewConfig): boolean;
|
package/dist/config.js
CHANGED
|
@@ -9,12 +9,13 @@ import { CATEGORIES, SEVERITIES } from "./types.js";
|
|
|
9
9
|
export { matchesGlob };
|
|
10
10
|
const defaultCategories = Object.fromEntries(CATEGORIES.map((c) => [c, true]));
|
|
11
11
|
export const DEFAULT_CONFIG = {
|
|
12
|
-
fail_on: "
|
|
12
|
+
fail_on: "off",
|
|
13
13
|
min_confidence: 0.5,
|
|
14
14
|
ignore: [],
|
|
15
15
|
context_token_budget: 8000,
|
|
16
16
|
context_snippets: 3,
|
|
17
17
|
custom_instructions: "",
|
|
18
|
+
custom_instructions_file: ".pr-review-instructions.md",
|
|
18
19
|
categories: defaultCategories,
|
|
19
20
|
temperature: null,
|
|
20
21
|
limits: { max_findings_per_file: 5, max_total: 30 },
|
|
@@ -22,15 +23,19 @@ export const DEFAULT_CONFIG = {
|
|
|
22
23
|
redact_secrets: true,
|
|
23
24
|
redact_patterns: [],
|
|
24
25
|
write_suppressions: false,
|
|
26
|
+
huge_pr_token_threshold: 120_000,
|
|
27
|
+
signal_detector: true,
|
|
28
|
+
parallel_agents: true,
|
|
25
29
|
};
|
|
26
30
|
const configSchema = z
|
|
27
31
|
.object({
|
|
28
|
-
fail_on: z.enum(SEVERITIES).optional(),
|
|
32
|
+
fail_on: z.enum([...SEVERITIES, "off"]).optional(),
|
|
29
33
|
min_confidence: z.number().min(0).max(1).optional(),
|
|
30
34
|
ignore: z.array(z.string()).optional(),
|
|
31
35
|
context_token_budget: z.number().int().positive().optional(),
|
|
32
36
|
context_snippets: z.number().int().min(0).optional(),
|
|
33
37
|
custom_instructions: z.string().optional(),
|
|
38
|
+
custom_instructions_file: z.string().optional(),
|
|
34
39
|
categories: z.partialRecord(z.enum(CATEGORIES), z.boolean()).optional(),
|
|
35
40
|
temperature: z.number().min(0).max(2).optional(),
|
|
36
41
|
limits: z
|
|
@@ -44,16 +49,60 @@ const configSchema = z
|
|
|
44
49
|
redact_secrets: z.boolean().optional(),
|
|
45
50
|
redact_patterns: z.array(z.string()).optional(),
|
|
46
51
|
write_suppressions: z.boolean().optional(),
|
|
52
|
+
huge_pr_token_threshold: z.number().int().positive().nullable().optional(),
|
|
53
|
+
signal_detector: z.boolean().optional(),
|
|
54
|
+
parallel_agents: z.boolean().optional(),
|
|
47
55
|
})
|
|
48
56
|
.strict();
|
|
49
57
|
export const CONFIG_FILENAME = ".pr-review.yml";
|
|
58
|
+
export const SECONDPAIR_DIR = ".secondpair";
|
|
59
|
+
const SECONDPAIR_DIR_CANDIDATES = ["instructions.mdc", "instructions.md"];
|
|
60
|
+
/**
|
|
61
|
+
* `.secondpair/instructions.mdc` or `.secondpair/instructions.md` — same
|
|
62
|
+
* convention as `.claude`/`.cursor`/`.repocairn`. Checked before
|
|
63
|
+
* custom_instructions_file; wins over it when both exist.
|
|
64
|
+
*/
|
|
65
|
+
async function findDirInstructions(cwd) {
|
|
66
|
+
for (const name of SECONDPAIR_DIR_CANDIDATES) {
|
|
67
|
+
const file = path.join(cwd, SECONDPAIR_DIR, name);
|
|
68
|
+
if (existsSync(file))
|
|
69
|
+
return file;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Resolves the effective custom_instructions content, none of it mandatory:
|
|
75
|
+
* 1. `.secondpair/instructions.mdc|.md` (repo-standard location, highest precedence)
|
|
76
|
+
* 2. `custom_instructions_file` (repo-relative path, default `.pr-review-instructions.md`)
|
|
77
|
+
* 3. inline `custom_instructions` in .pr-review.yml (fallback, used as-is if neither file exists)
|
|
78
|
+
* This only ever feeds the CUSTOM REVIEW INSTRUCTIONS prompt section — it
|
|
79
|
+
* never touches REVIEW_SYSTEM_PROMPT, so it can't override review behavior,
|
|
80
|
+
* only add project-specific guidance on top of it.
|
|
81
|
+
*/
|
|
82
|
+
async function applyInstructionsFile(cwd, config) {
|
|
83
|
+
const dirFile = await findDirInstructions(cwd);
|
|
84
|
+
if (dirFile) {
|
|
85
|
+
const content = (await readFile(dirFile, "utf8")).trim();
|
|
86
|
+
if (content)
|
|
87
|
+
return { ...config, custom_instructions: content };
|
|
88
|
+
}
|
|
89
|
+
if (!config.custom_instructions_file)
|
|
90
|
+
return config;
|
|
91
|
+
const file = path.isAbsolute(config.custom_instructions_file)
|
|
92
|
+
? config.custom_instructions_file
|
|
93
|
+
: path.join(cwd, config.custom_instructions_file);
|
|
94
|
+
if (!existsSync(file))
|
|
95
|
+
return config;
|
|
96
|
+
const content = (await readFile(file, "utf8")).trim();
|
|
97
|
+
return content ? { ...config, custom_instructions: content } : config;
|
|
98
|
+
}
|
|
50
99
|
/** Load .pr-review.yml from the repo root, merged over defaults. */
|
|
51
100
|
export async function loadConfig(cwd, configPath) {
|
|
52
101
|
const file = configPath ?? path.join(cwd, CONFIG_FILENAME);
|
|
53
102
|
if (!existsSync(file)) {
|
|
54
103
|
if (configPath)
|
|
55
104
|
throw new Error(`Config file not found: ${configPath}`);
|
|
56
|
-
return { ...DEFAULT_CONFIG };
|
|
105
|
+
return applyInstructionsFile(cwd, { ...DEFAULT_CONFIG });
|
|
57
106
|
}
|
|
58
107
|
const raw = YAML.parse(await readFile(file, "utf8")) ?? {};
|
|
59
108
|
const parsed = configSchema.safeParse(raw);
|
|
@@ -64,7 +113,7 @@ export async function loadConfig(cwd, configPath) {
|
|
|
64
113
|
throw new Error(`Invalid ${path.basename(file)}:\n${issues}`);
|
|
65
114
|
}
|
|
66
115
|
compileRedactPatterns(parsed.data.redact_patterns ?? []);
|
|
67
|
-
return mergeConfig(parsed.data);
|
|
116
|
+
return applyInstructionsFile(cwd, mergeConfig(parsed.data));
|
|
68
117
|
}
|
|
69
118
|
export function mergeConfig(partial) {
|
|
70
119
|
return {
|
|
@@ -80,6 +129,19 @@ export function mergeConfig(partial) {
|
|
|
80
129
|
write_suppressions: partial.write_suppressions ?? DEFAULT_CONFIG.write_suppressions,
|
|
81
130
|
};
|
|
82
131
|
}
|
|
132
|
+
/** Apply CLI-flag overrides (e.g. --fail-on, --write-suppressions) onto a loaded config. */
|
|
133
|
+
export function applyCliOverrides(config, overrides) {
|
|
134
|
+
const next = { ...config };
|
|
135
|
+
if (overrides.writeSuppressions)
|
|
136
|
+
next.write_suppressions = true;
|
|
137
|
+
if (overrides.failOn) {
|
|
138
|
+
if (overrides.failOn !== "off" && !SEVERITIES.includes(overrides.failOn)) {
|
|
139
|
+
throw new Error(`--fail-on must be one of: ${SEVERITIES.join(", ")}, off`);
|
|
140
|
+
}
|
|
141
|
+
next.fail_on = overrides.failOn;
|
|
142
|
+
}
|
|
143
|
+
return next;
|
|
144
|
+
}
|
|
83
145
|
/** True when the path matches repocairn's built-in ignores or this config's patterns. */
|
|
84
146
|
export function isIgnored(filePath, config) {
|
|
85
147
|
return matchesIgnorePatterns(filePath, config.ignore);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,IAAI,qBAAqB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/finding-id.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Finding } from "./types.js";
|
|
2
|
-
export declare const FINDING_ID_MARKER_PREFIX = "
|
|
2
|
+
export declare const FINDING_ID_MARKER_PREFIX = "[secondpair-id]: # (pr-review-id:";
|
|
3
3
|
export declare const FINDING_ID_RE: RegExp;
|
|
4
4
|
/** Normalize title so minor wording churn still often matches. */
|
|
5
5
|
export declare function normalizeTitle(title: string): string;
|
package/dist/finding-id.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
export const FINDING_ID_MARKER_PREFIX = "
|
|
3
|
-
export const FINDING_ID_RE =
|
|
2
|
+
export const FINDING_ID_MARKER_PREFIX = "[secondpair-id]: # (pr-review-id:";
|
|
3
|
+
export const FINDING_ID_RE = /\[secondpair-id\]:\s*#\s*\(pr-review-id:\s*([a-f0-9]+)\)/i;
|
|
4
4
|
/** Words that add churn without distinguishing the finding. */
|
|
5
5
|
const STOPWORDS = new Set([
|
|
6
6
|
"a", "an", "the", "to", "of", "in", "on", "for", "and", "or", "is", "are", "be",
|
|
@@ -38,9 +38,9 @@ export function withFindingId(f) {
|
|
|
38
38
|
}
|
|
39
39
|
export function embedFindingId(body, id) {
|
|
40
40
|
if (FINDING_ID_RE.test(body)) {
|
|
41
|
-
return body.replace(FINDING_ID_RE, `${FINDING_ID_MARKER_PREFIX} ${id}
|
|
41
|
+
return body.replace(FINDING_ID_RE, `${FINDING_ID_MARKER_PREFIX} ${id})`);
|
|
42
42
|
}
|
|
43
|
-
return `${body.trimEnd()}\n\n${FINDING_ID_MARKER_PREFIX} ${id}
|
|
43
|
+
return `${body.trimEnd()}\n\n${FINDING_ID_MARKER_PREFIX} ${id})\n`;
|
|
44
44
|
}
|
|
45
45
|
export function parseFindingId(body) {
|
|
46
46
|
return FINDING_ID_RE.exec(body)?.[1] ?? null;
|
package/dist/finding-id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finding-id.js","sourceRoot":"","sources":["../src/finding-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,MAAM,wBAAwB,GAAG,
|
|
1
|
+
{"version":3,"file":"finding-id.js","sourceRoot":"","sources":["../src/finding-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Resolve a GitHub token from the environment. */
|
|
2
|
+
export declare function resolveGhToken(): string;
|
|
3
|
+
/** Resolve owner/name from an explicit --repo flag or the GITHUB_REPOSITORY env var. */
|
|
4
|
+
export declare function resolveGhRepoSlug(explicit: string | undefined): string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Resolve a GitHub token from the environment. */
|
|
2
|
+
export function resolveGhToken() {
|
|
3
|
+
const token = process.env.GITHUB_TOKEN;
|
|
4
|
+
if (!token) {
|
|
5
|
+
throw new Error("A GitHub token is required (GITHUB_TOKEN env var).");
|
|
6
|
+
}
|
|
7
|
+
return token;
|
|
8
|
+
}
|
|
9
|
+
/** Resolve owner/name from an explicit --repo flag or the GITHUB_REPOSITORY env var. */
|
|
10
|
+
export function resolveGhRepoSlug(explicit) {
|
|
11
|
+
const slug = explicit ?? process.env.GITHUB_REPOSITORY;
|
|
12
|
+
if (!slug)
|
|
13
|
+
throw new Error("Pass --repo owner/name or set GITHUB_REPOSITORY when using --pr.");
|
|
14
|
+
return slug;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=auth.js.map
|