@rightkit/release 0.6.30 → 0.6.31

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.
@@ -2432,7 +2432,10 @@ export function cargoReadTargetDir({ tmpRoot, roots }) {
2432
2432
  export async function runScans(plan, options = {}) {
2433
2433
  const deps = {
2434
2434
  // Concurrent runs need a spawn that does not block the event loop.
2435
- spawn: Number(options.jobs ?? 1) > 1 || options.signal ? defaultSpawnAsync : defaultSpawn,
2435
+ // Always asynchronous (A9): a synchronous spawn holds the event loop, so no scan's time limit can fire while it runs. The 2026-11-02 runs
2436
+ // show it: every scan that finished at the same moment reported the same inflated time (shellcheck and actionlint 1,655 s, against a
2437
+ // 5 min limit), held by a synchronous broker call. One lane used the synchronous spawn, so a single-lane run had no working limit.
2438
+ spawn: defaultSpawnAsync,
2436
2439
  // Locating a tool (rustfmt's `which`/`where` fallback) is synchronous whatever `spawn` is.
2437
2440
  lookupSpawn: defaultSpawn, exists: fs.existsSync, readFile: (f) => fs.readFileSync(f, "utf8"), readdir: fs.readdirSync,
2438
2441
  env: process.env, platform: process.platform, execPath: process.execPath,
@@ -2558,7 +2561,8 @@ export async function runScans(plan, options = {}) {
2558
2561
  let row = await scanRow(s, extraEnv);
2559
2562
  // rightkit#1459: a class A scan that timed out is run once more before it fails Class A (a hung tool, e.g. actionlint on 2026-11-02, ran
2560
2563
  // 27 min and failed a run whose rerun passed in 1 s). Class B and carried scans are not retried: a compile that times out is a real failure.
2561
- if (row.status === "fail" && row.code === "TIMEOUT" && s.class === SCAN_CLASS.A && !signal?.aborted) {
2564
+ // Test suites are not retried either: a slow test is a finding, not a hung tool.
2565
+ if (row.status === "fail" && row.code === "TIMEOUT" && s.class === SCAN_CLASS.A && s.kind !== "test" && !signal?.aborted) {
2562
2566
  const first = row;
2563
2567
  row = await scanRow(s, extraEnv);
2564
2568
  row = { ...row, retried: { code: first.code, detail: first.detail } };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rightkit/release",
3
- "version": "0.6.30",
3
+ "version": "0.6.31",
4
4
  "description": "Portable release CLI/SDK with fail-closed public GitHub Releases and private R2 + RightApps distribution.",
5
5
  "license": "MIT OR Apache-2.0",
6
6
  "type": "module",
@@ -49,7 +49,7 @@
49
49
  "@rightkit/qa": "0.6.2",
50
50
  "@rightkit/qa-chrome": "0.1.12",
51
51
  "@rightkit/react-shell": "0.7.2",
52
- "@rightkit/release": "0.6.30",
52
+ "@rightkit/release": "0.6.31",
53
53
  "@rightkit/settings-ui": "0.7.0",
54
54
  "@rightkit/social-ui": "0.1.0",
55
55
  "@rightkit/system-ui": "0.1.0",
package/snapshot-git.mjs CHANGED
@@ -133,9 +133,18 @@ function discoveryHome() {
133
133
  }
134
134
 
135
135
  /** git run in `cwd` against the checkout's own repository (found from `cwd`), under the sealed environment (no GIT_DIR, no index) plus GIT_NO_REPLACE_OBJECTS. Returns the spawn result. */
136
+ // The sealed environment hides the user's global git config, so the user's `safe.directory` never reaches git: a checkout owned by
137
+ // another account (on the Dell, D:\Claude\viewright and postright belong to BUILTIN\Administrators) was refused as "dubious ownership"
138
+ // from 0.6.9 on. The checkout itself is named on the command line (command-line config is protected configuration, which git accepts for
139
+ // safe.directory), forward slashes as git compares them, and fsmonitor stays off so the checkout's own config can start no program.
140
+ export function discoverySafeArgs(cwd, platform = process.platform) {
141
+ const dir = (platform === "win32" ? path.win32 : path).resolve(cwd);
142
+ return ["-c", `safe.directory=${platform === "win32" ? dir.replaceAll("\\", "/") : dir}`, "-c", "core.fsmonitor=false"];
143
+ }
144
+
136
145
  export function discoveryRun(cwd, args, { platform = process.platform, input } = {}) {
137
146
  const env = sealedEnv(discoveryHome(), { platform, gitDir: null, index: false });
138
- return spawnSync("git", args, { cwd, env, input, encoding: "utf8", maxBuffer: MAX_BUFFER });
147
+ return spawnSync("git", [...discoverySafeArgs(cwd, platform), ...args], { cwd, env, input, encoding: "utf8", maxBuffer: MAX_BUFFER });
139
148
  }
140
149
  /** As discoveryRun, returning trimmed-by-caller stdout or throwing an Error naming the command. */
141
150
  export function discoveryGit(cwd, args, options) {