76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
#!/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())
|