Skip to main content

changepacks logo

Crates.io PyPI npm bundle size npm version npm downloads license CI codecov GitHub stars GitHub forks GitHub issues GitHub pull requests GitHub last commit Rust Python Node.js Bun

changepacks ๐Ÿ“ฆ

A unified version management and changelog tool for multi-language monorepos.

Overview

changepacks is a Rust-powered CLI tool that brings consistent version management and changelog generation to polyglot projects. Inspired by changesets, it extends beyond JavaScript to natively support Node.js, Python, Rust, Dart, Java, and C# ecosystems with a single, fast, and reliable tool.

Why changepacks?

  • ๐ŸŒ True Multi-Language Support - Manage versions across Node.js, Python, Rust, Dart, Java, and C# with unified workflow
  • ๐Ÿš€ Rust Performance - Fast, parallel operations with single binary distribution
  • ๐Ÿ”— Smart Dependencies - Automatic dependency resolution with topological sorting for publishing
  • ๐Ÿ’พ Format Preservation - Respects language conventions (JSON indentation, TOML formatting, YAML structure)
  • ๐ŸŒณ Git-Native - Uses git history for intelligent change detection
  • ๐ŸŽฏ Developer-Friendly - Interactive CLI with colored output, tree views, and clear error messages

Recent Improvements

  • ๐Ÿ”— Workspace Dependency Updates - Automatically updates workspace:* dependencies in package.json when referenced packages are updated
  • โš™๏ธ Update On Rules - Configure updateOn in config to automatically trigger updates for dependent packages (e.g., bridge packages)
  • โœจ Enhanced Readability - Patch lists now display with newlines instead of commas for better visibility
  • ๐Ÿ“ฆ Dependency Sorting - Topological sort ensures packages publish in correct order
  • ๐ŸŽจ Improved Output - Tree view with colorized status and dependency visualization
  • ๐Ÿ”ง Format Preservation - Maintains your file formatting (indentation, newlines) across all updates

Features

  • ๐Ÿš€ Multi-language Support - Native support for Node.js, Python, Rust, Dart, Java, and C# with workspace detection
  • ๐Ÿ“ Changepack Logs - Track version updates with timestamped logs and detailed notes
  • ๐Ÿ”„ Automated Updates - Smart version bumping with workspace dependency updates
  • ๐Ÿ”— Dependency Resolution - Topological sorting ensures dependencies publish before dependents
  • โšก Fast CLI - Async Rust implementation with parallel operations
  • ๐ŸŽฏ Project Detection - Automatic discovery of packages and workspaces via git
  • ๐Ÿ“Š Status & Visualization - Tree view of dependencies with change markers
  • ๐Ÿ’พ Format Preservation - Maintains indentation, newlines, and file formatting
  • ๐Ÿงช Testing Support - Dry-run mode for updates and publishing
  • ๐Ÿ”ง Configurable - Custom publish commands, ignore patterns, and base branch

Supported Languages & Package Managers

Language Package Manager File Status
Node.js npm, pnpm, yarn, bun package.json โœ… Supported
Python pip, uv pyproject.toml โœ… Supported
Rust Cargo Cargo.toml โœ… Supported
Dart pub pubspec.yaml โœ… Supported
Java Gradle build.gradle.kts, build.gradle โœ… Supported
C# NuGet *.csproj โœ… Supported

Note: Java/Gradle projects require the Gradle wrapper (gradlew) for version detection. The wrapper is used to resolve project properties dynamically.

Installation

Choose your preferred package manager:

Windows

winget install Changepacks.Changepacks

Rust (Cargo)

cargo install changepacks

Python

# pip
pip install changepacks

# uv (recommended)
uv add changepacks
uvx changepacks

Node.js

# npm
npm install @changepacks/cli
npx @changepacks/cli

# pnpm
pnpm install @changepacks/cli
pnpm dlx @changepacks/cli

# yarn
yarn install @changepacks/cli

# bun
bun install @changepacks/cli
bunx @changepacks/cli

Requirements

  • Git repository (for project detection)
  • Rust 1.97+ (for building from source)

Build from Source

git clone https://github.com/changepacks/changepacks.git
cd changepacks
cargo build --release

The binary will be available at target/release/changepacks (or target/release/changepacks.exe on Windows).

Usage

Quick Start

  1. Initialize changepacks in your repository:
changepacks init
  1. Create a changepack when you make changes:
changepacks

This opens an interactive session to select changed projects and write release notes.

  1. Update versions from changepack logs:
