@dzhechkov/harness-core 0.8.32 → 0.8.34
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/.dz-manifest.json +107 -47
- package/README.md +108 -0
- package/dist/agentdb-index.d.ts +17 -6
- package/dist/agentdb-index.d.ts.map +1 -1
- package/dist/agentdb-index.js +61 -17
- package/dist/agentdb-index.js.map +1 -1
- package/dist/apply-leg.d.ts +68 -5
- package/dist/apply-leg.d.ts.map +1 -1
- package/dist/apply-leg.js +466 -37
- package/dist/apply-leg.js.map +1 -1
- package/dist/embed-socket-path.d.ts +65 -0
- package/dist/embed-socket-path.d.ts.map +1 -0
- package/dist/embed-socket-path.js +100 -0
- package/dist/embed-socket-path.js.map +1 -0
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +105 -3
- package/dist/operations.js.map +1 -1
- package/dist/packed-install-smoke.d.ts +108 -0
- package/dist/packed-install-smoke.d.ts.map +1 -0
- package/dist/packed-install-smoke.js +172 -0
- package/dist/packed-install-smoke.js.map +1 -0
- package/dist/publish-sibling-drift.d.ts +139 -0
- package/dist/publish-sibling-drift.d.ts.map +1 -0
- package/dist/publish-sibling-drift.js +408 -0
- package/dist/publish-sibling-drift.js.map +1 -0
- package/dist/publish.d.ts +44 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +243 -24
- package/dist/publish.js.map +1 -1
- package/dist/qe-bridge.d.ts +16 -0
- package/dist/qe-bridge.d.ts.map +1 -1
- package/dist/qe-bridge.js +1 -0
- package/dist/qe-bridge.js.map +1 -1
- package/dist/release.d.ts +91 -0
- package/dist/release.d.ts.map +1 -1
- package/dist/release.js +317 -21
- package/dist/release.js.map +1 -1
- package/dist/setup.d.ts +36 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +96 -2
- package/dist/setup.js.map +1 -1
- package/dist/vector-tier.d.ts +27 -2
- package/dist/vector-tier.d.ts.map +1 -1
- package/dist/vector-tier.js +112 -3
- package/dist/vector-tier.js.map +1 -1
- package/package.json +23 -23
- package/sbom.json +196 -46
- package/src/agentdb-index.ts +65 -17
- package/src/apply-leg.ts +461 -37
- package/src/embed-socket-path.ts +113 -0
- package/src/index.ts +44 -3
- package/src/operations.ts +104 -3
- package/src/packed-install-smoke.ts +273 -0
- package/src/publish-sibling-drift.ts +498 -0
- package/src/publish.ts +280 -25
- package/src/qe-bridge.ts +14 -0
- package/src/release.ts +366 -19
- package/src/setup.ts +108 -2
- package/src/vector-tier.ts +147 -5
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sibling-drift gate — feature `publish-sibling-drift-gate`, ADR-001 (Decision 1).
|
|
3
|
+
*
|
|
4
|
+
* `rewriteWorkspaceSpecs` (publish.ts) pins a sibling `workspace:^`/`workspace:~`/`workspace:*`
|
|
5
|
+
* dependency to the EXACT version currently on disk. That version may be published on the
|
|
6
|
+
* registry carrying an OLDER build than the workspace — the sibling changed without a version
|
|
7
|
+
* bump. The pinned range then resolves at install time to a package that does not match the
|
|
8
|
+
* workspace's current behavior, and a fresh `npm install` reproduces whatever regressed.
|
|
9
|
+
*
|
|
10
|
+
* Detection (ADR-001, Decision 1, alternative А3 — accepted): hash every file under the
|
|
11
|
+
* published tarball's `dist/**` plus its `package.json` (with `version`/`gitHead`/`_*` fields
|
|
12
|
+
* stripped, since those legitimately differ between the registry copy and the workspace copy),
|
|
13
|
+
* and compare against the same hash of the workspace copy. Any difference is drift. A published
|
|
14
|
+
* `dist/index.js` missing an export the workspace's `dist/index.js` declares is surfaced as a
|
|
15
|
+
* SECOND, more readable signal (`missingExports`) — the exact shape of the 2026-09-13 incident
|
|
16
|
+
* ("does not provide an export named …") — but the hash comparison is the load-bearing check:
|
|
17
|
+
* it also catches behavior changes that keep every export name intact.
|
|
18
|
+
*
|
|
19
|
+
* Network access is NOT this module's concern (NFR-2: pure, no network, fixture-testable):
|
|
20
|
+
* `fetchPublished` is injected. The CLI implementation packs the sibling from the registry via
|
|
21
|
+
* `npm pack <name>@<version>` into a temp dir; tests inject a local directory. A fetch that
|
|
22
|
+
* returns `null` (offline, 404, timeout) is reported as `'unavailable'` — never silently treated
|
|
23
|
+
* as `'same'` (the "a gate that infers a pass from silence breaks on the next failure path"
|
|
24
|
+
* lesson): the caller decides whether `'unavailable'` blocks or is overridden.
|
|
25
|
+
*
|
|
26
|
+
* @packageDocumentation
|
|
27
|
+
*/
|
|
28
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
29
|
+
import { createHash } from 'node:crypto';
|
|
30
|
+
import { join, relative, isAbsolute } from 'node:path';
|
|
31
|
+
function listFilesRecursive(root, dir) {
|
|
32
|
+
if (!existsSync(dir))
|
|
33
|
+
return [];
|
|
34
|
+
const out = [];
|
|
35
|
+
for (const entry of readdirSync(dir).sort()) {
|
|
36
|
+
const abs = join(dir, entry);
|
|
37
|
+
const st = statSync(abs);
|
|
38
|
+
if (st.isDirectory())
|
|
39
|
+
out.push(...listFilesRecursive(root, abs));
|
|
40
|
+
else
|
|
41
|
+
out.push(relative(root, abs));
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
function sha256(data) {
|
|
46
|
+
return createHash('sha256').update(data).digest('hex');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* C-1/AM-4: `npm pack --dry-run --json` is a real subprocess call — the CLI caches its result per
|
|
50
|
+
* absolute directory for the lifetime of ONE `dz publish` run (not per package being checked), so
|
|
51
|
+
* a run that checks the same sibling from more than one dependent package packs it only once. Core
|
|
52
|
+
* itself never runs the subprocess or owns the cache (core-boundary import ratchet) — this parser
|
|
53
|
+
* is the pure half only.
|
|
54
|
+
*
|
|
55
|
+
* Parses `npm pack --dry-run --json`'s stdout (an array with one element; `files[]` holds
|
|
56
|
+
* `{path,size,mode}` per shipped path, plus `integrity`/`shasum`/`entryCount`) into the exact set of
|
|
57
|
+
* relative paths npm intends to ship, honouring `.npmignore`/`files`/default-ignore exactly the way
|
|
58
|
+
* a real `npm publish` would. A failure to run, parse, or make sense of the shape — including a
|
|
59
|
+
* malformed individual `files[]` element (AM-5: a corrupt entry is a reason to say the WHOLE
|
|
60
|
+
* inventory is untrustworthy, never a file to silently drop) — is `{ unavailable: reason }`: an
|
|
61
|
+
* input this gate cannot read is a reason to say so, never a silent "nothing to compare".
|
|
62
|
+
*/
|
|
63
|
+
export function parseNpmPackInventory(stdout) {
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse(stdout);
|
|
66
|
+
const entry = Array.isArray(parsed) ? parsed[0] : undefined;
|
|
67
|
+
const files = entry !== null && typeof entry === 'object' ? entry['files'] : undefined;
|
|
68
|
+
if (!Array.isArray(files))
|
|
69
|
+
return { unavailable: 'npm pack --dry-run --json returned no files[] array' };
|
|
70
|
+
// AM-5 (Codex round-1 finding 6, medium): a malformed element used to be `.filter()`ed out
|
|
71
|
+
// silently — a `files[]` entry npm itself always shapes as `{path,size,mode}` should never fail
|
|
72
|
+
// to parse; if one DOES (missing/non-string `path`, or a non-object element), that is a signal
|
|
73
|
+
// this output cannot be trusted, not a single file to quietly drop from the comparison. Say so.
|
|
74
|
+
const paths = [];
|
|
75
|
+
for (let i = 0; i < files.length; i++) {
|
|
76
|
+
const f = files[i];
|
|
77
|
+
if (f === null || typeof f !== 'object') {
|
|
78
|
+
return { unavailable: `npm pack --dry-run --json files[${i}] is not an object (got ${JSON.stringify(f)})` };
|
|
79
|
+
}
|
|
80
|
+
const path = f['path'];
|
|
81
|
+
if (typeof path !== 'string' || path === '') {
|
|
82
|
+
return { unavailable: `npm pack --dry-run --json files[${i}].path is missing or not a non-empty string (got ${JSON.stringify(path)})` };
|
|
83
|
+
}
|
|
84
|
+
paths.push(path);
|
|
85
|
+
}
|
|
86
|
+
return { paths };
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return { unavailable: `npm pack --dry-run --json output could not be parsed: ${err.message.split('\n')[0]}` };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Hash exactly the paths `npm pack` names (package.json normalized separately, as {@link hashTree} does). */
|
|
93
|
+
/**
|
|
94
|
+
* Codex round-2 (2026-09-14) new findings 1+2: a listed path that is absent, a directory, absolute,
|
|
95
|
+
* or that climbs out of `dir` via `..` used to be SKIPPED silently — a comparison over a listing
|
|
96
|
+
* the tree does not match is not a comparison, it is `unavailable`; and an inventory must never
|
|
97
|
+
* read outside the package directory. Thrown here, turned into an `unavailable` result by the caller.
|
|
98
|
+
*/
|
|
99
|
+
class InventoryListingError extends Error {
|
|
100
|
+
}
|
|
101
|
+
function hashTreeFromPaths(dir, paths, manifest) {
|
|
102
|
+
const map = new Map();
|
|
103
|
+
for (const rel of paths) {
|
|
104
|
+
if (rel === 'package.json')
|
|
105
|
+
continue; // normalized below, not hashed raw
|
|
106
|
+
if (isAbsolute(rel) || rel.split(/[\\/]/).includes('..')) {
|
|
107
|
+
throw new InventoryListingError(`inventory path "${rel}" is absolute or leaves the package directory`);
|
|
108
|
+
}
|
|
109
|
+
const abs = join(dir, rel);
|
|
110
|
+
if (!existsSync(abs))
|
|
111
|
+
throw new InventoryListingError(`inventory path "${rel}" does not exist in the workspace copy`);
|
|
112
|
+
if (statSync(abs).isDirectory())
|
|
113
|
+
throw new InventoryListingError(`inventory path "${rel}" is a directory, not a file`);
|
|
114
|
+
map.set(rel, sha256(readFileSync(abs)));
|
|
115
|
+
}
|
|
116
|
+
map.set('package.json', sha256(normalizedPackageJsonText(manifest)));
|
|
117
|
+
return map;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* AM-1: hash EVERY file under `dir` (the already-unpacked published tarball) — the literal "full
|
|
121
|
+
* recursive walk of what npm put there" the amendment names, used ONLY as the symmetric partner to
|
|
122
|
+
* {@link hashTreeFromPaths} (i.e. only when a `localInventory` provider is injected). `dir` here is
|
|
123
|
+
* always an extracted tarball, never the workspace tree, so there is no `.npmignore` to consult:
|
|
124
|
+
* everything that exists on disk is, by construction, exactly what npm shipped.
|
|
125
|
+
*/
|
|
126
|
+
function hashTreeFull(dir, manifest) {
|
|
127
|
+
const map = new Map();
|
|
128
|
+
for (const rel of listFilesRecursive(dir, dir)) {
|
|
129
|
+
if (rel === 'package.json')
|
|
130
|
+
continue; // normalized below, not hashed raw
|
|
131
|
+
map.set(rel, sha256(readFileSync(join(dir, rel))));
|
|
132
|
+
}
|
|
133
|
+
map.set('package.json', sha256(normalizedPackageJsonText(manifest)));
|
|
134
|
+
return map;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* package.json PARSED and validated. `null` (never `undefined`) means "this side cannot be built
|
|
138
|
+
* at all" — AM-3: a missing or unparseable manifest on EITHER side must surface as `unavailable`,
|
|
139
|
+
* never as an empty/omitted comparison field that a hash-mismatch loop could silently read as
|
|
140
|
+
* "nothing differs here".
|
|
141
|
+
*/
|
|
142
|
+
function readManifest(dir) {
|
|
143
|
+
const p = join(dir, 'package.json');
|
|
144
|
+
if (!existsSync(p))
|
|
145
|
+
return null;
|
|
146
|
+
try {
|
|
147
|
+
const raw = JSON.parse(readFileSync(p, 'utf-8'));
|
|
148
|
+
return raw !== null && typeof raw === 'object' && !Array.isArray(raw) ? raw : null;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** package.json normalized for comparison: strip fields that legitimately differ (version, gitHead, npm-internal `_*`). */
|
|
155
|
+
function normalizedPackageJsonText(raw) {
|
|
156
|
+
// Lead edit after the live dry-run on the hub (2026-09-13 10:40): the packer strips
|
|
157
|
+
// `scripts.prepublishOnly`, drops devDependencies/publishConfig and rewrites `workspace:` specs to
|
|
158
|
+
// pinned versions — every freshly published sibling read as "1 file drifted". Compare only what
|
|
159
|
+
// shapes the SHIPPED behavior: entry points, bins, files, engines, and dependency NAMES (values
|
|
160
|
+
// are the workspace-floor preflight's business, not this gate's).
|
|
161
|
+
//
|
|
162
|
+
// AM-4: `imports`/`browser`/`sideEffects`/`man` added — each one changes what a consumer actually
|
|
163
|
+
// resolves or ships, exactly like `main`/`exports`/`bin` already did; omitting them was a real gap
|
|
164
|
+
// the round-1 review named (finding 4), not a stylistic nicety.
|
|
165
|
+
const SHIPPING_FIELDS = [
|
|
166
|
+
'name', 'type', 'main', 'module', 'types', 'exports', 'imports', 'browser', 'sideEffects', 'man',
|
|
167
|
+
'bin', 'files', 'engines', 'os', 'cpu',
|
|
168
|
+
];
|
|
169
|
+
const DEP_TABLES = ['dependencies', 'peerDependencies', 'optionalDependencies'];
|
|
170
|
+
const kept = {};
|
|
171
|
+
for (const key of SHIPPING_FIELDS)
|
|
172
|
+
if (key in raw)
|
|
173
|
+
kept[key] = raw[key];
|
|
174
|
+
for (const key of DEP_TABLES) {
|
|
175
|
+
const table = raw[key];
|
|
176
|
+
if (table !== null && typeof table === 'object')
|
|
177
|
+
kept[key] = Object.keys(table).sort();
|
|
178
|
+
}
|
|
179
|
+
return JSON.stringify(kept);
|
|
180
|
+
}
|
|
181
|
+
/** Every relative path (from `dir`) that a `bin` field in a parsed manifest resolves to. */
|
|
182
|
+
function binPaths(raw) {
|
|
183
|
+
const bin = raw['bin'];
|
|
184
|
+
if (typeof bin === 'string')
|
|
185
|
+
return [bin.replace(/^\.\//, '')];
|
|
186
|
+
if (bin !== null && typeof bin === 'object' && !Array.isArray(bin)) {
|
|
187
|
+
return Object.values(bin)
|
|
188
|
+
.filter((v) => typeof v === 'string')
|
|
189
|
+
.map((v) => v.replace(/^\.\//, ''));
|
|
190
|
+
}
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* AM-4: the round-1 gate hashed only `dist/**` — a changed bin script, template, or other
|
|
195
|
+
* top-level asset that ships (declared in `package.json#files`, or the `bin` target itself) was
|
|
196
|
+
* invisible to the drift check even though npm ships it byte-for-byte. This is a documented,
|
|
197
|
+
* honest APPROXIMATION of "the whole tarball inventory" (the literal ADR wording), not a full
|
|
198
|
+
* re-implementation of npm's pack-time file-inclusion rules (`.npmignore`, default excludes,
|
|
199
|
+
* nested `.gitignore`): it walks `dist/**` (unconditional — the common case) plus every path
|
|
200
|
+
* named in `files` (directories walked recursively, files hashed directly) plus every resolved
|
|
201
|
+
* `bin` target, deduplicated. A package with no `files` field declared keeps exactly the
|
|
202
|
+
* pre-amendment `dist/**`-only scope, named here rather than silently pretended-away.
|
|
203
|
+
*/
|
|
204
|
+
function shippedInventoryDirs(dir, raw) {
|
|
205
|
+
const rels = new Set(['dist']);
|
|
206
|
+
const files = raw['files'];
|
|
207
|
+
if (Array.isArray(files)) {
|
|
208
|
+
for (const entry of files) {
|
|
209
|
+
if (typeof entry === 'string' && entry.trim() !== '')
|
|
210
|
+
rels.add(entry.replace(/^\.\//, '').replace(/\/+$/, ''));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
for (const bin of binPaths(raw))
|
|
214
|
+
rels.add(bin);
|
|
215
|
+
return [...rels].filter((rel) => existsSync(join(dir, rel)));
|
|
216
|
+
}
|
|
217
|
+
/** Hash the shipped inventory (AM-4) plus the normalized package.json, keyed by a stable relative path. */
|
|
218
|
+
function hashTree(dir, manifest) {
|
|
219
|
+
const map = new Map();
|
|
220
|
+
for (const rel of shippedInventoryDirs(dir, manifest)) {
|
|
221
|
+
const abs = join(dir, rel);
|
|
222
|
+
if (statSync(abs).isDirectory()) {
|
|
223
|
+
for (const sub of listFilesRecursive(abs, abs))
|
|
224
|
+
map.set(join(rel, sub), sha256(readFileSync(join(abs, sub))));
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
map.set(rel, sha256(readFileSync(abs)));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
map.set('package.json', sha256(normalizedPackageJsonText(manifest)));
|
|
231
|
+
return map;
|
|
232
|
+
}
|
|
233
|
+
function extractExportNames(source) {
|
|
234
|
+
const names = new Set();
|
|
235
|
+
for (const m of source.matchAll(/export\s+(?:const|function|class|async\s+function)\s+([A-Za-z0-9_$]+)/g)) {
|
|
236
|
+
names.add(m[1]);
|
|
237
|
+
}
|
|
238
|
+
for (const m of source.matchAll(/export\s*\{([^}]*)\}/g)) {
|
|
239
|
+
for (const part of m[1].split(',')) {
|
|
240
|
+
const name = part.trim().split(/\s+as\s+/).pop()?.trim();
|
|
241
|
+
if (name)
|
|
242
|
+
names.add(name);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return names;
|
|
246
|
+
}
|
|
247
|
+
/** А2 (ADR-001, rejected as the sole signal, kept as a readable second signal). */
|
|
248
|
+
function missingExportNames(publishedDir, workspaceDir) {
|
|
249
|
+
const pubIndex = join(publishedDir, 'dist', 'index.js');
|
|
250
|
+
const wsIndex = join(workspaceDir, 'dist', 'index.js');
|
|
251
|
+
if (!existsSync(pubIndex) || !existsSync(wsIndex))
|
|
252
|
+
return [];
|
|
253
|
+
const pubExports = extractExportNames(readFileSync(pubIndex, 'utf-8'));
|
|
254
|
+
const wsExports = extractExportNames(readFileSync(wsIndex, 'utf-8'));
|
|
255
|
+
return [...wsExports].filter((n) => !pubExports.has(n)).sort();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* For every `workspace:`-declared dependency of a package that is NOT part of `batch` (i.e. will
|
|
259
|
+
* be pinned to whatever is already on the registry, not published fresh in this run), compare the
|
|
260
|
+
* build that will be pinned against the workspace copy. Pure: all IO (fetch, fs) is either
|
|
261
|
+
* injected or scoped to reading local dist/package.json files — no network call is made here.
|
|
262
|
+
*/
|
|
263
|
+
export function detectSiblingDrift(opts) {
|
|
264
|
+
const results = [];
|
|
265
|
+
const seen = new Set();
|
|
266
|
+
// AM-6: named ONCE per call — every result below (including the short-circuited `unavailable`
|
|
267
|
+
// ones) carries the source that is or would have been used for this comparison.
|
|
268
|
+
const inventorySource = opts.localInventory !== undefined ? (opts.localInventorySource ?? 'npm-pack') : 'readdir-approximation';
|
|
269
|
+
// AM-3: `optionalDependencies` ships and pins EXACTLY like `dependencies`/`peerDependencies` —
|
|
270
|
+
// checking only the first two let a stale optional sibling through untouched (round-1 finding 3).
|
|
271
|
+
const entries = [
|
|
272
|
+
...Object.entries(opts.dependencies ?? {}),
|
|
273
|
+
...Object.entries(opts.peerDependencies ?? {}),
|
|
274
|
+
...Object.entries(opts.optionalDependencies ?? {}),
|
|
275
|
+
];
|
|
276
|
+
for (const [dep, spec] of entries) {
|
|
277
|
+
if (!String(spec).startsWith('workspace:'))
|
|
278
|
+
continue;
|
|
279
|
+
if (seen.has(dep))
|
|
280
|
+
continue;
|
|
281
|
+
seen.add(dep);
|
|
282
|
+
if (opts.batch.has(dep))
|
|
283
|
+
continue; // publishes fresh in this batch — nothing stale to drift from
|
|
284
|
+
const version = opts.workspaceVersions.get(dep);
|
|
285
|
+
const workspaceDir = opts.workspaceDirs.get(dep);
|
|
286
|
+
// AM-3: a `workspace:`-spec'd dependency this caller does not recognize used to be silently
|
|
287
|
+
// SKIPPED — an input this gate cannot build is a HARD gate that cannot say "same", never a
|
|
288
|
+
// quiet pass-through (round-1 finding 3: pnpm would die packing it anyway; die here, named).
|
|
289
|
+
if (version === undefined || workspaceDir === undefined) {
|
|
290
|
+
results.push({
|
|
291
|
+
name: dep,
|
|
292
|
+
version: version ?? '(not in workspace)',
|
|
293
|
+
status: 'unavailable',
|
|
294
|
+
changedFiles: [],
|
|
295
|
+
missingExports: [],
|
|
296
|
+
reason: `${dep} is declared workspace:-protocol but is not a known workspace package`,
|
|
297
|
+
inventorySource,
|
|
298
|
+
});
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
const fetched = opts.fetchPublished(dep, version);
|
|
302
|
+
if (fetched === null) {
|
|
303
|
+
results.push({
|
|
304
|
+
name: dep,
|
|
305
|
+
version,
|
|
306
|
+
status: 'unavailable',
|
|
307
|
+
changedFiles: [],
|
|
308
|
+
missingExports: [],
|
|
309
|
+
reason: `could not fetch ${dep}@${version} from the registry (network unavailable or the version was not found)`,
|
|
310
|
+
inventorySource,
|
|
311
|
+
});
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
// AM-3: a missing/unparseable package.json on EITHER side must not silently drop out of the
|
|
315
|
+
// comparison (the old `hashTree` simply omitted the key, which — with an empty/matching
|
|
316
|
+
// `dist/**` on both sides — could report `same` about an input that was never actually read).
|
|
317
|
+
const publishedManifest = readManifest(fetched.dir);
|
|
318
|
+
const workspaceManifest = readManifest(workspaceDir);
|
|
319
|
+
if (publishedManifest === null || workspaceManifest === null) {
|
|
320
|
+
const side = publishedManifest === null ? 'the published tarball' : 'the workspace copy';
|
|
321
|
+
results.push({
|
|
322
|
+
name: dep,
|
|
323
|
+
version,
|
|
324
|
+
status: 'unavailable',
|
|
325
|
+
changedFiles: [],
|
|
326
|
+
missingExports: [],
|
|
327
|
+
reason: `${dep}@${version}: package.json in ${side} is missing or not valid JSON — cannot compare`,
|
|
328
|
+
inventorySource,
|
|
329
|
+
});
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
// FR-3/AM-1: the LOCAL package's inventory comes from npm, not from a hand-rolled dist/files/bin
|
|
333
|
+
// walk — `.npmignore` (and nested ignore rules) can exclude a file this gate would otherwise walk
|
|
334
|
+
// straight into, producing a false drift about a file npm was never going to ship. AM-1 (Codex
|
|
335
|
+
// review, round-1 finding 3, high): the two sides must stay SYMMETRIC. With a provider injected,
|
|
336
|
+
// the workspace side is npm's OWN shipped-path list; the published side must then be hashed by a
|
|
337
|
+
// FULL recursive walk of the already-unpacked tarball (every file npm actually put there —
|
|
338
|
+
// README/LICENSE included, since npm auto-packs those regardless of `files`), not the narrower
|
|
339
|
+
// `dist`/`files`/`bin` approximation `hashTree` uses — that approximation would silently OMIT an
|
|
340
|
+
// auto-packed README/LICENSE from the published side while the workspace side (via real `npm
|
|
341
|
+
// pack`) correctly includes them, reading as a false "only in workspace" drift. WITHOUT a
|
|
342
|
+
// provider, core has no way to ask npm on either side, so it degrades to the SAME approximation
|
|
343
|
+
// on BOTH sides (symmetry preserved, just cruder) — a named approximation, never a subprocess.
|
|
344
|
+
let workspaceHashes;
|
|
345
|
+
let publishedHashes;
|
|
346
|
+
if (opts.localInventory !== undefined) {
|
|
347
|
+
const localResult = opts.localInventory(workspaceDir);
|
|
348
|
+
if ('unavailable' in localResult) {
|
|
349
|
+
results.push({
|
|
350
|
+
name: dep,
|
|
351
|
+
version,
|
|
352
|
+
status: 'unavailable',
|
|
353
|
+
changedFiles: [],
|
|
354
|
+
missingExports: [],
|
|
355
|
+
reason: `${dep}@${version}: local package inventory unavailable (${localResult.unavailable})`,
|
|
356
|
+
inventorySource,
|
|
357
|
+
});
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
try {
|
|
361
|
+
workspaceHashes = 'packedDir' in localResult
|
|
362
|
+
? hashTreeFull(localResult.packedDir, workspaceManifest)
|
|
363
|
+
: hashTreeFromPaths(workspaceDir, localResult.paths, workspaceManifest);
|
|
364
|
+
}
|
|
365
|
+
catch (err) {
|
|
366
|
+
if (!(err instanceof InventoryListingError))
|
|
367
|
+
throw err;
|
|
368
|
+
results.push({
|
|
369
|
+
name: dep,
|
|
370
|
+
version,
|
|
371
|
+
status: 'unavailable',
|
|
372
|
+
changedFiles: [],
|
|
373
|
+
missingExports: [],
|
|
374
|
+
reason: `${dep}@${version}: local package inventory unusable (${err.message})`,
|
|
375
|
+
inventorySource,
|
|
376
|
+
});
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
publishedHashes = hashTreeFull(fetched.dir, publishedManifest);
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
workspaceHashes = hashTree(workspaceDir, workspaceManifest);
|
|
383
|
+
publishedHashes = hashTree(fetched.dir, publishedManifest);
|
|
384
|
+
}
|
|
385
|
+
const allKeys = new Set([...publishedHashes.keys(), ...workspaceHashes.keys()]);
|
|
386
|
+
const changed = [];
|
|
387
|
+
for (const key of allKeys) {
|
|
388
|
+
if (publishedHashes.get(key) !== workspaceHashes.get(key))
|
|
389
|
+
changed.push(key);
|
|
390
|
+
}
|
|
391
|
+
changed.sort();
|
|
392
|
+
if (changed.length === 0) {
|
|
393
|
+
results.push({ name: dep, version, status: 'same', changedFiles: [], missingExports: [], inventorySource });
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
results.push({
|
|
397
|
+
name: dep,
|
|
398
|
+
version,
|
|
399
|
+
status: 'drift',
|
|
400
|
+
changedFiles: changed,
|
|
401
|
+
missingExports: missingExportNames(fetched.dir, workspaceDir),
|
|
402
|
+
inventorySource,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return results;
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=publish-sibling-drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-sibling-drift.js","sourceRoot":"","sources":["../src/publish-sibling-drift.ts"],"names":[],"mappings":"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"}
|
package/dist/publish.d.ts
CHANGED
|
@@ -49,6 +49,30 @@ export interface PublishResult {
|
|
|
49
49
|
* and the CLI prints it. Absent on a real publish, where every gate actually ran.
|
|
50
50
|
*/
|
|
51
51
|
readonly notVerified?: readonly string[] | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* AM-1 (feature publish-sibling-drift-gate): sha256 of the EXACT tarball bytes that were
|
|
54
|
+
* packed-install-smoked AND handed to `npm publish` — present only when `opts.packedTransport`
|
|
55
|
+
* was used for a live (non-dry-run) publish. Printed and audited so "the smoke tested the same
|
|
56
|
+
* bytes that shipped" is a checkable claim, not an architectural assertion.
|
|
57
|
+
*/
|
|
58
|
+
readonly sha256?: string | undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* One package's packed, smoke-eligible artifact — the unit `opts.packedTransport.smoke` receives
|
|
62
|
+
* (AM-1). Produced ONCE per package, after its OWN bump/build/sign steps, from a package.json
|
|
63
|
+
* whose `workspace:` specs are already resolved to each sibling's PINNED version (the same
|
|
64
|
+
* transformation `rewriteWorkspaceSpecs` performs) — so the tarball is exactly what `npm publish
|
|
65
|
+
* <tgzPath>` will later ship, byte for byte.
|
|
66
|
+
*/
|
|
67
|
+
export interface PackedTarballArtifact {
|
|
68
|
+
readonly name: string;
|
|
69
|
+
readonly newVersion: string;
|
|
70
|
+
readonly tgzPath: string;
|
|
71
|
+
readonly sha256: string;
|
|
72
|
+
}
|
|
73
|
+
export interface PackedTransportSmokeVerdict {
|
|
74
|
+
readonly ok: boolean;
|
|
75
|
+
readonly reason?: string | undefined;
|
|
52
76
|
}
|
|
53
77
|
/** Positive read-back evidence returned by the configured public-mirror command. */
|
|
54
78
|
export interface MirrorReceipt {
|
|
@@ -290,6 +314,26 @@ export declare function publishPackages(monorepoRoot: string, opts?: {
|
|
|
290
314
|
probe?: ((name: string, version: string) => boolean | Omit<ProbeOutcome, 'attempt'>) | undefined;
|
|
291
315
|
/** Pause injection between receipt probes. The default blocks for the requested milliseconds. */
|
|
292
316
|
sleep?: ((milliseconds: number) => void) | undefined;
|
|
317
|
+
/**
|
|
318
|
+
* AM-1 (feature publish-sibling-drift-gate). OPT-IN — omitted (the default), this function is
|
|
319
|
+
* byte-identical to its pre-amendment self: every package still publishes via `pnpm publish`
|
|
320
|
+
* FROM ITS DIRECTORY (`publishArgv`), exactly as every existing test of this function expects.
|
|
321
|
+
*
|
|
322
|
+
* When provided, the transport for THIS call's batch changes: each package is packed ONCE
|
|
323
|
+
* (after its own bump/build/sign, workspace: specs resolved to each sibling's PINNED version —
|
|
324
|
+
* a landed batch sibling's NEW version, an out-of-batch sibling's disk version, mirroring what
|
|
325
|
+
* `rewriteWorkspaceSpecs`/pnpm itself would resolve), collected, and `smoke` is called with
|
|
326
|
+
* EVERY package's packed artifact before ANY of them is published. Only on `smoke.ok === true`
|
|
327
|
+
* does each artifact get `npm publish <tgzPath>` — the exact bytes that were smoked (a sha256
|
|
328
|
+
* recheck immediately before that call refuses on any mismatch, defending the "same bytes"
|
|
329
|
+
* claim against anything that could touch the tarball in between).
|
|
330
|
+
*/
|
|
331
|
+
packedTransport?: {
|
|
332
|
+
/** Absolute, pre-created directory to write tarballs into (this function never mkdirs it). */
|
|
333
|
+
readonly packDestDir: string;
|
|
334
|
+
/** Judge the WHOLE batch's packed artifacts together — nothing publishes until this passes. */
|
|
335
|
+
readonly smoke: (artifacts: readonly PackedTarballArtifact[]) => PackedTransportSmokeVerdict;
|
|
336
|
+
} | undefined;
|
|
293
337
|
}): PublishReport;
|
|
294
338
|
export {};
|
|
295
339
|
//# sourceMappingURL=publish.d.ts.map
|
package/dist/publish.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,KAAK,iCAAiC,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
|