github: https://github.com/Zhengqbbb website: https://cz-git.qbenben.com/ What is cz-git? : A Node.js-based command-line tool that assists in generating standardized and standardized commit messages. What is commitizen git commit : Replace the plugin for the commitizen command line tool. What is an adapter interactive Why do it For the past year, I have been committing almost every day, and as a lazy software engineer, I realized that almost all commitizen adapters are not very comfortable for me to use. For example, if I repaired the table in the monorepo ui library, I must subconsciously fix the table. Why do I need to keep selecting up and down? I just want to press Enter to output , to press Enter to output .So much so that I made the cz-git adapter. fi fix ta table recipes Let me introduce the use of cz-git scopes scopes, usually to define the scope of this commit, there are generally two types: according to the such as monorepo , the other is project code distinction project business distinction scopes for project code If you need to manage multiple packages for a better experience, for example, use: | to manage monorepo you can Use the and modules to dynamically define the scopes (scopes) display in the commit message. pnpm lerna.js path fs // .commitlintrc.js const fs = require('fs') const path = require('path') const packages = fs.readdirSync(path.resolve(__dirname, 'packages')) module.exports = { prompt: { scopes: [...packages] } } If you define a using the rule, it will be imported automatically. scope-enum commitlintopen in new window // .commitlintrc.js const fs = require('fs') const path = require('path') const packages = fs.readdirSync(path.resolve(__dirname, 'packages')) module.exports = { rules: { "scope-enum": [2, "always", [ ...packages ]] } }; scopes for business system // .commitlintrc.js const fs = require('fs') const path = require('path') const packages = fs.readdirSync(path.resolve(__dirname, 'packages')) module.exports = { prompt: { scopes: ["app", "home", "account", "comment"] } } Of course, if you want to add to the module-wide customization to display on the command line, you can use and to define. description information name value // .commitlintrc.js const fs = require('fs') const path = require('path') const packages = fs.readdirSync(path.resolve(__dirname, 'packages')) module.exports = { prompt: { scopes: [ { value: "app", name: "app: System business" }, { value: "home", name: "home: Homepage" }, { value: "account", name: "account: Account related" }, { value: "comment", name: "comment: Comment related" }, ] } } default defaultIssues Obtaining the automatically, it is a very troublesome thing to repeat the query to fill in the . Issue Number issue number But if the team's branch command rules are standardized (e.g: fix/33) Then we use 's to get the branch name through the command Node execSync Then process the obtained string Then we use defaultIssues When using, we only need to press the key to output the , so that we can easily intercept the to reduce repetitive work. <Enter> Issue Number Issue Number // .commitlintrc.js const { execSync } = require('child_process'); // @tip: git branch name = feature/33 => auto get defaultIssues = #33 const issue = execSync('git rev-parse --abbrev-ref HEAD') .toString() .trim() .split("/")[1] // @tip: monorepo dynamic get name /** @type {import('cz-git').UserConfig} */ module.exports = { prompt: { defaultIssues: () => !issue ? "" : `#${issue}` } }; Expand your imagination, and the highly customizable makes committing more convenient and more customary. Welcome to share. cz-git