{"id":50671156,"url":"https://github.com/nozikov/github-repo-analyzer","last_synced_at":"2026-06-08T11:04:34.510Z","repository":{"id":356499716,"uuid":"1232807948","full_name":"nozikov/github-repo-analyzer","owner":"nozikov","description":"LangGraph CLI agent that analyzes a GitHub repo and produces a tech due-diligence report","archived":false,"fork":false,"pushed_at":"2026-05-08T09:59:55.000Z","size":151,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-08T11:37:33.600Z","etag":null,"topics":["agent","ai-agent","anthropic","claude","cli","github-api","langchain","langgraph","llm-agent","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nozikov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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-05-08T09:42:28.000Z","updated_at":"2026-05-08T09:59:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nozikov/github-repo-analyzer","commit_stats":null,"previous_names":["nozikov/github-repo-analyzer"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/nozikov/github-repo-analyzer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nozikov%2Fgithub-repo-analyzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nozikov%2Fgithub-repo-analyzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nozikov%2Fgithub-repo-analyzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nozikov%2Fgithub-repo-analyzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nozikov","download_url":"https://codeload.github.com/nozikov/github-repo-analyzer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nozikov%2Fgithub-repo-analyzer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34059191,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["agent","ai-agent","anthropic","claude","cli","github-api","langchain","langgraph","llm-agent","python"],"created_at":"2026-06-08T11:04:33.712Z","updated_at":"2026-06-08T11:04:34.505Z","avatar_url":"https://github.com/nozikov.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Repo Analyzer\n\n[![Tests](https://github.com/nozikov/github-repo-analyzer/actions/workflows/test.yml/badge.svg)](https://github.com/nozikov/github-repo-analyzer/actions/workflows/test.yml)\n[![Python](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Built with LangGraph](https://img.shields.io/badge/built%20with-LangGraph-orange.svg)](https://github.com/langchain-ai/langgraph)\n[![LLM: Claude Sonnet 4.6](https://img.shields.io/badge/LLM-Claude%20Sonnet%204.6-7c3aed.svg)](https://www.anthropic.com/claude)\n[![Package manager: uv](https://img.shields.io/badge/package%20manager-uv-de5fe9.svg)](https://github.com/astral-sh/uv)\n\nУчебный LangGraph-агент: принимает URL публичного GitHub-репозитория и выдаёт markdown-отчёт из трёх секций — tech due-diligence, советы автору, идеи продуктов поверх технологии.\n\n## Установка\n\n```bash\nuv sync\ncp .env.example .env\n# открой .env и впиши три ключа\n```\n\n## Запуск\n\n```bash\nuv run python -m repo_analyzer https://github.com/tiangolo/typer\n```\n\nОтчёт пишется в `reports/\u003cowner\u003e-\u003crepo\u003e-\u003cdate\u003e.md` и одновременно печатается в stdout.\n\n## Как работает\n\nГраф из 5 узлов. Три параллельные ветки сливаются в финальный синтезатор:\n\n```mermaid\nflowchart TD\n    Start([URL]) --\u003e fetch_meta[fetch_meta]\n    fetch_meta --\u003e|GitHub API| plan[plan]\n    plan --\u003e|fan-out| analyze_code[analyze_code]\n    plan --\u003e|fan-out| find_similar[find_similar]\n    plan --\u003e|fan-out| web_context[web_context]\n    analyze_code --\u003e synthesize[synthesize]\n    find_similar --\u003e synthesize\n    web_context --\u003e synthesize\n    synthesize --\u003e End([report.md])\n\n    classDef io fill:#e0f2fe,stroke:#0284c7\n    classDef llm fill:#fef3c7,stroke:#d97706\n    class fetch_meta io\n    class plan,analyze_code,find_similar,web_context,synthesize llm\n```\n\n- **`fetch_meta`** — тянет метаданные репо, README и file_tree из GitHub API.\n- **`plan`** — Claude решает, какие файлы читать, какой запрос на похожие репо отправить и какие веб-запросы.\n- **`analyze_code` / `find_similar` / `web_context`** — три ветки идут одновременно, каждая собирает свой кусок контекста.\n- **`synthesize`** — собирает всё в финальный markdown с тремя секциями.\n\nПолное описание архитектуры, контракты узлов, обработка ошибок и roadmap — в [docs/architecture.md](docs/architecture.md).\n\n## Трассировка работы агента (опционально)\n\nЕсли хочется видеть, **что именно делает агент на каждом шаге** — входы/выходы каждого узла, тайминги, токены и стоимость каждого LLM-вызова — подключи [LangSmith](https://smith.langchain.com/). Бесплатный tier хватит с большим запасом.\n\n1. Зарегистрируйся, создай API-ключ в Settings.\n2. Раскомментируй три строки в `.env`:\n   ```\n   LANGSMITH_TRACING=true\n   LANGSMITH_API_KEY=lsv2_...\n   LANGSMITH_PROJECT=github-repo-analyzer\n   ```\n3. Запусти агента как обычно. В терминале появится `LangSmith tracing enabled — project: github-repo-analyzer`. Открой проект в UI — каждый прогон будет деревом узлов с деталями.\n\nНикакого кода менять не нужно — LangChain автоматически подхватывает env-переменные.\n\n## Тесты\n\n```bash\nuv run pytest -v          # все юнит и smoke тесты с моками\nuv run pytest -m live -s  # реальные API (нужны ключи)\n```\n\nCI прогоняет юнит-тесты на Python 3.11 и 3.12 на каждый push и PR.\n\n## Стоимость прогона\n\nНа среднем репо (10-15 файлов): ~10-30 центов на Claude Sonnet 4.6 + бесплатные tier-ы GitHub и Tavily.\n\n## Contributing\n\nСм. [CONTRIBUTING.md](CONTRIBUTING.md). Issues и PR приветствуются.\n\n## Лицензия\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnozikov%2Fgithub-repo-analyzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnozikov%2Fgithub-repo-analyzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnozikov%2Fgithub-repo-analyzer/lists"}