aronrepo 3.0.0 → 3.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-ClWK0lQ9.js","names":["readJson","loadYaml","git"],"sources":["../src/project.ts","../src/release.ts","../src/commands.ts"],"sourcesContent":["import { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { globSync } from 'tinyglobby'\nimport { load as loadYaml } from 'js-yaml'\nimport {\n createReleasePathMatcher,\n defaultReleasePathExcludes,\n getReleasePolicy,\n resolveRelease,\n type AronrepoConfig,\n type CommitInput,\n type ReleasePathsConfig,\n type ReleasePolicy\n} from './policy'\n\nexport interface PackageJson {\n name?: string\n version?: string\n private?: boolean\n workspaces?: string[] | { packages?: string[] }\n publishConfig?: {\n access?: string\n provenance?: boolean\n [key: string]: unknown\n }\n [key: string]: unknown\n}\n\n/** Config files in lookup order. Node 22.18+ imports `.ts` files by stripping their types. */\nexport const configFileNames = ['aronrepo.config.js', 'aronrepo.config.mjs', 'aronrepo.config.cjs', 'aronrepo.config.ts', 'aronrepo.config.mts', 'aronrepo.config.cts']\n\nfunction toPosixPath(value: string) {\n return value.split(path.sep).join('/')\n}\n\n/** Reads JSON like npm does, accepting a UTF-8 byte order mark, and names the file when it is invalid. */\nexport function readJsonFile<T>(file: string) {\n const content = fs.readFileSync(file, 'utf8').replace(/^\\uFEFF/, '')\n try {\n return JSON.parse(content) as T\n } catch (error) {\n throw new Error(`${file} is not valid JSON: ${(error as Error).message}`, { cause: error })\n }\n}\n\nconst readJson = readJsonFile\n\nexport function findConfigFile(cwd = process.cwd()) {\n return configFileNames\n .map((name) => path.join(cwd, name))\n .find((file) => fs.existsSync(file))\n}\n\n/** Loads `aronrepo.config.js` from the repository root; returns `{}` when it is missing. */\nexport async function loadConfig(cwd = process.cwd()): Promise<AronrepoConfig> {\n const file = findConfigFile(cwd)\n if (!file) return {}\n // The query keeps long-lived processes from reusing a cached module after the file changes.\n const stat = fs.statSync(file)\n const url = `${pathToFileURL(file).href}?mtime=${stat.mtimeMs}&size=${stat.size}`\n const module = await import(url) as { default?: AronrepoConfig }\n return module.default ?? {}\n}\n\nfunction readPNPMWorkspaces(cwd: string) {\n const workspacePath = path.join(cwd, 'pnpm-workspace.yaml')\n if (!fs.existsSync(workspacePath)) return undefined\n\n const content = fs.readFileSync(workspacePath, 'utf8')\n // js-yaml 5 rejects an empty document, such as a file with only comments.\n if (!content.split('\\n').some((line) => line.trim() && !line.trim().startsWith('#'))) return undefined\n const workspace = loadYaml(content) as { packages?: string[] } | null | undefined\n return workspace?.packages\n}\n\nfunction readNPMWorkspaces(cwd: string) {\n const packagePath = path.join(cwd, 'package.json')\n if (!fs.existsSync(packagePath)) return undefined\n\n const pkg = readJson<PackageJson>(packagePath)\n return Array.isArray(pkg.workspaces)\n ? pkg.workspaces\n : pkg.workspaces?.packages\n}\n\nexport function readWorkspacePatterns(cwd = process.cwd()) {\n return readPNPMWorkspaces(cwd) ?? readNPMWorkspaces(cwd) ?? []\n}\n\nexport function queryWorkspaceDirs(patterns: string[], cwd = process.cwd()) {\n if (!patterns.length) return []\n\n return globSync(\n patterns.map((workspace) => `${workspace}/package.json`),\n {\n cwd,\n onlyFiles: true,\n expandDirectories: false,\n ignore: [\n '**/node_modules/**'\n ]\n }\n )\n .map((workspacePackage) => toPosixPath(workspacePackage).replace(/\\/?package\\.json$/, '') || '.')\n .sort()\n}\n\nexport function readWorkspacePackage(cwd: string, workspace: string) {\n return readJson<PackageJson>(path.join(cwd, workspace, 'package.json'))\n}\n\n/**\n * Directories of the packages that ship: public, non-private workspace packages,\n * and the root package when it is published too. A root package without\n * workspaces ships unless it is private; with workspaces it needs\n * `publishConfig.access: \"public\"` like the others.\n */\nexport function queryReleaseDirs(cwd = process.cwd()) {\n const dirs = queryPublicWorkspaceDirs(cwd)\n const rootFile = path.join(cwd, 'package.json')\n if (dirs.includes('.') || !fs.existsSync(rootFile)) return dirs\n const root = readJson<PackageJson>(rootFile)\n const hasWorkspaces = readWorkspacePatterns(cwd).length > 0\n if (root.name && !root.private && (!hasWorkspaces || root.publishConfig?.access === 'public')) return ['.', ...dirs]\n return dirs\n}\n\n/** Workspace directories whose package is published to npm: public and not private. */\nexport function queryPublicWorkspaceDirs(cwd = process.cwd()) {\n return queryWorkspaceDirs(readWorkspacePatterns(cwd), cwd)\n .filter((workspace) => {\n const pkg = readWorkspacePackage(cwd, workspace)\n return pkg.publishConfig?.access === 'public' && !pkg.private\n })\n}\n\n/**\n * Resolves the files whose changes can release a version.\n *\n * Configured paths win. Otherwise public workspace packages define them; a\n * single-package repository with a non-private root package uses every path.\n * Returns `undefined` when no published package is found, which turns the check off.\n */\nexport function resolveReleasePaths(cwd = process.cwd(), policy?: Pick<ReleasePolicy, 'paths'>): ReleasePathsConfig | undefined {\n if (policy?.paths === false) return undefined\n if (policy?.paths?.include) {\n return { include: policy.paths.include, exclude: policy.paths.exclude ?? defaultReleasePathExcludes }\n }\n const exclude = policy?.paths?.exclude ?? defaultReleasePathExcludes\n const dirs = queryReleaseDirs(cwd)\n if (!dirs.length) return undefined\n return { include: dirs.includes('.') ? ['**'] : dirs.map((dir) => `${dir}/**`), exclude }\n}\n\nexport type PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm'\n\nconst lockfiles: Array<[string, PackageManager]> = [\n ['bun.lock', 'bun'],\n ['bun.lockb', 'bun'],\n ['pnpm-lock.yaml', 'pnpm'],\n ['pnpm-workspace.yaml', 'pnpm'],\n ['yarn.lock', 'yarn'],\n ['package-lock.json', 'npm']\n]\n\n/** The package manager from `packageManager` in package.json, then from the lockfile; `npm` by default. */\nexport function detectPackageManager(cwd = process.cwd()): PackageManager {\n const rootPackage = path.join(cwd, 'package.json')\n const declared = fs.existsSync(rootPackage) ? String(readJson<PackageJson>(rootPackage).packageManager ?? '').split('@')[0] : ''\n if (declared === 'bun' || declared === 'pnpm' || declared === 'yarn' || declared === 'npm') return declared\n return lockfiles.find(([file]) => fs.existsSync(path.join(cwd, file)))?.[1] ?? 'npm'\n}\n\n/** How to run the aronrepo CLI with a package manager. */\nexport function getCliCommand(packageManager: PackageManager) {\n return {\n bun: 'bun x aronrepo',\n pnpm: 'pnpm exec aronrepo',\n yarn: 'yarn aronrepo',\n npm: 'npx aronrepo'\n }[packageManager]\n}\n\n/**\n * How to run the aronrepo CLI in a repository: its `aronrepo` script when it has\n * one, for example a workspace that builds aronrepo itself, or the installed binary.\n */\nexport function getProjectCliCommand(cwd: string, packageManager = detectPackageManager(cwd)) {\n const rootPackage = path.join(cwd, 'package.json')\n const scripts = fs.existsSync(rootPackage) ? readJson<PackageJson>(rootPackage).scripts as Record<string, string> | undefined : undefined\n if (scripts?.aronrepo) return packageManager === 'npm' ? 'npm run aronrepo --' : `${packageManager} run aronrepo`\n return getCliCommand(packageManager)\n}\n\nexport interface ProjectPolicy {\n cwd: string\n packageManager: PackageManager\n /** How to run the aronrepo CLI in this repository. */\n cli: string\n config: AronrepoConfig\n configFile?: string\n policy: ReleasePolicy\n releasePaths?: ReleasePathsConfig\n isReleasePath?: (file: string) => boolean\n}\n\n/** Loads the config, release policy, and release paths of a repository. */\nexport async function loadProjectPolicy(cwd = process.cwd(), overrides: Partial<ReleasePolicy> = {}): Promise<ProjectPolicy> {\n const config = await loadConfig(cwd)\n const policy = { ...getReleasePolicy(config), ...overrides }\n const releasePaths = resolveReleasePaths(cwd, policy)\n const configFile = findConfigFile(cwd)\n const packageManager = detectPackageManager(cwd)\n return {\n cwd,\n packageManager,\n cli: getProjectCliCommand(cwd, packageManager),\n config,\n ...(configFile ? { configFile } : {}),\n policy,\n ...(releasePaths ? { releasePaths } : {}),\n ...(releasePaths ? { isReleasePath: createReleasePathMatcher(releasePaths) } : {})\n }\n}\n\nfunction git(cwd: string, args: string[]) {\n if (!fs.existsSync(cwd)) throw new Error(`${cwd} does not exist.`)\n try {\n return execFileSync('git', args, { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'] })\n } catch (error) {\n const { stderr, code } = error as { stderr?: string, code?: string }\n if (code === 'ENOENT') throw new Error('git is not installed or not on PATH.', { cause: error })\n throw new Error(`\\`git ${args.join(' ')}\\` failed: ${stderr?.trim() || (error as Error).message}`, { cause: error })\n }\n}\n\n/** The repository root that contains `cwd`, or `cwd` itself outside a git repository. */\nexport function getRepositoryRoot(cwd = process.cwd()) {\n try {\n return git(cwd, ['rev-parse', '--show-toplevel']).trim() || cwd\n } catch {\n return cwd\n }\n}\n\n/** A git config value, or `undefined` when it is not set. */\nexport function getGitConfig(cwd: string, key: string) {\n try {\n return git(cwd, ['config', '--get', key]).trim() || undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * NUL-separated paths. `-z` keeps git from quoting paths with non-ASCII or\n * special characters, such as `\"docs/\\\\346\\\\226\\\\207.md\"`, which would never\n * match a release path.\n */\nfunction splitPaths(output: string) {\n return output.split('\\0').map((file) => file.replace(/^\\n/, '')).filter(Boolean)\n}\n\n// Rename detection lists only the new path; both paths decide whether a commit ships.\nconst nameOnly = ['--name-only', '-z', '--no-renames']\n\n/** Files changed by one commit. Merge commits report no files. */\nexport function getCommitFiles(cwd: string, hash: string) {\n return splitPaths(git(cwd, ['diff-tree', '--no-commit-id', ...nameOnly, '-r', '--root', hash]))\n}\n\nexport function getStagedFiles(cwd = process.cwd()) {\n return splitPaths(git(cwd, ['diff', '--cached', ...nameOnly]))\n}\n\n/** Files changed between the merge base of `base` and `head`, like a pull request diff. */\nexport function getDiffFiles(cwd: string, base: string, head: string) {\n return splitPaths(git(cwd, ['diff', ...nameOnly, `${base}...${head}`]))\n}\n\n/** Commits in `from..to`, oldest first, with their changed files, from one `git log`. Merge commits report no files. */\nexport function getRangeCommits(cwd: string, from: string | undefined, to = 'HEAD'): Required<CommitInput>[] {\n const range = from ? `${from}..${to}` : to\n const output = git(cwd, [\n '-c', 'log.showSignature=false',\n 'log', '--reverse', '--no-color', ...nameOnly, '--format=%x1e%H%x1f%B%x1f', range, '--'\n ])\n return output.split('\\x1e')\n .filter((entry) => entry.includes('\\x1f'))\n .map((entry) => {\n const hashEnd = entry.indexOf('\\x1f')\n const messageEnd = entry.indexOf('\\x1f', hashEnd + 1)\n return {\n hash: entry.slice(0, hashEnd),\n message: entry.slice(hashEnd + 1, messageEnd).trim(),\n files: splitPaths(entry.slice(messageEnd + 1))\n }\n })\n}\n\n/**\n * Latest `v*` version tag reachable from `ref`, or `undefined` when there is none.\n * A tag on `ref` itself does not count, so `explain --to v1.1.0` explains v1.1.0.\n */\nexport function getLatestTag(cwd: string, ref = 'HEAD') {\n try {\n return git(cwd, ['describe', '--tags', '--abbrev=0', '--match', 'v[0-9]*', `${ref}^`]).trim() || undefined\n } catch {\n return undefined\n }\n}\n\n/** `v*` tags, optionally only those merged into `ref`; none when `ref` does not exist, such as the parent of a root commit. */\nexport function getVersionTags(cwd: string, mergedInto?: string) {\n try {\n return splitPaths(git(cwd, ['tag', '--list', 'v*', ...(mergedInto ? ['--merged', mergedInto] : [])]).replace(/\\n/g, '\\0'))\n } catch {\n return []\n }\n}\n\n/** The checked-out branch, or `undefined` on a detached HEAD. */\nexport function getCurrentBranch(cwd: string) {\n const branch = git(cwd, ['rev-parse', '--abbrev-ref', 'HEAD']).trim()\n return branch === 'HEAD' ? undefined : branch\n}\n\n/** Resolves the release of a commit range with the repository's policy and release paths. */\nexport async function explainRange(cwd: string, from: string | undefined, to = 'HEAD', overrides: Partial<ReleasePolicy> = {}) {\n const project = await loadProjectPolicy(cwd, overrides)\n const commits = getRangeCommits(cwd, from, to)\n return {\n ...project,\n from,\n to,\n ...resolveRelease(commits, project.policy, project.isReleasePath ? { isReleasePath: project.isReleasePath } : {})\n }\n}\n","import { spawn } from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { gunzipSync } from 'node:zlib'\nimport semver from 'semver'\nimport type { ReleaseType } from './commits'\nimport { renderReleaseNotes } from './notes'\nimport { resolveRelease, type CommitDecision, type ReleasePolicy } from './policy'\nimport {\n detectPackageManager,\n getRangeCommits,\n loadProjectPolicy,\n queryReleaseDirs,\n readJsonFile,\n type PackageJson,\n type PackageManager\n} from './project'\nimport {\n getBaseTag,\n getNextVersion,\n getReleaseChannel,\n parseVersionTag,\n toVersionTag,\n type ReleaseChannel\n} from './version'\n\nexport const officialRegistry = 'https://registry.npmjs.org/'\n\n/** npm dist-tag that holds a release until every package of it is published. */\nexport const stagingDistTag = 'aronrepo-staging'\n\n/** GitHub rejects release bodies over 125,000 characters. */\nexport const releaseBodyLimit = 120_000\n\nexport interface RunResult {\n stdout: string\n stderr: string\n}\n\nexport type Runner = (command: string, args: string[], options: { cwd: string, env: NodeJS.ProcessEnv }) => Promise<RunResult>\n\nexport type Fetch = (input: string, init?: RequestInit) => Promise<Response>\n\nexport interface ReleaseEnvironment {\n cwd: string\n env: NodeJS.ProcessEnv\n run: Runner\n fetch: Fetch\n log: (message: string) => void\n /** Waits between registry checks. */\n wait: (ms: number) => Promise<void>\n}\n\n/** Quotes an argument for `cmd.exe`, which runs `.cmd` shims such as `npm.cmd` on Windows. */\nexport function quoteWindowsArg(arg: string) {\n if (/^[\\w@+=:,./\\\\-]+$/.test(arg)) return arg\n return `\"${arg.replace(/(\\\\*)\"/g, '$1$1\\\\\"').replace(/(\\\\+)$/, '$1$1')}\"`\n}\n\nexport const runCommand: Runner = (command, args, { cwd, env }) => new Promise((resolve, reject) => {\n // Windows needs a shell for `.cmd` shims, and a shell joins arguments without quoting them.\n const child = process.platform === 'win32'\n ? spawn([command, ...args].map(quoteWindowsArg).join(' '), { cwd, env, stdio: ['ignore', 'pipe', 'pipe'], shell: true })\n : spawn(command, args, { cwd, env, stdio: ['ignore', 'pipe', 'pipe'] })\n let stdout = ''\n let stderr = ''\n child.stdout.on('data', (chunk) => { stdout += chunk })\n child.stderr.on('data', (chunk) => { stderr += chunk })\n child.on('error', reject)\n child.on('close', (code, signal) => {\n if (code === 0) resolve({ stdout, stderr })\n else reject(new Error(`\\`${command} ${args.join(' ')}\\` ${signal ? `was stopped by ${signal}` : `exited with ${code}`}.\\n${stderr.trim() || stdout.trim()}`))\n })\n})\n\nfunction createEnvironment(options: Partial<ReleaseEnvironment> = {}): ReleaseEnvironment {\n return {\n cwd: options.cwd ?? process.cwd(),\n env: options.env ?? process.env,\n run: options.run ?? runCommand,\n fetch: options.fetch ?? ((input, init) => fetch(input, init)),\n log: options.log ?? ((message) => console.log(message)),\n wait: options.wait ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)))\n }\n}\n\n/** Variables that hold credentials. Package scripts that run while packing never see them. */\nconst secretVariables = [\n 'NPM_TOKEN', 'NODE_AUTH_TOKEN', 'NPM_ID_TOKEN', 'GITHUB_TOKEN', 'GH_TOKEN',\n 'ACTIONS_ID_TOKEN_REQUEST_TOKEN', 'ACTIONS_ID_TOKEN_REQUEST_URL', 'ACTIONS_RUNTIME_TOKEN'\n]\n\nfunction withoutSecrets(env: NodeJS.ProcessEnv) {\n return Object.fromEntries(Object.entries(env).filter(([key]) => !secretVariables.includes(key.toUpperCase())))\n}\n\nasync function git(environment: ReleaseEnvironment, args: string[]) {\n return (await environment.run('git', args, { cwd: environment.cwd, env: environment.env })).stdout.trim()\n}\n\nasync function gitSucceeds(environment: ReleaseEnvironment, args: string[]) {\n try {\n await git(environment, args)\n return true\n } catch {\n return false\n }\n}\n\nfunction lines(output: string) {\n return output.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\nexport interface ReleasePackage {\n /** Directory relative to the repository root, `.` for the root package. */\n dir: string\n name: string\n manifest: PackageJson\n}\n\nconst readJson = readJsonFile\n\nconst dependencyFields = ['dependencies', 'optionalDependencies', 'peerDependencies'] as const\n\n/** Fields whose packages must be published first; peers only need to exist when installed. */\nconst orderFields = ['dependencies', 'optionalDependencies'] as const\n\n/** Published packages of the repository in dependency order. */\nexport function getReleasePackages(cwd: string): ReleasePackage[] {\n const packages = queryReleaseDirs(cwd).map((dir) => {\n const manifest = readJson<PackageJson>(path.join(cwd, dir, 'package.json'))\n if (!manifest.name) throw new Error(`${dir}/package.json has no name.`)\n return { dir, name: manifest.name, manifest }\n })\n const names = new Map<string, string>()\n for (const { dir, name } of packages) {\n if (names.has(name)) throw new Error(`${names.get(name)}/package.json and ${dir}/package.json are both named ${name}.`)\n names.set(name, dir)\n }\n const dependenciesOf = (pkg: ReleasePackage) => orderFields\n .flatMap((field) => Object.keys((pkg.manifest[field] ?? {}) as Record<string, string>))\n .filter((name) => names.has(name) && name !== pkg.name)\n\n const ordered: ReleasePackage[] = []\n const visiting = new Set<string>()\n const visit = (pkg: ReleasePackage) => {\n if (ordered.includes(pkg)) return\n if (visiting.has(pkg.name)) throw new Error(`Published packages depend on each other in a cycle through ${pkg.name}.`)\n visiting.add(pkg.name)\n for (const name of dependenciesOf(pkg)) visit(packages.find((candidate) => candidate.name === name)!)\n visiting.delete(pkg.name)\n ordered.push(pkg)\n }\n for (const pkg of [...packages].sort((a, b) => a.dir.localeCompare(b.dir))) visit(pkg)\n return ordered\n}\n\nexport interface ReleasePlan {\n branch: string\n channel?: ReleaseChannel\n /** Full hash of the commit that releases. */\n head: string\n mode: ReleasePolicy['mode']\n /** The tag the range starts from; `undefined` for the first release. */\n from?: string\n release: ReleaseType\n version?: string\n tag?: string\n commits: CommitDecision[]\n notes?: string\n packages: ReleasePackage[]\n}\n\nexport interface PlanReleaseOptions {\n /** Defaults to `GITHUB_REF_NAME`, then the checked-out branch. */\n branch?: string\n mode?: ReleasePolicy['mode']\n /** Plan as if the branch were `main` when it does not release, for `aronrepo explain` on feature branches. */\n fallbackToMain?: boolean\n /** Tags to ignore, to rebuild the plan of a release that is already tagged. */\n ignoreTags?: string[]\n /** Use this version instead of numbering one, to rebuild the plan of a tagged release. */\n version?: string\n date?: string\n}\n\n/**\n * The repository URL on GitHub, from `GITHUB_REPOSITORY` or the root package.json.\n * `owner/repo` and `github:owner/repo` are npm shorthands for GitHub.\n */\nexport function getRepositoryUrl(cwd: string, env: NodeJS.ProcessEnv = process.env) {\n if (env.GITHUB_REPOSITORY) return `${(env.GITHUB_SERVER_URL ?? 'https://github.com').replace(/\\/+$/, '')}/${env.GITHUB_REPOSITORY}`\n const root = path.join(cwd, 'package.json')\n if (!fs.existsSync(root)) return undefined\n const repository = readJson<PackageJson>(root).repository as string | { url?: string } | undefined\n const url = (typeof repository === 'string' ? repository : repository?.url)?.replace(/#.*$/, '')\n if (!url) return undefined\n const shorthand = /^(?:github:)?([\\w.-]+\\/[\\w.-]+?)(?:\\.git)?$/.exec(url)\n const match = shorthand ?? /(?:^|[/@])github\\.com[/:]([^/]+\\/[^/]+?)(?:\\.git)?\\/?$/.exec(url)\n return match ? `https://github.com/${match[1]}` : undefined\n}\n\nasync function getBranch(environment: ReleaseEnvironment, branch?: string) {\n if (branch) return branch\n const checkedOut = await git(environment, ['rev-parse', '--abbrev-ref', 'HEAD'])\n const ref = environment.env.GITHUB_REF_NAME\n if (!ref) return checkedOut\n // A workflow can run on `main` and check out another branch; release the branch that is checked out, not the event's.\n if (checkedOut !== 'HEAD' && checkedOut !== ref) {\n throw new Error(`GITHUB_REF_NAME is ${ref}, but ${checkedOut} is checked out. Pass --branch to choose the release branch.`)\n }\n return ref\n}\n\nfunction renderPlanNotes(environment: ReleaseEnvironment, plan: Pick<ReleasePlan, 'from' | 'commits'>, version: string, date?: string) {\n const repositoryUrl = getRepositoryUrl(environment.cwd, environment.env)\n return renderReleaseNotes({\n version,\n ...(plan.from ? { previousTag: plan.from } : {}),\n date: date ?? new Date().toISOString().slice(0, 10),\n ...(repositoryUrl ? { repositoryUrl } : {}),\n commits: plan.commits\n })\n}\n\n/** Plans the next release of the checked-out commit without changing anything. */\nexport async function planRelease(options: PlanReleaseOptions = {}, environmentOptions: Partial<ReleaseEnvironment> = {}): Promise<ReleasePlan> {\n const environment = createEnvironment(environmentOptions)\n const { cwd } = environment\n const project = await loadProjectPolicy(cwd, options.mode ? { mode: options.mode } : {})\n const branch = await getBranch(environment, options.branch)\n const channel = getReleaseChannel(branch) ?? (options.fallbackToMain ? getReleaseChannel('main') : undefined)\n const head = await git(environment, ['rev-parse', 'HEAD'])\n const packages = getReleasePackages(cwd)\n const base: ReleasePlan = { branch, head, mode: project.policy.mode, release: false, commits: [], packages }\n if (!channel) return base\n\n if (await git(environment, ['rev-parse', '--is-shallow-repository']) === 'true') {\n throw new Error('The repository is a shallow clone, so its tags and commits are incomplete. Fetch the full history, such as `fetch-depth: 0` in actions/checkout.')\n }\n const ignored = new Set(options.ignoreTags ?? [])\n const reachable = lines(await git(environment, ['tag', '--list', 'v*', '--merged', 'HEAD'])).filter((tag) => !ignored.has(tag))\n const all = lines(await git(environment, ['tag', '--list', 'v*'])).filter((tag) => !ignored.has(tag))\n const from = getBaseTag(channel, reachable)\n const decision = resolveRelease(\n getRangeCommits(cwd, from, 'HEAD'),\n project.policy,\n project.isReleasePath ? { isReleasePath: project.isReleasePath } : {}\n )\n const plan: ReleasePlan = { ...base, channel, ...(from ? { from } : {}), release: decision.release, commits: decision.commits }\n if (!decision.release) return plan\n\n const version = options.version ?? getNextVersion(channel, decision.release, { reachable, all })\n return { ...plan, version, tag: toVersionTag(version), notes: renderPlanNotes(environment, plan, version, options.date) }\n}\n\n/** `.npmrc` content that applies in a repository: the project file, then the user file, as npm reads them. */\nfunction readNpmConfigs(cwd: string, env: NodeJS.ProcessEnv) {\n const userconfig = env.NPM_CONFIG_USERCONFIG ?? env.npm_config_userconfig ?? path.join(os.homedir(), '.npmrc')\n return { project: readNpmrc(path.join(cwd, '.npmrc')), user: readNpmrc(userconfig) }\n}\n\n/** The last value of an `.npmrc` key, with `${VAR}` and `${VAR?}` expanded, or `undefined`. */\nfunction readNpmrcValue(content: string, key: string, env: NodeJS.ProcessEnv) {\n let value: string | undefined\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith(';')) continue\n const index = trimmed.indexOf('=')\n if (index === -1 || trimmed.slice(0, index).trim() !== key) continue\n value = trimmed.slice(index + 1).trim().replace(/^(['\"])(.*)\\1$/, '$2')\n .replace(/\\$\\{([^}?]+)\\??\\}/g, (_, name: string) => env[name] ?? '')\n }\n return value\n}\n\n/**\n * Registry of a package, in npm's order: `publishConfig` (scoped, then plain),\n * the `@scope:registry` of `.npmrc` or the environment, `npm_config_registry`,\n * the `registry` of `.npmrc`, then npm. Pass `npmrc` to read `.npmrc` settings.\n */\nexport function getRegistry(manifest: PackageJson, env: NodeJS.ProcessEnv = process.env, npmrc = '') {\n const scope = manifest.name?.startsWith('@') ? manifest.name.split('/')[0] : undefined\n const candidates = [\n scope ? manifest.publishConfig?.[`${scope}:registry`] : undefined,\n manifest.publishConfig?.registry,\n scope ? env[`npm_config_${scope}:registry`] ?? env[`NPM_CONFIG_${scope}:registry`] : undefined,\n scope ? readNpmrcValue(npmrc, `${scope}:registry`, env) : undefined,\n env.NPM_CONFIG_REGISTRY ?? env.npm_config_registry,\n readNpmrcValue(npmrc, 'registry', env)\n ]\n const configured = candidates.find((value) => typeof value === 'string' && value)\n const registry = typeof configured === 'string' ? configured : officialRegistry\n return registry.endsWith('/') ? registry : `${registry}/`\n}\n\nfunction nerfDart(registry: string) {\n const url = new URL(registry)\n return `//${url.host}${url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`}`\n}\n\ninterface PublishedVersion {\n gitHead?: string\n dist?: { attestations?: unknown }\n}\n\ninterface Packument {\n 'dist-tags'?: Record<string, string>\n versions?: Record<string, PublishedVersion>\n}\n\nfunction isTransient(status: number) {\n return status === 408 || status === 429 || status >= 500\n}\n\nasync function readPackument(environment: ReleaseEnvironment, registry: string, name: string): Promise<Packument | undefined> {\n const headers: Record<string, string> = { accept: 'application/json', 'cache-control': 'no-cache' }\n // Private registries need auth to read; the public npm registry does not.\n if (registry !== officialRegistry && environment.env.NPM_TOKEN) headers.authorization = `Bearer ${environment.env.NPM_TOKEN}`\n for (let attempt = 1; ; attempt++) {\n let response: Response\n try {\n response = await environment.fetch(`${registry}${name.replace('/', '%2f')}`, { headers })\n } catch (error) {\n if (attempt >= 4) throw new Error(`Could not read ${name} from ${registry}: ${(error as Error).message}`, { cause: error })\n await environment.wait(2_000 * attempt)\n continue\n }\n if (response.status === 404) return undefined\n if (response.ok) return await response.json() as Packument\n if (!isTransient(response.status) || attempt >= 4) {\n throw new Error(`Could not read ${name} from ${registry}: ${response.status} ${response.statusText}`)\n }\n await environment.wait(2_000 * attempt)\n }\n}\n\nasync function getGitHubIdToken(environment: ReleaseEnvironment, audience: string) {\n const { ACTIONS_ID_TOKEN_REQUEST_URL: url, ACTIONS_ID_TOKEN_REQUEST_TOKEN: token } = environment.env\n if (!url || !token) return undefined\n const response = await environment.fetch(`${url}${url.includes('?') ? '&' : '?'}audience=${encodeURIComponent(audience)}`, {\n headers: { authorization: `Bearer ${token}`, accept: 'application/json' }\n })\n if (!response.ok) {\n environment.log(`! Could not get a GitHub Actions OIDC token: ${response.status} ${response.statusText}`)\n return undefined\n }\n return (await response.json() as { value?: string }).value\n}\n\n/** Exchanges a GitHub Actions OIDC token for a short-lived npm publish token (npm trusted publishing). */\nexport async function exchangeOidcToken(environment: ReleaseEnvironment, name: string, registry: string) {\n if (registry !== officialRegistry) return undefined\n const identity = environment.env.NPM_ID_TOKEN || await getGitHubIdToken(environment, 'npm:registry.npmjs.org')\n if (!identity) return undefined\n // The same escaping as the npm CLI: `@scope%2fname`.\n const response = await environment.fetch(`${officialRegistry}-/npm/v1/oidc/token/exchange/package/${name.replace('/', '%2f')}`, {\n method: 'POST',\n headers: { authorization: `Bearer ${identity}` }\n })\n if (!response.ok) {\n environment.log(`! Could not exchange the OIDC token for ${name}: ${response.status} ${response.statusText}`)\n return undefined\n }\n return (await response.json() as { token?: string }).token\n}\n\nfunction readNpmrc(file: string) {\n return fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : ''\n}\n\n/** actions/setup-node writes `_authToken=${NODE_AUTH_TOKEN}` and sets this placeholder when no token is given. */\nconst placeholderToken = 'XXXXX-XXXXX-XXXXX-XXXXX'\n\n/**\n * Auth for the registry in `.npmrc` content: `valid`, `invalid` (an unset\n * `${VAR}` or the setup-node placeholder), or `undefined` when there is none.\n * npm 9+ rejects auth without a registry prefix, so only `//host/path/:` keys count.\n */\nfunction readRegistryAuth(content: string, registry: string, env: NodeJS.ProcessEnv) {\n const nerfed = nerfDart(registry)\n const usable = (value: string | undefined) => value === undefined ? undefined : Boolean(value) && value !== placeholderToken\n const token = usable(readNpmrcValue(content, `${nerfed}:_authToken`, env))\n const auth = usable(readNpmrcValue(content, `${nerfed}:_auth`, env))\n const username = usable(readNpmrcValue(content, `${nerfed}:username`, env))\n const password = usable(readNpmrcValue(content, `${nerfed}:_password`, env))\n if (token || auth || (username && password)) return 'valid'\n if (token === false || auth === false || username === false || password === false) return 'invalid'\n return undefined\n}\n\n/** Whether `.npmrc` content has usable auth for the registry. */\nexport function hasRegistryAuth(content: string, registry: string, env: NodeJS.ProcessEnv = process.env) {\n return readRegistryAuth(content, registry, env) === 'valid'\n}\n\nlet npmrcCount = 0\n\ninterface NpmAuth {\n env: NodeJS.ProcessEnv\n source: 'npmrc' | 'oidc' | 'token'\n}\n\n/**\n * npm environment for one npm command: existing `.npmrc` auth, then npm trusted\n * publishing through GitHub Actions OIDC, then `NPM_TOKEN`. An OIDC token\n * authorizes one registry route, so every command exchanges its own.\n *\n * npm reads the project `.npmrc` before the user config, so a project\n * `_authToken=${NPM_TOKEN}` would win over a token in the user config. Both\n * files go into one temporary user config instead, the token last, and npm\n * runs outside the repository.\n */\nasync function createNpmEnv(environment: ReleaseEnvironment, name: string, registry: string, directory: string, skipOidc = false): Promise<NpmAuth> {\n const { project, user } = readNpmConfigs(environment.cwd, environment.env)\n const config = [user.trim(), project.trim()].filter(Boolean).join('\\n')\n const write = (content: string) => {\n const file = path.join(directory, `${name.replace(/[@/]/g, '_')}-${++npmrcCount}.npmrc`)\n fs.writeFileSync(file, `${content}\\n`, { mode: 0o600 })\n return { ...environment.env, NPM_CONFIG_USERCONFIG: file }\n }\n const existing = readRegistryAuth(project, registry, environment.env) ?? readRegistryAuth(user, registry, environment.env)\n if (existing === 'valid') return { env: write(config), source: 'npmrc' }\n\n const oidc = skipOidc ? undefined : await exchangeOidcToken(environment, name, registry)\n const token = oidc ?? environment.env.NPM_TOKEN\n if (!token) {\n throw new Error(`No npm auth for ${name}. Configure npm trusted publishing with \\`id-token: write\\`, set NPM_TOKEN, or add auth to .npmrc for ${registry}.`)\n }\n return { env: write(`${config}\\n${nerfDart(registry)}:_authToken=${token}`.trim()), source: oidc ? 'oidc' : 'token' }\n}\n\nfunction detectIndent(content: string) {\n return /^([ \\t]+)\"/m.exec(content)?.[1] ?? ' '\n}\n\nexport interface ReleaseManifestOptions {\n /** Names of the packages released together; their ranges must accept the release version. */\n internal?: string[]\n /** The root `repository`, written into a workspace package that has none, for npm provenance. */\n repository?: unknown\n}\n\n/** A range for `version` in the style of `range`: exact, `~`, or `^`. */\nfunction rangeFor(range: string, version: string) {\n if (semver.valid(range)) return version\n return range.trim().startsWith('~') ? `~${version}` : `^${version}`\n}\n\n/**\n * Writes the release version and git head into a package manifest. Versions are\n * never committed, so ranges on packages of the same release, such as `^0.0.0`,\n * are moved to the release version when they do not accept it.\n */\nexport function writeReleaseManifest(cwd: string, dir: string, version: string, gitHead: string, options: ReleaseManifestOptions = {}) {\n const file = path.join(cwd, dir, 'package.json')\n const content = fs.readFileSync(file, 'utf8').replace(/^\\uFEFF/, '')\n const manifest = JSON.parse(content) as PackageJson\n manifest.version = version\n manifest.gitHead = gitHead\n for (const field of dependencyFields) {\n const dependencies = manifest[field] as Record<string, string> | undefined\n for (const [name, range] of Object.entries(dependencies ?? {})) {\n if (!options.internal?.includes(name) || !semver.validRange(range)) continue\n if (!semver.satisfies(version, range, { includePrerelease: true })) dependencies![name] = rangeFor(range, version)\n }\n }\n if (dir !== '.' && !manifest.repository && options.repository) {\n const root = options.repository\n manifest.repository = typeof root === 'string'\n ? { type: 'git', url: root, directory: dir }\n : { ...root as Record<string, unknown>, directory: dir }\n }\n fs.writeFileSync(file, `${JSON.stringify(manifest, null, detectIndent(content))}\\n`)\n return manifest\n}\n\n/** Yarn 1 names the tarball with `--filename`; Yarn 2+ uses `--out`. */\nasync function isYarnClassic(environment: ReleaseEnvironment, env: NodeJS.ProcessEnv) {\n const declared = /^yarn@(\\d+)/.exec(String(readJson<PackageJson>(path.join(environment.cwd, 'package.json')).packageManager ?? ''))\n if (declared) return declared[1] === '1'\n const { stdout } = await environment.run('yarn', ['--version'], { cwd: environment.cwd, env })\n return stdout.trim().startsWith('1.')\n}\n\nasync function packCommand(environment: ReleaseEnvironment, packageManager: PackageManager, destination: string, env: NodeJS.ProcessEnv): Promise<[string, string[]]> {\n switch (packageManager) {\n case 'bun':\n return ['bun', ['pm', 'pack', '--destination', destination, '--quiet']]\n case 'pnpm':\n return ['pnpm', ['pack', '--pack-destination', destination]]\n case 'yarn':\n return ['yarn', ['pack', await isYarnClassic(environment, env) ? '--filename' : '--out', path.join(destination, 'package.tgz')]]\n default:\n return ['npm', ['pack', '--pack-destination', destination]]\n }\n}\n\n/** Reads `package/package.json` from a packed tarball. */\nexport function readPackedManifest(tarball: string): PackageJson {\n const archive = gunzipSync(fs.readFileSync(tarball))\n let offset = 0\n let longName: string | undefined\n while (offset + 512 <= archive.length) {\n const header = archive.subarray(offset, offset + 512)\n if (header.every((byte) => byte === 0)) break\n const field = (start: number, length: number) => header.subarray(start, start + length).toString('utf8').replace(/\\0.*$/s, '')\n const size = parseInt(field(124, 12).trim() || '0', 8)\n const type = field(156, 1)\n const prefix = field(345, 155)\n const name = longName ?? (prefix ? `${prefix}/${field(0, 100)}` : field(0, 100))\n const body = archive.subarray(offset + 512, offset + 512 + size)\n longName = undefined\n if (type === 'L') {\n longName = body.toString('utf8').replace(/\\0.*$/s, '')\n } else if (type === 'x') {\n const pathRecord = /\\d+ path=([^\\n]+)\\n/.exec(body.toString('utf8'))\n if (pathRecord) longName = pathRecord[1]\n } else if (name.replace(/^\\.\\//, '').split('/').slice(1).join('/') === 'package.json') {\n return JSON.parse(body.toString('utf8').replace(/^\\uFEFF/, '')) as PackageJson\n }\n offset += 512 + Math.ceil(size / 512) * 512\n }\n throw new Error(`${tarball} has no package.json.`)\n}\n\n/** Local protocols that only resolve inside the repository. */\nconst localProtocols = /^(?:workspace|file|link|portal|catalog):/\n\nfunction validatePackedManifest(manifest: PackageJson, pkg: ReleasePackage, version: string, gitHead: string, internal: string[]) {\n if (manifest.name !== pkg.name) throw new Error(`The tarball of ${pkg.dir} is ${manifest.name}, not ${pkg.name}.`)\n if (manifest.version !== version) throw new Error(`The tarball of ${pkg.name} has version ${manifest.version}, not ${version}.`)\n if (manifest.gitHead !== gitHead) throw new Error(`The tarball of ${pkg.name} has gitHead ${String(manifest.gitHead)}, not ${gitHead}.`)\n for (const field of dependencyFields) {\n for (const [name, range] of Object.entries((manifest[field] ?? {}) as Record<string, string>)) {\n if (localProtocols.test(range)) throw new Error(`The tarball of ${pkg.name} keeps \\`${name}: ${range}\\` in ${field}.`)\n if (internal.includes(name) && semver.validRange(range) && !semver.satisfies(version, range, { includePrerelease: true })) {\n throw new Error(`The tarball of ${pkg.name} has \\`${name}: ${range}\\` in ${field}, which does not accept the release version ${version}.`)\n }\n }\n }\n}\n\nasync function waitForVersion(environment: ReleaseEnvironment, registry: string, name: string, version: string) {\n for (let attempt = 1; attempt <= 30; attempt++) {\n const published = (await readPackument(environment, registry, name))?.versions?.[version]\n if (published) return published\n await environment.wait(10_000)\n }\n throw new Error(`${name}@${version} did not appear on ${registry}.`)\n}\n\nexport interface GitHubRelease {\n tag: string\n notes: string\n prerelease: boolean\n /** The commit to tag when the tag does not exist on GitHub yet. */\n target?: string\n /** Whether the release becomes the repository's latest; defaults to every non-prerelease. */\n latest?: boolean\n}\n\n/** Cuts notes at a line to fit a GitHub release body, keeping the full changelog link. */\nexport function truncateNotes(notes: string, limit = releaseBodyLimit) {\n if (notes.length <= limit) return notes\n const footer = /\\n\\n(\\*\\*Full Changelog\\*\\*: \\S+)\\n?$/.exec(notes)?.[1]\n const note = `…the notes are too long for a GitHub release${footer ? '; see the full changelog' : ''}.`\n const tail = `\\n\\n${note}${footer ? `\\n\\n${footer}` : ''}\\n`\n const cut = notes.slice(0, Math.max(0, limit - tail.length))\n const end = cut.lastIndexOf('\\n')\n return `${(end > 0 ? cut.slice(0, end) : cut).trimEnd()}${tail}`\n}\n\n/** Creates the GitHub release of a tag unless it exists. Needs `GITHUB_TOKEN` and the repository. */\nexport async function publishGitHubRelease(environment: ReleaseEnvironment, release: GitHubRelease) {\n const token = environment.env.GITHUB_TOKEN ?? environment.env.GH_TOKEN\n const repositoryUrl = getRepositoryUrl(environment.cwd, environment.env)\n const repository = repositoryUrl?.replace(/^https?:\\/\\/[^/]+\\//, '')\n if (!token || !repository) {\n environment.log('! Skip the GitHub release: set GITHUB_TOKEN and a GitHub repository URL.')\n return undefined\n }\n const api = `${(environment.env.GITHUB_API_URL ?? 'https://api.github.com').replace(/\\/+$/, '')}/repos/${repository}/releases`\n const headers = {\n authorization: `Bearer ${token}`,\n accept: 'application/vnd.github+json',\n 'content-type': 'application/json',\n 'x-github-api-version': '2022-11-28'\n }\n const existing = await environment.fetch(`${api}/tags/${encodeURIComponent(release.tag)}`, { headers })\n if (existing.ok) {\n environment.log(`✓ GitHub release ${release.tag} exists.`)\n return (await existing.json() as { html_url?: string }).html_url\n }\n if (existing.status !== 404) {\n throw new Error(`Could not check the GitHub release ${release.tag}: ${existing.status} ${await existing.text()}`)\n }\n const latest = release.latest ?? !release.prerelease\n const response = await environment.fetch(api, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n tag_name: release.tag,\n ...(release.target ? { target_commitish: release.target } : {}),\n name: release.tag,\n body: truncateNotes(release.notes),\n prerelease: release.prerelease,\n make_latest: latest ? 'true' : 'false'\n })\n })\n if (!response.ok) throw new Error(`Could not create the GitHub release ${release.tag}: ${response.status} ${await response.text()}`)\n const url = (await response.json() as { html_url?: string }).html_url\n environment.log(`✓ Created the GitHub release ${url ?? release.tag}.`)\n return url\n}\n\nexport interface ReleaseOptions extends PlanReleaseOptions {\n /** Plans and prints the release without changing anything. */\n dryRun?: boolean\n}\n\nexport interface ReleaseResult {\n status: 'skipped' | 'none' | 'dry-run' | 'released' | 'resumed'\n plan: ReleasePlan\n}\n\nfunction describePlan(plan: ReleasePlan) {\n const range = plan.from ? `${plan.from}..${plan.head.slice(0, 9)}` : `all commits up to ${plan.head.slice(0, 9)}`\n return [\n `Branch: ${plan.branch}${plan.channel ? ` (npm dist-tag ${plan.channel.distTag})` : ''}`,\n `Mode: ${plan.mode}`,\n `Range: ${range}`,\n ...plan.commits.map((decision) => ` ${(decision.release || 'none').padEnd(5)} ${decision.hash?.slice(0, 9) ?? ''} ${decision.header}`),\n `Release: ${plan.release || 'none'}${plan.version ? ` → ${plan.version}` : ''}`,\n `Packages: ${plan.packages.map(({ name }) => name).join(', ') || 'none'}`\n ].join('\\n')\n}\n\n/** Whether a stable version is the highest stable version tagged in the repository. */\nasync function isLatestStable(environment: ReleaseEnvironment, version: string) {\n const versions = lines(await git(environment, ['tag', '--list', 'v*'])).flatMap((tag) => parseVersionTag(tag) ?? [])\n return !versions.some((other) => !semver.prerelease(other) && semver.gt(other, version))\n}\n\n/** Pushes a version tag without the repository's pre-push hooks, which would run after npm already published. */\nasync function pushTag(environment: ReleaseEnvironment, tag: string) {\n await git(environment, ['push', '--no-verify', 'origin', `refs/tags/${tag}`])\n}\n\n/** Finishes a release whose tag points at HEAD: pushes the tag and creates a missing GitHub release. */\nasync function resumeTaggedRelease(environment: ReleaseEnvironment, options: ReleaseOptions, plan: ReleasePlan) {\n const channel = plan.channel\n if (!channel) return false\n const tags = lines(await git(environment, ['tag', '--list', 'v*', '--points-at', 'HEAD']))\n const tag = tags.find((candidate) => {\n const version = parseVersionTag(candidate)\n if (!version) return false\n const prerelease = semver.prerelease(version)\n return channel.prerelease ? prerelease?.[0] === channel.prerelease : !prerelease\n })\n if (!tag || options.dryRun) return false\n // The tag's own version, so a later prerelease of the same version does not renumber it.\n const previous = await planRelease({ ...options, ignoreTags: [tag], version: parseVersionTag(tag)! }, environment)\n if (!previous.notes) return false\n environment.log(`${tag} points at HEAD; make sure the tag is pushed and its GitHub release exists.`)\n await pushTag(environment, tag)\n await publishGitHubRelease(environment, {\n tag,\n notes: previous.notes,\n prerelease: Boolean(channel.prerelease),\n target: plan.head,\n latest: !channel.prerelease && await isLatestStable(environment, previous.version!)\n })\n return true\n}\n\n/** The next version to try when one is taken: the next patch, or the next prerelease number. */\nfunction nextFreeVersion(version: string) {\n return semver.prerelease(version) ? semver.inc(version, 'prerelease')! : semver.inc(version, 'patch')!\n}\n\n/**\n * Releases the checked-out commit:\n *\n * 1. plan the version from the commits since the channel's last tag;\n * 2. write the version and git head into every published package and pack it;\n * 3. publish each package, in dependency order, on the `aronrepo-staging`\n * dist-tag, skipping versions already published from the same commit;\n * 4. wait until the registry serves every package, then move the channel's\n * dist-tag to the new version;\n * 5. push the version tag and create the GitHub release.\n *\n * Every step checks what an interrupted run already did, so rerunning the job\n * finishes a release instead of skipping or duplicating it.\n */\nexport async function runRelease(options: ReleaseOptions = {}, environmentOptions: Partial<ReleaseEnvironment> = {}): Promise<ReleaseResult> {\n const environment = createEnvironment(environmentOptions)\n const { cwd, log } = environment\n const plan = await planRelease(options, environment)\n log(describePlan(plan))\n\n if (!plan.channel) {\n log(`Branch ${plan.branch} does not release. Release branches: main, alpha, beta, rc, canary.`)\n return { status: 'skipped', plan }\n }\n if (!plan.version || !plan.tag || !plan.notes) {\n if (await resumeTaggedRelease(environment, options, plan)) return { status: 'resumed', plan }\n log('No release.')\n return { status: 'none', plan }\n }\n if (!plan.packages.length) throw new Error('No published package found. Add `\"publishConfig\": { \"access\": \"public\" }` to the packages that ship.')\n for (const pkg of plan.packages) {\n if (pkg.name.startsWith('@') && !pkg.manifest.publishConfig?.access) {\n throw new Error(`${pkg.name} is scoped, and npm publishes scoped packages as restricted by default. Set \\`publishConfig.access\\` in ${pkg.dir}/package.json.`)\n }\n }\n\n const dirty = await git(environment, ['status', '--porcelain'])\n const existingTag = await git(environment, ['tag', '--list', plan.tag])\n if (existingTag && await gitSucceeds(environment, ['merge-base', '--is-ancestor', 'HEAD', plan.tag])) {\n log(`${plan.tag} is on a newer commit of ${plan.branch}; this commit is already released.`)\n return { status: 'none', plan }\n }\n if (options.dryRun) {\n if (dirty) log('! The working tree has changes; a release would stop here.')\n if (existingTag) log(`! ${plan.tag} exists but is not reachable from ${plan.branch}; a release would stop here.`)\n log(`\\nDry run: would publish ${plan.tag} on ${plan.channel.distTag}.\\n\\n${plan.notes}`)\n return { status: 'dry-run', plan }\n }\n if (dirty) throw new Error('The working tree has changes. Release from a clean checkout.')\n if (existingTag) throw new Error(`${plan.tag} exists but is not reachable from ${plan.branch}.`)\n\n const npmrc = (() => {\n const { project, user } = readNpmConfigs(cwd, environment.env)\n return `${user}\\n${project}`\n })()\n const registryOf = (pkg: ReleasePackage) => getRegistry(pkg.manifest, environment.env, npmrc)\n\n // A version published from another commit without its tag comes from an interrupted\n // release; npm never reuses a version, so this release takes the next free one.\n let version = plan.version\n for (let attempt = 0; ; attempt++) {\n const taken: string[] = []\n for (const pkg of plan.packages) {\n const published = (await readPackument(environment, registryOf(pkg), pkg.name))?.versions?.[version]\n if (!published || published.gitHead === plan.head) continue\n if (!published.gitHead) {\n throw new Error(`${pkg.name}@${version} is already published without a gitHead, so aronrepo cannot tell which commit it came from. Tag that commit ${toVersionTag(version)}, or publish a newer version.`)\n }\n taken.push(`${pkg.name}@${version} (${published.gitHead.slice(0, 9)})`)\n }\n if (!taken.length) break\n if (attempt >= 20 || await git(environment, ['tag', '--list', toVersionTag(nextFreeVersion(version))])) {\n throw new Error(`${taken.join(', ')} is already published from another commit, not ${plan.head}.`)\n }\n const next = nextFreeVersion(version)\n log(`! ${taken.join(', ')} is already published from another commit without a ${toVersionTag(version)} tag; releasing ${next} instead.`)\n version = next\n }\n if (version !== plan.version) {\n plan.version = version\n plan.tag = toVersionTag(version)\n plan.notes = renderPlanNotes(environment, plan, version, options.date)\n }\n const { tag, notes, channel } = { tag: plan.tag, notes: plan.notes, channel: plan.channel }\n\n for (const pkg of plan.packages) {\n const packument = await readPackument(environment, registryOf(pkg), pkg.name)\n const current = packument?.['dist-tags']?.[channel.distTag]\n if (current && semver.valid(current) && semver.gt(current, version)) {\n throw new Error(`${pkg.name} has ${current} on ${channel.distTag}, newer than ${version}. Tag the commit of ${current} as ${toVersionTag(current)} so releases continue from it.`)\n }\n if (!packument && channel.prerelease) {\n log(`! ${pkg.name} is new; npm also points \\`latest\\` at its first version, ${version}.`)\n }\n }\n\n const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'aronrepo-release-'))\n const manifests = new Map(plan.packages.map(({ dir }) => {\n const file = path.join(cwd, dir, 'package.json')\n return [file, fs.readFileSync(file, 'utf8')]\n }))\n let restored = false\n const restore = () => {\n if (restored) return\n restored = true\n fs.rmSync(directory, { recursive: true, force: true })\n // Versions live in tags and on the registry, not in the repository.\n for (const [file, content] of manifests) fs.writeFileSync(file, content)\n }\n // A cancelled job still restores the manifests and removes the temporary npm configs with tokens.\n const onSignal = (signal: NodeJS.Signals) => {\n restore()\n process.kill(process.pid, signal)\n }\n process.once('SIGINT', onSignal)\n process.once('SIGTERM', onSignal)\n\n const runNpm = async (pkg: ReleasePackage, args: string[]) => {\n const registry = registryOf(pkg)\n const command = [...args, '--registry', registry]\n const auth = await createNpmEnv(environment, pkg.name, registry, directory)\n try {\n return await environment.run('npm', command, { cwd: directory, env: auth.env })\n } catch (error) {\n // A trusted publisher without dist-tag permission rejects `npm dist-tag`; NPM_TOKEN may still have it.\n if (auth.source !== 'oidc' || !environment.env.NPM_TOKEN) throw error\n log(`! \\`npm ${args[0]}\\` failed with the trusted publishing token; retrying with NPM_TOKEN.`)\n const fallback = await createNpmEnv(environment, pkg.name, registry, directory, true)\n return await environment.run('npm', command, { cwd: directory, env: fallback.env })\n }\n }\n\n try {\n const packageManager = detectPackageManager(cwd)\n const internal = plan.packages.map(({ name }) => name)\n const repository = (() => {\n const root = path.join(cwd, 'package.json')\n return fs.existsSync(root) ? readJson<PackageJson>(root).repository : undefined\n })()\n // Every version must be written before packing, so workspace ranges resolve to it.\n for (const pkg of plan.packages) {\n pkg.manifest = writeReleaseManifest(cwd, pkg.dir, version, plan.head, { internal, repository })\n }\n\n const packEnv = withoutSecrets(environment.env)\n const tarballs = new Map<string, string>()\n for (const [index, pkg] of plan.packages.entries()) {\n const destination = path.join(directory, String(index))\n fs.mkdirSync(destination)\n const [command, args] = await packCommand(environment, packageManager, destination, packEnv)\n await environment.run(command, args, { cwd: path.join(cwd, pkg.dir), env: packEnv })\n const tarball = fs.readdirSync(destination).find((file) => file.endsWith('.tgz'))\n if (!tarball) throw new Error(`Packing ${pkg.name} produced no tarball.`)\n const file = path.join(destination, tarball)\n validatePackedManifest(readPackedManifest(file), pkg, version, plan.head, internal)\n tarballs.set(pkg.name, file)\n log(`✓ Packed ${pkg.name}@${version}`)\n }\n\n for (const pkg of plan.packages) {\n const registry = registryOf(pkg)\n const isPublished = async () => (await readPackument(environment, registry, pkg.name))?.versions?.[version]?.gitHead === plan.head\n if (await isPublished()) {\n log(`✓ ${pkg.name}@${version} is already published from this commit.`)\n continue\n }\n const args = ['publish', tarballs.get(pkg.name)!, '--tag', stagingDistTag]\n if (pkg.manifest.publishConfig?.access) args.push('--access', String(pkg.manifest.publishConfig.access))\n if (pkg.manifest.publishConfig?.provenance) args.push('--provenance')\n try {\n await runNpm(pkg, args)\n } catch (error) {\n // A stale registry cache can hide a version that an earlier run published; npm then refuses to publish over it.\n await environment.wait(5_000)\n if (!await isPublished()) throw error\n log(`✓ ${pkg.name}@${version} was already published from this commit.`)\n continue\n }\n log(`✓ Published ${pkg.name}@${version} on ${stagingDistTag}`)\n }\n\n for (const pkg of plan.packages) {\n const registry = registryOf(pkg)\n const published = await waitForVersion(environment, registry, pkg.name, version)\n if (pkg.manifest.publishConfig?.provenance && !published.dist?.attestations) {\n log(`! ${pkg.name}@${version} has no provenance attestation on ${registry}.`)\n }\n }\n\n for (const pkg of plan.packages) {\n const tags = (await readPackument(environment, registryOf(pkg), pkg.name))?.['dist-tags'] ?? {}\n if (tags[channel.distTag] !== version) {\n await runNpm(pkg, ['dist-tag', 'add', `${pkg.name}@${version}`, channel.distTag])\n }\n if (tags[stagingDistTag]) {\n await runNpm(pkg, ['dist-tag', 'rm', pkg.name, stagingDistTag])\n .catch((error: Error) => log(`! Could not remove the ${stagingDistTag} dist-tag of ${pkg.name}: ${error.message}`))\n }\n log(`✓ ${pkg.name}@${version} is on ${channel.distTag}`)\n }\n } finally {\n process.removeListener('SIGINT', onSignal)\n process.removeListener('SIGTERM', onSignal)\n restore()\n }\n\n // A signing config would open an editor or fail after npm already published.\n await git(environment, ['-c', 'tag.gpgSign=false', 'tag', tag, plan.head])\n await pushTag(environment, tag)\n log(`✓ Pushed ${tag}`)\n\n await publishGitHubRelease(environment, {\n tag,\n notes,\n prerelease: Boolean(channel.prerelease),\n target: plan.head,\n latest: !channel.prerelease && await isLatestStable(environment, version)\n })\n return { status: 'released', plan }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {\n agentsBlockEnd,\n agentsBlockStart,\n commits,\n getBaseTag,\n getNextVersion,\n getReleaseChannel,\n getReleaseType,\n legacyCommits,\n defaultReleasePathExcludes,\n getAgentCommitPolicy,\n getReleaseTable,\n parseCommit,\n renderAgentsBlock,\n resolveCommitRelease,\n resolveRelease,\n toVersionTag,\n type CommitDecision,\n type CommitViolation,\n type ReleaseMode\n} from './index'\nimport {\n detectPackageManager,\n getCliCommand,\n getCommitFiles,\n getCurrentBranch,\n getDiffFiles,\n getGitConfig,\n getRangeCommits,\n getRepositoryRoot,\n getStagedFiles,\n getVersionTags,\n loadProjectPolicy,\n readJsonFile,\n type PackageManager,\n type ProjectPolicy\n} from './project'\nimport { getReleasePackages, planRelease, runRelease, type ReleasePlan } from './release'\n\nexport interface CommandResult {\n code: number\n output: string\n}\n\nexport interface CommonOptions {\n /** Repository root. Defaults to the root of the git repository around the current directory. */\n cwd?: string\n mode?: ReleaseMode\n json?: boolean\n}\n\nfunction resolveCwd(options: CommonOptions) {\n return options.cwd ? path.resolve(options.cwd) : getRepositoryRoot(process.cwd())\n}\n\nfunction usage(message: string): CommandResult {\n return { code: 2, output: message }\n}\n\n// Messages that git, GitHub, GitLab, or Bitbucket write for you, in their exact formats.\nconst ignoredMessagePatterns = [\n /^Merge pull request #\\d+ from \\S+/,\n /^Merge (?:branch|branches|remote-tracking branch|tag|commit) '[^']+'/,\n /^Merge [0-9a-f]{7,40}(?: into \\S+)?$/,\n /^Merged in \\S+ \\(pull request #\\d+\\)/,\n /^Automatic merge from /,\n /^Auto-merged \\S+ into \\S+/,\n /^(?:fixup|squash|amend)! /,\n /^Initial commit$/\n]\n\nexport function isIgnoredMessage(message: string) {\n const header = message.trim().split('\\n')[0] ?? ''\n return ignoredMessagePatterns.some((pattern) => pattern.test(header))\n}\n\nfunction escapeRegExp(text: string) {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * A commit message file without git's comments and, with `git commit -v`,\n * without the diff below the scissors line. `commentChar` is git's\n * `core.commentChar`; `auto` falls back to `#`.\n */\nexport function readEditMessage(file: string, commentChar = '#') {\n const comment = commentChar && commentChar !== 'auto' ? commentChar : '#'\n return fs.readFileSync(file, 'utf8')\n .replace(/^\\uFEFF/, '')\n .replace(/\\r\\n/g, '\\n')\n .split(new RegExp(`^${escapeRegExp(comment)} -+ >8 -+$`, 'm'))[0]\n .split('\\n')\n .filter((line) => !line.startsWith(comment))\n .join('\\n')\n .trim()\n}\n\nasync function project(cwd: string, options: CommonOptions): Promise<ProjectPolicy> {\n return loadProjectPolicy(cwd, options.mode ? { mode: options.mode } : {})\n}\n\nfunction isError(violation: CommitViolation) {\n return (violation.severity ?? 'error') === 'error'\n}\n\nfunction formatViolation(violation: CommitViolation) {\n return ` ${isError(violation) ? '✗' : '!'} ${violation.message}${violation.suggestion ? `\\n Suggested header: ${violation.suggestion}` : ''}`\n}\n\nfunction formatDecision(decision: CommitDecision) {\n const hash = decision.hash ? `${decision.hash.slice(0, 9)} ` : ''\n return `${hash}${(decision.release || 'none').padEnd(5)} ${decision.header}\\n${decision.reasons.map((reason) => ` ${reason}`).join('\\n')}`\n}\n\n/** Repository-relative POSIX paths, as git prints them. */\nfunction normalizeFiles(files: string[], cwd: string) {\n return files.map((file) => {\n const relative = path.isAbsolute(file) ? path.relative(cwd, file) : file\n return relative.replace(/\\\\/g, '/').replace(/^(?:\\.\\/)+/, '')\n })\n}\n\nexport interface CheckOptions extends CommonOptions {\n /** Commit message file, as passed to a commit-msg hook, relative to `cwd`. Uses staged files. */\n edit?: string\n /** Commit message text. Uses staged files unless `files` is set. */\n message?: string\n /** PR title, checked against the `base...head` diff. */\n title?: string\n base?: string\n head?: string\n /** Commit range, checked commit by commit with each commit's own files. */\n from?: string\n to?: string\n files?: string[]\n}\n\nexport async function check(options: CheckOptions): Promise<CommandResult> {\n const modes = [\n options.edit !== undefined && '--edit',\n options.message !== undefined && '--message',\n options.title !== undefined && '--title',\n options.from !== undefined && '--from'\n ].filter(Boolean)\n if (!modes.length) return usage('Pass --edit <file>, --message <text>, --title <text>, or --from <ref>.')\n if (modes.length > 1) return usage(`Pass only one of ${modes.join(', ')}.`)\n if (options.to !== undefined && options.from === undefined) return usage('--to needs --from.')\n if ((options.base !== undefined || options.head !== undefined) && options.title === undefined) return usage('--base and --head only apply to --title.')\n if ((options.base === undefined) !== (options.head === undefined)) return usage('Pass --base and --head together.')\n if (options.files && options.from !== undefined) return usage('--files does not apply to --from; each commit has its own files.')\n\n const cwd = resolveCwd(options)\n const { policy, isReleasePath } = await project(cwd, options)\n const pathOptions = isReleasePath ? { isReleasePath } : {}\n const files = options.files && normalizeFiles(options.files, cwd)\n const notes: string[] = []\n let entries: Array<{ message: string, hash?: string, files?: string[], label: string, ignorable: boolean }>\n\n if (options.title !== undefined) {\n const diff = files ?? (options.base && options.head ? getDiffFiles(cwd, options.base, options.head) : undefined)\n if (!diff && isReleasePath) notes.push('! Release paths are not checked; pass --base and --head, or --files.')\n // A squash merge turns the title into a commit header, so git's own messages are no excuse here.\n entries = [{ message: options.title, ...(diff ? { files: diff } : {}), label: 'PR title', ignorable: false }]\n } else if (options.edit !== undefined || options.message !== undefined) {\n let message = options.message ?? ''\n if (options.edit !== undefined) {\n message = readEditMessage(path.resolve(cwd, options.edit), getGitConfig(cwd, 'core.commentChar'))\n // git aborts a commit with an empty message after the hook; let it.\n if (!message) return { code: 0, output: 'The commit message is empty; git aborts the commit.' }\n }\n let changed = files ?? getStagedFiles(cwd)\n // `git commit --amend` with nothing staged and a reword in `git rebase -i` keep the files of HEAD.\n if (!changed.length && !files && options.edit !== undefined) {\n try {\n changed = getCommitFiles(cwd, 'HEAD')\n } catch {\n changed = []\n }\n }\n entries = [{ message, files: changed, label: 'Commit message', ignorable: true }]\n } else {\n entries = getRangeCommits(cwd, options.from, options.to ?? 'HEAD')\n .map((commit) => ({ ...commit, label: commit.hash.slice(0, 9), ignorable: true }))\n }\n\n const results = entries\n .filter(({ message, ignorable }) => !ignorable || !isIgnoredMessage(message))\n .map((entry) => ({\n entry,\n decision: resolveCommitRelease(parseCommit(entry.message, entry.hash), policy, {\n ...pathOptions,\n ...(entry.files ? { files: entry.files } : {})\n })\n }))\n const failures = results.filter(({ decision }) => decision.violations.some(isError))\n\n if (options.json) {\n return {\n code: failures.length ? 1 : 0,\n output: JSON.stringify({\n mode: policy.mode,\n results: results.map(({ entry, decision }) => ({ label: entry.label, ...decision })),\n ...(notes.length ? { notes } : {})\n }, null, 2)\n }\n }\n if (!failures.length) {\n return {\n code: 0,\n output: [\n ...results.map(({ entry, decision }) => [\n `✓ ${entry.label}: ${decision.release || 'none'} ← ${decision.header}`,\n ...decision.violations.map(formatViolation)\n ].join('\\n')),\n ...notes,\n `${results.length} ${results.length === 1 ? 'header follows' : 'headers follow'} the Aronrepo ${policy.mode} release policy.`\n ].join('\\n')\n }\n }\n return {\n code: 1,\n output: [\n ...failures.map(({ entry, decision }) => `${entry.label}: ${decision.header}\\n${decision.violations.map(formatViolation).join('\\n')}`),\n ...notes,\n '',\n 'Run `aronrepo policy` to see which types release and which paths ship.'\n ].join('\\n')\n }\n}\n\nexport interface ExplainOptions extends CommonOptions {\n from?: string\n to?: string\n}\n\nexport async function explain(options: ExplainOptions): Promise<CommandResult> {\n const cwd = resolveCwd(options)\n const { policy, isReleasePath, releasePaths } = await project(cwd, options)\n let plan: Pick<ReleasePlan, 'release' | 'commits'> & Partial<ReleasePlan>\n let from: string | undefined\n let to = options.to ?? 'HEAD'\n\n if (options.from === undefined && options.to === undefined) {\n // The release range of the branch, or of main when the branch does not release.\n plan = await planRelease({ fallbackToMain: true, ...(options.mode ? { mode: options.mode } : {}) }, { cwd })\n from = plan.from\n to = 'HEAD'\n } else {\n // The channel's base tag before `to`, so a tag on `to` itself is explained instead of skipped.\n const channel = getReleaseChannel(getCurrentBranch(cwd)) ?? getReleaseChannel('main')!\n const reachable = getVersionTags(cwd, `${to}^`)\n from = options.from ?? getBaseTag(channel, reachable)\n const decision = resolveRelease(getRangeCommits(cwd, from, to), policy, isReleasePath ? { isReleasePath } : {})\n const version = decision.release && options.from === undefined\n ? getNextVersion(channel, decision.release, { reachable, all: getVersionTags(cwd) })\n : undefined\n plan = { ...decision, channel, ...(version ? { version, tag: toVersionTag(version) } : {}) }\n }\n\n if (options.json) {\n return {\n code: 0,\n output: JSON.stringify({\n mode: policy.mode,\n ...(plan.branch ? { branch: plan.branch } : {}),\n ...(plan.channel ? { channel: plan.channel } : {}),\n from: from ?? null,\n to,\n releasePaths: releasePaths ?? null,\n release: plan.release,\n version: plan.version ?? null,\n tag: plan.tag ?? null,\n commits: plan.commits\n }, null, 2)\n }\n }\n return {\n code: 0,\n output: [\n `Range: ${from ? `${from}..${to}` : `all commits up to ${to}`}`,\n `Mode: ${policy.mode}`,\n ...(plan.channel ? [`Channel: ${plan.channel.branch} (npm dist-tag ${plan.channel.distTag})`] : []),\n `Release paths: ${releasePaths?.include ? releasePaths.include.join(', ') : 'every path'}`,\n '',\n ...(plan.commits.length ? plan.commits.map(formatDecision) : ['No commits.']),\n '',\n `Next release: ${plan.release || 'none'}${plan.version ? ` (${plan.version})` : ''}`\n ].join('\\n')\n }\n}\n\nexport interface ReleaseCommandOptions extends CommonOptions {\n dryRun?: boolean\n branch?: string\n /** Receives progress lines; defaults to stdout. JSON output stays quiet. */\n log?: (message: string) => void\n}\n\nexport async function release(options: ReleaseCommandOptions): Promise<CommandResult> {\n const cwd = resolveCwd(options)\n const result = await runRelease({\n ...(options.mode ? { mode: options.mode } : {}),\n ...(options.branch ? { branch: options.branch } : {}),\n ...(options.dryRun ? { dryRun: true } : {})\n }, { cwd, log: options.json ? () => {} : options.log ?? ((message) => console.log(message)) })\n if (!options.json) return { code: 0, output: '' }\n const { packages, ...plan } = result.plan\n return {\n code: 0,\n output: JSON.stringify({ status: result.status, ...plan, packages: packages.map(({ dir, name }) => ({ dir, name })) }, null, 2)\n }\n}\n\nexport async function policy(options: CommonOptions & { markdown?: boolean }): Promise<CommandResult> {\n if (options.json && options.markdown) return usage('Pass --json or --markdown, not both.')\n const cwd = resolveCwd(options)\n const resolved = await project(cwd, options)\n if (options.markdown) {\n return { code: 0, output: renderAgentsBlock(resolved.policy, { cli: resolved.cli, ...(resolved.releasePaths ? { releasePaths: resolved.releasePaths } : {}) }) }\n }\n const table = getReleaseTable(resolved.policy)\n const data = {\n mode: resolved.policy.mode,\n configFile: resolved.configFile ? path.relative(resolved.cwd, resolved.configFile) : null,\n releasePaths: resolved.releasePaths ?? null,\n // Plain names for machines; the Markdown backticks are for people.\n releaseTable: Object.fromEntries(Object.entries(table).map(([level, rules]) => [level, rules.map((rule) => rule.replace(/`/g, ''))])),\n types: commits.map(({ type, scope, description, group }) => ({\n type,\n ...(scope ? { scope } : {}),\n release: getReleaseType(type, scope, resolved.policy) ?? false,\n description,\n ...(group ? { group } : {})\n })),\n legacyTypes: legacyCommits,\n agent: getAgentCommitPolicy(resolved.policy, { cli: resolved.cli })\n }\n if (options.json) return { code: 0, output: JSON.stringify(data, null, 2) }\n return {\n code: 0,\n output: [\n `Mode: ${data.mode}${data.configFile ? ` (${data.configFile})` : ' (default; no aronrepo.config.js)'}`,\n `Release paths: ${data.releasePaths?.include ? data.releasePaths.include.join(', ') : 'every path'}`,\n ...(data.releasePaths?.include ? [`Excluded: ${(data.releasePaths.exclude ?? defaultReleasePathExcludes).join(', ')}`] : []),\n '',\n `Major: ${table.major.join(', ') || '-'}`,\n `Minor: ${table.minor.join(', ') || '-'}`,\n `Patch: ${table.patch.join(', ') || '-'}`,\n `None: ${table.none.join(', ') || '-'}`,\n '',\n ...data.agent.ownerDecisions.map((rule) => `- ${rule}`)\n ].join('\\n')\n }\n}\n\n/** Where the generated block is, `undefined` when there is none; throws when its markers are broken. */\nfunction findAgentsBlock(content: string) {\n const start = content.indexOf(agentsBlockStart)\n const firstEnd = content.indexOf(agentsBlockEnd)\n if (start === -1 && firstEnd === -1) return undefined\n const end = start === -1 ? -1 : content.indexOf(agentsBlockEnd, start)\n if (start === -1 || end === -1 || firstEnd < start) {\n throw new Error(`The Aronrepo commit policy markers are out of order. Keep one ${agentsBlockStart} followed by one ${agentsBlockEnd}.`)\n }\n if (content.indexOf(agentsBlockStart, start + 1) !== -1 || content.indexOf(agentsBlockEnd, end + 1) !== -1) {\n throw new Error('The Aronrepo commit policy block appears more than once. Keep one block.')\n }\n return { start, end: end + agentsBlockEnd.length }\n}\n\nexport function replaceAgentsBlock(content: string, block: string) {\n const found = findAgentsBlock(content)\n if (found) return content.slice(0, found.start) + block + content.slice(found.end)\n return `${content.trimEnd()}${content.trim() ? '\\n\\n' : ''}${block}\\n`\n}\n\nexport function readAgentsBlock(content: string) {\n try {\n const found = findAgentsBlock(content)\n return found ? content.slice(found.start, found.end) : undefined\n } catch {\n return undefined\n }\n}\n\nexport async function agents(options: CommonOptions & { file?: string, write?: boolean }): Promise<CommandResult> {\n const cwd = resolveCwd(options)\n const resolved = await project(cwd, options)\n const file = path.resolve(cwd, options.file ?? 'AGENTS.md')\n const relative = path.relative(cwd, file)\n const block = renderAgentsBlock(resolved.policy, { cli: resolved.cli, ...(resolved.releasePaths ? { releasePaths: resolved.releasePaths } : {}) })\n const raw = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : ''\n // A Windows checkout may have CRLF line endings; compare without them and keep them on write.\n const eol = raw.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const content = raw.replace(/\\r\\n/g, '\\n')\n const result = (code: number, status: string, message: string): CommandResult => ({\n code,\n output: options.json ? JSON.stringify({ file: relative, status }, null, 2) : message\n })\n\n if (options.write) {\n const next = replaceAgentsBlock(content || '# Agent Guide\\n', block)\n if (next === content) return result(0, 'current', `✓ ${relative} is up to date.`)\n fs.mkdirSync(path.dirname(file), { recursive: true })\n fs.writeFileSync(file, eol === '\\n' ? next : next.replace(/\\n/g, eol))\n return result(0, 'written', `✓ Wrote the Aronrepo commit policy block to ${relative}.`)\n }\n const current = readAgentsBlock(content)\n if (current === block) return result(0, 'current', `✓ ${relative} has the current Aronrepo commit policy block.`)\n return result(1, current ? 'outdated' : 'missing', `✗ ${relative} ${current ? 'has an outdated' : 'is missing the'} Aronrepo commit policy block. Run \\`${resolved.cli} agents --write\\`.`)\n}\n\ninterface DoctorCheck {\n status: 'pass' | 'warn' | 'fail'\n message: string\n fix?: string\n}\n\nfunction findFile(cwd: string, names: string[]) {\n return names.map((name) => path.join(cwd, name)).find((file) => fs.existsSync(file))\n}\n\nfunction readText(file: string | undefined) {\n return file ? fs.readFileSync(file, 'utf8') : ''\n}\n\nconst legacyDependencies = [\n 'semantic-release',\n '@commitlint/cli',\n '@aronrepo/commitlint-config',\n '@aronrepo/conventional-changelog-config',\n '@aronrepo/semantic-release-config',\n '@aronrepo/semantic-release-pnpm'\n]\n\nconst legacyConfigFiles = [\n 'release.config.js', 'release.config.mjs', 'release.config.cjs', '.releaserc', '.releaserc.js', '.releaserc.mjs', '.releaserc.json',\n 'commitlint.config.js', 'commitlint.config.mjs', 'commitlint.config.ts', '.commitlintrc', '.commitlintrc.js', '.commitlintrc.mjs', '.commitlintrc.json'\n]\n\nfunction installCommand(packageManager: PackageManager) {\n return {\n bun: 'bun add -d aronrepo',\n pnpm: 'pnpm add -D aronrepo',\n yarn: 'yarn add -D aronrepo',\n npm: 'npm install -D aronrepo'\n }[packageManager]\n}\n\nexport async function doctor(options: CommonOptions): Promise<CommandResult> {\n const cwd = resolveCwd(options)\n const checks: DoctorCheck[] = []\n let resolved: ProjectPolicy | undefined\n // An invalid package.json is reported below; fall back to npm for the hints.\n const packageManager = (() => {\n try {\n return detectPackageManager(cwd)\n } catch {\n return 'npm'\n }\n })()\n const cli = getCliCommand(packageManager)\n\n try {\n resolved = await project(cwd, options)\n checks.push(resolved.configFile\n ? { status: 'pass', message: `Release mode ${resolved.policy.mode} from ${path.relative(cwd, resolved.configFile)}.` }\n : {\n status: 'warn',\n message: `No aronrepo.config.js; using the default ${resolved.policy.mode} mode.`,\n fix: 'Ask the repository owner whether releases are explicit (owner-controlled) or auto, then create aronrepo.config.js with `release.mode`.'\n })\n } catch (error) {\n checks.push({ status: 'fail', message: `The Aronrepo config failed to load: ${(error as Error).message}` })\n }\n\n if (resolved) {\n checks.push(resolved.releasePaths?.include\n ? { status: 'pass', message: `Release paths: ${resolved.releasePaths.include.join(', ')}.` }\n : {\n status: 'warn',\n message: 'No published package found; every path can release a version.',\n fix: 'Set `release.paths.include` in aronrepo.config.js, or add `publishConfig.access: \"public\"` to published packages.'\n })\n }\n\n let pkg: Record<string, unknown> = {}\n try {\n const file = findFile(cwd, ['package.json'])\n if (file) pkg = readJsonFile<Record<string, unknown>>(file)\n } catch (error) {\n checks.push({ status: 'fail', message: (error as Error).message })\n }\n const dependencies = { ...pkg.dependencies as Record<string, string>, ...pkg.devDependencies as Record<string, string> }\n checks.push(dependencies.aronrepo\n ? { status: 'pass', message: 'aronrepo is installed.' }\n : { status: 'fail', message: 'aronrepo is not a dependency.', fix: `Install it as a dev dependency: \\`${installCommand(packageManager)}\\`.` })\n\n const leftovers = [\n ...legacyDependencies.filter((name) => dependencies[name]),\n ...legacyConfigFiles.filter((name) => fs.existsSync(path.join(cwd, name)))\n ]\n checks.push(leftovers.length\n ? {\n status: 'warn',\n message: `Leftovers from semantic-release or commitlint: ${leftovers.join(', ')}.`,\n fix: 'Remove them; `aronrepo check` lints commits and `aronrepo release` publishes releases.'\n }\n : { status: 'pass', message: 'No semantic-release or commitlint leftovers.' })\n\n try {\n const releasePackages = getReleasePackages(cwd)\n // `aronrepo release` writes the root repository into workspace packages, so either one is enough.\n const withoutRepository = releasePackages.filter(({ manifest }) => manifest.publishConfig?.provenance && !manifest.repository && !pkg.repository)\n checks.push(!releasePackages.length\n ? { status: 'warn', message: '`aronrepo release` finds no published package.', fix: 'Add `\"publishConfig\": { \"access\": \"public\" }` to each package that ships.' }\n : withoutRepository.length\n ? { status: 'warn', message: `npm provenance needs a \\`repository\\` field: ${withoutRepository.map(({ name }) => name).join(', ')}.`, fix: 'Add `repository` to the root package.json.' }\n : { status: 'pass', message: `\\`aronrepo release\\` publishes ${releasePackages.map(({ name }) => name).join(', ')}.` })\n } catch (error) {\n checks.push({ status: 'fail', message: (error as Error).message })\n }\n\n const hookFile = findFile(cwd, ['.husky/commit-msg'])\n const hook = readText(hookFile).split(/\\r?\\n/).filter((line) => !line.trim().startsWith('#')).join('\\n')\n const hooksPath = getGitConfig(cwd, 'core.hooksPath')\n if (!hook.includes('aronrepo check')) {\n checks.push({ status: 'warn', message: 'No commit-msg hook runs `aronrepo check`.', fix: `Add .husky/commit-msg with \\`${cli} check --edit \"$1\"\\`.` })\n } else if (!hooksPath?.replace(/\\\\/g, '/').startsWith('.husky')) {\n checks.push({ status: 'warn', message: '.husky/commit-msg is not installed; git does not run it.', fix: 'Run `husky` once, for example from the `prepare` script, to set `core.hooksPath`.' })\n } else {\n checks.push({ status: 'pass', message: '.husky/commit-msg runs aronrepo check.' })\n }\n\n // The policy block needs the config; a broken config is already reported above.\n if (resolved) {\n const agentsResult = await agents({ ...options, cwd, json: false })\n checks.push(agentsResult.code === 0\n ? { status: 'pass', message: 'AGENTS.md has the current commit policy block.' }\n : { status: 'fail', message: agentsResult.output.replace(/^✗ /, '').replace(/ Run `.*`\\.$/, ''), fix: `${resolved.cli} agents --write` })\n }\n\n const failed = checks.some(({ status }) => status === 'fail')\n if (options.json) return { code: failed ? 1 : 0, output: JSON.stringify({ ok: !failed, checks }, null, 2) }\n const icon = { pass: '✓', warn: '!', fail: '✗' }\n return {\n code: failed ? 1 : 0,\n output: [\n ...checks.map(({ status, message, fix }) => `${icon[status]} ${message}${fix ? `\\n Fix: ${fix}` : ''}`),\n '',\n failed ? 'Aronrepo setup is incomplete.' : 'Aronrepo setup is complete.'\n ].join('\\n')\n }\n}\n"],"mappings":"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"}
@@ -27,12 +27,12 @@ declare function maxRelease(...releases: Array<ReleaseType | undefined>): Releas
27
27
  *
28
28
  * Release notes list the groups in this order.
29
29
  */
30
- declare const commits: readonly ConventionalCommitType[];
30
+ declare const commits: readonly Readonly<ConventionalCommitType>[];
31
31
  /**
32
32
  * Types from earlier Aronrepo versions. They still resolve in history so old
33
33
  * commits release as before, but `aronrepo check` rejects them in new commits.
34
34
  */
35
- declare const legacyCommits: readonly LegacyCommitType[];
35
+ declare const legacyCommits: readonly Readonly<LegacyCommitType>[];
36
36
  declare const types: string[];
37
37
  declare const legacyTypes: string[];
38
38
  declare const releaseCommits: ConventionalCommitType[];
@@ -47,9 +47,9 @@ declare function normalizeType(type: string | undefined): string | undefined;
47
47
  declare function findCommitRule(type: string | undefined, scope?: string): ConventionalCommitType | undefined;
48
48
  /**
49
49
  * - `explicit`: only `Bump(Major)` and `Bump(Minor)` raise major and minor versions.
50
- * `Feat` and `New` release a patch, and breaking markers never change the level.
51
- * - `auto`: `Feat` and `New` release a minor version and a `BREAKING CHANGE:` footer
52
- * releases a major version, following Conventional Commits.
50
+ * `Add` releases a patch, and breaking markers never change the level.
51
+ * - `auto`: `Add` releases a minor version and a `BREAKING CHANGE:` footer or `!`
52
+ * header releases a major version, following Conventional Commits.
53
53
  */
54
54
  type ReleaseMode = 'explicit' | 'auto';
55
55
  declare const releaseModes: readonly ["explicit", "auto"];
@@ -78,7 +78,11 @@ declare const defaultReleasePathExcludes: string[];
78
78
  declare function defineConfig(config: AronrepoConfig): AronrepoConfig;
79
79
  declare function getReleasePolicy(config?: AronrepoConfig): ReleasePolicy;
80
80
  declare const defaultReleasePolicy: ReleasePolicy;
81
- /** Returns a matcher for release paths, or `undefined` when every path may release. */
81
+ /**
82
+ * Returns a matcher for release paths, or `undefined` when every path may release.
83
+ * `include` defaults to every path; `!glob` entries in `include` exclude, as in
84
+ * `package.json` `files`, instead of matching everything else.
85
+ */
82
86
  declare function createReleasePathMatcher(paths: ReleasePathsConfig | false | undefined): ((file: string) => boolean) | undefined;
83
87
  /**
84
88
  * Release level of a commit type in the given mode, ignoring breaking markers and paths.
@@ -95,17 +99,22 @@ interface ParsedCommit {
95
99
  subject?: string;
96
100
  /** Where a breaking marker was found, if any. */
97
101
  breaking?: 'header' | 'footer';
98
- /** Texts of `BREAKING CHANGE:` footers. */
102
+ /** Texts of `BREAKING CHANGE:` footers; continuation lines keep their line breaks. */
99
103
  breakingNotes?: string[];
100
104
  /** Message layout problems that do not change the release. */
101
105
  layout?: Array<'body-leading-blank' | 'footer-leading-blank'>;
102
106
  revert?: {
103
107
  header?: string;
108
+ /** The first reverted hash, lowercase. */
104
109
  hash?: string;
110
+ /** Every reverted hash, lowercase; a squashed commit can revert several. */
111
+ hashes?: string[];
112
+ /** `Reapply "<header>"`: a revert of the revert of `header`. */
113
+ reapply?: boolean;
105
114
  };
106
115
  }
107
116
  declare function parseCommit(message: string, hash?: string): ParsedCommit;
108
- type CommitViolationRule = 'header-format' | 'subject-full-stop' | 'unknown-type' | 'legacy-type' | 'implicit-breaking' | 'release-paths' | 'body-leading-blank' | 'footer-leading-blank';
117
+ type CommitViolationRule = 'header-format' | 'subject-full-stop' | 'unknown-type' | 'legacy-type' | 'implicit-breaking' | 'release-paths' | 'scope-case' | 'body-leading-blank' | 'footer-leading-blank';
109
118
  interface CommitViolation {
110
119
  rule: CommitViolationRule;
111
120
  /** Errors fail `aronrepo check`; warnings are printed only. Defaults to `error`. */
@@ -122,6 +131,8 @@ interface CommitDecision {
122
131
  subject?: string;
123
132
  /** Texts of `BREAKING CHANGE:` footers, kept for `Bump(Major)` release notes. */
124
133
  breakingNotes?: string[];
134
+ /** Where a breaking marker was found, if any. */
135
+ breaking?: 'header' | 'footer';
125
136
  /** Effective release level after mode, breaking markers, reverts, and paths. */
126
137
  release: ReleaseType;
127
138
  reasons: string[];
@@ -225,16 +236,24 @@ interface ReleaseNotesOptions {
225
236
  version: string;
226
237
  /** Tag of the previous release, for the compare link. */
227
238
  previousTag?: string;
228
- /** Release date as `YYYY-MM-DD`. */
239
+ /** Release date as `YYYY-MM-DD`, shown in the heading. */
229
240
  date?: string;
230
241
  /** Repository URL, such as `https://github.com/owner/repo`, for links. */
231
242
  repositoryUrl?: string;
243
+ /**
244
+ * Starts the notes with a `## <version> (<date>)` heading, for a changelog
245
+ * file. A GitHub release shows its tag and date itself, so its body leaves
246
+ * the heading out and ends with a full changelog link instead.
247
+ */
248
+ heading?: boolean;
232
249
  commits: CommitDecision[];
233
250
  }
251
+ /** The page that lists every change of a release: the compare view, or the commits of a first release. */
252
+ declare function getChangelogUrl(repositoryUrl: string, version: string, previousTag?: string): string;
234
253
  /**
235
254
  * Markdown release notes. Only commits that release appear, grouped by type in
236
255
  * the order of the commit table; `BREAKING CHANGE:` footers of major releases
237
256
  * come first.
238
257
  */
239
258
  declare function renderReleaseNotes(options: ReleaseNotesOptions): string;
240
- export { findCommitRule as $, ReleaseDecision as A, getReleasePolicy as B, renderAgentsBlock as C, CommitViolation as D, CommitInput as E, createReleasePathMatcher as F, releaseModes as G, headerPattern as H, defaultReleaseMode as I, ConventionalCommitType as J, resolveCommitRelease as K, defaultReleasePathExcludes as L, ReleasePathsConfig as M, ReleasePolicy as N, CommitViolationRule as O, ResolveCommitOptions as P, compareRelease as Q, defaultReleasePolicy as R, getReleaseTable as S, CommitDecision as T, nonReleaseAlternatives as U, getReleaseType as V, parseCommit as W, ReleaseType as X, LegacyCommitType as Y, commits as Z, RenderAgentsBlockOptions as _, getBaseTag as a, normalizeType as at, agentsBlockStart as b, getReleaseChannel as c, releaseLevels as ct, prereleaseChannels as d, legacyCommits as et, releaseBranches as f, AgentCommitPolicyOptions as g, AgentCommitPolicyExample as h, VersionTags as i, nonReleaseTypes as it, ReleaseMode as j, ParsedCommit as k, initialVersion as l, releaseTypes as lt, AgentCommitPolicy as m, renderReleaseNotes as n, maxRelease as nt, getLatestStableVersion as o, releaseCommits as ot, toVersionTag as p, resolveRelease as q, ReleaseChannel as r, nonReleaseCommits as rt, getNextVersion as s, releaseGroups as st, ReleaseNotesOptions as t, legacyTypes as tt, parseVersionTag as u, types as ut, agentCommitPolicy as v, AronrepoConfig as w, getAgentCommitPolicy as x, agentsBlockEnd as y, defineConfig as z };
259
+ export { compareRelease as $, ParsedCommit as A, defineConfig as B, getReleaseTable as C, CommitInput as D, CommitDecision as E, ResolveCommitOptions as F, parseCommit as G, getReleaseType as H, createReleasePathMatcher as I, resolveRelease as J, releaseModes as K, defaultReleaseMode as L, ReleaseMode as M, ReleasePathsConfig as N, CommitViolation as O, ReleasePolicy as P, commits as Q, defaultReleasePathExcludes as R, getAgentCommitPolicy as S, AronrepoConfig as T, headerPattern as U, getReleasePolicy as V, nonReleaseAlternatives as W, LegacyCommitType as X, ConventionalCommitType as Y, ReleaseType as Z, AgentCommitPolicyOptions as _, VersionTags as a, nonReleaseTypes as at, agentsBlockEnd as b, getNextVersion as c, releaseGroups as ct, parseVersionTag as d, types as dt, findCommitRule as et, prereleaseChannels as f, AgentCommitPolicyExample as g, AgentCommitPolicy as h, ReleaseChannel as i, nonReleaseCommits as it, ReleaseDecision as j, CommitViolationRule as k, getReleaseChannel as l, releaseLevels as lt, toVersionTag as m, getChangelogUrl as n, legacyTypes as nt, getBaseTag as o, normalizeType as ot, releaseBranches as p, resolveCommitRelease as q, renderReleaseNotes as r, maxRelease as rt, getLatestStableVersion as s, releaseCommits as st, ReleaseNotesOptions as t, legacyCommits as tt, initialVersion as u, releaseTypes as ut, RenderAgentsBlockOptions as v, renderAgentsBlock as w, agentsBlockStart as x, agentCommitPolicy as y, defaultReleasePolicy as z };
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as findCommitRule, A as ReleaseDecision, B as getReleasePolicy, C as renderAgentsBlock, D as CommitViolation, E as CommitInput, F as createReleasePathMatcher, G as releaseModes, H as headerPattern, I as defaultReleaseMode, J as ConventionalCommitType, K as resolveCommitRelease, L as defaultReleasePathExcludes, M as ReleasePathsConfig, N as ReleasePolicy, O as CommitViolationRule, P as ResolveCommitOptions, Q as compareRelease, R as defaultReleasePolicy, S as getReleaseTable, T as CommitDecision, U as nonReleaseAlternatives, V as getReleaseType, W as parseCommit, X as ReleaseType, Y as LegacyCommitType, Z as commits, _ as RenderAgentsBlockOptions, a as getBaseTag, at as normalizeType, b as agentsBlockStart, c as getReleaseChannel, ct as releaseLevels, d as prereleaseChannels, et as legacyCommits, f as releaseBranches, g as AgentCommitPolicyOptions, h as AgentCommitPolicyExample, i as VersionTags, it as nonReleaseTypes, j as ReleaseMode, k as ParsedCommit, l as initialVersion, lt as releaseTypes, m as AgentCommitPolicy, n as renderReleaseNotes, nt as maxRelease, o as getLatestStableVersion, ot as releaseCommits, p as toVersionTag, q as resolveRelease, r as ReleaseChannel, rt as nonReleaseCommits, s as getNextVersion, st as releaseGroups, t as ReleaseNotesOptions, tt as legacyTypes, u as parseVersionTag, ut as types, v as agentCommitPolicy, w as AronrepoConfig, x as getAgentCommitPolicy, y as agentsBlockEnd, z as defineConfig } from "./index-Co5yiJXA.js";
2
- export { AgentCommitPolicy, AgentCommitPolicyExample, AgentCommitPolicyOptions, AronrepoConfig, CommitDecision, CommitInput, CommitViolation, CommitViolationRule, ConventionalCommitType, LegacyCommitType, ParsedCommit, ReleaseChannel, ReleaseDecision, ReleaseMode, ReleaseNotesOptions, ReleasePathsConfig, ReleasePolicy, ReleaseType, RenderAgentsBlockOptions, ResolveCommitOptions, VersionTags, agentCommitPolicy, agentsBlockEnd, agentsBlockStart, commits, compareRelease, createReleasePathMatcher, defaultReleaseMode, defaultReleasePathExcludes, defaultReleasePolicy, defineConfig, findCommitRule, getAgentCommitPolicy, getBaseTag, getLatestStableVersion, getNextVersion, getReleaseChannel, getReleasePolicy, getReleaseTable, getReleaseType, headerPattern, initialVersion, legacyCommits, legacyTypes, maxRelease, nonReleaseAlternatives, nonReleaseCommits, nonReleaseTypes, normalizeType, parseCommit, parseVersionTag, prereleaseChannels, releaseBranches, releaseCommits, releaseGroups, releaseLevels, releaseModes, releaseTypes, renderAgentsBlock, renderReleaseNotes, resolveCommitRelease, resolveRelease, toVersionTag, types };
1
+ import { $ as compareRelease, A as ParsedCommit, B as defineConfig, C as getReleaseTable, D as CommitInput, E as CommitDecision, F as ResolveCommitOptions, G as parseCommit, H as getReleaseType, I as createReleasePathMatcher, J as resolveRelease, K as releaseModes, L as defaultReleaseMode, M as ReleaseMode, N as ReleasePathsConfig, O as CommitViolation, P as ReleasePolicy, Q as commits, R as defaultReleasePathExcludes, S as getAgentCommitPolicy, T as AronrepoConfig, U as headerPattern, V as getReleasePolicy, W as nonReleaseAlternatives, X as LegacyCommitType, Y as ConventionalCommitType, Z as ReleaseType, _ as AgentCommitPolicyOptions, a as VersionTags, at as nonReleaseTypes, b as agentsBlockEnd, c as getNextVersion, ct as releaseGroups, d as parseVersionTag, dt as types, et as findCommitRule, f as prereleaseChannels, g as AgentCommitPolicyExample, h as AgentCommitPolicy, i as ReleaseChannel, it as nonReleaseCommits, j as ReleaseDecision, k as CommitViolationRule, l as getReleaseChannel, lt as releaseLevels, m as toVersionTag, n as getChangelogUrl, nt as legacyTypes, o as getBaseTag, ot as normalizeType, p as releaseBranches, q as resolveCommitRelease, r as renderReleaseNotes, rt as maxRelease, s as getLatestStableVersion, st as releaseCommits, t as ReleaseNotesOptions, tt as legacyCommits, u as initialVersion, ut as releaseTypes, v as RenderAgentsBlockOptions, w as renderAgentsBlock, x as agentsBlockStart, y as agentCommitPolicy, z as defaultReleasePolicy } from "./index-DLkjddC1.js";
2
+ export { AgentCommitPolicy, AgentCommitPolicyExample, AgentCommitPolicyOptions, AronrepoConfig, CommitDecision, CommitInput, CommitViolation, CommitViolationRule, ConventionalCommitType, LegacyCommitType, ParsedCommit, ReleaseChannel, ReleaseDecision, ReleaseMode, ReleaseNotesOptions, ReleasePathsConfig, ReleasePolicy, ReleaseType, RenderAgentsBlockOptions, ResolveCommitOptions, VersionTags, agentCommitPolicy, agentsBlockEnd, agentsBlockStart, commits, compareRelease, createReleasePathMatcher, defaultReleaseMode, defaultReleasePathExcludes, defaultReleasePolicy, defineConfig, findCommitRule, getAgentCommitPolicy, getBaseTag, getChangelogUrl, getLatestStableVersion, getNextVersion, getReleaseChannel, getReleasePolicy, getReleaseTable, getReleaseType, headerPattern, initialVersion, legacyCommits, legacyTypes, maxRelease, nonReleaseAlternatives, nonReleaseCommits, nonReleaseTypes, normalizeType, parseCommit, parseVersionTag, prereleaseChannels, releaseBranches, releaseCommits, releaseGroups, releaseLevels, releaseModes, releaseTypes, renderAgentsBlock, renderReleaseNotes, resolveCommitRelease, resolveRelease, toVersionTag, types };