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, and Dart ecosystems with a single, fast, and reliable tool.

Why changepacks?

  • ๐ŸŒ True Multi-Language Support - Manage versions across Node.js, Python, Rust, and Dart 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, and Dart 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 package.json โœ… Supported
Python pip, uv pyproject.toml โœ… Supported
Rust Cargo Cargo.toml โœ… Supported
Dart pub pubspec.yaml โœ… Supported

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

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".
    • 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
โ”‚   โ””โ”€โ”€ 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 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}) - 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
  • 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.14-py3-none-win_amd64.whl (4.2 MB view details)

Uploaded Python 3Windows x86-64

changepacks-0.2.14-py3-none-win32.whl (3.8 MB view details)

Uploaded Python 3Windows x86

changepacks-0.2.14-py3-none-musllinux_1_2_x86_64.whl (4.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

changepacks-0.2.14-py3-none-musllinux_1_2_i686.whl (4.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

changepacks-0.2.14-py3-none-musllinux_1_2_armv7l.whl (4.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

changepacks-0.2.14-py3-none-musllinux_1_2_aarch64.whl (4.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

changepacks-0.2.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

changepacks-0.2.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

changepacks-0.2.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

changepacks-0.2.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

changepacks-0.2.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

changepacks-0.2.14-py3-none-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

changepacks-0.2.14-py3-none-macosx_10_12_x86_64.whl (4.2 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 a912a1d4a4096df04d05230afd43ab22ae43509aa4f49da6778896158965f18e
MD5 4444239338704bcf5df031c471871ba8
BLAKE2b-256 154da480db7687c70f139e28c7d5d1543f9d35172ebe4cb5e5b0f6cf48505b3c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for changepacks-0.2.14-py3-none-win32.whl
Algorithm Hash digest
SHA256 1fbd7116c36d01162ca8bc7d72db4b684daa3112dc3c4c63901f70cc47b76a44
MD5 6befb4409b07fa6242bc8bb548afea7e
BLAKE2b-256 9a3cf2ce8f019a0393d8bf8fb36864188847955e6c2f4c366464f5dc15c4ade7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 de6cec5a66a48275a5aed590a2f98c7a075bbed1406de14b7f0748aa367bac12
MD5 69a4957f1f7e3bdd8d8d6a39a3cd9bf2
BLAKE2b-256 a559ea16b3b425dc4c125b518e58ca023c0817932b5719cc6b8d66ae3354e7a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 81e2a04fbf5be60d79768cf3d94e76cc041cde968deaf1492a1bce8aa32906fd
MD5 a4dc44e450fb2107b38661ec6138c585
BLAKE2b-256 e15da34aed96ff578c5854f5f5d16d4401058916d4675e3968575de30021e758

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 93080a28c8dcb4dd2c7d955e594e364596218127291bca2f5627d32be607a87f
MD5 62567d72bcae26e98a53889a491b6f57
BLAKE2b-256 fe3f86460c567b2c9f114df51dd0327ea0ab1caa05e76f53b4c48431c3c76871

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7e16c0be2a6abb9712c8ab2bfddf8faaeb43a92203e890e9eea9e3a201c57f33
MD5 9ef9a7b53cf50d52d0592f1cd8851a71
BLAKE2b-256 54a3b84f69b3d225c0064944d3484ef24c6a78faa4064e4eae91c01cc2e0e0e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3ecb37561da5e87c16ed09124dd7679bc17532900983169a5f33cb29991f05c8
MD5 d3910b949b86fbc31d5ea9c58cf272f0
BLAKE2b-256 0d194cf0fdb7142a99718b72201d9f032d643f17896a51683c41cebd71eb6421

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 4a99300630a3c230977a48cb8aad655cc33bdd9393d78549446ccb1bade7beab
MD5 3190594386fa839c25a585c98a51e306
BLAKE2b-256 89166313af5c68be8082ff5d8cc597d481bd2d17b4d56492d5e39adf2ac99fca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 3732af77f16a2fca73d76c75e65e799caacfed2451c70b72add79934e80a43bf
MD5 044aac50d7ae83903d5c89eeac1b0f75
BLAKE2b-256 507ee2fe02a61e8ba310b3edab44282ccbe8152a796e62cbe72b7c69b1fd1d15

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5ba862c5bdf43a209b6078eb153a9b9213a0cb4ace264ba5310d0978fda2db08
MD5 8e0913b356334c6ea091a603414b812b
BLAKE2b-256 5ccabc20d79a0720752cb00bb4e6fd9a628b0d29229c28bf267404457b7c475e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 31b9d8f5dda06e35f17ba280188b96cde745e873e135ebb1e6e9ffe09f70429a
MD5 439fa955dc3ed4e6e0d47f4789aa7553
BLAKE2b-256 d1da9f125018184270b2c7f493f73537f4c11e1128efb11401537071401107e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1004b0e64e778e4b3b028541d86af8040ff19cc1a3128bd884341022fe238874
MD5 9080ad5f5541492ed27ac1899b10af64
BLAKE2b-256 fa3f1b44adbe862ce286a612ae1158a17fabf75900d7250a22146e830e170707

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.14-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 857b570f9bb5cac048b935e40e040c0cfa3c6db32ae8fa9a4a04c278dc7417f1
MD5 c60d26f9eb85a9f56503ff7db48e44c5
BLAKE2b-256 bcbd53ea71879dcd9d19a9c0e8914dcf567c941ca40d6eb93623a2d4034c6cbc

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