refactor: derive the release identity from the package name

The supply-chain builder id and the two verifier ids each hardcoded the
repository name, in three source files plus a copy in the test fixture.
A project derived from this template had to edit all four, and all four
then became permanent conflict points for every merge back from here.

They now read the `name` this repository already declares in
package.json, so deriving a project is one line. The name is read once
at module load from a URL relative to the module itself, not from the
working directory, because these ids end up in signed provenance and
must not depend on where a script was invoked from. A missing or empty
name throws rather than falling back, for the same reason.

The value is hosted in scripts/lib/supply-chain.ts because all three
consumers already import it and it is already registered in
LOCAL_EVIDENCE_VERIFIER_SOURCE_PATHS. A new module would have needed to
join that list, which is itself part of the evidence surface.

This repository's own name is unchanged, so every emitted id is
byte-identical to before.

Also registers the three adapter files that 5cc4146 added without
updating the inventory ledger, which had left check:adapter-inventory
failing on develop.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
DongHyeonka
2026-09-20 13:47:27 +09:00
co-authored by Claude Opus 5
parent 8dd7cbaea3
commit ebea300e4f
6 changed files with 112 additions and 85 deletions
+21
View File
@@ -1,6 +1,27 @@
import { createHash } from "node:crypto";
import { readFileSync } from "node:fs";
import { readFile } from "node:fs/promises";
function readProjectName(): string {
const manifest: unknown = JSON.parse(
readFileSync(new URL("../../package.json", import.meta.url), "utf8"),
);
const name =
typeof manifest === "object" && manifest !== null
? (manifest as { name?: unknown }).name
: undefined;
if (typeof name !== "string" || name.length === 0) {
throw new TypeError("package.json must declare a non-empty \"name\"");
}
return name;
}
/**
* Identity every release artifact is attributed to. A project derived from this
* template renames itself by editing `name` in package.json and nothing else.
*/
export const PROJECT_NAME = readProjectName();
export type DependencyScope = "production" | "development";
export type LockfilePackage = Readonly<{
name: string;