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           # Verify release flow by running each project's publish command in dry-run mode (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 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, changepacks publish --dry-run derives the dry-run command by appending --dry-run to the resolved publish command (e.g., npm publish --dry-run, cargo publish --dry-run).
    • Required for ecosystems whose publish tool does not support --dry-run natively (e.g., dotnet nuget push); without an override these projects are skipped with a warning.
  • 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.29-py3-none-win_amd64.whl (4.3 MB view details)

Uploaded Python 3Windows x86-64

changepacks-0.2.29-py3-none-win32.whl (4.0 MB view details)

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

changepacks-0.2.29-py3-none-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

changepacks-0.2.29-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.29-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 7293ba51b7e5e46deb36d0c1eebc93c9943f514e06d6b3e3a6bd88cffb097633
MD5 7e83ea74c1f8e6dfa31ffe9e1b9af3f1
BLAKE2b-256 7f4b5098ac8f3462e0ac34e804b06e95a787513b8b2898b8a267e76ad052e231

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for changepacks-0.2.29-py3-none-win32.whl
Algorithm Hash digest
SHA256 cc113a66e8f8525f991ade617c79101dfeb280f234c1400190ab40cd8830b7fe
MD5 63f6fa43fa7319bbcf3ef05e5bff99a5
BLAKE2b-256 fa01430e4a5e9295071f9b30da9a91c4e1c6cf831941e646f7407e0551fbd283

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3560381f9ecfebef54aef55ee0d5223ee9005edc9f538a1bae1f85b66dcfa306
MD5 625b52f1457aa360d6706eeb8d3dbcbd
BLAKE2b-256 d95f95b12570caff8bde7d0d4c968a546d3d3d3d1b45abf9f8c9e09018570d08

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 968a3ad0e78473df26453f54b992b9bf0bd6ebc469f1dd43a3323f5d20922abf
MD5 8658edc1cbb4f753b038c18b900ff477
BLAKE2b-256 19108642786e9dd326373efa370a9fb89f4097903b4104ff27c5c2072e04fcbf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 693592e8bfa221e838202bb0d7536948e001e106ee9994ffeb528ee5e06f70d6
MD5 8681f7b3d0ff6ffc39a0c558e79596c0
BLAKE2b-256 0e4bce8d2afeaad320a84eba31f7b6d82d202e88416f423ad5ab411823a21f29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0ecb45698336c981fcb7f168470828eaa2554cd06387fa2e471061d7cd57d746
MD5 c5bf86a7984c199b04e375710584de58
BLAKE2b-256 866f5aa9de43e664f4000765e10d924ea4f6a47f3dbfc8e4ec533ce9b818f80d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8dc543c2c7e3e8687f78e24b584ba84a1ac734158dc1b7966fe868a7044b18f1
MD5 671b2391788ed4b430e92b6a463f14c8
BLAKE2b-256 6df8d89c6dcc072ec33719254e8540d1bbe85430a00ff60f04c3d9b43ab2963f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 b8e8d78ad172ffae2c67e8cf5e12f8c4876f06c9aa3312984bfab9cf694d8af8
MD5 1b67d33f76e6e6285a9473d87e62127c
BLAKE2b-256 98f2ecb648ad55331f1d9f7376eb07f732b74f9b1839834831c79a28843e34a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6a150ade9504af9c44659994f86b12c977f6031613336e280618744161216997
MD5 e2f719c0dd00a03522d83483e5e89893
BLAKE2b-256 4ace391d919f0d668cac80c496e7c36803980fef2987203f19bad96f5d750871

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 057a15dc299244a25b8bd96eae464c87d40cf2c992fe2a36a511cad08e58fbc9
MD5 b387167c81ec1847aaccb452496ae56e
BLAKE2b-256 37f5c330acdb2cd9e142e531e6c2893947bcc59d491ea689d15ad3f67cb9aa8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d8ee9070422ce7925870a177882744e114115ba67c797cd69288814cf7034c36
MD5 22376f650350bc0ac6b06c981c5b40bd
BLAKE2b-256 40982aef1dbbe757bde60092353481eb05ee244c6b2cd3065190bce198101181

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 68f07dd70b6a019c0f4423dc3fd407f30abefba462e62d0d6214bdd8a09dbdb3
MD5 8a2ad473ed90ee7bb2077356bc8fdefd
BLAKE2b-256 904d933610c6bdbecd5c0e2c6fe7776c72fca27a4e7dd6fc1a33b408d14e18d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.29-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d5e708e66eaaeb05bcf14c03a53699a1ac0d8b34330347d8aa1ee7b55d06237c
MD5 fc4084407a53e1455409be21014fdf8b
BLAKE2b-256 94db0c733c1de55f526e31198cddcbf1bb8895da557c0ac9801c4326ae396bb7

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