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

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

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

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

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

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

Download URL changepacks-0.3.5-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
5d7fe8dff2130404feca13a6df9c5251a183ccf50bb9d8a1d5d6a44a4be9767c
BLAKE2b-256 checksum
How to use checksums
a09375cd0f5ef303215ba2974b539b3e861d07383e0a14ffc5debfc7a4b8e05c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL changepacks-0.3.5-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
6c6c7aedb476434e92756f35ec0ee4837669d76d9315cc21eca10037212004d4
BLAKE2b-256 checksum
How to use checksums
f60100b81b4fc00211e981efbe07893449b919ec8a8b2b137ce482055141d700
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL changepacks-0.3.5-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
519bc68e5ff1bd94e21765b97910c018eba069ab1591495667ae3d1ab13929d0
BLAKE2b-256 checksum
How to use checksums
35729eb16a711dd297c418bb09474476db444080ae83ffc3f6673f3a7c8c3acd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL changepacks-0.3.5-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
df0114cea968d77025c9f524db5a1c2e03302f1f1c6179e3c808df74c9a4febc
BLAKE2b-256 checksum
How to use checksums
8738eda1da3e2c86ba82de0aa163e895306f129752accffabc05bf28aef4b8a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL changepacks-0.3.5-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
b1a4713c879269a9c1dfbf5b8867c288edc7d4363aa02ca276ddab709354739f
BLAKE2b-256 checksum
How to use checksums
617952fbc467b911258c877690aa5cfd3c6a989f0f8dd260d44734d176c959be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL changepacks-0.3.5-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
1c7a59d40fbf41a0d90c72f09b3136a170c2a30358da5cdc7d8af62c7c8d22b8
BLAKE2b-256 checksum
How to use checksums
4a16d262c89de3a2b3239a232eddd0ba3e7a22ee3816c6d47814d1aacd19f059
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL changepacks-0.3.5-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
c22dd5607968fe4a5bc1e3da4e8f8e64cdb0356b070d9aefd0f5cff9ed0bfc7e
BLAKE2b-256 checksum
How to use checksums
5aeaf6c7572ff699e3a5f0fa8ddeaf861490c9e4287ec42a8df3cfd2bfeef7d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL changepacks-0.3.5-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
53a8bb53b690e765a2d71b3692e92acf9236827fce8c0b3ede21dfb3165f6dca
BLAKE2b-256 checksum
How to use checksums
8ab607c0de82a1a4752a9638eeaf02ce1f18cfbb538154461caff24026761bd4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

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

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

Download URL changepacks-0.3.5-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
51266cc434b2d3b02c7351a10d4871bb42fb8b9df9ad85310904e3ca5356d216
BLAKE2b-256 checksum
How to use checksums
fdc841c2f5eaa55800d330e90005b3b27b4699a7b81f4de6c38c8a1deae6a101
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

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

Release history Release notifications | RSS feed

0.3.6

13 release files

This release

0.3.5 This release

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