Spaces:
Sleeping
Sleeping
| """CLI orchestration: weekly planning and state snapshots (uses services, not HTTP).""" | |
| from __future__ import annotations | |
| import json | |
| import click | |
| from sqlmodel import Session | |
| from tracker.agent_profile import resolve_agent_profile | |
| from tracker.config import load_config | |
| from tracker.db import get_engine_for_config | |
| from tracker.planner_schemas import ScheduleWorkoutsInput | |
| from tracker.planner_service import ( | |
| build_tracker_state, | |
| fetch_calendar_view, | |
| run_schedule_workouts, | |
| ) | |
| def cli() -> None: | |
| """Tracker orchestration commands.""" | |
| def weekly_plan(days_ahead: int, duration_minutes: int, apply_schedule: bool) -> None: | |
| """Load profile, show calendar window, optionally schedule workouts in Google Calendar.""" | |
| cfg = load_config() | |
| profile = resolve_agent_profile(cfg) | |
| click.echo(json.dumps({"profile": profile.model_dump(mode="json")}, indent=2)) | |
| cal = fetch_calendar_view(days_ahead) | |
| click.echo(json.dumps({"calendar_events": len(cal.events), "free_blocks": len(cal.free_blocks)})) | |
| if apply_schedule: | |
| body = ScheduleWorkoutsInput(days_ahead=days_ahead, duration_minutes=duration_minutes) | |
| with Session(get_engine_for_config(cfg)) as session: | |
| created, err = run_schedule_workouts(session, cfg, body) | |
| if err is not None: | |
| click.echo(err, err=True) | |
| raise SystemExit(1) | |
| click.echo(json.dumps([e.model_dump() for e in created], indent=2)) | |
| else: | |
| click.echo("(use --apply-schedule to create calendar events)") | |
| def day_status() -> None: | |
| """Print tracker state JSON (weight, last workout, progression).""" | |
| cfg = load_config() | |
| with Session(get_engine_for_config(cfg)) as session: | |
| state = build_tracker_state(session, cfg) | |
| click.echo(state.model_dump_json(indent=2)) | |
| def sync_state() -> None: | |
| """Same snapshot as day-status.""" | |
| cfg = load_config() | |
| with Session(get_engine_for_config(cfg)) as session: | |
| state = build_tracker_state(session, cfg) | |
| click.echo(state.model_dump_json(indent=2)) | |
| def main() -> None: | |
| cli() | |
| if __name__ == "__main__": | |
| main() | |