@atarashi/registry 1.0.1 → 1.0.2

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/index.js CHANGED
@@ -1068,10 +1068,7 @@ var Registry = class {
1068
1068
  try {
1069
1069
  return await layer.source.loadEntry(entry);
1070
1070
  } catch (thrown) {
1071
- if (thrown instanceof RegistryError && thrown.code === DIAGNOSTIC_CODES.INTEGRITY_MISMATCH) {
1072
- throw thrown;
1073
- }
1074
- if (!bundled) throw thrown;
1071
+ if (isIntegrityFailure(thrown) || !bundled) throw thrown;
1075
1072
  break;
1076
1073
  }
1077
1074
  }
@@ -1084,11 +1081,17 @@ var Registry = class {
1084
1081
  async loadPreset(id) {
1085
1082
  const local = await this.local.loadPreset(id);
1086
1083
  if (local) return local;
1084
+ const bundled = await this.bundled?.source.loadPreset(id);
1087
1085
  for (const layer of this.remotes) {
1088
- const preset = await layer.source.loadPreset(id);
1089
- if (preset) return preset;
1086
+ try {
1087
+ const preset = await layer.source.loadPreset(id);
1088
+ if (preset) return preset;
1089
+ } catch (thrown) {
1090
+ if (isIntegrityFailure(thrown) || !bundled) throw thrown;
1091
+ break;
1092
+ }
1090
1093
  }
1091
- return this.bundled?.source.loadPreset(id);
1094
+ return bundled;
1092
1095
  }
1093
1096
  /** Every preset visible from every layer, deduplicated by precedence — `atarashi list presets`. */
1094
1097
  async presets() {
@@ -1099,8 +1102,12 @@ var Registry = class {
1099
1102
  const loaded = await layer.store.load().catch(() => void 0);
1100
1103
  const presetEntries = loaded?.index.entries.filter((entry) => entry.kind === "preset") ?? [];
1101
1104
  for (const entry of presetEntries) {
1102
- const preset = await layer.source.loadPreset(entry.id);
1103
- if (preset) merged.set(preset.id, preset);
1105
+ try {
1106
+ const preset = await layer.source.loadPreset(entry.id);
1107
+ if (preset) merged.set(preset.id, preset);
1108
+ } catch (thrown) {
1109
+ if (isIntegrityFailure(thrown)) throw thrown;
1110
+ }
1104
1111
  }
1105
1112
  }
1106
1113
  for (const preset of await this.local.presets()) merged.set(preset.id, preset);
@@ -1183,6 +1190,7 @@ var Registry = class {
1183
1190
  return this;
1184
1191
  }
1185
1192
  };
1193
+ var isIntegrityFailure = (thrown) => thrown instanceof RegistryError && thrown.code === DIAGNOSTIC_CODES.INTEGRITY_MISMATCH;
1186
1194
  var isNewer = (candidate, incumbent) => valid(candidate) && valid(incumbent) ? gt(candidate, incumbent) : false;
1187
1195
  var createRegistry = (options = {}) => new Registry(options);
1188
1196
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/extract.ts","../src/integrity.ts","../src/paths.ts","../src/cache.ts","../src/http.ts","../src/index-store.ts","../src/loaders/directory.ts","../src/loaders/bundled.ts","../src/loaders/local.ts","../src/loaders/npm.ts","../src/loaders/remote.ts","../src/registry.ts"],"names":["DIAGNOSTIC_CODES","join","mkdir","writeFile","readFile","parseRegistryIndex","resolve","sep","existsSync","readdir","dirname","require_","createRequire","valid"],"mappings":"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","file":"index.js","sourcesContent":["import { DIAGNOSTIC_CODES, type Diagnostic, error } from '@atarashi/schema';\n\n/**\n * Every failure that crosses the registry boundary. Carries a\n * `DIAGNOSTIC_CODES` value so the CLI can map it to an exit code (6 for every\n * registry failure, per doc 04) and the web builder to a UI affordance.\n */\nexport class RegistryError extends Error {\n readonly code: string;\n readonly suggestions: string[];\n readonly detail: string | undefined;\n\n constructor(\n code: string,\n message: string,\n options: { suggestions?: string[]; detail?: string; cause?: unknown } = {}\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = 'RegistryError';\n this.code = code;\n this.suggestions = options.suggestions ?? [];\n this.detail = options.detail;\n }\n\n toDiagnostic(): Diagnostic {\n const rest: Omit<Diagnostic, 'severity' | 'code' | 'message'> = {};\n if (this.suggestions.length > 0) rest.suggestions = this.suggestions;\n if (this.detail) rest.detail = this.detail;\n return error(this.code, this.message, rest);\n }\n}\n\nexport const unavailable = (message: string, suggestions: string[] = []): RegistryError =>\n new RegistryError(DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE, message, { suggestions });\n\nexport const integrityFailure = (message: string, detail?: string): RegistryError =>\n new RegistryError(DIAGNOSTIC_CODES.INTEGRITY_MISMATCH, message, {\n detail,\n suggestions: [\n 'Run `atarashi registry clear` and retry — a corrupt cache entry is the usual cause',\n 'If it reproduces, the artifact has been tampered with: do not use it, and report it',\n ],\n });\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, posix, resolve, sep } from 'node:path';\nimport { gunzipSync } from 'node:zlib';\nimport { DIAGNOSTIC_CODES } from '@atarashi/schema';\nimport { Parser } from 'tar';\nimport { RegistryError } from './errors.js';\n\nexport interface ExtractLimits {\n /** Refuses archives with an absurd number of members. */\n maxEntries: number;\n /** Per-file ceiling. */\n maxFileSize: number;\n /** Total uncompressed bytes — the zip-bomb guard. */\n maxTotalSize: number;\n}\n\nexport const DEFAULT_LIMITS: ExtractLimits = {\n maxEntries: 4_000,\n maxFileSize: 8 * 1024 * 1024,\n maxTotalSize: 64 * 1024 * 1024,\n};\n\nexport interface ExtractedFile {\n path: string;\n mode: number;\n contents: Buffer;\n}\n\nconst unsafe = (message: string, detail?: string) =>\n new RegistryError(DIAGNOSTIC_CODES.PATH_ESCAPE, message, {\n detail,\n suggestions: ['This artifact is malformed or malicious; do not use it, and report it'],\n });\n\nconst GZIP_MAGIC = [0x1f, 0x8b];\n\n/**\n * Blueprint tarballs are `.tgz`. Decompressing here rather than inside the tar\n * parser means the uncompressed-size ceiling is enforced before a single byte\n * of tar is parsed.\n */\nfunction decompress(tarball: Buffer, limits: ExtractLimits): Buffer {\n const gzipped = tarball[0] === GZIP_MAGIC[0] && tarball[1] === GZIP_MAGIC[1];\n if (!gzipped) return tarball;\n try {\n return gunzipSync(tarball, { maxOutputLength: limits.maxTotalSize });\n } catch (cause) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.INTEGRITY_MISMATCH,\n 'Tarball could not be decompressed, or exceeds the uncompressed size limit',\n { cause, detail: `limit ${limits.maxTotalSize} bytes` }\n );\n }\n}\n\n/**\n * The same path rules the writer applies to generated files, applied to archive\n * members: no absolute paths, no drive letters, no `..`, no null bytes. This is\n * a security boundary (doc 09, T1) — every rejection here is a hard failure,\n * never a skipped entry.\n */\nexport function safeEntryPath(raw: string, strip = 0): string | undefined {\n const unified = raw.replace(/\\\\/g, '/');\n\n if (unified.includes('\\0')) throw unsafe('Archive member path contains a null byte', raw);\n if (unified.startsWith('//')) throw unsafe(`Archive member \\`${raw}\\` is a UNC path`);\n if (unified.startsWith('/')) throw unsafe(`Archive member \\`${raw}\\` is an absolute path`);\n if (/^[a-zA-Z]:\\//.test(unified)) throw unsafe(`Archive member \\`${raw}\\` is a drive path`);\n\n const segments = unified.split('/').filter((segment) => segment !== '' && segment !== '.');\n if (segments.includes('..')) {\n throw unsafe(`Archive member \\`${raw}\\` escapes the extraction directory`);\n }\n\n const stripped = segments.slice(strip);\n if (stripped.length === 0) return undefined; // the stripped root directory itself\n return posix.join(...stripped);\n}\n\n/**\n * Parses a tarball entirely in memory. Nothing reaches the filesystem until\n * every member has been validated, so a malicious archive cannot leave a\n * half-extracted mess behind.\n */\nexport async function readTarball(\n tarball: Buffer,\n options: { strip?: number; limits?: Partial<ExtractLimits> } = {}\n): Promise<ExtractedFile[]> {\n const limits = { ...DEFAULT_LIMITS, ...options.limits };\n const raw = decompress(tarball, limits);\n\n const files: ExtractedFile[] = [];\n const seen = new Set<string>();\n let entries = 0;\n let total = 0;\n let failure: unknown;\n\n const parser = new Parser({\n onReadEntry(entry) {\n try {\n if (failure) {\n entry.resume();\n return;\n }\n if (++entries > limits.maxEntries) {\n throw unsafe(`Archive has more than ${limits.maxEntries} members`);\n }\n\n // Symlinks and hard links can point anywhere; devices and FIFOs\n // have no business in a blueprint. Directories are implied by\n // the files inside them.\n if (entry.type === 'SymbolicLink' || entry.type === 'Link') {\n throw unsafe(`Archive member \\`${entry.path}\\` is a link`);\n }\n if (entry.type === 'Directory' || entry.type === 'GNUDumpDir') {\n entry.resume();\n return;\n }\n if (\n entry.type !== 'File' &&\n entry.type !== 'OldFile' &&\n entry.type !== 'ContiguousFile'\n ) {\n throw unsafe(\n `Archive member \\`${entry.path}\\` has unsupported type ${entry.type}`\n );\n }\n\n const path = safeEntryPath(String(entry.path), options.strip ?? 0);\n if (path === undefined) {\n entry.resume();\n return;\n }\n if (seen.has(path.toLowerCase())) {\n throw unsafe(`Archive contains \\`${path}\\` twice, or two names that collide`);\n }\n seen.add(path.toLowerCase());\n\n if ((entry.size ?? 0) > limits.maxFileSize) {\n throw unsafe(\n `Archive member \\`${path}\\` is larger than the ${limits.maxFileSize} byte limit`\n );\n }\n\n const chunks: Buffer[] = [];\n let size = 0;\n entry.on('data', (chunk: Buffer) => {\n size += chunk.length;\n total += chunk.length;\n if (size > limits.maxFileSize || total > limits.maxTotalSize) {\n failure ??= unsafe(`Archive exceeds the ${limits.maxTotalSize} byte limit`);\n return;\n }\n chunks.push(chunk);\n });\n entry.on('end', () => {\n if (failure) return;\n // Executable bit only; everything else is normalized away.\n const mode = (entry.mode ?? 0o644) & 0o111 ? 0o755 : 0o644;\n files.push({ path, mode, contents: Buffer.concat(chunks) });\n });\n } catch (thrown) {\n failure ??= thrown;\n entry.resume();\n }\n },\n });\n\n await new Promise<void>((resolvePromise, rejectPromise) => {\n parser.on('error', rejectPromise);\n parser.on('end', () => resolvePromise());\n parser.end(raw);\n });\n\n if (failure) throw failure;\n if (files.length === 0) throw unsafe('Archive contains no files');\n\n return files.sort((a, b) => (a.path < b.path ? -1 : 1));\n}\n\n/**\n * Writes a validated archive into `dest`. Every resolved path is re-checked\n * against the destination root, so a bug in the path rules above still cannot\n * write outside it.\n */\nexport async function extractTarball(\n tarball: Buffer,\n dest: string,\n options: { strip?: number; limits?: Partial<ExtractLimits> } = {}\n): Promise<string[]> {\n const files = await readTarball(tarball, options);\n const root = resolve(dest);\n\n for (const file of files) {\n const target = resolve(root, file.path);\n if (target !== root && !target.startsWith(root + sep)) {\n throw unsafe(\n `Archive member \\`${file.path}\\` resolves outside the extraction directory`\n );\n }\n }\n\n await mkdir(root, { recursive: true });\n for (const file of files) {\n const target = join(root, file.path);\n await mkdir(dirname(target), { recursive: true });\n // `wx` fails rather than following a symlink someone planted at the\n // target path, and catches two members writing the same file.\n await writeFile(target, file.contents, { mode: file.mode, flag: 'wx' });\n }\n\n return files.map((file) => file.path);\n}\n","import { createHash, timingSafeEqual } from 'node:crypto';\nimport type { JsonValue, RegistryIndex } from '@atarashi/schema';\nimport { integrityFailure } from './errors.js';\n\nexport type HashAlgorithm = 'sha256' | 'sha384' | 'sha512';\n\nconst SRI = /^(sha256|sha384|sha512)-([A-Za-z0-9+/]+={0,2})$/;\n\n/** Subresource-integrity style digest: `sha256-<base64>`. */\nexport function digest(data: Buffer | string, algorithm: HashAlgorithm = 'sha256'): string {\n return `${algorithm}-${createHash(algorithm).update(data).digest('base64')}`;\n}\n\n/** The hex form, used for content-addressed directory names. */\nexport function hexDigest(data: Buffer | string, algorithm: HashAlgorithm = 'sha256'): string {\n return createHash(algorithm).update(data).digest('hex');\n}\n\nexport function parseIntegrity(value: string): { algorithm: HashAlgorithm; base64: string } {\n const match = SRI.exec(value);\n if (!match) {\n throw integrityFailure(`\\`${value}\\` is not a valid integrity digest`);\n }\n return { algorithm: match[1] as HashAlgorithm, base64: match[2]! };\n}\n\n/**\n * A mismatch is a hard failure that names the artifact — never a silent\n * fallback to an unverified copy (doc 09, T4).\n */\nexport function verifyIntegrity(data: Buffer, expected: string, what: string): void {\n const { algorithm } = parseIntegrity(expected);\n const actual = digest(data, algorithm);\n\n const a = Buffer.from(actual);\n const b = Buffer.from(expected);\n if (a.length !== b.length || !timingSafeEqual(a, b)) {\n throw integrityFailure(\n `Integrity check failed for ${what}`,\n `expected ${expected}, computed ${actual}`\n );\n }\n}\n\n/**\n * Deterministic JSON: object keys sorted, no incidental whitespace. Two\n * machines must produce the same bytes for the same document, or the root hash\n * is meaningless.\n */\nexport function canonicalize(value: JsonValue | unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value ?? null);\n if (Array.isArray(value)) return `[${value.map(canonicalize).join(',')}]`;\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([key, v]) => `${JSON.stringify(key)}:${canonicalize(v)}`);\n return `{${entries.join(',')}}`;\n}\n\n/** The index's root hash covers its entries and its version manifest. */\nexport function indexRootHash(\n index: Pick<RegistryIndex, 'entries' | 'versionManifest' | 'version' | 'indexVersion'>\n): string {\n return digest(\n canonicalize({\n indexVersion: index.indexVersion,\n version: index.version,\n entries: index.entries,\n versionManifest: index.versionManifest ?? null,\n })\n );\n}\n\nexport function verifyIndexIntegrity(index: RegistryIndex, source: string): void {\n if (!index.integrity) return; // Unsigned local mirrors are allowed; remote ones are not.\n const actual = indexRootHash(index);\n if (actual !== index.integrity) {\n throw integrityFailure(\n `Registry index ${index.version} failed its root hash check (${source})`,\n `expected ${index.integrity}, computed ${actual}`\n );\n }\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/** The default public registry. Overridable per-run and per-source. */\nexport const DEFAULT_REGISTRY_URL = 'https://atarashi.gautamsuthar.in/registry';\n\n/** The index is re-checked at most once a day; pinned versions are immutable. */\nexport const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface CacheLayout {\n root: string;\n /** Verified index documents, one file per registry version. */\n index: string;\n /** Extracted blueprints, each directory named by its content hash. */\n blueprints: string;\n /** ETags and fetch timestamps. */\n meta: string;\n}\n\n/**\n * XDG on Linux, the platform convention elsewhere. `ATARASHI_CACHE_DIR` wins so\n * CI can point the whole cache at a single restorable directory.\n */\nexport function resolveCacheRoot(\n env: NodeJS.ProcessEnv = process.env,\n platform = process.platform\n) {\n const override = env.ATARASHI_CACHE_DIR?.trim();\n if (override) return override;\n\n if (platform === 'win32') {\n const base = env.LOCALAPPDATA?.trim() || join(homedir(), 'AppData', 'Local');\n return join(base, 'atarashi', 'Cache');\n }\n if (platform === 'darwin') {\n return join(homedir(), 'Library', 'Caches', 'atarashi');\n }\n const xdg = env.XDG_CACHE_HOME?.trim();\n return join(xdg || join(homedir(), '.cache'), 'atarashi');\n}\n\nexport function cacheLayout(root: string): CacheLayout {\n return {\n root,\n index: join(root, 'index'),\n blueprints: join(root, 'blueprints'),\n meta: join(root, 'meta.json'),\n };\n}\n\n/** `db/postgres` → `db-postgres`, so ids are usable as path and file names. */\nexport const slugifyId = (id: string): string => id.replace(/\\//g, '-');\n","import { existsSync } from 'node:fs';\nimport { mkdir, readdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DIAGNOSTIC_CODES, parseRegistryIndex, type RegistryIndex } from '@atarashi/schema';\nimport { integrityFailure, RegistryError } from './errors.js';\nimport { extractTarball } from './extract.js';\nimport { hexDigest, parseIntegrity, verifyIndexIntegrity, verifyIntegrity } from './integrity.js';\nimport { type CacheLayout, cacheLayout, slugifyId } from './paths.js';\n\n/** What we remember between runs: ETags, fetch times and what is extracted. */\nexport interface CacheMeta {\n metaVersion: 1;\n index: Record<string, { etag?: string; fetchedAt: string; version: string }>;\n blueprints: Record<string, { id: string; version: string; integrity: string; dir: string }>;\n}\n\nconst EMPTY_META: CacheMeta = { metaVersion: 1, index: {}, blueprints: {} };\n\n/** A cache directory counts as populated only once its manifest is in place. */\nconst hasManifest = (dir: string): boolean =>\n existsSync(join(dir, 'blueprint.json')) || existsSync(join(dir, 'preset.json'));\n\nconst readJson = async (path: string): Promise<unknown> => {\n const raw = await readFile(path, 'utf8');\n return JSON.parse(raw) as unknown;\n};\n\nconst writeJson = async (path: string, value: unknown): Promise<void> => {\n await mkdir(join(path, '..'), { recursive: true });\n // Write-then-rename: a killed process never leaves a truncated cache file.\n const temporary = `${path}.${process.pid}.tmp`;\n await writeFile(temporary, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n await rename(temporary, path);\n};\n\n/**\n * The on-disk cache. Content-addressed: a blueprint directory is named by its\n * tarball's hash, so entries for different versions never collide and the whole\n * directory is safe to share between projects and CI runs.\n */\nexport class RegistryCache {\n readonly layout: CacheLayout;\n private meta: CacheMeta | undefined;\n\n constructor(root: string) {\n this.layout = cacheLayout(root);\n }\n\n async readMeta(): Promise<CacheMeta> {\n if (this.meta) return this.meta;\n try {\n const parsed = (await readJson(this.layout.meta)) as CacheMeta;\n this.meta =\n parsed && parsed.metaVersion === 1\n ? { ...EMPTY_META, ...parsed }\n : { ...EMPTY_META };\n } catch {\n // A missing or unreadable cache is not an error; it is a cold cache.\n this.meta = { ...EMPTY_META };\n }\n return this.meta;\n }\n\n async writeMeta(update: (meta: CacheMeta) => void): Promise<void> {\n const meta = await this.readMeta();\n update(meta);\n this.meta = meta;\n await writeJson(this.layout.meta, meta);\n }\n\n indexPath(version: string): string {\n return join(this.layout.index, `${version}.json`);\n }\n\n async readIndex(version: string, source: string): Promise<RegistryIndex | undefined> {\n const path = this.indexPath(version);\n if (!existsSync(path)) return undefined;\n\n let raw: unknown;\n try {\n raw = await readJson(path);\n } catch (cause) {\n await rm(path, { force: true });\n throw new RegistryError(\n DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE,\n `Cached registry index ${version} is unreadable`,\n { cause, suggestions: ['Run `atarashi registry update` to fetch it again'] }\n );\n }\n\n const parsed = parseRegistryIndex(raw, path);\n if (!parsed.ok) {\n await rm(path, { force: true });\n throw new RegistryError(parsed.error.code, parsed.error.message, {\n suggestions: ['Run `atarashi registry update` to fetch a fresh index'],\n });\n }\n\n verifyIndexIntegrity(parsed.value, `${source} (cached)`);\n return parsed.value;\n }\n\n async writeIndex(index: RegistryIndex): Promise<void> {\n await mkdir(this.layout.index, { recursive: true });\n await writeJson(this.indexPath(index.version), index);\n }\n\n /** Every registry version this machine has already verified. */\n async cachedIndexVersions(): Promise<string[]> {\n try {\n const files = await readdir(this.layout.index);\n return files\n .filter((file) => file.endsWith('.json'))\n .map((file) => file.slice(0, -'.json'.length));\n } catch {\n return [];\n }\n }\n\n /**\n * Content-addressed, but still legible: `db-postgres-1.2.0-8f2c…`. The hash\n * suffix is what makes it content-addressed; the rest is for humans reading\n * `atarashi registry verify` output.\n */\n blueprintDir(id: string, version: string, integrity: string): string {\n const { base64 } = parseIntegrity(integrity);\n const short = Buffer.from(base64, 'base64').toString('hex').slice(0, 12);\n return join(this.layout.blueprints, `${slugifyId(id)}-${version}-${short}`);\n }\n\n hasBlueprint(id: string, version: string, integrity: string): boolean {\n return hasManifest(this.blueprintDir(id, version, integrity));\n }\n\n /**\n * Verifies, extracts into a temp directory, then renames into place — so a\n * cache directory only ever exists in its complete, verified form.\n */\n async storeBlueprint(\n entry: { id: string; version: string; integrity: string },\n tarball: Buffer\n ): Promise<string> {\n verifyIntegrity(tarball, entry.integrity, `${entry.id}@${entry.version}`);\n\n const target = this.blueprintDir(entry.id, entry.version, entry.integrity);\n if (hasManifest(target)) return target;\n\n const staging = `${target}.${process.pid}.${hexDigest(String(Date.now())).slice(0, 8)}`;\n await rm(staging, { recursive: true, force: true });\n\n try {\n await extractTarball(tarball, staging);\n if (!hasManifest(staging)) {\n throw integrityFailure(\n `${entry.id}@${entry.version} has no \\`blueprint.json\\` at its root`\n );\n }\n await mkdir(this.layout.blueprints, { recursive: true });\n await rm(target, { recursive: true, force: true });\n await rename(staging, target);\n } finally {\n await rm(staging, { recursive: true, force: true });\n }\n\n await this.writeMeta((meta) => {\n meta.blueprints[`${entry.id}@${entry.version}`] = {\n id: entry.id,\n version: entry.version,\n integrity: entry.integrity,\n dir: target,\n };\n });\n\n return target;\n }\n\n async clear(): Promise<void> {\n this.meta = undefined;\n await rm(this.layout.root, { recursive: true, force: true });\n }\n\n /**\n * Re-checks that everything the meta file claims is cached is still there.\n * Extracted trees cannot be re-hashed against the tarball digest, so this\n * reports presence and shape, and prunes what has gone missing.\n */\n async verify(): Promise<{ checked: number; removed: string[] }> {\n const meta = await this.readMeta();\n const removed: string[] = [];\n let checked = 0;\n\n for (const [key, record] of Object.entries(meta.blueprints)) {\n checked += 1;\n if (!hasManifest(record.dir)) removed.push(key);\n }\n\n for (const version of await this.cachedIndexVersions()) {\n checked += 1;\n try {\n await this.readIndex(version, 'cache');\n } catch {\n removed.push(`index@${version}`);\n }\n }\n\n if (removed.length > 0) {\n await this.writeMeta((current) => {\n for (const key of removed) delete current.blueprints[key];\n });\n }\n\n return { checked, removed };\n }\n\n async size(): Promise<number> {\n const walk = async (dir: string): Promise<number> => {\n let total = 0;\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return 0;\n }\n for (const entry of entries) {\n const path = join(dir, entry);\n const info = await stat(path).catch(() => undefined);\n if (!info) continue;\n total += info.isDirectory() ? await walk(path) : info.size;\n }\n return total;\n };\n return walk(this.layout.root);\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport { RegistryError, unavailable } from './errors.js';\nimport { DEFAULT_LIMITS } from './extract.js';\n\nexport type FetchLike = (url: string, init?: RequestInit) => Promise<Response>;\n\nexport interface HttpResponse {\n status: number;\n body: Buffer;\n etag: string | undefined;\n}\n\n/**\n * TLS only, with no plaintext fallback (doc 09, T4). `file:` is allowed so a\n * local mirror — and the test suite — can stand in for the CDN.\n */\nexport function assertFetchable(url: string): URL {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw unavailable(`\\`${url}\\` is not a valid registry URL`);\n }\n if (parsed.protocol === 'https:' || parsed.protocol === 'file:') return parsed;\n if (parsed.protocol === 'http:') {\n throw unavailable(`Refusing to fetch the registry over plain HTTP: ${url}`, [\n 'Use an `https://` registry URL',\n ]);\n }\n throw unavailable(`Unsupported registry protocol \\`${parsed.protocol}\\` in ${url}`);\n}\n\nexport interface HttpOptions {\n etag?: string | undefined;\n timeoutMs?: number;\n maxBytes?: number;\n fetchImpl?: FetchLike;\n}\n\n/**\n * A conditional GET. `304` comes back with an empty body and the caller keeps\n * what it has cached; anything else is a registry failure with the URL named.\n */\nexport async function httpGet(url: string, options: HttpOptions = {}): Promise<HttpResponse> {\n const parsed = assertFetchable(url);\n const maxBytes = options.maxBytes ?? DEFAULT_LIMITS.maxTotalSize;\n\n if (parsed.protocol === 'file:') {\n try {\n const body = await readFile(fileURLToPath(parsed));\n return { status: 200, body, etag: undefined };\n } catch {\n throw unavailable(`Cannot read ${url}`);\n }\n }\n\n const fetchImpl = options.fetchImpl ?? (globalThis.fetch as FetchLike | undefined);\n if (!fetchImpl) {\n throw unavailable('This Node build has no global `fetch`', [\n 'Upgrade to Node 20.11 or newer',\n ]);\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 15_000);\n\n try {\n const headers: Record<string, string> = { accept: 'application/json, application/gzip' };\n if (options.etag) headers['if-none-match'] = options.etag;\n\n const response = await fetchImpl(url, { headers, signal: controller.signal });\n const etag = response.headers.get('etag') ?? undefined;\n\n if (response.status === 304) return { status: 304, body: Buffer.alloc(0), etag };\n if (!response.ok) {\n throw unavailable(`${url} responded ${response.status} ${response.statusText}`.trim());\n }\n\n const body = Buffer.from(await response.arrayBuffer());\n if (body.byteLength > maxBytes) {\n throw unavailable(\n `${url} returned ${body.byteLength} bytes, over the ${maxBytes} limit`\n );\n }\n return { status: response.status, body, etag };\n } catch (cause) {\n if (cause instanceof RegistryError) throw cause;\n const reason = cause instanceof Error ? cause.message : String(cause);\n throw unavailable(`Cannot reach ${url}: ${reason}`, [\n 'Check your network connection, or run with `--offline` to use the cache',\n ]);\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** Joins a registry base URL with a path, tolerating a trailing slash either way. */\nexport const joinUrl = (base: string, path: string): string =>\n /^[a-z][a-z0-9+.-]*:/i.test(path)\n ? path\n : `${base.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`;\n","import {\n DIAGNOSTIC_CODES,\n type Diagnostic,\n parseRegistryIndex,\n type RegistryIndex,\n warning,\n} from '@atarashi/schema';\nimport { rcompare, valid } from 'semver';\nimport type { RegistryCache } from './cache.js';\nimport { RegistryError, unavailable } from './errors.js';\nimport { type FetchLike, httpGet, joinUrl } from './http.js';\nimport { verifyIndexIntegrity } from './integrity.js';\nimport { DEFAULT_REGISTRY_URL, DEFAULT_TTL_MS } from './paths.js';\n\nexport interface IndexStoreOptions {\n cache: RegistryCache;\n url?: string;\n /** Exact registry version to resolve against. Immutable once published. */\n pin?: string | null;\n offline?: boolean;\n ttlMs?: number;\n fetchImpl?: FetchLike;\n now?: () => Date;\n /** Third-party sources never get to run hooks, whatever their index says. */\n trusted?: boolean;\n}\n\n/** Where a resolved index came from — reported by `atarashi doctor`. */\nexport interface IndexOrigin {\n version: string;\n url: string;\n from: 'network' | 'cache' | 'bundled';\n fetchedAt?: string;\n integrity?: string;\n}\n\nconst indexUrl = (base: string, pin?: string | null): string =>\n pin ? joinUrl(base, `v1/${pin}/index.json`) : joinUrl(base, 'v1/index.json');\n\n/**\n * Fetches, verifies and caches the registry index.\n *\n * Freshness is a 24 h TTL plus an ETag: inside the TTL nothing is requested at\n * all, and after it a `304` costs one conditional GET. A pinned version skips\n * both — it is immutable, so a cache hit is always correct.\n */\nexport class IndexStore {\n private readonly options: Required<Pick<IndexStoreOptions, 'url' | 'ttlMs'>> &\n IndexStoreOptions;\n private loaded: { index: RegistryIndex; origin: IndexOrigin } | undefined;\n readonly diagnostics: Diagnostic[] = [];\n\n constructor(options: IndexStoreOptions) {\n this.options = {\n url: DEFAULT_REGISTRY_URL,\n ttlMs: DEFAULT_TTL_MS,\n ...options,\n };\n }\n\n get url(): string {\n return this.options.url;\n }\n\n get origin(): IndexOrigin | undefined {\n return this.loaded?.origin;\n }\n\n /** Resolves once per process; subsequent calls reuse the verified document. */\n async load(): Promise<{ index: RegistryIndex; origin: IndexOrigin }> {\n if (this.loaded) return this.loaded;\n this.loaded = this.options.pin\n ? await this.loadPinned(this.options.pin)\n : await this.loadLatest();\n return this.loaded;\n }\n\n /** Discards the TTL and re-checks the network — `atarashi registry update`. */\n async refresh(): Promise<{ index: RegistryIndex; origin: IndexOrigin }> {\n this.loaded = undefined;\n const cache = this.options.cache;\n await cache.writeMeta((meta) => {\n delete meta.index[indexUrl(this.options.url, this.options.pin)];\n });\n return this.load();\n }\n\n private async loadPinned(version: string) {\n const cache = this.options.cache;\n if (!valid(version)) {\n throw unavailable(`\\`${version}\\` is not a valid registry version`, [\n 'Registry versions are exact semver, e.g. `atarashi registry pin 1.4.2`',\n ]);\n }\n\n const cached = await cache.readIndex(version, this.options.url);\n if (cached) {\n return { index: cached, origin: this.originOf(cached, 'cache') };\n }\n if (this.options.offline) {\n throw unavailable(`Registry ${version} is pinned but not cached, and you are offline`, [\n 'Run `atarashi registry update` with a network connection',\n 'Or remove the pin with `atarashi registry unpin`',\n ]);\n }\n\n const url = indexUrl(this.options.url, version);\n const response = await httpGet(url, { fetchImpl: this.options.fetchImpl });\n const index = this.parse(response.body, url);\n if (index.version !== version) {\n throw unavailable(\n `Registry ${version} was requested but ${url} served ${index.version}`\n );\n }\n await this.persist(index, url, response.etag);\n return { index, origin: this.originOf(index, 'network') };\n }\n\n private async loadLatest() {\n const cache = this.options.cache;\n const url = indexUrl(this.options.url);\n const meta = await cache.readMeta();\n const record = meta.index[url];\n\n const cachedIndex = record ? await cache.readIndex(record.version, url) : undefined;\n\n if (this.options.offline) {\n const offlineIndex = cachedIndex ?? (await this.newestCached());\n if (offlineIndex)\n return { index: offlineIndex, origin: this.originOf(offlineIndex, 'cache') };\n throw unavailable('No cached registry index, and the network is disabled', [\n 'Run `atarashi registry update` with a network connection',\n 'Bundled blueprints still work offline — drop `--offline` only if you need registry-only ones',\n ]);\n }\n\n if (cachedIndex && record && this.isFresh(record.fetchedAt)) {\n return {\n index: cachedIndex,\n origin: this.originOf(cachedIndex, 'cache', record.fetchedAt),\n };\n }\n\n try {\n const response = await httpGet(url, {\n etag: record?.etag,\n fetchImpl: this.options.fetchImpl,\n });\n\n if (response.status === 304 && cachedIndex) {\n await this.touch(url, cachedIndex.version, record?.etag);\n return { index: cachedIndex, origin: this.originOf(cachedIndex, 'cache') };\n }\n\n const index = this.parse(response.body, url);\n await this.persist(index, url, response.etag);\n return { index, origin: this.originOf(index, 'network') };\n } catch (thrown) {\n // Integrity failures are never survivable; unreachability is.\n if (\n thrown instanceof RegistryError &&\n thrown.code !== DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE\n ) {\n throw thrown;\n }\n const fallback = cachedIndex ?? (await this.newestCached());\n if (!fallback) throw thrown;\n\n this.diagnostics.push(\n warning(\n DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE,\n `Registry unreachable; using the cached index ${fallback.version}`,\n {\n detail: thrown instanceof Error ? thrown.message : String(thrown),\n suggestions: ['Run `atarashi registry update` once you are back online'],\n }\n )\n );\n return { index: fallback, origin: this.originOf(fallback, 'cache') };\n }\n }\n\n private parse(body: Buffer, url: string): RegistryIndex {\n let raw: unknown;\n try {\n raw = JSON.parse(body.toString('utf8')) as unknown;\n } catch (cause) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE,\n `${url} did not return valid JSON`,\n { cause }\n );\n }\n\n const parsed = parseRegistryIndex(raw, url);\n if (!parsed.ok) {\n throw new RegistryError(parsed.error.code, `${parsed.error.message} (${url})`, {\n suggestions: ['Upgrade Atarashi — this index may use a newer index version'],\n });\n }\n\n verifyIndexIntegrity(parsed.value, url);\n return parsed.value;\n }\n\n private async persist(index: RegistryIndex, url: string, etag: string | undefined) {\n await this.options.cache.writeIndex(index);\n await this.touch(url, index.version, etag);\n }\n\n private async touch(url: string, version: string, etag: string | undefined) {\n const fetchedAt = this.nowIso();\n await this.options.cache.writeMeta((meta) => {\n meta.index[url] = etag ? { etag, fetchedAt, version } : { fetchedAt, version };\n });\n }\n\n private async newestCached(): Promise<RegistryIndex | undefined> {\n const versions = (await this.options.cache.cachedIndexVersions())\n .filter((version) => valid(version))\n .sort(rcompare);\n for (const version of versions) {\n const index = await this.options.cache.readIndex(version, this.options.url);\n if (index) return index;\n }\n return undefined;\n }\n\n private isFresh(fetchedAt: string): boolean {\n const age = this.now() - Date.parse(fetchedAt);\n return Number.isFinite(age) && age >= 0 && age < this.options.ttlMs;\n }\n\n private originOf(\n index: RegistryIndex,\n from: IndexOrigin['from'],\n fetchedAt?: string\n ): IndexOrigin {\n const origin: IndexOrigin = { version: index.version, url: this.options.url, from };\n if (fetchedAt) origin.fetchedAt = fetchedAt;\n if (index.integrity) origin.integrity = index.integrity;\n return origin;\n }\n\n private now(): number {\n return (this.options.now?.() ?? new Date()).getTime();\n }\n\n private nowIso(): string {\n return new Date(this.now()).toISOString();\n }\n}\n","import { existsSync } from 'node:fs';\nimport { lstat, readdir, readFile } from 'node:fs/promises';\nimport { isAbsolute, join, relative, resolve, sep } from 'node:path';\nimport type { BlueprintSummary, LoadedBlueprint } from '@atarashi/core';\nimport {\n type BlueprintManifest,\n DIAGNOSTIC_CODES,\n type PresetManifest,\n parseBlueprintManifest,\n parsePresetManifest,\n} from '@atarashi/schema';\nimport { RegistryError } from '../errors.js';\n\nexport const MANIFEST_FILE = 'blueprint.json';\nexport const PRESET_FILE = 'preset.json';\n\nconst invalid = (message: string, suggestions: string[] = []) =>\n new RegistryError(DIAGNOSTIC_CODES.SCHEMA_INVALID, message, { suggestions });\n\n/**\n * Reads a file from inside a blueprint directory. Blueprint-relative paths are\n * attacker-controlled, so they get the same treatment as output paths: no\n * escaping the blueprint root, and no following a symlink out of it.\n */\nasync function readInside(root: string, path: string): Promise<Buffer> {\n if (path.includes('\\0')) throw invalid(`Blueprint file path contains a null byte`);\n if (isAbsolute(path)) throw invalid(`Blueprint file \\`${path}\\` must be relative`);\n\n const target = resolve(root, path);\n const rel = relative(root, target);\n if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.PATH_ESCAPE,\n `Blueprint file \\`${path}\\` resolves outside its own directory`\n );\n }\n\n // Walk the chain so a symlink at any depth is caught, not just the leaf.\n let walked = root;\n for (const segment of rel.split(sep)) {\n walked = join(walked, segment);\n const info = await lstat(walked).catch(() => undefined);\n if (info?.isSymbolicLink()) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.PATH_ESCAPE,\n `Blueprint file \\`${path}\\` passes through the symlink \\`${segment}\\``\n );\n }\n }\n\n return readFile(target);\n}\n\nexport interface DirectoryBlueprintOptions {\n trusted: boolean;\n /** Human-readable provenance for diagnostics. Defaults to the directory. */\n origin?: string;\n}\n\n/** Loads one blueprint from a directory containing a `blueprint.json`. */\nexport async function loadBlueprintDir(\n dir: string,\n options: DirectoryBlueprintOptions\n): Promise<LoadedBlueprint> {\n const manifestPath = join(dir, MANIFEST_FILE);\n if (!existsSync(manifestPath)) {\n throw invalid(`No \\`${MANIFEST_FILE}\\` in ${dir}`, [\n 'Run `atarashi create-blueprint --validate .` inside the blueprint',\n ]);\n }\n\n const raw = await readFile(manifestPath, 'utf8');\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(raw) as unknown;\n } catch (cause) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.SCHEMA_INVALID,\n `${manifestPath} is not valid JSON`,\n { cause }\n );\n }\n\n const parsed = parseBlueprintManifest(parsedJson, manifestPath);\n if (!parsed.ok) {\n throw new RegistryError(parsed.error.code, parsed.error.message, {\n detail: parsed.error.diagnostics.map((d) => d.message).join('\\n'),\n });\n }\n\n return {\n manifest: parsed.value,\n origin: options.origin ?? dir,\n dir,\n trusted: options.trusted,\n readFile: (path: string) => readInside(dir, path),\n };\n}\n\nexport async function loadPresetFile(path: string): Promise<PresetManifest> {\n const parsed = parsePresetManifest(JSON.parse(await readFile(path, 'utf8')) as unknown, path);\n if (!parsed.ok) {\n throw new RegistryError(parsed.error.code, parsed.error.message, {\n detail: parsed.error.diagnostics.map((d) => d.message).join('\\n'),\n });\n }\n return parsed.value;\n}\n\nexport const summarize = (manifest: BlueprintManifest): BlueprintSummary => ({\n id: manifest.id,\n version: manifest.version,\n provides: manifest.provides,\n requires: manifest.requires,\n conflicts: manifest.conflicts,\n deprecated: Boolean(manifest.deprecated),\n});\n\n/**\n * A tree of blueprints laid out as `<root>/<namespace>/<name>/blueprint.json`,\n * with presets in `<root>/../presets/*.json`. Backs both the bundled collection\n * and a project's own `./.atarashi/blueprints`.\n */\nexport class DirectorySource {\n private manifests: Map<string, string> | undefined;\n\n constructor(\n readonly root: string,\n private readonly options: DirectoryBlueprintOptions & { presetsDir?: string }\n ) {}\n\n /** Scans lazily and once — a cold `atarashi list` should not pay twice. */\n private async scan(): Promise<Map<string, string>> {\n if (this.manifests) return this.manifests;\n const found = new Map<string, string>();\n\n if (existsSync(this.root)) {\n for (const namespace of await readdir(this.root, { withFileTypes: true })) {\n if (!namespace.isDirectory()) continue;\n const namespaceDir = join(this.root, namespace.name);\n for (const name of await readdir(namespaceDir, { withFileTypes: true })) {\n if (!name.isDirectory()) continue;\n const dir = join(namespaceDir, name.name);\n if (existsSync(join(dir, MANIFEST_FILE))) {\n found.set(`${namespace.name}/${name.name}`, dir);\n }\n }\n }\n }\n\n this.manifests = found;\n return found;\n }\n\n async ids(): Promise<string[]> {\n return [...(await this.scan()).keys()].sort();\n }\n\n async has(id: string): Promise<boolean> {\n return (await this.scan()).has(id);\n }\n\n async load(id: string): Promise<LoadedBlueprint | undefined> {\n const dir = (await this.scan()).get(id);\n if (!dir) return undefined;\n return loadBlueprintDir(dir, this.options);\n }\n\n async summaries(): Promise<BlueprintSummary[]> {\n const out: BlueprintSummary[] = [];\n for (const id of await this.ids()) {\n const blueprint = await this.load(id);\n if (blueprint) out.push(summarize(blueprint.manifest));\n }\n return out;\n }\n\n async loadPreset(id: string): Promise<PresetManifest | undefined> {\n const dir = this.options.presetsDir;\n if (!dir) return undefined;\n const file = join(dir, `${id.replace(/^preset\\//, '')}.json`);\n if (!existsSync(file)) return undefined;\n return loadPresetFile(file);\n }\n\n async presets(): Promise<PresetManifest[]> {\n const dir = this.options.presetsDir;\n if (!dir || !existsSync(dir)) return [];\n const files = (await readdir(dir)).filter((file) => file.endsWith('.json')).sort();\n return Promise.all(files.map((file) => loadPresetFile(join(dir, file))));\n }\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\nimport { DirectorySource } from './directory.js';\n\nconst require_ = createRequire(import.meta.url);\n\n/**\n * The first-party collection shipped inside the npm package. Its presence is\n * why `atarashi new` works on a plane: no index fetch, no tarball, no network.\n */\nexport function findBundledRoot(explicit?: string): string | undefined {\n if (explicit) return existsSync(explicit) ? explicit : undefined;\n try {\n return dirname(require_.resolve('@atarashi/blueprints/package.json'));\n } catch {\n return undefined;\n }\n}\n\nexport interface BundledSource {\n source: DirectorySource;\n root: string;\n versionManifestPath: string;\n}\n\nexport function createBundledSource(explicit?: string): BundledSource | undefined {\n const root = findBundledRoot(explicit);\n if (!root) return undefined;\n\n return {\n root,\n versionManifestPath: join(root, 'version-manifest.json'),\n source: new DirectorySource(join(root, 'blueprints'), {\n trusted: true,\n origin: 'bundled',\n presetsDir: join(root, 'presets'),\n }),\n };\n}\n\n/**\n * The bundled fallback for the registry's version manifest, so dependency\n * ranges resolve offline exactly as they do online.\n */\nexport async function readBundledVersionManifest(\n path: string\n): Promise<Record<string, string> | undefined> {\n if (!existsSync(path)) return undefined;\n try {\n const raw = JSON.parse(await readFile(path, 'utf8')) as {\n packages?: Record<string, string>;\n };\n return raw.packages ?? {};\n } catch {\n return undefined;\n }\n}\n","import { join } from 'node:path';\nimport { DirectorySource } from './directory.js';\n\n/** Where a project keeps blueprints it is developing or vendoring. */\nexport const LOCAL_BLUEPRINTS_DIR = join('.atarashi', 'blueprints');\n\n/**\n * Project-local blueprints win over every other source, so an author can\n * override a published blueprint by dropping a directory in the project. They\n * are untrusted all the same: being on disk is not review.\n */\nexport function createLocalSource(cwd: string, dir?: string): DirectorySource {\n const root = dir ?? join(cwd, LOCAL_BLUEPRINTS_DIR);\n return new DirectorySource(root, {\n trusted: false,\n origin: `local:${root}`,\n presetsDir: join(root, '..', 'presets'),\n });\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { dirname, join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { BlueprintSummary, LoadedBlueprint } from '@atarashi/core';\nimport { DIAGNOSTIC_CODES } from '@atarashi/schema';\nimport { RegistryError } from '../errors.js';\nimport { loadBlueprintDir, summarize } from './directory.js';\n\nexport const NPM_PREFIX = 'npm:';\nexport const NPM_PACKAGE_PATTERN = /^(?:@[a-z0-9-~][a-z0-9-._~]*\\/)?atarashi-blueprint-[a-z0-9-]+$/;\n\n/** `npm:atarashi-blueprint-redis` → `atarashi-blueprint-redis`. */\nexport const parseNpmSpec = (spec: string): string | undefined =>\n spec.startsWith(NPM_PREFIX) ? spec.slice(NPM_PREFIX.length) : undefined;\n\n/**\n * A community blueprint published to npm. The package's `atarashi` field points\n * at the directory holding its `blueprint.json`; everything else about it is\n * treated as hostile — untrusted, so hooks require explicit consent.\n */\nexport class NpmSource {\n private readonly cache = new Map<string, LoadedBlueprint>();\n private resolved: Map<string, LoadedBlueprint> | undefined;\n\n constructor(\n private readonly cwd: string,\n private readonly packages: string[] = []\n ) {}\n\n /** Adds a package for this run, e.g. from `--add npm:atarashi-blueprint-redis`. */\n add(spec: string): this {\n const name = parseNpmSpec(spec) ?? spec;\n if (!this.packages.includes(name)) {\n this.packages.push(name);\n this.resolved = undefined;\n }\n return this;\n }\n\n private async loadPackage(name: string): Promise<LoadedBlueprint> {\n const existing = this.cache.get(name);\n if (existing) return existing;\n\n if (!NPM_PACKAGE_PATTERN.test(name)) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.UNKNOWN_BLUEPRINT,\n `\\`${name}\\` is not a blueprint package name`,\n {\n suggestions: [\n 'Community blueprint packages are named `atarashi-blueprint-<name>`',\n ],\n }\n );\n }\n\n const require_ = createRequire(pathToFileURL(join(this.cwd, 'noop.js')));\n let packageJsonPath: string;\n try {\n packageJsonPath = require_.resolve(`${name}/package.json`);\n } catch {\n throw new RegistryError(\n DIAGNOSTIC_CODES.UNKNOWN_BLUEPRINT,\n `\\`${name}\\` is not installed in ${this.cwd}`,\n { suggestions: [`Install it first: \\`npm install ${name}\\``] }\n );\n }\n\n const packageRoot = dirname(packageJsonPath);\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8')) as {\n atarashi?: string;\n version?: string;\n };\n if (!packageJson.atarashi) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.SCHEMA_INVALID,\n `\\`${name}\\` has no \\`atarashi\\` field pointing at its blueprint`,\n { suggestions: ['Add `\"atarashi\": \"./blueprint\"` to the package'] }\n );\n }\n\n const dir = resolve(packageRoot, packageJson.atarashi);\n if (!dir.startsWith(packageRoot) || !existsSync(dir)) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.SCHEMA_INVALID,\n `\\`${name}\\` points its \\`atarashi\\` field outside the package`\n );\n }\n\n const blueprint = await loadBlueprintDir(dir, {\n trusted: false,\n origin: `npm:${name}@${packageJson.version ?? 'unknown'}`,\n });\n this.cache.set(name, blueprint);\n return blueprint;\n }\n\n private async all(): Promise<Map<string, LoadedBlueprint>> {\n if (this.resolved) return this.resolved;\n const map = new Map<string, LoadedBlueprint>();\n for (const name of this.packages) {\n const blueprint = await this.loadPackage(name);\n map.set(blueprint.manifest.id, blueprint);\n }\n this.resolved = map;\n return map;\n }\n\n async load(id: string): Promise<LoadedBlueprint | undefined> {\n const name = parseNpmSpec(id);\n if (name) return this.loadPackage(name);\n return (await this.all()).get(id);\n }\n\n async summaries(): Promise<BlueprintSummary[]> {\n return [...(await this.all()).values()].map((entry) => summarize(entry.manifest));\n }\n}\n","import { join } from 'node:path';\nimport type { BlueprintSummary, LoadedBlueprint } from '@atarashi/core';\nimport { DIAGNOSTIC_CODES, type RegistryEntry, type RegistryIndex } from '@atarashi/schema';\nimport type { RegistryCache } from '../cache.js';\nimport { RegistryError, unavailable } from '../errors.js';\nimport { type FetchLike, httpGet, joinUrl } from '../http.js';\nimport type { IndexStore } from '../index-store.js';\nimport { loadBlueprintDir, loadPresetFile } from './directory.js';\n\nexport const entrySummary = (entry: RegistryEntry): BlueprintSummary => ({\n id: entry.id,\n version: entry.version,\n provides: entry.provides,\n requires: entry.requires,\n conflicts: entry.conflicts,\n deprecated: entry.deprecated,\n});\n\n/**\n * Blueprints from the remote index. Resolution is index-only — capabilities,\n * versions and conflicts all come from entry summaries — so nothing is\n * downloaded until a blueprint is actually part of the graph.\n */\nexport class RemoteSource {\n constructor(\n private readonly store: IndexStore,\n private readonly cache: RegistryCache,\n private readonly options: {\n offline?: boolean;\n fetchImpl?: FetchLike;\n /** Set from the *source* config, never from the index it serves. */\n trusted?: boolean;\n } = {}\n ) {}\n\n /** `undefined` when the index cannot be reached at all — bundled still works. */\n private async index(): Promise<RegistryIndex | undefined> {\n try {\n return (await this.store.load()).index;\n } catch (thrown) {\n if (\n thrown instanceof RegistryError &&\n thrown.code === DIAGNOSTIC_CODES.INTEGRITY_MISMATCH\n ) {\n throw thrown;\n }\n return undefined;\n }\n }\n\n async entry(id: string): Promise<RegistryEntry | undefined> {\n const index = await this.index();\n return index?.entries.find(\n (candidate) => candidate.id === id && candidate.kind !== 'preset'\n );\n }\n\n async summaries(): Promise<BlueprintSummary[]> {\n const index = await this.index();\n return (index?.entries ?? []).filter((entry) => entry.kind !== 'preset').map(entrySummary);\n }\n\n async versionManifest(): Promise<Record<string, string> | undefined> {\n const index = await this.index();\n return index?.versionManifest?.packages;\n }\n\n async load(id: string): Promise<LoadedBlueprint | undefined> {\n const entry = await this.entry(id);\n if (!entry) return undefined;\n return this.loadEntry(entry);\n }\n\n async loadEntry(entry: RegistryEntry): Promise<LoadedBlueprint> {\n const dir = await this.materialize(entry);\n return loadBlueprintDir(dir, {\n // Trust is a property of the source, not of the document it\n // serves: an index cannot promote its own entries.\n trusted: this.options.trusted ?? false,\n origin: `registry:${entry.id}@${entry.version}`,\n });\n }\n\n async preset(id: string) {\n const index = await this.index();\n return index?.entries.find((entry) => entry.id === id && entry.kind === 'preset');\n }\n\n async loadPreset(id: string) {\n const entry = await this.preset(id);\n if (!entry) return undefined;\n const dir = await this.materialize(entry);\n return loadPresetFile(join(dir, 'preset.json'));\n }\n\n /** Downloads and verifies once; every later run is a cache hit. */\n private async materialize(entry: RegistryEntry): Promise<string> {\n if (this.cache.hasBlueprint(entry.id, entry.version, entry.integrity)) {\n return this.cache.blueprintDir(entry.id, entry.version, entry.integrity);\n }\n if (this.options.offline) {\n throw unavailable(\n `${entry.id}@${entry.version} is not cached, and the network is disabled`,\n ['Run the same command without `--offline` once to populate the cache']\n );\n }\n\n const url = joinUrl(this.store.url, entry.tarball);\n const response = await httpGet(url, { fetchImpl: this.options.fetchImpl });\n return this.cache.storeBlueprint(entry, response.body);\n }\n}\n","import type { BlueprintSource, BlueprintSummary, LoadedBlueprint } from '@atarashi/core';\nimport {\n DIAGNOSTIC_CODES,\n type Diagnostic,\n type PresetManifest,\n type RegistryPin,\n type RegistrySource,\n} from '@atarashi/schema';\nimport { gt, valid } from 'semver';\nimport { RegistryCache } from './cache.js';\nimport { RegistryError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { IndexStore } from './index-store.js';\nimport {\n type BundledSource,\n createBundledSource,\n readBundledVersionManifest,\n} from './loaders/bundled.js';\nimport type { DirectorySource } from './loaders/directory.js';\nimport { createLocalSource } from './loaders/local.js';\nimport { NPM_PREFIX, NpmSource } from './loaders/npm.js';\nimport { RemoteSource } from './loaders/remote.js';\nimport { DEFAULT_REGISTRY_URL, DEFAULT_TTL_MS, resolveCacheRoot } from './paths.js';\n\nexport interface RegistryOptions {\n /** The project directory — where local and npm blueprints are looked up. */\n cwd?: string;\n cacheDir?: string;\n url?: string;\n /** Exact registry version, from `atarashi.json` or `atarashi registry pin`. */\n pin?: string | null;\n offline?: boolean;\n ttlMs?: number;\n /** Extra third-party sources. Untrusted unless the user marked them trusted. */\n sources?: RegistrySource[];\n /** Community packages pulled in with `--add npm:atarashi-blueprint-x`. */\n npmPackages?: string[];\n bundledDir?: string;\n localDir?: string;\n fetchImpl?: FetchLike;\n now?: () => Date;\n env?: NodeJS.ProcessEnv;\n}\n\n/** Where a blueprint id was resolved from, for `atarashi info` and diagnostics. */\nexport type SourceKind = 'local' | 'npm' | 'registry' | 'bundled';\n\ninterface RemoteLayer {\n name: string;\n store: IndexStore;\n source: RemoteSource;\n}\n\nconst isOffline = (options: RegistryOptions): boolean => {\n if (options.offline !== undefined) return options.offline;\n const env = options.env ?? process.env;\n return env.ATARASHI_OFFLINE === '1' || env.ATARASHI_OFFLINE === 'true';\n};\n\n/**\n * The one I/O boundary for blueprints. Core asks this for a `LoadedBlueprint`\n * and never touches disk or the network itself.\n *\n * Four layers, in precedence order:\n *\n * 1. `./.atarashi/blueprints` — a project's own, so an author can override\n * anything while developing.\n * 2. `npm:` packages the user explicitly asked for.\n * 3. the remote registry and the bundled collection, whichever has the newer\n * version — this is what lets a registry release ship a blueprint fix\n * without a CLI release, while a plane-mode run still works.\n */\nexport class Registry implements BlueprintSource {\n private readonly local: DirectorySource;\n private readonly npm: NpmSource;\n private readonly bundled: BundledSource | undefined;\n private readonly remotes: RemoteLayer[] = [];\n private readonly primary: RemoteLayer | undefined;\n readonly cache: RegistryCache;\n readonly offline: boolean;\n\n constructor(options: RegistryOptions = {}) {\n const cwd = options.cwd ?? process.cwd();\n this.offline = isOffline(options);\n this.cache = new RegistryCache(\n options.cacheDir ?? resolveCacheRoot(options.env ?? process.env)\n );\n\n this.local = createLocalSource(cwd, options.localDir);\n this.npm = new NpmSource(cwd, [...(options.npmPackages ?? [])]);\n this.bundled = createBundledSource(options.bundledDir);\n\n const configured: RegistrySource[] = options.sources?.length\n ? options.sources\n : [\n {\n name: 'atarashi',\n url: options.url ?? DEFAULT_REGISTRY_URL,\n trusted: true,\n enabled: true,\n },\n ];\n\n for (const source of configured.filter((candidate) => candidate.enabled !== false)) {\n const store = new IndexStore({\n cache: this.cache,\n url: source.url,\n pin: options.pin ?? null,\n offline: this.offline,\n ttlMs: options.ttlMs ?? DEFAULT_TTL_MS,\n fetchImpl: options.fetchImpl,\n now: options.now,\n });\n this.remotes.push({\n name: source.name,\n store,\n source: new RemoteSource(store, this.cache, {\n offline: this.offline,\n fetchImpl: options.fetchImpl,\n trusted: source.trusted === true,\n }),\n });\n }\n this.primary = this.remotes[0];\n }\n\n /** Warnings collected while resolving — degraded-network notices, mostly. */\n get diagnostics(): Diagnostic[] {\n return this.remotes.flatMap((layer) => layer.store.diagnostics);\n }\n\n // ── BlueprintSource ──────────────────────────────────────────────────────\n\n async load(id: string): Promise<LoadedBlueprint | undefined> {\n if (id.startsWith(NPM_PREFIX)) return this.npm.load(id);\n\n const local = await this.local.load(id);\n if (local) return local;\n\n const fromNpm = await this.npm.load(id);\n if (fromNpm) return fromNpm;\n\n const bundled = await this.bundled?.source.load(id);\n\n for (const layer of this.remotes) {\n const entry = await layer.source.entry(id);\n if (!entry) continue;\n // The bundled copy wins ties, so an unchanged blueprint never costs\n // a download.\n if (bundled && !isNewer(entry.version, bundled.manifest.version)) break;\n try {\n return await layer.source.loadEntry(entry);\n } catch (thrown) {\n if (\n thrown instanceof RegistryError &&\n thrown.code === DIAGNOSTIC_CODES.INTEGRITY_MISMATCH\n ) {\n throw thrown;\n }\n if (!bundled) throw thrown;\n break; // fall back to the bundled copy\n }\n }\n\n return bundled;\n }\n\n async providersOf(capability: string): Promise<BlueprintSummary[]> {\n const all = await this.summaries();\n return all\n .filter((summary) => summary.provides.includes(capability))\n .sort((a, b) => (a.id < b.id ? -1 : 1));\n }\n\n async loadPreset(id: string): Promise<PresetManifest | undefined> {\n const local = await this.local.loadPreset(id);\n if (local) return local;\n for (const layer of this.remotes) {\n const preset = await layer.source.loadPreset(id);\n if (preset) return preset;\n }\n return this.bundled?.source.loadPreset(id);\n }\n\n /** Every preset visible from every layer, deduplicated by precedence — `atarashi list presets`. */\n async presets(): Promise<PresetManifest[]> {\n const merged = new Map<string, PresetManifest>();\n\n for (const preset of (await this.bundled?.source.presets()) ?? [])\n merged.set(preset.id, preset);\n\n for (const layer of this.remotes) {\n const loaded = await layer.store.load().catch(() => undefined);\n const presetEntries =\n loaded?.index.entries.filter((entry) => entry.kind === 'preset') ?? [];\n for (const entry of presetEntries) {\n const preset = await layer.source.loadPreset(entry.id);\n if (preset) merged.set(preset.id, preset);\n }\n }\n\n // Local is an absolute override, not a version comparison.\n for (const preset of await this.local.presets()) merged.set(preset.id, preset);\n\n return [...merged.values()].sort((a, b) => (a.id < b.id ? -1 : 1));\n }\n\n /**\n * One place defines the range every blueprint uses. The registry's manifest\n * wins over the bundled one; anything the registry does not pin keeps the\n * bundled value, so an offline run resolves the same names.\n */\n async versionManifest(): Promise<Record<string, string>> {\n const bundled = this.bundled\n ? ((await readBundledVersionManifest(this.bundled.versionManifestPath)) ?? {})\n : {};\n const remote = (await this.primary?.source.versionManifest()) ?? {};\n return { ...bundled, ...remote };\n }\n\n // ── Beyond the core interface ────────────────────────────────────────────\n\n /** Every blueprint visible from every layer, deduplicated by precedence. */\n async summaries(): Promise<BlueprintSummary[]> {\n const merged = new Map<string, BlueprintSummary>();\n\n const put = (summary: BlueprintSummary, overwrite: boolean) => {\n const existing = merged.get(summary.id);\n if (!existing || (overwrite && isNewer(summary.version, existing.version))) {\n merged.set(summary.id, summary);\n }\n };\n\n for (const summary of (await this.bundled?.source.summaries()) ?? []) put(summary, false);\n for (const layer of this.remotes) {\n for (const summary of await layer.source.summaries()) put(summary, true);\n }\n // Local and npm are absolute overrides, not version comparisons.\n for (const summary of await this.npm.summaries()) merged.set(summary.id, summary);\n for (const summary of await this.local.summaries()) merged.set(summary.id, summary);\n\n return [...merged.values()].sort((a, b) => (a.id < b.id ? -1 : 1));\n }\n\n async list(): Promise<BlueprintSummary[]> {\n return this.summaries();\n }\n\n /** Which layer an id resolves from, without loading its files. */\n async originOf(id: string): Promise<SourceKind | undefined> {\n if (await this.local.has(id)) return 'local';\n if (await this.npm.load(id).catch(() => undefined)) return 'npm';\n for (const layer of this.remotes) {\n if (await layer.source.entry(id)) return 'registry';\n }\n return (await this.bundled?.source.load(id)) ? 'bundled' : undefined;\n }\n\n /** What gets written into `atarashi.json` so this run can be reproduced. */\n async pin(): Promise<RegistryPin | undefined> {\n if (!this.primary) return undefined;\n try {\n const { index, origin } = await this.primary.store.load();\n const record: RegistryPin = { version: index.version };\n if (index.integrity) record.integrity = index.integrity;\n if (origin.url !== DEFAULT_REGISTRY_URL) record.source = origin.url;\n return record;\n } catch {\n // A run that never reached the registry pins nothing, rather than\n // pinning a version it did not actually use.\n return undefined;\n }\n }\n\n /** `atarashi registry update` — ignore the TTL and re-check every source. */\n async update(): Promise<{ name: string; version: string; from: string }[]> {\n const results: { name: string; version: string; from: string }[] = [];\n for (const layer of this.remotes) {\n const { index, origin } = await layer.store.refresh();\n results.push({ name: layer.name, version: index.version, from: origin.from });\n }\n return results;\n }\n\n /** `atarashi registry list` — every version this machine has verified. */\n async cachedVersions(): Promise<string[]> {\n return this.cache.cachedIndexVersions();\n }\n\n verifyCache() {\n return this.cache.verify();\n }\n\n clearCache() {\n return this.cache.clear();\n }\n\n addNpmPackage(spec: string): this {\n this.npm.add(spec);\n return this;\n }\n}\n\nconst isNewer = (candidate: string, incumbent: string): boolean =>\n valid(candidate) && valid(incumbent) ? gt(candidate, incumbent) : false;\n\nexport const createRegistry = (options: RegistryOptions = {}): Registry => new Registry(options);\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/extract.ts","../src/integrity.ts","../src/paths.ts","../src/cache.ts","../src/http.ts","../src/index-store.ts","../src/loaders/directory.ts","../src/loaders/bundled.ts","../src/loaders/local.ts","../src/loaders/npm.ts","../src/loaders/remote.ts","../src/registry.ts"],"names":["DIAGNOSTIC_CODES","join","mkdir","writeFile","readFile","parseRegistryIndex","resolve","sep","existsSync","readdir","dirname","require_","createRequire","valid"],"mappings":"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","file":"index.js","sourcesContent":["import { DIAGNOSTIC_CODES, type Diagnostic, error } from '@atarashi/schema';\n\n/**\n * Every failure that crosses the registry boundary. Carries a\n * `DIAGNOSTIC_CODES` value so the CLI can map it to an exit code (6 for every\n * registry failure, per doc 04) and the web builder to a UI affordance.\n */\nexport class RegistryError extends Error {\n readonly code: string;\n readonly suggestions: string[];\n readonly detail: string | undefined;\n\n constructor(\n code: string,\n message: string,\n options: { suggestions?: string[]; detail?: string; cause?: unknown } = {}\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = 'RegistryError';\n this.code = code;\n this.suggestions = options.suggestions ?? [];\n this.detail = options.detail;\n }\n\n toDiagnostic(): Diagnostic {\n const rest: Omit<Diagnostic, 'severity' | 'code' | 'message'> = {};\n if (this.suggestions.length > 0) rest.suggestions = this.suggestions;\n if (this.detail) rest.detail = this.detail;\n return error(this.code, this.message, rest);\n }\n}\n\nexport const unavailable = (message: string, suggestions: string[] = []): RegistryError =>\n new RegistryError(DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE, message, { suggestions });\n\nexport const integrityFailure = (message: string, detail?: string): RegistryError =>\n new RegistryError(DIAGNOSTIC_CODES.INTEGRITY_MISMATCH, message, {\n detail,\n suggestions: [\n 'Run `atarashi registry clear` and retry — a corrupt cache entry is the usual cause',\n 'If it reproduces, the artifact has been tampered with: do not use it, and report it',\n ],\n });\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, posix, resolve, sep } from 'node:path';\nimport { gunzipSync } from 'node:zlib';\nimport { DIAGNOSTIC_CODES } from '@atarashi/schema';\nimport { Parser } from 'tar';\nimport { RegistryError } from './errors.js';\n\nexport interface ExtractLimits {\n /** Refuses archives with an absurd number of members. */\n maxEntries: number;\n /** Per-file ceiling. */\n maxFileSize: number;\n /** Total uncompressed bytes — the zip-bomb guard. */\n maxTotalSize: number;\n}\n\nexport const DEFAULT_LIMITS: ExtractLimits = {\n maxEntries: 4_000,\n maxFileSize: 8 * 1024 * 1024,\n maxTotalSize: 64 * 1024 * 1024,\n};\n\nexport interface ExtractedFile {\n path: string;\n mode: number;\n contents: Buffer;\n}\n\nconst unsafe = (message: string, detail?: string) =>\n new RegistryError(DIAGNOSTIC_CODES.PATH_ESCAPE, message, {\n detail,\n suggestions: ['This artifact is malformed or malicious; do not use it, and report it'],\n });\n\nconst GZIP_MAGIC = [0x1f, 0x8b];\n\n/**\n * Blueprint tarballs are `.tgz`. Decompressing here rather than inside the tar\n * parser means the uncompressed-size ceiling is enforced before a single byte\n * of tar is parsed.\n */\nfunction decompress(tarball: Buffer, limits: ExtractLimits): Buffer {\n const gzipped = tarball[0] === GZIP_MAGIC[0] && tarball[1] === GZIP_MAGIC[1];\n if (!gzipped) return tarball;\n try {\n return gunzipSync(tarball, { maxOutputLength: limits.maxTotalSize });\n } catch (cause) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.INTEGRITY_MISMATCH,\n 'Tarball could not be decompressed, or exceeds the uncompressed size limit',\n { cause, detail: `limit ${limits.maxTotalSize} bytes` }\n );\n }\n}\n\n/**\n * The same path rules the writer applies to generated files, applied to archive\n * members: no absolute paths, no drive letters, no `..`, no null bytes. This is\n * a security boundary (doc 09, T1) — every rejection here is a hard failure,\n * never a skipped entry.\n */\nexport function safeEntryPath(raw: string, strip = 0): string | undefined {\n const unified = raw.replace(/\\\\/g, '/');\n\n if (unified.includes('\\0')) throw unsafe('Archive member path contains a null byte', raw);\n if (unified.startsWith('//')) throw unsafe(`Archive member \\`${raw}\\` is a UNC path`);\n if (unified.startsWith('/')) throw unsafe(`Archive member \\`${raw}\\` is an absolute path`);\n if (/^[a-zA-Z]:\\//.test(unified)) throw unsafe(`Archive member \\`${raw}\\` is a drive path`);\n\n const segments = unified.split('/').filter((segment) => segment !== '' && segment !== '.');\n if (segments.includes('..')) {\n throw unsafe(`Archive member \\`${raw}\\` escapes the extraction directory`);\n }\n\n const stripped = segments.slice(strip);\n if (stripped.length === 0) return undefined; // the stripped root directory itself\n return posix.join(...stripped);\n}\n\n/**\n * Parses a tarball entirely in memory. Nothing reaches the filesystem until\n * every member has been validated, so a malicious archive cannot leave a\n * half-extracted mess behind.\n */\nexport async function readTarball(\n tarball: Buffer,\n options: { strip?: number; limits?: Partial<ExtractLimits> } = {}\n): Promise<ExtractedFile[]> {\n const limits = { ...DEFAULT_LIMITS, ...options.limits };\n const raw = decompress(tarball, limits);\n\n const files: ExtractedFile[] = [];\n const seen = new Set<string>();\n let entries = 0;\n let total = 0;\n let failure: unknown;\n\n const parser = new Parser({\n onReadEntry(entry) {\n try {\n if (failure) {\n entry.resume();\n return;\n }\n if (++entries > limits.maxEntries) {\n throw unsafe(`Archive has more than ${limits.maxEntries} members`);\n }\n\n // Symlinks and hard links can point anywhere; devices and FIFOs\n // have no business in a blueprint. Directories are implied by\n // the files inside them.\n if (entry.type === 'SymbolicLink' || entry.type === 'Link') {\n throw unsafe(`Archive member \\`${entry.path}\\` is a link`);\n }\n if (entry.type === 'Directory' || entry.type === 'GNUDumpDir') {\n entry.resume();\n return;\n }\n if (\n entry.type !== 'File' &&\n entry.type !== 'OldFile' &&\n entry.type !== 'ContiguousFile'\n ) {\n throw unsafe(\n `Archive member \\`${entry.path}\\` has unsupported type ${entry.type}`\n );\n }\n\n const path = safeEntryPath(String(entry.path), options.strip ?? 0);\n if (path === undefined) {\n entry.resume();\n return;\n }\n if (seen.has(path.toLowerCase())) {\n throw unsafe(`Archive contains \\`${path}\\` twice, or two names that collide`);\n }\n seen.add(path.toLowerCase());\n\n if ((entry.size ?? 0) > limits.maxFileSize) {\n throw unsafe(\n `Archive member \\`${path}\\` is larger than the ${limits.maxFileSize} byte limit`\n );\n }\n\n const chunks: Buffer[] = [];\n let size = 0;\n entry.on('data', (chunk: Buffer) => {\n size += chunk.length;\n total += chunk.length;\n if (size > limits.maxFileSize || total > limits.maxTotalSize) {\n failure ??= unsafe(`Archive exceeds the ${limits.maxTotalSize} byte limit`);\n return;\n }\n chunks.push(chunk);\n });\n entry.on('end', () => {\n if (failure) return;\n // Executable bit only; everything else is normalized away.\n const mode = (entry.mode ?? 0o644) & 0o111 ? 0o755 : 0o644;\n files.push({ path, mode, contents: Buffer.concat(chunks) });\n });\n } catch (thrown) {\n failure ??= thrown;\n entry.resume();\n }\n },\n });\n\n await new Promise<void>((resolvePromise, rejectPromise) => {\n parser.on('error', rejectPromise);\n parser.on('end', () => resolvePromise());\n parser.end(raw);\n });\n\n if (failure) throw failure;\n if (files.length === 0) throw unsafe('Archive contains no files');\n\n return files.sort((a, b) => (a.path < b.path ? -1 : 1));\n}\n\n/**\n * Writes a validated archive into `dest`. Every resolved path is re-checked\n * against the destination root, so a bug in the path rules above still cannot\n * write outside it.\n */\nexport async function extractTarball(\n tarball: Buffer,\n dest: string,\n options: { strip?: number; limits?: Partial<ExtractLimits> } = {}\n): Promise<string[]> {\n const files = await readTarball(tarball, options);\n const root = resolve(dest);\n\n for (const file of files) {\n const target = resolve(root, file.path);\n if (target !== root && !target.startsWith(root + sep)) {\n throw unsafe(\n `Archive member \\`${file.path}\\` resolves outside the extraction directory`\n );\n }\n }\n\n await mkdir(root, { recursive: true });\n for (const file of files) {\n const target = join(root, file.path);\n await mkdir(dirname(target), { recursive: true });\n // `wx` fails rather than following a symlink someone planted at the\n // target path, and catches two members writing the same file.\n await writeFile(target, file.contents, { mode: file.mode, flag: 'wx' });\n }\n\n return files.map((file) => file.path);\n}\n","import { createHash, timingSafeEqual } from 'node:crypto';\nimport type { JsonValue, RegistryIndex } from '@atarashi/schema';\nimport { integrityFailure } from './errors.js';\n\nexport type HashAlgorithm = 'sha256' | 'sha384' | 'sha512';\n\nconst SRI = /^(sha256|sha384|sha512)-([A-Za-z0-9+/]+={0,2})$/;\n\n/** Subresource-integrity style digest: `sha256-<base64>`. */\nexport function digest(data: Buffer | string, algorithm: HashAlgorithm = 'sha256'): string {\n return `${algorithm}-${createHash(algorithm).update(data).digest('base64')}`;\n}\n\n/** The hex form, used for content-addressed directory names. */\nexport function hexDigest(data: Buffer | string, algorithm: HashAlgorithm = 'sha256'): string {\n return createHash(algorithm).update(data).digest('hex');\n}\n\nexport function parseIntegrity(value: string): { algorithm: HashAlgorithm; base64: string } {\n const match = SRI.exec(value);\n if (!match) {\n throw integrityFailure(`\\`${value}\\` is not a valid integrity digest`);\n }\n return { algorithm: match[1] as HashAlgorithm, base64: match[2]! };\n}\n\n/**\n * A mismatch is a hard failure that names the artifact — never a silent\n * fallback to an unverified copy (doc 09, T4).\n */\nexport function verifyIntegrity(data: Buffer, expected: string, what: string): void {\n const { algorithm } = parseIntegrity(expected);\n const actual = digest(data, algorithm);\n\n const a = Buffer.from(actual);\n const b = Buffer.from(expected);\n if (a.length !== b.length || !timingSafeEqual(a, b)) {\n throw integrityFailure(\n `Integrity check failed for ${what}`,\n `expected ${expected}, computed ${actual}`\n );\n }\n}\n\n/**\n * Deterministic JSON: object keys sorted, no incidental whitespace. Two\n * machines must produce the same bytes for the same document, or the root hash\n * is meaningless.\n */\nexport function canonicalize(value: JsonValue | unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value ?? null);\n if (Array.isArray(value)) return `[${value.map(canonicalize).join(',')}]`;\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([key, v]) => `${JSON.stringify(key)}:${canonicalize(v)}`);\n return `{${entries.join(',')}}`;\n}\n\n/** The index's root hash covers its entries and its version manifest. */\nexport function indexRootHash(\n index: Pick<RegistryIndex, 'entries' | 'versionManifest' | 'version' | 'indexVersion'>\n): string {\n return digest(\n canonicalize({\n indexVersion: index.indexVersion,\n version: index.version,\n entries: index.entries,\n versionManifest: index.versionManifest ?? null,\n })\n );\n}\n\nexport function verifyIndexIntegrity(index: RegistryIndex, source: string): void {\n if (!index.integrity) return; // Unsigned local mirrors are allowed; remote ones are not.\n const actual = indexRootHash(index);\n if (actual !== index.integrity) {\n throw integrityFailure(\n `Registry index ${index.version} failed its root hash check (${source})`,\n `expected ${index.integrity}, computed ${actual}`\n );\n }\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/** The default public registry. Overridable per-run and per-source. */\nexport const DEFAULT_REGISTRY_URL = 'https://atarashi.gautamsuthar.in/registry';\n\n/** The index is re-checked at most once a day; pinned versions are immutable. */\nexport const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface CacheLayout {\n root: string;\n /** Verified index documents, one file per registry version. */\n index: string;\n /** Extracted blueprints, each directory named by its content hash. */\n blueprints: string;\n /** ETags and fetch timestamps. */\n meta: string;\n}\n\n/**\n * XDG on Linux, the platform convention elsewhere. `ATARASHI_CACHE_DIR` wins so\n * CI can point the whole cache at a single restorable directory.\n */\nexport function resolveCacheRoot(\n env: NodeJS.ProcessEnv = process.env,\n platform = process.platform\n) {\n const override = env.ATARASHI_CACHE_DIR?.trim();\n if (override) return override;\n\n if (platform === 'win32') {\n const base = env.LOCALAPPDATA?.trim() || join(homedir(), 'AppData', 'Local');\n return join(base, 'atarashi', 'Cache');\n }\n if (platform === 'darwin') {\n return join(homedir(), 'Library', 'Caches', 'atarashi');\n }\n const xdg = env.XDG_CACHE_HOME?.trim();\n return join(xdg || join(homedir(), '.cache'), 'atarashi');\n}\n\nexport function cacheLayout(root: string): CacheLayout {\n return {\n root,\n index: join(root, 'index'),\n blueprints: join(root, 'blueprints'),\n meta: join(root, 'meta.json'),\n };\n}\n\n/** `db/postgres` → `db-postgres`, so ids are usable as path and file names. */\nexport const slugifyId = (id: string): string => id.replace(/\\//g, '-');\n","import { existsSync } from 'node:fs';\nimport { mkdir, readdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DIAGNOSTIC_CODES, parseRegistryIndex, type RegistryIndex } from '@atarashi/schema';\nimport { integrityFailure, RegistryError } from './errors.js';\nimport { extractTarball } from './extract.js';\nimport { hexDigest, parseIntegrity, verifyIndexIntegrity, verifyIntegrity } from './integrity.js';\nimport { type CacheLayout, cacheLayout, slugifyId } from './paths.js';\n\n/** What we remember between runs: ETags, fetch times and what is extracted. */\nexport interface CacheMeta {\n metaVersion: 1;\n index: Record<string, { etag?: string; fetchedAt: string; version: string }>;\n blueprints: Record<string, { id: string; version: string; integrity: string; dir: string }>;\n}\n\nconst EMPTY_META: CacheMeta = { metaVersion: 1, index: {}, blueprints: {} };\n\n/** A cache directory counts as populated only once its manifest is in place. */\nconst hasManifest = (dir: string): boolean =>\n existsSync(join(dir, 'blueprint.json')) || existsSync(join(dir, 'preset.json'));\n\nconst readJson = async (path: string): Promise<unknown> => {\n const raw = await readFile(path, 'utf8');\n return JSON.parse(raw) as unknown;\n};\n\nconst writeJson = async (path: string, value: unknown): Promise<void> => {\n await mkdir(join(path, '..'), { recursive: true });\n // Write-then-rename: a killed process never leaves a truncated cache file.\n const temporary = `${path}.${process.pid}.tmp`;\n await writeFile(temporary, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n await rename(temporary, path);\n};\n\n/**\n * The on-disk cache. Content-addressed: a blueprint directory is named by its\n * tarball's hash, so entries for different versions never collide and the whole\n * directory is safe to share between projects and CI runs.\n */\nexport class RegistryCache {\n readonly layout: CacheLayout;\n private meta: CacheMeta | undefined;\n\n constructor(root: string) {\n this.layout = cacheLayout(root);\n }\n\n async readMeta(): Promise<CacheMeta> {\n if (this.meta) return this.meta;\n try {\n const parsed = (await readJson(this.layout.meta)) as CacheMeta;\n this.meta =\n parsed && parsed.metaVersion === 1\n ? { ...EMPTY_META, ...parsed }\n : { ...EMPTY_META };\n } catch {\n // A missing or unreadable cache is not an error; it is a cold cache.\n this.meta = { ...EMPTY_META };\n }\n return this.meta;\n }\n\n async writeMeta(update: (meta: CacheMeta) => void): Promise<void> {\n const meta = await this.readMeta();\n update(meta);\n this.meta = meta;\n await writeJson(this.layout.meta, meta);\n }\n\n indexPath(version: string): string {\n return join(this.layout.index, `${version}.json`);\n }\n\n async readIndex(version: string, source: string): Promise<RegistryIndex | undefined> {\n const path = this.indexPath(version);\n if (!existsSync(path)) return undefined;\n\n let raw: unknown;\n try {\n raw = await readJson(path);\n } catch (cause) {\n await rm(path, { force: true });\n throw new RegistryError(\n DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE,\n `Cached registry index ${version} is unreadable`,\n { cause, suggestions: ['Run `atarashi registry update` to fetch it again'] }\n );\n }\n\n const parsed = parseRegistryIndex(raw, path);\n if (!parsed.ok) {\n await rm(path, { force: true });\n throw new RegistryError(parsed.error.code, parsed.error.message, {\n suggestions: ['Run `atarashi registry update` to fetch a fresh index'],\n });\n }\n\n verifyIndexIntegrity(parsed.value, `${source} (cached)`);\n return parsed.value;\n }\n\n async writeIndex(index: RegistryIndex): Promise<void> {\n await mkdir(this.layout.index, { recursive: true });\n await writeJson(this.indexPath(index.version), index);\n }\n\n /** Every registry version this machine has already verified. */\n async cachedIndexVersions(): Promise<string[]> {\n try {\n const files = await readdir(this.layout.index);\n return files\n .filter((file) => file.endsWith('.json'))\n .map((file) => file.slice(0, -'.json'.length));\n } catch {\n return [];\n }\n }\n\n /**\n * Content-addressed, but still legible: `db-postgres-1.2.0-8f2c…`. The hash\n * suffix is what makes it content-addressed; the rest is for humans reading\n * `atarashi registry verify` output.\n */\n blueprintDir(id: string, version: string, integrity: string): string {\n const { base64 } = parseIntegrity(integrity);\n const short = Buffer.from(base64, 'base64').toString('hex').slice(0, 12);\n return join(this.layout.blueprints, `${slugifyId(id)}-${version}-${short}`);\n }\n\n hasBlueprint(id: string, version: string, integrity: string): boolean {\n return hasManifest(this.blueprintDir(id, version, integrity));\n }\n\n /**\n * Verifies, extracts into a temp directory, then renames into place — so a\n * cache directory only ever exists in its complete, verified form.\n */\n async storeBlueprint(\n entry: { id: string; version: string; integrity: string },\n tarball: Buffer\n ): Promise<string> {\n verifyIntegrity(tarball, entry.integrity, `${entry.id}@${entry.version}`);\n\n const target = this.blueprintDir(entry.id, entry.version, entry.integrity);\n if (hasManifest(target)) return target;\n\n const staging = `${target}.${process.pid}.${hexDigest(String(Date.now())).slice(0, 8)}`;\n await rm(staging, { recursive: true, force: true });\n\n try {\n await extractTarball(tarball, staging);\n if (!hasManifest(staging)) {\n throw integrityFailure(\n `${entry.id}@${entry.version} has no \\`blueprint.json\\` at its root`\n );\n }\n await mkdir(this.layout.blueprints, { recursive: true });\n await rm(target, { recursive: true, force: true });\n await rename(staging, target);\n } finally {\n await rm(staging, { recursive: true, force: true });\n }\n\n await this.writeMeta((meta) => {\n meta.blueprints[`${entry.id}@${entry.version}`] = {\n id: entry.id,\n version: entry.version,\n integrity: entry.integrity,\n dir: target,\n };\n });\n\n return target;\n }\n\n async clear(): Promise<void> {\n this.meta = undefined;\n await rm(this.layout.root, { recursive: true, force: true });\n }\n\n /**\n * Re-checks that everything the meta file claims is cached is still there.\n * Extracted trees cannot be re-hashed against the tarball digest, so this\n * reports presence and shape, and prunes what has gone missing.\n */\n async verify(): Promise<{ checked: number; removed: string[] }> {\n const meta = await this.readMeta();\n const removed: string[] = [];\n let checked = 0;\n\n for (const [key, record] of Object.entries(meta.blueprints)) {\n checked += 1;\n if (!hasManifest(record.dir)) removed.push(key);\n }\n\n for (const version of await this.cachedIndexVersions()) {\n checked += 1;\n try {\n await this.readIndex(version, 'cache');\n } catch {\n removed.push(`index@${version}`);\n }\n }\n\n if (removed.length > 0) {\n await this.writeMeta((current) => {\n for (const key of removed) delete current.blueprints[key];\n });\n }\n\n return { checked, removed };\n }\n\n async size(): Promise<number> {\n const walk = async (dir: string): Promise<number> => {\n let total = 0;\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return 0;\n }\n for (const entry of entries) {\n const path = join(dir, entry);\n const info = await stat(path).catch(() => undefined);\n if (!info) continue;\n total += info.isDirectory() ? await walk(path) : info.size;\n }\n return total;\n };\n return walk(this.layout.root);\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport { RegistryError, unavailable } from './errors.js';\nimport { DEFAULT_LIMITS } from './extract.js';\n\nexport type FetchLike = (url: string, init?: RequestInit) => Promise<Response>;\n\nexport interface HttpResponse {\n status: number;\n body: Buffer;\n etag: string | undefined;\n}\n\n/**\n * TLS only, with no plaintext fallback (doc 09, T4). `file:` is allowed so a\n * local mirror — and the test suite — can stand in for the CDN.\n */\nexport function assertFetchable(url: string): URL {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw unavailable(`\\`${url}\\` is not a valid registry URL`);\n }\n if (parsed.protocol === 'https:' || parsed.protocol === 'file:') return parsed;\n if (parsed.protocol === 'http:') {\n throw unavailable(`Refusing to fetch the registry over plain HTTP: ${url}`, [\n 'Use an `https://` registry URL',\n ]);\n }\n throw unavailable(`Unsupported registry protocol \\`${parsed.protocol}\\` in ${url}`);\n}\n\nexport interface HttpOptions {\n etag?: string | undefined;\n timeoutMs?: number;\n maxBytes?: number;\n fetchImpl?: FetchLike;\n}\n\n/**\n * A conditional GET. `304` comes back with an empty body and the caller keeps\n * what it has cached; anything else is a registry failure with the URL named.\n */\nexport async function httpGet(url: string, options: HttpOptions = {}): Promise<HttpResponse> {\n const parsed = assertFetchable(url);\n const maxBytes = options.maxBytes ?? DEFAULT_LIMITS.maxTotalSize;\n\n if (parsed.protocol === 'file:') {\n try {\n const body = await readFile(fileURLToPath(parsed));\n return { status: 200, body, etag: undefined };\n } catch {\n throw unavailable(`Cannot read ${url}`);\n }\n }\n\n const fetchImpl = options.fetchImpl ?? (globalThis.fetch as FetchLike | undefined);\n if (!fetchImpl) {\n throw unavailable('This Node build has no global `fetch`', [\n 'Upgrade to Node 20.11 or newer',\n ]);\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 15_000);\n\n try {\n const headers: Record<string, string> = { accept: 'application/json, application/gzip' };\n if (options.etag) headers['if-none-match'] = options.etag;\n\n const response = await fetchImpl(url, { headers, signal: controller.signal });\n const etag = response.headers.get('etag') ?? undefined;\n\n if (response.status === 304) return { status: 304, body: Buffer.alloc(0), etag };\n if (!response.ok) {\n throw unavailable(`${url} responded ${response.status} ${response.statusText}`.trim());\n }\n\n const body = Buffer.from(await response.arrayBuffer());\n if (body.byteLength > maxBytes) {\n throw unavailable(\n `${url} returned ${body.byteLength} bytes, over the ${maxBytes} limit`\n );\n }\n return { status: response.status, body, etag };\n } catch (cause) {\n if (cause instanceof RegistryError) throw cause;\n const reason = cause instanceof Error ? cause.message : String(cause);\n throw unavailable(`Cannot reach ${url}: ${reason}`, [\n 'Check your network connection, or run with `--offline` to use the cache',\n ]);\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** Joins a registry base URL with a path, tolerating a trailing slash either way. */\nexport const joinUrl = (base: string, path: string): string =>\n /^[a-z][a-z0-9+.-]*:/i.test(path)\n ? path\n : `${base.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`;\n","import {\n DIAGNOSTIC_CODES,\n type Diagnostic,\n parseRegistryIndex,\n type RegistryIndex,\n warning,\n} from '@atarashi/schema';\nimport { rcompare, valid } from 'semver';\nimport type { RegistryCache } from './cache.js';\nimport { RegistryError, unavailable } from './errors.js';\nimport { type FetchLike, httpGet, joinUrl } from './http.js';\nimport { verifyIndexIntegrity } from './integrity.js';\nimport { DEFAULT_REGISTRY_URL, DEFAULT_TTL_MS } from './paths.js';\n\nexport interface IndexStoreOptions {\n cache: RegistryCache;\n url?: string;\n /** Exact registry version to resolve against. Immutable once published. */\n pin?: string | null;\n offline?: boolean;\n ttlMs?: number;\n fetchImpl?: FetchLike;\n now?: () => Date;\n /** Third-party sources never get to run hooks, whatever their index says. */\n trusted?: boolean;\n}\n\n/** Where a resolved index came from — reported by `atarashi doctor`. */\nexport interface IndexOrigin {\n version: string;\n url: string;\n from: 'network' | 'cache' | 'bundled';\n fetchedAt?: string;\n integrity?: string;\n}\n\nconst indexUrl = (base: string, pin?: string | null): string =>\n pin ? joinUrl(base, `v1/${pin}/index.json`) : joinUrl(base, 'v1/index.json');\n\n/**\n * Fetches, verifies and caches the registry index.\n *\n * Freshness is a 24 h TTL plus an ETag: inside the TTL nothing is requested at\n * all, and after it a `304` costs one conditional GET. A pinned version skips\n * both — it is immutable, so a cache hit is always correct.\n */\nexport class IndexStore {\n private readonly options: Required<Pick<IndexStoreOptions, 'url' | 'ttlMs'>> &\n IndexStoreOptions;\n private loaded: { index: RegistryIndex; origin: IndexOrigin } | undefined;\n readonly diagnostics: Diagnostic[] = [];\n\n constructor(options: IndexStoreOptions) {\n this.options = {\n url: DEFAULT_REGISTRY_URL,\n ttlMs: DEFAULT_TTL_MS,\n ...options,\n };\n }\n\n get url(): string {\n return this.options.url;\n }\n\n get origin(): IndexOrigin | undefined {\n return this.loaded?.origin;\n }\n\n /** Resolves once per process; subsequent calls reuse the verified document. */\n async load(): Promise<{ index: RegistryIndex; origin: IndexOrigin }> {\n if (this.loaded) return this.loaded;\n this.loaded = this.options.pin\n ? await this.loadPinned(this.options.pin)\n : await this.loadLatest();\n return this.loaded;\n }\n\n /** Discards the TTL and re-checks the network — `atarashi registry update`. */\n async refresh(): Promise<{ index: RegistryIndex; origin: IndexOrigin }> {\n this.loaded = undefined;\n const cache = this.options.cache;\n await cache.writeMeta((meta) => {\n delete meta.index[indexUrl(this.options.url, this.options.pin)];\n });\n return this.load();\n }\n\n private async loadPinned(version: string) {\n const cache = this.options.cache;\n if (!valid(version)) {\n throw unavailable(`\\`${version}\\` is not a valid registry version`, [\n 'Registry versions are exact semver, e.g. `atarashi registry pin 1.4.2`',\n ]);\n }\n\n const cached = await cache.readIndex(version, this.options.url);\n if (cached) {\n return { index: cached, origin: this.originOf(cached, 'cache') };\n }\n if (this.options.offline) {\n throw unavailable(`Registry ${version} is pinned but not cached, and you are offline`, [\n 'Run `atarashi registry update` with a network connection',\n 'Or remove the pin with `atarashi registry unpin`',\n ]);\n }\n\n const url = indexUrl(this.options.url, version);\n const response = await httpGet(url, { fetchImpl: this.options.fetchImpl });\n const index = this.parse(response.body, url);\n if (index.version !== version) {\n throw unavailable(\n `Registry ${version} was requested but ${url} served ${index.version}`\n );\n }\n await this.persist(index, url, response.etag);\n return { index, origin: this.originOf(index, 'network') };\n }\n\n private async loadLatest() {\n const cache = this.options.cache;\n const url = indexUrl(this.options.url);\n const meta = await cache.readMeta();\n const record = meta.index[url];\n\n const cachedIndex = record ? await cache.readIndex(record.version, url) : undefined;\n\n if (this.options.offline) {\n const offlineIndex = cachedIndex ?? (await this.newestCached());\n if (offlineIndex)\n return { index: offlineIndex, origin: this.originOf(offlineIndex, 'cache') };\n throw unavailable('No cached registry index, and the network is disabled', [\n 'Run `atarashi registry update` with a network connection',\n 'Bundled blueprints still work offline — drop `--offline` only if you need registry-only ones',\n ]);\n }\n\n if (cachedIndex && record && this.isFresh(record.fetchedAt)) {\n return {\n index: cachedIndex,\n origin: this.originOf(cachedIndex, 'cache', record.fetchedAt),\n };\n }\n\n try {\n const response = await httpGet(url, {\n etag: record?.etag,\n fetchImpl: this.options.fetchImpl,\n });\n\n if (response.status === 304 && cachedIndex) {\n await this.touch(url, cachedIndex.version, record?.etag);\n return { index: cachedIndex, origin: this.originOf(cachedIndex, 'cache') };\n }\n\n const index = this.parse(response.body, url);\n await this.persist(index, url, response.etag);\n return { index, origin: this.originOf(index, 'network') };\n } catch (thrown) {\n // Integrity failures are never survivable; unreachability is.\n if (\n thrown instanceof RegistryError &&\n thrown.code !== DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE\n ) {\n throw thrown;\n }\n const fallback = cachedIndex ?? (await this.newestCached());\n if (!fallback) throw thrown;\n\n this.diagnostics.push(\n warning(\n DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE,\n `Registry unreachable; using the cached index ${fallback.version}`,\n {\n detail: thrown instanceof Error ? thrown.message : String(thrown),\n suggestions: ['Run `atarashi registry update` once you are back online'],\n }\n )\n );\n return { index: fallback, origin: this.originOf(fallback, 'cache') };\n }\n }\n\n private parse(body: Buffer, url: string): RegistryIndex {\n let raw: unknown;\n try {\n raw = JSON.parse(body.toString('utf8')) as unknown;\n } catch (cause) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.REGISTRY_UNAVAILABLE,\n `${url} did not return valid JSON`,\n { cause }\n );\n }\n\n const parsed = parseRegistryIndex(raw, url);\n if (!parsed.ok) {\n throw new RegistryError(parsed.error.code, `${parsed.error.message} (${url})`, {\n suggestions: ['Upgrade Atarashi — this index may use a newer index version'],\n });\n }\n\n verifyIndexIntegrity(parsed.value, url);\n return parsed.value;\n }\n\n private async persist(index: RegistryIndex, url: string, etag: string | undefined) {\n await this.options.cache.writeIndex(index);\n await this.touch(url, index.version, etag);\n }\n\n private async touch(url: string, version: string, etag: string | undefined) {\n const fetchedAt = this.nowIso();\n await this.options.cache.writeMeta((meta) => {\n meta.index[url] = etag ? { etag, fetchedAt, version } : { fetchedAt, version };\n });\n }\n\n private async newestCached(): Promise<RegistryIndex | undefined> {\n const versions = (await this.options.cache.cachedIndexVersions())\n .filter((version) => valid(version))\n .sort(rcompare);\n for (const version of versions) {\n const index = await this.options.cache.readIndex(version, this.options.url);\n if (index) return index;\n }\n return undefined;\n }\n\n private isFresh(fetchedAt: string): boolean {\n const age = this.now() - Date.parse(fetchedAt);\n return Number.isFinite(age) && age >= 0 && age < this.options.ttlMs;\n }\n\n private originOf(\n index: RegistryIndex,\n from: IndexOrigin['from'],\n fetchedAt?: string\n ): IndexOrigin {\n const origin: IndexOrigin = { version: index.version, url: this.options.url, from };\n if (fetchedAt) origin.fetchedAt = fetchedAt;\n if (index.integrity) origin.integrity = index.integrity;\n return origin;\n }\n\n private now(): number {\n return (this.options.now?.() ?? new Date()).getTime();\n }\n\n private nowIso(): string {\n return new Date(this.now()).toISOString();\n }\n}\n","import { existsSync } from 'node:fs';\nimport { lstat, readdir, readFile } from 'node:fs/promises';\nimport { isAbsolute, join, relative, resolve, sep } from 'node:path';\nimport type { BlueprintSummary, LoadedBlueprint } from '@atarashi/core';\nimport {\n type BlueprintManifest,\n DIAGNOSTIC_CODES,\n type PresetManifest,\n parseBlueprintManifest,\n parsePresetManifest,\n} from '@atarashi/schema';\nimport { RegistryError } from '../errors.js';\n\nexport const MANIFEST_FILE = 'blueprint.json';\nexport const PRESET_FILE = 'preset.json';\n\nconst invalid = (message: string, suggestions: string[] = []) =>\n new RegistryError(DIAGNOSTIC_CODES.SCHEMA_INVALID, message, { suggestions });\n\n/**\n * Reads a file from inside a blueprint directory. Blueprint-relative paths are\n * attacker-controlled, so they get the same treatment as output paths: no\n * escaping the blueprint root, and no following a symlink out of it.\n */\nasync function readInside(root: string, path: string): Promise<Buffer> {\n if (path.includes('\\0')) throw invalid(`Blueprint file path contains a null byte`);\n if (isAbsolute(path)) throw invalid(`Blueprint file \\`${path}\\` must be relative`);\n\n const target = resolve(root, path);\n const rel = relative(root, target);\n if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.PATH_ESCAPE,\n `Blueprint file \\`${path}\\` resolves outside its own directory`\n );\n }\n\n // Walk the chain so a symlink at any depth is caught, not just the leaf.\n let walked = root;\n for (const segment of rel.split(sep)) {\n walked = join(walked, segment);\n const info = await lstat(walked).catch(() => undefined);\n if (info?.isSymbolicLink()) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.PATH_ESCAPE,\n `Blueprint file \\`${path}\\` passes through the symlink \\`${segment}\\``\n );\n }\n }\n\n return readFile(target);\n}\n\nexport interface DirectoryBlueprintOptions {\n trusted: boolean;\n /** Human-readable provenance for diagnostics. Defaults to the directory. */\n origin?: string;\n}\n\n/** Loads one blueprint from a directory containing a `blueprint.json`. */\nexport async function loadBlueprintDir(\n dir: string,\n options: DirectoryBlueprintOptions\n): Promise<LoadedBlueprint> {\n const manifestPath = join(dir, MANIFEST_FILE);\n if (!existsSync(manifestPath)) {\n throw invalid(`No \\`${MANIFEST_FILE}\\` in ${dir}`, [\n 'Run `atarashi create-blueprint --validate .` inside the blueprint',\n ]);\n }\n\n const raw = await readFile(manifestPath, 'utf8');\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(raw) as unknown;\n } catch (cause) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.SCHEMA_INVALID,\n `${manifestPath} is not valid JSON`,\n { cause }\n );\n }\n\n const parsed = parseBlueprintManifest(parsedJson, manifestPath);\n if (!parsed.ok) {\n throw new RegistryError(parsed.error.code, parsed.error.message, {\n detail: parsed.error.diagnostics.map((d) => d.message).join('\\n'),\n });\n }\n\n return {\n manifest: parsed.value,\n origin: options.origin ?? dir,\n dir,\n trusted: options.trusted,\n readFile: (path: string) => readInside(dir, path),\n };\n}\n\nexport async function loadPresetFile(path: string): Promise<PresetManifest> {\n const parsed = parsePresetManifest(JSON.parse(await readFile(path, 'utf8')) as unknown, path);\n if (!parsed.ok) {\n throw new RegistryError(parsed.error.code, parsed.error.message, {\n detail: parsed.error.diagnostics.map((d) => d.message).join('\\n'),\n });\n }\n return parsed.value;\n}\n\nexport const summarize = (manifest: BlueprintManifest): BlueprintSummary => ({\n id: manifest.id,\n version: manifest.version,\n provides: manifest.provides,\n requires: manifest.requires,\n conflicts: manifest.conflicts,\n deprecated: Boolean(manifest.deprecated),\n});\n\n/**\n * A tree of blueprints laid out as `<root>/<namespace>/<name>/blueprint.json`,\n * with presets in `<root>/../presets/*.json`. Backs both the bundled collection\n * and a project's own `./.atarashi/blueprints`.\n */\nexport class DirectorySource {\n private manifests: Map<string, string> | undefined;\n\n constructor(\n readonly root: string,\n private readonly options: DirectoryBlueprintOptions & { presetsDir?: string }\n ) {}\n\n /** Scans lazily and once — a cold `atarashi list` should not pay twice. */\n private async scan(): Promise<Map<string, string>> {\n if (this.manifests) return this.manifests;\n const found = new Map<string, string>();\n\n if (existsSync(this.root)) {\n for (const namespace of await readdir(this.root, { withFileTypes: true })) {\n if (!namespace.isDirectory()) continue;\n const namespaceDir = join(this.root, namespace.name);\n for (const name of await readdir(namespaceDir, { withFileTypes: true })) {\n if (!name.isDirectory()) continue;\n const dir = join(namespaceDir, name.name);\n if (existsSync(join(dir, MANIFEST_FILE))) {\n found.set(`${namespace.name}/${name.name}`, dir);\n }\n }\n }\n }\n\n this.manifests = found;\n return found;\n }\n\n async ids(): Promise<string[]> {\n return [...(await this.scan()).keys()].sort();\n }\n\n async has(id: string): Promise<boolean> {\n return (await this.scan()).has(id);\n }\n\n async load(id: string): Promise<LoadedBlueprint | undefined> {\n const dir = (await this.scan()).get(id);\n if (!dir) return undefined;\n return loadBlueprintDir(dir, this.options);\n }\n\n async summaries(): Promise<BlueprintSummary[]> {\n const out: BlueprintSummary[] = [];\n for (const id of await this.ids()) {\n const blueprint = await this.load(id);\n if (blueprint) out.push(summarize(blueprint.manifest));\n }\n return out;\n }\n\n async loadPreset(id: string): Promise<PresetManifest | undefined> {\n const dir = this.options.presetsDir;\n if (!dir) return undefined;\n const file = join(dir, `${id.replace(/^preset\\//, '')}.json`);\n if (!existsSync(file)) return undefined;\n return loadPresetFile(file);\n }\n\n async presets(): Promise<PresetManifest[]> {\n const dir = this.options.presetsDir;\n if (!dir || !existsSync(dir)) return [];\n const files = (await readdir(dir)).filter((file) => file.endsWith('.json')).sort();\n return Promise.all(files.map((file) => loadPresetFile(join(dir, file))));\n }\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\nimport { DirectorySource } from './directory.js';\n\nconst require_ = createRequire(import.meta.url);\n\n/**\n * The first-party collection shipped inside the npm package. Its presence is\n * why `atarashi new` works on a plane: no index fetch, no tarball, no network.\n */\nexport function findBundledRoot(explicit?: string): string | undefined {\n if (explicit) return existsSync(explicit) ? explicit : undefined;\n try {\n return dirname(require_.resolve('@atarashi/blueprints/package.json'));\n } catch {\n return undefined;\n }\n}\n\nexport interface BundledSource {\n source: DirectorySource;\n root: string;\n versionManifestPath: string;\n}\n\nexport function createBundledSource(explicit?: string): BundledSource | undefined {\n const root = findBundledRoot(explicit);\n if (!root) return undefined;\n\n return {\n root,\n versionManifestPath: join(root, 'version-manifest.json'),\n source: new DirectorySource(join(root, 'blueprints'), {\n trusted: true,\n origin: 'bundled',\n presetsDir: join(root, 'presets'),\n }),\n };\n}\n\n/**\n * The bundled fallback for the registry's version manifest, so dependency\n * ranges resolve offline exactly as they do online.\n */\nexport async function readBundledVersionManifest(\n path: string\n): Promise<Record<string, string> | undefined> {\n if (!existsSync(path)) return undefined;\n try {\n const raw = JSON.parse(await readFile(path, 'utf8')) as {\n packages?: Record<string, string>;\n };\n return raw.packages ?? {};\n } catch {\n return undefined;\n }\n}\n","import { join } from 'node:path';\nimport { DirectorySource } from './directory.js';\n\n/** Where a project keeps blueprints it is developing or vendoring. */\nexport const LOCAL_BLUEPRINTS_DIR = join('.atarashi', 'blueprints');\n\n/**\n * Project-local blueprints win over every other source, so an author can\n * override a published blueprint by dropping a directory in the project. They\n * are untrusted all the same: being on disk is not review.\n */\nexport function createLocalSource(cwd: string, dir?: string): DirectorySource {\n const root = dir ?? join(cwd, LOCAL_BLUEPRINTS_DIR);\n return new DirectorySource(root, {\n trusted: false,\n origin: `local:${root}`,\n presetsDir: join(root, '..', 'presets'),\n });\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { dirname, join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { BlueprintSummary, LoadedBlueprint } from '@atarashi/core';\nimport { DIAGNOSTIC_CODES } from '@atarashi/schema';\nimport { RegistryError } from '../errors.js';\nimport { loadBlueprintDir, summarize } from './directory.js';\n\nexport const NPM_PREFIX = 'npm:';\nexport const NPM_PACKAGE_PATTERN = /^(?:@[a-z0-9-~][a-z0-9-._~]*\\/)?atarashi-blueprint-[a-z0-9-]+$/;\n\n/** `npm:atarashi-blueprint-redis` → `atarashi-blueprint-redis`. */\nexport const parseNpmSpec = (spec: string): string | undefined =>\n spec.startsWith(NPM_PREFIX) ? spec.slice(NPM_PREFIX.length) : undefined;\n\n/**\n * A community blueprint published to npm. The package's `atarashi` field points\n * at the directory holding its `blueprint.json`; everything else about it is\n * treated as hostile — untrusted, so hooks require explicit consent.\n */\nexport class NpmSource {\n private readonly cache = new Map<string, LoadedBlueprint>();\n private resolved: Map<string, LoadedBlueprint> | undefined;\n\n constructor(\n private readonly cwd: string,\n private readonly packages: string[] = []\n ) {}\n\n /** Adds a package for this run, e.g. from `--add npm:atarashi-blueprint-redis`. */\n add(spec: string): this {\n const name = parseNpmSpec(spec) ?? spec;\n if (!this.packages.includes(name)) {\n this.packages.push(name);\n this.resolved = undefined;\n }\n return this;\n }\n\n private async loadPackage(name: string): Promise<LoadedBlueprint> {\n const existing = this.cache.get(name);\n if (existing) return existing;\n\n if (!NPM_PACKAGE_PATTERN.test(name)) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.UNKNOWN_BLUEPRINT,\n `\\`${name}\\` is not a blueprint package name`,\n {\n suggestions: [\n 'Community blueprint packages are named `atarashi-blueprint-<name>`',\n ],\n }\n );\n }\n\n const require_ = createRequire(pathToFileURL(join(this.cwd, 'noop.js')));\n let packageJsonPath: string;\n try {\n packageJsonPath = require_.resolve(`${name}/package.json`);\n } catch {\n throw new RegistryError(\n DIAGNOSTIC_CODES.UNKNOWN_BLUEPRINT,\n `\\`${name}\\` is not installed in ${this.cwd}`,\n { suggestions: [`Install it first: \\`npm install ${name}\\``] }\n );\n }\n\n const packageRoot = dirname(packageJsonPath);\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8')) as {\n atarashi?: string;\n version?: string;\n };\n if (!packageJson.atarashi) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.SCHEMA_INVALID,\n `\\`${name}\\` has no \\`atarashi\\` field pointing at its blueprint`,\n { suggestions: ['Add `\"atarashi\": \"./blueprint\"` to the package'] }\n );\n }\n\n const dir = resolve(packageRoot, packageJson.atarashi);\n if (!dir.startsWith(packageRoot) || !existsSync(dir)) {\n throw new RegistryError(\n DIAGNOSTIC_CODES.SCHEMA_INVALID,\n `\\`${name}\\` points its \\`atarashi\\` field outside the package`\n );\n }\n\n const blueprint = await loadBlueprintDir(dir, {\n trusted: false,\n origin: `npm:${name}@${packageJson.version ?? 'unknown'}`,\n });\n this.cache.set(name, blueprint);\n return blueprint;\n }\n\n private async all(): Promise<Map<string, LoadedBlueprint>> {\n if (this.resolved) return this.resolved;\n const map = new Map<string, LoadedBlueprint>();\n for (const name of this.packages) {\n const blueprint = await this.loadPackage(name);\n map.set(blueprint.manifest.id, blueprint);\n }\n this.resolved = map;\n return map;\n }\n\n async load(id: string): Promise<LoadedBlueprint | undefined> {\n const name = parseNpmSpec(id);\n if (name) return this.loadPackage(name);\n return (await this.all()).get(id);\n }\n\n async summaries(): Promise<BlueprintSummary[]> {\n return [...(await this.all()).values()].map((entry) => summarize(entry.manifest));\n }\n}\n","import { join } from 'node:path';\nimport type { BlueprintSummary, LoadedBlueprint } from '@atarashi/core';\nimport { DIAGNOSTIC_CODES, type RegistryEntry, type RegistryIndex } from '@atarashi/schema';\nimport type { RegistryCache } from '../cache.js';\nimport { RegistryError, unavailable } from '../errors.js';\nimport { type FetchLike, httpGet, joinUrl } from '../http.js';\nimport type { IndexStore } from '../index-store.js';\nimport { loadBlueprintDir, loadPresetFile } from './directory.js';\n\nexport const entrySummary = (entry: RegistryEntry): BlueprintSummary => ({\n id: entry.id,\n version: entry.version,\n provides: entry.provides,\n requires: entry.requires,\n conflicts: entry.conflicts,\n deprecated: entry.deprecated,\n});\n\n/**\n * Blueprints from the remote index. Resolution is index-only — capabilities,\n * versions and conflicts all come from entry summaries — so nothing is\n * downloaded until a blueprint is actually part of the graph.\n */\nexport class RemoteSource {\n constructor(\n private readonly store: IndexStore,\n private readonly cache: RegistryCache,\n private readonly options: {\n offline?: boolean;\n fetchImpl?: FetchLike;\n /** Set from the *source* config, never from the index it serves. */\n trusted?: boolean;\n } = {}\n ) {}\n\n /** `undefined` when the index cannot be reached at all — bundled still works. */\n private async index(): Promise<RegistryIndex | undefined> {\n try {\n return (await this.store.load()).index;\n } catch (thrown) {\n if (\n thrown instanceof RegistryError &&\n thrown.code === DIAGNOSTIC_CODES.INTEGRITY_MISMATCH\n ) {\n throw thrown;\n }\n return undefined;\n }\n }\n\n async entry(id: string): Promise<RegistryEntry | undefined> {\n const index = await this.index();\n return index?.entries.find(\n (candidate) => candidate.id === id && candidate.kind !== 'preset'\n );\n }\n\n async summaries(): Promise<BlueprintSummary[]> {\n const index = await this.index();\n return (index?.entries ?? []).filter((entry) => entry.kind !== 'preset').map(entrySummary);\n }\n\n async versionManifest(): Promise<Record<string, string> | undefined> {\n const index = await this.index();\n return index?.versionManifest?.packages;\n }\n\n async load(id: string): Promise<LoadedBlueprint | undefined> {\n const entry = await this.entry(id);\n if (!entry) return undefined;\n return this.loadEntry(entry);\n }\n\n async loadEntry(entry: RegistryEntry): Promise<LoadedBlueprint> {\n const dir = await this.materialize(entry);\n return loadBlueprintDir(dir, {\n // Trust is a property of the source, not of the document it\n // serves: an index cannot promote its own entries.\n trusted: this.options.trusted ?? false,\n origin: `registry:${entry.id}@${entry.version}`,\n });\n }\n\n async preset(id: string) {\n const index = await this.index();\n return index?.entries.find((entry) => entry.id === id && entry.kind === 'preset');\n }\n\n async loadPreset(id: string) {\n const entry = await this.preset(id);\n if (!entry) return undefined;\n const dir = await this.materialize(entry);\n return loadPresetFile(join(dir, 'preset.json'));\n }\n\n /** Downloads and verifies once; every later run is a cache hit. */\n private async materialize(entry: RegistryEntry): Promise<string> {\n if (this.cache.hasBlueprint(entry.id, entry.version, entry.integrity)) {\n return this.cache.blueprintDir(entry.id, entry.version, entry.integrity);\n }\n if (this.options.offline) {\n throw unavailable(\n `${entry.id}@${entry.version} is not cached, and the network is disabled`,\n ['Run the same command without `--offline` once to populate the cache']\n );\n }\n\n const url = joinUrl(this.store.url, entry.tarball);\n const response = await httpGet(url, { fetchImpl: this.options.fetchImpl });\n return this.cache.storeBlueprint(entry, response.body);\n }\n}\n","import type { BlueprintSource, BlueprintSummary, LoadedBlueprint } from '@atarashi/core';\nimport {\n DIAGNOSTIC_CODES,\n type Diagnostic,\n type PresetManifest,\n type RegistryPin,\n type RegistrySource,\n} from '@atarashi/schema';\nimport { gt, valid } from 'semver';\nimport { RegistryCache } from './cache.js';\nimport { RegistryError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { IndexStore } from './index-store.js';\nimport {\n type BundledSource,\n createBundledSource,\n readBundledVersionManifest,\n} from './loaders/bundled.js';\nimport type { DirectorySource } from './loaders/directory.js';\nimport { createLocalSource } from './loaders/local.js';\nimport { NPM_PREFIX, NpmSource } from './loaders/npm.js';\nimport { RemoteSource } from './loaders/remote.js';\nimport { DEFAULT_REGISTRY_URL, DEFAULT_TTL_MS, resolveCacheRoot } from './paths.js';\n\nexport interface RegistryOptions {\n /** The project directory — where local and npm blueprints are looked up. */\n cwd?: string;\n cacheDir?: string;\n url?: string;\n /** Exact registry version, from `atarashi.json` or `atarashi registry pin`. */\n pin?: string | null;\n offline?: boolean;\n ttlMs?: number;\n /** Extra third-party sources. Untrusted unless the user marked them trusted. */\n sources?: RegistrySource[];\n /** Community packages pulled in with `--add npm:atarashi-blueprint-x`. */\n npmPackages?: string[];\n bundledDir?: string;\n localDir?: string;\n fetchImpl?: FetchLike;\n now?: () => Date;\n env?: NodeJS.ProcessEnv;\n}\n\n/** Where a blueprint id was resolved from, for `atarashi info` and diagnostics. */\nexport type SourceKind = 'local' | 'npm' | 'registry' | 'bundled';\n\ninterface RemoteLayer {\n name: string;\n store: IndexStore;\n source: RemoteSource;\n}\n\nconst isOffline = (options: RegistryOptions): boolean => {\n if (options.offline !== undefined) return options.offline;\n const env = options.env ?? process.env;\n return env.ATARASHI_OFFLINE === '1' || env.ATARASHI_OFFLINE === 'true';\n};\n\n/**\n * The one I/O boundary for blueprints. Core asks this for a `LoadedBlueprint`\n * and never touches disk or the network itself.\n *\n * Four layers, in precedence order:\n *\n * 1. `./.atarashi/blueprints` — a project's own, so an author can override\n * anything while developing.\n * 2. `npm:` packages the user explicitly asked for.\n * 3. the remote registry and the bundled collection, whichever has the newer\n * version — this is what lets a registry release ship a blueprint fix\n * without a CLI release, while a plane-mode run still works.\n */\nexport class Registry implements BlueprintSource {\n private readonly local: DirectorySource;\n private readonly npm: NpmSource;\n private readonly bundled: BundledSource | undefined;\n private readonly remotes: RemoteLayer[] = [];\n private readonly primary: RemoteLayer | undefined;\n readonly cache: RegistryCache;\n readonly offline: boolean;\n\n constructor(options: RegistryOptions = {}) {\n const cwd = options.cwd ?? process.cwd();\n this.offline = isOffline(options);\n this.cache = new RegistryCache(\n options.cacheDir ?? resolveCacheRoot(options.env ?? process.env)\n );\n\n this.local = createLocalSource(cwd, options.localDir);\n this.npm = new NpmSource(cwd, [...(options.npmPackages ?? [])]);\n this.bundled = createBundledSource(options.bundledDir);\n\n const configured: RegistrySource[] = options.sources?.length\n ? options.sources\n : [\n {\n name: 'atarashi',\n url: options.url ?? DEFAULT_REGISTRY_URL,\n trusted: true,\n enabled: true,\n },\n ];\n\n for (const source of configured.filter((candidate) => candidate.enabled !== false)) {\n const store = new IndexStore({\n cache: this.cache,\n url: source.url,\n pin: options.pin ?? null,\n offline: this.offline,\n ttlMs: options.ttlMs ?? DEFAULT_TTL_MS,\n fetchImpl: options.fetchImpl,\n now: options.now,\n });\n this.remotes.push({\n name: source.name,\n store,\n source: new RemoteSource(store, this.cache, {\n offline: this.offline,\n fetchImpl: options.fetchImpl,\n trusted: source.trusted === true,\n }),\n });\n }\n this.primary = this.remotes[0];\n }\n\n /** Warnings collected while resolving — degraded-network notices, mostly. */\n get diagnostics(): Diagnostic[] {\n return this.remotes.flatMap((layer) => layer.store.diagnostics);\n }\n\n // ── BlueprintSource ──────────────────────────────────────────────────────\n\n async load(id: string): Promise<LoadedBlueprint | undefined> {\n if (id.startsWith(NPM_PREFIX)) return this.npm.load(id);\n\n const local = await this.local.load(id);\n if (local) return local;\n\n const fromNpm = await this.npm.load(id);\n if (fromNpm) return fromNpm;\n\n const bundled = await this.bundled?.source.load(id);\n\n for (const layer of this.remotes) {\n const entry = await layer.source.entry(id);\n if (!entry) continue;\n // The bundled copy wins ties, so an unchanged blueprint never costs\n // a download.\n if (bundled && !isNewer(entry.version, bundled.manifest.version)) break;\n try {\n return await layer.source.loadEntry(entry);\n } catch (thrown) {\n if (isIntegrityFailure(thrown) || !bundled) throw thrown;\n break; // fall back to the bundled copy\n }\n }\n\n return bundled;\n }\n\n async providersOf(capability: string): Promise<BlueprintSummary[]> {\n const all = await this.summaries();\n return all\n .filter((summary) => summary.provides.includes(capability))\n .sort((a, b) => (a.id < b.id ? -1 : 1));\n }\n\n async loadPreset(id: string): Promise<PresetManifest | undefined> {\n const local = await this.local.loadPreset(id);\n if (local) return local;\n const bundled = await this.bundled?.source.loadPreset(id);\n for (const layer of this.remotes) {\n try {\n const preset = await layer.source.loadPreset(id);\n if (preset) return preset;\n } catch (thrown) {\n if (isIntegrityFailure(thrown) || !bundled) throw thrown;\n break; // fall back to the bundled copy, e.g. offline with an uncached tarball\n }\n }\n return bundled;\n }\n\n /** Every preset visible from every layer, deduplicated by precedence — `atarashi list presets`. */\n async presets(): Promise<PresetManifest[]> {\n const merged = new Map<string, PresetManifest>();\n\n for (const preset of (await this.bundled?.source.presets()) ?? [])\n merged.set(preset.id, preset);\n\n for (const layer of this.remotes) {\n const loaded = await layer.store.load().catch(() => undefined);\n const presetEntries =\n loaded?.index.entries.filter((entry) => entry.kind === 'preset') ?? [];\n for (const entry of presetEntries) {\n try {\n const preset = await layer.source.loadPreset(entry.id);\n if (preset) merged.set(preset.id, preset);\n } catch (thrown) {\n if (isIntegrityFailure(thrown)) throw thrown;\n }\n }\n }\n\n // Local is an absolute override, not a version comparison.\n for (const preset of await this.local.presets()) merged.set(preset.id, preset);\n\n return [...merged.values()].sort((a, b) => (a.id < b.id ? -1 : 1));\n }\n\n /**\n * One place defines the range every blueprint uses. The registry's manifest\n * wins over the bundled one; anything the registry does not pin keeps the\n * bundled value, so an offline run resolves the same names.\n */\n async versionManifest(): Promise<Record<string, string>> {\n const bundled = this.bundled\n ? ((await readBundledVersionManifest(this.bundled.versionManifestPath)) ?? {})\n : {};\n const remote = (await this.primary?.source.versionManifest()) ?? {};\n return { ...bundled, ...remote };\n }\n\n // ── Beyond the core interface ────────────────────────────────────────────\n\n /** Every blueprint visible from every layer, deduplicated by precedence. */\n async summaries(): Promise<BlueprintSummary[]> {\n const merged = new Map<string, BlueprintSummary>();\n\n const put = (summary: BlueprintSummary, overwrite: boolean) => {\n const existing = merged.get(summary.id);\n if (!existing || (overwrite && isNewer(summary.version, existing.version))) {\n merged.set(summary.id, summary);\n }\n };\n\n for (const summary of (await this.bundled?.source.summaries()) ?? []) put(summary, false);\n for (const layer of this.remotes) {\n for (const summary of await layer.source.summaries()) put(summary, true);\n }\n // Local and npm are absolute overrides, not version comparisons.\n for (const summary of await this.npm.summaries()) merged.set(summary.id, summary);\n for (const summary of await this.local.summaries()) merged.set(summary.id, summary);\n\n return [...merged.values()].sort((a, b) => (a.id < b.id ? -1 : 1));\n }\n\n async list(): Promise<BlueprintSummary[]> {\n return this.summaries();\n }\n\n /** Which layer an id resolves from, without loading its files. */\n async originOf(id: string): Promise<SourceKind | undefined> {\n if (await this.local.has(id)) return 'local';\n if (await this.npm.load(id).catch(() => undefined)) return 'npm';\n for (const layer of this.remotes) {\n if (await layer.source.entry(id)) return 'registry';\n }\n return (await this.bundled?.source.load(id)) ? 'bundled' : undefined;\n }\n\n /** What gets written into `atarashi.json` so this run can be reproduced. */\n async pin(): Promise<RegistryPin | undefined> {\n if (!this.primary) return undefined;\n try {\n const { index, origin } = await this.primary.store.load();\n const record: RegistryPin = { version: index.version };\n if (index.integrity) record.integrity = index.integrity;\n if (origin.url !== DEFAULT_REGISTRY_URL) record.source = origin.url;\n return record;\n } catch {\n // A run that never reached the registry pins nothing, rather than\n // pinning a version it did not actually use.\n return undefined;\n }\n }\n\n /** `atarashi registry update` — ignore the TTL and re-check every source. */\n async update(): Promise<{ name: string; version: string; from: string }[]> {\n const results: { name: string; version: string; from: string }[] = [];\n for (const layer of this.remotes) {\n const { index, origin } = await layer.store.refresh();\n results.push({ name: layer.name, version: index.version, from: origin.from });\n }\n return results;\n }\n\n /** `atarashi registry list` — every version this machine has verified. */\n async cachedVersions(): Promise<string[]> {\n return this.cache.cachedIndexVersions();\n }\n\n verifyCache() {\n return this.cache.verify();\n }\n\n clearCache() {\n return this.cache.clear();\n }\n\n addNpmPackage(spec: string): this {\n this.npm.add(spec);\n return this;\n }\n}\n\nconst isIntegrityFailure = (thrown: unknown): boolean =>\n thrown instanceof RegistryError && thrown.code === DIAGNOSTIC_CODES.INTEGRITY_MISMATCH;\n\nconst isNewer = (candidate: string, incumbent: string): boolean =>\n valid(candidate) && valid(incumbent) ? gt(candidate, incumbent) : false;\n\nexport const createRegistry = (options: RegistryOptions = {}): Registry => new Registry(options);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atarashi/registry",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Blueprint registry: fetch, verify, cache, pin and load blueprints.",
5
5
  "type": "module",
6
6
  "license": "MIT",