Skip to main content

No project description provided

Project description

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.91+ (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           # Preview what would be published without actually publishing
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 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).
  • 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 git2 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 MIT License. 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

Project details


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.2.23-py3-none-win_amd64.whl (4.3 MB view details)

Uploaded Python 3Windows x86-64

changepacks-0.2.23-py3-none-win32.whl (3.9 MB view details)

Uploaded Python 3Windows x86

changepacks-0.2.23-py3-none-musllinux_1_2_x86_64.whl (4.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

changepacks-0.2.23-py3-none-musllinux_1_2_i686.whl (4.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

changepacks-0.2.23-py3-none-musllinux_1_2_armv7l.whl (4.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

changepacks-0.2.23-py3-none-musllinux_1_2_aarch64.whl (4.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

changepacks-0.2.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

changepacks-0.2.23-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

changepacks-0.2.23-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (4.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

changepacks-0.2.23-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

changepacks-0.2.23-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

changepacks-0.2.23-py3-none-macosx_11_0_arm64.whl (4.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

changepacks-0.2.23-py3-none-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f1f5c4dbeb96f9794171199d0bdae63baf580f70e273371a83e2970cee08ed78
MD5 0746f353555ad57665dbff5364629d3a
BLAKE2b-256 7f9756d070a6324d8325bb3cf8a5c84dccf1118dadd0de82de054f74fad9f16f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for changepacks-0.2.23-py3-none-win32.whl
Algorithm Hash digest
SHA256 6db13bbf68ead57a287e2723f62b6262e5ed78e725412238da99faa129d5c3ef
MD5 8057879efd59e9134714354c696e22d5
BLAKE2b-256 7854f2a5ac47f9af9d79f0d15c1d5780f163a5e94cfbf174b2029f26f3ea0732

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 52c65db105b15dad9235e200dd2e200daa88542ac59945919dc7e1cf8f099163
MD5 f6830fe9b9927ffb96cd2b3f3c95e63d
BLAKE2b-256 67ea28c237cdb560a49e6c84604c3691d305dbba846cbcdda57de97b545e7cc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 362c579180e18cfb0319f1b0c26e9fcd23d371b3f84b0da12068101141b43911
MD5 ccf26b7c37e2c450e7bcd362d6cb51c4
BLAKE2b-256 64f761f1cfcedf72643c0b74510dbabec1fe1d0fd82a2d5d8256cb0e5c31a30c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 d23d6ea50833eb502a8097e86992d6c14cfdc83ce9b69f30ea766cbd2ff18dfa
MD5 1ba1f81053f8da9e9a68b89fc2bc2eaf
BLAKE2b-256 7b57a3e34b31e693507d97e2dfb896ac0ef9ad65d4fc95f024cba341e204e30a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 12b9321919b968f0faeef266d06de79e64cbb6e6ea29cecba596f0b653463890
MD5 7a11f8a449ec96268a8559da5335353e
BLAKE2b-256 670be07128013296141c03ede46c563f84b2552e8e6b3a282b9594688c3c698e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 182e808343ecbd9cac65e1736e5d70dc36b60ed24d73636857913565996425be
MD5 35b5126237d5539af8728abed6bc36c7
BLAKE2b-256 e6e304d31de8990d58cf765e8c1c9a3caf91375127d539fcf64bca87bc4a54a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 bf3e8c484cb31d0544f7283b910217ba4efa8ac057b94b692754814cf6970397
MD5 c7aa3b5f4cbade19667c837c8cc07f21
BLAKE2b-256 43c1457c03b395bb77f5feb1d21e96f61fb38d37a1ed35e7892704b26fdc72d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5c5732692415aa4152758cce4d0a8bc9a684637e8b5e8bfa540749777fc83051
MD5 58d05b95e7cdb57eb5713661b4343ae6
BLAKE2b-256 0384213aad874387c14842a01f9c94453dc3c2bbcac5700d9cbfc6c339818d3c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5a5f2389bd090e7201cc852ef332636fc69ff6e4133669b0d7f33b110c360fbe
MD5 dfea17cbae2080283ffbc5700712b485
BLAKE2b-256 86974f7cbfda44ad4ea6c34b85b3e5f3109e33b04bf9f84ec405882783e69c17

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 44b2d65a70e12386b80ba72be7bacd90daa71b97013c5aca6c7f84c468639ead
MD5 94c1a44eb316fec9f8a9489a674fb202
BLAKE2b-256 e55123592b79057b80d682253aeb8c2b29526060b47b8b7b3d851c25fff8a927

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ec69a5ba6f8cd11bdcf9f022b264a4ac8b0b4b044a5215e3c9e0c6ee6859db9d
MD5 f5d91ce25c1f64bd21fc8117a3e65481
BLAKE2b-256 cab096e21a2d65cf3e622406f3649f93af7991a9eeaad0897491fc351e3eb1b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.23-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 17dfb294a9b567ba2f31bce4ec4d9adee0714475bcd7df51e81c7d8af00b21ab
MD5 286e447ea9e985ab4859f3550585a482
BLAKE2b-256 4d9b7fd11bca2f64ce533f724c7ab23333cb624de35a76f3ed3e8a8d33055691

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 Pingdom Monitoring Sentry Error logging StatusPage Status page