monochange 0.6.2

Manage versions and releases for your multiplatform, multilanguage monorepo
Documentation
#![allow(clippy::large_futures)]
#![allow(clippy::disallowed_methods)]
use std::fs;

use serde_json::Value;

mod test_support;
use test_support::monochange_command;
use test_support::setup_scenario_workspace;

#[test]
fn release_apply_with_github_source_updates_workspace_and_deletes_changesets() {
	let tempdir = setup_scenario_workspace("monochange/release-apply-github");
	let root = tempdir.path();

	let output = monochange_command(Some("2026-04-06"))
		.current_dir(root)
		.arg("release")
		.arg("--format")
		.arg("json")
		.output()
		.unwrap_or_else(|error| panic!("release command: {error}"));
	assert!(
		output.status.success(),
		"release failed: {}",
		String::from_utf8_lossy(&output.stderr)
	);

	let parsed: Value = serde_json::from_slice(&output.stdout)
		.unwrap_or_else(|error| panic!("release json: {error}"));
	assert_eq!(parsed["version"].as_str(), Some("1.1.0"));
	assert_eq!(parsed["dryRun"].as_bool(), Some(false));
	assert!(
		!root.join(".changeset/feature.md").exists(),
		"expected release apply to delete processed changeset"
	);
	assert!(
		fs::read_to_string(root.join("Cargo.toml"))
			.unwrap_or_else(|error| panic!("read Cargo.toml: {error}"))
			.contains("version = \"1.1.0\""),
		"expected release apply to update the workspace manifest"
	);
	assert!(
		fs::read_to_string(root.join("crates/core/extra.toml"))
			.unwrap_or_else(|error| panic!("read crates/core/extra.toml: {error}"))
			.contains("version = \"1.1.0\""),
		"expected release apply to update configured package versioned files"
	);
	assert!(
		fs::read_to_string(root.join("group.toml"))
			.unwrap_or_else(|error| panic!("read group.toml: {error}"))
			.contains("version = \"1.1.0\""),
		"expected release apply to update configured versioned files"
	);
}