AAYMA
RU
Войти

Career Quest

Полный стек для развития сотрудников: кабинет сотрудника с траекторией, рекомендациями и историей, HR-дашборд с дефицитами навыков и загрузкой…

Доведённый продукт
Команда «Daniyal» 21💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Daniyal
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Доведённый продукт

Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития

Суть

Полный стек для развития сотрудников: кабинет сотрудника с траекторией, рекомендациями и историей, HR-дашборд с дефицитами навыков и загрузкой датасета, AI-объяснения, Telegram-бот напоминаний.

Как устроено

Датасет импортируется в PostgreSQL. DeterministicRecommendationEngine отсеивает мероприятия по роли, грейду, пререквизитам и датам и ранжирует их: 85% доля закрываемого дефицита, 15% история участия, критические навыки с двойным весом. Выдаёт до трёх активностей. Завершение активности начисляет прирост навыков и пересчитывает готовность. LLM (OpenAI или локальная Qwen3 через Ollama) только оформляет объяснения из проверенных фактов, при отказе включаются шаблоны на трёх языках.

Ключевые решения

  • детерминированное ранжирование
  • grounded LLM-объяснения
  • шаблонный fallback
  • JWT/HttpOnly-сессии
  • транзакционный импорт датасета

Особенности

Одна команда scripts/start.py поднимает весь стек с миграциями и импортом, флаг --gpu запускает локальную Qwen через Ollama (можно обойтись без облачной LLM). Интерфейс на трёх языках (ru/kk/en). Есть отдельный Telegram-бот напоминаний о дедлайнах.

Стек

Python · FastAPI · PostgreSQL · SQLAlchemy · Alembic · Next.js · React · Tailwind CSS · Docker Compose · Telegram Bot API · Playwright

Модели

OpenAI gpt-4o-mini · Qwen3 8B (Ollama)


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-1e16bce7-daniyal.

README

README.md

Career Quest

AI-навигатор развития сотрудников для HackAlem AI, трек Halyk Bank.

Career Quest помогает сотруднику понять, каких навыков не хватает для карьерной цели и какие обучения помогут их развить. HR получает обзор готовности сотрудников, дефицита навыков и участия в обучении. Решение связывает профиль, требования к грейду и каталог мероприятий в персональный план развития.

Что реализовано

React + Next.js + Tailwind для мобильного и настольного браузера, FastAPI, PostgreSQL + SQLAlchemy, Alembic и Docker Compose.

  • / — обзор профиля сотрудника; /career — карьерная траектория и навыки; /recommendations — рекомендации; /activities — каталог активностей и завершение с результатом; /history — история участия.
  • /hr — экраны KPI, gaps, статистики активностей, сотрудников с поиском/фильтрами, просмотра профиля и загрузки исходного/добавочного датасета.
  • /ai-recommendations — отдельный подбор обучения из PostgreSQL с объяснениями Qwen3/Ollama или OpenAI и fallback на трёх языках. Доступен после демо-входа: сотруднику — свой профиль, HR — список сотрудников.
  • Demo-вход, HttpOnly-сессия, allowlist web-прокси; загрузка, пустые состояния, ошибки и повтор запросов. В браузере нет расчётов scoring/readiness или локальной БД.
  • Доменные модели, расчёт роста навыков и автономный AI-слой: gaps/readiness, рекомендации, OpenAI-объяснения и fallback на трёх языках.

Бизнес-таблицы, первая миграция и транзакционный CLI-импорт датасета реализованы. Фронтенд подключён к backend API и PostgreSQL. На странице входа выберите «Сотрудник» и профиль (например E0001), либо «HR» и введите DEMO_HR_PASSWORD из локального .env. Каталог, список HR, HTTP-импорт и завершение подключены к реальной БД. Траектория, рекомендации и HR-аналитика рассчитываются на backend по данным из той же БД. Mock-данные не подставляются. Контракт и тестовый режим: Frontend API.

