"""Run item analysis on a quiz and, optionally, have Claude review flagged items. Usage: python analyze.py # sample data, stats + Claude review python analyze.py --no-claude # stats only, no API key needed python analyze.py --quiz my_quiz.json --responses my_responses.csv --out my_report.md """ import argparse from pathlib import Path import itemstats from report import build_report HERE = Path(__file__).resolve().parent def main(): parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("--quiz", default=HERE / "data" / "quiz.json", type=Path) parser.add_argument("--responses", default=HERE / "data" / "responses.csv", type=Path) parser.add_argument("--out", default=HERE / "report.md", type=Path) parser.add_argument("--no-claude", action="store_true", help="skip the Claude review step") args = parser.parse_args() quiz = itemstats.load_quiz(args.quiz) responses = itemstats.load_responses(args.responses) stats = itemstats.analyze(quiz, responses) flagged = sum(1 for s in stats.items if s.flags) print(f"Analyzed {stats.n_items} items from {stats.n_learners} learners. {flagged} flagged.") reviews = [] if not args.no_claude and flagged: from claude_review import review_flagged_items # only needs the SDK when used reviews = review_flagged_items(quiz, stats.items) args.out.write_text(build_report(quiz, stats, reviews)) print(f"Report written to {args.out}") if __name__ == "__main__": main()