16 releases
Uses new Rust 2024
| new 0.2.14 | Dec 26, 2025 |
|---|---|
| 0.2.13 | Dec 24, 2025 |
| 0.2.9 | Nov 27, 2025 |
| 0.1.7 | Nov 13, 2025 |
#608 in Web programming
Used in changepacks
52KB
895 lines
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
updateOnin 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
- Initialize changepacks in your repository:
changepacks init
- Create a changepack when you make changes:
changepacks
This opens an interactive session to select changed projects and write release notes.
- Update versions from changepack logs:
changepacks update
- 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:
- Discover all projects in your workspace
- Show which projects will be published
- 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).
- Set language-specific commands using language keys:
- 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).
- Key: glob pattern for trigger packages (e.g.,
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
- Project Detection: Walks git tree to discover
package.json,Cargo.toml,pyproject.toml,pubspec.yamlfiles - Change Tracking: Uses git diff to detect changed files, marking projects with modifications
- Changepack Logs: Stores version bump intentions in
.changepacks/changepack_log_*.jsonwith notes and timestamps - Version Updates: Reads changepack logs, calculates new versions (semver), updates files while preserving formatting
- Dependency Resolution: Topologically sorts projects by dependencies for correct publish order
- 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
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - 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
Dependencies
~37โ55MB
~1M SLoC