1.15.4 โ€ข Published 8 days ago

better-commits v1.15.4

Weekly downloads
-
License
MIT
Repository
-
Last release
8 days ago

bc-gradient

better commits is enabled downloads discord

https://github.com/Everduin94/better-commits/assets/14320878/8fb15d46-17c4-4e5d-80d9-79abe0a2a00a

โœจ Features

  • Generate conventional commits through a series of prompts
  • Highly configurable with sane defaults
  • Infers ticket and commit-type from branch for consistent & fast commits
  • Consistent branch creation with flexible workflow hooks via better-branch
  • Interactive git status/add on commit
  • Preview commit messages in color
  • Support for git emojis per commit-type
  • Configure globally or per repository
  • Config validation and error messaging

As a side-effect of formatting messages

  • Auto populate PR title / body
  • Automate semantic releases
  • Automate changelogs
  • Automatically link & close related tickets / issues

๐Ÿ“ฆ Installation

npm install -g better-commits

๐Ÿš€ Usage

When you're ready to commit. To run the CLI in your terminal:

better-commits
# or
npx better-commits

It will prompt a series of questions. These prompts will build a commit message, which you can preview, before confirming the commit. Some of the values in these prompts will be infered by your branch name and auto populated. You can adjust this in your .better-commits.json configuration file.

To better understand these prompts and their intention, read Conventional Commits Summary

โš™๏ธ Configuration

Global

Your first time running better-commits, a default config will be generated in your $HOME directory, named .better-commits.json

  • This config will be used if a repository-specific config cannot be found.

Repository

To create a repository-specific config, navigate to the root of your project.

  • Run better-commits-init
  • This will create a default config named .better-commits.json
  • Properties such as confirm_with_editor and overrides will prefer the global config

Options

Better-commits (& better-branch) are highly flexible with sane defaults. These options allow you specify whats best for your workflow.

!NOTE All properties are optional and can be removed from the config. It will be replaced by the default at run-time.

  • See .better-commits.json in this repository as an example

๐Ÿ’ซ Default JSON Config

{
  "check_status": true,
  "commit_type": {
    "enable": true,
    "initial_value": "feat",
    "infer_type_from_branch": true,
    "append_emoji_to_label": false,
    "append_emoji_to_commit": false,
    "options": [
      {
        "value": "feat",
        "label": "feat",
        "hint": "A new feature",
        "emoji": "โœจ",
        "trailer": "Changelog: feature"
      },
      {
        "value": "fix",
        "label": "fix",
        "hint": "A bug fix",
        "emoji": "๐Ÿ›",
        "trailer": "Changelog: fix"
      },
      {
        "value": "docs",
        "label": "docs",
        "hint": "Documentation only changes",
        "emoji": "๐Ÿ“š",
        "trailer": "Changelog: documentation"
      },
      {
        "value": "refactor",
        "label": "refactor",
        "hint": "A code change that neither fixes a bug nor adds a feature",
        "emoji": "๐Ÿ”จ",
        "trailer": "Changelog: refactor"
      },
      {
        "value": "perf",
        "label": "perf",
        "hint": "A code change that improves performance",
        "emoji": "๐Ÿš€",
        "trailer": "Changelog: performance"
      },
      {
        "value": "test",
        "label": "test",
        "hint": "Adding missing tests or correcting existing tests",
        "emoji": "๐Ÿšจ",
        "trailer": "Changelog: test"
      },
      {
        "value": "build",
        "label": "build",
        "hint": "Changes that affect the build system or external dependencies",
        "emoji": "๐Ÿšง",
        "trailer": "Changelog: build"
      },
      {
        "value": "ci",
        "label": "ci",
        "hint": "Changes to our CI configuration files and scripts",
        "emoji": "๐Ÿค–",
        "trailer": "Changelog: ci"
      },
      {
        "value": "chore",
        "label": "chore",
        "hint": "Other changes that do not modify src or test files",
        "emoji": "๐Ÿงน",
        "trailer": "Changelog: chore"
      },
      {
        "value": "",
        "label": "none"
      }
    ]
  },
  "commit_scope": {
    "enable": true,
    "custom_scope": false,
    "initial_value": "app",
    "options": [
      {
        "value": "app",
        "label": "app"
      },
      {
        "value": "shared",
        "label": "shared"
      },
      {
        "value": "server",
        "label": "server"
      },
      {
        "value": "tools",
        "label": "tools"
      },
      {
        "value": "",
        "label": "none"
      }
    ]
  },
  "check_ticket": {
    "infer_ticket": true,
    "confirm_ticket": true,
    "add_to_title": true,
    "append_hashtag": false,
    "prepend_hashtag": "Never",
    "surround": "",
    "title_position": "start"
  },
  "commit_title": {
    "max_size": 70
  },
  "commit_body": {
    "enable": true,
    "required": false
  },
  "commit_footer": {
    "enable": true,
    "initial_value": [],
    "options": ["closes", "trailer", "breaking-change", "deprecated", "custom"]
  },
  "breaking_change": {
    "add_exclamation_to_title": true
  },
  "confirm_commit": true,
  "confirm_with_editor": false,
  "print_commit_output": true,
  "branch_pre_commands": [],
  "branch_post_commands": [],
  "worktree_pre_commands": [],
  "worktree_post_commands": [],
  "branch_user": {
    "enable": true,
    "required": false,
    "separator": "/"
  },
  "branch_type": {
    "enable": true,
    "separator": "/"
  },
  "branch_version": {
    "enable": false,
    "required": false,
    "separator": "/"
  },
  "branch_ticket": {
    "enable": true,
    "required": false,
    "separator": "-"
  },
  "branch_description": {
    "max_length": 70,
    "separator": ""
  },
  "branch_action_default": "branch",
  "branch_order": ["user", "version", "type", "ticket", "description"],
  "enable_worktrees": true,
  "overrides": {
    "shell": "/bin/sh"
  }
}

