@tokenfactory/acc-runner 0.30.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +19 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +169 -8
- package/dist/doctor.js.map +1 -1
- package/dist/engines/claude-code.d.ts +9 -0
- package/dist/engines/claude-code.d.ts.map +1 -0
- package/dist/engines/claude-code.js +95 -0
- package/dist/engines/claude-code.js.map +1 -0
- package/dist/engines/codex.d.ts +27 -0
- package/dist/engines/codex.d.ts.map +1 -0
- package/dist/engines/codex.js +178 -0
- package/dist/engines/codex.js.map +1 -0
- package/dist/engines/registry.d.ts +18 -0
- package/dist/engines/registry.d.ts.map +1 -0
- package/dist/engines/registry.js +26 -0
- package/dist/engines/registry.js.map +1 -0
- package/dist/engines/types.d.ts +73 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +2 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/failure-classifier.d.ts +32 -1
- package/dist/failure-classifier.d.ts.map +1 -1
- package/dist/failure-classifier.js +193 -1
- package/dist/failure-classifier.js.map +1 -1
- package/dist/git.d.ts +10 -0
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +6 -0
- package/dist/git.js.map +1 -1
- package/dist/login.d.ts +17 -0
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +22 -1
- package/dist/login.js.map +1 -1
- package/dist/pr-body.d.ts +53 -0
- package/dist/pr-body.d.ts.map +1 -0
- package/dist/pr-body.js +154 -0
- package/dist/pr-body.js.map +1 -0
- package/dist/prepr-gate.d.ts +132 -2
- package/dist/prepr-gate.d.ts.map +1 -1
- package/dist/prepr-gate.js +260 -9
- package/dist/prepr-gate.js.map +1 -1
- package/dist/provider-auth.d.ts +120 -0
- package/dist/provider-auth.d.ts.map +1 -0
- package/dist/provider-auth.js +184 -0
- package/dist/provider-auth.js.map +1 -0
- package/dist/review-diff-guard.d.ts +12 -0
- package/dist/review-diff-guard.d.ts.map +1 -0
- package/dist/review-diff-guard.js +52 -0
- package/dist/review-diff-guard.js.map +1 -0
- package/dist/review-worktree-cleanup.d.ts +73 -0
- package/dist/review-worktree-cleanup.d.ts.map +1 -0
- package/dist/review-worktree-cleanup.js +103 -0
- package/dist/review-worktree-cleanup.js.map +1 -0
- package/dist/runtime/reviewer.d.ts.map +1 -1
- package/dist/runtime/reviewer.js +72 -29
- package/dist/runtime/reviewer.js.map +1 -1
- package/dist/runtime/worktree.d.ts.map +1 -1
- package/dist/runtime/worktree.js +8 -3
- package/dist/runtime/worktree.js.map +1 -1
- package/dist/task-runner.d.ts +1 -8
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +65 -66
- package/dist/task-runner.js.map +1 -1
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +30 -3
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
package/dist/git.d.ts
CHANGED
|
@@ -21,6 +21,16 @@ export interface GitRunner {
|
|
|
21
21
|
sha: string;
|
|
22
22
|
ts: string;
|
|
23
23
|
} | null>;
|
|
24
|
+
/**
|
|
25
|
+
* V96 (R4): the unified diff of `head` (default HEAD) against `baseRef`,
|
|
26
|
+
* using a three-dot (merge-base) range so it matches what GitHub renders for
|
|
27
|
+
* the PR. Powers the auto-generated PR-body "Files changed" table
|
|
28
|
+
* (pr-body.ts) at PR-open, so the body can never disagree with the pushed
|
|
29
|
+
* diff. Optional on the interface so existing GitRunner test stubs keep
|
|
30
|
+
* compiling; the PR-open caller guards the call with `?.` and falls back to
|
|
31
|
+
* the raw report body when it's absent or throws.
|
|
32
|
+
*/
|
|
33
|
+
diff?(repoPath: string, baseRef: string, head?: string): Promise<string>;
|
|
24
34
|
}
|
|
25
35
|
export type PushErrorKind = "transient" | "terminal";
|
|
26
36
|
/**
|
package/dist/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,kBAAkB,QAAsC,CAAC;AAEtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C;;;;;;;;;;OAUG;IACH,WAAW,CAAC,CACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,kBAAkB,QAAsC,CAAC;AAEtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C;;;;;;;;;;OAUG;IACH,WAAW,CAAC,CACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC/C;;;;;;;;OAQG;IACH,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1E;AAMD,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;AAErD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CA0B7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,wCAAwC;IACxC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAQD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC3B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,eAAO,MAAM,GAAG,EAAE,SAwCjB,CAAC"}
|
package/dist/git.js
CHANGED
|
@@ -123,5 +123,11 @@ export const git = {
|
|
|
123
123
|
return null;
|
|
124
124
|
return { sha: sha.trim(), ts: (ts ?? "").trim() };
|
|
125
125
|
},
|
|
126
|
+
async diff(repoPath, baseRef, head = "HEAD") {
|
|
127
|
+
// Three-dot range = diff of `head` against the merge-base with `baseRef`,
|
|
128
|
+
// which is exactly the change set GitHub attributes to the PR.
|
|
129
|
+
const { stdout } = await run(repoPath, ["diff", `${baseRef}...${head}`]);
|
|
130
|
+
return stdout;
|
|
131
|
+
},
|
|
126
132
|
};
|
|
127
133
|
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,EAA2C,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,uEAAuE;AACvE,wEAAwE;AACxE,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,mCAAmC,CAAC;AAEtE,MAAM,UAAU,WAAW,CAAC,IAA+B;IACzD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
package/dist/login.d.ts
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
import type { RunnerCaps } from "./types.js";
|
|
2
2
|
export declare const RUNNER_CAPS: RunnerCaps;
|
|
3
|
+
/**
|
|
4
|
+
* Repo-scoped routing — build the register_runner `p_caps` payload with
|
|
5
|
+
* the runner's served-repo scope folded into the `repos` key. The
|
|
6
|
+
* server reads acc.runners.caps.repos via servedReposFromCaps() to route
|
|
7
|
+
* repo-pinned tasks; including the scope here makes it correct from the
|
|
8
|
+
* very first heartbeat (before watch.ts's set_runner_repos refresh runs),
|
|
9
|
+
* so a freshly-registered runner is never briefly repo-blind. Mirrors the
|
|
10
|
+
* jsonb shape the server expects: a string[] of "owner/name" slugs.
|
|
11
|
+
*
|
|
12
|
+
* An empty / undefined scope yields `repos: []`, which servedReposFromCaps
|
|
13
|
+
* treats identically to "absent" — serve every repo, the single-repo
|
|
14
|
+
* default. The capability booleans are preserved verbatim, so this is a
|
|
15
|
+
* pure superset of the previous RUNNER_CAPS payload.
|
|
16
|
+
*/
|
|
17
|
+
export declare function runnerCapsWithRepos(repos: readonly string[] | undefined): RunnerCaps & {
|
|
18
|
+
repos: string[];
|
|
19
|
+
};
|
|
3
20
|
export declare function machineIdentity(): string;
|
|
4
21
|
export declare function detectInstalledModels(): Promise<string[]>;
|
|
5
22
|
export interface LoginOptions {
|
package/dist/login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAGV,UAAU,EACX,MAAM,YAAY,CAAC;AAMpB,eAAO,MAAM,WAAW,EAAE,UAOzB,CAAC;AAEF,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAGD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAe/D;AAiBD,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAGV,UAAU,EACX,MAAM,YAAY,CAAC;AAMpB,eAAO,MAAM,WAAW,EAAE,UAOzB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACnC,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAElC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAGD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAe/D;AAiBD,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqF5E"}
|
package/dist/login.js
CHANGED
|
@@ -26,6 +26,23 @@ export const RUNNER_CAPS = {
|
|
|
26
26
|
readFiles: true,
|
|
27
27
|
executeQueue: true,
|
|
28
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Repo-scoped routing — build the register_runner `p_caps` payload with
|
|
31
|
+
* the runner's served-repo scope folded into the `repos` key. The
|
|
32
|
+
* server reads acc.runners.caps.repos via servedReposFromCaps() to route
|
|
33
|
+
* repo-pinned tasks; including the scope here makes it correct from the
|
|
34
|
+
* very first heartbeat (before watch.ts's set_runner_repos refresh runs),
|
|
35
|
+
* so a freshly-registered runner is never briefly repo-blind. Mirrors the
|
|
36
|
+
* jsonb shape the server expects: a string[] of "owner/name" slugs.
|
|
37
|
+
*
|
|
38
|
+
* An empty / undefined scope yields `repos: []`, which servedReposFromCaps
|
|
39
|
+
* treats identically to "absent" — serve every repo, the single-repo
|
|
40
|
+
* default. The capability booleans are preserved verbatim, so this is a
|
|
41
|
+
* pure superset of the previous RUNNER_CAPS payload.
|
|
42
|
+
*/
|
|
43
|
+
export function runnerCapsWithRepos(repos) {
|
|
44
|
+
return { ...RUNNER_CAPS, repos: repos ? [...repos] : [] };
|
|
45
|
+
}
|
|
29
46
|
export function machineIdentity() {
|
|
30
47
|
return `${process.platform}-${process.arch}-${os.hostname()}`;
|
|
31
48
|
}
|
|
@@ -120,7 +137,11 @@ export async function loginCommand(options = {}) {
|
|
|
120
137
|
p_owner: exchanged.email ?? exchanged.user_id,
|
|
121
138
|
p_machine: machine,
|
|
122
139
|
p_models: models,
|
|
123
|
-
|
|
140
|
+
// Repo-scoped routing: publish the served-repo scope on the very
|
|
141
|
+
// first register so the server's repo-aware router has it before
|
|
142
|
+
// watch.ts's set_runner_repos refresh runs. cfg.repos is resolved
|
|
143
|
+
// from ACC_RUNNER_REPOS / config.json `repos` by loadConfig().
|
|
144
|
+
p_caps: runnerCapsWithRepos(cfg.repos),
|
|
124
145
|
p_version: PACKAGE_VERSION,
|
|
125
146
|
});
|
|
126
147
|
if (error) {
|
package/dist/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V96 (R4) — PR-body "Files changed" table, auto-generated from the actual diff.
|
|
3
|
+
*
|
|
4
|
+
* The author Claude writes a free-text report that becomes the PR body. When
|
|
5
|
+
* that report hand-lists the files it changed, the list drifts from reality (a
|
|
6
|
+
* file dropped during rework, a stray edit never mentioned) and the reviewer is
|
|
7
|
+
* handed a body that contradicts the diff. This module generates the
|
|
8
|
+
* Files-changed table FROM the diff at PR-open time, so the body and the diff
|
|
9
|
+
* can never disagree: a hand-written "## Files changed" section is replaced with
|
|
10
|
+
* the generated one; if none exists it is appended.
|
|
11
|
+
*
|
|
12
|
+
* Pure + dependency-free: `parseDiffFileStats` turns a unified diff into
|
|
13
|
+
* per-file add/remove counts, `renderFilesChangedTable` renders the markdown,
|
|
14
|
+
* `composePrBody` splices it into the report. The caller (runner PR-open path)
|
|
15
|
+
* supplies the diff it computed for the pushed branch.
|
|
16
|
+
*/
|
|
17
|
+
/** Per-file line delta parsed from a unified diff. */
|
|
18
|
+
export interface FileDiffStat {
|
|
19
|
+
/** Repo-relative path (the post-image path; the old path for a pure delete). */
|
|
20
|
+
path: string;
|
|
21
|
+
/** Count of added content lines (`+`, excluding the `+++` header). */
|
|
22
|
+
added: number;
|
|
23
|
+
/** Count of removed content lines (`-`, excluding the `---` header). */
|
|
24
|
+
removed: number;
|
|
25
|
+
/** True when git rendered this file as binary (no line-level diff). */
|
|
26
|
+
binary: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** Heading used for the generated section. Matched case-insensitively on splice. */
|
|
29
|
+
export declare const FILES_CHANGED_HEADING = "## Files changed";
|
|
30
|
+
/**
|
|
31
|
+
* Parse a unified diff into per-file add/remove counts, in first-seen order.
|
|
32
|
+
* Recognizes standard `diff --git a/x b/y` records, `+++`/`---` path markers,
|
|
33
|
+
* binary-file markers, and counts only genuine content lines (`+`/`-`, never the
|
|
34
|
+
* `+++`/`---` headers). Renames/copies with no content change surface as a
|
|
35
|
+
* 0/0 (or binary) row so the table still lists them.
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseDiffFileStats(diff: string | null | undefined): FileDiffStat[];
|
|
38
|
+
/**
|
|
39
|
+
* Render the parsed stats as a markdown table under FILES_CHANGED_HEADING.
|
|
40
|
+
* Columns: File | +Added | -Removed. Binary files show `binary` in place of
|
|
41
|
+
* counts. An empty stat list renders a single "_(no file changes detected)_"
|
|
42
|
+
* note so the section is never a bare heading.
|
|
43
|
+
*/
|
|
44
|
+
export declare function renderFilesChangedTable(stats: FileDiffStat[]): string;
|
|
45
|
+
/**
|
|
46
|
+
* Splice the generated Files-changed table into a PR body. Any existing
|
|
47
|
+
* `## Files changed` section (up to the next `## ` heading or end of body) is
|
|
48
|
+
* REPLACED so a hand-written list can never contradict the diff; if there is no
|
|
49
|
+
* such section the generated table is appended. The generated table is always
|
|
50
|
+
* derived from `diff`, so the body and the diff are guaranteed consistent.
|
|
51
|
+
*/
|
|
52
|
+
export declare function composePrBody(report: string | null | undefined, diff: string | null | undefined): string;
|
|
53
|
+
//# sourceMappingURL=pr-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-body.d.ts","sourceRoot":"","sources":["../src/pr-body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAexD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,EAAE,CAqDlF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAkBrE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CA0BR"}
|
package/dist/pr-body.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V96 (R4) — PR-body "Files changed" table, auto-generated from the actual diff.
|
|
3
|
+
*
|
|
4
|
+
* The author Claude writes a free-text report that becomes the PR body. When
|
|
5
|
+
* that report hand-lists the files it changed, the list drifts from reality (a
|
|
6
|
+
* file dropped during rework, a stray edit never mentioned) and the reviewer is
|
|
7
|
+
* handed a body that contradicts the diff. This module generates the
|
|
8
|
+
* Files-changed table FROM the diff at PR-open time, so the body and the diff
|
|
9
|
+
* can never disagree: a hand-written "## Files changed" section is replaced with
|
|
10
|
+
* the generated one; if none exists it is appended.
|
|
11
|
+
*
|
|
12
|
+
* Pure + dependency-free: `parseDiffFileStats` turns a unified diff into
|
|
13
|
+
* per-file add/remove counts, `renderFilesChangedTable` renders the markdown,
|
|
14
|
+
* `composePrBody` splices it into the report. The caller (runner PR-open path)
|
|
15
|
+
* supplies the diff it computed for the pushed branch.
|
|
16
|
+
*/
|
|
17
|
+
/** Heading used for the generated section. Matched case-insensitively on splice. */
|
|
18
|
+
export const FILES_CHANGED_HEADING = "## Files changed";
|
|
19
|
+
/**
|
|
20
|
+
* Strip a git diff path prefix (`a/`, `b/`) and surrounding quotes. git quotes
|
|
21
|
+
* paths containing unusual bytes; we keep the quoted form readable by dropping
|
|
22
|
+
* the wrapping quotes only (the content is already the reviewer's concern).
|
|
23
|
+
*/
|
|
24
|
+
function cleanDiffPath(raw) {
|
|
25
|
+
let p = raw.trim();
|
|
26
|
+
if (p.startsWith('"') && p.endsWith('"') && p.length >= 2)
|
|
27
|
+
p = p.slice(1, -1);
|
|
28
|
+
if (p === "/dev/null")
|
|
29
|
+
return p;
|
|
30
|
+
if (p.startsWith("a/") || p.startsWith("b/"))
|
|
31
|
+
p = p.slice(2);
|
|
32
|
+
return p;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse a unified diff into per-file add/remove counts, in first-seen order.
|
|
36
|
+
* Recognizes standard `diff --git a/x b/y` records, `+++`/`---` path markers,
|
|
37
|
+
* binary-file markers, and counts only genuine content lines (`+`/`-`, never the
|
|
38
|
+
* `+++`/`---` headers). Renames/copies with no content change surface as a
|
|
39
|
+
* 0/0 (or binary) row so the table still lists them.
|
|
40
|
+
*/
|
|
41
|
+
export function parseDiffFileStats(diff) {
|
|
42
|
+
const text = (diff ?? "").replace(/\r\n/g, "\n");
|
|
43
|
+
const stats = [];
|
|
44
|
+
// Prefer the `b/` (post-image) path from the `diff --git` line; fall back to
|
|
45
|
+
// the `+++`/`---` markers so a diff without a `diff --git` header still parses.
|
|
46
|
+
const push = (path) => {
|
|
47
|
+
const stat = { path, added: 0, removed: 0, binary: false };
|
|
48
|
+
stats.push(stat);
|
|
49
|
+
return stat;
|
|
50
|
+
};
|
|
51
|
+
for (const line of text.split("\n")) {
|
|
52
|
+
const gitHeader = /^diff --git (.+) (.+)$/.exec(line);
|
|
53
|
+
if (gitHeader) {
|
|
54
|
+
// Use the post-image path (second operand) by default.
|
|
55
|
+
push(cleanDiffPath(gitHeader[2]));
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// The file currently being parsed is always the last pushed stat. Read it
|
|
59
|
+
// from the array (not a closure-assigned var) so control-flow narrowing to
|
|
60
|
+
// FileDiffStat survives the push() call.
|
|
61
|
+
const current = stats.length > 0 ? stats[stats.length - 1] : null;
|
|
62
|
+
if (!current) {
|
|
63
|
+
// A bare diff (no `diff --git`) — synthesize a record on the first path
|
|
64
|
+
// marker so `git diff --no-prefix` / partial fixtures still parse.
|
|
65
|
+
if (line.startsWith("+++ ") || line.startsWith("--- ")) {
|
|
66
|
+
const p = cleanDiffPath(line.slice(4));
|
|
67
|
+
if (p !== "/dev/null")
|
|
68
|
+
push(p);
|
|
69
|
+
}
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (line.startsWith("+++ ")) {
|
|
73
|
+
const p = cleanDiffPath(line.slice(4));
|
|
74
|
+
// A real post-image path overrides the `diff --git` guess (handles adds
|
|
75
|
+
// where the `a/` side is /dev/null).
|
|
76
|
+
if (p !== "/dev/null")
|
|
77
|
+
current.path = p;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (line.startsWith("--- ")) {
|
|
81
|
+
const p = cleanDiffPath(line.slice(4));
|
|
82
|
+
// Pure deletion: `+++ /dev/null` follows; keep the old path as the label.
|
|
83
|
+
if (p !== "/dev/null" && current.path === "/dev/null")
|
|
84
|
+
current.path = p;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (/^Binary files .* differ$/.test(line) || /^GIT binary patch$/.test(line)) {
|
|
88
|
+
current.binary = true;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (line.startsWith("+"))
|
|
92
|
+
current.added++;
|
|
93
|
+
else if (line.startsWith("-"))
|
|
94
|
+
current.removed++;
|
|
95
|
+
}
|
|
96
|
+
return stats;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Render the parsed stats as a markdown table under FILES_CHANGED_HEADING.
|
|
100
|
+
* Columns: File | +Added | -Removed. Binary files show `binary` in place of
|
|
101
|
+
* counts. An empty stat list renders a single "_(no file changes detected)_"
|
|
102
|
+
* note so the section is never a bare heading.
|
|
103
|
+
*/
|
|
104
|
+
export function renderFilesChangedTable(stats) {
|
|
105
|
+
const lines = [FILES_CHANGED_HEADING, ""];
|
|
106
|
+
if (stats.length === 0) {
|
|
107
|
+
lines.push("_(no file changes detected in the diff)_");
|
|
108
|
+
return lines.join("\n");
|
|
109
|
+
}
|
|
110
|
+
lines.push("| File | +Added | -Removed |");
|
|
111
|
+
lines.push("| --- | ---: | ---: |");
|
|
112
|
+
for (const s of stats) {
|
|
113
|
+
// Escape the pipe so a path containing `|` can't break the table.
|
|
114
|
+
const path = s.path.replace(/\|/g, "\\|");
|
|
115
|
+
if (s.binary) {
|
|
116
|
+
lines.push(`| \`${path}\` | binary | binary |`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
lines.push(`| \`${path}\` | ${s.added} | ${s.removed} |`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return lines.join("\n");
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Splice the generated Files-changed table into a PR body. Any existing
|
|
126
|
+
* `## Files changed` section (up to the next `## ` heading or end of body) is
|
|
127
|
+
* REPLACED so a hand-written list can never contradict the diff; if there is no
|
|
128
|
+
* such section the generated table is appended. The generated table is always
|
|
129
|
+
* derived from `diff`, so the body and the diff are guaranteed consistent.
|
|
130
|
+
*/
|
|
131
|
+
export function composePrBody(report, diff) {
|
|
132
|
+
const table = renderFilesChangedTable(parseDiffFileStats(diff));
|
|
133
|
+
const body = (report ?? "").replace(/\r\n/g, "\n").trimEnd();
|
|
134
|
+
// Find an existing "## Files changed" heading (case-insensitive, at line start).
|
|
135
|
+
const headingRe = /^##[ \t]+files changed[ \t]*$/im;
|
|
136
|
+
const match = headingRe.exec(body);
|
|
137
|
+
if (!match) {
|
|
138
|
+
const base = body.length > 0 ? `${body}\n\n` : "";
|
|
139
|
+
return `${base}${table}\n`;
|
|
140
|
+
}
|
|
141
|
+
const sectionStart = match.index;
|
|
142
|
+
// The replaced section runs until the next `## ` heading at line start.
|
|
143
|
+
const rest = body.slice(sectionStart + match[0].length);
|
|
144
|
+
const nextHeading = /^##[ \t]+\S/m.exec(rest);
|
|
145
|
+
const sectionEnd = nextHeading != null
|
|
146
|
+
? sectionStart + match[0].length + nextHeading.index
|
|
147
|
+
: body.length;
|
|
148
|
+
const before = body.slice(0, sectionStart).trimEnd();
|
|
149
|
+
const after = body.slice(sectionEnd).trimStart();
|
|
150
|
+
const head = before.length > 0 ? `${before}\n\n` : "";
|
|
151
|
+
const tail = after.length > 0 ? `\n\n${after}` : "";
|
|
152
|
+
return `${head}${table}${tail}\n`;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=pr-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-body.js","sourceRoot":"","sources":["../src/pr-body.ts"],"names":[],"mappings":"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"}
|
package/dist/prepr-gate.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type PreprGateName = "typecheck" | "lint" | "build" | "test" | "migration-lint";
|
|
1
|
+
export type PreprGateName = "nul-check" | "scope" | "typecheck" | "lint" | "build" | "test" | "migration-lint";
|
|
2
2
|
/**
|
|
3
3
|
* Run order. typecheck → lint → build → test mirrors the CLAUDE.md quality-gate
|
|
4
4
|
* order (cheapest / most-likely-to-fail first) so a broken worktree fails on
|
|
@@ -25,6 +25,28 @@ export interface PreprGateResult {
|
|
|
25
25
|
absent: PreprGateName[];
|
|
26
26
|
/** Set iff `ok === false`: the first gate that failed + its output tail. */
|
|
27
27
|
failure?: PreprGateFailure;
|
|
28
|
+
/**
|
|
29
|
+
* SHADOW MODE: set when the migration linter reported findings but the
|
|
30
|
+
* `migration_lint_blocking` knob is OFF — the PR was NOT blocked, but the
|
|
31
|
+
* output is surfaced so the caller can log it (advisory). `ok` stays `true`.
|
|
32
|
+
* Never set in blocking mode (there a finding lands in `failure` instead).
|
|
33
|
+
*/
|
|
34
|
+
migrationLintShadow?: {
|
|
35
|
+
exitCode: number | null;
|
|
36
|
+
/** Tail of the linter's findings output — log-safe. */
|
|
37
|
+
outputTail: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* V96 (R5) SHADOW MODE: set when staged files fell outside the task's
|
|
41
|
+
* `allowed` globs but the scope-enforce knob was OFF — the PR was NOT blocked
|
|
42
|
+
* (advisory only). `ok` stays `true`. In enforce mode the violation lands in
|
|
43
|
+
* `failure` (gate `scope`) instead and this is unset.
|
|
44
|
+
*/
|
|
45
|
+
scopeShadow?: {
|
|
46
|
+
/** Repo-relative staged paths that matched none of the allowed globs. */
|
|
47
|
+
offending: string[];
|
|
48
|
+
outputTail: string;
|
|
49
|
+
};
|
|
28
50
|
}
|
|
29
51
|
export interface PreprGateDeps {
|
|
30
52
|
/**
|
|
@@ -65,9 +87,117 @@ export interface PreprGateDeps {
|
|
|
65
87
|
exitCode: number | null;
|
|
66
88
|
output: string;
|
|
67
89
|
}>;
|
|
90
|
+
/**
|
|
91
|
+
* SHADOW-WEEK knob. When the migration linter reports a lint ERROR (exit ≠ 0):
|
|
92
|
+
* • `true` → block the PR (fail the gate) — the linter's output lands in
|
|
93
|
+
* the runner log via `failure.outputTail`.
|
|
94
|
+
* • `false` → advisory: log the findings (`migrationLintShadow`) but open
|
|
95
|
+
* the PR anyway.
|
|
96
|
+
* This mirrors the org `acc.org_settings.migration_lint_blocking` knob, which
|
|
97
|
+
* defaults to `false` (shadow). The task-runner resolves that org setting and
|
|
98
|
+
* passes it here; when unset (dep + `ACC_MIGRATION_LINT_BLOCKING` env both
|
|
99
|
+
* absent) this defaults to `false` (shadow) — defaults ship OFF; blocking is
|
|
100
|
+
* an explicit opt-in via the org knob or the env.
|
|
101
|
+
*/
|
|
102
|
+
migrationLintBlocking?: boolean;
|
|
103
|
+
/**
|
|
104
|
+
* V96 (R5): the task's `allowed` file globs. When non-empty, the scope check
|
|
105
|
+
* flags every staged file that matches NONE of these globs. Empty/undefined
|
|
106
|
+
* disables the scope check entirely (a task with no declared scope is not
|
|
107
|
+
* scope-checked). Never enforced-by-default — see `scopeEnforce`.
|
|
108
|
+
*/
|
|
109
|
+
allowedGlobs?: string[];
|
|
110
|
+
/**
|
|
111
|
+
* V96 (R5) knob (DEFAULT OFF). When true a scope violation FAILS the gate
|
|
112
|
+
* (HALT — no PR opened). When false/unset the violation is advisory
|
|
113
|
+
* (`scopeShadow`, PR still opens). Precedence mirrors migrationLintBlocking:
|
|
114
|
+
* explicit dep, else `ACC_PREPR_SCOPE_ENFORCE` env, else `false`.
|
|
115
|
+
*/
|
|
116
|
+
scopeEnforce?: boolean;
|
|
117
|
+
/**
|
|
118
|
+
* V96 (R4/R5): the staged files (repo-relative) this branch added/changed vs
|
|
119
|
+
* `baseRef`. Default: `git diff --name-only --diff-filter=ACMR <base>...HEAD`.
|
|
120
|
+
* Drives BOTH the NUL/binary check and the scope check. Omitted + no `baseRef`
|
|
121
|
+
* → both checks are skipped (unit suite never shells out to git).
|
|
122
|
+
*/
|
|
123
|
+
listStagedFiles?: (workdir: string, baseRef?: string) => Promise<string[]>;
|
|
124
|
+
/**
|
|
125
|
+
* V96 (R4): read a staged file's raw bytes (for the NUL/binary scan). Default:
|
|
126
|
+
* `fs.readFile(join(workdir, file))`. Injectable so the unit suite can feed a
|
|
127
|
+
* NUL fixture without a real file.
|
|
128
|
+
*/
|
|
129
|
+
readFileBytes?: (workdir: string, file: string) => Promise<Buffer>;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Text-source extensions the NUL/binary check scans. An allowlist (never a
|
|
133
|
+
* binary denylist) so genuine binary assets — images, fonts, the design export —
|
|
134
|
+
* are never false-positives. Kept in sync with scripts/ci/check-no-binary-source.mjs
|
|
135
|
+
* (the CI backstop for the SAME defect class); the runner package cannot import
|
|
136
|
+
* that .mjs, so the list is duplicated per the standing cross-package convention.
|
|
137
|
+
*/
|
|
138
|
+
export declare const TEXT_EXTENSIONS: Set<string>;
|
|
139
|
+
/** True when `p` has a text-source extension the NUL check scans. */
|
|
140
|
+
export declare function isTextSourcePath(p: string): boolean;
|
|
141
|
+
export interface NulHit {
|
|
142
|
+
path: string;
|
|
143
|
+
/** Byte offset of the first NUL. */
|
|
144
|
+
offset: number;
|
|
145
|
+
/** 1-based line of the NUL byte. */
|
|
146
|
+
line: number;
|
|
147
|
+
/** 1-based byte column within the line. */
|
|
148
|
+
col: number;
|
|
68
149
|
}
|
|
69
|
-
/**
|
|
150
|
+
/** Offset of the first NUL byte in `buf`, or -1 if there is none. */
|
|
151
|
+
export declare function firstNulOffset(buf: Buffer): number;
|
|
152
|
+
/** 1-based {line, col} of byte `offset` within `buf` (col counts bytes). */
|
|
153
|
+
export declare function lineColOf(buf: Buffer, offset: number): {
|
|
154
|
+
line: number;
|
|
155
|
+
col: number;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Build the log-safe failure message for a NUL hit. Names the file, the byte
|
|
159
|
+
* offset, and the 1-based line:col — the exact pointer the reviewer needed for
|
|
160
|
+
* PR #1059 (a single NUL byte burned two review cycles).
|
|
161
|
+
*/
|
|
162
|
+
export declare function formatNulFailure(hit: NulHit): string;
|
|
163
|
+
/**
|
|
164
|
+
* Convert one `allowed`-list glob into a RegExp anchored to a full repo-relative
|
|
165
|
+
* path. Semantics:
|
|
166
|
+
* - `**` matches any run of chars INCLUDING `/`;
|
|
167
|
+
* - `*` matches any run of chars EXCLUDING `/` (within one path segment);
|
|
168
|
+
* - `?` matches a single non-`/` char;
|
|
169
|
+
* - a pattern ending in `/` (or a bare directory with no wildcard) matches
|
|
170
|
+
* everything beneath that directory prefix;
|
|
171
|
+
* - every other char is matched literally.
|
|
172
|
+
*/
|
|
173
|
+
export declare function globToRegExp(glob: string): RegExp;
|
|
174
|
+
/**
|
|
175
|
+
* True when `file` (repo-relative) matches ANY of `globs`, OR when a wildcard-free
|
|
176
|
+
* glob names a directory that `file` sits beneath (`api/_lib` matches
|
|
177
|
+
* `api/_lib/x.ts`). Fail-open on an empty glob list — a task that declares no
|
|
178
|
+
* scope is treated as "everything allowed" (the caller gates on non-empty).
|
|
179
|
+
*/
|
|
180
|
+
export declare function matchesAllowedGlobs(file: string, globs: string[]): boolean;
|
|
181
|
+
/** Repo-relative staged paths that match NONE of the allowed globs. */
|
|
182
|
+
export declare function scopeViolations(files: string[], globs: string[]): string[];
|
|
183
|
+
/**
|
|
184
|
+
* Resolve whether a scope violation BLOCKS the PR. Precedence:
|
|
185
|
+
* 1. explicit `deps.scopeEnforce`, else
|
|
186
|
+
* 2. the `ACC_PREPR_SCOPE_ENFORCE` env (`1/true/yes/on` → enforce), else
|
|
187
|
+
* 3. `false` — advisory/shadow (defaults ship OFF; enforcement is opt-in).
|
|
188
|
+
*/
|
|
189
|
+
export declare function scopeEnforceResolved(explicit: boolean | undefined, env: NodeJS.ProcessEnv): boolean;
|
|
190
|
+
/** Escape-hatch flag. Matches the truthy convention in provider-auth.ts. */
|
|
70
191
|
export declare function preprSkipRequested(env: NodeJS.ProcessEnv): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Resolve whether a migration-lint ERROR blocks the PR. Precedence:
|
|
194
|
+
* 1. explicit `deps.migrationLintBlocking` (the resolved org knob), else
|
|
195
|
+
* 2. the `ACC_MIGRATION_LINT_BLOCKING` env (`1/true/yes/on` → blocking), else
|
|
196
|
+
* 3. `false` — shadow (defaults ship OFF; blocking is an explicit opt-in).
|
|
197
|
+
* Matches the org `migration_lint_blocking` default of `false` (shadow), so
|
|
198
|
+
* un-wired callers get the same effective default as wired ones.
|
|
199
|
+
*/
|
|
200
|
+
export declare function migrationLintBlockingResolved(explicit: boolean | undefined, env: NodeJS.ProcessEnv): boolean;
|
|
71
201
|
/**
|
|
72
202
|
* Run the repo's own quality gates in `workdir` before a PR is opened.
|
|
73
203
|
* `ok === false` means the caller MUST NOT open a PR — fail the task with
|
package/dist/prepr-gate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepr-gate.d.ts","sourceRoot":"","sources":["../src/prepr-gate.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,MAAM,GACN,OAAO,GACP,MAAM,GACN,gBAAgB,CAAC;AAErB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,aAAa,EAA2C,CAAC;AAEnF,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,EAAE,EAAE,OAAO,CAAC;IACZ,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;IACjB,6CAA6C;IAC7C,GAAG,EAAE,aAAa,EAAE,CAAC;IACrB,2EAA2E;IAC3E,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"prepr-gate.d.ts","sourceRoot":"","sources":["../src/prepr-gate.ts"],"names":[],"mappings":"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"}
|