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

Metadata

Release files for changepacks 0.3.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for changepacks 0.3.6
File
changepacks-0.3.6-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
changepacks-0.3.6-py3-none-win32.whl Python 3 none Windows x86-32 Details
changepacks-0.3.6-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
changepacks-0.3.6-py3-none-musllinux_1_2_i686.whl Python 3 none Linux musl 1.2+ x86-32 Details
changepacks-0.3.6-py3-none-musllinux_1_2_armv7l.whl Python 3 none Linux musl 1.2+ ARMv7l Details
changepacks-0.3.6-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details
changepacks-0.3.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
changepacks-0.3.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl Python 3 none Linux glibc 2.17+ PowerPC 64-le Details
changepacks-0.3.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl Python 3 none Linux glibc 2.17+ x86-32 Details
changepacks-0.3.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl Python 3 none Linux glibc 2.17+ ARMv7l Details
changepacks-0.3.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
changepacks-0.3.6-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
changepacks-0.3.6-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 64.8 MB

Release files / changepacks-0.3.6-py3-none-win_amd64.whl

Download URL changepacks-0.3.6-py3-none-win_amd64.whl
Size 4.9 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
c3c16c03118671e184492c6b3a88521caa5f9f7e3fa731152780d4181c4d9c7d
BLAKE2b-256 checksum
How to use checksums
cecf0b00f80b7027af6761dd39fa1bb7077e6ea4ebe9708d69f4ae397d0376e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-win32.whl

Download URL changepacks-0.3.6-py3-none-win32.whl
Size 4.5 MB
Tags Python 3 Windows x86-32
SHA-256 checksum
How to use checksums
dfc846912377a7344dba79f72c8db09ffaf00027a8c63a35d24da4af0a3eaddb
BLAKE2b-256 checksum
How to use checksums
c4e12d39baf181fff8ec0f722988d5fe69328114f58a38ffde85aa39418aafa0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-musllinux_1_2_x86_64.whl

Download URL changepacks-0.3.6-py3-none-musllinux_1_2_x86_64.whl
Size 5.2 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
ed15cc7d260ac05bdc575838c56306517a11cae23d109540c3349d05e7195703
BLAKE2b-256 checksum
How to use checksums
6de767e0e611b81703023a2334bb0b03a5199ae33863546d8d9d9d75b4859ffd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-musllinux_1_2_i686.whl

Download URL changepacks-0.3.6-py3-none-musllinux_1_2_i686.whl
Size 5.2 MB
Tags Linux musl 1.2+ x86-32 Python 3
SHA-256 checksum
How to use checksums
699f2dc1c6e240fe6cb8d64fc34611d28d7ce91229c6c66404a023ebde4db2c6
BLAKE2b-256 checksum
How to use checksums
c47179c2052e995b3fbc478424a9386205d969693eef12d19c83fc21387ac359
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-musllinux_1_2_armv7l.whl

Download URL changepacks-0.3.6-py3-none-musllinux_1_2_armv7l.whl
Size 4.6 MB
Tags Linux musl 1.2+ ARMv7l Python 3
SHA-256 checksum
How to use checksums
c133d9f188c6b5bcf432272697e329923ae63ded413f3338a0fdc9bc1842dbfe
BLAKE2b-256 checksum
How to use checksums
f79ce4ea6851b04c42dea64d4aaa43c2d1f2c9f3e01aca29290954ef3c92785c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-musllinux_1_2_aarch64.whl

Download URL changepacks-0.3.6-py3-none-musllinux_1_2_aarch64.whl
Size 4.8 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
8fbe7370691bd7d2b4b4fe7d39815301267fd3c7b157fd1d1f82f9772cc73baa
BLAKE2b-256 checksum
How to use checksums
6a8c344a34b3f1a287319c34a42dd1fafabd0604559fc846ce1d5d09c26106fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL changepacks-0.3.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.1 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
09f9fa0cb7ec47278f873d84d2c9f177e86f0d6abd947b31ad75d0f2e9191de6
BLAKE2b-256 checksum
How to use checksums
775f9c485f9365fe3b588af8e8309074043b726baf3e39784d4cf2cd85d56d4d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl

Download URL changepacks-0.3.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Size 5.9 MB
Tags Linux glibc 2.17+ PowerPC 64-le Python 3
SHA-256 checksum
How to use checksums
ef029deb29e869b813444a2ead0838e532c34c310a74ae02d9f849b788f0c518
BLAKE2b-256 checksum
How to use checksums
2a0d003e3d5c066d7830132b2e83b7c348148feccd4a4c090ff31d238bb6a445
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL changepacks-0.3.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Size 5.5 MB
Tags Linux glibc 2.17+ x86-32 Python 3
SHA-256 checksum
How to use checksums
90e721903203935adfa9fe694d99e40d4ecaad6dcc542db408b8746c2710e9e2
BLAKE2b-256 checksum
How to use checksums
5b7e42cbce47883cd60c91d24f404620e8dd2810c81ff21b1d2dc4ecde6882f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL changepacks-0.3.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 4.6 MB
Tags Linux glibc 2.17+ ARMv7l Python 3
SHA-256 checksum
How to use checksums
fc10b727d292d665ba94707c3ea1d17d452959948df474409e77331adfe8a561
BLAKE2b-256 checksum
How to use checksums
53e665cdd53679ea86275e6c0eeaa710108e8cc3a6f698fb7946d90485223bab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL changepacks-0.3.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 4.9 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
94fa52bc349936e3caf0a926a27ca780d29c1914d391f1338c1700b08fcc2117
BLAKE2b-256 checksum
How to use checksums
3379d1b8ece031d00bfa89dfc86176a91ccdad431f59b56a33156538b327b3bf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-macosx_11_0_arm64.whl

Download URL changepacks-0.3.6-py3-none-macosx_11_0_arm64.whl
Size 4.7 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
82617122eb7c1a7e44999ee54290806cc33b33ac0929d537e3e18fec965e8264
BLAKE2b-256 checksum
How to use checksums
298fb583ea543c7e9b55640a4c3d2291ab160a8fd2c05d187c37584c3672f64c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / changepacks-0.3.6-py3-none-macosx_10_12_x86_64.whl

Download URL changepacks-0.3.6-py3-none-macosx_10_12_x86_64.whl
Size 4.8 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
cc1bfa65e8533ad1db1c9deb3383fc5c953dd7383072df32efda9c430d34b9f0
BLAKE2b-256 checksum
How to use checksums
6e6eaa7f2150825f4ebbec2a9e46beb670ff59d3fb3c9d49675d2b7dac18ca06
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release history Release notifications | RSS feed

This release

0.3.6 This release

13 release files

0.3.5

13 release files

0.3.4

13 release files

0.2.8

13 release files

0.2.7

13 release files

0.2.6

13 release files

0.2.5

13 release files

0.2.4

13 release files

0.2.3

6 release files

0.2.2

13 release files

0.2.1

13 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page