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`
- `commitlint.config.js`
- `commitlint.config.cjs`
- `commitlint.config.mjs`
- `commitlint.config.ts`
- `commitlint.config.cts`
- `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)
## 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)
- [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"