# AGENTS.md - Guidelines for Agentic Coding ## Project Overview This is a Flask web application - a "Jeopardy-style" quiz game about the Russian short story "Уроки французского" by Valentin Rasputin. **Tech Stack:** - Backend: Python 3.13 with Flask - Frontend: HTML, CSS, JavaScript (vanilla) - Data Storage: JSON file (`data/questions.json`) - State: Browser localStorage (client-side) - Container: Docker ## Build/Test Commands ### Running Locally (without Docker) ```bash # Activate virtual environment source venv/bin/activate # Run Flask app (default port 5000) python src/app.py # Run on specific port python -c "from src.app import app; app.run(port=5002)" ``` ### Running with Docker ```bash # Build image ./build.sh # Run container ./run.sh # Stop container docker stop sigra && docker rm sigra ``` **Note:** Dockerfile copies only `src/` directory into the container (app.py, data/, templates/, static/). ### Manual Testing This project does not have a formal test suite. For manual testing: - Use `curl` to test API endpoints - Test in browser at http://localhost:5000 ## Code Style Guidelines ### Python (app.py) **Imports** - Standard library first, then third-party: ```python import json from flask import Flask, render_template, request, redirect, url_for, make_response ``` **Formatting** - Use 4 spaces for indentation - Maximum line length: 100 characters - Blank lines: 2 between top-level definitions, 1 between function definitions **Naming Conventions** - `snake_case` for variables, functions - `PascalCase` for classes - `UPPER_SNAKE_CASE` for constants **Error Handling** - Use try/except for file operations (JSON loading/saving) - Return proper HTTP error codes (400, 404, 500) - Log errors to console **Flask-Specific** - Use `app.secret_key` for sessions - Always use `ensure_ascii=False` with JSON for Cyrillic support - Use `context_processor` for global template variables ### JavaScript (templates/*.html) **General** - Use vanilla JavaScript (no frameworks) - Prefer `var` over `let/const` for compatibility - Use `function` keyword instead of arrow functions **Event Handling** - Use `onclick` directly in HTML or `element.onclick = function()` - Avoid `addEventListener` for simplicity **DOM Manipulation** - Use `document.getElementById` and `document.querySelector` - Template literals for dynamic content - Use `JSON.parse()` and `JSON.stringify()` for localStorage **Naming** - camelCase for variables and functions ### HTML/CSS (templates/*.html) **Template Syntax (Jinja2)** - Use `{% for %}` loops with `enumerate()` for indexed iteration - Pass data via `{{ variable }}` syntax - Use `|tojson` filter for JavaScript data **CSS** - Use CSS custom properties (variables) for colors - Follow BEM-like naming for classes - Keep responsive design in mind **Structure** - Inline CSS in `