Telegram-бот: запуск и команды. Отдельный mock JSON, напоминания о дедлайнах, просрочках и отсутствии участия. Токен нужен только для реальной отправки.

Backend: новые сценарии

Реализованы список сотрудников HR, каталог активностей, HTTP initial/append импорт и транзакционное завершение с защитой от повторного начисления. Контракты, миграция и правила демо-симуляции: backend-workflows. Траектория, рекомендации и HR-метрики рассчитываются доменной логикой; см. career-workspace.

Как работает решение

  1. HR загружает датасет с сотрудниками, навыками, требованиями и мероприятиями.
  2. Сотрудник входит в свой демо-профиль и видит текущие навыки, карьерную цель и готовность к целевому грейду.
  3. Backend сравнивает навыки с требованиями и подбирает до трёх активностей с учётом истории участия. Сотрудник получает объяснение пользы каждой активности.
  4. Сотрудник открывает активность и отмечает завершение. Backend сохраняет историю, начисляет предусмотренный прирост навыков и пересчитывает готовность.
  5. Следующий запрос рекомендаций учитывает обновлённый прогресс; HR видит его в профиле сотрудника и сводной аналитике.

Технологии

КомпонентТехнологии
Веб-интерфейсTypeScript, React 19, Next.js 16, Tailwind CSS 4
BackendPython 3.11+, FastAPI, Pydantic, Uvicorn
Хранение данныхPostgreSQL 17, SQLAlchemy, psycopg, Alembic
ДоступJWT через PyJWT, HttpOnly cookie и серверный web-прокси
ПодборДетерминированный алгоритм на Python
AI-объясненияOpenAI Responses API (gpt-4o-mini по умолчанию) или Ollama (qwen3:8b по умолчанию), HTTPX
Telegram-прототипPython, Telegram Bot API, JSON и SQLite
Запуск и проверкиDocker Compose, pytest, TypeScript, Node.js test runner

Модели задаются через OPENAI_MODEL и OLLAMA_MODEL. Для работы с шаблонными объяснениями внешняя AI-модель не требуется.

Архитектура

flowchart LR
    User[Сотрудник / HR в браузере] --> Web[Next.js и web-прокси]
    Web --> API[FastAPI: авторизация и бизнес-API]
    API --> Services[Прикладные сервисы]
    Services --> DB[(PostgreSQL)]
    Services --> Engine[Расчёт навыков и ранжирование на Python]
    Engine --> Facts[Проверенные факты для объяснений]
    Facts --> Explanation[OpenAI / Ollama / шаблоны]
    Files[Датасет JSON и CSV] --> Import[CLI / HTTP-импорт]
    Import --> DB

Браузер обращается к Next.js, который передаёт запросы и сессию в FastAPI. Backend проверяет права, читает PostgreSQL и выполняет расчёты. AI-провайдер получает факты уже выбранных рекомендаций, а итоговый текст собирается и проверяется backend. Telegram-бот запускается отдельным worker и пока использует собственный mock JSON; к основной PostgreSQL он не подключён.

Откуда берутся рекомендации

Оба раздела — Recommendations (/recommendations) и AI-подбор (/ai-recommendations) — получают данные из PostgreSQL через backend API. Исходный набор из папки dataset загружается явно через CLI или HR-интерфейс:

ФайлДанные
employees.jsonПрофили сотрудников, исходные оценки навыков и карьерные цели
skills.jsonКаталог навыков, карьерные ступени и требования к грейдам
events.jsonОбучения и мероприятия, прирост навыков, условия участия и расписание
activity_history.csvИстория участия и результаты активностей

При запросе рекомендаций backend читает текущие навыки, цель, историю и каталог из БД. Завершение активности обновляет навыки и историю в БД, поэтому следующий подбор учитывает прогресс. JSON/CSV не перечитываются при каждом запросе. Для расписания и истории используется бизнес-дата датасета as_of_date.

