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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

changepacks-0.2.22-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.22-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

changepacks-0.2.22-py3-none-macosx_10_12_x86_64.whl (4.3 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 30ad814fb2d5772403da799901d3f69ef6e2089335223c408686a64ef7606d60
MD5 e8ad6f967204899f972625b0d6ea5240
BLAKE2b-256 5efcce37e6e37626b80e46895ca73e933cf6a1f2d408a8a4a04b6b094eac4170

See more details on using hashes here.

File details

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

File metadata

  • Download URL: changepacks-0.2.22-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.2

File hashes

Hashes for changepacks-0.2.22-py3-none-win32.whl
Algorithm Hash digest
SHA256 a701f1770823f92fa8c9527428c95e050a080cb737eaa6fdeb72b6777283ad03
MD5 8e31c3fb09f02a0c121ebe81e3d7d475
BLAKE2b-256 fbd257270098183dbec027653cf42443949e9a7984a4106139a995d670f0d88f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ffd645d680a6c69fe04238ae5a97c145aa4646276870fae59dba804679e6de1f
MD5 dbfa202ca541c30e8b71c07db1371aa9
BLAKE2b-256 3e43210bcbd3be511f38478283f2f57a88d710fa880cdc200b1722b420d03ee6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 43b714cc9c84385c79b25eff254c5978f812743854b31ae71ee346648ac083cf
MD5 a62719879f548549b8ed69c83c436288
BLAKE2b-256 b6b3fd3759796a831d3719cfa808a55524b5193a85a3d773382bca789cd2b6be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 57394c61733d1285db10a2de1a4047e472c1bf671faa522ea857752257436ced
MD5 495f2ee36da88892eef15f198a4f0a53
BLAKE2b-256 1a71c07e79b0f2aeefe5cb696a981b21554da185129f8dc6828ab2786c7b719c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 bccbb1e019905aede76a36f3d86890f708700740f8c92d8c5e4f1941bcef4c6c
MD5 23393fae3739dfc73acfb79fcc9cfab1
BLAKE2b-256 898e56b00484b180e1531752987bc187bb3c50748df640a7ac0546ea4f79094c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 48a28c8d3eb72ccdb39fb41245fe0620b6436ca740dcb93e16e503fe14123c7c
MD5 28468bc4645d5edc8579d79e894378b4
BLAKE2b-256 f820445646009edd06461fc7d6327d0c267d8083c4f397bee86e6f8094d66017

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 cb50decd0746608ec3d26c7afd7aa94071c6a411f78b440d36a367a9e93eb4b2
MD5 c8411b8e6f30a4bc7379bbe2e2c82643
BLAKE2b-256 a4f0ddef235e03adbb1f7e7328d8c4b43d9c49037aeab595567b3da954e666e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ec213e5739eaee4bdb3ad8d996dcbc92640843f9407ef1889e2802a19c1e5de6
MD5 a884cc64cef0dc34cdb0a880f467e136
BLAKE2b-256 7897adf163b86811d807272561402e925d7625d883e1baf08b4b6a3e5142e885

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 7cd71a0c665508ab14ff84a427b493cd800cfd22e2329500a746821a83624fec
MD5 f507e42d73c81a67810d5a5800108297
BLAKE2b-256 c113406653cd79a58c386883c935df52d85c6b37102966c49d019bf101d06102

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e8a8e35f821f268b50c5e1e8bcff96cdc30af9bd685737afa5cf381268c3d7cc
MD5 e7339420aeb95fe0905ca98fc79b45fe
BLAKE2b-256 901b84fdba6ca7b9e737856ee034121cba277bd453e3b8113974de00f905277a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d398a6356d20e5d7fd1f03018bd860b51ae889f9205061b8ba3c19ce5589118
MD5 b6e2522d1c0f5be27a9e74b839100b94
BLAKE2b-256 2636cb54ee97b78447ef7d791c8dd7ce69cede4f09d1323d8f4de9e53798f635

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.22-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4751b6c4c60e70246cf3e7273a868a7434ff7cb3fb4a718ab089f205cffc044e
MD5 9fcda667dc9eecc69a2aa4544e404768
BLAKE2b-256 b763807f597ab6802259ce1426d4b83039f4781c62198df3062cb34a9d203aaa

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