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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

changepacks-0.2.12-py3-none-musllinux_1_2_x86_64.whl (4.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

changepacks-0.2.12-py3-none-musllinux_1_2_i686.whl (4.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

changepacks-0.2.12-py3-none-musllinux_1_2_armv7l.whl (3.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

changepacks-0.2.12-py3-none-musllinux_1_2_aarch64.whl (4.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

changepacks-0.2.12-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.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

changepacks-0.2.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (4.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

changepacks-0.2.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (3.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

changepacks-0.2.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

changepacks-0.2.12-py3-none-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

changepacks-0.2.12-py3-none-macosx_10_12_x86_64.whl (4.1 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 66e72abfc4d61cc50039076a622c5acae4e45da6bb00dcc30fd2592b1bc6204d
MD5 eaddf61755a03081ea737e6aee03c22e
BLAKE2b-256 ef40d7dda887fc48cc1ed161936f28e3af47cf8ae66f8acedd7de2f081f84052

See more details on using hashes here.

File details

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

File metadata

  • Download URL: changepacks-0.2.12-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.0

File hashes

Hashes for changepacks-0.2.12-py3-none-win32.whl
Algorithm Hash digest
SHA256 a04747bbf84efe85bcf4c1fa66b3f51154ab0837004575794f8fb5d17e2b1207
MD5 ea3cb35eed0bdb60772b05422fc1217b
BLAKE2b-256 ff737f105fdcef11f661a12ae01b0e02d9cab22a091b000786a47419db50af81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d32877cf75bb309d52e0d17449122e78729300a2866b709b648c49e3ab0e3ce6
MD5 cf2aa32719bc2ed3572a67b0c96e28d9
BLAKE2b-256 9e7de5a44f5c8a8ba0df93c1dc2c043c10b049665deec7867caee41ab62b279f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 48464f180be38dd7227ca41beb80910868ddce2585a75199a812124515ce9a4d
MD5 d2a591ec8d72c6734106892673fb0512
BLAKE2b-256 3e775338e4606fa265cd8ed44b3d7035c8e635cd6a3127bdca3b0de2949cce99

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 db2d9c8c28aa20628aab89b0e2cf9851986be19b1dc4ac3563996353f68abb3f
MD5 7f78c8fdb9406a35008e238235683d3f
BLAKE2b-256 020039492c452eaaf29996c983a448ffa2ad7faa7df6a43df6c151ef29720094

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 15ee9d52b35b498f4a6a75a1fdf947f2ad6e0a861148d714f2d97cc522ed3af2
MD5 9ba54b6f1b05b0965a370230690a9f58
BLAKE2b-256 439def9befd5cf9b6b3d4e1feda790f4d6d041fd362f1d6ef78f54b06214e007

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cda12a96a1102ae27b46e9c319c408a1915251ee1bebe5c107a1adb8170ce998
MD5 d7a84587bd4668f1cf63a69423dcd9f3
BLAKE2b-256 9057dc920e044c3b8f8338b4c263e60ca30cb3c1eb5339f3528ad7bf866fc477

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 31e6e63621429d790fdbb47640b3a497c19d2f3f62c4abb2a3224b52a6ba4748
MD5 907e6ad2d0d17b6121eb21dadcd63801
BLAKE2b-256 830b8761ff893a5412cda212f049b0a9e6a71ebab36ce5515984055fdb0b8cae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 91993d89a677a59ffb3efbdd41375f00e2d55a5d81a3e0db810f7aca6241631b
MD5 f4d2f3d4797574fe0c011eeaed208542
BLAKE2b-256 f804a7fea3147e003eb3e1b7969649e0b216d17bfca6e25dd33d12ba30663278

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 e4b1b05ad6805c4333a3f60b0b08c39e39a9840afd96751c69560fe81d616d24
MD5 f140a09be81d81bdeeaec46fdb7f0622
BLAKE2b-256 a49788c443a01963ab5cf4f36aaf437a87bf0f6a2017e2a8c89ab0cde7432952

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e392a3f402b4d8b7ee04bd2f7b4b506ca7599dd8357eac43e6bced09ff903df4
MD5 53be1827f5151a9e88610ce25930a671
BLAKE2b-256 b7c8f19bbca815b0d0b88a525b00cc6a03e11cfc14be59ed0007a338da2c06c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2bea997c2604c715b0944bff53b5b7aede0a1eb99b764c6c17d3a39805ed5745
MD5 892ebf742df0f1d6b62b3f461a10f3e1
BLAKE2b-256 109ad02a96ba4d00cd830046fc70e4dbf50a9b73726c8be7b46424ca501fda45

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for changepacks-0.2.12-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 cb4dd8361c8cd8025ad24949e36e491369e5f4ae34bf3e4bd3f5d32375d35e56
MD5 34ee30c0813a808bd5dc49a5a4d2f597
BLAKE2b-256 26f7803af0764e6f75e9fdfbe1d611afa910ad8931ddf2c69b3e63c00b00166e

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