DeterministicRecommendationEngine выбирает до трёх мероприятий: проверяет роль, грейд, предварительные требования и доступные даты; исключает обязательные, compliance/onboarding, уже активные и завершённые неповторяемые мероприятия. В подбор попадают только активности, сокращающие дефицит навыков для цели. Оценка score складывается из доли закрываемого дефицита (85%) и истории участия в активностях того же типа (15%); критические навыки имеют двойной вес. Если цель не задана явно, используется следующий грейд. При отсутствии требований или подходящих мероприятий результат может быть пустым.

LLM отвечает только за оформление объяснений: выбирает порядок и варианты формулировок из проверенных фактов. Подбор, score, прирост навыков и готовность к грейду рассчитывает код. При отключённой модели, ошибке или таймауте возвращаются шаблонные объяснения; рекомендации сохраняются.

РазделЗапрос через web-проксиОбъяснения
RecommendationsPOST /api/v1/employees/{id}/recommendations, тело { "language": "ru" }OpenAI или шаблон; этот маршрут напрямую использует OpenAIExplanationProvider
AI-подборPOST /api/v1/recommendations, тело { "employee_id": "E0001", "locale": "ru" }OpenAI или Ollama по LLM_PROVIDER, либо шаблон

Оба API поддерживают ru, kk, en и требуют входа: сотрудник запрашивает свой профиль, HR — любой. LLM_ENABLED=false включает шаблонные объяснения. Без OPENAI_API_KEY OpenAI-адаптер также использует шаблоны. LLM_PROVIDER=ollama переключает объяснения только в AI-подборе.

Код: основной API, AI-подбор, ранжирование, объяснения.

Быстрый запуск

Локальная модель на GPU и страница рекомендаций: инструкция.

Нужны Python 3.10+ и запущенный Docker Desktop / Docker Engine с Compose. Из корня репозитория выполните одну команду (Windows / Linux / macOS):

python scripts/start.py

На Linux команда Python может называться python3. Скрипт создаёт .env, включает демо-вход, генерирует пароль HR и JWT-секрет, собирает контейнеры, применяет миграции, импортирует датасет и ждёт готовности приложения. Пароль для входа HR — значение DEMO_HR_PASSWORD в .env; в логи он не выводится. Существующие настройки и пароли сохраняются. Повторный запуск не сбрасывает навыки и историю; изменённый исходный датасет отклоняется без перезаписи БД.

На NVIDIA-сервере с настроенным Container Toolkit запуск с загрузкой Qwen:

python3 scripts/start.py --gpu

Этот вариант также запускает Ollama и скачивает модель из OLLAMA_MODEL. Без GPU и ключа OpenAI приложение работает с явно обозначенными шаблонными объяснениями. Qwen сейчас подключён к /ai-recommendations; основной кабинет пока использует OpenAI либо шаблоны. Проверка полного сценария в браузере: сценарий жюри.

Откройте приложение и выберите демо-профиль сотрудника либо роль HR с паролем из созданного .env.

Ключ OpenAI не нужен. Первый запуск скачивает зависимости и образы. Скрипт создаёт настройки доступа только с localhost. Для телефона в доверенной локальной сети задайте WEB_BIND_HOST=0.0.0.0 в .env и повторите запуск. API и PostgreSQL доступны только на localhost; браузер обращается к API через web-прокси. PostgreSQL использует порт 55432 (POSTGRES_PORT) и сохраняет данные в Docker volume. docker compose down останавливает стек без удаления данных. Локальные credentials из .env.example предназначены для разработки. При изменении credentials обновите также локальный DATABASE_URL; для пароля в URL нужно percent-encoding специальных символов. В уже созданной БД переменные Compose не меняют пароль автоматически.

