base on 📓 Lint commit messages # [Get Started](https://commitlint.js.org/guides/getting-started) | [Website](https://commitlint.js.org) > Lint commit messages <p align="center"> <img width="600" src="docs/public/assets/commitlint.svg"> </p> > Demo generated with [svg-term-cli](https://github.com/marionebl/svg-term-cli) > > `cat docs/assets/commitlint.json | svg-term --out docs/public/assets/commitlint.svg --frame --profile=Seti --height=20 --width=80` [![npm latest][2]][3] [![node compatibility][13]][14] [![Github Actions][4]][5] - 🚓 Be a good `commitizen` - 📦 Share configuration via `npm` - 🤖 Tap into `conventional-changelog` ## Contents - [Get Started | Website](#get-started--website) - [Contents](#contents) - [What is commitlint](#what-is-commitlint) - [Benefits of using commitlint](#benefits-of-using-commitlint) - [Getting started](#getting-started) - [CLI](#cli) - [Config](#config) - [Shared configuration](#shared-configuration) - [Documentation](#documentation) - [API](#api) - [Tools](#tools) - [Roadmap](#roadmap) - [Version Support and Releases](#version-support-and-releases) - [Releases](#releases) - [Related projects](#related-projects) - [License](#license) - [Development](#development) - [Install and run](#install-and-run) --- ## What is commitlint commitlint checks if your commit messages meet the [conventional commit format](https://conventionalcommits.org). In general the pattern mostly looks like this: ```sh type(scope?): subject #scope is optional; multiple scopes are supported (current delimiter options: "/", "\" and ",") ``` Real world examples can look like this: ```text chore: run tests on travis ci ``` ```text fix(server): send cors headers ``` ```text feat(blog): add comment section ``` Common types according to [commitlint-config-conventional (based on the Angular convention)](https://github.com/conventional-changelog/commitlint/tree/master/@commitlint/config-conventional#type-enum) can be: - build - chore - ci - docs - feat - fix - perf - refactor - revert - style - test These can be modified by [your own configuration](#config). ### Benefits of using commitlint - [Why Use Conventional Commits?](https://www.conventionalcommits.org/en/v1.0.0-beta.2/#why-use-conventional-commits) - ["The perks of committing with conventions" (Talk slides)](https://slides.com/marionebl/the-perks-of-committing-with-conventions#/) ## Getting started - [Local setup](https://commitlint.js.org/guides/local-setup) - Lint messages on commit with husky - [CI setup](https://commitlint.js.org/guides/ci-setup) - Lint messages during CI builds ## CLI - Primary way to interact with commitlint. - `npm install --save-dev @commitlint/cli` - Packages: [cli](./@commitlint/cli) ## Config - Configuration is picked up from: - `.commitlintrc` - `.commitlintrc.json` - `.commitlintrc.yaml` - `.commitlintrc.yml` - `.commitlintrc.js` - `.commitlintrc.cjs` - `.commitlintrc.mjs` - `.commitlintrc.ts` - `.commitlintrc.cts` - `.commitlintrc.mts` - `commitlint.config.js` - `commitlint.config.cjs` - `commitlint.config.mjs` - `commitlint.config.ts` - `commitlint.config.cts` - `commitlint.config.mts` - `commitlint` field in `package.json` - `commitlint` field in [`package.yaml`](https://github.com/pnpm/pnpm/pull/1799) - Packages: [cli](./@commitlint/cli), [core](./@commitlint/core) - See [Rules](./docs/reference/rules.md) for a complete list of possible rules - An example configuration can be found at [@commitlint/config-conventional](./@commitlint/config-conventional/src/index.ts) ### Important note about Node 24+ Node v24 changes the way that modules are loaded, and this includes the commitlint config file. If your project does not contain a `package.json`, commitlint may fail to load the config, resulting in a `Please add rules to your commitlint.config.js` error message. This can be fixed by doing either of the following: - Add a `package.json` file, declaring your project as an ES6 module. This can be done easily by running `npm init es6`. - Rename the config file from `commitlint.config.js` to `commitlint.config.mjs`. ## Shared configuration A number of shared configurations are available to install and use with `commitlint`: - [@commitlint/config-angular](./@commitlint/config-angular) - [@commitlint/config-conventional](./@commitlint/config-conventional) - [@commitlint/config-lerna-scopes](./@commitlint/config-lerna-scopes) - [@commitlint/config-nx-scopes](./@commitlint/config-nx-scopes) - [@commitlint/config-patternplate](./@commitlint/config-patternplate) - [@commitlint/config-workspace-scopes](./@commitlint/config-workspace-scopes) - [conventional-changelog-lint-config-atom](https://github.com/erikmueller/conventional-changelog-lint-config-atom) - [conventional-changelog-lint-config-canonical](https://github.com/gajus/conventional-changelog-lint-config-canonical) > ⚠️ If you want to publish your own shareable config then make sure it has a name aligning with the pattern `commitlint-config-emoji-log` or `commitlint-config-your-config-name` — then in extend all you have to write is `emoji-log` or `your-config-name`. ## Documentation Check the [main website](https://commitlint.js.org/). ## API - Alternative, programmatic way to interact with `commitlint` - Packages: - [format](./@commitlint/format) - Format commitlint reports - [lint](./@commitlint/lint) - Lint a string against commitlint rules - [load](./@commitlint/load) - Load shared commitlint configuration - [read](./@commitlint/read) - Read commit messages from a specified range or last edit - See [API](./docs/api) for a complete list of methods and examples ## Tools - [commitizen adapter](./@commitlint/prompt) - [prompt](./@commitlint/prompt-cli) ## Roadmap `commitlint` is considered stable and is used in various projects as a development tool. > **Ideas**: [conventional-changelog/commitlint#94](https://github.com/conventional-changelog/commitlint/issues/94) ## Version Support and Releases - Node.js [LTS](https://github.com/nodejs/LTS#lts-schedule) `>= 18` - git `>= 2.13.2` ### Releases Security patches will be applied to versions which are not yet EOL.\ Features will only be applied to the current main version. | Release | Initial release | | -------------------------------------------------------------------------------- | --------------- | | [v19](https://github.com/conventional-changelog/commitlint/releases/tag/v19.0.0) | 02/2024 | | [v18](https://github.com/conventional-changelog/commitlint/releases/tag/v18.0.0) | 10/2023 | EOL is usually after around a year. We're not a sponsored OSS project. Therefore we can't promise that we will release patch versions for older releases in a timely manner.\ If you are stuck on an older version and need a security patch we're happy if you can provide a PR. ## Related projects - [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) Generate a changelog from conventional commit history - [commitizen](https://github.com/commitizen/cz-cli) Simple commit conventions for internet citizens - [create-semantic-module](https://github.com/jlegrone/create-semantic-module) CLI for quickly integrating commitizen and commitlint in new or existing projects ## License Copyright by @marionebl. All `commitlint` packages are released under the MIT license. ## Development `commitlint` is developed in a mono repository. ### Install and run ```sh git clone [email protected]:conventional-changelog/commitlint.git cd commitlint yarn yarn run build # run build tasks yarn start # run tests, again on change yarn run commitlint # run CLI ``` For more information on how to contribute please take a look at our [contribution guide](./.github/CONTRIBUTING.md). [0]: https://img.shields.io/badge/stability-stable-green.svg?style=flat-square [1]: https://nodejs.org/api/documentation.html#documentation_stability_index [2]: https://img.shields.io/npm/v/@commitlint/cli.svg?style=flat-square [3]: https://npmjs.org/package/@commitlint/cli [4]: https://github.com/conventional-changelog/commitlint/actions/workflows/CI.yml/badge.svg [5]: https://github.com/conventional-changelog/commitlint/actions/workflows/CI.yml [8]: https://img.shields.io/badge/stability-experimental-orange.svg?style=flat-square [9]: https://nodejs.org/api/documentation.html#documentation_stability_index [10]: https://img.shields.io/npm/v/@commitlint/cli/next.svg?style=flat-square [13]: https://img.shields.io/node/v/@commitlint/cli.svg [14]: https://nodejs.org/en/about/previous-releases ", Assign "at most 3 tags" to the expected json: {"id":"4801","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"