Files
markitect-main/capabilities/release-management/MIGRATION_PLAN.md
tegwick b7e11461f4 chore: rename markitect_project to markitect-main across project
Finishes the in-progress rename so docs, configs, tests, and capability
manifests all reference the current repo name consistently. Fixes two
tests (test_roundtrip_consolidated.py, test_issue_140_roundtrip_simplified.py)
whose hardcoded cwd paths would have broken under the renamed directory.

Archival content under history/, reports/, and roadmap/eat-the-frog/, plus
derived artifacts (.venv_old/, node_modules/, asset_registry.json) are
intentionally left untouched.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 01:57:35 +02:00

14 KiB

Release Management Capability Migration Plan

This document outlines the step-by-step plan to migrate all version management, packaging, and release publication functionality from the main MarkiTect project into the release-management capability.

📋 Migration Overview

Current State

Version management and release functionality is currently scattered across:

  • release.py (main release script)
  • gitea/ directory (package registry client)
  • VERSION_MANAGEMENT.md (documentation)
  • PACKAGE_PUBLISHING.md (documentation)
  • Makefile targets (release automation)
  • setuptools-scm configuration in main pyproject.toml

Target State

All release-related functionality consolidated into:

  • capabilities/release-management/ (self-contained capability)
  • Main project depends on capability for release operations
  • Makefile includes capability's release targets
  • Clean separation of concerns

🚦 Migration Steps

Phase 1: Create Capability Structure COMPLETED

  • Create directory structure
  • Create README.md with comprehensive documentation
  • Create pyproject.toml with full configuration
  • Create main __init__.py with API exports
  • Create release.mk for Makefile integration

Phase 2: Move Core Files and Code

2.1 Move Release Script

Source: release.pyTarget: src/release_management/cli/main.py

Steps:

  1. Copy release.py to src/release_management/cli/main.py
  2. Refactor into proper CLI module structure
  3. Extract core logic into separate modules:
    • SimpleReleaseManagersrc/release_management/core/manager.py
    • Git operations → src/release_management/git/manager.py
    • Package building → src/release_management/core/builder.py
    • Publishing logic → src/release_management/core/publisher.py

Refactoring Plan:

# Current: release.py (monolithic)
class SimpleReleaseManager:
    # All functionality in one class

# Target: Modular architecture
# src/release_management/core/manager.py
class ReleaseManager:
    def __init__(self):
        self.git_manager = GitManager()
        self.builder = PackageBuilder()
        self.publisher = PublishManager()

# src/release_management/git/manager.py
class GitManager:
    # Git-specific operations

# src/release_management/core/builder.py
class PackageBuilder:
    # Package building operations

# src/release_management/core/publisher.py
class PublishManager:
    # Publishing and upload operations

2.2 Move Gitea Package Registry

Source: gitea/ directory → Target: src/release_management/registries/gitea/

File Mapping:

gitea/config.py          → src/release_management/registries/gitea/config.py
gitea/exceptions.py      → src/release_management/registries/gitea/exceptions.py
gitea/package_registry.py → src/release_management/registries/gitea/registry.py
gitea/__init__.py        → src/release_management/registries/gitea/__init__.py

Refactoring:

  1. Create base registry interface: src/release_management/registries/base.py
  2. Create registry factory: src/release_management/registries/factory.py
  3. Adapt GiteaPackageRegistry to implement base interface
  4. Add PyPI registry implementation for future use

2.3 Move Documentation

Source: Documentation files → Target: docs/ directory

File Mapping:

VERSION_MANAGEMENT.md    → capabilities/release-management/docs/version_management.md
PACKAGE_PUBLISHING.md    → capabilities/release-management/docs/package_publishing.md

Updates Required:

  1. Update paths and references in documentation
  2. Add API reference documentation
  3. Create examples directory with usage samples

Phase 3: Update Main Project Integration

3.1 Update Main Makefile

Target: Makefile in main project

Changes:

  1. Include release management Makefile:

    # Add at top of Makefile
    include capabilities/release-management/release.mk
    
  2. Update existing targets to use capability:

    # Old targets
    release-status:
        python release.py status
    
    # New targets (provided by release.mk)
    release-status:
        release status
    
  3. Remove obsolete targets and replace with capability equivalents

3.2 Update Main pyproject.toml

Target: pyproject.toml in main project

Changes:

  1. Add release-management as dependency:

    [project.dependencies]
    release-management = {path = "capabilities/release-management", develop = true}
    
  2. Keep setuptools-scm configuration:

    [tool.setuptools_scm]
    write_to = "markitect/_version.py"
    
  3. Remove release-specific configuration (moved to capability)

3.3 Update Main Project Structure

Cleanup Tasks:

  1. Remove release.py from root
  2. Remove gitea/ directory
  3. Move VERSION_MANAGEMENT.md and PACKAGE_PUBLISHING.md to capability
  4. Update .gitignore if needed
  5. Update documentation references

Phase 4: Testing and Validation

4.1 Create Capability Tests

Target: capabilities/release-management/tests/

Test Structure:

tests/
├── test_manager.py          # ReleaseManager tests
├── test_builder.py          # PackageBuilder tests
├── test_publisher.py        # PublishManager tests
├── test_git_manager.py      # GitManager tests
├── test_gitea_registry.py   # GiteaRegistry tests
├── test_cli.py              # CLI command tests
├── test_integration.py      # End-to-end tests
└── fixtures/
    └── sample_packages/     # Test package artifacts

Test Coverage Goals:

  • Unit tests for all core classes
  • Integration tests for registry interactions
  • CLI command tests
  • Mock-based tests for external dependencies
  • Error handling and edge cases

4.2 Validate Migration

Verification Steps:

  1. Install capability: pip install -e capabilities/release-management/
  2. Run capability tests: cd capabilities/release-management && pytest
  3. Test CLI commands: release --help, release status
  4. Test Makefile integration: make release-status
  5. Perform test release workflow
  6. Verify all existing functionality works

Phase 5: Documentation and Examples

5.1 Create Examples

Target: capabilities/release-management/examples/

Example Scripts:

  • basic_release.py - Simple release workflow
  • custom_registry.py - Adding new registry type
  • ci_integration.py - CI/CD pipeline integration
  • configuration_examples.py - Various configuration patterns

5.2 Update Documentation

Documentation Tasks:

  1. Update main project README to reference capability
  2. Create API reference documentation
  3. Add troubleshooting guide
  4. Document configuration options
  5. Provide migration guide for other projects

🎯 Detailed File Structure After Migration

markitect-main/
├── capabilities/
│   └── release-management/
│       ├── README.md                              ✅ CREATED
│       ├── pyproject.toml                         ✅ CREATED
│       ├── release.mk                            ✅ CREATED
│       ├── MIGRATION_PLAN.md                     ✅ CREATED
│       ├── src/release_management/
│       │   ├── __init__.py                       ✅ CREATED
│       │   ├── _version.py                       # Generated by setuptools-scm
│       │   ├── core/
│       │   │   ├── __init__.py
│       │   │   ├── manager.py                    # ReleaseManager class
│       │   │   ├── builder.py                    # PackageBuilder class
│       │   │   └── publisher.py                  # PublishManager class
│       │   ├── git/
│       │   │   ├── __init__.py
│       │   │   └── manager.py                    # GitManager class
│       │   ├── registries/
│       │   │   ├── __init__.py
│       │   │   ├── base.py                       # Registry interface
│       │   │   ├── factory.py                    # RegistryFactory
│       │   │   ├── gitea/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── config.py                 # From gitea/config.py
│       │   │   │   ├── exceptions.py             # From gitea/exceptions.py
│       │   │   │   └── registry.py               # From gitea/package_registry.py
│       │   │   └── pypi/
│       │   │       ├── __init__.py
│       │   │       └── registry.py               # PyPI registry implementation
│       │   ├── cli/
│       │   │   ├── __init__.py
│       │   │   ├── main.py                       # From release.py
│       │   │   ├── commands.py                   # CLI command implementations
│       │   │   └── utils.py                      # CLI utilities
│       │   └── utils/
│       │       ├── __init__.py
│       │       ├── version.py                    # Version utilities
│       │       └── validation.py                # Release validation
│       ├── tests/
│       │   ├── __init__.py
│       │   ├── test_manager.py
│       │   ├── test_builder.py
│       │   ├── test_publisher.py
│       │   ├── test_git_manager.py
│       │   ├── test_gitea_registry.py
│       │   ├── test_cli.py
│       │   └── fixtures/
│       ├── docs/
│       │   ├── version_management.md             # From VERSION_MANAGEMENT.md
│       │   ├── package_publishing.md             # From PACKAGE_PUBLISHING.md
│       │   ├── api_reference.md
│       │   └── troubleshooting.md
│       └── examples/
│           ├── basic_release.py
│           ├── custom_registry.py
│           └── ci_integration.py
├── Makefile                                      # Updated to include release.mk
├── pyproject.toml                               # Updated with capability dependency
└── markitect/
    └── _version.py                              # Still generated by setuptools-scm

