From 0b5098370ad255a6d01ffeddf7688b9137746a5e Mon Sep 17 00:00:00 2001 From: tegwick Date: Tue, 6 Jan 2026 21:14:33 +0100 Subject: [PATCH] feat: implement optimization #4 - version-tag consistency check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add version-tag consistency validation to prevent mismatched releases: - Integrate validate_changelog_version() into create_tag() workflow to ensure CHANGELOG has version section before creating git tag - Add check_version_consistency() method to ReleaseManager for manual consistency verification - Add 'release check-consistency --version X.Y.Z' CLI command to verify CHANGELOG and git tag alignment - Prevent tag creation if CHANGELOG missing version section - Provide helpful tips when validation fails This ensures git tags and CHANGELOG versions stay synchronized, preventing incomplete or inconsistent releases. šŸ¤– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .../src/release_management/cli/main.py | 25 +++++++++++++++++++ .../src/release_management/core/manager.py | 22 +++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/capabilities/release-management/src/release_management/cli/main.py b/capabilities/release-management/src/release_management/cli/main.py index e809f330..87387e16 100644 --- a/capabilities/release-management/src/release_management/cli/main.py +++ b/capabilities/release-management/src/release_management/cli/main.py @@ -261,5 +261,30 @@ def version_info(ctx, suggest: bool): print(f" {key.replace('_', ' ').title()}: {value}") +@main.command('check-consistency') +@click.option('--version', required=True, help='Version to check (e.g., 0.10.0)') +@click.pass_context +def check_consistency(ctx, version: str): + """Check consistency between CHANGELOG version and git tags.""" + manager = ReleaseManager( + project_root=ctx.obj['project_root'], + dry_run=ctx.obj['dry_run'], + force=ctx.obj['force'] + ) + + is_consistent, issues = manager.check_version_consistency(version) + + if is_consistent: + print(f"āœ… Version {version} is consistent:") + print(f" - CHANGELOG has section for {version}") + print(f" - Git tag v{version} exists") + print(f" - [Unreleased] section present") + else: + print(f"āŒ Version {version} has consistency issues:") + for issue in issues: + print(f" - {issue}") + sys.exit(1) + + if __name__ == '__main__': main() \ No newline at end of file diff --git a/capabilities/release-management/src/release_management/core/manager.py b/capabilities/release-management/src/release_management/core/manager.py index 88cb67b2..63fb0c90 100644 --- a/capabilities/release-management/src/release_management/core/manager.py +++ b/capabilities/release-management/src/release_management/core/manager.py @@ -94,6 +94,15 @@ class ReleaseManager: print(f" - {issue}") return False + # Check version-tag consistency (ensure CHANGELOG has version section) + changelog_valid, changelog_issues = self.validator.validate_changelog_version(version) + if not changelog_valid and not self.force: + print(f"āŒ Cannot create tag for version {version}:") + for issue in changelog_issues: + print(f" - {issue}") + print("\nšŸ’” Tip: Add a section for version {version} to CHANGELOG.md before tagging") + return False + return self.git_manager.create_tag(version, message, push=push) def build_packages(self) -> bool: @@ -213,4 +222,15 @@ class ReleaseManager: Returns: List of commit messages since last tag """ - return self.git_manager.get_commits_since_tag() \ No newline at end of file + return self.git_manager.get_commits_since_tag() + + def check_version_consistency(self, version: str) -> Tuple[bool, List[str]]: + """Check consistency between CHANGELOG version and git tags. + + Args: + version: Version to check (e.g., "0.10.0") + + Returns: + Tuple of (is_consistent, list_of_issues) + """ + return self.validator.check_version_tag_consistency(version) \ No newline at end of file