pubsat 0.1.0

Building blocks for SAT-based dependency resolvers: a node-semver-compatible range parser, an ecosystem-independent constraint vocabulary, and a backend-agnostic SAT problem/solver abstraction with a Varisat backend.
Documentation
# git-cliff configuration for pubsat.
#
# Generates a Keep-a-Changelog-style CHANGELOG.md from
# conventional-commits ( `feat:`, `fix:`, `docs:`, etc.). Project
# convention: the **subject line** of a commit is what shows up
# in the changelog, so keep them tight and intent-focused.
#
# Run `just changelog` to regenerate CHANGELOG.md.
# Run `just changelog-preview` for an unwritten preview.

[changelog]
header = """
# Changelog

All notable changes to `pubsat` will be documented in this file.
The format follows [Keep a Changelog](https://keepachangelog.com/).
Breaking changes between 0.1.x minor versions will be called out
here with migration notes; the project commits to strict semver
from 1.0 onward.

"""
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] — {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [Unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first | trim }}\
            {% if commit.breaking %} **(BREAKING)**{% endif %}\
    {% endfor %}
{% endfor %}\n
"""
trim = true
footer = """
<!-- generated by git-cliff -->
"""

[git]
# Parse commits as conventional-commits. Anything that doesn't
# match is silently dropped from the changelog (this is intended:
# noisy commits like merges and WIP land but shouldn't pollute the
# release notes).
conventional_commits = true
filter_unconventional = true
split_commits = false

# Map conventional-commit types to changelog sections, in display
# order. The grouping mirrors Keep a Changelog's vocabulary so
# CHANGELOG.md stays readable to humans who don't know our commit
# convention.
commit_parsers = [
    { message = "^feat",     group = "Added" },
    { message = "^fix",      group = "Fixed" },
    { message = "^perf",     group = "Performance" },
    { message = "^refactor", group = "Changed" },
    { message = "^style",    group = "Changed" },
    { message = "^docs",     group = "Documentation" },
    { message = "^test",     group = "Tests" },
    { message = "^build",    group = "Build" },
    { message = "^ci",       group = "Build" },
    { message = "^chore",    group = "Chores" },
    # Drop anything else (revert/merge/etc.) — falls through to
    # filter_unconventional above.
]

# Don't include commits that only touch the changelog itself —
# avoids the "changelog updates" feedback loop on every release.
commit_preprocessors = [
    { pattern = '\((CHANGELOG\.md)\)', replace = "" },
]

# Tags for the version-detection logic. Matches `v1.2.3` and
# `pubsat-v1.2.3` style tags so re-tagging schemes don't break the
# changelog history.
tag_pattern = "v[0-9].*"
sort_commits = "newest"