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.4

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.4
File
changepacks-0.3.4-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
changepacks-0.3.4-py3-none-win32.whl Python 3 none Windows x86-32 Details
changepacks-0.3.4-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
changepacks-0.3.4-py3-none-musllinux_1_2_i686.whl Python 3 none Linux musl 1.2+ x86-32 Details
changepacks-0.3.4-py3-none-musllinux_1_2_armv7l.whl Python 3 none Linux musl 1.2+ ARMv7l Details
changepacks-0.3.4-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details
changepacks-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
changepacks-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl Python 3 none Linux glibc 2.17+ PowerPC 64-le Details
changepacks-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl Python 3 none Linux glibc 2.17+ x86-32 Details
changepacks-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl Python 3 none Linux glibc 2.17+ ARMv7l Details
changepacks-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
changepacks-0.3.4-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
changepacks-0.3.4-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 64.9 MB

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

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

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

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

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

Download URL changepacks-0.3.4-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
d6a1938a1404312ad0eb06d26f36e038e975a2e9cdffd96c0163635495cd6b88
BLAKE2b-256 checksum
How to use checksums
f53aa18acaf41e7038d7d53f9fddf87f74c2da41edfa2474aa2fa6e5a86c6fc3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
7b828aa127a52ddcf191cc3a13dfc680f2b9b83fa2ce9a5cde1d83e52921a702
BLAKE2b-256 checksum
How to use checksums
3857024b647c66437a1ead048419ab0a274051cb826b0d31b5a3808c90469807
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
f91082debc01b168e15b440efdc15711196773c29cf5297d4aabd981d0bc0149
BLAKE2b-256 checksum
How to use checksums
e90fd7510e48ff710a33c637cf16a70825095995629284d3a14a928cae51930a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
9022239b0d0e80840f12d2acb4efce3189151d354f5ab5484a42e01a4ea91cd5
BLAKE2b-256 checksum
How to use checksums
6177b32acf63e2088f60eca042da56f1a247f349b609d428dd45306b8481a70f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
2cd70e000956a24682c7ccd228a82de0b3ffbf21655227e70a592716109997cc
BLAKE2b-256 checksum
How to use checksums
c82b75bd9121d97f7e46b474f7bba29aeaff1d10745ddf31446d7ee229d35f72
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
8029d7025a56d7682d9ac6f34341af7bf8625e0b78ba4a15cd02ad8676ac1890
BLAKE2b-256 checksum
How to use checksums
beeb8f60bb889e44d16979950f0f63fdb2ffe4c200184b3478a3cee7a24367bc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Size 5.6 MB
Tags Linux glibc 2.17+ x86-32 Python 3
SHA-256 checksum
How to use checksums
96596de0af2cfbe97f99d469ac95a0ba4d180c5250c2e98b0ee14adb30705742
BLAKE2b-256 checksum
How to use checksums
911e3cc637a4c9f8bd02aae4faca58264e63eb20f03a0830288fe5d9b866e7f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
041ff3b15a7c3cad565d34fcefa0765a2ad25d0f64ed1f69390ede9afc8d892a
BLAKE2b-256 checksum
How to use checksums
4fd52fb3ae5278102f9a50dc45941156ae7756a1dba8ad9445ebb29048c2639e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
818f6027c31a1abc33d48911d2565f9b94daec575f35737706ab57d9112ea5bc
BLAKE2b-256 checksum
How to use checksums
2f9d69fffde827a27c9eda8f21d364573cca12357948cef0a697fb38c6bc543b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
f8d98f29a3bb420ab8b625b802f2535e6de50e652b1c9f76fbd5d0ed3aaa9a17
BLAKE2b-256 checksum
How to use checksums
64dee0c697b1906bfcc75b6d93cfef76ce9159537c451553caa712e09f5b52ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

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

Download URL changepacks-0.3.4-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
a3febe52334019a3923f560307013649653a7c1dc5acf8569754a1846f7d0b41
BLAKE2b-256 checksum
How to use checksums
01677fcf510d4054ffeb00c27000fbe881e0ea13f73023d914ddb0554bebbc71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release history Release notifications | RSS feed

0.3.6

13 release files

0.3.5

13 release files

This release

0.3.4 This release

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