!NOTE Some properties allow a set of specifc string values

  • See config file explanations for possible values

๐Ÿ”ญ Config File Explanations

Expand to see explanations and possible values

. refers to nesting. i.e. if a property is commit_type.enable then expect in the config for it to be:

"commit_type": {
  "enable": true
}
PropertyDescription
check_statusIf true run interactive git status
commit_type.enableIf true include commit type
commit_type.initial_valueInitial selection of commit type
commit_type.infer_type_from_branchIf true infer type from branch name
commit_type.append_emoji_to_labelIf true append emoji to prompt
commit_type.append_emoji_to_commitIf true append emoji to commit
commit_type.options.valueCommit type prompt value
commit_type.options.labelCommit type prompt label
commit_type.options.hintCommit type inline hint (like this)
commit_type.options.emojiCommit type emoji
commit_type.options.trailerCommit type trailer
commit_scope.enableIf true include commit scope
commit_scope.custom_scopeIf true allow custom scope at run-time
commit_scope.initial_valueDefault commit scope selected
commit_scope.options.valueCommit scope value
commit_scope.options.labelCommit scope label
check_ticket.infer_ticketIf true infer ticket from branch name
check_ticket.confirm_ticketIf true manually confirm inference
check_ticket.add_to_titleIf true add ticket to title
check_ticket.append_hashtagDeprecated: see prepend_hashtag
check_ticket.prepend_hashtag"Never" (default), "Prompt", or "Always"
check_ticket.title_position"start" (of description) (default), "end", "before-colon", "beginning" (of the entire commit title)
check_ticket.surround"" (default), "[]", "()", "{}" - Wraps ticket in title
commit_title.max_sizeMax size of title including scope, type, etc...
commit_body.enableIf true include body
commit_body.requiredIf true body is required
commit_footer.enableIf true include footer
commit_footer.initial_valueInitial values selected in footer
commit_footer.optionsFooter options
breaking_change.add_exclamation_to_titleIf true adds exclamation mark to title for breaking changes
confirm_commitIf true manually confirm commit at end
confirm_with_editorConfirm / Edit commit with $GIT_EDITOR / $EDITOR
print_commit_outputIf true pretty print commit preview
overrides.shellOverride default shell, useful for windows users

Branch configuration (same config file, split for readability)

