aronrepo 3.0.2 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/{commands-ClWK0lQ9.js → commands-D2xBkCvw.js} +63 -6
- package/dist/commands-D2xBkCvw.js.map +1 -0
- package/dist/{index-DLkjddC1.d.ts → index-CmnjSEga.d.ts} +13 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +6 -1
- package/dist/node.js +1 -1
- package/package.json +2 -2
- package/dist/commands-ClWK0lQ9.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/commits.ts","../src/policy.ts","../src/agent.ts","../src/version.ts","../src/notes.ts"],"sourcesContent":["export type ReleaseType = 'major' | 'minor' | 'patch' | false\n\nexport interface ConventionalCommitType {\n type: string\n scope?: string\n /**\n * Release level in `auto` mode. The `explicit` mode caps every type except\n * `Bump` at `patch`; see `getReleaseType()` and `resolveCommitRelease()`.\n */\n release: ReleaseType\n /** When to use the type, written for people and coding agents. */\n description: string\n /** Release notes section. Types without a group never appear in release notes. */\n group?: string\n}\n\nexport interface LegacyCommitType {\n type: string\n /** The type that replaces it. Legacy commits release and group like their replacement. */\n replacement: string\n}\n\n/** Release levels in descending order. */\nexport const releaseLevels = ['major', 'minor', 'patch'] as const\n\nexport function compareRelease(a: ReleaseType | undefined, b: ReleaseType | undefined) {\n const rank = (release: ReleaseType | undefined) => release ? 3 - releaseLevels.indexOf(release) : 0\n return rank(a) - rank(b)\n}\n\nexport function maxRelease(...releases: Array<ReleaseType | undefined>): ReleaseType {\n return releases.reduce<ReleaseType>((highest, release) =>\n compareRelease(release, highest) > 0 ? release as ReleaseType : highest, false)\n}\n\n/**\n * The Aronrepo commit types. The table is fixed: repositories choose a release\n * mode and release paths, not their own types.\n *\n * Release notes list the groups in this order.\n */\nexport const commits: readonly Readonly<ConventionalCommitType>[] = Object.freeze(([\n { type: 'Bump', scope: 'Major', release: 'major', description: 'Release a major version. Only the repository owner decides it.' },\n { type: 'Bump', scope: 'Minor', release: 'minor', description: 'Release a minor version. Only the repository owner decides it.' },\n { type: 'Bump', scope: 'Patch', release: 'patch', description: 'Release a patch version without another release commit.' },\n { type: 'Add', release: 'minor', group: 'Additions', description: 'A new capability: a new API, export, option, command, or package.' },\n { type: 'Improve', release: 'patch', group: 'Improvements', description: 'A better existing capability without new API: behavior, output, messages, or defaults.' },\n { type: 'Perf', release: 'patch', group: 'Performance', description: 'Faster or lighter published code with the same behavior.' },\n { type: 'Fix', release: 'patch', group: 'Bug Fixes', description: 'A bug fix in published behavior.' },\n { type: 'Deprecate', release: 'patch', group: 'Deprecations', description: 'Mark a published capability as deprecated while it keeps working.' },\n { type: 'Drop', release: 'patch', group: 'Removals', description: 'Remove a published capability.' },\n { type: 'Upgrade', release: 'patch', group: 'Dependencies', description: 'Change a runtime dependency of a published package.' },\n { type: 'Revert', release: 'patch', group: 'Reverts', description: 'Revert a commit. It releases what the reverted commit released.' },\n { type: 'Docs', scope: 'README', release: 'patch', group: 'Documentation', description: 'Change a published package README.' },\n { type: 'Docs', release: false, description: 'Documentation that is not a published package README.' },\n { type: 'Test', release: false, description: 'Tests that cover existing behavior.' },\n { type: 'Benchmark', release: false, description: 'Benchmark harnesses, fixtures, and reports.' },\n { type: 'Example', release: false, description: 'Examples that do not ship in a package.' },\n { type: 'Build', release: false, description: 'Build tooling and development configuration.' },\n { type: 'CI', release: false, description: 'CI workflows and automation.' },\n { type: 'Style', release: false, description: 'Formatting and lint-only changes.' },\n { type: 'Refactor', release: false, description: 'Code changes that keep published behavior.' },\n { type: 'Chore', release: false, description: 'Maintenance: development dependencies, lockfiles, metadata, agent guidance, and unpublished workspaces.' }\n] satisfies ConventionalCommitType[]).map((commit) => Object.freeze(commit)))\n\n/**\n * Types from earlier Aronrepo versions. They still resolve in history so old\n * commits release as before, but `aronrepo check` rejects them in new commits.\n */\nexport const legacyCommits: readonly Readonly<LegacyCommitType>[] = Object.freeze(([\n { type: 'Feat', replacement: 'Add' },\n { type: 'New', replacement: 'Add' },\n { type: 'Update', replacement: 'Improve' },\n { type: 'Misc', replacement: 'Chore' }\n] satisfies LegacyCommitType[]).map((commit) => Object.freeze(commit)))\n\nexport const types: string[] = [...new Set(commits.map(({ type }) => type))]\n\nexport const legacyTypes: string[] = legacyCommits.map(({ type }) => type)\n\nexport const releaseCommits: ConventionalCommitType[] = commits.filter(({ release }) => release !== false)\n\nexport const nonReleaseCommits: ConventionalCommitType[] = commits.filter(({ release }) => release === false)\n\nexport const releaseTypes: string[] = [...new Set(releaseCommits.map(({ type }) => type))]\n\nexport const nonReleaseTypes: string[] = [...new Set(nonReleaseCommits.map(({ type }) => type))]\n\n/** Release notes groups in display order. */\nexport const releaseGroups: string[] = [...new Set(commits.flatMap(({ group }) => group ? [group] : []))]\n\n/** The current type for a legacy type, or the type itself. */\nexport function normalizeType(type: string): string\nexport function normalizeType(type: string | undefined): string | undefined\nexport function normalizeType(type: string | undefined) {\n return legacyCommits.find((legacy) => legacy.type === type)?.replacement ?? type\n}\n\nexport function findCommitRule(type: string | undefined, scope?: string): ConventionalCommitType | undefined {\n const current = normalizeType(type)\n if (!current) return undefined\n\n return commits.find((commit) => commit.type === current && commit.scope === scope)\n ?? commits.find((commit) => commit.type === current && commit.scope === undefined)\n}\n","import picomatch from 'picomatch'\nimport { commits, findCommitRule, legacyTypes, maxRelease, normalizeType, types, type ReleaseType } from './commits'\n\n/**\n * - `explicit`: only `Bump(Major)` and `Bump(Minor)` raise major and minor versions.\n * `Add` releases a patch, and breaking markers never change the level.\n * - `auto`: `Add` releases a minor version and a `BREAKING CHANGE:` footer or `!`\n * header releases a major version, following Conventional Commits.\n */\nexport type ReleaseMode = 'explicit' | 'auto'\n\nexport const releaseModes = ['explicit', 'auto'] as const satisfies readonly ReleaseMode[]\n\nexport const defaultReleaseMode: ReleaseMode = 'explicit'\n\nexport interface ReleasePathsConfig {\n /** Globs, relative to the repository root, of files that ship in published packages. */\n include?: string[]\n /** Globs removed from `include`. Defaults to `defaultReleasePathExcludes`. */\n exclude?: string[]\n}\n\nexport interface AronrepoConfig {\n release?: {\n mode?: ReleaseMode\n /**\n * Files whose changes can release a version. Omit it to derive the paths from\n * public workspace packages, or set `false` to turn the path check off.\n */\n paths?: ReleasePathsConfig | false\n }\n}\n\nexport interface ReleasePolicy {\n mode: ReleaseMode\n paths?: ReleasePathsConfig | false\n}\n\nexport const defaultReleasePathExcludes = [\n '**/tests/**',\n '**/test/**',\n '**/__tests__/**',\n '**/*.{test,spec}.*',\n '**/*.test-d.*',\n '**/__snapshots__/**',\n '**/__fixtures__/**',\n '**/__mocks__/**',\n '**/fixtures/**',\n '**/benchmarks/**',\n '**/examples/**',\n '**/CHANGELOG.md',\n '.github/**',\n '.husky/**'\n]\n\nexport function defineConfig(config: AronrepoConfig) {\n return config\n}\n\nexport function getReleasePolicy(config: AronrepoConfig = {}): ReleasePolicy {\n const mode = config.release?.mode ?? defaultReleaseMode\n if (!releaseModes.includes(mode)) {\n throw new Error(`Unknown Aronrepo release mode \"${String(mode)}\". Use one of: ${releaseModes.join(', ')}.`)\n }\n const paths = config.release?.paths\n if (paths !== undefined && paths !== false) validateReleasePaths(paths)\n return {\n mode,\n ...(paths !== undefined ? { paths } : {})\n }\n}\n\nfunction validateReleasePaths(paths: unknown): asserts paths is ReleasePathsConfig {\n const isGlobs = (value: unknown) => value === undefined || (Array.isArray(value) && value.every((glob) => typeof glob === 'string'))\n if (typeof paths !== 'object' || paths === null || Array.isArray(paths)) {\n throw new Error('`release.paths` must be `false` or an object with `include` and `exclude` glob arrays.')\n }\n const { include, exclude } = paths as Record<string, unknown>\n if (!isGlobs(include)) throw new Error('`release.paths.include` must be an array of globs.')\n if (!isGlobs(exclude)) throw new Error('`release.paths.exclude` must be an array of globs.')\n}\n\nexport const defaultReleasePolicy: ReleasePolicy = { mode: defaultReleaseMode }\n\n/**\n * Returns a matcher for release paths, or `undefined` when every path may release.\n * `include` defaults to every path; `!glob` entries in `include` exclude, as in\n * `package.json` `files`, instead of matching everything else.\n */\nexport function createReleasePathMatcher(paths: ReleasePathsConfig | false | undefined) {\n if (!paths) return undefined\n const globs = paths.include ?? ['**']\n const positive = globs.filter((glob) => !glob.startsWith('!'))\n const negated = globs.filter((glob) => glob.startsWith('!')).map((glob) => glob.slice(1))\n if (!positive.length) return () => false\n const include = picomatch(positive, { dot: true })\n const exclude = picomatch([...paths.exclude ?? defaultReleasePathExcludes, ...negated], { dot: true })\n return (file: string) => include(file) && !exclude(file)\n}\n\n/**\n * Release level of a commit type in the given mode, ignoring breaking markers and paths.\n * Use `resolveCommitRelease()` for the full decision.\n */\nexport function getReleaseType(type: string | undefined, scope?: string, policy: ReleasePolicy = defaultReleasePolicy): ReleaseType | undefined {\n const release = findCommitRule(type, scope)?.release\n if (release === undefined) return undefined\n return capRelease(release, type, policy)\n}\n\nfunction capRelease(release: ReleaseType, type: string | undefined, policy: ReleasePolicy): ReleaseType {\n if (policy.mode === 'explicit' && type !== 'Bump' && (release === 'major' || release === 'minor')) return 'patch'\n return release\n}\n\n/**\n * The first character of a scope or summary: an uppercase letter, a letter\n * without case (such as CJK), a digit, or a code, issue, or emphasis marker.\n */\nconst startCharacter = String.raw`[\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\x60_#~]`\nconst startPattern = new RegExp(`^${startCharacter}`, 'u')\n\n// The scope stops at the first `)`, so a summary such as `Handle Foo(Bar): Baz` stays whole.\nexport const headerPattern = new RegExp(String.raw`^([A-Z]\\w*)(?:\\((${startCharacter}[^)]*)\\))?: (${startCharacter}.*)$`, 'u')\nconst breakingHeaderPattern = new RegExp(String.raw`^([A-Z]\\w*)(?:\\((${startCharacter}[^)]*)\\))?!: (${startCharacter}.*)$`, 'u')\nconst footerStartPattern = /^BREAKING[ -]CHANGE:[ \\t]*(.*)$/\n// GitHub's revert button writes `Revert \"<header>\"`, a squash merge appends ` (#123)`,\n// and git 2.43+ writes `Reapply \"<header>\"` when a revert is reverted.\nconst githubRevertPattern = /^(Revert|Reapply) \"([\\s\\S]+)\"(?: \\(#\\d+\\))?$/\nconst revertHashPattern = /This reverts commit ([0-9a-f]{7,40})/gi\nconst fencePattern = /^\\s*(```|~~~)/\n\nexport interface ParsedCommit {\n hash?: string\n header: string\n body: string\n type?: string\n scope?: string\n subject?: string\n /** Where a breaking marker was found, if any. */\n breaking?: 'header' | 'footer'\n /** Texts of `BREAKING CHANGE:` footers; continuation lines keep their line breaks. */\n breakingNotes?: string[]\n /** Message layout problems that do not change the release. */\n layout?: Array<'body-leading-blank' | 'footer-leading-blank'>\n revert?: {\n header?: string\n /** The first reverted hash, lowercase. */\n hash?: string\n /** Every reverted hash, lowercase; a squashed commit can revert several. */\n hashes?: string[]\n /** `Reapply \"<header>\"`: a revert of the revert of `header`. */\n reapply?: boolean\n }\n}\n\nconst trailerPattern = /^[\\w-]+: /\n\n/**\n * `BREAKING CHANGE:` footers outside code fences. Each runs, line breaks kept,\n * until another footer or a git trailer, as Conventional Commits footers do.\n */\nfunction readBreakingFooters(lines: string[]) {\n const notes: string[] = []\n const starts: number[] = []\n let current: string[] | undefined\n let fenced = false\n const finish = () => {\n if (current) notes.push(current.join('\\n').trim())\n current = undefined\n }\n lines.forEach((line, index) => {\n if (fencePattern.test(line)) fenced = !fenced\n const start = fenced ? null : footerStartPattern.exec(line)\n if (start) {\n finish()\n starts.push(index)\n current = [start[1]]\n } else if (current && !fenced && trailerPattern.test(line)) {\n finish()\n } else if (current) {\n current.push(line.trimEnd())\n }\n })\n finish()\n return { starts, notes: notes.filter(Boolean) }\n}\n\nfunction parseHeader(header: string) {\n const regular = headerPattern.exec(header)\n const match = regular ?? breakingHeaderPattern.exec(header)\n return match ? { type: match[1], scope: match[2], subject: match[3], breaking: !regular } : undefined\n}\n\nexport function parseCommit(message: string, hash?: string): ParsedCommit {\n const normalized = message.replace(/\\r\\n?/g, '\\n').trim()\n const [rawHeader = '', ...rest] = normalized.split('\\n')\n const header = rawHeader.trimEnd()\n const body = rest.join('\\n').trim()\n const parsed: ParsedCommit = { header, body, ...(hash ? { hash } : {}) }\n\n const footers = readBreakingFooters(rest)\n const layout: NonNullable<ParsedCommit['layout']> = []\n if (rest.length && rest[0].trim()) layout.push('body-leading-blank')\n if (footers.starts.some((index) => index > 0 && rest[index - 1].trim())) layout.push('footer-leading-blank')\n if (layout.length) parsed.layout = layout\n if (footers.notes.length) parsed.breakingNotes = footers.notes\n\n const match = parseHeader(header)\n if (match) {\n parsed.type = match.type\n if (match.scope) parsed.scope = match.scope\n parsed.subject = match.subject\n if (match.breaking) parsed.breaking = 'header'\n }\n if (!parsed.breaking && footers.starts.length) parsed.breaking = 'footer'\n\n const githubRevert = githubRevertPattern.exec(header)\n if (githubRevert || parsed.type === 'Revert') {\n const revertedHeader = githubRevert?.[2] ?? (parsed.subject && parseHeader(parsed.subject) ? parsed.subject : undefined)\n const hashes = [...new Set([...body.matchAll(revertHashPattern)].map((found) => found[1].toLowerCase()))]\n parsed.revert = {\n ...(revertedHeader ? { header: revertedHeader } : {}),\n ...(hashes.length ? { hash: hashes[0], hashes } : {}),\n ...(githubRevert?.[1] === 'Reapply' ? { reapply: true } : {})\n }\n }\n return parsed\n}\n\nexport type CommitViolationRule =\n | 'header-format'\n | 'subject-full-stop'\n | 'unknown-type'\n | 'legacy-type'\n | 'implicit-breaking'\n | 'release-paths'\n | 'scope-case'\n | 'body-leading-blank'\n | 'footer-leading-blank'\n\nexport interface CommitViolation {\n rule: CommitViolationRule\n /** Errors fail `aronrepo check`; warnings are printed only. Defaults to `error`. */\n severity?: 'error' | 'warning'\n message: string\n /** A header that satisfies the policy, when one can be derived. */\n suggestion?: string\n}\n\nexport interface CommitDecision {\n hash?: string\n header: string\n type?: string\n scope?: string\n subject?: string\n /** Texts of `BREAKING CHANGE:` footers, kept for `Bump(Major)` release notes. */\n breakingNotes?: string[]\n /** Where a breaking marker was found, if any. */\n breaking?: 'header' | 'footer'\n /** Effective release level after mode, breaking markers, reverts, and paths. */\n release: ReleaseType\n reasons: string[]\n violations: CommitViolation[]\n}\n\nexport interface ResolveCommitOptions {\n /** Files the commit changes. Omit it to skip the release path check. */\n files?: string[]\n /** Decides whether a changed file ships in a published package. */\n isReleasePath?: (file: string) => boolean\n}\n\nexport const nonReleaseAlternatives = ['Chore', 'Refactor', 'Style', 'Test', 'Docs', 'Build', 'CI', 'Benchmark', 'Example']\n\nfunction suggestNonReleaseHeader(commit: ParsedCommit) {\n // A GitHub revert has no subject; its whole header becomes the summary.\n const subject = (commit.subject ?? commit.header).replace(/\\.+$/, '')\n const scope = commit.scope ? `(${commit.scope})` : ''\n switch (commit.type) {\n case 'Docs':\n return `Docs: ${subject}`\n case 'Upgrade':\n return `Chore(Deps): ${subject}`\n default:\n return `Chore${scope}: ${subject}`\n }\n}\n\nconst looseHeaderPattern = /^(\\w+)(?:\\(([^)]*)\\))?(!)?:(\\s*)(.*)$/\n\nfunction diagnoseHeader(header: string, mode: ReleaseMode) {\n const format = 'Use `Type(Scope): Summary` or `Type: Summary` with an Aronrepo commit type.'\n const match = looseHeaderPattern.exec(header)\n if (!match) return format\n const [, type, scope, bang, space, subject] = match\n if (!/^[A-Z]/.test(type)) {\n return `The type \\`${type}\\` must be PascalCase, such as \\`${normalizeType(`${type[0].toUpperCase()}${type.slice(1)}`)}\\`. ${format}`\n }\n if (bang && mode === 'explicit') return `Aronrepo headers do not use \\`!\\` in explicit mode. ${format}`\n if (scope !== undefined && !startPattern.test(scope)) return `The scope \\`${scope}\\` must start with an uppercase letter or digit. ${format}`\n if (space !== ' ') return `Put exactly one space after the colon. ${format}`\n if (!subject) return `The summary is empty. ${format}`\n if (!startPattern.test(subject)) return `The summary must start with an uppercase letter, a digit, or a letter without case such as CJK. ${format}`\n return format\n}\n\nfunction formatRelease(release: ReleaseType | undefined) {\n return release ? release : 'none'\n}\n\nexport function resolveCommitRelease(\n input: string | ParsedCommit,\n policy: ReleasePolicy = defaultReleasePolicy,\n options: ResolveCommitOptions = {}\n): CommitDecision {\n const commit = typeof input === 'string' ? parseCommit(input) : input\n const decision: CommitDecision = {\n ...(commit.hash ? { hash: commit.hash } : {}),\n header: commit.header,\n ...(commit.type ? { type: commit.type } : {}),\n ...(commit.scope ? { scope: commit.scope } : {}),\n ...(commit.subject ? { subject: commit.subject } : {}),\n ...(commit.breakingNotes ? { breakingNotes: commit.breakingNotes } : {}),\n ...(commit.breaking ? { breaking: commit.breaking } : {}),\n release: false,\n reasons: [],\n violations: []\n }\n\n if (commit.revert?.header && !commit.type) {\n // GitHub's default `Revert \"Type(Scope): Summary\"` header.\n decision.type = 'Revert'\n } else if (!commit.type) {\n decision.reasons.push('Header does not follow `Type(Scope): Summary`; no release.')\n decision.violations.push({\n rule: 'header-format',\n message: diagnoseHeader(commit.header, policy.mode)\n })\n return decision\n } else if (!types.includes(commit.type) && !legacyTypes.includes(commit.type)) {\n decision.reasons.push(`Unknown type \\`${commit.type}\\`; no release.`)\n decision.violations.push({\n rule: 'unknown-type',\n message: `\\`${commit.type}\\` is not an Aronrepo commit type. Use one of: ${types.join(', ')}.`\n })\n return decision\n } else if (!findCommitRule(commit.type, commit.scope)) {\n const scoped = commits.filter(({ type }) => type === commit.type).map(({ type, scope }) => `\\`${type}(${scope})\\``).join(', ')\n decision.reasons.push(`\\`${commit.type}${commit.scope ? `(${commit.scope})` : ''}\\` is not an Aronrepo commit type; no release.`)\n decision.violations.push({\n rule: 'unknown-type',\n message: commit.scope\n ? `\\`${commit.type}(${commit.scope})\\` has an unknown scope. Use one of: ${scoped}.`\n : `\\`${commit.type}\\` needs a scope: ${scoped}.`\n })\n return decision\n }\n\n // `Docs(Readme)` falls back to plain `Docs`; say which scope was probably meant.\n const knownScope = commit.scope && commits.find(({ type, scope }) =>\n type === normalizeType(commit.type) && scope && scope !== commit.scope && scope.toLowerCase() === commit.scope!.toLowerCase())?.scope\n if (knownScope) {\n decision.violations.push({\n rule: 'scope-case',\n severity: 'warning',\n message: `\\`${commit.type}(${commit.scope})\\` is treated as \\`${commit.type}\\`. Write \\`${commit.type}(${knownScope})\\` for that rule.`,\n suggestion: `${commit.type}(${knownScope}): ${commit.subject ?? ''}`\n })\n }\n\n if (commit.subject?.endsWith('.')) {\n decision.violations.push({\n rule: 'subject-full-stop',\n message: 'The summary must not end with a period.',\n suggestion: commit.header.replace(/\\.+$/, '')\n })\n }\n for (const rule of commit.layout ?? []) {\n decision.violations.push({\n rule,\n severity: 'warning',\n message: rule === 'body-leading-blank'\n ? 'Leave a blank line between the header and the body.'\n : 'Leave a blank line before a `BREAKING CHANGE:` footer.'\n })\n }\n\n if (commit.type && legacyTypes.includes(commit.type)) {\n const replacement = normalizeType(commit.type)\n const scope = commit.scope ? `(${commit.scope})` : ''\n decision.reasons.push(`\\`${commit.type}\\` is a legacy type; it releases like \\`${replacement}\\`.`)\n decision.violations.push({\n rule: 'legacy-type',\n message: `\\`${commit.type}\\` is a legacy Aronrepo type. Use \\`${replacement}\\`.`,\n suggestion: `${replacement}${scope}: ${commit.subject ?? ''}`\n })\n }\n\n let release: ReleaseType\n if (decision.type === 'Revert' && commit.revert?.header) {\n const reverted = resolveCommitRelease(commit.revert.header, policy, options)\n const verb = commit.revert.reapply ? 'Reapplies' : 'Reverts'\n if (reverted.type === 'Bump' && reverted.release) {\n // Undoing a version bump does not raise the version again.\n release = 'patch'\n decision.reasons.push(`${verb} \\`${commit.revert.header}\\`; reverting a \\`Bump\\` releases patch.`)\n } else {\n release = reverted.release\n decision.reasons.push(`${verb} \\`${commit.revert.header}\\`, which releases ${formatRelease(release)}.`)\n }\n } else {\n const rule = findCommitRule(decision.type, decision.scope)!\n release = capRelease(rule.release, decision.type, policy)\n decision.reasons.push(`\\`${decision.type}${decision.scope ? `(${decision.scope})` : ''}\\` releases ${formatRelease(release)} in ${policy.mode} mode.`)\n if (release !== rule.release) {\n decision.reasons.push(`Explicit mode caps \\`${decision.type}\\` at patch; only \\`Bump(Minor)\\` or \\`Bump(Major)\\` raise the version further.`)\n }\n }\n\n const isBumpMajor = decision.type === 'Bump' && decision.scope === 'Major'\n if (commit.breaking && !isBumpMajor) {\n const marker = commit.breaking === 'header' ? '`!` header' : '`BREAKING CHANGE:` footer'\n if (policy.mode === 'auto') {\n release = 'major'\n decision.reasons.push(`The ${marker} releases major in auto mode.`)\n } else {\n decision.reasons.push(`The ${marker} is ignored in explicit mode; only \\`Bump(Major)\\` releases major.`)\n decision.violations.push({\n rule: 'implicit-breaking',\n message: `A ${marker} does not release a major version in explicit mode. Describe the change without the breaking marker, or ask the repository owner whether to add a \\`Bump(Major)\\` commit.`\n })\n }\n }\n\n const isBump = decision.type === 'Bump'\n if (release && !isBump && options.files && options.isReleasePath) {\n const releaseFiles = options.files.filter(options.isReleasePath)\n if (!releaseFiles.length) {\n const label = `\\`${decision.type}${decision.scope ? `(${decision.scope})` : ''}\\``\n const onlyBreaking = commit.type !== undefined && findCommitRule(commit.type, commit.scope)?.release === false\n decision.reasons.push('No changed file ships in a published package; no release.')\n decision.violations.push(onlyBreaking\n ? {\n rule: 'release-paths',\n message: `${label} releases ${formatRelease(release)} only because of its breaking marker, but the commit changes no release paths. Remove the breaking marker.`,\n ...(commit.breaking === 'header' ? { suggestion: commit.header.replace('!:', ':') } : {})\n }\n : {\n rule: 'release-paths',\n message: `${label} releases ${formatRelease(release)}, but the commit changes no release paths. Use a non-release type: ${nonReleaseAlternatives.join(', ')}.`,\n suggestion: suggestNonReleaseHeader({ ...commit, type: decision.type })\n })\n release = false\n }\n }\n\n decision.release = release\n return decision\n}\n\nexport interface CommitInput {\n message: string\n hash?: string\n files?: string[]\n}\n\nexport interface ReleaseDecision {\n release: ReleaseType\n commits: CommitDecision[]\n}\n\nexport function resolveRelease(\n inputs: CommitInput[],\n policy: ReleasePolicy = defaultReleasePolicy,\n options: Omit<ResolveCommitOptions, 'files'> = {}\n): ReleaseDecision {\n const parsed = inputs.map((input) => parseCommit(input.message, input.hash))\n const decisions = parsed.map((commit, index) =>\n resolveCommitRelease(commit, policy, { ...options, ...(inputs[index].files ? { files: inputs[index].files } : {}) }))\n\n // A revert and the commits it reverts cancel each other when both are unreleased.\n // Newest first, so reverting a revert cancels that pair and keeps the original commit.\n // A short hash that matches several commits cancels nothing.\n const cancelled = new Set<number>()\n const cancel = (target: number, other: number) => {\n cancelled.add(target)\n decisions[target].release = false\n decisions[target].reasons.push(`Cancelled by \\`${parsed[other].header}\\` in the same release.`)\n }\n for (let index = parsed.length - 1; index >= 0; index--) {\n const hashes = parsed[index].revert?.hashes ?? []\n if (!hashes.length || cancelled.has(index)) continue\n const targets = hashes.map((revertedHash) => {\n const matches = parsed.flatMap((candidate, candidateIndex) =>\n candidateIndex < index && candidate.hash?.toLowerCase().startsWith(revertedHash) ? [candidateIndex] : [])\n return matches.length === 1 && !cancelled.has(matches[0]) ? matches[0] : undefined\n })\n for (const target of targets) if (target !== undefined) cancel(target, index)\n // A revert that also reverts commits outside the range still releases for them.\n if (targets.every((target) => target !== undefined)) {\n const reverted = targets.map((target) => parsed[target!].header).join('`, `')\n cancelled.add(index)\n decisions[index].release = false\n decisions[index].reasons.push(`Cancelled by \\`${reverted}\\` in the same release.`)\n }\n }\n\n return {\n release: maxRelease(...decisions.map(({ release }) => release)),\n commits: decisions\n }\n}\n","import { commits, legacyCommits, type ReleaseType } from './commits'\nimport {\n defaultReleasePathExcludes,\n defaultReleasePolicy,\n getReleaseType,\n nonReleaseAlternatives,\n type ReleasePathsConfig,\n type ReleasePolicy\n} from './policy'\n\nexport interface AgentCommitPolicyExample {\n commit: string\n use: string\n release: ReleaseType\n avoid?: string\n}\n\nexport interface AgentCommitPolicy {\n mode: ReleasePolicy['mode']\n defaultInternalCommit: string\n defaultInternalType: string\n defaultInternalScope: string\n releaseImpactRule: string\n /** Release decisions that belong to the repository owner, not to a coding agent. */\n ownerDecisions: string[]\n releaseWorthyChanges: string[]\n nonReleaseDefaults: string[]\n /** Commands an agent runs to check its commits before handing them off. */\n verification: string[]\n examples: AgentCommitPolicyExample[]\n}\n\nexport interface AgentCommitPolicyOptions {\n /** How to run the CLI in this repository, such as `bun x aronrepo` or `pnpm exec aronrepo`. */\n cli?: string\n}\n\nexport function getAgentCommitPolicy(policy: ReleasePolicy = defaultReleasePolicy, options: AgentCommitPolicyOptions = {}): AgentCommitPolicy {\n const explicit = policy.mode === 'explicit'\n const cli = options.cli ?? 'npx aronrepo'\n return {\n mode: policy.mode,\n defaultInternalCommit: 'Chore(Agent): Clarify commit selection policy',\n defaultInternalType: 'Chore',\n defaultInternalScope: 'Agent',\n releaseImpactRule: 'Use a release type only when the commit changes files that ship in a published package (release paths) and affects published behavior, public API, release behavior, or published README content. Otherwise use a non-release type.',\n ownerDecisions: explicit\n ? [\n 'Never write `Bump(Major)` or `Bump(Minor)` unless the user explicitly asked for that release level in the current conversation.',\n 'Never add a `BREAKING CHANGE:` footer or a `Type!:` header. If a change breaks published behavior, stop and ask the user how to release it.',\n 'Every type except `Bump(Minor)` and `Bump(Major)` releases at most a patch. Pick the type that describes the change, not the release level you want.'\n ]\n : [\n 'Never write `Bump(Major)` or `Bump(Minor)` unless the user explicitly asked for that release level in the current conversation.',\n 'A `BREAKING CHANGE:` footer releases a major version. Add one only for a real break in published behavior or public API, and tell the user.',\n '`Add` releases a minor version. Use it only for new capabilities of published packages.'\n ],\n releaseWorthyChanges: [\n 'Published package runtime behavior',\n 'Public API, exports, or types',\n 'Release, changelog, or versioning behavior',\n 'Published README content that requires a package patch release'\n ],\n nonReleaseDefaults: [\n 'Agent instructions, prompts, and repository context: `Chore(Agent)`',\n 'Sites, apps, and other unpublished workspaces: `Chore(<Scope>)`, `Refactor`, `Style`, or `Test`, even for fixes and performance work',\n 'Tests that only cover existing behavior: `Test`',\n 'Benchmark harnesses, fixtures, reports, and measurement-only changes: `Benchmark` (never `Perf`)',\n 'Build tooling and dev-only configuration: `Build`; CI workflows: `CI`; formatting: `Style`',\n 'Development dependencies, lockfiles, and routine metadata: `Chore(Deps)` or `Chore`',\n 'Examples: `Example`; internal or site documentation: `Docs`',\n 'Refactors that do not change published behavior: `Refactor`'\n ],\n verification: [\n `${cli} check --from origin/main --to HEAD`,\n `${cli} explain`\n ],\n examples: [\n {\n commit: 'Add(Core): Support ESM config files',\n use: 'A new capability in a published package',\n release: getReleaseType('Add', 'Core', policy) ?? false,\n ...(explicit ? { avoid: 'Feat(Core): Support ESM config files' } : {})\n },\n {\n commit: 'Chore(Site): Fix the homepage header transition',\n use: 'A fix in an unpublished site or app workspace',\n release: false,\n avoid: 'Fix(Site): Fix the homepage header transition'\n },\n {\n commit: 'Chore(Agent): Update repository guidance for coding agents',\n use: 'Agent instructions, prompts, or repo context',\n release: false,\n avoid: 'Feat(Agent): Add agent guide'\n },\n {\n commit: 'Test(Release): Cover scoped README bump rules',\n use: 'Tests that validate existing release behavior',\n release: false\n },\n {\n commit: 'Benchmark(Benchmarks): Refresh benchmark report',\n use: 'Benchmark-only changes when the benchmark area is the useful scope',\n release: false,\n avoid: 'Perf(Benchmarks): Refresh benchmark report'\n },\n {\n commit: 'Benchmark: Refresh benchmark report',\n use: 'Benchmark-only changes when no clear scope exists',\n release: false\n },\n {\n commit: 'CI(GitHub): Update PR title check permissions',\n use: 'CI workflow, status check, and automation changes that do not change release behavior',\n release: false,\n avoid: 'Fix(CI): Update PR title check permissions'\n },\n {\n commit: 'Build(Tooling): Update Vitest config',\n use: 'Build system, bundler, local tooling, and dev-only configuration changes',\n release: false,\n avoid: 'Update(Build): Update Vitest config'\n },\n {\n commit: 'Style(Lint): Format TypeScript files',\n use: 'Formatting, lint-only, whitespace, or readability changes with no behavior change',\n release: false,\n avoid: 'Improve(Core): Format TypeScript files'\n },\n {\n commit: 'Chore(Deps): Update Vitest dev dependency',\n use: 'Development dependency, lockfile, audit report, and routine metadata changes',\n release: false,\n avoid: 'Upgrade(Deps): Update Vitest dev dependency'\n },\n {\n commit: 'Example(Release): Add a release workflow sample',\n use: 'Example-only additions or updates that do not change published package behavior',\n release: false,\n avoid: 'Add(Example): Add a release workflow sample'\n },\n {\n commit: 'Docs: Add commit type examples',\n use: 'Documentation that is not published as package README content',\n release: false\n },\n {\n commit: 'Docs(README): Clarify package installation',\n use: 'A published package README (not the repository root README)',\n release: 'patch'\n },\n {\n commit: 'Fix(Release): Preserve workspace dependency ranges',\n use: 'A release behavior bug that affects published package behavior',\n release: 'patch'\n }\n ]\n }\n}\n\n/** Agent policy for the default `explicit` mode. */\nexport const agentCommitPolicy = getAgentCommitPolicy()\n\nfunction formatRule(type: string, scope?: string) {\n return `\\`${type}${scope ? `(${scope})` : ''}\\``\n}\n\nexport function getReleaseTable(policy: ReleasePolicy = defaultReleasePolicy) {\n const rows: Record<'major' | 'minor' | 'patch' | 'none', string[]> = { major: [], minor: [], patch: [], none: [] }\n for (const { type, scope } of commits) {\n const release = getReleaseType(type, scope, policy)\n rows[release || 'none'].push(formatRule(type, scope))\n }\n if (policy.mode === 'auto') rows.major.push('`BREAKING CHANGE:` footer', '`Type!:` header')\n return rows\n}\n\nexport const agentsBlockStart = '<!-- aronrepo:commit-policy:start -->'\nexport const agentsBlockEnd = '<!-- aronrepo:commit-policy:end -->'\n\nexport interface RenderAgentsBlockOptions extends AgentCommitPolicyOptions {\n /** Resolved release paths; `undefined` means every path may release. */\n releasePaths?: ReleasePathsConfig\n}\n\n/** Renders the generated commit policy block for AGENTS.md, including its markers. */\nexport function renderAgentsBlock(policy: ReleasePolicy = defaultReleasePolicy, options: RenderAgentsBlockOptions = {}) {\n const agent = getAgentCommitPolicy(policy, options)\n const paths = options.releasePaths ?? (policy.paths || undefined)\n const excludes = paths ? paths.exclude ?? defaultReleasePathExcludes : []\n const typeRows = commits.map(({ type, scope, description }) =>\n `| ${formatRule(type, scope)} | ${getReleaseType(type, scope, policy) || 'none'} | ${description} |`)\n const lines = [\n agentsBlockStart,\n '<!-- Generated by `aronrepo agents --write`. Edit aronrepo.config.js and regenerate instead of editing this block. -->',\n '',\n '## Commit and Release Policy',\n '',\n `Release mode: **${policy.mode}**. ${policy.mode === 'explicit'\n ? 'Only the repository owner decides minor and major versions, with `Bump(Minor)` and `Bump(Major)` commits.'\n : '`Add` releases minor versions, and `BREAKING CHANGE:` footers and `Type!:` headers release major versions.'}`,\n '',\n 'Commit headers and PR titles use `Type(Scope): Summary` or `Type: Summary`: a PascalCase type, an optional scope for the package or area, and a sentence-case summary without a trailing period.',\n '',\n '| Type | Release | Use for |',\n '| --- | --- | --- |',\n ...typeRows,\n '',\n `Legacy types are rejected: ${legacyCommits.map(({ type, replacement }) => `\\`${type}\\` (use \\`${replacement}\\`)`).join(', ')}.`,\n '',\n '### Release decisions belong to the owner',\n '',\n ...agent.ownerDecisions.map((rule) => `- ${rule}`),\n '',\n '### Choosing a type',\n '',\n `- ${agent.releaseImpactRule}`,\n '- Pick the type that describes the change: a new capability is `Add`, a better existing capability is `Improve`, a bug fix is `Fix`, and a runtime dependency change is `Upgrade`.',\n `- A commit that changes no release path must use a non-release type (${nonReleaseAlternatives.map((type) => `\\`${type}\\``).join(', ')}), even when it fixes or speeds up something.`,\n '- Split unrelated changes so each commit carries its own release level.',\n '',\n 'Non-release defaults:',\n '',\n ...agent.nonReleaseDefaults.map((rule) => `- ${rule}`),\n '',\n '### Release paths',\n '',\n ...(!paths\n ? ['Every path can release a version in this repository.']\n : paths.include?.length === 0\n ? ['No path can release a version in this repository.']\n : [\n ...(paths.include\n ? ['Only changes to these files can release a version:', '', ...paths.include.map((glob) => `- \\`${glob}\\``)]\n : ['Every path can release a version, except the excluded ones.']),\n ...(excludes.length ? ['', `Excluding: ${excludes.map((glob) => `\\`${glob}\\``).join(', ')}.`] : [])\n ]),\n '',\n '### Before handing off commits',\n '',\n ...agent.verification.map((command) => `- \\`${command}\\``),\n '',\n '`aronrepo explain` prints the next release level and the reason for each commit. Tell the user when it is not what they expect.',\n agentsBlockEnd\n ]\n return lines.join('\\n')\n}\n","import semver from 'semver'\nimport type { ReleaseType } from './commits'\n\n/** Prerelease branches. Each publishes `X.Y.Z-<branch>.N` on the npm dist-tag of the same name. */\nexport const prereleaseChannels = ['alpha', 'beta', 'rc', 'canary'] as const\n\n/** Branches that release: `main` publishes on `latest`, and each prerelease branch on its own dist-tag. */\nexport const releaseBranches = ['main', ...prereleaseChannels] as const\n\nexport interface ReleaseChannel {\n branch: string\n /** npm dist-tag that the release moves to. */\n distTag: string\n /** Prerelease identifier, for prerelease branches only. */\n prerelease?: string\n}\n\n/** The release channel of a branch, or `undefined` when the branch does not release. */\nexport function getReleaseChannel(branch: string | undefined): ReleaseChannel | undefined {\n if (branch === 'main') return { branch, distTag: 'latest' }\n if (branch && (prereleaseChannels as readonly string[]).includes(branch)) return { branch, distTag: branch, prerelease: branch }\n return undefined\n}\n\n/** The first version of a repository without version tags. */\nexport const initialVersion = '1.0.0'\n\nexport function toVersionTag(version: string) {\n return `v${version}`\n}\n\n/** The version of a `vX.Y.Z` or `vX.Y.Z-pre.N` tag, or `undefined` for other tags. */\nexport function parseVersionTag(tag: string) {\n if (!tag.startsWith('v')) return undefined\n const version = tag.slice(1)\n return semver.valid(version) === version ? version : undefined\n}\n\nfunction versionsOf(tags: string[]) {\n return tags.flatMap((tag) => {\n const version = parseVersionTag(tag)\n return version ? [version] : []\n })\n}\n\nfunction highest(versions: string[]) {\n return versions.length ? semver.rsort([...versions])[0] : undefined\n}\n\nfunction stableVersions(versions: string[]) {\n return versions.filter((version) => !semver.prerelease(version))\n}\n\nfunction channelVersions(versions: string[], prerelease: string) {\n return versions.filter((version) => semver.prerelease(version)?.[0] === prerelease)\n}\n\nfunction coreVersion(version: string) {\n return `${semver.major(version)}.${semver.minor(version)}.${semver.patch(version)}`\n}\n\n/** The latest stable version among tags, if any. */\nexport function getLatestStableVersion(tags: string[]) {\n return highest(stableVersions(versionsOf(tags)))\n}\n\n/**\n * The tag a channel's release range starts from: the latest stable tag, or on a\n * prerelease branch the latest tag of that channel when it is newer.\n */\nexport function getBaseTag(channel: ReleaseChannel, reachableTags: string[]) {\n const versions = versionsOf(reachableTags)\n const stable = highest(stableVersions(versions))\n if (channel.prerelease) {\n const prerelease = highest(channelVersions(versions, channel.prerelease)\n .filter((version) => !stable || semver.gt(version, stable)))\n if (prerelease) return toVersionTag(prerelease)\n }\n return stable ? toVersionTag(stable) : undefined\n}\n\nexport interface VersionTags {\n /** Version tags reachable from the release commit. */\n reachable: string[]\n /** Every version tag in the repository, to number prereleases. */\n all: string[]\n}\n\n/**\n * The next version of a channel.\n *\n * `main` raises the latest stable version by `release`. A prerelease branch\n * targets the same version, or the version its earlier prereleases already\n * target when that is higher, and numbers the prerelease after every existing\n * tag of that version and channel.\n */\nexport function getNextVersion(channel: ReleaseChannel, release: Exclude<ReleaseType, false>, tags: VersionTags) {\n const reachable = versionsOf(tags.reachable)\n const stable = highest(stableVersions(reachable))\n const target = stable ? semver.inc(stable, release)! : initialVersion\n if (!channel.prerelease) return target\n\n const previous = highest(channelVersions(reachable, channel.prerelease)\n .filter((version) => !stable || semver.gt(version, stable)))\n let core = previous && semver.gte(coreVersion(previous), target) ? coreVersion(previous) : target\n // A stable release of the same version on another branch already shipped; a\n // prerelease of it would sort below `latest`, so target the next version instead.\n const all = versionsOf(tags.all)\n const released = highest(stableVersions(all))\n if (released && semver.lte(core, released)) core = semver.inc(released, release)!\n const numbers = channelVersions(all, channel.prerelease)\n .filter((version) => coreVersion(version) === core)\n .map((version) => semver.prerelease(version)?.[1] ?? 0)\n .filter((number): number is number => Number.isInteger(number))\n return `${core}-${channel.prerelease}.${Math.max(0, ...numbers) + 1}`\n}\n","import { findCommitRule, releaseGroups } from './commits'\nimport type { CommitDecision } from './policy'\n\nexport interface ReleaseNotesOptions {\n version: string\n /** Tag of the previous release, for the compare link. */\n previousTag?: string\n /** Release date as `YYYY-MM-DD`, shown in the heading. */\n date?: string\n /** Repository URL, such as `https://github.com/owner/repo`, for links. */\n repositoryUrl?: string\n /**\n * Starts the notes with a `## <version> (<date>)` heading, for a changelog\n * file. A GitHub release shows its tag and date itself, so its body leaves\n * the heading out and ends with a full changelog link instead.\n */\n heading?: boolean\n commits: CommitDecision[]\n}\n\nconst breakingTitle = '⚠ Breaking Changes'\n\nfunction groupOf(decision: CommitDecision) {\n return findCommitRule(decision.type, decision.scope)?.group\n}\n\n/** Splits text into plain parts and CommonMark code spans: a backtick run closed by a run of the same length. */\nfunction splitCodeSpans(text: string) {\n const parts: Array<{ code: boolean, text: string }> = []\n let plain = ''\n let index = 0\n while (index < text.length) {\n if (text[index] === '\\\\' && text[index + 1] === '`') {\n plain += text.slice(index, index + 2)\n index += 2\n continue\n }\n if (text[index] !== '`') {\n plain += text[index++]\n continue\n }\n const run = /^`+/.exec(text.slice(index))![0]\n const close = new RegExp(`(?<!\\`)${run}(?!\\`)`).exec(text.slice(index + run.length))\n if (!close) {\n plain += run\n index += run.length\n continue\n }\n if (plain) parts.push({ code: false, text: plain })\n plain = ''\n const end = index + run.length + close.index + run.length\n parts.push({ code: true, text: text.slice(index, end) })\n index = end\n }\n if (plain) parts.push({ code: false, text: plain })\n return parts\n}\n\n/**\n * Keeps commit text from acting on GitHub outside code spans: `<` would start\n * HTML, as in `Array<string>`, and `@name` or `@scope/pkg` would notify a user\n * or team on every release.\n */\nfunction escapeMarkdown(text: string) {\n return splitCodeSpans(text).map(({ code, text: part }) => code\n ? part\n : part\n .replace(/</g, '<')\n .replace(/(^|[^\\w`])(@[A-Za-z0-9][\\w-]*(?:\\/[\\w.-]+)?)/g, '$1`$2`')).join('')\n}\n\n/** A list item; continuation lines are indented so they stay in the item. */\nfunction listItem(text: string) {\n return `- ${text.split('\\n').map((line, index) => index && line ? ` ${line}` : line).join('\\n')}`\n}\n\nfunction formatEntry(decision: CommitDecision, repositoryUrl?: string) {\n const summary = escapeMarkdown(decision.subject ?? decision.header)\n const scope = decision.scope ? `**${escapeMarkdown(decision.scope)}:** ` : ''\n const hash = decision.hash ? decision.hash.slice(0, 7) : undefined\n const link = hash\n ? repositoryUrl ? ` ([${hash}](${repositoryUrl}/commit/${decision.hash}))` : ` (${hash})`\n : ''\n return `- ${scope}${summary}${link}`\n}\n\n/** The page that lists every change of a release: the compare view, or the commits of a first release. */\nexport function getChangelogUrl(repositoryUrl: string, version: string, previousTag?: string) {\n const base = repositoryUrl.replace(/\\/+$/, '')\n const tag = `v${version.replace(/^v/, '')}`\n return previousTag ? `${base}/compare/${previousTag}...${tag}` : `${base}/commits/${tag}`\n}\n\n/**\n * Markdown release notes. Only commits that release appear, grouped by type in\n * the order of the commit table; `BREAKING CHANGE:` footers of major releases\n * come first.\n */\nexport function renderReleaseNotes(options: ReleaseNotesOptions) {\n const { previousTag } = options\n const version = options.version.replace(/^v/, '')\n const repositoryUrl = options.repositoryUrl?.replace(/\\/+$/, '')\n const changelogUrl = repositoryUrl ? getChangelogUrl(repositoryUrl, version, previousTag) : undefined\n const sections: string[][] = []\n\n const released = options.commits.filter(({ release }) => release)\n // A `Type!:` header without a footer describes the break with its summary.\n const breaking = released\n .filter(({ release }) => release === 'major')\n .flatMap(({ breakingNotes, breaking: marker, subject }) =>\n breakingNotes?.length ? breakingNotes : marker === 'header' && subject ? [subject] : [])\n if (breaking.length) {\n sections.push([`### ${breakingTitle}`, '', ...breaking.map((note) => listItem(escapeMarkdown(note)))])\n }\n\n const groups = new Map<string, CommitDecision[]>()\n for (const decision of released) {\n const group = groupOf(decision)\n if (!group) continue\n groups.set(group, [...groups.get(group) ?? [], decision])\n }\n for (const group of releaseGroups) {\n const entries = groups.get(group)\n if (!entries) continue\n const sorted = [...entries].sort((a, b) =>\n (a.scope ?? '').localeCompare(b.scope ?? '', 'en') || (a.subject ?? a.header).localeCompare(b.subject ?? b.header, 'en'))\n sections.push([`### ${group}`, '', ...sorted.map((decision) => formatEntry(decision, repositoryUrl))])\n }\n\n if (!sections.length) {\n sections.push([released.length ? 'Version bump only; no other changes to published packages.' : 'No changes to published packages.'])\n }\n\n if (options.heading) {\n const title = changelogUrl ? `[${version}](${changelogUrl})` : version\n sections.unshift([`## ${title}${options.date ? ` (${options.date})` : ''}`])\n } else if (changelogUrl) {\n sections.push([`**Full Changelog**: ${changelogUrl}`])\n }\n return `${sections.map((section) => section.join('\\n')).join('\\n\\n')}\\n`\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/commits.ts","../src/policy.ts","../src/agent.ts","../src/version.ts","../src/notes.ts"],"sourcesContent":["export type ReleaseType = 'major' | 'minor' | 'patch' | false\n\nexport interface ConventionalCommitType {\n type: string\n scope?: string\n /**\n * Release level in `auto` mode. The `explicit` mode caps every type except\n * `Bump` at `patch`; see `getReleaseType()` and `resolveCommitRelease()`.\n */\n release: ReleaseType\n /** When to use the type, written for people and coding agents. */\n description: string\n /** Release notes section. Types without a group never appear in release notes. */\n group?: string\n}\n\nexport interface LegacyCommitType {\n type: string\n /** The type that replaces it. Legacy commits release and group like their replacement. */\n replacement: string\n}\n\n/** Release levels in descending order. */\nexport const releaseLevels = ['major', 'minor', 'patch'] as const\n\nexport function compareRelease(a: ReleaseType | undefined, b: ReleaseType | undefined) {\n const rank = (release: ReleaseType | undefined) => release ? 3 - releaseLevels.indexOf(release) : 0\n return rank(a) - rank(b)\n}\n\nexport function maxRelease(...releases: Array<ReleaseType | undefined>): ReleaseType {\n return releases.reduce<ReleaseType>((highest, release) =>\n compareRelease(release, highest) > 0 ? release as ReleaseType : highest, false)\n}\n\n/**\n * The Aronrepo commit types. The table is fixed: repositories choose a release\n * mode and release paths, not their own types.\n *\n * Release notes list the groups in this order.\n */\nexport const commits: readonly Readonly<ConventionalCommitType>[] = Object.freeze(([\n { type: 'Bump', scope: 'Major', release: 'major', description: 'Release a major version. Only the repository owner decides it.' },\n { type: 'Bump', scope: 'Minor', release: 'minor', description: 'Release a minor version. Only the repository owner decides it.' },\n { type: 'Bump', scope: 'Patch', release: 'patch', description: 'Release a patch version without another release commit.' },\n { type: 'Add', release: 'minor', group: 'Additions', description: 'A new capability: a new API, export, option, command, or package.' },\n { type: 'Improve', release: 'patch', group: 'Improvements', description: 'A better existing capability without new API: behavior, output, messages, or defaults.' },\n { type: 'Perf', release: 'patch', group: 'Performance', description: 'Faster or lighter published code with the same behavior.' },\n { type: 'Fix', release: 'patch', group: 'Bug Fixes', description: 'A bug fix in published behavior.' },\n { type: 'Deprecate', release: 'patch', group: 'Deprecations', description: 'Mark a published capability as deprecated while it keeps working.' },\n { type: 'Drop', release: 'patch', group: 'Removals', description: 'Remove a published capability.' },\n { type: 'Upgrade', release: 'patch', group: 'Dependencies', description: 'Change a runtime dependency of a published package.' },\n { type: 'Revert', release: 'patch', group: 'Reverts', description: 'Revert a commit. It releases what the reverted commit released.' },\n { type: 'Docs', scope: 'README', release: 'patch', group: 'Documentation', description: 'Change a published package README.' },\n { type: 'Docs', release: false, description: 'Documentation that is not a published package README.' },\n { type: 'Test', release: false, description: 'Tests that cover existing behavior.' },\n { type: 'Benchmark', release: false, description: 'Benchmark harnesses, fixtures, and reports.' },\n { type: 'Example', release: false, description: 'Examples that do not ship in a package.' },\n { type: 'Build', release: false, description: 'Build tooling and development configuration.' },\n { type: 'CI', release: false, description: 'CI workflows and automation.' },\n { type: 'Style', release: false, description: 'Formatting and lint-only changes.' },\n { type: 'Refactor', release: false, description: 'Code changes that keep published behavior.' },\n { type: 'Chore', release: false, description: 'Maintenance: development dependencies, lockfiles, metadata, agent guidance, and unpublished workspaces.' }\n] satisfies ConventionalCommitType[]).map((commit) => Object.freeze(commit)))\n\n/**\n * Types from earlier Aronrepo versions. They still resolve in history so old\n * commits release as before, but `aronrepo check` rejects them in new commits.\n */\nexport const legacyCommits: readonly Readonly<LegacyCommitType>[] = Object.freeze(([\n { type: 'Feat', replacement: 'Add' },\n { type: 'New', replacement: 'Add' },\n { type: 'Update', replacement: 'Improve' },\n { type: 'Misc', replacement: 'Chore' }\n] satisfies LegacyCommitType[]).map((commit) => Object.freeze(commit)))\n\nexport const types: string[] = [...new Set(commits.map(({ type }) => type))]\n\nexport const legacyTypes: string[] = legacyCommits.map(({ type }) => type)\n\nexport const releaseCommits: ConventionalCommitType[] = commits.filter(({ release }) => release !== false)\n\nexport const nonReleaseCommits: ConventionalCommitType[] = commits.filter(({ release }) => release === false)\n\nexport const releaseTypes: string[] = [...new Set(releaseCommits.map(({ type }) => type))]\n\nexport const nonReleaseTypes: string[] = [...new Set(nonReleaseCommits.map(({ type }) => type))]\n\n/** Release notes groups in display order. */\nexport const releaseGroups: string[] = [...new Set(commits.flatMap(({ group }) => group ? [group] : []))]\n\n/** The current type for a legacy type, or the type itself. */\nexport function normalizeType(type: string): string\nexport function normalizeType(type: string | undefined): string | undefined\nexport function normalizeType(type: string | undefined) {\n return legacyCommits.find((legacy) => legacy.type === type)?.replacement ?? type\n}\n\nexport function findCommitRule(type: string | undefined, scope?: string): ConventionalCommitType | undefined {\n const current = normalizeType(type)\n if (!current) return undefined\n\n return commits.find((commit) => commit.type === current && commit.scope === scope)\n ?? commits.find((commit) => commit.type === current && commit.scope === undefined)\n}\n","import picomatch from 'picomatch'\nimport { commits, findCommitRule, legacyTypes, maxRelease, normalizeType, types, type ReleaseType } from './commits'\n\n/**\n * - `explicit`: only `Bump(Major)` and `Bump(Minor)` raise major and minor versions.\n * `Add` releases a patch, and breaking markers never change the level.\n * - `auto`: `Add` releases a minor version and a `BREAKING CHANGE:` footer or `!`\n * header releases a major version, following Conventional Commits.\n */\nexport type ReleaseMode = 'explicit' | 'auto'\n\nexport const releaseModes = ['explicit', 'auto'] as const satisfies readonly ReleaseMode[]\n\nexport const defaultReleaseMode: ReleaseMode = 'explicit'\n\nexport interface ReleasePathsConfig {\n /** Globs, relative to the repository root, of files that ship in published packages. */\n include?: string[]\n /** Globs removed from `include`. Defaults to `defaultReleasePathExcludes`. */\n exclude?: string[]\n}\n\n/** A file attached to every GitHub release. */\nexport interface ReleaseAsset {\n /** File to upload, relative to the repository root. */\n path: string\n /** Asset name on the release; defaults to the file name. `{tag}` and `{version}` are replaced. */\n name?: string\n /** Text shown for the asset instead of its name. `{tag}` and `{version}` are replaced. */\n label?: string\n}\n\nexport interface AronrepoConfig {\n release?: {\n mode?: ReleaseMode\n /** Files `aronrepo release` attaches to the GitHub release, such as browser bundles or checksums. */\n assets?: ReleaseAsset[]\n /**\n * Files whose changes can release a version. Omit it to derive the paths from\n * public workspace packages, or set `false` to turn the path check off.\n */\n paths?: ReleasePathsConfig | false\n }\n}\n\nexport interface ReleasePolicy {\n mode: ReleaseMode\n paths?: ReleasePathsConfig | false\n assets?: ReleaseAsset[]\n}\n\nexport const defaultReleasePathExcludes = [\n '**/tests/**',\n '**/test/**',\n '**/__tests__/**',\n '**/*.{test,spec}.*',\n '**/*.test-d.*',\n '**/__snapshots__/**',\n '**/__fixtures__/**',\n '**/__mocks__/**',\n '**/fixtures/**',\n '**/benchmarks/**',\n '**/examples/**',\n '**/CHANGELOG.md',\n '.github/**',\n '.husky/**'\n]\n\nexport function defineConfig(config: AronrepoConfig) {\n return config\n}\n\nexport function getReleasePolicy(config: AronrepoConfig = {}): ReleasePolicy {\n const mode = config.release?.mode ?? defaultReleaseMode\n if (!releaseModes.includes(mode)) {\n throw new Error(`Unknown Aronrepo release mode \"${String(mode)}\". Use one of: ${releaseModes.join(', ')}.`)\n }\n const paths = config.release?.paths\n if (paths !== undefined && paths !== false) validateReleasePaths(paths)\n const assets = config.release?.assets\n if (assets !== undefined) validateReleaseAssets(assets)\n return {\n mode,\n ...(paths !== undefined ? { paths } : {}),\n ...(assets !== undefined ? { assets } : {})\n }\n}\n\nfunction validateReleaseAssets(assets: unknown): asserts assets is ReleaseAsset[] {\n const valid = Array.isArray(assets) && assets.every((asset) => typeof asset === 'object' && asset !== null\n && typeof (asset as ReleaseAsset).path === 'string'\n && ['name', 'label'].every((key) => (asset as Record<string, unknown>)[key] === undefined || typeof (asset as Record<string, unknown>)[key] === 'string'))\n if (!valid) throw new Error('`release.assets` must be an array of `{ path, name?, label? }` objects.')\n}\n\nfunction validateReleasePaths(paths: unknown): asserts paths is ReleasePathsConfig {\n const isGlobs = (value: unknown) => value === undefined || (Array.isArray(value) && value.every((glob) => typeof glob === 'string'))\n if (typeof paths !== 'object' || paths === null || Array.isArray(paths)) {\n throw new Error('`release.paths` must be `false` or an object with `include` and `exclude` glob arrays.')\n }\n const { include, exclude } = paths as Record<string, unknown>\n if (!isGlobs(include)) throw new Error('`release.paths.include` must be an array of globs.')\n if (!isGlobs(exclude)) throw new Error('`release.paths.exclude` must be an array of globs.')\n}\n\nexport const defaultReleasePolicy: ReleasePolicy = { mode: defaultReleaseMode }\n\n/**\n * Returns a matcher for release paths, or `undefined` when every path may release.\n * `include` defaults to every path; `!glob` entries in `include` exclude, as in\n * `package.json` `files`, instead of matching everything else.\n */\nexport function createReleasePathMatcher(paths: ReleasePathsConfig | false | undefined) {\n if (!paths) return undefined\n const globs = paths.include ?? ['**']\n const positive = globs.filter((glob) => !glob.startsWith('!'))\n const negated = globs.filter((glob) => glob.startsWith('!')).map((glob) => glob.slice(1))\n if (!positive.length) return () => false\n const include = picomatch(positive, { dot: true })\n const exclude = picomatch([...paths.exclude ?? defaultReleasePathExcludes, ...negated], { dot: true })\n return (file: string) => include(file) && !exclude(file)\n}\n\n/**\n * Release level of a commit type in the given mode, ignoring breaking markers and paths.\n * Use `resolveCommitRelease()` for the full decision.\n */\nexport function getReleaseType(type: string | undefined, scope?: string, policy: ReleasePolicy = defaultReleasePolicy): ReleaseType | undefined {\n const release = findCommitRule(type, scope)?.release\n if (release === undefined) return undefined\n return capRelease(release, type, policy)\n}\n\nfunction capRelease(release: ReleaseType, type: string | undefined, policy: ReleasePolicy): ReleaseType {\n if (policy.mode === 'explicit' && type !== 'Bump' && (release === 'major' || release === 'minor')) return 'patch'\n return release\n}\n\n/**\n * The first character of a scope or summary: an uppercase letter, a letter\n * without case (such as CJK), a digit, or a code, issue, or emphasis marker.\n */\nconst startCharacter = String.raw`[\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\x60_#~]`\nconst startPattern = new RegExp(`^${startCharacter}`, 'u')\n\n// The scope stops at the first `)`, so a summary such as `Handle Foo(Bar): Baz` stays whole.\nexport const headerPattern = new RegExp(String.raw`^([A-Z]\\w*)(?:\\((${startCharacter}[^)]*)\\))?: (${startCharacter}.*)$`, 'u')\nconst breakingHeaderPattern = new RegExp(String.raw`^([A-Z]\\w*)(?:\\((${startCharacter}[^)]*)\\))?!: (${startCharacter}.*)$`, 'u')\nconst footerStartPattern = /^BREAKING[ -]CHANGE:[ \\t]*(.*)$/\n// GitHub's revert button writes `Revert \"<header>\"`, a squash merge appends ` (#123)`,\n// and git 2.43+ writes `Reapply \"<header>\"` when a revert is reverted.\nconst githubRevertPattern = /^(Revert|Reapply) \"([\\s\\S]+)\"(?: \\(#\\d+\\))?$/\nconst revertHashPattern = /This reverts commit ([0-9a-f]{7,40})/gi\nconst fencePattern = /^\\s*(```|~~~)/\n\nexport interface ParsedCommit {\n hash?: string\n header: string\n body: string\n type?: string\n scope?: string\n subject?: string\n /** Where a breaking marker was found, if any. */\n breaking?: 'header' | 'footer'\n /** Texts of `BREAKING CHANGE:` footers; continuation lines keep their line breaks. */\n breakingNotes?: string[]\n /** Message layout problems that do not change the release. */\n layout?: Array<'body-leading-blank' | 'footer-leading-blank'>\n revert?: {\n header?: string\n /** The first reverted hash, lowercase. */\n hash?: string\n /** Every reverted hash, lowercase; a squashed commit can revert several. */\n hashes?: string[]\n /** `Reapply \"<header>\"`: a revert of the revert of `header`. */\n reapply?: boolean\n }\n}\n\nconst trailerPattern = /^[\\w-]+: /\n\n/**\n * `BREAKING CHANGE:` footers outside code fences. Each runs, line breaks kept,\n * until another footer or a git trailer, as Conventional Commits footers do.\n */\nfunction readBreakingFooters(lines: string[]) {\n const notes: string[] = []\n const starts: number[] = []\n let current: string[] | undefined\n let fenced = false\n const finish = () => {\n if (current) notes.push(current.join('\\n').trim())\n current = undefined\n }\n lines.forEach((line, index) => {\n if (fencePattern.test(line)) fenced = !fenced\n const start = fenced ? null : footerStartPattern.exec(line)\n if (start) {\n finish()\n starts.push(index)\n current = [start[1]]\n } else if (current && !fenced && trailerPattern.test(line)) {\n finish()\n } else if (current) {\n current.push(line.trimEnd())\n }\n })\n finish()\n return { starts, notes: notes.filter(Boolean) }\n}\n\nfunction parseHeader(header: string) {\n const regular = headerPattern.exec(header)\n const match = regular ?? breakingHeaderPattern.exec(header)\n return match ? { type: match[1], scope: match[2], subject: match[3], breaking: !regular } : undefined\n}\n\nexport function parseCommit(message: string, hash?: string): ParsedCommit {\n const normalized = message.replace(/\\r\\n?/g, '\\n').trim()\n const [rawHeader = '', ...rest] = normalized.split('\\n')\n const header = rawHeader.trimEnd()\n const body = rest.join('\\n').trim()\n const parsed: ParsedCommit = { header, body, ...(hash ? { hash } : {}) }\n\n const footers = readBreakingFooters(rest)\n const layout: NonNullable<ParsedCommit['layout']> = []\n if (rest.length && rest[0].trim()) layout.push('body-leading-blank')\n if (footers.starts.some((index) => index > 0 && rest[index - 1].trim())) layout.push('footer-leading-blank')\n if (layout.length) parsed.layout = layout\n if (footers.notes.length) parsed.breakingNotes = footers.notes\n\n const match = parseHeader(header)\n if (match) {\n parsed.type = match.type\n if (match.scope) parsed.scope = match.scope\n parsed.subject = match.subject\n if (match.breaking) parsed.breaking = 'header'\n }\n if (!parsed.breaking && footers.starts.length) parsed.breaking = 'footer'\n\n const githubRevert = githubRevertPattern.exec(header)\n if (githubRevert || parsed.type === 'Revert') {\n const revertedHeader = githubRevert?.[2] ?? (parsed.subject && parseHeader(parsed.subject) ? parsed.subject : undefined)\n const hashes = [...new Set([...body.matchAll(revertHashPattern)].map((found) => found[1].toLowerCase()))]\n parsed.revert = {\n ...(revertedHeader ? { header: revertedHeader } : {}),\n ...(hashes.length ? { hash: hashes[0], hashes } : {}),\n ...(githubRevert?.[1] === 'Reapply' ? { reapply: true } : {})\n }\n }\n return parsed\n}\n\nexport type CommitViolationRule =\n | 'header-format'\n | 'subject-full-stop'\n | 'unknown-type'\n | 'legacy-type'\n | 'implicit-breaking'\n | 'release-paths'\n | 'scope-case'\n | 'body-leading-blank'\n | 'footer-leading-blank'\n\nexport interface CommitViolation {\n rule: CommitViolationRule\n /** Errors fail `aronrepo check`; warnings are printed only. Defaults to `error`. */\n severity?: 'error' | 'warning'\n message: string\n /** A header that satisfies the policy, when one can be derived. */\n suggestion?: string\n}\n\nexport interface CommitDecision {\n hash?: string\n header: string\n type?: string\n scope?: string\n subject?: string\n /** Texts of `BREAKING CHANGE:` footers, kept for `Bump(Major)` release notes. */\n breakingNotes?: string[]\n /** Where a breaking marker was found, if any. */\n breaking?: 'header' | 'footer'\n /** Effective release level after mode, breaking markers, reverts, and paths. */\n release: ReleaseType\n reasons: string[]\n violations: CommitViolation[]\n}\n\nexport interface ResolveCommitOptions {\n /** Files the commit changes. Omit it to skip the release path check. */\n files?: string[]\n /** Decides whether a changed file ships in a published package. */\n isReleasePath?: (file: string) => boolean\n}\n\nexport const nonReleaseAlternatives = ['Chore', 'Refactor', 'Style', 'Test', 'Docs', 'Build', 'CI', 'Benchmark', 'Example']\n\nfunction suggestNonReleaseHeader(commit: ParsedCommit) {\n // A GitHub revert has no subject; its whole header becomes the summary.\n const subject = (commit.subject ?? commit.header).replace(/\\.+$/, '')\n const scope = commit.scope ? `(${commit.scope})` : ''\n switch (commit.type) {\n case 'Docs':\n return `Docs: ${subject}`\n case 'Upgrade':\n return `Chore(Deps): ${subject}`\n default:\n return `Chore${scope}: ${subject}`\n }\n}\n\nconst looseHeaderPattern = /^(\\w+)(?:\\(([^)]*)\\))?(!)?:(\\s*)(.*)$/\n\nfunction diagnoseHeader(header: string, mode: ReleaseMode) {\n const format = 'Use `Type(Scope): Summary` or `Type: Summary` with an Aronrepo commit type.'\n const match = looseHeaderPattern.exec(header)\n if (!match) return format\n const [, type, scope, bang, space, subject] = match\n if (!/^[A-Z]/.test(type)) {\n return `The type \\`${type}\\` must be PascalCase, such as \\`${normalizeType(`${type[0].toUpperCase()}${type.slice(1)}`)}\\`. ${format}`\n }\n if (bang && mode === 'explicit') return `Aronrepo headers do not use \\`!\\` in explicit mode. ${format}`\n if (scope !== undefined && !startPattern.test(scope)) return `The scope \\`${scope}\\` must start with an uppercase letter or digit. ${format}`\n if (space !== ' ') return `Put exactly one space after the colon. ${format}`\n if (!subject) return `The summary is empty. ${format}`\n if (!startPattern.test(subject)) return `The summary must start with an uppercase letter, a digit, or a letter without case such as CJK. ${format}`\n return format\n}\n\nfunction formatRelease(release: ReleaseType | undefined) {\n return release ? release : 'none'\n}\n\nexport function resolveCommitRelease(\n input: string | ParsedCommit,\n policy: ReleasePolicy = defaultReleasePolicy,\n options: ResolveCommitOptions = {}\n): CommitDecision {\n const commit = typeof input === 'string' ? parseCommit(input) : input\n const decision: CommitDecision = {\n ...(commit.hash ? { hash: commit.hash } : {}),\n header: commit.header,\n ...(commit.type ? { type: commit.type } : {}),\n ...(commit.scope ? { scope: commit.scope } : {}),\n ...(commit.subject ? { subject: commit.subject } : {}),\n ...(commit.breakingNotes ? { breakingNotes: commit.breakingNotes } : {}),\n ...(commit.breaking ? { breaking: commit.breaking } : {}),\n release: false,\n reasons: [],\n violations: []\n }\n\n if (commit.revert?.header && !commit.type) {\n // GitHub's default `Revert \"Type(Scope): Summary\"` header.\n decision.type = 'Revert'\n } else if (!commit.type) {\n decision.reasons.push('Header does not follow `Type(Scope): Summary`; no release.')\n decision.violations.push({\n rule: 'header-format',\n message: diagnoseHeader(commit.header, policy.mode)\n })\n return decision\n } else if (!types.includes(commit.type) && !legacyTypes.includes(commit.type)) {\n decision.reasons.push(`Unknown type \\`${commit.type}\\`; no release.`)\n decision.violations.push({\n rule: 'unknown-type',\n message: `\\`${commit.type}\\` is not an Aronrepo commit type. Use one of: ${types.join(', ')}.`\n })\n return decision\n } else if (!findCommitRule(commit.type, commit.scope)) {\n const scoped = commits.filter(({ type }) => type === commit.type).map(({ type, scope }) => `\\`${type}(${scope})\\``).join(', ')\n decision.reasons.push(`\\`${commit.type}${commit.scope ? `(${commit.scope})` : ''}\\` is not an Aronrepo commit type; no release.`)\n decision.violations.push({\n rule: 'unknown-type',\n message: commit.scope\n ? `\\`${commit.type}(${commit.scope})\\` has an unknown scope. Use one of: ${scoped}.`\n : `\\`${commit.type}\\` needs a scope: ${scoped}.`\n })\n return decision\n }\n\n // `Docs(Readme)` falls back to plain `Docs`; say which scope was probably meant.\n const knownScope = commit.scope && commits.find(({ type, scope }) =>\n type === normalizeType(commit.type) && scope && scope !== commit.scope && scope.toLowerCase() === commit.scope!.toLowerCase())?.scope\n if (knownScope) {\n decision.violations.push({\n rule: 'scope-case',\n severity: 'warning',\n message: `\\`${commit.type}(${commit.scope})\\` is treated as \\`${commit.type}\\`. Write \\`${commit.type}(${knownScope})\\` for that rule.`,\n suggestion: `${commit.type}(${knownScope}): ${commit.subject ?? ''}`\n })\n }\n\n if (commit.subject?.endsWith('.')) {\n decision.violations.push({\n rule: 'subject-full-stop',\n message: 'The summary must not end with a period.',\n suggestion: commit.header.replace(/\\.+$/, '')\n })\n }\n for (const rule of commit.layout ?? []) {\n decision.violations.push({\n rule,\n severity: 'warning',\n message: rule === 'body-leading-blank'\n ? 'Leave a blank line between the header and the body.'\n : 'Leave a blank line before a `BREAKING CHANGE:` footer.'\n })\n }\n\n if (commit.type && legacyTypes.includes(commit.type)) {\n const replacement = normalizeType(commit.type)\n const scope = commit.scope ? `(${commit.scope})` : ''\n decision.reasons.push(`\\`${commit.type}\\` is a legacy type; it releases like \\`${replacement}\\`.`)\n decision.violations.push({\n rule: 'legacy-type',\n message: `\\`${commit.type}\\` is a legacy Aronrepo type. Use \\`${replacement}\\`.`,\n suggestion: `${replacement}${scope}: ${commit.subject ?? ''}`\n })\n }\n\n let release: ReleaseType\n if (decision.type === 'Revert' && commit.revert?.header) {\n const reverted = resolveCommitRelease(commit.revert.header, policy, options)\n const verb = commit.revert.reapply ? 'Reapplies' : 'Reverts'\n if (reverted.type === 'Bump' && reverted.release) {\n // Undoing a version bump does not raise the version again.\n release = 'patch'\n decision.reasons.push(`${verb} \\`${commit.revert.header}\\`; reverting a \\`Bump\\` releases patch.`)\n } else {\n release = reverted.release\n decision.reasons.push(`${verb} \\`${commit.revert.header}\\`, which releases ${formatRelease(release)}.`)\n }\n } else {\n const rule = findCommitRule(decision.type, decision.scope)!\n release = capRelease(rule.release, decision.type, policy)\n decision.reasons.push(`\\`${decision.type}${decision.scope ? `(${decision.scope})` : ''}\\` releases ${formatRelease(release)} in ${policy.mode} mode.`)\n if (release !== rule.release) {\n decision.reasons.push(`Explicit mode caps \\`${decision.type}\\` at patch; only \\`Bump(Minor)\\` or \\`Bump(Major)\\` raise the version further.`)\n }\n }\n\n const isBumpMajor = decision.type === 'Bump' && decision.scope === 'Major'\n if (commit.breaking && !isBumpMajor) {\n const marker = commit.breaking === 'header' ? '`!` header' : '`BREAKING CHANGE:` footer'\n if (policy.mode === 'auto') {\n release = 'major'\n decision.reasons.push(`The ${marker} releases major in auto mode.`)\n } else {\n decision.reasons.push(`The ${marker} is ignored in explicit mode; only \\`Bump(Major)\\` releases major.`)\n decision.violations.push({\n rule: 'implicit-breaking',\n message: `A ${marker} does not release a major version in explicit mode. Describe the change without the breaking marker, or ask the repository owner whether to add a \\`Bump(Major)\\` commit.`\n })\n }\n }\n\n const isBump = decision.type === 'Bump'\n if (release && !isBump && options.files && options.isReleasePath) {\n const releaseFiles = options.files.filter(options.isReleasePath)\n if (!releaseFiles.length) {\n const label = `\\`${decision.type}${decision.scope ? `(${decision.scope})` : ''}\\``\n const onlyBreaking = commit.type !== undefined && findCommitRule(commit.type, commit.scope)?.release === false\n decision.reasons.push('No changed file ships in a published package; no release.')\n decision.violations.push(onlyBreaking\n ? {\n rule: 'release-paths',\n message: `${label} releases ${formatRelease(release)} only because of its breaking marker, but the commit changes no release paths. Remove the breaking marker.`,\n ...(commit.breaking === 'header' ? { suggestion: commit.header.replace('!:', ':') } : {})\n }\n : {\n rule: 'release-paths',\n message: `${label} releases ${formatRelease(release)}, but the commit changes no release paths. Use a non-release type: ${nonReleaseAlternatives.join(', ')}.`,\n suggestion: suggestNonReleaseHeader({ ...commit, type: decision.type })\n })\n release = false\n }\n }\n\n decision.release = release\n return decision\n}\n\nexport interface CommitInput {\n message: string\n hash?: string\n files?: string[]\n}\n\nexport interface ReleaseDecision {\n release: ReleaseType\n commits: CommitDecision[]\n}\n\nexport function resolveRelease(\n inputs: CommitInput[],\n policy: ReleasePolicy = defaultReleasePolicy,\n options: Omit<ResolveCommitOptions, 'files'> = {}\n): ReleaseDecision {\n const parsed = inputs.map((input) => parseCommit(input.message, input.hash))\n const decisions = parsed.map((commit, index) =>\n resolveCommitRelease(commit, policy, { ...options, ...(inputs[index].files ? { files: inputs[index].files } : {}) }))\n\n // A revert and the commits it reverts cancel each other when both are unreleased.\n // Newest first, so reverting a revert cancels that pair and keeps the original commit.\n // A short hash that matches several commits cancels nothing.\n const cancelled = new Set<number>()\n const cancel = (target: number, other: number) => {\n cancelled.add(target)\n decisions[target].release = false\n decisions[target].reasons.push(`Cancelled by \\`${parsed[other].header}\\` in the same release.`)\n }\n for (let index = parsed.length - 1; index >= 0; index--) {\n const hashes = parsed[index].revert?.hashes ?? []\n if (!hashes.length || cancelled.has(index)) continue\n const targets = hashes.map((revertedHash) => {\n const matches = parsed.flatMap((candidate, candidateIndex) =>\n candidateIndex < index && candidate.hash?.toLowerCase().startsWith(revertedHash) ? [candidateIndex] : [])\n return matches.length === 1 && !cancelled.has(matches[0]) ? matches[0] : undefined\n })\n for (const target of targets) if (target !== undefined) cancel(target, index)\n // A revert that also reverts commits outside the range still releases for them.\n if (targets.every((target) => target !== undefined)) {\n const reverted = targets.map((target) => parsed[target!].header).join('`, `')\n cancelled.add(index)\n decisions[index].release = false\n decisions[index].reasons.push(`Cancelled by \\`${reverted}\\` in the same release.`)\n }\n }\n\n return {\n release: maxRelease(...decisions.map(({ release }) => release)),\n commits: decisions\n }\n}\n","import { commits, legacyCommits, type ReleaseType } from './commits'\nimport {\n defaultReleasePathExcludes,\n defaultReleasePolicy,\n getReleaseType,\n nonReleaseAlternatives,\n type ReleasePathsConfig,\n type ReleasePolicy\n} from './policy'\n\nexport interface AgentCommitPolicyExample {\n commit: string\n use: string\n release: ReleaseType\n avoid?: string\n}\n\nexport interface AgentCommitPolicy {\n mode: ReleasePolicy['mode']\n defaultInternalCommit: string\n defaultInternalType: string\n defaultInternalScope: string\n releaseImpactRule: string\n /** Release decisions that belong to the repository owner, not to a coding agent. */\n ownerDecisions: string[]\n releaseWorthyChanges: string[]\n nonReleaseDefaults: string[]\n /** Commands an agent runs to check its commits before handing them off. */\n verification: string[]\n examples: AgentCommitPolicyExample[]\n}\n\nexport interface AgentCommitPolicyOptions {\n /** How to run the CLI in this repository, such as `bun x aronrepo` or `pnpm exec aronrepo`. */\n cli?: string\n}\n\nexport function getAgentCommitPolicy(policy: ReleasePolicy = defaultReleasePolicy, options: AgentCommitPolicyOptions = {}): AgentCommitPolicy {\n const explicit = policy.mode === 'explicit'\n const cli = options.cli ?? 'npx aronrepo'\n return {\n mode: policy.mode,\n defaultInternalCommit: 'Chore(Agent): Clarify commit selection policy',\n defaultInternalType: 'Chore',\n defaultInternalScope: 'Agent',\n releaseImpactRule: 'Use a release type only when the commit changes files that ship in a published package (release paths) and affects published behavior, public API, release behavior, or published README content. Otherwise use a non-release type.',\n ownerDecisions: explicit\n ? [\n 'Never write `Bump(Major)` or `Bump(Minor)` unless the user explicitly asked for that release level in the current conversation.',\n 'Never add a `BREAKING CHANGE:` footer or a `Type!:` header. If a change breaks published behavior, stop and ask the user how to release it.',\n 'Every type except `Bump(Minor)` and `Bump(Major)` releases at most a patch. Pick the type that describes the change, not the release level you want.'\n ]\n : [\n 'Never write `Bump(Major)` or `Bump(Minor)` unless the user explicitly asked for that release level in the current conversation.',\n 'A `BREAKING CHANGE:` footer releases a major version. Add one only for a real break in published behavior or public API, and tell the user.',\n '`Add` releases a minor version. Use it only for new capabilities of published packages.'\n ],\n releaseWorthyChanges: [\n 'Published package runtime behavior',\n 'Public API, exports, or types',\n 'Release, changelog, or versioning behavior',\n 'Published README content that requires a package patch release'\n ],\n nonReleaseDefaults: [\n 'Agent instructions, prompts, and repository context: `Chore(Agent)`',\n 'Sites, apps, and other unpublished workspaces: `Chore(<Scope>)`, `Refactor`, `Style`, or `Test`, even for fixes and performance work',\n 'Tests that only cover existing behavior: `Test`',\n 'Benchmark harnesses, fixtures, reports, and measurement-only changes: `Benchmark` (never `Perf`)',\n 'Build tooling and dev-only configuration: `Build`; CI workflows: `CI`; formatting: `Style`',\n 'Development dependencies, lockfiles, and routine metadata: `Chore(Deps)` or `Chore`',\n 'Examples: `Example`; internal or site documentation: `Docs`',\n 'Refactors that do not change published behavior: `Refactor`'\n ],\n verification: [\n `${cli} check --from origin/main --to HEAD`,\n `${cli} explain`\n ],\n examples: [\n {\n commit: 'Add(Core): Support ESM config files',\n use: 'A new capability in a published package',\n release: getReleaseType('Add', 'Core', policy) ?? false,\n ...(explicit ? { avoid: 'Feat(Core): Support ESM config files' } : {})\n },\n {\n commit: 'Chore(Site): Fix the homepage header transition',\n use: 'A fix in an unpublished site or app workspace',\n release: false,\n avoid: 'Fix(Site): Fix the homepage header transition'\n },\n {\n commit: 'Chore(Agent): Update repository guidance for coding agents',\n use: 'Agent instructions, prompts, or repo context',\n release: false,\n avoid: 'Feat(Agent): Add agent guide'\n },\n {\n commit: 'Test(Release): Cover scoped README bump rules',\n use: 'Tests that validate existing release behavior',\n release: false\n },\n {\n commit: 'Benchmark(Benchmarks): Refresh benchmark report',\n use: 'Benchmark-only changes when the benchmark area is the useful scope',\n release: false,\n avoid: 'Perf(Benchmarks): Refresh benchmark report'\n },\n {\n commit: 'Benchmark: Refresh benchmark report',\n use: 'Benchmark-only changes when no clear scope exists',\n release: false\n },\n {\n commit: 'CI(GitHub): Update PR title check permissions',\n use: 'CI workflow, status check, and automation changes that do not change release behavior',\n release: false,\n avoid: 'Fix(CI): Update PR title check permissions'\n },\n {\n commit: 'Build(Tooling): Update Vitest config',\n use: 'Build system, bundler, local tooling, and dev-only configuration changes',\n release: false,\n avoid: 'Update(Build): Update Vitest config'\n },\n {\n commit: 'Style(Lint): Format TypeScript files',\n use: 'Formatting, lint-only, whitespace, or readability changes with no behavior change',\n release: false,\n avoid: 'Improve(Core): Format TypeScript files'\n },\n {\n commit: 'Chore(Deps): Update Vitest dev dependency',\n use: 'Development dependency, lockfile, audit report, and routine metadata changes',\n release: false,\n avoid: 'Upgrade(Deps): Update Vitest dev dependency'\n },\n {\n commit: 'Example(Release): Add a release workflow sample',\n use: 'Example-only additions or updates that do not change published package behavior',\n release: false,\n avoid: 'Add(Example): Add a release workflow sample'\n },\n {\n commit: 'Docs: Add commit type examples',\n use: 'Documentation that is not published as package README content',\n release: false\n },\n {\n commit: 'Docs(README): Clarify package installation',\n use: 'A published package README (not the repository root README)',\n release: 'patch'\n },\n {\n commit: 'Fix(Release): Preserve workspace dependency ranges',\n use: 'A release behavior bug that affects published package behavior',\n release: 'patch'\n }\n ]\n }\n}\n\n/** Agent policy for the default `explicit` mode. */\nexport const agentCommitPolicy = getAgentCommitPolicy()\n\nfunction formatRule(type: string, scope?: string) {\n return `\\`${type}${scope ? `(${scope})` : ''}\\``\n}\n\nexport function getReleaseTable(policy: ReleasePolicy = defaultReleasePolicy) {\n const rows: Record<'major' | 'minor' | 'patch' | 'none', string[]> = { major: [], minor: [], patch: [], none: [] }\n for (const { type, scope } of commits) {\n const release = getReleaseType(type, scope, policy)\n rows[release || 'none'].push(formatRule(type, scope))\n }\n if (policy.mode === 'auto') rows.major.push('`BREAKING CHANGE:` footer', '`Type!:` header')\n return rows\n}\n\nexport const agentsBlockStart = '<!-- aronrepo:commit-policy:start -->'\nexport const agentsBlockEnd = '<!-- aronrepo:commit-policy:end -->'\n\nexport interface RenderAgentsBlockOptions extends AgentCommitPolicyOptions {\n /** Resolved release paths; `undefined` means every path may release. */\n releasePaths?: ReleasePathsConfig\n}\n\n/** Renders the generated commit policy block for AGENTS.md, including its markers. */\nexport function renderAgentsBlock(policy: ReleasePolicy = defaultReleasePolicy, options: RenderAgentsBlockOptions = {}) {\n const agent = getAgentCommitPolicy(policy, options)\n const paths = options.releasePaths ?? (policy.paths || undefined)\n const excludes = paths ? paths.exclude ?? defaultReleasePathExcludes : []\n const typeRows = commits.map(({ type, scope, description }) =>\n `| ${formatRule(type, scope)} | ${getReleaseType(type, scope, policy) || 'none'} | ${description} |`)\n const lines = [\n agentsBlockStart,\n '<!-- Generated by `aronrepo agents --write`. Edit aronrepo.config.js and regenerate instead of editing this block. -->',\n '',\n '## Commit and Release Policy',\n '',\n `Release mode: **${policy.mode}**. ${policy.mode === 'explicit'\n ? 'Only the repository owner decides minor and major versions, with `Bump(Minor)` and `Bump(Major)` commits.'\n : '`Add` releases minor versions, and `BREAKING CHANGE:` footers and `Type!:` headers release major versions.'}`,\n '',\n 'Commit headers and PR titles use `Type(Scope): Summary` or `Type: Summary`: a PascalCase type, an optional scope for the package or area, and a sentence-case summary without a trailing period.',\n '',\n '| Type | Release | Use for |',\n '| --- | --- | --- |',\n ...typeRows,\n '',\n `Legacy types are rejected: ${legacyCommits.map(({ type, replacement }) => `\\`${type}\\` (use \\`${replacement}\\`)`).join(', ')}.`,\n '',\n '### Release decisions belong to the owner',\n '',\n ...agent.ownerDecisions.map((rule) => `- ${rule}`),\n '',\n '### Choosing a type',\n '',\n `- ${agent.releaseImpactRule}`,\n '- Pick the type that describes the change: a new capability is `Add`, a better existing capability is `Improve`, a bug fix is `Fix`, and a runtime dependency change is `Upgrade`.',\n `- A commit that changes no release path must use a non-release type (${nonReleaseAlternatives.map((type) => `\\`${type}\\``).join(', ')}), even when it fixes or speeds up something.`,\n '- Split unrelated changes so each commit carries its own release level.',\n '',\n 'Non-release defaults:',\n '',\n ...agent.nonReleaseDefaults.map((rule) => `- ${rule}`),\n '',\n '### Release paths',\n '',\n ...(!paths\n ? ['Every path can release a version in this repository.']\n : paths.include?.length === 0\n ? ['No path can release a version in this repository.']\n : [\n ...(paths.include\n ? ['Only changes to these files can release a version:', '', ...paths.include.map((glob) => `- \\`${glob}\\``)]\n : ['Every path can release a version, except the excluded ones.']),\n ...(excludes.length ? ['', `Excluding: ${excludes.map((glob) => `\\`${glob}\\``).join(', ')}.`] : [])\n ]),\n '',\n '### Before handing off commits',\n '',\n ...agent.verification.map((command) => `- \\`${command}\\``),\n '',\n '`aronrepo explain` prints the next release level and the reason for each commit. Tell the user when it is not what they expect.',\n agentsBlockEnd\n ]\n return lines.join('\\n')\n}\n","import semver from 'semver'\nimport type { ReleaseType } from './commits'\n\n/** Prerelease branches. Each publishes `X.Y.Z-<branch>.N` on the npm dist-tag of the same name. */\nexport const prereleaseChannels = ['alpha', 'beta', 'rc', 'canary'] as const\n\n/** Branches that release: `main` publishes on `latest`, and each prerelease branch on its own dist-tag. */\nexport const releaseBranches = ['main', ...prereleaseChannels] as const\n\nexport interface ReleaseChannel {\n branch: string\n /** npm dist-tag that the release moves to. */\n distTag: string\n /** Prerelease identifier, for prerelease branches only. */\n prerelease?: string\n}\n\n/** The release channel of a branch, or `undefined` when the branch does not release. */\nexport function getReleaseChannel(branch: string | undefined): ReleaseChannel | undefined {\n if (branch === 'main') return { branch, distTag: 'latest' }\n if (branch && (prereleaseChannels as readonly string[]).includes(branch)) return { branch, distTag: branch, prerelease: branch }\n return undefined\n}\n\n/** The first version of a repository without version tags. */\nexport const initialVersion = '1.0.0'\n\nexport function toVersionTag(version: string) {\n return `v${version}`\n}\n\n/** The version of a `vX.Y.Z` or `vX.Y.Z-pre.N` tag, or `undefined` for other tags. */\nexport function parseVersionTag(tag: string) {\n if (!tag.startsWith('v')) return undefined\n const version = tag.slice(1)\n return semver.valid(version) === version ? version : undefined\n}\n\nfunction versionsOf(tags: string[]) {\n return tags.flatMap((tag) => {\n const version = parseVersionTag(tag)\n return version ? [version] : []\n })\n}\n\nfunction highest(versions: string[]) {\n return versions.length ? semver.rsort([...versions])[0] : undefined\n}\n\nfunction stableVersions(versions: string[]) {\n return versions.filter((version) => !semver.prerelease(version))\n}\n\nfunction channelVersions(versions: string[], prerelease: string) {\n return versions.filter((version) => semver.prerelease(version)?.[0] === prerelease)\n}\n\nfunction coreVersion(version: string) {\n return `${semver.major(version)}.${semver.minor(version)}.${semver.patch(version)}`\n}\n\n/** The latest stable version among tags, if any. */\nexport function getLatestStableVersion(tags: string[]) {\n return highest(stableVersions(versionsOf(tags)))\n}\n\n/**\n * The tag a channel's release range starts from: the latest stable tag, or on a\n * prerelease branch the latest tag of that channel when it is newer.\n */\nexport function getBaseTag(channel: ReleaseChannel, reachableTags: string[]) {\n const versions = versionsOf(reachableTags)\n const stable = highest(stableVersions(versions))\n if (channel.prerelease) {\n const prerelease = highest(channelVersions(versions, channel.prerelease)\n .filter((version) => !stable || semver.gt(version, stable)))\n if (prerelease) return toVersionTag(prerelease)\n }\n return stable ? toVersionTag(stable) : undefined\n}\n\nexport interface VersionTags {\n /** Version tags reachable from the release commit. */\n reachable: string[]\n /** Every version tag in the repository, to number prereleases. */\n all: string[]\n}\n\n/**\n * The next version of a channel.\n *\n * `main` raises the latest stable version by `release`. A prerelease branch\n * targets the same version, or the version its earlier prereleases already\n * target when that is higher, and numbers the prerelease after every existing\n * tag of that version and channel.\n */\nexport function getNextVersion(channel: ReleaseChannel, release: Exclude<ReleaseType, false>, tags: VersionTags) {\n const reachable = versionsOf(tags.reachable)\n const stable = highest(stableVersions(reachable))\n const target = stable ? semver.inc(stable, release)! : initialVersion\n if (!channel.prerelease) return target\n\n const previous = highest(channelVersions(reachable, channel.prerelease)\n .filter((version) => !stable || semver.gt(version, stable)))\n let core = previous && semver.gte(coreVersion(previous), target) ? coreVersion(previous) : target\n // A stable release of the same version on another branch already shipped; a\n // prerelease of it would sort below `latest`, so target the next version instead.\n const all = versionsOf(tags.all)\n const released = highest(stableVersions(all))\n if (released && semver.lte(core, released)) core = semver.inc(released, release)!\n const numbers = channelVersions(all, channel.prerelease)\n .filter((version) => coreVersion(version) === core)\n .map((version) => semver.prerelease(version)?.[1] ?? 0)\n .filter((number): number is number => Number.isInteger(number))\n return `${core}-${channel.prerelease}.${Math.max(0, ...numbers) + 1}`\n}\n","import { findCommitRule, releaseGroups } from './commits'\nimport type { CommitDecision } from './policy'\n\nexport interface ReleaseNotesOptions {\n version: string\n /** Tag of the previous release, for the compare link. */\n previousTag?: string\n /** Release date as `YYYY-MM-DD`, shown in the heading. */\n date?: string\n /** Repository URL, such as `https://github.com/owner/repo`, for links. */\n repositoryUrl?: string\n /**\n * Starts the notes with a `## <version> (<date>)` heading, for a changelog\n * file. A GitHub release shows its tag and date itself, so its body leaves\n * the heading out and ends with a full changelog link instead.\n */\n heading?: boolean\n commits: CommitDecision[]\n}\n\nconst breakingTitle = '⚠ Breaking Changes'\n\nfunction groupOf(decision: CommitDecision) {\n return findCommitRule(decision.type, decision.scope)?.group\n}\n\n/** Splits text into plain parts and CommonMark code spans: a backtick run closed by a run of the same length. */\nfunction splitCodeSpans(text: string) {\n const parts: Array<{ code: boolean, text: string }> = []\n let plain = ''\n let index = 0\n while (index < text.length) {\n if (text[index] === '\\\\' && text[index + 1] === '`') {\n plain += text.slice(index, index + 2)\n index += 2\n continue\n }\n if (text[index] !== '`') {\n plain += text[index++]\n continue\n }\n const run = /^`+/.exec(text.slice(index))![0]\n const close = new RegExp(`(?<!\\`)${run}(?!\\`)`).exec(text.slice(index + run.length))\n if (!close) {\n plain += run\n index += run.length\n continue\n }\n if (plain) parts.push({ code: false, text: plain })\n plain = ''\n const end = index + run.length + close.index + run.length\n parts.push({ code: true, text: text.slice(index, end) })\n index = end\n }\n if (plain) parts.push({ code: false, text: plain })\n return parts\n}\n\n/**\n * Keeps commit text from acting on GitHub outside code spans: `<` would start\n * HTML, as in `Array<string>`, and `@name` or `@scope/pkg` would notify a user\n * or team on every release.\n */\nfunction escapeMarkdown(text: string) {\n return splitCodeSpans(text).map(({ code, text: part }) => code\n ? part\n : part\n .replace(/</g, '<')\n .replace(/(^|[^\\w`])(@[A-Za-z0-9][\\w-]*(?:\\/[\\w.-]+)?)/g, '$1`$2`')).join('')\n}\n\n/** A list item; continuation lines are indented so they stay in the item. */\nfunction listItem(text: string) {\n return `- ${text.split('\\n').map((line, index) => index && line ? ` ${line}` : line).join('\\n')}`\n}\n\nfunction formatEntry(decision: CommitDecision, repositoryUrl?: string) {\n const summary = escapeMarkdown(decision.subject ?? decision.header)\n const scope = decision.scope ? `**${escapeMarkdown(decision.scope)}:** ` : ''\n const hash = decision.hash ? decision.hash.slice(0, 7) : undefined\n const link = hash\n ? repositoryUrl ? ` ([${hash}](${repositoryUrl}/commit/${decision.hash}))` : ` (${hash})`\n : ''\n return `- ${scope}${summary}${link}`\n}\n\n/** The page that lists every change of a release: the compare view, or the commits of a first release. */\nexport function getChangelogUrl(repositoryUrl: string, version: string, previousTag?: string) {\n const base = repositoryUrl.replace(/\\/+$/, '')\n const tag = `v${version.replace(/^v/, '')}`\n return previousTag ? `${base}/compare/${previousTag}...${tag}` : `${base}/commits/${tag}`\n}\n\n/**\n * Markdown release notes. Only commits that release appear, grouped by type in\n * the order of the commit table; `BREAKING CHANGE:` footers of major releases\n * come first.\n */\nexport function renderReleaseNotes(options: ReleaseNotesOptions) {\n const { previousTag } = options\n const version = options.version.replace(/^v/, '')\n const repositoryUrl = options.repositoryUrl?.replace(/\\/+$/, '')\n const changelogUrl = repositoryUrl ? getChangelogUrl(repositoryUrl, version, previousTag) : undefined\n const sections: string[][] = []\n\n const released = options.commits.filter(({ release }) => release)\n // A `Type!:` header without a footer describes the break with its summary.\n const breaking = released\n .filter(({ release }) => release === 'major')\n .flatMap(({ breakingNotes, breaking: marker, subject }) =>\n breakingNotes?.length ? breakingNotes : marker === 'header' && subject ? [subject] : [])\n if (breaking.length) {\n sections.push([`### ${breakingTitle}`, '', ...breaking.map((note) => listItem(escapeMarkdown(note)))])\n }\n\n const groups = new Map<string, CommitDecision[]>()\n for (const decision of released) {\n const group = groupOf(decision)\n if (!group) continue\n groups.set(group, [...groups.get(group) ?? [], decision])\n }\n for (const group of releaseGroups) {\n const entries = groups.get(group)\n if (!entries) continue\n const sorted = [...entries].sort((a, b) =>\n (a.scope ?? '').localeCompare(b.scope ?? '', 'en') || (a.subject ?? a.header).localeCompare(b.subject ?? b.header, 'en'))\n sections.push([`### ${group}`, '', ...sorted.map((decision) => formatEntry(decision, repositoryUrl))])\n }\n\n if (!sections.length) {\n sections.push([released.length ? 'Version bump only; no other changes to published packages.' : 'No changes to published packages.'])\n }\n\n if (options.heading) {\n const title = changelogUrl ? `[${version}](${changelogUrl})` : version\n sections.unshift([`## ${title}${options.date ? ` (${options.date})` : ''}`])\n } else if (changelogUrl) {\n sections.push([`**Full Changelog**: ${changelogUrl}`])\n }\n return `${sections.map((section) => section.join('\\n')).join('\\n\\n')}\\n`\n}\n"],"mappings":"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"}
|
package/dist/node.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as CommitInput, E as CommitDecision,
|
|
1
|
+
import { D as CommitInput, E as CommitDecision, F as ReleasePolicy, N as ReleaseMode, P as ReleasePathsConfig, Q as ReleaseType, T as AronrepoConfig, i as ReleaseChannel, j as ReleaseAsset } from "./index-CmnjSEga.js";
|
|
2
2
|
export interface PackageJson {
|
|
3
3
|
name?: string;
|
|
4
4
|
version?: string;
|
|
@@ -201,6 +201,8 @@ export interface ReleasePlan {
|
|
|
201
201
|
commits: CommitDecision[];
|
|
202
202
|
notes?: string;
|
|
203
203
|
packages: ReleasePackage[];
|
|
204
|
+
/** Files attached to the GitHub release, from `release.assets`. */
|
|
205
|
+
assets?: ReleaseAsset[];
|
|
204
206
|
}
|
|
205
207
|
export interface PlanReleaseOptions {
|
|
206
208
|
/** Defaults to `GITHUB_REF_NAME`, then the checked-out branch. */
|
|
@@ -245,6 +247,7 @@ export interface ReleaseManifestOptions {
|
|
|
245
247
|
export declare function writeReleaseManifest(cwd: string, dir: string, version: string, gitHead: string, options?: ReleaseManifestOptions): PackageJson;
|
|
246
248
|
/** Reads `package/package.json` from a packed tarball. */
|
|
247
249
|
export declare function readPackedManifest(tarball: string): PackageJson;
|
|
250
|
+
export type GitHubReleaseAsset = ReleaseAsset;
|
|
248
251
|
export interface GitHubRelease {
|
|
249
252
|
tag: string;
|
|
250
253
|
notes: string;
|
|
@@ -253,6 +256,8 @@ export interface GitHubRelease {
|
|
|
253
256
|
target?: string;
|
|
254
257
|
/** Whether the release becomes the repository's latest; defaults to every non-prerelease. */
|
|
255
258
|
latest?: boolean;
|
|
259
|
+
/** Files to attach. A rerun uploads only the assets the release does not have yet. */
|
|
260
|
+
assets?: GitHubReleaseAsset[];
|
|
256
261
|
}
|
|
257
262
|
/** Cuts notes at a line to fit a GitHub release body, keeping the full changelog link. */
|
|
258
263
|
export declare function truncateNotes(notes: string, limit?: number): string;
|
package/dist/node.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as agents, n as check, D as configFileNames, O as detectPackageManager, r as doctor, d as exchangeOidcToken, i as explain, k as explainRange, A as findConfigFile, j as getCliCommand, M as getCommitFiles, N as getCurrentBranch, P as getDiffFiles, F as getGitConfig, I as getLatestTag, L as getProjectCliCommand, R as getRangeCommits, f as getRegistry, p as getReleasePackages, z as getRepositoryRoot, m as getRepositoryUrl, B as getStagedFiles, V as getVersionTags, h as hasRegistryAuth, a as isIgnoredMessage, H as loadConfig, U as loadProjectPolicy, g as officialRegistry, _ as planRelease, o as policy, v as publishGitHubRelease, W as queryPublicWorkspaceDirs, G as queryReleaseDirs, K as queryWorkspaceDirs, y as quoteWindowsArg, s as readAgentsBlock, c as readEditMessage, q as readJsonFile, b as readPackedManifest, J as readWorkspacePackage, Y as readWorkspacePatterns, l as release, x as releaseBodyLimit, u as replaceAgentsBlock, X as resolveReleasePaths, S as runCommand, C as runRelease, w as stagingDistTag, T as truncateNotes, E as writeReleaseManifest } from "./commands-
|
|
1
|
+
export { t as agents, n as check, D as configFileNames, O as detectPackageManager, r as doctor, d as exchangeOidcToken, i as explain, k as explainRange, A as findConfigFile, j as getCliCommand, M as getCommitFiles, N as getCurrentBranch, P as getDiffFiles, F as getGitConfig, I as getLatestTag, L as getProjectCliCommand, R as getRangeCommits, f as getRegistry, p as getReleasePackages, z as getRepositoryRoot, m as getRepositoryUrl, B as getStagedFiles, V as getVersionTags, h as hasRegistryAuth, a as isIgnoredMessage, H as loadConfig, U as loadProjectPolicy, g as officialRegistry, _ as planRelease, o as policy, v as publishGitHubRelease, W as queryPublicWorkspaceDirs, G as queryReleaseDirs, K as queryWorkspaceDirs, y as quoteWindowsArg, s as readAgentsBlock, c as readEditMessage, q as readJsonFile, b as readPackedManifest, J as readWorkspacePackage, Y as readWorkspacePatterns, l as release, x as releaseBodyLimit, u as replaceAgentsBlock, X as resolveReleasePaths, S as runCommand, C as runRelease, w as stagingDistTag, T as truncateNotes, E as writeReleaseManifest } from "./commands-D2xBkCvw.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aronrepo",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Aronrepo: one conventional commit and release policy for owners and coding agents, with commit checks, release decisions, and npm publishing.",
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"@types/picomatch": "^4.0.3",
|
|
55
55
|
"@types/semver": "^7.8.0"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "0a81cbb1eb99530fb4a984b0b90f1a4c34ab3311"
|
|
58
58
|
}
|