Открыть с телефона

  1. Подключите компьютер и телефон к одной Wi-Fi сети.
  2. Запустите приложение командой выше. Если .env уже существует, убедитесь, что WEB_BIND_HOST=0.0.0.0, и выполните docker compose up -d web.
  3. Узнайте локальный IPv4 компьютера (ipconfig в Windows, адрес адаптера Wi-Fi).
  4. Откройте в браузере телефона http://<IP-компьютера>:3000, например http://192.168.1.10:3000.
  5. Войдите с demo-ролью после настройки демо-доступа (см. ниже). Устанавливать приложение не требуется.

Если страница не открывается, проверьте доступ к TCP-порту 3000 в брандмауэре для частной сети и отсутствие изоляции устройств в Wi-Fi. localhost на телефоне означает сам телефон. Для доступа через интернет нужен отдельный деплой с публичным HTTPS-адресом; текущая настройка рассчитана на локальную сеть.

Локальная разработка

Нужен Node.js 22.13+ ветки 22 LTS (nvm install && nvm use в корне).

cd apps/web
cp .env.example .env.local
npm ci
npm run dev

Сервер слушает 0.0.0.0:3000: с телефона используйте тот же адрес компьютера. Для проверки backend используйте /api/v1/ready. Для проверки UI до готовности бизнес-API есть отдельный тестовый режим. Next.js читает API_URL только на сервере и проксирует разрешённые system- и бизнес-маршруты. Браузеру не нужен отдельный адрес API или настройка CORS.

Для локального backend оставьте PostgreSQL в Docker, остановив контейнеры API/web:

docker compose stop api web
docker compose up -d --wait db
python3 -m venv .venv
.venv/bin/python -m pip install -r apps/api/requirements-dev.txt
cd apps/api
cp .env.example .env
../../.venv/bin/python -m uvicorn app.main:app --reload --host 127.0.0.1

Нужен Python 3.11+. В Windows используйте .venv\Scripts\python.exe вместо .venv/bin/python (из apps/api — ..\..\.venv\Scripts\python.exe).

Как проверить решение: сценарий для жюри

После быстрого запуска:

  1. Откройте http://localhost:3000 и войдите как сотрудник, например E0028.
  2. Откройте /career: проверьте текущий и целевой грейд, уровни навыков и требования. Запомните готовность к грейду.
  3. Откройте /recommendations: изучите доступные рекомендации, объяснение и прогноз изменения навыков. Рекомендаций может быть меньше трёх.
  4. Откройте рекомендованную активность и завершите её. Для активности с расписанием выберите предложенную сессию. Проверьте результат, историю, обновлённые навыки и новый подбор. Завершение будущей сессии — демо-симуляция.
  5. Откройте /ai-recommendations и запустите подбор для своего профиля. Без ключа OpenAI ожидается уведомление о шаблонных объяснениях.
  6. Выйдите и войдите как HR с паролем из .env. На /hr проверьте KPI, дефицит навыков, поиск сотрудника и просмотр его профиля.

На уже изменённой БД результаты зависят от сохранённого прогресса. Если подходящих рекомендаций нет, проверьте другой профиль; пустой список — допустимый результат.

Автоматические проверки

Из корня:

.venv/bin/python -m pytest -c apps/api/pytest.ini apps/api/tests -q
npm --prefix apps/web run typecheck
npm --prefix apps/web test
npm --prefix apps/web run build
docker compose config --quiet

Ручная проверка: после настройки демо-доступа и импорта датасета войти как сотрудник, проверить профиль, траекторию, оба раздела рекомендаций и историю. Завершить активность и проверить обновление навыков и рекомендаций; затем проверить вход HR, аналитику и выход из сессии. При недоступном API проверить сообщения об ошибках и повтор запросов. Тестовый режим UI описан в Frontend API. Тесты бота: из apps/bot запустить python -m unittest discover -s tests -v.

Миграции

Первая миграция 0001_dataset создаёт бизнес-таблицы. Из apps/api:

../../.venv/bin/alembic upgrade head
../../.venv/bin/python -m app.import_dataset ../../dataset --validate-only
../../.venv/bin/python -m app.import_dataset ../../dataset

Импорт принимает исходные skills.json, employees.json, events.json и activity_history.csv. Операция атомарна; повтор того же набора возвращает unchanged, изменённый набор отклоняется без перезаписи прогресса. --validate-only не требует БД. Подробные правила и ограничения: данные backend.

В Docker после пересборки API:

docker compose up -d --build api
docker compose exec api alembic upgrade head
docker compose cp dataset api:/tmp/career-quest-dataset
docker compose exec api python -m app.import_dataset /tmp/career-quest-dataset

Миграции и импорт применяются явно, а не при каждом старте API.

Демо-вход и API сотрудника

Backend поддерживает выбор сотрудника из датасета и вход HR по одному демо-паролю. Включается явно через DEMO_AUTH_ENABLED=true, DEMO_HR_PASSWORD и JWT_SECRET. Настройка, контракты и curl-примеры: backend-auth. Frontend использует эти контракты для входа, профиля, навыков и истории.

Данные и интеграции

Основной источник — поставляемый JSON/CSV-датасет и сохранённый в PostgreSQL прогресс. Формат описан в документации датасета. Прямое подключение к кадровой системе банка или внешней LMS не реализовано. OpenAI и Ollama используются для объяснений по настройке; Telegram Bot API — только отдельным прототипом уведомлений. Ключи и адреса сервисов задаются в переменных окружения; примеры — в .env.example и apps/bot/.env.example.

Ограничения текущей версии

  • Авторизация демонстрационная: сотрудник выбирает профиль, HR использует общий демо-пароль. Корпоративного SSO нет.
  • Подбор основан на фиксированных правилах и импортированном каталоге; обучаемой модели рекомендаций и поиска курсов в интернете нет.
  • Готовность и прирост навыков — расчёт по требованиям и эффектам активностей, а не независимая оценка знаний или гарантия повышения.
  • Завершение активности выполняется пользователем в демо-сценарии, включая будущие сессии; подтверждения прохождения из LMS нет.
  • Добавочный импорт принимает новые профили и их историю; перезапись существующих профилей этим способом не поддерживается.
  • Расчёты используют дату датасета. Объяснения поддерживают русский, казахский и английский; интерфейс не полностью локализован.
  • Telegram-бот не синхронизирован с основной БД. Для GPU-профиля Ollama нужны NVIDIA GPU и соответствующее окружение; без модели доступны шаблоны.

Развёрнутая версия

Подтверждённая ссылка на публичную deployed-версию в репозитории не указана. После локального запуска приложение доступно по http://localhost:3000; доступ с телефона в одной сети описан выше.

Структура

apps/web/                 React + Next.js + Tailwind + TypeScript
apps/web/src/app/page.tsx  Мобильный веб-интерфейс сотрудника
apps/web/src/app/hr/       HR Dashboard
apps/api/app/api/          HTTP и Pydantic-контракты
apps/api/app/application/  Порты ранжирования и объяснений
apps/api/app/domain/       Модели и чистая логика навыков
apps/api/app/infrastructure/ SQLAlchemy и подключение к БД
apps/api/app/auth/         Роли и JWT демо-входа
apps/api/migrations/      Alembic
apps/api/tests/           Pytest

Подробнее: архитектура, этапы. Работа команды: распределение задач между тремя участниками. Результаты проверок и ограничения: verification. AI-модуль, автономное демо и контракт для backend: интеграция AI.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
28
Авторы
3
Файлы
145
Ветки
3

Авторы коммитов

Daniyal-Ib 12Marticat 9Asanali Nurmagambet 7