changepacks update
  1. Publish packages in dependency order:
changepacks publish

Typical Workflow

# 1. Check which projects have changed
changepacks check --tree

# 2. Create a changepack log for your changes
changepacks
# โ†’ Select projects (Major/Minor/Patch)
# โ†’ Write changelog notes

# 3. Preview version updates
changepacks update --dry-run

# 4. Apply version updates
changepacks update

# 5. Test publishing
changepacks publish --dry-run

# 6. Publish to registries
changepacks publish

Check Project Status

View all projects with change detection:

changepacks check              # List all projects
changepacks check --tree       # Show dependency tree
changepacks check --filter workspace  # Only workspaces
changepacks check --filter package    # Only packages
changepacks check --remote     # Compare with remote branch

Update Versions

Apply version bumps from changepack logs:

changepacks update              # Interactive confirmation
changepacks update --dry-run    # Preview without applying
changepacks update --yes        # Skip confirmation

Publish Packages

Publish packages to their respective registries:

changepacks publish

Options:

changepacks publish --dry-run           # Verify release flow using each language's built-in dry-run command (e.g., npm publish --dry-run, cargo publish --dry-run)
changepacks publish --yes               # Skip confirmation prompts
changepacks publish --format json       # Output results in JSON format
changepacks publish --remote            # Use remote branch for change detection

The publish command will:

  1. Discover all projects in your workspace
  2. Show which projects will be published
  3. Execute the publish command for each project (using language-specific defaults or custom commands from config)

Default publish commands by language:

  • Node.js: npm publish
  • Python: uv publish
  • Rust: cargo publish
  • Dart: dart pub publish
  • Java: ./gradlew publish
  • C#: dotnet pack -c Release && dotnet nuget push

Check Config

View the loaded changepacks config (from .changepacks/config.json):

changepacks config

This prints the merged and defaulted configuration, for example:

{
  "ignore": [
    "**/*",
    "!crates/changepacks/Cargo.toml",
    "!bridge/node/package.json",
    "!bridge/python/pyproject.toml"
  ],
  "baseBranch": "main",
  "latestPackage": "crates/changepacks/Cargo.toml",
  "publish": {
    "node": "npm publish",
    "python": "uv publish",
    "rust": "cargo publish",
    "dart": "dart pub publish",
    "bridge/node/package.json": "npm publish --access public"
  },
  "updateOn": {
    "crates/changepacks/Cargo.toml": ["bridge/node/package.json", "bridge/python/pyproject.toml"]
  }
}