PropertyDescription
branch_pre_commandsArray of shell commands to run before branching
branch_post_commandsArray of shell commands to run after branching
worktree_pre_commandsArray of shell commands to run before creating worktree
worktree_post_commandsArray of shell commands to run after creating worktree
branch_user.enableIf enabled include user name
branch_user.requiredIf enabled require user name
branch_user.separatorBranch delimeter - "/" (default), "-", "_"
branch_type.enableIf enabled include type
branch_type.separatorBranch delimeter - "/" (default), "-", "_"
branch_ticket.enableIf enabled include ticket
branch_ticket.requiredIf enabled require ticket
branch_ticket.separatorBranch delimeter - "/", "-" (default), "_"
branch_description.max_lengthMax length branch name
branch_description.separatorBranch delimeter - "" (default), "/", "-", "_"
branch_version.enableIf enabled include version
branch_version.requiredIf enabled require version
branch_version.separatorBranch delimeter - "", "/" (default), "-", "_"
branch_orderOrder of branch name values (doesn't effect prompt order)
branch_action_default"branch" or "worktree"
enable_worktreesIf false, always default to branch action

๐Ÿ”Ž Inference

better-commits will attempt to infer the ticket/issue and the commit-type from your branch name. It will auto populate the corresponding field if found.

Ticket / Issue-Number

  • If a STRING-NUMBER or NUMBER are at the start of the branch name or after a /

Commit Type

  • If a type is at the start of the branch or is followed by a /

๐ŸŒณ Better Branch

!NOTE Using better-branch with better-commits can supercharge your git workflow. Make sure to try it out!

Better branch is a secondary feature that works with better commits

  • Supports consistent branch naming conventions
  • Uses same type-list/prompt from your config
  • Enables better-commits to infer type & ticket
  • Caches your username for speedy branching

To run the CLI in your terminal:

better-branch

Worktree Support

better-branch will prompt for Branch or Worktree. Creating a Worktree with better-branch is a great way to create worktrees while maintaining consistent branch naming conventions.

The worktree flow creates a folder/worktree with your branch description and a git branch inside with your full branch name.

!NOTE Creating a worktree named everduin94/feat/TAC-123-add-worktrees with the native git command would create a nested folder for each /. better-branch removes the hassle by creating 1 folder while still using the full name for the branch.

Pre/Post Branch Checkout Hooks

Optionally configure pre and post checkout commands, for example:

  • checkout and rebase main before branching
  • run npm install before branching
  • run npm run dev after branching

See branch_pre_commands and branch_post_commands in default config. (or worktree_pre_commands and worktree_post_commands for creating worktrees)

๐ŸŒŒ Mildly Interesting

Building / Versioning

better-commits works with Semantic Release

  • See package.json and .github/workflows/publish.yml for example

Github

If you use better-commits to create your first commit on a new branch

  • When you open a PR for that branch, it will properly auto-populate the title and body.
  • When you squash/merge, all later commits like "addressing comments" or "fixing mistake". Will be prefixed with an asterisk for easy deletion. This way, you maintain your pretty commit even when squashing.

If you're using Github issues to track your work, and select the closes footer option when writing your commit. Github will automatically link and close that issue when your pr is merged

Changelogs

better-commits can append a commit trailer per commit type. This allows you to automate change logs with tools like Gitlab.

Fun Facts

better-commits is much smaller than its alternative commitizen

better-commits uses native git commands under the hood. So any hooks, tools, or staging should work as if it was a normal commit.

Setting confirm_with_editor=true will allow you to edit/confirm a commit with your editor.

  • For example, to edit with Neovim: git config --global core.editor "nvim"
  • For VS Code, git config --global core.editor "code -n --wait"

!NOTE Enjoy learning, open source technology, and note-taking? Join our Discord!

You can add this badge to your repository to display that you're using a better-commits repository config

MarkdownResult
[![better commits is enabled](https://img.shields.io/badge/better--commits-enabled?style=for-the-badge&logo=git&color=a6e3a1&logoColor=D9E0EE&labelColor=302D41)](https://github.com/Everduin94/better-commits)better commits is enabled

๐ŸชŸ Troubleshooting Windows

Git Bash

TTY initialization failed: uv_tty_init returned EBADF (bad file descriptor). This may happen because you're running something like git-bash on Windows. Try another terminal/command-prompt or winpty to see if its still an issue.

Multi-line

If your are having issues with multilines for commits on windows, you can override the shell via your .better-commits.json config.

Example

"overrides": {
   "shell": "c:\\Program Files\\Git\\bin\\bash.exe"
}

flotes-g-2

Markdown Notetaking - Built for Learning

1.15.4

8 days ago

1.15.3

8 days ago

1.15.2

8 days ago

1.15.1

8 days ago

1.15.0

22 days ago

1.14.0

2 months ago

1.13.0

2 months ago

1.12.0

3 months ago

1.9.0

4 months ago

1.11.0

3 months ago

1.10.0

3 months ago

1.8.1

4 months ago

1.8.0

4 months ago

1.7.2

5 months ago

1.7.1

5 months ago

1.7.0

5 months ago

1.5.2

9 months ago

1.6.0

9 months ago

1.5.1

11 months ago

1.5.0

12 months ago

1.4.1

12 months ago

1.4.0

1 year ago

1.2.0

1 year ago

1.1.1

1 year ago

1.3.0

1 year ago

1.1.0

1 year ago

1.0.9

1 year ago

1.0.8

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago