#!/usr/bin/env python3 """Transition project between phases.""" import argparse import json import os from datetime import datetime VALID_PHASES = ["DESIGN_PHASE", "DESIGN_REVIEW", "IMPLEMENTATION_PHASE"] VALID_TRANSITIONS = { "DESIGN_PHASE": ["DESIGN_REVIEW"], "DESIGN_REVIEW": ["DESIGN_PHASE", "IMPLEMENTATION_PHASE"], "IMPLEMENTATION_PHASE": ["DESIGN_PHASE"] } def load_manifest(manifest_path: str) -> dict: """Load manifest.""" with open(manifest_path) as f: return json.load(f) def save_manifest(manifest_path: str, manifest: dict): """Save manifest.""" with open(manifest_path, "w") as f: json.dump(manifest, f, indent=2) def main(): parser = argparse.ArgumentParser(description="Transition project phase") parser.add_argument("--to", required=True, choices=VALID_PHASES, help="Target phase") parser.add_argument("--manifest", default="project_manifest.json", help="Manifest path") args = parser.parse_args() manifest_path = args.manifest if not os.path.isabs(manifest_path): manifest_path = os.path.join(os.getcwd(), manifest_path) if not os.path.exists(manifest_path): print(f"Error: Manifest not found at {manifest_path}") return 1 manifest = load_manifest(manifest_path) current_phase = manifest["state"]["current_phase"] target_phase = args.to if target_phase not in VALID_TRANSITIONS.get(current_phase, []): print(f"Error: Cannot transition from {current_phase} to {target_phase}") print(f"Valid transitions: {VALID_TRANSITIONS.get(current_phase, [])}") return 1 # Update phase manifest["state"]["current_phase"] = target_phase # Add to history manifest["state"]["revision_history"].append({ "action": "PHASE_TRANSITION", "timestamp": datetime.now().isoformat(), "details": f"Transitioned from {current_phase} to {target_phase}" }) # If transitioning to implementation, mark entities as approved if target_phase == "IMPLEMENTATION_PHASE": for entity_type in ["pages", "components", "api_endpoints", "database_tables"]: for entity in manifest["entities"].get(entity_type, []): if entity.get("status") == "DEFINED": entity["status"] = "APPROVED" save_manifest(manifest_path, manifest) print(f"Transitioned to {target_phase}") return 0 if __name__ == "__main__": exit(main())