fix(npm): publish vendored baseline packages

This commit is contained in:
imccyu
2026-08-05 01:01:33 +08:00
parent ca27512529
commit 50ae954ebf

View File

@@ -22,7 +22,11 @@ import { validateTarballPayload } from './publication-payload.ts'
const DEFAULT_REGISTRY = 'https://registry.npm.harnessment.com' const DEFAULT_REGISTRY = 'https://registry.npm.harnessment.com'
const DEFAULT_OUTPUT_DIRECTORY = '.artifacts/npm-baseline' const DEFAULT_OUTPUT_DIRECTORY = '.artifacts/npm-baseline'
const PACKAGE_PATTERNS = ['packages/*/*/package.json', 'apps/*/package.json'] as const const PACKAGE_PATTERNS = [
'vendor/*/package.json',
'packages/*/*/package.json',
'apps/*/package.json',
] as const
const DEPENDENCY_SECTIONS = [ const DEPENDENCY_SECTIONS = [
'dependencies', 'dependencies',
'devDependencies', 'devDependencies',
@@ -101,13 +105,17 @@ interface CommandResult {
interface PackageTarget { interface PackageTarget {
name: string name: string
directory: string directory: string
origin: PackageOrigin
} }
type PackageOrigin = 'harness' | 'vendor'
interface PackedPackage { interface PackedPackage {
name: string name: string
tarball: string tarball: string
sha256: string sha256: string
integrity: string integrity: string
origin: PackageOrigin
} }
interface ReleaseManifest { interface ReleaseManifest {
@@ -237,7 +245,7 @@ class DetachedWorktree {
} }
} }
/** Discovers and stages only two-level package entries and application entries. */ /** Discovers and stages every package published in one repository baseline. */
class WorkspacePackageSet { class WorkspacePackageSet {
private constructor( private constructor(
readonly packages: PackageTarget[], readonly packages: PackageTarget[],
@@ -246,33 +254,38 @@ class WorkspacePackageSet {
static discover(root: string): WorkspacePackageSet { static discover(root: string): WorkspacePackageSet {
const manifestPaths = globSync(PACKAGE_PATTERNS, { cwd: root }).sort() const manifestPaths = globSync(PACKAGE_PATTERNS, { cwd: root }).sort()
if (manifestPaths.length === 0) throw new Error('no package manifests found under packages/ or apps/') if (manifestPaths.length === 0) {
throw new Error('no package manifests found under vendor/, packages/, or apps/')
}
const packages: PackageTarget[] = [] const packages: PackageTarget[] = []
const names = new Set<string>() const names = new Set<string>()
let baseVersion: string | undefined const baseVersion = expectString(readObject(resolve(root, 'package.json')), 'version', 'package.json')
if (!/^\d+\.\d+\.\d+$/.test(baseVersion)) {
throw new Error(`package.json must have a stable X.Y.Z version, got ${baseVersion}`)
}
for (const manifestPath of manifestPaths) { for (const manifestPath of manifestPaths) {
const manifest = readObject(resolve(root, manifestPath)) const manifest = readObject(resolve(root, manifestPath))
const name = expectString(manifest, 'name', manifestPath) const name = expectString(manifest, 'name', manifestPath)
const version = expectString(manifest, 'version', manifestPath) const version = expectString(manifest, 'version', manifestPath)
if (!name.startsWith('@deepseek-ai/')) { const isVendored = manifestPath.startsWith('vendor/')
if (!isVendored && !name.startsWith('@deepseek-ai/')) {
throw new Error(`${manifestPath} must name an @deepseek-ai package`) throw new Error(`${manifestPath} must name an @deepseek-ai package`)
} }
if (name === '@deepseek-ai/dsh-root') { if (name === '@deepseek-ai/dsh-root') {
throw new Error(`${manifestPath} unexpectedly selected the workspace root`) throw new Error(`${manifestPath} unexpectedly selected the workspace root`)
} }
if (names.has(name)) throw new Error(`duplicate package name: ${name}`) if (names.has(name)) throw new Error(`duplicate package name: ${name}`)
if (!/^\d+\.\d+\.\d+$/.test(version)) { if (!isVendored && version !== baseVersion) {
throw new Error(`${manifestPath} must have a stable X.Y.Z version, got ${version}`)
}
baseVersion ??= version
if (version !== baseVersion) {
throw new Error(`${manifestPath} has version ${version}; expected ${baseVersion}`) throw new Error(`${manifestPath} has version ${version}; expected ${baseVersion}`)
} }
names.add(name) names.add(name)
packages.push({ name, directory: dirname(manifestPath) }) packages.push({
name,
directory: dirname(manifestPath),
origin: isVendored ? 'vendor' : 'harness',
})
} }
if (baseVersion === undefined) throw new Error('could not determine the workspace version')
packages.sort((left, right) => left.name.localeCompare(right.name)) packages.sort((left, right) => left.name.localeCompare(right.name))
return new WorkspacePackageSet(packages, baseVersion) return new WorkspacePackageSet(packages, baseVersion)
} }
@@ -307,16 +320,18 @@ class ReleaseBundle {
runner: CommandRunner, runner: CommandRunner,
): ReleaseBundle { ): ReleaseBundle {
const internalNames = new Set(expectedPackages.map(pkg => pkg.name)) const internalNames = new Set(expectedPackages.map(pkg => pkg.name))
const expectedByName = new Map(expectedPackages.map(pkg => [pkg.name, pkg]))
const missingNames = new Set(internalNames) const missingNames = new Set(internalNames)
const packages = readdirSync(directory) const packages = readdirSync(directory)
.filter(name => name.endsWith('.tgz')) .filter(name => name.endsWith('.tgz'))
.sort() .sort()
.map((tarball) => { .map((tarball) => {
const artifact = inspectTarball(resolve(directory, tarball), runner) const artifact = inspectTarball(resolve(directory, tarball), runner)
validateTarballPayload(artifact.files, tarball) const expected = expectedByName.get(artifact.name)
if (!missingNames.delete(artifact.name)) { if (expected === undefined || !missingNames.delete(artifact.name)) {
throw new Error(`unexpected or duplicate packed package: ${artifact.name}`) throw new Error(`unexpected or duplicate packed package: ${artifact.name}`)
} }
if (expected.origin === 'harness') validateTarballPayload(artifact.files, tarball)
if (artifact.version !== version) { if (artifact.version !== version) {
throw new Error(`${tarball} has version ${artifact.version}; expected ${version}`) throw new Error(`${tarball} has version ${artifact.version}; expected ${version}`)
} }
@@ -325,7 +340,7 @@ class ReleaseBundle {
throw new Error(`${tarball} still contains a workspace: dependency`) throw new Error(`${tarball} still contains a workspace: dependency`)
} }
validateInternalDependencyPins(artifact.manifest, internalNames, version, tarball) validateInternalDependencyPins(artifact.manifest, internalNames, version, tarball)
return packedPackage(artifact.name, resolve(directory, tarball)) return packedPackage(artifact.name, resolve(directory, tarball), expected.origin)
}) })
.sort((left, right) => left.name.localeCompare(right.name)) .sort((left, right) => left.name.localeCompare(right.name))
@@ -385,12 +400,12 @@ class ReleaseBundle {
throw new Error(`invalid tarball path for ${pkg.name}: ${pkg.tarball}`) throw new Error(`invalid tarball path for ${pkg.name}: ${pkg.tarball}`)
} }
const path = resolve(this.directory, pkg.tarball) const path = resolve(this.directory, pkg.tarball)
const actual = packedPackage(pkg.name, path) const actual = packedPackage(pkg.name, path, pkg.origin)
if (actual.sha256 !== pkg.sha256 || actual.integrity !== pkg.integrity) { if (actual.sha256 !== pkg.sha256 || actual.integrity !== pkg.integrity) {
throw new Error(`tarball checksum mismatch: ${pkg.tarball}`) throw new Error(`tarball checksum mismatch: ${pkg.tarball}`)
} }
const artifact = inspectTarball(path, runner) const artifact = inspectTarball(path, runner)
validateTarballPayload(artifact.files, pkg.tarball) if (pkg.origin === 'harness') validateTarballPayload(artifact.files, pkg.tarball)
if (artifact.name !== pkg.name || artifact.version !== this.manifest.version) { if (artifact.name !== pkg.name || artifact.version !== this.manifest.version) {
throw new Error(`tarball identity mismatch: ${pkg.tarball}`) throw new Error(`tarball identity mismatch: ${pkg.tarball}`)
} }
@@ -565,6 +580,7 @@ class BaselinePackager {
this.runner.run('pnpm', ['run', 'publint'], worktree.path) this.runner.run('pnpm', ['run', 'publint'], worktree.path)
this.runner.run('pnpm', ['run', 'verify-built-package-invariants'], worktree.path) this.runner.run('pnpm', ['run', 'verify-built-package-invariants'], worktree.path)
this.runner.run('pnpm', [ this.runner.run('pnpm', [
'--filter', './vendor/**',
'--filter', './packages/**', '--filter', './packages/**',
'--filter', './apps/**', '--filter', './apps/**',
'--recursive', '--recursive',
@@ -765,13 +781,14 @@ function inspectTarball(path: string, runner: CommandRunner): InspectedTarball {
} }
} }
function packedPackage(name: string, path: string): PackedPackage { function packedPackage(name: string, path: string, origin: PackageOrigin): PackedPackage {
const bytes = readFileSync(path) const bytes = readFileSync(path)
return { return {
name, name,
tarball: basename(path), tarball: basename(path),
sha256: createHash('sha256').update(bytes).digest('hex'), sha256: createHash('sha256').update(bytes).digest('hex'),
integrity: `sha512-${createHash('sha512').update(bytes).digest('base64')}`, integrity: `sha512-${createHash('sha512').update(bytes).digest('base64')}`,
origin,
} }
} }
@@ -779,7 +796,11 @@ function parsePackedPackage(value: unknown, index: number): PackedPackage {
if (!isRecord(value)) throw new Error(`invalid release manifest package at index ${index}`) if (!isRecord(value)) throw new Error(`invalid release manifest package at index ${index}`)
const context = `release manifest package at index ${index}` const context = `release manifest package at index ${index}`
const name = expectString(value, 'name', context) const name = expectString(value, 'name', context)
if (!name.startsWith('@deepseek-ai/') || name === '@deepseek-ai/dsh-root') { const origin = value.origin === undefined ? 'harness' : value.origin
if (origin !== 'harness' && origin !== 'vendor') {
throw new Error(`invalid package origin in release manifest: ${JSON.stringify(origin)}`)
}
if (origin === 'harness' && (!name.startsWith('@deepseek-ai/') || name === '@deepseek-ai/dsh-root')) {
throw new Error(`invalid package name in release manifest: ${name}`) throw new Error(`invalid package name in release manifest: ${name}`)
} }
return { return {
@@ -787,6 +808,7 @@ function parsePackedPackage(value: unknown, index: number): PackedPackage {
tarball: expectString(value, 'tarball', context), tarball: expectString(value, 'tarball', context),
sha256: expectString(value, 'sha256', context), sha256: expectString(value, 'sha256', context),
integrity: expectString(value, 'integrity', context), integrity: expectString(value, 'integrity', context),
origin,
} }
} }