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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

changepacks-0.2.30-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.30-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 224993bd253afc6401d5375549e9f363d9950b5136590efd58a3d71fc131f99d
MD5 389c830c523a90425df64916b731c3c0
BLAKE2b-256 12fe66a0158b5db37c69fc9894dea0aa51b1199c2f2892c79b236e5a04626e67

See more details on using hashes here.

File details

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

File metadata

  • Download URL: changepacks-0.2.30-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.30-py3-none-win32.whl
Algorithm Hash digest
SHA256 abb799860f26e4b0a7bb3341f982ce17402ba148208f90d5a8b269e9b7593096
MD5 fa2cb4a1636e5eb091ec241e2d621ada
BLAKE2b-256 56b71f24ec58cb1f2f9c24a8a850e09595b38c0976a725d8f6dee74fa9af0fa0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9169c49e6b73282fecfdce88c0758dfb71abda9304d4e991f0dd7bfbd244ae9b
MD5 107b8c731c16c5d9ed516f17e0479fb4
BLAKE2b-256 a8b94967d28b7d163282f26333014037c961c49c079cf3ac70bdfc1ab7b0a509

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 1b7cd08bf0f9ae489d8757fbc702f1b4a38e3fc9b6150a81710928efaf0314d2
MD5 6a3e25f460c156182eb4d2bc5b51ffab
BLAKE2b-256 c7e1a32b93ab2790c1fe08cda49b61bd4b4c350442c2ddca9fb2ed1ae343b94a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 6014dc8b41d2f27da6b60c336469e1a8e105f4ddb17b0a2fe3c30dd7f09c2cb5
MD5 ffc607334f85e30706e3c8df3578bf23
BLAKE2b-256 b23817f448a91b05a2bb7d4e5912e7471289cd307785cbde66deb6a68c689def

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ab68396561abb4f56967d678c66e70e5d78a4bca3260480c2618dcb5a8a486a9
MD5 10653ef285a929dd794e6d9ac6e07a30
BLAKE2b-256 6abf1368f9666186e0cb5ef2777211231aaae4a5b311b2dc8123b6bc0b1404c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3be56776a7cb2ccf03e69476b1574a2768e19917bc95e7b93da3e4a7c3a592da
MD5 a50821d5e0e5898072a4ab0b6b6832b4
BLAKE2b-256 b06004c6360f97594fb5b7d21a825d0153e2f8047c971e2e98afbba1f55964b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 ac31db460d7e82e354e394acfcf5f946cb9996aedc6a4fc885b48467a4f9f03b
MD5 b5ad78fdd838b6fd1eee557d45eeb0cd
BLAKE2b-256 9d07d9e60ec87915dbe07ea92c023426a320f29e1e0594747fb4624d3ec4fbe0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 66d843cd54e85a1f1b5fc9cf6d6244afe438b2ec5aa8c6fc0f3a626a38f1542c
MD5 19bc424b7e45e9d14d8be5795e7652d4
BLAKE2b-256 f48eaf4c1972ff25871576cb3125d13269dd5f02a15ee2cded185e724b61af0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 4c9e73c15badd974aa5428cc21f7c54fc1955bb5852b5a4136d56e7ec3670f76
MD5 33c2608475e6d3b9b14990b5d6fb59b0
BLAKE2b-256 262551cdddbf5c65809bd8ad3bb0dd4ead5ece4cdf168c4d56a971567a7a6a6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2040c3f30584ba283efd26136165e155c79080db6b971b9542ed2569ed8e987a
MD5 b016db52f3723a70b4a0dbef1bec21ce
BLAKE2b-256 0673f288a692112d6d728e30c417ba2d6aabb3d2b72bc4eac7fef536f5bba3be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 755ea5b969cfa896fd1e4a9f6e7d32c70ae14d3bf5f3f40c81081d1eaa7acb7e
MD5 f8c455922d87e4031ed42021bdabebcc
BLAKE2b-256 5fa3d411e19c25ecbe4d1263c4c4ceef7186030f1ade5bc9cd8f4b49b7f4a635

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.30-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 00edee5f71636d9e67e2f70df1252f5a0a9428a47f85acc389d47cfa2890a36a
MD5 5d224f7bd1f76f240332b1bb220e7078
BLAKE2b-256 a403da7bd3379651f2f7bab6e64c2c22bfab7f0f21db3f87e42c2ee6aa0eb21a

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