{"id":50112505,"url":"https://github.com/core-euler/learn-core","last_synced_at":"2026-05-23T13:05:49.519Z","repository":{"id":341228046,"uuid":"1165980177","full_name":"core-euler/learn-core","owner":"core-euler","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-21T12:31:45.000Z","size":482,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-22T02:57:22.084Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/core-euler.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-24T18:48:53.000Z","updated_at":"2026-03-21T12:31:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/core-euler/learn-core","commit_stats":null,"previous_names":["core-euler/learn-core"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/core-euler/learn-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-euler%2Flearn-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-euler%2Flearn-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-euler%2Flearn-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-euler%2Flearn-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/core-euler","download_url":"https://codeload.github.com/core-euler/learn-core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-euler%2Flearn-core/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33396642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-23T13:05:47.087Z","updated_at":"2026-05-23T13:05:49.506Z","avatar_url":"https://github.com/core-euler.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LLM Handbook — MVP\n\nDocumentation-first + implementation repository for LLM Handbook MVP.\n\n## Current status (2026-03-05)\n- MVP backend scope implemented (auth/session, course/progress, AI modes via provider adapter + minimal RAG contract, SSE reliability, limits, Telegram auth callback).\n- MVP frontend app shell implemented (`frontend/`, Vite + React + TS): auth routes, protected app shell, dashboard, modules/lessons states, lesson workspace with lecture/exam/consultant flows, limits/error mapping.\n- Security hardening baseline закрыт: CSRF double-submit, test-route isolation, production KDF policy.\n- Alembic initialized with initial migration from current SQLAlchemy models.\n- Release test gate green: backend `52 passed` + frontend smoke (`vitest`, 2 passed).\n- Docker compose present (`backend + PostgreSQL`) с healthchecks.\n\n## Repository map\n- `backend/` — FastAPI backend implementation + tests\n- `alembic/` — DB migrations\n- `docs/` — product/architecture/spec documentation and rollout notes\n- `tests/` — contracts/checklists/traceability/e2e strategy docs\n- `docker-compose.yml` — local stack bootstrap\n\n## Quick start\n```bash\ncd /home/claw/llm-handbook-mvp\ncp .env.example .env\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e '.[dev]'\npytest -q\n```\n\n## Frontend local shell\n```bash\ncd /home/claw/llm-handbook-mvp/frontend\nnpm install\nnpm run dev\n# optional: VITE_API_BASE_URL=http://localhost:8000 npm run dev\n```\n\n## Docker local stack\n```bash\ndocker compose up -d --build\ndocker compose ps  # db/backend/frontend (+telegram-bot) should start\ncurl -fsS http://localhost:8000/healthz\n```\n\nEnv policy:\n- `db`, `backend`, `telegram-bot` read variables from root `.env`.\n- `frontend` uses `frontend/.env.docker` (separate from root `.env`).\n\nLocal/staging operational steps: `docs/runbook.md`.\n\n## DB migrations (Alembic)\n```bash\n# uses DATABASE_URL if set, otherwise sqlite:///./backend_dev.db\nalembic upgrade head\nalembic downgrade base\nalembic current\nalembic history\n```\n\nFor clean PostgreSQL bootstrap, see `docs/runbook.md`.\n\n## LLM provider configuration\nDefault runtime uses deterministic local adapter (`LLM_PROVIDER=default`).\n\nTo switch to CometAPI:\n```bash\nLLM_PROVIDER=cometapi\nCOMETAPI_API_KEY=...\nCOMETAPI_BASE_URL=https://api.cometapi.com\nCOMETAPI_CHAT_MODEL=gpt-5.2\nCOMETAPI_EXAM_MODEL=gpt-5.2\nCOMETAPI_EMBED_MODEL=text-embedding-3-small\n```\n\nRAG indexing behavior:\n- Startup computes a curriculum signature (`content/index.json` + markdown content + chunk/embed settings).\n- Re-index/embedding generation runs only when the signature changes.\n- Otherwise backend reuses cached vectors/chunks from DB tables `rag_chunks` and `rag_index_state`.\n\nCourse catalog behavior:\n- `backend/content/index.json` is the source of truth for course modules/lessons.\n- On backend startup, catalog is synchronized into DB (`modules`, `lessons`) by stable slugs.\n- User progress rows are backfilled for existing users when new lessons/modules appear.\n\n## Telegram auth bot (aiogram)\nSimple Telegram bot for auth link generation is available at:\n`backend/bot/telegram_auth_bot.py`\n\nInstall and run manually:\n```bash\npip install -r backend/requirements-bot.txt\nexport TELEGRAM_BOT_TOKEN=...\nexport TELEGRAM_AUTH_FRONTEND_URL=http://localhost:3000\npython backend/bot/telegram_auth_bot.py\n```\n\nWhen using docker compose, bot runs as `telegram-bot` service automatically.\n\n## Release status\nMVP-ready for closed rollout по зафиксированным quality gates (см. `docs/release-readiness.md`).\n\nResidual known gaps перед wider rollout:\n- full browser-level UI e2e (Playwright-класс) ещё не зафиксирован как обязательный release gate;\n- есть non-blocking технический долг по deprecation warnings (FastAPI `on_event`, per-request cookies в testclient).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcore-euler%2Flearn-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcore-euler%2Flearn-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcore-euler%2Flearn-core/lists"}