You can edit .changepacks/config.json to customize:

  • Files/projects to ignore (ignore) using glob patterns (default: empty).
  • The base branch to compare against for changes (baseBranch, default: "main").
  • The default main package for versioning (latestPackage, optional).
  • Custom publish commands (publish):
    • Set language-specific commands using language keys: "node", "python", "rust", "dart", "java", "csharp".
    • Set project-specific commands using relative paths (e.g., "bridge/node/package.json").
    • If not specified, default commands are used (see Publish Packages section).
  • Custom dry-run publish commands (publishDryRun):
    • Overrides the dry-run command used by changepacks publish --dry-run.
    • Same keying rules as publish (language key or relative project path).
    • If not specified, each language uses its built-in dry-run command (e.g., npm publish --dry-run, uv publish --dry-run, cargo publish --dry-run, dart pub publish --dry-run; Java runs ./gradlew publishToMavenLocal against an isolated temporary Maven local repository that is removed afterward; C# runs a managed dotnet pack + push to a temporary local feed).
    • A custom publish command does not change the dry-run command โ€” set publishDryRun to override what changepacks publish --dry-run executes.
  • Dependency rules for forced updates (updateOn):
    • Key: glob pattern for trigger packages (e.g., "crates/*/Cargo.toml").
    • Value: list of package file paths that must be updated when trigger matches.
    • When a package matching the trigger pattern is updated, all dependent packages will also be marked for update.
    • Useful for bridge packages that wrap core libraries (e.g., when core Rust crate updates, automatically update Node.js and Python bindings).

If the config file is missing or empty, sensible defaults are used.

Default Command

Running changepacks without arguments starts an interactive session to select projects and create a changepack log.

Project Structure

changepacks/
โ”œโ”€โ”€ crates/
โ”‚   โ”œโ”€โ”€ cli/          # CLI interface and commands
โ”‚   โ”œโ”€โ”€ core/         # Core types and traits
โ”‚   โ”œโ”€โ”€ node/         # Node.js project support
โ”‚   โ”œโ”€โ”€ python/       # Python project support
โ”‚   โ”œโ”€โ”€ rust/         # Rust project support
โ”‚   โ”œโ”€โ”€ dart/         # Dart project support
โ”‚   โ”œโ”€โ”€ java/         # Java/Gradle project support
โ”‚   โ”œโ”€โ”€ csharp/       # C#/.NET project support
โ”‚   โ””โ”€โ”€ utils/        # Utility functions
โ”œโ”€โ”€ examples/         # Example projects for testing
โ”œโ”€โ”€ Cargo.toml        # Workspace configuration
โ””โ”€โ”€ README.md

How It Works

  1. Project Detection: Walks git tree to discover package.json, Cargo.toml, pyproject.toml, pubspec.yaml, build.gradle.kts, build.gradle, and *.csproj files
  2. Change Tracking: Uses git diff to detect changed files, marking projects with modifications
  3. Changepack Logs: Stores version bump intentions in .changepacks/changepack_log_*.json with notes and timestamps
  4. Version Updates: Reads changepack logs, calculates new versions (semver), updates files while preserving formatting
  5. Dependency Resolution: Topologically sorts projects by dependencies for correct publish order
  6. Publishing: Executes language-specific or custom publish commands in dependency order

Changepack Log Format

{
  "changes": {
    "packages/foo/package.json": "Minor",
    "crates/bar/Cargo.toml": "Patch"
  },
  "note": "Add new feature X and fix bug Y",
  "date": "2025-12-19T10:27:00.000Z"
}

Development

Build Workspace

cargo build

Run Tests

cargo test

Lint Check

cargo clippy

Run Examples

Test with example projects:

cd examples/node/common
changepacks check

Architecture

The project follows a trait-based, modular architecture:

  • Core (crates/core) - Defines common traits (Package, Workspace, ProjectFinder) and types
  • Language Crates (crates/{node,python,rust,dart,java,csharp}) - Implement language-specific project detection and version management
  • CLI (crates/cli) - Command-line interface with clap, colored output, and interactive prompts
  • Utils (crates/utils) - Shared utilities: git operations, version calculation, dependency sorting, config management
  • Bridges (bridge/{node,python}) - N-API and PyO3 bindings for package manager distribution

Key Design Patterns

  • Async-First: All I/O operations use tokio for parallel execution
  • Format Preservation: Language-specific parsers (toml_edit, yamlpatch, serde_json) maintain file formatting
  • Git-Native: Uses gix library for change detection and repository operations
  • Topological Sorting: Kahn's algorithm ensures correct publish order based on dependencies

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Sponsors

We're grateful to our sponsors for supporting changepacks development! If you're interested in sponsoring this project, please get in touch.

Used By

The following open-source projects and companies are using changepacks:

If you're using changepacks in your project, we'd love to feature you here! Please open a Pull Request to add your project or company.

License

This project is distributed under the Apache License 2.0. See the LICENSE file for more details.

Roadmap

  • Node.js package management support
  • Python package management support
  • Rust package management support
  • Dart package management support
  • Java/Gradle package management support
  • C#/.NET package management support
  • CI/CD integration support (JSON output, dry-run mode)
  • Dependency-aware publishing with topological sorting
  • Format preservation across all languages
  • Interactive CLI with tree view and colored output
  • Cross-platform distribution (Windows, macOS, Linux)
  • N-API and PyO3 bindings for npm/PyPI
  • Plugin system for additional languages
  • CHANGELOG.md generation from changepack logs
  • GitHub Actions integration
  • Pre-release version support

Support

If you encounter any issues or have feature requests, please let us know on the Issues page.

Inspirations

  • changesets - Version management for JavaScript projects

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

changepacks-0.3.3-py3-none-win_amd64.whl (4.9 MB view details)

Uploaded Python 3Windows x86-64

changepacks-0.3.3-py3-none-win32.whl (4.5 MB view details)

Uploaded Python 3Windows x86

changepacks-0.3.3-py3-none-musllinux_1_2_x86_64.whl (5.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

changepacks-0.3.3-py3-none-musllinux_1_2_i686.whl (5.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

changepacks-0.3.3-py3-none-musllinux_1_2_armv7l.whl (4.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

changepacks-0.3.3-py3-none-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

changepacks-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

changepacks-0.3.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

changepacks-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

changepacks-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

changepacks-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

changepacks-0.3.3-py3-none-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

changepacks-0.3.3-py3-none-macosx_10_12_x86_64.whl (4.8 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file changepacks-0.3.3-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 3a0ecb520cf657401f98958d96dbbe1d792898a5c97a13a45a8f556b2a222242
MD5 826bbec591a8d7a40228e15c63dd2c63
BLAKE2b-256 dc2812a0ab62af08734410ad0397827518fb04668f4c1bcdb5be5b4e5fa39b33

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-win32.whl.

File metadata

  • Download URL: changepacks-0.3.3-py3-none-win32.whl
  • Upload date:
  • Size: 4.5 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for changepacks-0.3.3-py3-none-win32.whl
Algorithm Hash digest
SHA256 1df2ed10aa8f4f249cdde4b418f623410a20756d176751132e421a18304862a1
MD5 6f764fde10b76637e8b6d345043d1ca1
BLAKE2b-256 f49d0bd7b01aded7ca2c6b8468a6b812dcc18a15f94c97338411befca442bffd

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6ce74512d1dcb655a0ee08a367882e77ac39439c4a229dc665e64a9de8f84d30
MD5 d78142c9dcf0cb2f40971a9753e28016
BLAKE2b-256 20e6ff4d1befec184a6d624aaa34f53ef24a82380d6efa5d5ef34de584dc37f5

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 59bcf8e500cbcd6c8cbba4739c014f7ed7f3a2a0b5d4d0f5c8bc6e9d589031f9
MD5 6988d70d8c4d3649bbd03d138348a37d
BLAKE2b-256 b7315a73fe9e14efdefa6ee7fbe05b4cc55d5dff4601cd4c198814cbff01fda3

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 2526ebc88ce6aefebf937fd0d58fc73e76193d719983618365a25f85d013d440
MD5 dba7391a8391316d2002b791ad0f9ab3
BLAKE2b-256 83e4e7fcc10ff62c8e2cd37b873c7b9480fabae3da071c5f1a086427d6fbb71e

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5729954bd096c72a6d3def12750a26ff81dbe7f06f0d85b2aebd9e6f789b5632
MD5 213a6389a40b1f308eabd03ce1c78b86
BLAKE2b-256 0588fe3ad4ec6a83c5dd8d5e8e233b45937b37bea24b528f9cd1dee8f4575bc4

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 85192a6f6d360245b621e2299481c349842ffa9fba5009d51eacf79d8a2ac154
MD5 4e645a36ba7db5b469213fa693147dbb
BLAKE2b-256 93010ae1693bdb6e4b99ecaeaa11cae46b7b94babc03f5d658f110a16e8c710a

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 7072d4f806bffac86219d2e454fd4911cda573caf9d8bc3941c2ec985cdcac33
MD5 1031c497371d0e81ffbe012498f84bcd
BLAKE2b-256 060526b530c3b10097627b3778dc567206921a6b2bd8b5225e8d1c3fc3ce0eff

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 fd5a9b2592ec59fd765988c67e9cea643bea38f21585c4b20346f1d57ebb3f37
MD5 35d9b7f68798494b6e148a209c191685
BLAKE2b-256 f473a459118d57b40999da2b5616b1e0677466aa90fd2f8a94c8bf30f2c8b96b

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 88fdb6185150744572c162bd0eca3a2e894c9cd47d87553d624a7e5ea54a8a44
MD5 2640404bb2dbf90f46be7646072b0763
BLAKE2b-256 66783f79196ae2b4a74bf7be22844d758976c0004b886112d3e49a2369de9bb4

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 61e7c486e8629a9f4f6306aa6e6dc622ecd1110623941542fb81ada367aceee3
MD5 a6c0b7c01316a40bc265650d520a2609
BLAKE2b-256 d14ddb00153705a3e744960a2f328b3ef7a2351f0c86e228e0e25f1745ff2712

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94fae8805ea82bc560636c965636f823c43ce2940d0013747c5c29d9444e02b8
MD5 21c4ec837610165c0d67399fe44d6ae5
BLAKE2b-256 bcbc1897a3d4db2ab60b891a976984668e4affa193981cb824a89930d6440840

See more details on using hashes here.

File details

Details for the file changepacks-0.3.3-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for changepacks-0.3.3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8f14272e720cc65f25ee2eb00b86ed77a58a759d1604a6890c5274cdb4521694
MD5 16aa1d82213aa89b6ec86adc3f9dcfca
BLAKE2b-256 78bee1ca308503784e5c53793c0fc6f6983a72ecb312c2ea4bf07efdb0cdb5b0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page