{"id":50593565,"url":"https://github.com/comerc/monorepo","last_synced_at":"2026-06-05T12:03:51.320Z","repository":{"id":357414908,"uuid":"1231929430","full_name":"comerc/monorepo","owner":"comerc","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-28T15:27:01.000Z","size":396,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-28T17:18:51.132Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/comerc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-07T12:26:13.000Z","updated_at":"2026-05-28T15:29:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/comerc/monorepo","commit_stats":null,"previous_names":["comerc/monorepo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/comerc/monorepo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Fmonorepo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Fmonorepo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Fmonorepo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Fmonorepo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/comerc","download_url":"https://codeload.github.com/comerc/monorepo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Fmonorepo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33939236,"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-05T02:00:06.157Z","response_time":120,"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":[],"created_at":"2026-06-05T12:03:50.629Z","updated_at":"2026-06-05T12:03:51.309Z","avatar_url":"https://github.com/comerc.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# monorepo\n\nМонорепозиторий продукта с backend-сервисами на Go и монолитным frontend на Vite + React + Ant Design + Tailwind CSS.\n\n## Карта репозитория\n\n```text\nbackend/\n  go.work                 # Workspace backend-модулей.\n  auth/                   # Auth subgraph: email-code login, JWT, logout.\n  profile/                # Profile subgraph: профиль и nickname.\n  user/                   # Внутренний user-сервис.\n  gateway/                # Cosmo Router config и composed supergraph.\n  test/bdd/               # API BDD runner на godog.\n  test/smoke/             # Smoke tests.\nfeatures/\n  01_identity/            # Общие Gherkin-сценарии для API и browser runner-ов.\nfrontend/\n  src/                    # Монолитный React frontend.\n  test/bdd/               # Browser BDD runner на Playwright.\n```\n\n## Go workspace\n\nBackend живёт как набор самостоятельных Go-модулей, объединённых файлом `backend/go.work`.\n\nСейчас workspace включает:\n\n- `auth`\n- `profile`\n- `user`\n- `test/bdd`\n- `test/smoke`\n\nЛокальные backend-команды запускаются из `backend/`. Если меняются зависимости Go-модулей, используй:\n\n```bash\ntask backend:sync\n```\n\nЭтот task делает `go mod download`, `go mod tidy` по модулям и затем `go work sync`. Для локальных workspace-модулей не добавляй ручные `replace` или фиктивные `require`: сначала проверь `backend/go.work`.\n\n## Backend API\n\nВнешний API собран через Cosmo Gateway:\n\n- Gateway доступен как GraphQL endpoint: `http://localhost:3002/graphql`.\n- `auth` и `profile` публикуют GraphQL subgraph-и.\n- Cosmo Router compose config лежит в `backend/gateway/router-compose.yaml`.\n- Скомпонованный router config генерируется в `backend/gateway/router.json`.\n\nSubgraph-и:\n\n- `auth`: `backend/auth/internal/transport/http/graphql/schema.graphqls`\n- `profile`: `backend/profile/internal/transport/http/graphql/schema.graphqls`\n\nGraphQL-контракт и generated-код живут в `internal/transport/http/graphql/`, а реализация резолверов должна оставаться тонкой и ходить в use case слой через частично применяемые интерфейсы. GraphQL layout описан в `x-gqlgen`, а правила consumer-side интерфейсов — в `x-unit-test-partial-interface`.\n\nВнутреннее взаимодействие сервисов идёт через gRPC:\n\n- `user` публикует `UserService` в `backend/user/pkg/grpc/user.proto`.\n- `auth` и `profile` используют `USER_GRPC_ADDR`, чтобы обращаться к `user-service`.\n- gRPC-контракты регенерируются командой:\n\n```bash\ntask backend:proto\n```\n\nЛокальный docker stack запускается из корня:\n\n```bash\ntask docker-start\n```\n\nПеред стартом task пересобирает Cosmo router config через `task backend:gateway-compose`, затем поднимает Gateway, backend-сервисы и инфраструктуру.\n\n## Замещаемые BDD-тесты\n\n`.feature` файлы являются общей спецификацией продукта и лежат только в `features/NN_epic/`. Runner-ы не владеют спецификацией:\n\n- API BDD: `backend/test/bdd/`, Go + godog, сценарии с тегом `@api`.\n- Browser BDD: `frontend/test/bdd/`, Playwright + playwright-bdd, сценарии с тегом `@browser`.\n\nРабочая стратегия здесь: сначала реализуем сценарий через `@api`, чтобы быстро закрепить контракт, edge cases и server-side поведение. Когда пользовательский путь становится доступен через UI, happy-path или UI-значимый сценарий замещается сценарием `@browser`, а API-слой остаётся для контрактных, негативных и трудно наблюдаемых через браузер состояний.\n\nОдин business intent обычно исполняется одним каналом: либо `@api`, либо `@browser`. Двойной тег `@api @browser` считается исключением. Browser BDD должен ходить в реальный публичный API через Gateway, а не подменять продуктовый API моками.\n\nКоманды:\n\n```bash\ntask backend:test-bdd\ntask frontend:test-bdd\n```\n\nКанонические правила layout, тегов и runner-ов находятся в `x-bdd-api` и `x-bdd-browser`.\n\n## Unit dependencies\n\nДля unit isolation зависимости объявляются у потребителя как частично применяемые интерфейсы: локальные, обычно неэкспортируемые и только с реально используемыми методами. Это позволяет сервисным пакетам зависеть от контракта, а не от конкретной реализации leaf-пакета.\n\nЕсли зависимость естественно выражается функцией, используется callback alias вместо интерфейса. Типы из внешних библиотек можно использовать в сигнатурах напрямую как рабочий контракт; не нужно дублировать их в `internal/domain/` только ради тестов или моков.\n\nКанонические правила этого паттерна находятся в `x-unit-test-partial-interface`.\n\n## Reviewers\n\nПроектные reviewer-роли лежат в `.agents/agents/`. Это тонкие проверяющие поверх skills: они не задают новые нормы, а сверяют реально затронутые файлы с каноническими владельцами правил.\n\n- `dod-reviewer` — код, документация, конфигурация, logging, observability и общие DoD-проверки.\n- `test-reviewer` — unit/integration/smoke test layer, mock workflow, testcontainers и test matrix.\n- `bdd-reviewer` — только BDD feature/step артефакты, включая `@api`, `@browser` и проверку на fake green.\n\nПеред завершением задачи запускай только reviewer-ов для реально затронутых областей. Если BDD-слой не менялся, `bdd-reviewer` не нужен.\n\n## Frontend\n\nFrontend является монолитным приложением на:\n\n- Vite\n- React\n- Ant Design v6\n- Tailwind CSS v4\n- GraphQL codegen\n- Playwright BDD\n\nПриложение обращается к внешнему API через GraphQL Gateway, а не напрямую к внутренним gRPC-сервисам.\n\nAntD CSS подключается через общий stylesheet frontend-а, Tailwind используется для локальной композиции в JSX, а scoped overrides внутренних `.ant-*` узлов оформляются через `@layer components`. Детали соглашений по AntD + Tailwind описаны в `x-antd`.\n\n## Основные task-и\n\n```bash\ntask docker-start        # Start local stack.\ntask docker-stop         # Stop local stack.\ntask backend:sync        # Sync backend Go modules and go.work.\ntask backend:proto       # Regenerate gRPC contracts.\ntask backend:test-bdd    # Run API BDD.\ntask backend:test-smoke  # Run smoke tests.\ntask frontend:run-dev    # Run Vite dev server.\ntask frontend:test-bdd   # Run browser BDD.\n```\n\n## Источники соглашений\n\nREADME даёт навигационную картину. Детальные правила не дублируются здесь, чтобы у каждого повторяемого правила был один владелец:\n\n- `x-gqlgen` — GraphQL/gqlgen layout, federation, generated vs resolvers.\n- `x-unit-test-partial-interface` — частично применяемые интерфейсы, consumer-side contracts, внешние типы в сигнатурах.\n- `x-bdd-api` — общий `features/`, API BDD, `@api`, godog runner.\n- `x-bdd-browser` — browser BDD, `@browser`, Playwright runner.\n- `x-antd` — Ant Design + Tailwind CSS во frontend.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomerc%2Fmonorepo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcomerc%2Fmonorepo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomerc%2Fmonorepo/lists"}