EmberClone/scripts/phase47_features.py

98 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""Phase-47: standalone components — Receipt, OrderSummary, Calendar, MapPlaceholder."""
from __future__ import annotations
import asyncio, datetime, json, sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
from phase2_features import Feature, FileGen, ROOT, log, log_section
from phase3_features import run_feature_v2
PHASE_STATE = ROOT / ".phase47-state.json"
FEATURES: list[Feature] = [
Feature(
name="receipt-component",
description="Receipt-Layout (Belegdruck)",
files=[FileGen(
path="apps/web/src/components/Receipt.tsx",
purpose=(
"Receipt-Component. Props: items (array {label, amount}), total, currency? (default ''). "
"Vertikal: Items mit dotted-line zwischen label und amount. Total fett unten. Mono-font. "
"Tailwind. Export default."
),
)],
),
Feature(
name="order-summary-component",
description="OrderSummary für Checkout",
files=[FileGen(
path="apps/web/src/components/OrderSummary.tsx",
purpose=(
"OrderSummary-Component. Props: lineItems (array {label, qty, priceCents}), subtotalCents, taxCents, totalCents. "
"Tabelle mit qty × label, Preis. Subtotal/Tax/Total summary block unten. "
"Tailwind. Export default."
),
)],
),
Feature(
name="calendar-month-grid-component",
description="MonthGrid (read-only Display-Komponente)",
files=[FileGen(
path="apps/web/src/components/CalendarMonthGrid.tsx",
purpose=(
"CalendarMonthGrid-Component. Props: year, month (0-11), highlightDates?: array Date, onDayClick?(date). "
"Grid 7 Spalten x 6 Reihen. Header Mo-So. Heutiger Tag highlighted. Klick auf Day-Cell ruft onDayClick. "
"Tailwind. Export default."
),
)],
),
Feature(
name="map-placeholder-component",
description="MapPlaceholder (kein echtes Map, nur grayed)",
files=[FileGen(
path="apps/web/src/components/MapPlaceholder.tsx",
purpose=(
"MapPlaceholder-Component. Props: lat?, lng?, address?, height? (default '300px'). "
"Grauer Box mit Map-Icon (lucide MapPin) zentriert + 'Karte nicht verfügbar' + optional address. "
"Tailwind. Export default."
),
)],
),
]
def load_state():
if PHASE_STATE.exists():
return json.loads(PHASE_STATE.read_text())
return {"completed_features": [], "current_feature": None, "started_at": datetime.datetime.now().isoformat()}
def save_state(state):
PHASE_STATE.write_text(json.dumps(state, indent=2))
async def main():
log_section("🚀 Phase-47 Codegen-Run gestartet")
state = load_state()
for feature in FEATURES:
if feature.name in state.get("completed_features", []):
continue
state["current_feature"] = feature.name; save_state(state)
try:
success = await run_feature_v2(feature)
state.setdefault("completed_features" if success else "attempted_features", []).append(feature.name)
save_state(state)
except Exception as e:
log(f"{feature.name} crashed: {e}", level="ERROR")
state.setdefault("attempted_features", []).append(feature.name); save_state(state)
log_section("Phase-47 Run beendet")
log(f"OK: {len(state.get('completed_features', []))}, Attempted: {len(state.get('attempted_features', []))}, Total: {len(FEATURES)}")
return 0
if __name__ == "__main__":
sys.exit(asyncio.run(main()))