История коммитов

  • 2026-09-23 18:06Record verified browser jury scenario and bootstrap resultsMarticat
  • 2026-09-23 18:05Add one-command demo bootstrap and browser jury workflow verificationMarticat
  • 2026-09-23 17:56updated READMEDaniyal-Ib
  • 2026-09-23 17:50Merge origin/main into AsanaliAsanali Nurmagambet
  • 2026-09-23 17:46Merge latest origin/main inference latency improvementsDaniyal-Ib
  • 2026-09-23 17:43Merge origin/main and reconcile authenticated workspace with AI recommendationsDaniyal-Ib
  • 2026-09-23 17:41Bound local inference latency and warm GPU model at startupMarticat
  • 2026-09-23 17:36docs updatesDaniyal-Ib
Все коммиты (28)
  • 2026-09-23 17:34updates fro daniyalDaniyal-Ib
  • 2026-09-23 17:34updates from backDaniyal-Ib
  • 2026-09-23 17:32docs: document Career Quest for hackathon juryAsanali Nurmagambet
  • 2026-09-23 17:30Document verified GPU inference and current application routesMarticat
  • 2026-09-23 17:24Connect GPU-hosted Qwen explanations to database-backed recommendationsMarticat
  • 2026-09-23 17:23feat: unify Career Quest employee and HR demoAsanali Nurmagambet
  • 2026-09-23 16:59fix: login in frontDaniyal-Ib
  • 2026-09-23 16:46add: updates from back and frontDaniyal-Ib
  • 2026-09-23 16:28feat: align Career Quest UI with Halyk brandingAsanali Nurmagambet
  • 2026-09-23 16:10Merge backend updates with LLM recommendation layerMarticat
  • 2026-09-23 16:07Implement recommendation engine and grounded LLM explanationsMarticat
  • 2026-09-23 16:05Merge branch 'backend/CQ'Daniyal-Ib
  • 2026-09-23 16:03add: backend part for projectDaniyal-Ib
  • 2026-09-23 15:48merge: preserve employee app and interactive HR dashboard at /hrAsanali Nurmagambet
  • 2026-09-23 15:45feat(bot): add Telegram reminders with mock data and opt-in pairingAsanali Nurmagambet
  • 2026-09-23 15:42Add dataset and task descriptionMarticat
  • 2026-09-23 15:37add: tasksDaniyal-Ib
  • 2026-09-23 15:37feat(web): add interactive Halyk HR demo with mock dataAsanali Nurmagambet
  • 2026-09-23 15:00Replace native app with mobile React web experienceMarticat
  • 2026-09-23 14:46Set up Career Quest application foundationDaniyal-Ib
