{"_id":"@acme-skunkworks/changelog-core","_rev":"3-4856e2742dc20c33ca26cff6aec26db6","name":"@acme-skunkworks/changelog-core","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@acme-skunkworks/changelog-core","version":"1.0.0","keywords":["changelog","release-notes","validate","enrich","finalise"],"author":{"url":"https://github.com/RobEasthope","name":"Rob Easthope"},"license":"MIT","_id":"@acme-skunkworks/changelog-core@1.0.0","maintainers":[{"name":"robeasthope","email":"hello@robeasthope.com"}],"homepage":"https://github.com/acme-skunkworks/changelog-core#readme","bugs":{"url":"https://github.com/acme-skunkworks/changelog-core/issues"},"bin":{"changelog-core":"dist/cli.js"},"dist":{"shasum":"ac6371e31dc41b052674c26cd6681db875df4b3a","tarball":"https://registry.npmjs.org/@acme-skunkworks/changelog-core/-/changelog-core-1.0.0.tgz","fileCount":62,"integrity":"sha512-cRh+mrjSwKPWkjsruMpE/X7paVYVhPuJZim5r3Xj8JO/ae1duj/juLqsCmcTuupvBNV4UkYQLROd6asEISBoVQ==","signatures":[{"sig":"MEUCIEMRY0jWcQBCCKGQtpaj8Qt9uwemQQz16cjJE0Lq2aAKAiEAy8EpCYRjFVs3z2Ht2QVnAPOWEodiulw4DME3BxTFdr0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140160},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./contract":"./changelog-contract.md"},"gitHead":"e3f9afafd25eab24d9d62d0f85e3fa759470c2cc","scripts":{"tsc":"tsc --noEmit && tsc -p tsconfig.tools.json","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' --cache --cache-location ./.eslintcache","test":"vitest run","build":"tsc","clean":"rimraf node_modules dist","act:ci":"act pull_request -W .github/workflows/ci.yml --eventpath .github/act-events/pull_request.json","format":"prettier --write .","ci:list":"gh run list --limit 10","ci:view":"gh run view","lint:md":"markdownlint-cli2 '**/*.{md,mdx}' '!**/node_modules/**' '!**/dist/**' '!**/.turbo/**' '!**/.astro/**'","lint:sh":"bash -c 'if command -v shellcheck >/dev/null 2>&1; then shellcheck infrastructure/scripts/*.sh .husky/pre-commit .husky/pre-push .husky/commit-msg; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  shellcheck not installed — skipping. Install: brew install shellcheck\"; else echo \"⚠️  shellcheck not installed — skipping. Install: apt-get install shellcheck\"; fi'","prepare":"husky","test:sh":"bash -c 'if command -v bats >/dev/null 2>&1; then bats infrastructure/tests/*.bats; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  bats not installed — skipping. Install: brew install bats-core\"; else echo \"⚠️  bats not installed — skipping. Install: apt-get install bats\"; fi'","act:list":"act --list","ci:watch":"gh run watch $(gh run list -L 1 --json databaseId -q '.[0].databaseId // empty')","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix --cache --cache-location ./.eslintcache","lint:yaml":"yamllint .","test:watch":"vitest","lint:md:fix":"markdownlint-cli2 --fix '**/*.{md,mdx}' '!**/node_modules/**' '!**/dist/**' '!**/.turbo/**' '!**/.astro/**'","sort-pkg-json":"sort-package-json","lint:workflows":"actionlint","prepublishOnly":"pnpm run build","release:manual":"pnpm run build && npm publish --access public --provenance=false","act:release:dry":"act push -W .github/workflows/pkg-release.yml","changelog:enrich":"tsx src/cli.ts --config config.json enrich","changelog:finalise":"tsx src/cli.ts --config config.json finalise","release:manual:dry":"pnpm run build && npm publish --access public --provenance=false --dry-run","validate:changelog":"tsx src/cli.ts --config config.json validate"},"_npmUser":{"name":"robeasthope","email":"hello@robeasthope.com"},"repository":{"url":"git+https://github.com/acme-skunkworks/changelog-core.git","type":"git"},"_npmVersion":"11.12.1","description":"Shared changelog contract and dual-runtime CLI for Acme Skunkworks — validate, enrich, and finalise dated changelog entries.","directories":{},"lint-staged":{"**/*":["prettier --write --ignore-unknown"],"**/*.{md,mdx}":["bash -c 'markdownlint-cli2 --fix --config ./.markdownlint-cli2.jsonc \"$@\" || true' --"],"**/*.{yml,yaml}":["bash -c 'if command -v yamllint >/dev/null 2>&1; then yamllint \"$@\"; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  yamllint not installed — skipping. Install with: brew install yamllint\"; else echo \"⚠️  yamllint not installed — skipping. Install with: pip install --user yamllint==1.37.1\"; fi' --"],"**/package.json":["bash -c 'sort-package-json \"$@\" || true' --","bash -c 'pnpm exec eslint --fix --cache --cache-location ./.eslintcache \"$@\" || true' --"],"**/*.{ts,tsx,js,mjs,cjs}":["bash -c 'pnpm exec eslint --fix --cache --cache-location ./.eslintcache \"$@\" || true' --"],".github/workflows/*.{yml,yaml}":["bash -c 'if command -v actionlint >/dev/null 2>&1; then actionlint \"$@\"; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  actionlint not installed — skipping. Install with: brew install actionlint\"; else echo \"⚠️  actionlint not installed — skipping. Install via: bash <(curl -fsSL https://raw.githubusercontent.com/rhysd/actionlint/v1.7.5/scripts/download-actionlint.bash)\"; fi' --"]},"_nodeVersion":"26.0.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.21.1","bats":"1.13.0","jiti":"^2.7.0","husky":"^9.1.7","eslint":"^9.0.0","rimraf":"^6.0.1","vitest":"^4.1.6","prettier":"^3.0.0","typescript":"^6.0.3","@types/node":"^25.6.0","lint-staged":"^16.3.2","markdownlint-cli2":"^0.18.1","sort-package-json":"^3.6.1","prettier-plugin-tailwindcss":"^0.8.0","@acme-skunkworks/eslint-config":"^1.0.4","@acme-skunkworks/markdownlint-config":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/changelog-core_1.0.0_1783685087105_0.2587942417477056","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@acme-skunkworks/changelog-core","version":"1.1.0","keywords":["changelog","release-notes","validate","enrich","finalise"],"author":{"url":"https://github.com/RobEasthope","name":"Rob Easthope"},"license":"MIT","_id":"@acme-skunkworks/changelog-core@1.1.0","maintainers":[{"name":"robeasthope","email":"hello@robeasthope.com"}],"homepage":"https://github.com/acme-skunkworks/changelog-core#readme","bugs":{"url":"https://github.com/acme-skunkworks/changelog-core/issues"},"bin":{"changelog-core":"dist/cli.js"},"dist":{"shasum":"8bff0e2eba46d00eecbf4b4e3c4437d73dec23b6","tarball":"https://registry.npmjs.org/@acme-skunkworks/changelog-core/-/changelog-core-1.1.0.tgz","fileCount":62,"integrity":"sha512-uSPCbspEt77l9k+q3EGpiey/RsuDC40+v1XJUa8U0sNP/P/U6N3TOpJ+t9FVOUvyau4FrpnSdol6YVJcd7ti7A==","signatures":[{"sig":"MEYCIQDy81X3y98qOSOrN8uZ2usc1dIcRSr9UEVh5VEE+w3CzAIhAJ8bY3rdc72Cq+1DUiCrLvq2h2GMxiEUxXBMd+Zp/bpC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@acme-skunkworks%2fchangelog-core@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":140492},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/changelog-core/changelog-core/.artifact/acme-skunkworks-changelog-core-1.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./contract":"./changelog-contract.md"},"scripts":{"tsc":"tsc --noEmit && tsc -p tsconfig.tools.json","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' --cache --cache-location ./.eslintcache","test":"vitest run","build":"tsc","clean":"rimraf node_modules dist","act:ci":"act pull_request -W .github/workflows/ci.yml --eventpath .github/act-events/pull_request.json","format":"prettier --write .","ci:list":"gh run list --limit 10","ci:view":"gh run view","lint:md":"markdownlint-cli2 '**/*.{md,mdx}' '!**/node_modules/**' '!**/dist/**' '!**/.turbo/**' '!**/.astro/**'","lint:sh":"bash -c 'if command -v shellcheck >/dev/null 2>&1; then shellcheck infrastructure/scripts/*.sh .husky/pre-commit .husky/pre-push .husky/commit-msg; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  shellcheck not installed — skipping. Install: brew install shellcheck\"; else echo \"⚠️  shellcheck not installed — skipping. Install: apt-get install shellcheck\"; fi'","prepare":"husky","test:sh":"bash -c 'if command -v bats >/dev/null 2>&1; then bats infrastructure/tests/*.bats; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  bats not installed — skipping. Install: brew install bats-core\"; else echo \"⚠️  bats not installed — skipping. Install: apt-get install bats\"; fi'","act:list":"act --list","ci:watch":"gh run watch $(gh run list -L 1 --json databaseId -q '.[0].databaseId // empty')","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix --cache --cache-location ./.eslintcache","lint:yaml":"yamllint .","test:watch":"vitest","lint:md:fix":"markdownlint-cli2 --fix '**/*.{md,mdx}' '!**/node_modules/**' '!**/dist/**' '!**/.turbo/**' '!**/.astro/**'","sort-pkg-json":"sort-package-json","lint:workflows":"actionlint","prepublishOnly":"pnpm run build","release:manual":"pnpm run build && npm publish --access public --provenance=false","act:release:dry":"act push -W .github/workflows/pkg-release.yml","changelog:enrich":"tsx src/cli.ts --config config.json enrich","changelog:finalise":"tsx src/cli.ts --config config.json finalise","release:manual:dry":"pnpm run build && npm publish --access public --provenance=false --dry-run","validate:changelog":"tsx src/cli.ts --config config.json validate"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a7091e90-1862-44a1-827e-d6838935be52"}},"_resolved":"/home/runner/work/changelog-core/changelog-core/.artifact/acme-skunkworks-changelog-core-1.1.0.tgz","_integrity":"sha512-uSPCbspEt77l9k+q3EGpiey/RsuDC40+v1XJUa8U0sNP/P/U6N3TOpJ+t9FVOUvyau4FrpnSdol6YVJcd7ti7A==","repository":{"url":"git+https://github.com/acme-skunkworks/changelog-core.git","type":"git"},"_npmVersion":"11.14.1","description":"Shared changelog contract and dual-runtime CLI for Acme Skunkworks — validate, enrich, and finalise dated changelog entries.","directories":{},"lint-staged":{"**/*":["prettier --write --ignore-unknown"],"**/*.{md,mdx}":["bash -c 'markdownlint-cli2 --fix --config ./.markdownlint-cli2.jsonc \"$@\" || true' --"],"**/*.{yml,yaml}":["bash -c 'if command -v yamllint >/dev/null 2>&1; then yamllint \"$@\"; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  yamllint not installed — skipping. Install with: brew install yamllint\"; else echo \"⚠️  yamllint not installed — skipping. Install with: pip install --user yamllint==1.37.1\"; fi' --"],"**/package.json":["bash -c 'sort-package-json \"$@\" || true' --","bash -c 'pnpm exec eslint --fix --cache --cache-location ./.eslintcache \"$@\" || true' --"],"**/*.{ts,tsx,js,mjs,cjs}":["bash -c 'pnpm exec eslint --fix --cache --cache-location ./.eslintcache \"$@\" || true' --"],".github/workflows/*.{yml,yaml}":["bash -c 'if command -v actionlint >/dev/null 2>&1; then actionlint \"$@\"; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  actionlint not installed — skipping. Install with: brew install actionlint\"; else echo \"⚠️  actionlint not installed — skipping. Install via: bash <(curl -fsSL https://raw.githubusercontent.com/rhysd/actionlint/v1.7.5/scripts/download-actionlint.bash)\"; fi' --"]},"_nodeVersion":"22.23.1","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.21.1","bats":"1.13.0","jiti":"^2.7.0","husky":"^9.1.7","eslint":"^9.0.0","rimraf":"^6.0.1","vitest":"^4.1.6","prettier":"^3.0.0","typescript":"^6.0.3","@types/node":"^25.6.0","lint-staged":"^16.3.2","markdownlint-cli2":"^0.18.1","sort-package-json":"^3.6.1","prettier-plugin-tailwindcss":"^0.8.0","@acme-skunkworks/eslint-config":"^1.0.4","@acme-skunkworks/markdownlint-config":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/changelog-core_1.1.0_1783686741868_0.6999631602207423","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@acme-skunkworks/changelog-core","version":"1.1.1","description":"Shared changelog contract and dual-runtime CLI for Acme Skunkworks — validate, enrich, and finalise dated changelog entries.","keywords":["changelog","release-notes","validate","enrich","finalise"],"homepage":"https://github.com/acme-skunkworks/changelog-core#readme","bugs":{"url":"https://github.com/acme-skunkworks/changelog-core/issues"},"repository":{"type":"git","url":"git+https://github.com/acme-skunkworks/changelog-core.git"},"license":"MIT","author":{"name":"Rob Easthope","url":"https://github.com/RobEasthope"},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./contract":"./changelog-contract.md"},"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","bin":{"changelog-core":"dist/cli.js"},"scripts":{"act:ci":"act pull_request -W .github/workflows/ci.yml --eventpath .github/act-events/pull_request.json","act:list":"act --list","act:release:dry":"act push -W .github/workflows/pkg-release.yml","build":"tsc","changelog:enrich":"tsx src/cli.ts --config config.json enrich","changelog:finalise":"tsx src/cli.ts --config config.json finalise","ci:list":"gh run list --limit 10","ci:view":"gh run view","ci:watch":"gh run watch $(gh run list -L 1 --json databaseId -q '.[0].databaseId // empty')","clean":"rimraf node_modules dist","format":"prettier --write .","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' --cache --cache-location ./.eslintcache","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix --cache --cache-location ./.eslintcache","lint:md":"markdownlint-cli2 '**/*.{md,mdx}' '!**/node_modules/**' '!**/dist/**' '!**/.turbo/**' '!**/.astro/**'","lint:md:fix":"markdownlint-cli2 --fix '**/*.{md,mdx}' '!**/node_modules/**' '!**/dist/**' '!**/.turbo/**' '!**/.astro/**'","lint:sh":"bash -c 'if command -v shellcheck >/dev/null 2>&1; then shellcheck infrastructure/scripts/*.sh .husky/pre-commit .husky/pre-push .husky/commit-msg; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  shellcheck not installed — skipping. Install: brew install shellcheck\"; else echo \"⚠️  shellcheck not installed — skipping. Install: apt-get install shellcheck\"; fi'","lint:workflows":"actionlint","lint:yaml":"yamllint .","prepare":"husky","prepublishOnly":"pnpm run build","release:manual":"pnpm run build && npm publish --access public --provenance=false","release:manual:dry":"pnpm run build && npm publish --access public --provenance=false --dry-run","sort-pkg-json":"sort-package-json","test":"vitest run","test:sh":"bash -c 'if command -v bats >/dev/null 2>&1; then bats infrastructure/tests/*.bats; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  bats not installed — skipping. Install: brew install bats-core\"; else echo \"⚠️  bats not installed — skipping. Install: apt-get install bats\"; fi'","test:watch":"vitest","tsc":"tsc --noEmit && tsc -p tsconfig.tools.json","validate:changelog":"tsx src/cli.ts --config config.json validate"},"lint-staged":{"**/*":["prettier --write --ignore-unknown"],"**/*.{ts,tsx,js,mjs,cjs}":["bash -c 'pnpm exec eslint --fix --cache --cache-location ./.eslintcache \"$@\" || true' --"],"**/package.json":["bash -c 'sort-package-json \"$@\" || true' --","bash -c 'pnpm exec eslint --fix --cache --cache-location ./.eslintcache \"$@\" || true' --"],"**/*.{md,mdx}":["bash -c 'markdownlint-cli2 --fix --config ./.markdownlint-cli2.jsonc \"$@\" || true' --"],"**/*.{yml,yaml}":["bash -c 'if command -v yamllint >/dev/null 2>&1; then yamllint \"$@\"; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  yamllint not installed — skipping. Install with: brew install yamllint\"; else echo \"⚠️  yamllint not installed — skipping. Install with: pip install --user yamllint==1.37.1\"; fi' --"],".github/workflows/*.{yml,yaml}":["bash -c 'if command -v actionlint >/dev/null 2>&1; then actionlint \"$@\"; elif [ \"$(uname -s)\" = \"Darwin\" ]; then echo \"⚠️  actionlint not installed — skipping. Install with: brew install actionlint\"; else echo \"⚠️  actionlint not installed — skipping. Install via: bash <(curl -fsSL https://raw.githubusercontent.com/rhysd/actionlint/v1.7.5/scripts/download-actionlint.bash)\"; fi' --"]},"devDependencies":{"@acme-skunkworks/commitlint-config":"^1.0.0","@acme-skunkworks/eslint-config":"^1.0.4","@acme-skunkworks/markdownlint-config":"^2.0.0","@commitlint/cli":"^21.2.1","@types/node":"^25.6.0","bats":"1.13.0","eslint":"^9.0.0","husky":"^9.1.7","jiti":"^2.7.0","lint-staged":"^16.3.2","markdownlint-cli2":"^0.18.1","prettier":"^3.0.0","prettier-plugin-tailwindcss":"^0.8.0","rimraf":"^6.0.1","sort-package-json":"^3.6.1","tsx":"^4.21.1","typescript":"^6.0.3","vitest":"^4.1.6"},"packageManager":"pnpm@10.33.0","engines":{"node":">=22"},"publishConfig":{"access":"public","provenance":true},"_id":"@acme-skunkworks/changelog-core@1.1.1","_integrity":"sha512-R54sMZZmm8++61Okv1YggJOsGAjMZ/JQ0Hp6zd1XWfvo2K9/xBhC3+VN9sKlp//6b99e/A9v9Y/oBQGmmyLbZA==","_resolved":"/home/runner/work/changelog-core/changelog-core/.artifact/acme-skunkworks-changelog-core-1.1.1.tgz","_from":"file:/home/runner/work/changelog-core/changelog-core/.artifact/acme-skunkworks-changelog-core-1.1.1.tgz","_nodeVersion":"22.23.1","_npmVersion":"11.14.1","dist":{"integrity":"sha512-R54sMZZmm8++61Okv1YggJOsGAjMZ/JQ0Hp6zd1XWfvo2K9/xBhC3+VN9sKlp//6b99e/A9v9Y/oBQGmmyLbZA==","shasum":"1c5e7ad2118dff2416d45f571def02fa342e2bc1","tarball":"https://registry.npmjs.org/@acme-skunkworks/changelog-core/-/changelog-core-1.1.1.tgz","fileCount":62,"unpackedSize":140912,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@acme-skunkworks%2fchangelog-core@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDiEIbMox935GF0SAFJaRoa5FpUwMplP3y2+BK7XmfBjQIhAPTI7olNVVB87Jgo5wbDHvBxLbG8u7beyySlYJ+3VT5P"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a7091e90-1862-44a1-827e-d6838935be52"}},"directories":{},"maintainers":[{"name":"robeasthope","email":"hello@robeasthope.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/changelog-core_1.1.1_1786105138775_0.6279668846914048"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-10T12:04:46.955Z","modified":"2026-08-07T12:18:59.245Z","1.0.0":"2026-07-10T12:04:47.236Z","1.1.0":"2026-07-10T12:32:22.006Z","1.1.1":"2026-08-07T12:18:58.925Z"},"bugs":{"url":"https://github.com/acme-skunkworks/changelog-core/issues"},"author":{"name":"Rob Easthope","url":"https://github.com/RobEasthope"},"license":"MIT","homepage":"https://github.com/acme-skunkworks/changelog-core#readme","keywords":["changelog","release-notes","validate","enrich","finalise"],"repository":{"type":"git","url":"git+https://github.com/acme-skunkworks/changelog-core.git"},"description":"Shared changelog contract and dual-runtime CLI for Acme Skunkworks — validate, enrich, and finalise dated changelog entries.","maintainers":[{"name":"robeasthope","email":"hello@robeasthope.com"}],"readme":"# @acme-skunkworks/changelog-core\n\nShared **changelog contract** and dual-runtime **CLI** for Rheged Studio —\nvalidate, enrich, and finalise dated `changelog/` entries from CI **and** local\ndev. One package replaces the triplicated skill `.mjs` + per-repo\n`infrastructure/scripts` copies.\n\nZero runtime dependencies (Node built-ins only). Node 22+.\n\n## Install\n\n```bash\npnpm add -D @acme-skunkworks/changelog-core\n```\n\n## Config\n\nCommands resolve config from the **consumer repo** (not the package install\npath), in order:\n\n1. `--config <path>` (CLI)\n2. `CHANGELOG_CONFIG` env\n3. `.claude/skills/changelog/config.json`\n4. `.agents/skills/changelog/config.json`\n5. `config.json` (committed repo-root — stopgap while skill `config.json` stays\n   gitignored; see [A-812](https://linear.app/rheged-studio/issue/A-812))\n\nRequired identity keys: `issueKeys`, `linearWorkspaceSlug`. Structural keys\n(`baseBranch`, `changelogDir`, `packageRoots`, `fallbackPackage`,\n`affectedPackages`) have safe defaults.\n\n## CLI\n\n```bash\nnpx changelog-core [--config <path>] <subcommand> [args…]\nnpx changelog-core --version\n```\n\n| Subcommand              | Purpose                                                           |\n| ----------------------- | ----------------------------------------------------------------- |\n| `validate`              | Schema-check every dated entry under `changelog/`                 |\n| `enrich`                | Fill post-merge fields for one entry (env-driven; deploy targets) |\n| `finalise`              | Release-time enrich + version stamp (npm targets)                 |\n| `set-affected-packages` | Write `affected_packages` from the branch diff (monorepos)        |\n| `add-links`             | Rewrite bare Linear IDs in bodies to links                        |\n| `backfill-commits`      | One-off backfill of `stats.commits`                               |\n| `check-completeness`    | Gate a release-triggering PR title on a changelog entry           |\n\nLocal scripts in this repo:\n\n```bash\npnpm validate:changelog\npnpm changelog:enrich\npnpm changelog:finalise\n```\n\n## Contract\n\nThe frontmatter schema and field-ownership rules live in\n[`changelog-contract.md`](changelog-contract.md) (also importable as\n`@acme-skunkworks/changelog-core/contract`).\n\n`merge_strategy` is **not** part of the contract (A-802). Existing entries that\nstill carry the key validate fine — unknown keys are ignored.\n\n## Library\n\n```ts\nimport {\n  validateEntry,\n  enrichFrontmatter,\n  parseFrontmatter,\n  loadConfig,\n} from \"@acme-skunkworks/changelog-core\";\n```\n\nSee `src/index.ts` for the full public surface (frontmatter, config, enrich,\nstamp, derive-packages, completeness helpers, …).\n\n## Development\n\n```bash\npnpm install\npnpm run build\npnpm test\npnpm lint\npnpm tsc\n```\n\n## Licence\n\nMIT\n","readmeFilename":"README.md"}