AI Sana
Микросервисная платформа AI Sana: черновик бизнеса, AI-уточнение (не меньше 3 вопросов), редактируемая карточка с рейтингом 0–100, каталог по…
О проекте
Команда: Prompt&Pray
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Микросервисная платформа AI Sana: черновик бизнеса, AI-уточнение (не меньше 3 вопросов), редактируемая карточка с рейтингом 0–100, каталог по рейтингу, отклики студентов и ручной выбор 0/1/нескольких команд, интерфейс на ru/kk/en.
Как устроено
Nuxt 4/Nitro проксирует запросы в FastAPI API Gateway с rate limit. За ним стоят auth_service (роли business/student), catalog_service (черновики, вопросы, карточки, рейтинг, версии карточек, отклики, решения, награды) и ai_service для обращения к внешнему провайдеру. Рейтинг считается кодом по 7 полям с фиксированными весами. Есть fallback-вопросы без AI и защита версий карточек при конкурентных правках. Данные в SQLite/PostgreSQL через SQLAlchemy/Alembic, сервисы запускаются в Docker Compose.
Ключевые решения
- API gateway
- microservices
- weighted readiness scoring
- fallback questions
- card versioning
- Alembic migrations
- i18n ru/kk/en
Особенности
Полноценная микросервисная архитектура за 5 часов с большим набором тестов (конкурентные вопросы, версии карточек, миграции). Командная доска задач в .team/*.json. Локализация на три языка.
Стек
Nuxt 4 · Vue 3 · TypeScript · Nuxt UI · Tailwind CSS · Python · FastAPI · SQLAlchemy · Alembic · SQLite · PostgreSQL · Docker Compose
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-a48bb046-prompt-pray.
README
README.mdAI Sana — каталог бизнес-задач с геймификацией
Команда: Prompt&Pray. Статус: MVP-прототип.
AI Sana помогает бизнесу превратить свободное описание проблемы в понятную задачу для студенческой команды. AI уточняет недостающие сведения, бизнес проверяет карточку, а студенты предлагают свои решения. Итоговый выбор исполнителей делает бизнес.
Этот README описывает замысел продукта, целевой сценарий и план MVP. Раздел «Прототип и запуск» относится к коду в репозитории. Критерии приёмки ниже — требования к результату, а не заявление о прохождении всех проверок.
Видео демонстрации
Посмотреть видео демонстрации AI Sana.
1. Проблема и ценность
Бизнес часто формулирует потребность слишком общо: «нужна аналитика», «хотим автоматизацию», «сделайте приложение». В таком описании не хватает данных, ожидаемого результата, ограничений и критериев успеха. Студентам трудно оценить задачу и предложить конкретный план, а бизнесу — сравнить предложения.
Платформа должна уменьшить этот разрыв:
- Для бизнеса: помочь сформулировать потребность и получить сопоставимые отклики.
- Для студентов: дать открытый каталог реальных задач с понятными условиями.
- Для организаторов: сделать взаимодействие бизнеса и студенческих команд прозрачным.
Главный принцип: геймификация мотивирует бизнес улучшать описание задачи. Рейтинг не оценивает студентов и не назначает исполнителей автоматически.
2. Роли
| Роль | Что пользователь должен уметь |
|---|---|
| Посетитель | Просматривать каталог и опубликованные карточки без входа |
| Бизнес | Создавать свои черновики, отвечать на вопросы, редактировать и публиковать карточки, сравнивать отклики, принимать решения |
| Студент / команда | Изучать задачи и отправлять предложение: идею, план и при наличии ссылку на прототип |
Бизнес управляет только своими задачами. Студент не может менять чужую карточку, публиковать её или выбирать исполнителей. В MVP один аккаунт студента представляет команду; полноценный реестр команд и управление составом можно добавить позже.
3. Как продукт должен работать
Шаг 1. Свободное описание
Бизнес описывает проблему своими словами. На первом экране не нужно требовать готового технического задания.
Пример: «У нас кофейня. Продажи ведём в таблице, но не понимаем, какие товары приносят основную выручку. Хотим видеть понятный отчёт».
Описание сохраняется как черновик. Пользователь должен иметь возможность вернуться к незавершённой работе.
Шаг 2. Уточнение с AI
AI анализирует описание и задаёт минимум три уточняющих вопроса по недостающим сведениям: данные, пользователи, результат, критерии успеха, ограничения, контакт бизнеса.
Вопросы должны быть конкретными и связанными с задачей. Пользователь отвечает только известными фактами; неизвестные сведения можно оставить незаполненными. AI не должен придумывать ответы за бизнес.
В идеальном взаимодействии вопросы учитывают предыдущие ответы, а ошибки сервиса не приводят к потере черновика.
Шаг 3. Карточка задачи
Из описания и ответов формируется редактируемая карточка:
| Поле | Что в нём должно быть |
|---|---|
| Название | Краткое описание задачи |
| Контекст и потребность | Что происходит сейчас и какую проблему нужно решить |
| Данные и материалы | Какие таблицы, примеры, документы или другие материалы доступны |
| Ожидаемый результат | Какой конкретный результат должна подготовить команда |
| Критерии успеха | По каким признакам бизнес примет решение как успешное |
| Ограничения | Сроки, бюджет, технологии и другие условия |
| Пользователи | Кто будет пользоваться результатом |
| Связь с бизнесом | Кто сможет отвечать на вопросы и давать обратную связь |
Бизнес проверяет каждое поле и исправляет формулировки. Сборка карточки сама по себе не публикует задачу.
Шаг 4. Рейтинг готовности
Платформа показывает рейтинг, объясняет начисленные баллы и указывает, какие поля можно дополнить. При изменении карточки рейтинг пересчитывается.
Высокий рейтинг помогает задаче занимать более высокую позицию в каталоге. Низкий рейтинг показывает недостаток информации, но не запрещает публикацию и отклики.
Шаг 5. Подтверждение и публикация
Бизнес явно подтверждает карточку. Только после этого она появляется в открытом каталоге, доступном всем командам. Основная сортировка — по убыванию рейтинга.
Изменённая опубликованная карточка должна снова пройти подтверждение: команды должны видеть сведения, которые проверил владелец.
Шаг 6. Отклики команд
Любая команда может предложить решение опубликованной задачи независимо от её рейтинга. Отклик содержит:
- идею решения;
- план реализации;
- необязательную ссылку на прототип.
Отклик не означает автоматическое назначение команды.
Шаг 7. Ручной выбор бизнеса
Бизнес сравнивает предложения и сохраняет своё решение: выбрать одну, несколько или ни одной команды. AI может помогать анализировать информацию, но окончательное решение и действие выбора всегда остаются за человеком.
4. Геймификация и рейтинг
Рейтинг карточки — от 0 до 100.
| Поле | Баллы |
|---|---|
| Контекст и потребность | 20 |
| Данные и материалы | 20 |
| Ожидаемый результат | 15 |
| Критерии успеха | 15 |
| Ограничения | 10 |
| Пользователи | 10 |
| Связь с бизнесом | 10 |
| Итого | 100 |
| Баллы | Уровень |
|---|---|
| 0–39 | Черновик |
| 40–69 | Рабочая |
| 70–89 | Готовая |
| 90–100 | Приоритетная |
В MVP расчёт простой: непустое поле получает весь свой вес, пустое — ноль. Название не добавляет баллы. Рейтинг рассчитывается кодом, а не произвольным решением AI.
Полнота не равна достоверности или качеству текста. Проверка содержательности может развиваться отдельно; она не должна незаметно менять заданную формулу.
5. Роль AI и границы автоматизации
Обязательная AI-функция проекта — анализ полноты описания и генерация уточняющих вопросов. Сборка карточки из ответов может выполняться обычным кодом.
Целевые дополнительные возможности:
| Возможность | Назначение |
|---|---|
| Последовательный диалог | Уточнять следующий вопрос с учётом уже сохранённых ответов |
| Предложение названия | Помочь кратко сформулировать задачу с возможностью ручной правки |
| Подсказки по полноте | Объяснить, каких сведений не хватает и как улучшить описание |
| Поиск похожих задач | Помочь найти близкие потребности, не запрещая создание новой задачи |
| Разбор отклика | Выделить соответствие задаче, пробелы и вопросы к команде |
| Рекомендации студентам | Помочь найти подходящие задачи, сохраняя открытость каталога |
AI должен использовать только предоставленные факты, обозначать неизвестные данные и рассматривать пользовательский текст как данные, а не как управляющие инструкции. Результат проверяет человек. AI не публикует карточку, не изменяет рейтинг по своему усмотрению и не выбирает команду за бизнес.
6. Устройство системы
Предполагаемый путь запроса:
Браузер → Nuxt / Nitro → API Gateway → сервис → база данных
└─ AI-сервис → внешний AI-провайдер
| Часть | Ответственность |
|---|---|
| Frontend: Nuxt 4, Vue 3, TypeScript, Nuxt UI, Tailwind CSS | Формы, каталог, карточки, рейтинг, отклики и интерфейс выбора |
| Nitro | Серверное проксирование API и работа с сессиями |
| API Gateway: FastAPI | Маршрутизация запросов, общие проверки и ограничение частоты |
| Auth service | Пользователи, роли, вход и токены |
| Catalog service | Черновики, карточки, рейтинг, публикация, отклики и решения |
| AI service | Обращение к провайдеру и обработка ответа |
| SQLite / PostgreSQL, SQLAlchemy, Alembic | Хранение данных и обновление схемы каталога |
Основные модели:
| Модель | Назначение |
|---|---|
TaskDraft | Исходное описание и владелец |
ClarifyingQuestion | Уточняющий вопрос и ответ |
TaskCard | Редактируемое описание задачи |
RatingBreakdown | Баллы по семи полям |
CatalogEntry | Публикация подтверждённой карточки |
Proposal | Предложение команды |
SelectionDecision | Ручное решение бизнеса |
7. План реализации MVP
Это план работ по продукту; строки не обозначают текущие статусы выполнения.
| Этап | Что сделать | Ожидаемый результат |
|---|---|---|
| 1. Основа | Настроить сервисы, базу, роли и взаимодействие frontend/backend | Приложение запускается, действия разделены по ролям |
| 2. Подготовка задачи | Создать черновики, подключить AI-вопросы и сохранение ответов | Бизнес проходит путь от свободного текста до структурированных сведений |
| 3. Карточка и рейтинг | Добавить сборку, редактирование, расчёт баллов и подтверждение | Пользователь видит готовность задачи и контролирует публикацию |
| 4. Каталог | Открыть чтение опубликованных задач, сортировку и пагинацию | Любая команда может найти задачу, включая задачи с низким рейтингом |
| 5. Отклики и выбор | Добавить предложения и сравнение, ручное решение 0/1/несколько | Сквозной сценарий завершается выбором бизнеса |
| 6. Подготовка демонстрации | Добавить демоданные, обработку ошибок, инструкции и проверки | Сценарий можно воспроизвести перед жюри |
Приоритет — работающий сквозной сценарий. Дополнительные AI-подсказки и улучшения интерфейса развиваются после его основной реализации.
8. Критерии приёмки
MVP считается готовым к демонстрации, когда подтверждены следующие условия:
- Бизнес может сохранить свободное описание и вернуться к черновику.
- При реальном AI-вызове формируются минимум три вопроса по недостающим сведениям.
- Из ответов собирается редактируемая карточка без добавления неизвестных фактов.
- Рейтинг соответствует весам, остаётся в диапазоне 0–100 и пересчитывается при изменениях.
- Публикация требует явного подтверждения владельца.
- Опубликованная карточка видна без входа; каталог сортируется по рейтингу.
- Низкий рейтинг не запрещает публикацию и отправку отклика.
- Команда может отправить идею, план и ссылку на прототип.
- Бизнес может вручную выбрать одну, несколько или ни одной команды.
- Данные и решение сохраняются после обновления страницы.
- Чужие черновики и операции изменения защищены проверкой роли и владельца.
- Ошибки AI не приводят к потере уже сохранённой работы.
Для оценки пользы продукта можно измерять время подготовки карточки, изменение полноты до и после уточнения, долю задач с откликами и долю задач с решением бизнеса. Это предлагаемые метрики, а не результаты уже проведённого исследования.
9. Прототип и запуск
В репозитории есть интерфейс бизнеса и студентов, сервисы авторизации, каталога и AI, локальные демоданные, поддержка ru/kk/en и автоматические проверки. Возможности проверяются на конкретной версии кода; этот документ не заменяет итоговую приёмку.
0. Подготовка на новом компьютере
-
Установите Python 3.10+ и Node.js 22 (npm входит в установку Node.js). На Windows при установке Python включите Add python.exe to PATH. После установки откройте новый терминал.
-
Установите закреплённую в проекте версию pnpm:
npm install --global [email protected] node --version pnpm --versionОжидаемые версии: Node.js
v22.x, pnpm12.4.1. Python проверьте командойpy -3 --versionна Windows илиpython3 --versionна Linux / macOS. На Linux также должны быть установлены модулиvenvиpipдля выбранной версии Python. -
Скачайте и распакуйте ZIP репозитория либо клонируйте его через Git:
git clone https://github.com/BAITC-Hacks/hack-a48bb046-prompt-pray.git cd hack-a48bb046-prompt-prayGit нужен только для клонирования. Если репозиторий закрытый, потребуется доступ к нему на GitHub.
-
Откройте два терминала в корне проекта — папке с этим README и каталогами
backendиfrontend. В первом запустите backend, во втором frontend по шагам ниже. Оба терминала должны оставаться открытыми во время работы приложения.
Окружение
| Инструмент | Версия |
|---|---|
| Python | 3.10+; для локальной разработки рекомендуется 3.12 |
| Node.js | 22.19+ в ветке 22.x или 24.11+ в ветке 24.x |
| pnpm | 12.4.1, закреплена в frontend/package.json |
При первой установке зависимостей нужен интернет. Для обычного локального запуска используется SQLite, Docker не требуется.
Первый терминал — backend. Из корня репозитория, Windows PowerShell:
cd backend
.\start.bat
Linux / macOS:
cd backend
bash start.sh
Скрипт подготавливает .venv, зависимости и .env, затем запускает сервисы.
Дождитесь сообщения «Бэкенд запущен». Данные сохраняются в backend/data/.
В режиме development создаются демоданные; флаг --no-demo отключает их создание.
Второй терминал — frontend. Из корня репозитория:
cd frontend
pnpm install
pnpm dev
По умолчанию frontend обращается к http://127.0.0.1:8000.
Если gateway запущен по другому адресу, скопируйте frontend/.env.example
в frontend/.env и измените NUXT_GATEWAY_URL.
| Страница или сервис | Адрес |
|---|---|
| Приложение | http://localhost:3000 |
| Каталог | http://localhost:3000/catalog |
| Вход | http://localhost:3000/login |
| Личный кабинет | http://localhost:3000/account |
| Создание задачи | http://localhost:3000/tasks/new |
| Состояние backend | http://localhost:8000/health |
| Swagger каталога | http://localhost:8004/api/v1/docs |
| Swagger авторизации | http://localhost:8001/api/v1/docs |
Остановка — Ctrl+C в обоих терминалах.
Запуск с PostgreSQL и Docker описан в backend/README.md.
Настройка AI и режим без ключа
Для реального AI укажите OPENAI_API_KEY в backend/.env; при необходимости
настройте OPENAI_MODEL и перезапустите backend. Ключ используется на сервере;
файл .env не должен попадать в Git.
При ошибке начальной генерации прототип может сохранить шесть заранее подготовленных вопросов на ru/kk/en. Это позволяет продолжить сценарий без внешнего AI. Резервные вопросы и демозадачи не являются результатом работы модели.
Сохранённый набор вопросов возвращается при повторном запросе. После подключения
ключа создайте новый черновик для проверки реальной генерации. При использовании
резервного набора в логах каталога появляется Using fallback clarification questions.
В версии с дополнительными AI-функциями для демо без ключа отключите «Пошаговый диалог», если этот переключатель есть, и введите название вручную. Генерация названия, адаптация следующего вопроса и AI-советы требуют провайдера. Ошибка необязательного поиска похожих задач не должна препятствовать ручной сборке.
Сценарий демонстрации
На свежей локальной базе:
| Логин | Роль | Пароль |
|---|---|---|
user1 | Бизнес | password123 |
user2 | Студент / команда | password123 |
user3 | Студент / команда | password123 |
Это публичные данные для локального демо. Также поддерживается вход по email,
например [email protected].
- Открыть каталог без входа и показать задачи с разным рейтингом.
- Войти как
user1, создать задачу и получить уточняющие вопросы. - Сохранить ответы, ввести название, собрать карточку и проверить её.
- Дополнить поля, показать изменение рейтинга и подтвердить публикацию.
- Войти как
user2и отправить отклик: идею, план, при необходимости ссылку. - Войти как
user1, сравнить предложения и вручную сохранить решение. - Обновить страницу и показать, что данные сохранились.
Для короткого демо можно использовать подготовленные задачи: продажи кофейни, заявки мастерской и отзывы магазина. На задаче кофейни уже есть два отклика. Повторный запуск сохраняет изменения, поэтому демобаза после показа может отличаться от первоначальной.
Команды проверок
Из backend/ в Windows:
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
.\.venv\Scripts\python.exe scripts/run_tests.py
.\.venv\Scripts\python.exe scripts/test_frontend.py
На Linux / macOS используйте .venv/bin/python.
Из frontend/:
pnpm lint
pnpm typecheck
node --test tests/*.test.mjs
pnpm build
pnpm exec playwright install chromium
pnpm test:browser
Браузерный стенд использует временные SQLite-базы и фиксированные ответы AI. Такие тесты проверяют сценарий приложения, но не качество настоящей модели. Подробности — в инструкции браузерных тестов.
Частые затруднения
| Ситуация | Что проверить |
|---|---|
| Не запускается frontend | Версии Node.js и pnpm, завершение pnpm install |
| Заняты порты backend | Порты 8000–8004 и настройки backend/.env |
| Не загружается каталог | Состояние gateway, логи backend, NUXT_GATEWAY_URL |
| Нет демоданных | ENV=development, отсутствие --no-demo, сообщения подготовки данных |
| Появляются стандартные вопросы | Ключ, модель, доступ к AI и логи; для новой генерации нужен новый черновик |
| Не собирается карточка без ключа | Название заполнено вручную; дополнительные AI-действия отключены |
| Конфликт версии карточки | Загрузить актуальную карточку и согласовать изменения перед сохранением |
Первый вход и повторный запуск
Откройте http://localhost:3000/catalog — каталог доступен без регистрации.
Для проверки действий бизнеса войдите на http://localhost:3000/login
с логином user1 и паролем password123; для отклика студента используйте
user2 с тем же паролем. Эти аккаунты создаются при первом локальном запуске
с демоданными; создавать собственный аккаунт для знакомства с проектом не нужно.
При следующих запусках снова выполните start.bat / bash start.sh в backend
и pnpm dev в frontend. Повторная установка pnpm не нужна;
pnpm install повторяйте после обновления зависимостей проекта.
Если запуск не удался:
| Симптом | Что сделать |
|---|---|
Команда python, node или pnpm не найдена | Проверьте установку нужного инструмента и PATH, затем откройте новый терминал. На Windows Python также доступен через py -3. |
PowerShell блокирует npm.ps1 или pnpm.ps1 | Используйте npm.cmd и pnpm.cmd вместо npm и pnpm в командах выше. |
| Backend сообщает о занятом порте | Остановите предыдущий экземпляр приложения. По умолчанию backend использует порты 8000–8004, frontend — 3000. |
| Интерфейс открыт, но каталог или вход не работают | Дождитесь сообщения «Бэкенд запущен», проверьте http://localhost:8000/health и адрес NUXT_GATEWAY_URL, если меняли порт gateway. |
При генерации вопросов появляется ai_unavailable | Проверьте OPENAI_API_KEY в backend/.env, доступность AI-провайдера и перезапустите backend. Каталог и демосценарий можно проверять без ключа. |
10. Границы MVP и развитие
В минимальный объём не входят полноценный проектный трекер, real-time чат, сложное управление ролями, обучение собственной модели и обязательная мобильная адаптация.
После MVP можно развивать управление составом команд, уведомления, обратную связь, аналитику качества описаний, более точные рекомендации и сопровождение совместной работы. Автоматический выбор команды за бизнес не является целью развития.
В коде могут сохраняться страницы исходного Nuxt SaaS Template, например блог и тарифы. Они не входят в продуктовый сценарий AI Sana.
11. Команда и документация
| Участник | Основное направление вклада |
|---|---|
| Riffaells | Backend, AI, бизнес-логика каталога и интеграция frontend/backend |
| Улан (Ulan71) | Роли, каркас каталога, язык AI-уточнений и защита версий карточек |
| Ермухан (Kayniev) | Frontend, локализация и браузерные проверки |
Участки реализации пересекаются; подробнее — в описании вклада команды.
Авторы коммитов
История коммитов
- 2026-09-23 17:51merge: combine rewards, catalog decisions and demo updatesRiffaells
- 2026-09-23 17:49docs: add demo video and README linkRiffaells
- 2026-09-23 17:45FINALY READMEKayniev
- 2026-09-23 17:42feat: add business rewards, engagement and template modeRiffaells
- 2026-09-23 17:38Merge branch 'codex/demo-dataset'Ulan71
- 2026-09-23 17:32docs(roadmap): plan AI task translations for ru kk enUlan71
- 2026-09-23 17:32feat(demo): expand hackathon dataset and preserve user editsUlan71
- 2026-09-23 17:09readmeKayniev
Все коммиты (46)
- 2026-09-23 17:06Merge remote-tracking branch 'origin/main' into codex/docs-roadmapUlan71
- 2026-09-23 17:05merge: sync remote main with task workflow updatesRiffaells
- 2026-09-23 17:04chore: save latest configuration and documentation updatesRiffaells
- 2026-09-23 17:04Merge remote-tracking branch 'origin/main' into codex/docs-roadmapUlan71
- 2026-09-23 17:04docs: добавить ссылки на дорожную картуUlan71
- 2026-09-23 17:03feat: update task workflow and interfaceRiffaells
- 2026-09-23 17:02roadmapUlan71
- 2026-09-23 16:53test: align browser checks with automatic draft language and dashboardKayniev
- 2026-09-23 16:47Merge remote-tracking branch 'origin/main'Kayniev
- 2026-09-23 16:45test: complete multilingual MVP browser coverage and SSR fixesKayniev
- 2026-09-23 16:37feat: update AI task creation workflowRiffaells
- 2026-09-23 16:32merge: sync main and preserve account dashboard with localizationRiffaells
- 2026-09-23 16:21feat: update account dashboardRiffaells
- 2026-09-23 16:18docs: sync backend contracts and add API test examplesRiffaells
- 2026-09-23 16:16Merge origin/main and integrate localized task workflowsKayniev
- 2026-09-23 16:05feat: localize MVP in ru kk en and refine frontend UIKayniev
- 2026-09-23 16:05merge: integrate remote card versions and locale with catalog migrationsRiffaells
- 2026-09-23 15:59feat: add demo data, catalog migrations and proxy fixesRiffaells
- 2026-09-23 15:58feat(catalog): добавить язык AI-уточнений и защиту версий карточекUlan71
- 2026-09-23 15:31Merge branch 'main' of https://github.com/BAITC-Hacks/hack-a48bb046-prompt-prayUlan71
- 2026-09-23 15:09fix: integrate frontend task workflow with backendRiffaells
- 2026-09-23 14:50newKayniev
- 2026-09-23 14:47Merge branch 'feat/T-11-task-flow'Kayniev
- 2026-09-23 14:42front 1vKayniev
- 2026-09-23 14:35Merge branch 'feat/T-2-catalog-service' into mainRiffaells
- 2026-09-23 14:27docs: добавить отчёт Улана по backend-задачамUlan71
- 2026-09-23 14:18docs: обновить AI.md — фронтенд подключён к gatewayRiffaells
- 2026-09-23 14:18chore(board): отметить T-1..T-14 in_progress с деталями реализацииRiffaells
- 2026-09-23 14:18feat(frontend): подключить фронтенд к gateway (auth, каталог AI Sana)Riffaells
- 2026-09-23 14:18test(backend): контрактные проверки формата ошибок в example_serviceRiffaells
- 2026-09-23 14:18feat(catalog): сервис каталога бизнес-задач AI SanaRiffaells
- 2026-09-23 14:18feat(auth): роли business/student и миграция существующей БДRiffaells
- 2026-09-23 14:17test(backend): контрактные тесты ai_service и его маршрутизация в gatewayRiffaells
- 2026-09-23 14:16feat(backend): добавить каркас catalog_serviceUlan71
- 2026-09-23 14:04feat(auth): добавить роли business и studentUlan71
- 2026-09-23 13:46new dayRiffaells
- 2026-09-23 13:41newRiffaells
- 2026-09-23 13:11firstRiffaells
Структура репозитория (360 файлов)
.gitignore .team/done.json .team/queue.json .team/teams.json AGENTS.md AI.md README.md backend/.dockerignore backend/.env.example backend/.gitattributes backend/.gitignore backend/README.md backend/ai_service/Dockerfile backend/ai_service/app/__init__.py backend/ai_service/app/core/__init__.py backend/ai_service/app/core/config.py backend/ai_service/app/main.py backend/ai_service/app/schemas.py backend/ai_service/app/services/__init__.py backend/ai_service/app/services/generation.py backend/ai_service/pytest.ini backend/ai_service/requirements.txt backend/ai_service/tests/conftest.py backend/ai_service/tests/test_errors.py backend/ai_service/tests/test_generation.py backend/api_gateway/Dockerfile backend/api_gateway/app/__init__.py backend/api_gateway/app/api/__init__.py backend/api_gateway/app/api/router.py backend/api_gateway/app/api/routes/__init__.py backend/api_gateway/app/api/routes/proxy.py backend/api_gateway/app/core/__init__.py backend/api_gateway/app/core/config.py backend/api_gateway/app/core/health.py backend/api_gateway/app/core/proxy.py backend/api_gateway/app/main.py backend/api_gateway/pytest.ini backend/api_gateway/requirements.txt backend/api_gateway/tests/conftest.py backend/api_gateway/tests/test_gateway.py backend/api_gateway/tests/test_rate_limit.py backend/auth_service/Dockerfile backend/auth_service/app/__init__.py backend/auth_service/app/api/__init__.py backend/auth_service/app/api/deps.py backend/auth_service/app/api/router.py backend/auth_service/app/api/routes/__init__.py backend/auth_service/app/api/routes/auth.py backend/auth_service/app/api/routes/users.py backend/auth_service/app/core/__init__.py backend/auth_service/app/core/config.py backend/auth_service/app/core/security.py backend/auth_service/app/db/__init__.py backend/auth_service/app/db/migrations.py backend/auth_service/app/db/session.py backend/auth_service/app/main.py backend/auth_service/app/models/__init__.py backend/auth_service/app/models/user.py backend/auth_service/app/repositories/__init__.py backend/auth_service/app/repositories/user.py backend/auth_service/app/schemas/__init__.py backend/auth_service/app/schemas/auth.py backend/auth_service/app/schemas/user.py backend/auth_service/app/services/__init__.py backend/auth_service/app/services/auth.py backend/auth_service/pytest.ini backend/auth_service/requirements.txt backend/auth_service/tests/conftest.py backend/auth_service/tests/test_auth_flow.py backend/auth_service/tests/test_roles.py backend/catalog_service/Dockerfile backend/catalog_service/README.md backend/catalog_service/app/__init__.py backend/catalog_service/app/api/__init__.py backend/catalog_service/app/api/assistance.py backend/catalog_service/app/api/deps.py backend/catalog_service/app/api/endpoints/__init__.py backend/catalog_service/app/api/router.py backend/catalog_service/app/core/__init__.py backend/catalog_service/app/core/config.py backend/catalog_service/app/db/__init__.py backend/catalog_service/app/db/card_version_migration.py backend/catalog_service/app/db/migrate.py backend/catalog_service/app/db/migrations/__init__.py backend/catalog_service/app/db/migrations/baseline.py backend/catalog_service/app/db/migrations/env.py backend/catalog_service/app/db/migrations/versions/0001_catalog.py backend/catalog_service/app/db/migrations/versions/0002_locale_version.py backend/catalog_service/app/db/migrations/versions/0003_catalog_decisions.py backend/catalog_service/app/db/migrations/versions/0003_rewards.py backend/catalog_service/app/db/migrations/versions/0004_engagement.py backend/catalog_service/app/db/migrations/versions/0005_merge_rewards_decisions.py backend/catalog_service/app/db/session.py backend/catalog_service/app/main.py backend/catalog_service/app/models/__init__.py backend/catalog_service/app/models/domain.py backend/catalog_service/app/repositories/__init__.py backend/catalog_service/app/repositories/catalog.py backend/catalog_service/app/schemas/__init__.py backend/catalog_service/app/schemas/domain.py backend/catalog_service/app/services/__init__.py backend/catalog_service/app/services/assistance.py backend/catalog_service/app/services/catalog.py backend/catalog_service/app/services/draft_language.py backend/catalog_service/app/services/fallback_questions.py backend/catalog_service/app/services/questions.py backend/catalog_service/app/services/rewards.py backend/catalog_service/pytest.ini backend/catalog_service/requirements.txt backend/catalog_service/tests/conftest.py backend/catalog_service/tests/test_ai_questions.py backend/catalog_service/tests/test_assembly.py backend/catalog_service/tests/test_assistance.py backend/catalog_service/tests/test_assistance_concurrency.py backend/catalog_service/tests/test_assistance_edges.py backend/catalog_service/tests/test_card_version.py backend/catalog_service/tests/test_card_version_migration.py backend/catalog_service/tests/test_catalog_filters_decisions.py backend/catalog_service/tests/test_concurrent_questions.py backend/catalog_service/tests/test_decision_order.py backend/catalog_service/tests/test_demo_seed.py backend/catalog_service/tests/test_domain.py backend/catalog_service/tests/test_draft_edit.py backend/catalog_service/tests/test_draft_locale.py backend/catalog_service/tests/test_engagement.py backend/catalog_service/tests/test_locale_migration.py backend/catalog_service/tests/test_migrations.py backend/catalog_service/tests/test_reward_rating_isolation.py backend/catalog_service/tests/test_rewards.py backend/catalog_service/tests/test_workflow.py backend/common/__init__.py backend/common/app.py backend/common/auth.py backend/common/config.py backend/common/db.py backend/common/exceptions.py backend/common/logger.py backend/common/middleware.py backend/common/requirements-db.txt backend/common/requirements.txt backend/common/security.py backend/dev.bat backend/dev.sh backend/docker-compose.dev.yml backend/docker-compose.yml backend/down.bat backend/down.sh backend/example_service/Dockerfile backend/example_service/app/__init__.py backend/example_service/app/api/__init__.py backend/example_service/app/api/deps.py backend/example_service/app/api/endpoints/__init__.py backend/example_service/app/api/endpoints/items.py backend/example_service/app/api/router.py backend/example_service/app/core/__init__.py backend/example_service/app/core/config.py backend/example_service/app/db/__init__.py backend/example_service/app/db/session.py backend/example_service/app/main.py backend/example_service/app/models/__init__.py backend/example_service/app/models/item.py backend/example_service/app/repositories/__init__.py backend/example_service/app/repositories/item.py backend/example_service/app/schemas/__init__.py backend/example_service/app/schemas/item.py backend/example_service/pytest.ini backend/example_service/requirements.txt backend/example_service/tests/conftest.py backend/example_service/tests/test_items.py backend/logs.bat backend/logs.sh backend/postgres-init/01-create-databases.sh backend/prod.bat backend/prod.sh backend/requirements-dev.txt backend/requirements-local.txt backend/scripts/browser_ai_fixture.py backend/scripts/demo_data.json backend/scripts/generate_secrets.py backend/scripts/run_local.py backend/scripts/run_tests.py backend/scripts/seed_demo.py backend/scripts/smoke_catalog.py backend/scripts/test_frontend.py backend/start-postgres.bat backend/start-postgres.sh backend/start.bat backend/start.sh demo.mp4 docs/README.md docs/ai-assistance.md docs/api-standards.md docs/api-test-texts.json docs/api-test-texts.md docs/architecture.md docs/catalog-api.md docs/demo-data.md docs/engagement.md docs/error-handling-review.md docs/roadmap.md docs/team-contributions.md docs/ulan-work-report.md frontend/.editorconfig frontend/.env.example frontend/.github/workflows/ci.yml frontend/.gitignore frontend/FRONTEND_REVIEW.md frontend/LICENSE frontend/README.md frontend/app/app.config.ts frontend/app/app.vue frontend/app/assets/css/main.css frontend/app/components/AccountForm.vue frontend/app/components/AppCard.vue frontend/app/components/AppEmptyState.vue frontend/app/components/AppFooter.vue frontend/app/components/AppHeader.vue frontend/app/components/AppLogo.vue frontend/app/components/AppPageHeading.vue frontend/app/components/AuthAvailability.vue frontend/app/components/BusinessRewards.vue frontend/app/components/HeroBackground.vue frontend/app/components/ImagePlaceholder.vue frontend/app/components/LanguageSwitcher.vue frontend/app/components/OgImage/Saas.takumi.vue frontend/app/components/ProgressLeaderboard.vue frontend/app/components/PromotionalVideo.vue frontend/app/components/README.md frontend/app/components/StarsBg.vue frontend/app/components/TemplateMenu.vue frontend/app/components/catalog/CatalogTaskCard.vue frontend/app/components/content/PictureAndText.vue frontend/app/components/content/Pictures.vue frontend/app/components/tasks/TaskAiAdvice.vue frontend/app/components/tasks/TaskAiLoading.vue frontend/app/components/tasks/TaskCardFields.vue frontend/app/components/tasks/TaskDetails.vue frontend/app/components/tasks/TaskProposalCard.vue frontend/app/components/tasks/TaskProposalForm.vue frontend/app/components/tasks/TaskProposalSelection.vue frontend/app/components/tasks/TaskQuestion.vue frontend/app/components/tasks/TaskRating.vue frontend/app/components/tasks/TaskWorkflow.vue frontend/app/composables/useApi.ts frontend/app/composables/useApiMessages.ts frontend/app/composables/useAppI18n.ts frontend/app/composables/useAuthAvailability.ts frontend/app/composables/useLocalizedForm.ts frontend/app/composables/useRewardFeedback.ts frontend/app/composables/useSession.ts frontend/app/composables/useSessionApi.ts frontend/app/composables/useTasks.ts frontend/app/composables/useTemplateMode.ts frontend/app/data/demo-tasks.ts frontend/app/error.vue frontend/app/i18n/config.ts frontend/app/i18n/locales/en.ts frontend/app/i18n/locales/kk.ts frontend/app/i18n/locales/ru.ts frontend/app/i18n/messages/en.ts frontend/app/i18n/messages/kk.ts frontend/app/i18n/messages/ru.ts frontend/app/layouts/auth.vue frontend/app/layouts/default.vue frontend/app/layouts/docs.vue frontend/app/middleware/00.template.global.ts frontend/app/middleware/auth.ts frontend/app/middleware/session.global.ts frontend/app/pages/account.vue frontend/app/pages/blog.vue frontend/app/pages/blog/[slug].vue frontend/app/pages/blog/index.vue frontend/app/pages/catalog.vue frontend/app/pages/changelog/index.vue frontend/app/pages/docs/[...slug].vue frontend/app/pages/index.vue frontend/app/pages/login.vue frontend/app/pages/pricing.vue frontend/app/pages/signup.vue frontend/app/pages/tasks/[id].vue frontend/app/pages/tasks/[id]/proposals.vue frontend/app/pages/tasks/new.vue frontend/app/plugins/activity.client.ts frontend/app/plugins/i18n.ts frontend/app/types/api.ts frontend/app/types/catalog.ts frontend/app/types/index.d.ts frontend/app/utils/api-error.ts frontend/app/utils/auth-redirect.ts frontend/app/utils/links.ts frontend/app/utils/task-rating.ts frontend/app/utils/task-validation.ts frontend/bun.lock frontend/content.config.ts frontend/content/0.index.yml frontend/content/1.docs/1.getting-started/.navigation.yml frontend/content/1.docs/1.getting-started/1.index.md frontend/content/1.docs/1.getting-started/2.installation.md frontend/content/1.docs/1.getting-started/3.usage.md frontend/content/1.docs/2.essentials/.navigation.yml frontend/content/1.docs/2.essentials/1.markdown-syntax.md frontend/content/1.docs/2.essentials/2.code-blocks.md frontend/content/1.docs/2.essentials/3.prose-components.md frontend/content/1.docs/2.essentials/4.images-embeds.md frontend/content/2.pricing.yml frontend/content/3.blog.yml frontend/content/3.blog/1.asian-cuisine.md frontend/content/3.blog/2.pyrenees.md frontend/content/3.blog/3.james-webb.md frontend/content/3.blog/4.meditation.md frontend/content/3.blog/5.animals.md frontend/content/3.blog/6.cryptocurrencies.md frontend/content/4.changelog.yml frontend/content/4.changelog/1.launch.md frontend/content/4.changelog/10.fun.md frontend/content/4.changelog/2.teams.md frontend/content/4.changelog/3.dark-mode.md frontend/content/4.changelog/4.integrations.md frontend/content/4.changelog/5.mobile.md frontend/content/4.changelog/6.performance.md frontend/content/4.changelog/7.analytics.md frontend/content/4.changelog/8.api.md frontend/content/4.changelog/9.security.md frontend/demo/TaskProposals.vue frontend/deploy/nginx.conf.example frontend/eslint.config.mjs frontend/nuxt.config.ts frontend/package.json frontend/playwright.config.ts frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml frontend/public/demo/prototypes.html frontend/public/favicon.ico frontend/renovate.json frontend/server/api/gateway/[...path].ts frontend/server/api/session/[action].post.ts frontend/server/middleware/client-ip.ts frontend/server/utils/request-origin.ts frontend/shared/types/auth.ts frontend/shared/types/tasks.ts frontend/tests/ai-assistance.test.mjs frontend/tests/auth-language.test.mjs frontend/tests/auth.integration.mjs frontend/tests/browser/README.md frontend/tests/browser/mvp.spec.mjs frontend/tests/card-version.test.mjs frontend/tests/catalog.integration.mjs frontend/tests/client-ip.test.mjs frontend/tests/draft-locale.test.mjs frontend/tests/helpers/i18n.mjs frontend/tests/i18n.integration.mjs frontend/tests/i18n.test.mjs frontend/tests/reward-feedback.test.mjs frontend/tests/run-browser.mjs frontend/tests/service-availability.integration.mjs frontend/tests/service-availability.test.mjs frontend/tests/task-create.test.mjs frontend/tests/tasks.test.mjs frontend/tests/template-mode.test.mjs frontend/tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.