📦 Files to Remove After Migration

Root Directory:

  • release.py (moved to capability CLI)
  • gitea/ directory (moved to capability registries)
  • VERSION_MANAGEMENT.md (moved to capability docs)
  • PACKAGE_PUBLISHING.md (moved to capability docs)

Makefile Targets to Update:

  • Replace individual release targets with capability imports
  • Keep legacy aliases for backward compatibility
  • Update target documentation

🔧 API Design for Capability

Main API Classes

# Primary entry point
from release_management import ReleaseManager

manager = ReleaseManager()
success = manager.publish_release("1.0.0")

# Component access
from release_management import PackageBuilder, PublishManager, GitManager

builder = PackageBuilder()
builder.build_packages()

publisher = PublishManager()
publisher.upload_packages("gitea")

git = GitManager()
git.create_tag("v1.0.0")

# Registry access
from release_management import RegistryFactory

registry = RegistryFactory.create("gitea")
registry.upload_package("package.whl")

CLI Interface

# Main commands
release status                    # Show release status
release validate                  # Validate release state
release tag --version 1.0.0      # Create git tag
release build                     # Build packages
release publish --version 1.0.0  # Complete release workflow
release upload --registry gitea   # Upload existing packages

# Registry management
release registry-info --registry gitea
release registry-list

🚀 Benefits After Migration

For MarkiTect Project

  1. Cleaner main project: Release logic separated from core functionality
  2. Better maintainability: Clear module boundaries and responsibilities
  3. Easier testing: Isolated testing of release functionality
  4. Reduced complexity: Main project focuses on core features

For Release Management Capability

  1. Reusability: Can be used in other Python projects
  2. Independent development: Own release cycle and versioning
  3. Comprehensive testing: Full test coverage for release functionality
  4. Documentation: Dedicated documentation and examples
  5. Extensibility: Easy to add new registries and features

For Users/Developers

  1. Consistent interface: Same commands across all projects using capability
  2. Better documentation: Comprehensive guides and API reference
  3. More features: Enhanced functionality and registry support
  4. Easier contribution: Clear structure for adding features

🎯 Success Criteria

Migration is considered successful when:

  1. All existing release functionality works through capability
  2. Main project Makefile targets work unchanged
  3. CLI commands provide same functionality as current release.py
  4. All tests pass for both capability and main project
  5. Documentation is complete and accurate
  6. Examples demonstrate capability usage
  7. No regression in release workflow functionality

🔄 Rollback Plan

If migration issues arise:

  1. Keep backup: Current files backed up before migration
  2. Incremental approach: Migrate one component at a time
  3. Parallel operation: Keep old and new systems running during transition
  4. Quick revert: Ability to restore original structure if needed

Rollback Steps:

  1. Remove capability dependency from main pyproject.toml
  2. Restore backed up files (release.py, gitea/, docs)
  3. Restore original Makefile targets
  4. Remove capability directory
  5. Test that original functionality works

📅 Migration Timeline

Estimated Duration: 1-2 weeks for complete migration

Phase Breakdown:

  • Phase 1 (Directory Structure): COMPLETED
  • Phase 2 (Code Migration): 2-3 days
  • Phase 3 (Integration): 1-2 days
  • Phase 4 (Testing): 2-3 days
  • Phase 5 (Documentation): 1-2 days

Critical Path:

  1. Code refactoring and migration
  2. Testing and validation
  3. Documentation updates
  4. Final integration testing

This migration plan ensures a systematic, low-risk transition to the capability-based architecture while maintaining all existing functionality and improving the overall project structure.