claude-configs/skills/major-domo/cli_injuries.py
Cal Corum 6201b4c9af Major Domo CLI: modular refactor + 6 new command modules
Refactored monolithic cli.py into modular architecture:
- cli_common.py: shared state, console, output helpers
- cli_transactions.py: list + simulate (compliance checker)
- cli_injuries.py: injury listing with team/active filters
- cli_stats.py: batting/pitching leaderboards
- cli_results.py: game results
- cli_schedule.py: game schedules

Also: team get now shows salary_cap, SKILL.md fully updated
with CLI docs, flag ordering warning, and compliance workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 11:24:18 -06:00

144 lines
4.2 KiB
Python

#!/usr/bin/env python3
"""
Major Domo CLI - Injury Operations
This module provides injury listing and filtering commands.
"""
from typing import Annotated, Optional
import typer
from cli_common import (
console,
state,
output_json,
output_table,
handle_error,
get_season,
)
injuries_app = typer.Typer(help="Injury operations")
@injuries_app.command("list")
def injuries_list(
team: Annotated[
Optional[str],
typer.Option("--team", "-t", help="Filter by team abbreviation"),
] = None,
active: Annotated[
bool, typer.Option("--active", "-a", help="Only show active injuries")
] = False,
season: Annotated[
Optional[int], typer.Option("--season", "-s", help="Season number")
] = None,
sort: Annotated[
str,
typer.Option(
"--sort", help="Sort order (start-asc, start-desc, return-asc, return-desc)"
),
] = "return-asc",
):
"""List injuries with optional filtering"""
try:
season = get_season(season)
# Resolve team abbreviation to team ID if provided
team_id = None
team_abbrev = None
if team:
team_abbrev = team.upper()
try:
team_obj = state.api.get_team(abbrev=team_abbrev, season=season)
team_id = team_obj["id"]
except Exception:
console.print(
f"[red]Error:[/red] Team '{team_abbrev}' not found in season {season}"
)
raise typer.Exit(1)
# Call API with resolved parameters
result = state.api.get(
"injuries",
season=season,
team_id=team_id,
is_active=active if active else None,
sort=sort,
)
injuries = result.get("injuries", [])
if state.json_output:
output_json(injuries)
return
if not injuries:
filter_parts = []
if team_abbrev:
filter_parts.append(f"team {team_abbrev}")
if active:
filter_parts.append("active")
filter_str = " (".join(filter_parts) + ")" if filter_parts else ""
console.print(
f"[yellow]No injuries found in season {season}{filter_str}[/yellow]"
)
return
# Format table rows
rows = []
for injury in injuries:
player = injury.get("player", {})
player_name = player.get("name", "N/A")
player_team = player.get("team", {})
team_abbrev_display = (
player_team.get("abbrev", "N/A")
if isinstance(player_team, dict)
else "N/A"
)
total_games = injury.get("total_games", 0)
start_week = injury.get("start_week", 0)
start_game = injury.get("start_game", 0)
end_week = injury.get("end_week", 0)
end_game = injury.get("end_game", 0)
is_active = injury.get("is_active", False)
# Format start/end as wXXgY
start_str = f"w{start_week:02d}g{start_game}" if start_week else "N/A"
end_str = f"w{end_week:02d}g{end_game}" if end_week else "N/A"
active_str = "Yes" if is_active else "No"
rows.append(
[
player_name,
team_abbrev_display,
total_games,
start_str,
end_str,
active_str,
]
)
# Build title
title = f"Injuries - Season {season}"
if team_abbrev:
title += f" ({team_abbrev})"
if active:
title += " (Active Only)"
output_table(title, ["Player", "Team", "Games", "Start", "End", "Active"], rows)
except typer.Exit:
raise
except Exception as e:
handle_error(e)
# Make list the default command when running 'majordomo injuries'
@injuries_app.callback(invoke_without_command=True)
def injuries_default(ctx: typer.Context):
"""Default to list command if no subcommand specified"""
if ctx.invoked_subcommand is None:
ctx.invoke(injuries_list)