{"_id":"@acme-skunkworks/commitlint-config","_rev":"2-48376d70dd0ef033fdf8f51e33ea2649","name":"@acme-skunkworks/commitlint-config","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@acme-skunkworks/commitlint-config","version":"1.0.0","keywords":["commitlint","conventional-commits","config","acme-skunkworks"],"author":{"url":"https://github.com/RobEasthope","name":"Rob Easthope"},"license":"MIT","_id":"@acme-skunkworks/commitlint-config@1.0.0","maintainers":[{"name":"robeasthope","email":"hello@robeasthope.com"}],"homepage":"https://github.com/acme-skunkworks/commitlint-config#readme","bugs":{"url":"https://github.com/acme-skunkworks/commitlint-config/issues"},"dist":{"shasum":"1132f3c626cf5f00daeae96b6b8169d8c66e31e0","tarball":"https://registry.npmjs.org/@acme-skunkworks/commitlint-config/-/commitlint-config-1.0.0.tgz","fileCount":6,"integrity":"sha512-NljKYUUEuNiQxh9yab0hM/yV4gamgVavDMQ9uddXx2lu1gKwp7DE58d7Q8ooPetCD/o0nDrFfT+GpBNqXXFblw==","signatures":[{"sig":"MEYCIQDp6Z6Z6H6PO2ICnnE+s3U1R+SwYAGiTRjyx0W2Hogj8QIhAN3h25lPduswzKAmPG2AYKv+G8KH7y7/jGGQD+OgCBcm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13906},"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"}},"gitHead":"a893a05a36b11693e1aeeb62ea6c780d581ba6b4","scripts":{"tsc":"tsc --noEmit && tsc -p tsconfig.tools.json","lint":"eslint 'src/**/*.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' --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","release:manual:dry":"pnpm run build && npm publish --access public --provenance=false --dry-run","validate:changelog":"pnpm exec changelog-core validate"},"_npmUser":{"name":"robeasthope","email":"hello@robeasthope.com"},"repository":{"url":"git+https://github.com/acme-skunkworks/commitlint-config.git","type":"git"},"_npmVersion":"11.12.1","description":"Shared commitlint configuration for ACME Skunkworks packages.","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","dependencies":{"@commitlint/types":"^21.2.0","@commitlint/config-conventional":"^21.2.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","@commitlint/lint":"^21.2.0","@commitlint/load":"^21.2.0","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/changelog-core":"^1.1.0","@acme-skunkworks/markdownlint-config":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/commitlint-config_1.0.0_1784798712717_0.7205404474201293","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@acme-skunkworks/commitlint-config","version":"1.0.1","description":"Shared commitlint configuration for ACME Skunkworks packages.","keywords":["commitlint","conventional-commits","config","acme-skunkworks"],"homepage":"https://github.com/acme-skunkworks/commitlint-config#readme","bugs":{"url":"https://github.com/acme-skunkworks/commitlint-config/issues"},"repository":{"type":"git","url":"git+https://github.com/acme-skunkworks/commitlint-config.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"}},"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","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","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' --cache --cache-location ./.eslintcache","lint:fix":"eslint 'src/**/*.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":"pnpm exec changelog-core 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' --"]},"dependencies":{"@commitlint/config-conventional":"^21.2.0","@commitlint/types":"^21.2.0"},"devDependencies":{"@acme-skunkworks/changelog-core":"^1.1.0","@acme-skunkworks/eslint-config":"^1.0.4","@acme-skunkworks/markdownlint-config":"^2.0.0","@commitlint/cli":"^21.2.1","@commitlint/lint":"^21.2.0","@commitlint/load":"^21.2.0","@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/commitlint-config@1.0.1","_integrity":"sha512-rBA5icoqnDDfRWadOZzTEGoarAxgqu7WCLiaZyd/wr2DJoVra9RbMF4CrEIdtArVmv/7y6Cs5wbWy6dLA1p9aw==","_resolved":"/home/runner/work/commitlint-config/commitlint-config/.artifact/acme-skunkworks-commitlint-config-1.0.1.tgz","_from":"file:/home/runner/work/commitlint-config/commitlint-config/.artifact/acme-skunkworks-commitlint-config-1.0.1.tgz","_nodeVersion":"22.23.1","_npmVersion":"11.14.1","dist":{"integrity":"sha512-rBA5icoqnDDfRWadOZzTEGoarAxgqu7WCLiaZyd/wr2DJoVra9RbMF4CrEIdtArVmv/7y6Cs5wbWy6dLA1p9aw==","shasum":"2b215a850ef4bbda2635e23c7ea07eed3f036d03","tarball":"https://registry.npmjs.org/@acme-skunkworks/commitlint-config/-/commitlint-config-1.0.1.tgz","fileCount":6,"unpackedSize":16115,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@acme-skunkworks%2fcommitlint-config@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDKhRUBwcRRTXcBWf9nqqzlvfnRFdTbGEG6xvIS9DbfagIhAJ+Br2AjAHyVEfsYFAHW8k6nipfJhvWsgg3HJL6U3f0n"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:85a0486c-580c-4337-a799-46cbcbcbdf04"}},"directories":{},"maintainers":[{"name":"robeasthope","email":"hello@robeasthope.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/commitlint-config_1.0.1_1786108639058_0.78742742776474"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-23T09:25:12.606Z","modified":"2026-08-07T13:17:19.536Z","1.0.0":"2026-07-23T09:25:12.861Z","1.0.1":"2026-08-07T13:17:19.217Z"},"bugs":{"url":"https://github.com/acme-skunkworks/commitlint-config/issues"},"author":{"name":"Rob Easthope","url":"https://github.com/RobEasthope"},"license":"MIT","homepage":"https://github.com/acme-skunkworks/commitlint-config#readme","keywords":["commitlint","conventional-commits","config","acme-skunkworks"],"repository":{"type":"git","url":"git+https://github.com/acme-skunkworks/commitlint-config.git"},"description":"Shared commitlint configuration for ACME Skunkworks packages.","maintainers":[{"name":"robeasthope","email":"hello@robeasthope.com"}],"readme":"# @acme-skunkworks/commitlint-config\n\nShared [commitlint](https://commitlint.js.org) configuration for Rheged Studio packages.\n\nIt **single-sources** the estate's allowed [Conventional Commit](https://www.conventionalcommits.org) types into one published package, consumed by both layers of the commit gate so the ruleset can never drift between them:\n\n- the reusable CI workflow (`reusable-validate-commits.yml`) that validates a PR's `base..head` commit range, and\n- the local husky `pre-push` hook that runs the same range check before a push ever reaches CI.\n\nIt extends [`@commitlint/config-conventional`](https://www.npmjs.com/package/@commitlint/config-conventional) and retains all of its defaults — only the list of allowed commit types is pinned to the estate's set.\n\n## Install\n\n```sh\npnpm add -D @acme-skunkworks/commitlint-config @commitlint/cli\n```\n\n`@commitlint/config-conventional` is a runtime dependency of this package, so installing this config pulls it in automatically — you do not need to add it yourself.\n\n## Usage\n\nPoint your commitlint config at this package:\n\n```js\n// commitlint.config.mjs\nexport default {\n  extends: [\"@acme-skunkworks/commitlint-config\"],\n};\n```\n\nThe example uses `.mjs` so the `export default` works regardless of the consuming project's module type. In an ESM project (`\"type\": \"module\"`) a plain `commitlint.config.js` works too; in a CommonJS project use `.mjs` (as above) or `module.exports` in a `.js`/`.cjs` file.\n\nThen validate a commit-message range — exactly what the CI workflow and the pre-push hook do:\n\n```sh\n# lint every commit on the branch that isn't on the base\npnpm exec commitlint --from \"origin/main\" --to \"HEAD\"\n```\n\n## Allowed commit types\n\nThe `type-enum` rule is set explicitly and is aligned to the estate's release-please bump rules:\n\n| Type       | Release bump | Notes                                  |\n| ---------- | ------------ | -------------------------------------- |\n| `feat`     | minor        | A new feature                          |\n| `fix`      | patch        | A bug fix                              |\n| `perf`     | patch        | A performance improvement              |\n| `revert`   | patch        | Reverts a previous commit              |\n| `chore`    | none         | Tooling / housekeeping                 |\n| `docs`     | none         | Documentation only                     |\n| `ci`       | none         | CI configuration and pipelines         |\n| `build`    | none         | Build system or external dependencies  |\n| `refactor` | none         | Neither fixes a bug nor adds a feature |\n| `test`     | none         | Adding or correcting tests             |\n| `style`    | none         | Formatting; no code-behaviour change   |\n\nA `!` marker or a `BREAKING CHANGE:` footer promotes any type to a **major** bump.\n\nEverything else is inherited from `@commitlint/config-conventional` unchanged, including:\n\n- a non-empty commit type and subject,\n- the header max-length limit, and\n- `defaultIgnores` — merge (`Merge …`), revert (`Revert …`), `fixup!` and `squash!` messages are skipped automatically, so this config never needs to blanket-ignore them by author identity.\n\n## Bot-authored commits\n\n**There is no identity denylist.** Bots are validated exactly like everyone else — the config has no `ignores` entry, and none should be added. Every automated commit producer in the estate already emits a Conventional subject, verified against this ruleset:\n\n| Producer                        | Subject                                           |\n| ------------------------------- | ------------------------------------------------- |\n| Dependabot (github-actions)     | `ci(deps): bump the actions group with 3 updates` |\n| Dependabot (npm)                | `chore(deps): …` / `chore(deps-dev): …`           |\n| release-please                  | `chore: release main`                             |\n| `reusable-changelog-enrich.yml` | `chore(changelog): enrich post-merge metadata`    |\n\nDependabot's subjects come from a `commit-message` template in each repo's `.github/dependabot.yml`, which sets `prefix` (plus `prefix-development` for the npm ecosystem) and `include: scope`. Without that template Dependabot falls back to inferring a prefix from recent commit history — which may yield a Conventional subject, but is not guaranteed to, and can leave a bare `Bump …` that would fail the gate. The explicit template is what makes the output deterministic, which is why it is a prerequisite for making the gate a required check rather than an optional nicety ([A-980](https://linear.app/rheged-studio/issue/A-980)).\n\nTwo inherited rules are worth knowing when reading a bot commit:\n\n- **`header-max-length` (100) is the one real ceiling.** This is why Dependabot bumps are grouped — a grouped subject stays short (`bump the actions group with 3 updates`), whereas an ungrouped multi-package subject can run past 100 characters and fail.\n- **`body-max-line-length` (100) ignores unbreakable lines.** Dependabot bodies contain compare URLs well over 100 characters; those pass, because the rule only trips on over-long lines that could have been wrapped. A long prose line still fails.\n\nShould a bot ever need an exception, prefer fixing its commit template. A per-identity `ignores` entry is a documented last resort, not a first move.\n\n## Versioning: float on latest\n\nThe gate is designed to track this config's **latest published version** rather than pinning it, mirroring how the estate floats on its shared GitHub workflows (`@v1`). The reusable CI workflow installs the config fresh on each run, so a caret range with no committed lockfile resolves to the latest published version — a ruleset change reaches the gate on its next run, with no per-repo bump PR.\n\nWhere a consumer instead commits a lockfile (for example the local pre-push hook running in a repo that pins its dev-dependencies), the resolved version stays put until it is updated: the package is Dependabot-versioned like the estate's other shared packages, so those consumers get update PRs. The trade-off is deliberate — because a ruleset change reaches the floating consumers immediately, edits must be made carefully.\n\n## Development\n\n```sh\npnpm install\npnpm build   # tsc → dist/ (the published artifact)\npnpm test    # vitest — behavioural tests over the resolved ruleset\npnpm tsc     # type-check\npnpm lint    # eslint\n```\n\nThe ruleset itself is `src/index.ts`; `src/index.test.ts` exercises the _effective_ config by resolving `extends` through `@commitlint/load` and linting sample messages with `@commitlint/lint`.\n\n## Licence\n\nMIT\n","readmeFilename":"README.md"}