@rightkit/release 0.6.20 → 0.6.21

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.
Binary file
@@ -1608,12 +1608,14 @@ async function runStages(o, args, root, git, io) {
1608
1608
  // `main --all` compiles. A broker host's stage-sidecar child reaches Cargo through the stage's carrier (carried-cargo.mjs).
1609
1609
  // right-release runs in appRoot (nested apps), so the repository-relative config is handed over absolute (Astra, second pass).
1610
1610
  // On the snapshot route sidecars are staged ONCE per door run by the ledger bookkeeping (attribution diff, immutable staged entries).
1611
- if (ok && ds) ok = await stageSidecarsOnce({ o, ds, root, git, configs: sidecarConfigs, appDir, cli, commonDir, commit, tree, stage, executor });
1612
- else for (const config of ok ? sidecarConfigs : []) if (!await rightRelease(stage, ["stage-sidecar", "--config", path.join(root, config)])) { ok = false; break; }
1613
- // rightkit#1331: the declared compile inputs that are the app's web build output are produced in the snapshot before the compile reads them.
1611
+ // rightkit#1331: the declared compile inputs that are the app's web build output are produced in the snapshot before ANY compile reads them,
1612
+ // the sidecar builds included: the broker admits a compile only when every declared input is in the snapshot (HeardRight Mac 2026-11-02:
1613
+ // stage-sidecar's cargo build REJECTED "snapshot admission: tauri-app-next/dist: No such file or directory").
1614
1614
  if (ok && ds) ok = await stageWebBuildOnce({ o, ds, root, git, appDir, cli, commonDir, commit, tree, stage, executor });
1615
- // The Windows package-identity MSIX a Tauri app bundles (its release config's windows.identity), produced in the snapshot on Windows only.
1615
+ // The Windows package-identity MSIX a Tauri app bundles (its release config's windows.identity), produced in the snapshot on Windows only, for the same reason.
1616
1616
  if (ok && ds) ok = await stageWindowsIdentityOnce({ o, ds, root, git, appDir, cli, commonDir, commit, tree, stage, executor });
1617
+ if (ok && ds) ok = await stageSidecarsOnce({ o, ds, root, git, configs: sidecarConfigs, appDir, cli, commonDir, commit, tree, stage, executor });
1618
+ else for (const config of ok ? sidecarConfigs : []) if (!await rightRelease(stage, ["stage-sidecar", "--config", path.join(root, config)])) { ok = false; break; }
1617
1619
  let compiledDirs = []; let compiledBins = null; let qualifyOwed = [];
1618
1620
  const reportOutputs = (dirs, bins = null) => { compiledDirs = [...dirs]; compiledBins = bins; };
1619
1621
  if (ok) ok = (await (o.runCompile ?? (() => main(ds ? ["--all", "--commit", commit, "--snapshot", ds.path] : ["--all"], { ...io, cwd: root, readStdin: () => "", ...(ds ? { buildOwnership: ds.own, classAEarlier: true, snapshotLedger: ds.ledger?.entries ?? [], onCompileLedger: (entries) => { ds.compileAdmitted = entries; }, onDirectReceipt: (r) => { directReceipt = r; }, onCompileOutputs: reportOutputs, onQualifyOwed: (list) => { qualifyOwed = list; } } : {}) })))({ reportOutputs })) === 0;
@@ -1636,7 +1638,11 @@ async function runStages(o, args, root, git, io) {
1636
1638
  // compile was already passed (a separately invoked `--to package` re-stages after the sync, so it never meets a missing externalBin).
1637
1639
  // right-release then takes its identity from the selected commit and the verified snapshot (release-source-identity.mjs, row 7.04),
1638
1640
  // never the checkout's HEAD, status or branch; its outputs, state and the sealed directory stay in the checkout's `.right-release`.
1639
- ok = ds ? await stageSidecarsOnce({ o, ds, root, git, configs: sidecarConfigsOf(), appDir, cli, commonDir, commit, tree, stage, executor }) : true;
1641
+ // The declared web build and Windows identity inputs first, as in the compile stage: the sidecar builds are broker-admitted only when every declared input is in the snapshot.
1642
+ ok = true;
1643
+ if (ds) ok = await stageWebBuildOnce({ o, ds, root, git, appDir, cli, commonDir, commit, tree, stage, executor });
1644
+ if (ok && ds) ok = await stageWindowsIdentityOnce({ o, ds, root, git, appDir, cli, commonDir, commit, tree, stage, executor });
1645
+ if (ok && ds) ok = await stageSidecarsOnce({ o, ds, root, git, configs: sidecarConfigsOf(), appDir, cli, commonDir, commit, tree, stage, executor });
1640
1646
  // Source QA (right-release qa --stage source) exists for mac and win only; a mobile package is the signed build alone.
1641
1647
  // Row 7.04c (R-T1, 7.09): the snapshot holds no Cargo target. On a direct host the checkout's output directory is resolved here, in the primary
1642
1648
  // checkout, and handed to right-release absolute: it binds every manifest's target for this stage, and the sealed manifest must record it back
@@ -2868,6 +2874,11 @@ async function runDevTest(o, args, root, git, io, to, appRoot, appDir) {
2868
2874
  // app's own prepare step may stage them too; the ledger's attribution check, not an environment marker, is what keeps that single and exact.
2869
2875
  if (ds) {
2870
2876
  const sidecarConfigs = committedSidecarConfigs({ o, git, commit, appDir, base: ds.path });
2877
+ // The declared web build and Windows identity inputs first: the sidecar builds are broker-admitted only when every declared input is in the snapshot.
2878
+ const rr = fileURLToPath(new URL("../cli/right-release.mjs", import.meta.url));
2879
+ if (!(await stageWebBuildOnce({ o, ds, root, git, appDir, cli: rr, commonDir, commit, tree, stage: to, executor, tag })) || !(await stageWindowsIdentityOnce({ o, ds, root, git, appDir, cli: rr, commonDir, commit, tree, stage: to, executor, tag }))) {
2880
+ o.err(`${tag} --to ${to} stopped: the declared compile inputs could not be produced; nothing compiled`); return 1;
2881
+ }
2871
2882
  const staged = await stageSidecarsOnce({ o, ds, root, git, configs: sidecarConfigs, appDir, cli: fileURLToPath(new URL("../cli/right-release.mjs", import.meta.url)), commonDir, commit, tree, stage: to, executor, tag });
2872
2883
  if (!staged) { o.err(`${tag} --to ${to} stopped: the declared sidecars could not be staged; nothing compiled`); return 1; }
2873
2884
  }
@@ -1348,7 +1348,9 @@ export function planScans({
1348
1348
  // A package that depends on another workspace package is therefore checked through a generated project that maps each sibling's
1349
1349
  // exported entry points to its committed sources (TSC_PROJECT, built by the runner); every other package keeps its own tsconfig.
1350
1350
  // `--noEmit` stays on the command line as well as in the project: the class A launch guard judges a tsc launch by its argv alone.
1351
- const workspaceDirs = (npmMap ? [...npmMap.values()].map((u) => u.dir) : listDir(path.join(liveRoot, "packages")).map((n) => `packages/${n}`)).sort();
1351
+ // Every workspace package is a possible sibling, whatever subset this plan checks (a publication plans only its units, and their
1352
+ // siblings' sources must still be mapped: publish scans of @rightkit/workspace-ui could not resolve @rightkit/mail-ui/*).
1353
+ const workspaceDirs = [...new Set([...(npmMap ? [...npmMap.values()].map((u) => u.dir) : []), ...listDir(path.join(liveRoot, "packages")).map((n) => `packages/${n}`)])].sort();
1352
1354
  const manifestOf = (dir) => { try { return JSON.parse(readFile(path.join(liveRoot, dir, "package.json")).replace(/^/, "")); } catch { return null; } };
1353
1355
  const workspaceNames = new Map(workspaceDirs.map((d) => [manifestOf(d)?.name, d]).filter(([n]) => typeof n === "string"));
1354
1356
  const usesWorkspaceSibling = (dir) => {
@@ -2596,7 +2598,9 @@ export async function runScans(plan, options = {}) {
2596
2598
  // generated outside the checked tree and removed after the run, so the check reads nothing a commit lacks and writes nothing.
2597
2599
  let tscProject = null;
2598
2600
  if (args.includes(TSC_PROJECT)) {
2599
- try { tscProject = writeTscProject({ contentRoot, packageDir: path.join(rootDir(s.root), s.cwd ?? ""), workspace: s.tscWorkspace ?? [] }); }
2601
+ // The siblings are mapped in the same tree tsc runs in (a publication scans a content checkout and a live checkout of
2602
+ // one verified commit; mixing them puts the package outside the project's rootDir, TS6059).
2603
+ try { tscProject = writeTscProject({ contentRoot: rootDir(s.root), packageDir: path.join(rootDir(s.root), s.cwd ?? ""), workspace: s.tscWorkspace ?? [] }); }
2600
2604
  catch (e) { advisory?.cleanup?.(); return { ...row, status: "fail", code: "TSC_PROJECT", detail: `${s.id}: the check project could not be built from the committed workspace: ${e.message}` }; }
2601
2605
  args = args.map((a) => (a === TSC_PROJECT ? tscProject.file : a));
2602
2606
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rightkit/release",
3
- "version": "0.6.20",
3
+ "version": "0.6.21",
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.20",
52
+ "@rightkit/release": "0.6.21",
53
53
  "@rightkit/settings-ui": "0.7.0",
54
54
  "@rightkit/social-ui": "0.1.0",
55
55
  "@rightkit/system-ui": "0.1.0",
@@ -424,6 +424,13 @@ function carryBrokerCargoOnce({ words, cwd, env, section, workspace, checkoutWor
424
424
  const seen = operationOutcomeInOutput(`${out.stdout}\n${out.stderr}`) ?? (r.error?.code === "ETIMEDOUT" ? { code: "operation-deadline", deadlineMs: null, requestId: ref?.requestId ?? null, cancelConfirmed: null, terminalState: null, guard: true } : null);
425
425
  if (seen) outcome = { status: "unverified", code: seen.code, message: seen.code === "operation-deadline" ? `the operation deadline${seen.deadlineMs ? ` of ${seen.deadlineMs} ms` : ""} passed${seen.guard ? " and the client was stopped by the gate's outer guard" : ""}; request ${seen.requestId ?? ref?.requestId ?? "unknown"}: cancelConfirmed: ${seen.cancelConfirmed ?? "unknown"}, terminal state: ${seen.terminalState ?? "not observed"}; the job is neither abandoned nor resubmitted and ownership stays UNKNOWN until every sub-handle is REAPED` : seen.code === "broker-busy" ? "every broker connection was busy (RK_BROKER_BUSY: a wait, not an outage); nothing was admitted" : "the broker was unavailable (RK_BROKER_UNAVAILABLE)", ...(ref ? { requestId: ref.requestId, workspace: ref.workspace } : {}) };
426
426
  }
427
+ // The client's own account of a call that never got a request reference (it refused the carrier, or the broker refused the request before
428
+ // accepting it): its `rustright: <reason>` lines, which capture mode would otherwise drop (HeardRight Mac package 2026-11-02: exit 125 with
429
+ // no reason in the gate log). A bare `rustright: request <id>` line is not a reason.
430
+ if (outcome.status === "unverified" && capture && ref === null) {
431
+ const said = out.stderr.split(/\r?\n/).map((line) => line.trim()).filter((line) => /^rustright(?:[: ]|-)/.test(line) && !/^rustright: request [0-9a-f-]+$/.test(line));
432
+ if (said.length) outcome = { ...outcome, message: `${outcome.message}; the RustRight client said (exit ${r.status ?? "none"}): ${said.slice(-3).join(" | ").slice(0, 600)}` };
433
+ }
427
434
  if (outcome.status === "unverified" && outcome.code === "operation-deadline") {
428
435
  const settled = reconcileAfterCancel({ section, callHandle: made.carrier.ownership.handle, childEnv });
429
436
  outcome = { ...outcome, message: `${outcome.message}; ${settled.note}`, reaped: settled.reaped, subHandle: settled.subHandle };
@@ -305,7 +305,10 @@ export function installSnapshotDependencies({ checkout, snapshot, commit, tree,
305
305
  const ms = now() - started;
306
306
  if (failed(r) || /No projects matched the filters/.test(`${r?.stdout ?? ""}\n${r?.stderr ?? ""}`)) {
307
307
  const out = `${r?.stdout ?? ""}\n${r?.stderr ?? ""}`;
308
- const miss = /ERR_PNPM_NO_OFFLINE_TARBALL[^\n]*?(https?:\/\/\S+?\/-\/(\S+?)\.tgz)/.exec(out);
308
+ // pnpm 12 prints the code on its own line and wraps the tarball URL ("from https://\n registry.npmjs.org/..."): the URL is rejoined first,
309
+ // and the code and its URL may be a few lines apart (Dell, 2026-11-02: the specific message never fired; only progress lines showed).
310
+ const joined = out.replace(/(https?:\/\/)\s+/g, "$1");
311
+ const miss = /ERR_PNPM_NO_OFFLINE_TARBALL[\s\S]{0,600}?(https?:\/\/\S+?\/-\/(\S+?)\.tgz)/.exec(joined);
309
312
  const message = miss
310
313
  ? `root ${root}: ${miss[2]} is missing from the store ${storeDir} (offline install, no network fallback); install the checkout's dependencies so the store holds it, then run the check again`
311
314
  : `root ${root}: offline dependency install failed (store ${storeDir}): ${tail(r) || r?.error?.message || `exit ${r?.status}`}`;
@@ -74,5 +74,11 @@ async function main() {
74
74
  }
75
75
 
76
76
  if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) {
77
- main().catch((error) => { console.error(`right-release stage-sidecar: ${error.code ? `[${error.code}] ` : ""}${error.message}`); process.exitCode = 1; });
77
+ main().catch((error) => {
78
+ console.error(`right-release stage-sidecar: ${error.code ? `[${error.code}] ` : ""}${error.message}`);
79
+ // The failed tool's own last words (a captured rustright or cargo stderr), which the message alone does not carry.
80
+ const tail = String(error.details?.stderr ?? "").trim().split(/\r?\n/).slice(-8).join("\n");
81
+ if (tail) console.error(`right-release stage-sidecar: its stderr ended:\n${tail}`);
82
+ process.exitCode = 1;
83
+ });
78
84
  }