Структура репозитория (145 файлов)
.env.example
.gitignore
.nvmrc
README.md
apps/api/.dockerignore
apps/api/.env.example
apps/api/Dockerfile
apps/api/alembic.ini
apps/api/app/__init__.py
apps/api/app/ai_demo.py
apps/api/app/api/__init__.py
apps/api/app/api/access.py
apps/api/app/api/business.py
apps/api/app/api/career.py
apps/api/app/api/catalog.py
apps/api/app/api/catalog_schemas.py
apps/api/app/api/completion.py
apps/api/app/api/completion_schemas.py
apps/api/app/api/datasets.py
apps/api/app/api/recommendations.py
apps/api/app/api/schemas.py
apps/api/app/api/system.py
apps/api/app/api/upload_limit.py
apps/api/app/application/__init__.py
apps/api/app/application/append_dataset.py
apps/api/app/application/career.py
apps/api/app/application/catalog.py
apps/api/app/application/completion.py
apps/api/app/application/dataset.py
apps/api/app/application/employees.py
apps/api/app/application/explanation_facts.py
apps/api/app/application/import_dataset.py
apps/api/app/application/ports.py
apps/api/app/application/recommendations.py
apps/api/app/auth/__init__.py
apps/api/app/auth/models.py
apps/api/app/auth/tokens.py
apps/api/app/config.py
apps/api/app/domain/__init__.py
apps/api/app/domain/models.py
apps/api/app/domain/progress.py
apps/api/app/domain/ranking.py
apps/api/app/import_dataset.py
apps/api/app/infrastructure/__init__.py
apps/api/app/infrastructure/ai_dataset.py
apps/api/app/infrastructure/database.py
apps/api/app/infrastructure/dataset_loader.py
apps/api/app/infrastructure/explanations.py
apps/api/app/infrastructure/models.py
apps/api/app/infrastructure/recommendation_context.py
apps/api/app/main.py
apps/api/migrations/env.py
apps/api/migrations/script.py.mako
apps/api/migrations/versions/.gitkeep
apps/api/migrations/versions/0001_dataset.py
apps/api/migrations/versions/0002_backend_workflows.py
apps/api/pytest.ini
apps/api/requirements-dev.txt
apps/api/requirements.txt
apps/api/tests/test_ai_dataset.py
apps/api/tests/test_append_dataset.py
apps/api/tests/test_auth_api.py
apps/api/tests/test_career_api.py
apps/api/tests/test_catalog_api.py
apps/api/tests/test_completion.py
apps/api/tests/test_dataset.py
apps/api/tests/test_dataset_postgres.py
apps/api/tests/test_explanations.py
apps/api/tests/test_import_api.py
apps/api/tests/test_ollama.py
apps/api/tests/test_progress.py
apps/api/tests/test_ranking.py
apps/api/tests/test_recommendation_api.py
apps/api/tests/test_system.py
apps/api/tests/test_upload_limit.py
apps/bot/.dockerignore
apps/bot/.env.example
apps/bot/Dockerfile
apps/bot/README.md
apps/bot/career_bot/__init__.py
apps/bot/career_bot/__main__.py
apps/bot/career_bot/adapters.py
apps/bot/career_bot/domain.py
apps/bot/career_bot/service.py
apps/bot/tests/test_bot.py
apps/mobile/.expo/dev/logs/export.log
apps/web/.dockerignore
apps/web/.env.example
apps/web/AGENTS.md
apps/web/CLAUDE.md
apps/web/Dockerfile
apps/web/e2e/jury.spec.ts
apps/web/next-env.d.ts
apps/web/next.config.ts
apps/web/package-lock.json
apps/web/package.json
apps/web/playwright.config.ts
apps/web/postcss.config.mjs
apps/web/src/app/[section]/page.tsx
apps/web/src/app/ai-recommendations/page.tsx
apps/web/src/app/ai-recommendations/recommendations.css
apps/web/src/app/api/v1/[...path]/route.ts
apps/web/src/app/globals.css
apps/web/src/app/hr/[section]/page.tsx
apps/web/src/app/hr/layout.tsx
apps/web/src/app/hr/page.tsx
apps/web/src/app/layout.tsx
apps/web/src/app/page.tsx
apps/web/src/app/workspace.css
apps/web/src/components/employee-profile.tsx
apps/web/src/components/employee-screen.tsx
apps/web/src/components/hr-dashboard.tsx
apps/web/src/components/ui.tsx
apps/web/src/components/workspace.tsx
apps/web/src/lib/api.ts
apps/web/src/lib/contracts.ts
apps/web/src/lib/features.ts
apps/web/tests/client-api.test.mjs
apps/web/tests/fixture-api.mjs
apps/web/tests/proxy.test.mjs
apps/web/tsconfig.json
compose.yaml
dataset/README.kz.md
dataset/README.md
dataset/README.ru.md
dataset/activity_history.csv
dataset/employees.json
dataset/events.json
dataset/skills.json
docs/ai-integration.md
docs/architecture.md
docs/backend-auth.md
docs/backend-data.md
docs/backend-workflows.md
docs/career-workspace.md
docs/frontend-api.md
docs/jury-check.md
docs/local-llm.md
docs/roadmap.md
docs/team-tasks.md
docs/verification.md
scripts/create_jury_fixture.py
scripts/start.py
scripts/tests/test_start.py
task.md
Ветки (3)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.