@cat-factory/executor-harness 1.72.0 → 1.74.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/job.js CHANGED
@@ -309,8 +309,12 @@ export function parsePackageRegistries(value, env = process.env) {
309
309
  if (!allowed.has(host)) {
310
310
  throw new Error(`Invalid job: 'packageRegistries[${i}].host' '${host}' is not an allowed npm registry host`);
311
311
  }
312
- if (!Array.isArray(entry.scopes) || entry.scopes.length === 0) {
313
- throw new Error(`Invalid job: 'packageRegistries[${i}].scopes' must be a non-empty array`);
312
+ // An EMPTY scope list is valid and deliberate: the entry then only authenticates its
313
+ // host, leaving every package to resolve from the default registry unless a dependency
314
+ // pins this one itself. Mapping a scope is all-or-nothing, so a workspace mixing private
315
+ // and public packages under one scope must be able to skip it.
316
+ if (!Array.isArray(entry.scopes)) {
317
+ throw new Error(`Invalid job: 'packageRegistries[${i}].scopes' must be an array`);
314
318
  }
315
319
  const scopes = entry.scopes.map((scope, j) => {
316
320
  const s = str(scope, `packageRegistries[${i}].scopes[${j}]`).trim();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/executor-harness",
3
- "version": "1.72.0",
3
+ "version": "1.74.0",
4
4
  "description": "Container payload: a thin TypeScript wrapper that runs the Pi coding agent against a cloned repo and opens a PR. Runs in the Cloudflare Container (and, in local native mode, as a host process); carries no secrets.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,9 +26,9 @@
26
26
  "hono": "^4.12.32",
27
27
  "typescript": "7.0.2",
28
28
  "vitest": "^4.1.10",
29
- "@cat-factory/kernel": "0.184.0",
30
- "@cat-factory/server": "0.172.0",
31
- "@cat-factory/spend": "0.12.113"
29
+ "@cat-factory/kernel": "0.185.1",
30
+ "@cat-factory/server": "0.172.2",
31
+ "@cat-factory/spend": "0.12.115"
32
32
  },
33
33
  "scripts": {
34
34
  "build": "tsc -p tsconfig.json",
package/src/job.ts CHANGED
@@ -420,7 +420,7 @@ export interface PackageRegistrySpec {
420
420
  ecosystem: 'npm'
421
421
  /** Registry host, e.g. `registry.npmjs.org` — allowlisted, never a full URL. */
422
422
  host: string
423
- /** npm scopes (`@org`) routed to this registry. */
423
+ /** npm scopes (`@org`) routed to this registry; EMPTY ⇒ authenticate the host only. */
424
424
  scopes: string[]
425
425
  token: string
426
426
  }
@@ -468,8 +468,12 @@ export function parsePackageRegistries(
468
468
  `Invalid job: 'packageRegistries[${i}].host' '${host}' is not an allowed npm registry host`,
469
469
  )
470
470
  }
471
- if (!Array.isArray(entry.scopes) || entry.scopes.length === 0) {
472
- throw new Error(`Invalid job: 'packageRegistries[${i}].scopes' must be a non-empty array`)
471
+ // An EMPTY scope list is valid and deliberate: the entry then only authenticates its
472
+ // host, leaving every package to resolve from the default registry unless a dependency
473
+ // pins this one itself. Mapping a scope is all-or-nothing, so a workspace mixing private
474
+ // and public packages under one scope must be able to skip it.
475
+ if (!Array.isArray(entry.scopes)) {
476
+ throw new Error(`Invalid job: 'packageRegistries[${i}].scopes' must be an array`)
473
477
  }
474
478
  const scopes = entry.scopes.map((scope, j) => {
475
479
  const s = str(scope, `packageRegistries[${i}].scopes[${j}]`).trim()