vtcode 0.88.0

A Rust-based terminal coding agent with modular architecture supporting multiple LLM providers
# git-cliff configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# Template for the changelog
header = """
# Changelog

All notable changes to vtcode will be documented in this file.
"""

body = """
{% if version %}\
    ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }}

{% else %}\
    ## [unreleased]

{% endif %}\
### Highlights
{% for group, commits in commits | group_by(attribute="group") %}\
{% if group == "Features" or group == "Bug Fixes" or group == "Documentation" %}\

#### {{ group | upper_first }}

{% for commit in commits %}\
    - {{ commit.message | split(pat="\n") | first | upper_first }} ({% if commit.id %}{{ commit.id | truncate(length=8, end="") }}{% else %}unknown{% endif %}) {% if commit.remote.username %}(@{{ commit.remote.username }}){% endif %}
{% endfor %}\
{% endif %}\
{% endfor %}\

### Other Changes
{% for group, commits in commits | group_by(attribute="group") %}\
{% if group != "Features" and group != "Bug Fixes" and group != "Documentation" %}\

#### {{ group | upper_first }}

{% for commit in commits %}\
    - {{ commit.message | split(pat="\n") | first | upper_first }} ({% if commit.id %}{{ commit.id | truncate(length=8, end="") }}{% else %}unknown{% endif %}) {% if commit.remote.username %}(@{{ commit.remote.username }}){% endif %}
{% endfor %}\
{% endif %}\
{% endfor %}\

### Contributors
{% set contributors = commits | map(attribute="remote.username") | unique | filter(attribute="self") %}\
{% if contributors | length > 0 %}\
{% for contributor in contributors %}@{{ contributor }} {% endfor %}\
{% else %}\
@vinhnx
{% endif %}\
"""

footer = ""

# Remove leading and trailing whitespace from the template
trim = true

# Postprocessors for changelog entries
postprocessors = []

[git]
# Parse commits according to conventional commits format
conventional_commits = true

# Exclude commits that don't follow conventional commits format
filter_unconventional = false

# Split commits by newlines
split_commits = false

# Preprocess commit messages before parsing
commit_preprocessors = [
    # Remove issue/PR references from the end of commit messages to avoid duplication
    { pattern = '\((https://github.com/vinhnx/vtcode/pull/\d+)\)', replace = "" },
    { pattern = '\(#\d+\)', replace = "" },
    # Normalize common non-standard commit prefixes (case-insensitive)
    { pattern = '^[Dd]ocs:', replace = "docs:" },
    { pattern = '^[Ff]eat:', replace = "feat:" },
    { pattern = '^[Ff]ix:', replace = "fix:" },
    { pattern = '^[Rr]efactor:', replace = "refactor:" },
    { pattern = '^[Tt]est:', replace = "test:" },
    { pattern = '^[Bb]uild:', replace = "build:" },
    { pattern = '^[Cc]I:', replace = "ci:" },
    { pattern = '^[Pp]erf:', replace = "perf:" },
    { pattern = '^[Cc]hore:', replace = "chore:" },
    # Truncate commits that have multiple conventional commit prefixes (malformed)
    { pattern = '\s+(feat|fix|docs|refactor|test|build|ci|perf|chore|deps|security):.*$', replace = "" },
]

# Protect commits from being parsed (e.g., version bumps, release commits)
commit_parsers = [
    # Skip changelog update commits (must come before other parsers)
    { message = "^[a-zA-Z]+: update changelog for", skip = true },
    { message = "update changelog for", skip = true },
    { message = "\\[skip ci\\]", skip = true },

    # Skip release and version bump commits (be specific to avoid false positives)
    { message = "^chore\\(release\\):", skip = true },
    { message = "^chore: Release$", skip = true },
    { message = "^chore: update homebrew", skip = true },
    { message = "bump version.*to", skip = true },
    { message = "update version.*number", skip = true },
    { message = "version bump", skip = true },

    # Skip merge commits - show original commits with their actual authors instead
    { message = "^Merge pull request", skip = true },
    { message = "^Merge branch", skip = true },
    
    # Features
    { message = "^feat", group = "Features", skip = false },
    { message = "^feat\\(.*\\):", group = "Features", skip = false },

    # Bug Fixes
    { message = "^fix", group = "Bug Fixes", skip = false },
    { message = "^fix\\(.*\\):", group = "Bug Fixes", skip = false },

    # Performance
    { message = "^perf", group = "Performance", skip = false },
    { message = "^perf\\(.*\\):", group = "Performance", skip = false },

    # Refactors
    { message = "^refactor", group = "Refactors", skip = false },
    { message = "^refactor\\(.*\\):", group = "Refactors", skip = false },

    # Security
    { message = "^security", group = "Security", skip = false },
    { message = "^security\\(.*\\):", group = "Security", skip = false },

    # Documentation
    { message = "^docs", group = "Documentation", skip = false },
    { message = "^docs\\(.*\\):", group = "Documentation", skip = false },

    # Tests
    { message = "^test", group = "Tests", skip = false },
    { message = "^test\\(.*\\):", group = "Tests", skip = false },

    # Build
    { message = "^build", group = "Build", skip = false },
    { message = "^build\\(.*\\):", group = "Build", skip = false },

    # CI
    { message = "^ci", group = "CI", skip = false },
    { message = "^ci\\(.*\\):", group = "CI", skip = false },

    # Dependencies
    { message = "^deps", group = "Dependencies", skip = false },
    { message = "^deps\\(.*\\):", group = "Dependencies", skip = false },

    # Chores (excluded from changelog by default)
    { message = "^chore", group = "Chores", skip = true },
    { message = "^chore\\(.*\\):", group = "Chores", skip = true },

    # Skip generic/non-descriptive commits
    { message = "^Update commit$", skip = true },
    { message = "^Remove codes$", skip = true },
    { message = "^Implement code changes", skip = true },

    # Catch-all for other commits (not skipped, grouped as Other)
    { message = ".*", group = "Other", skip = false },
]

# Protect specific commits from being included in the changelog
protect_breaking_commits = false

# Filter out commits
filter_commits = true

# Tags configuration - match both v0.82.0 and 0.82.0 formats
tag_pattern = "[vV]?[0-9]+\\.[0-9]+\\.[0-9]+"

# Pattern to match tags with optional 'v' prefix
tag_regex = "(?P<version>[vV]?[0-9]+\\.[0-9]+\\.[0-9]+)"

# Regex to exclude commits from the changelog (matches your current config)
exclude_patterns = [
    "chore\\(release\\):",
    "bump version",
    "update version",
    "version bump",
    "release v?\\d+\\.\\d+\\.\\d+",
    "chore.*version",
    "chore.*release",
    "build.*version",
    "update.*version.*number",
    "bump.*version.*to",
    "update homebrew",
    "Update changelog for",
    "update changelog for",
    "\\[skip ci\\]",
    "Merge branch",
    # Exclude merge commits - we want to show the original commits with their actual authors
    "Merge pull request",
]

# Sort commits within a tag
sort_commits = "oldest"

# Link to remote repository (GitHub)
remote = "github"

# Remote configuration
[remote.github]
owner = "vinhnx"
repo = "vtcode"
[gitmoji]
# Enable gitmoji parsing
enable = false