ШАГРА
Карьерный навигатор для сотрудника и HR.
О проекте
Команда: Invincibles
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Доведённый продукт
Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития
Суть
Карьерный навигатор для сотрудника и HR. Показывает текущий и целевой грейд, карту навыков и разрывы, персональные рекомендации активностей с «примеркой» и сравнением эффекта, подтверждение выполнения, HR-сводку и безопасный импорт профилей.
Как устроено
Синтетический набор данных с фиксированным seed (200 сотрудников, 40 активностей, 60 навыков, 1736 записей истории) загружается в FastAPI со SQLite. Серверные правила считают допуск, разрывы и прогноз изменения навыков. Затем LLM ранжирует только допустимые варианты по структурированной схеме с точным числом выборов: OpenAI gpt-4.1-mini или локальная Ollama qwen2.5:1.5b, без ключа — подбор по правилам. Сессии в HttpOnly cookie, версии и Idempotency-Key защищают от повторного начисления. UI на React поддерживает RU/KK/EN.
Ключевые решения
- LLM ranking with structured output
- rule-based eligibility
- skill gap analysis
- deterministic fallback
- idempotency keys
- OpenAPI contracts
Особенности
Три режима AI (OpenAI, локальная Ollama, офлайн по правилам) и отдельный офлайн-compose для жюри. LLM только ранжирует уже допустимые варианты, а эффекты и запись результата определяют серверные правила. Эффект активности можно «примерить» до выполнения. Интерфейс и README на трёх языках. Работу распределили по трём агентам-исполнителям.
Стек
Python 3.12 · FastAPI · SQLite · React · TypeScript · Tailwind CSS · Docker Compose · Ollama
Модели
gpt-4.1-mini-2025-04-14 · qwen2.5:1.5b (Ollama)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-3e883744-invincibles.
README
README.mdШАГРА превращает профиль сотрудника, требования следующего грейда и историю развития в проверяемый план карьерного шага. Эффект каждой активности можно увидеть и сравнить до её выполнения.
Сотрудник видит разрывы навыков и обоснованные рекомендации, а HR — сводку команды и безопасный импорт профилей. Все расчёты выполняет настоящий API; AI ранжирует варианты, но не подменяет факты.
Продукт в действии

| Сравнение карьерных активностей | HR-аналитика |
|---|---|
![]() | ![]() |
Чем отличается
| Контекст вместо общего совета | Проверяемый результат | Три режима демонстрации |
|---|---|---|
| Учитывает грейд, конкретные пробелы и историю сотрудника | Показывает источник рекомендации и прогноз изменения навыков до подтверждения | OpenAI API, локальная Ollama или полностью готовый fallback без ключа |
Возможности
| Сотрудник | HR |
|---|---|
| Текущий и целевой грейд, покрытие требований | Сводка развития команды |
| Карта навыков и конкретные разрывы | Приоритетные дефициты с понятными знаменателями |
| Персональные рекомендации из каталога | Поиск сотрудника по ID |
| Примерка и сравнение двух активностей | Таблицы участия, фильтры, пагинация |
| Подтверждение выполнения и история | Проверка файлов перед отдельным применением |
RU / KZ / EN, светлая и тёмная темы, desktop и мобильное меню. Язык и тема сохраняются в браузере. Переводы названий зависят от каталога: при отсутствии перевода показывается доступный язык с пояснением. Обоснования сервера остаются на языке источника.
Скриншоты рабочего приложения получены на синтетических данных. Реальных данных сотрудников банка в репозитории нет.
Быстрый старт
Нужны Git и Docker Compose v2. Python и Node.js на хосте не требуются. Первая сборка скачивает зависимости.
git clone https://github.com/BAITC-Hacks/hack-3e883744-invincibles.git
cd hack-3e883744-invincibles
Создайте .env из .env.example, если файла ещё нет.
Linux/macOS:
test -f .env || cp .env.example .env
Windows PowerShell:
if (!(Test-Path .env)) { Copy-Item .env.example .env }
Для AI заполните OPENAI_API_KEY в .env. Без ключа работает подбор по правилам, явно обозначенный в интерфейсе. Ключ нельзя помещать в Git или VITE_*.
docker compose up -d --build app
docker compose ps
Откройте localhost:8080. Проверка сервера · Swagger UI.
| Роль | Логин | Пароль |
|---|---|---|
| Сотрудник, E0001 | employee | demo-employee |
| HR | hr | demo-hr |
Это демонстрационные учётные записи. Пароли задаются через DEMO_EMPLOYEE_PASSWORD и DEMO_HR_PASSWORD.
Установка на разных системах
| Система | Подготовка |
|---|---|
| Windows | Установите Docker Desktop с WSL 2 и Linux containers, запустите его. Команды выполняйте в PowerShell. |
| macOS | Установите Docker Desktop под Apple silicon или Intel, запустите его. Используйте Terminal. |
| Linux | Установите Docker Engine и Compose plugin: Ubuntu или инструкция своего дистрибутива. Проверьте docker info и docker compose version. |
При permission denied для Docker socket на Linux используйте sudo docker compose … либо настройте доступ по правилам своей системы. Актуальные требования к ОС и оборудованию — по официальным ссылкам выше.
Без Docker: Linux / macOS
Нужны Python 3.12 и Node.js 22 LTS (22.19 или новее в ветке 22). Node.js 24 также использовался при проверке. Из корня проекта:
python3.12 -m venv .venv
.venv/bin/python -m pip install -r backend/requirements.lock
npm --prefix frontend ci
npm --prefix frontend run build
export DATABASE_PATH="$PWD/runtime/shagra.sqlite3"
export SESSION_SECRET_PATH="$PWD/runtime/session-secret"
export AI_USAGE_PATH="$PWD/runtime/ai-usage.json"
export KIT_PATH="$PWD/data/synthetic"
export FRONTEND_DIST="$PWD/frontend/dist"
export APP_ORIGIN=http://localhost:8080
export AI_PROVIDER=openai
# Для AI задайте OPENAI_API_KEY в окружении терминала.
.venv/bin/python -m uvicorn app.main:app --app-dir backend --host 127.0.0.1 --port 8080
Без Docker: Windows PowerShell
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r backend/requirements.lock
npm --prefix frontend ci
npm --prefix frontend run build
$env:DATABASE_PATH = "$PWD/runtime/shagra.sqlite3"
$env:SESSION_SECRET_PATH = "$PWD/runtime/session-secret"
$env:AI_USAGE_PATH = "$PWD/runtime/ai-usage.json"
$env:KIT_PATH = "$PWD/data/synthetic"
$env:FRONTEND_DIST = "$PWD/frontend/dist"
$env:APP_ORIGIN = 'http://localhost:8080'
$env:AI_PROVIDER = 'openai'
# Для AI задайте OPENAI_API_KEY в окружении терминала.
.\.venv\Scripts\python.exe -m uvicorn app.main:app --app-dir backend --host 127.0.0.1 --port 8080
Прямой запуск uvicorn автоматически не читает .env. Передайте настройки через окружение. Пустой ключ включает fallback. runtime/ создаётся приложением. Локальный запуск и Compose используют разные хранилища БД.
Проверка для жюри
Готовая инструкция для эксперта: живой OpenAI с приватным тестовым ключом, локальная Ollama без аккаунта и подготовленный офлайн-сценарий. Для третьего варианта ключ не нужен, платные вызовы отключены:
docker compose --env-file config/jury-offline.env -p shagra-jury -f compose.yaml -f compose.offline.yaml up -d --build app
Откройте http://localhost:8081. Отдельный том сохраняет демонстрацию независимо от основного приложения. Это подбор «По правилам», не живой AI. Четыре готовых профиля для импорта показывают полезный шаг, достигнутую цель, последний грейд и отсутствие оценки.
Конфигурация и AI
| Переменная | По умолчанию | Назначение |
|---|---|---|
APP_PORT | 8080 | Порт Compose на компьютере |
APP_ORIGIN | http://localhost:8080 | Точный адрес страницы для POST-запросов |
AI_PROVIDER | openai | openai или ollama |
OPENAI_API_KEY | пусто | Серверный ключ; без него работает fallback |
OPENAI_MODEL | gpt-4.1-mini-2025-04-14 | Модель ранжирования |
AI_MAX_PAID_CALLS | 2000 | Лимит попыток API, не долларовый бюджет |
LLM_TIMEOUT_SECONDS | 8 | Время ожидания модели |
OLLAMA_MODEL | qwen2.5:1.5b | Локальная модель |
COOKIE_SECURE | false | Для локального HTTP; HTTPS требует secure cookies |
Другой порт требует изменить оба значения, например APP_PORT=8081 и APP_ORIGIN=http://localhost:8081. localhost и 127.0.0.1 — разные origin.
Для Ollama задайте в .env AI_PROVIDER=ollama и OLLAMA_BASE_URL=http://ollama:11434:
docker compose --profile local-ai up -d --build
docker compose logs -f model-init
Первый запуск скачивает модель и требует дополнительных ресурсов. До её готовности допустим fallback. AI ранжирует допустимые варианты; эффект, допуск и запись результата определяются серверными правилами. Подробнее об AI.
Данные и импорт
200 сотрудников · 40 активностей · 60 навыков · 1736 записей истории за 24 месяца. Это воспроизводимый синтетический кит команды: seed 20260923, версия shagra-kit/1.
Файл в data/synthetic/ | Содержание |
|---|---|
employees.json | Текущие профили и уровни навыков |
events.json | Активности, аудитория, эффект |
skills.json | Навыки, роли, требования грейдов |
activity_history.csv | История участия |
manifest.json | Происхождение и контрольные суммы |
HR загружает employees.json + activity_history.csv, до 5 MiB каждый. Проверка и применение разделены. Совпавший ID полностью заменяет профиль, включая навыки; история объединяется по ID записи. Проверка действует 15 минут. Неизвестный навык не считается нулевым; импорт истории не начисляет эффект повторно. Схема кита · Правила импорта.
Архитектура
flowchart LR
UI[React · RU / KK / EN] --> API[FastAPI /api/v1]
API --> Rules[Допуск · разрывы · примерка]
API --> DB[(SQLite)]
API --> Rank[Ранжирование]
Rank --> Model[OpenAI / Ollama]
Rank --> Fallback[Подбор по правилам]
Frontend и API обслуживаются с одного origin. HttpOnly cookie хранит сессию; версии защищают от устаревших операций; Idempotency-Key предотвращает повторное начисление. В контейнере один worker, БД и секрет сессий сохраняются в volume.
backend/app/ API, правила, рекомендации, SQLite
frontend/src/ app → pages → features / entities → shared
contracts/ OpenAPI и примеры
data/ синтетический кит и AI-сценарии
tools/ проверки данных, схемы, AI-оценка
docs/ документация, дизайн, результаты проверок
Проверки
После установки зависимостей; на Windows замените .venv/bin/python на .\.venv\Scripts\python.exe:
.venv/bin/python -m pytest -q
.venv/bin/python tools/validate_kit.py
.venv/bin/python -m pip check
npm --prefix frontend run build
cd frontend
npx playwright install chromium firefox webkit
npm run test:e2e
На Linux могут понадобиться системные зависимости Playwright, устанавливаемые через npx playwright install --with-deps. Live-тест изменяет данные: только отдельная тестовая БД и правильный LIVE_BASE_URL. Как запускать и что проверено.
На ревизии 3eb7a86: 42 backend-теста, 21 Chromium-сценарий и 1 live-сценарий прошли на финальном прогоне. Первый параллельный UI-прогон дал один таймаут входа, не повторившийся отдельно и последовательно. Реальные Q1–Q3 OpenAI прошли в предыдущем аудите. Docker daemon в среде проверки недоступен по правам; это не проверка контейнера или всех ОС.
Обновление и помощь
git pull --ff-only
docker compose up -d --build app
docker compose logs --tail=100 app
Остановка: docker compose stop. Пересборка сохраняет volume. Не используйте docker compose down -v, если нужны текущие данные.
| Симптом | Решение |
|---|---|
| Недопустимый источник запроса | Открыть точный APP_ORIGIN; после изменения .env пересоздать контейнер |
| Старый дизайн | Пересобрать image, обновить страницу Ctrl+Shift+R / Cmd+Shift+R |
| «По правилам» | Проверить ключ, провайдера и model_status в health |
| STALE_CONTEXT / IMPORT_CONFLICT / IMPORT_EXPIRED | Обновить профиль или повторить проверку файлов |
| Docker недоступен | Запустить Docker Desktop/daemon, проверить docker info и права |
Для Vite-разработки backend запускается на 8080 с APP_ORIGIN=http://localhost:5173; затем npm --prefix frontend run dev и именно http://localhost:5173. Для обычного билда верните origin 8080.
Документация и границы MVP
- Навигатор · Демо за 3 минуты.
- API и ошибки · OpenAPI.
- Архитектура · Данные · AI · Проверки.
- Компоненты, лицензии и источники. Общая лицензия проекта пока не объявлена.
Это локальный демонстрационный MVP. Покрытие навыков не является решением о повышении; совместимость с официальным китом организаторов не подтверждена. HR API не везде содержит названия ролей; серверные объяснения пока остаются на русском языке. Макеты в docs/validation/ui/redesign и start-design.sh — исторический предпросмотр, для рабочего приложения они не нужны. .env, runtime-БД и зависимости не включаются в Git.
Авторы коммитов
История коммитов
- 2026-09-23 17:58docs: refresh multilingual project readmeAlmazCode
- 2026-09-23 17:47Add page transition and metric microanimationsONI-COLLI
- 2026-09-23 17:47Merge remote-tracking branch 'origin/main'ONI-COLLI
- 2026-09-23 17:43Merge branch 'main' of https://github.com/BAITC-Hacks/hack-3e883744-invinciblesAlmazCode
- 2026-09-23 17:43fix: prepare jury imports and offline verificationAlmazCode
- 2026-09-23 17:43Move mobile preferences into burger menuONI-COLLI
- 2026-09-23 17:41Remove preference pop-up notificationsONI-COLLI
- 2026-09-23 17:40Add subtle motion and preference notificationsONI-COLLI
Все коммиты (63)
- 2026-09-23 17:36Keep preference controls stable across languagesONI-COLLI
- 2026-09-23 17:36Merge remote-tracking branch 'origin/main'ONI-COLLI
- 2026-09-23 17:28Integrate monochrome logos across light and dark themessuber66
- 2026-09-23 17:21docs: add multilingual guides and remove unused assetsAlmazCode
- 2026-09-23 17:05recyclesuber66
- 2026-09-23 17:042ONI-COLLI
- 2026-09-23 16:55Preserve shared API import entry pointAlmazCode
- 2026-09-23 16:54Integrate employee UI safeguards and skill mapAlmazCode
- 2026-09-23 16:22Merge remote-tracking branch 'origin/main'ONI-COLLI
- 2026-09-23 16:21Merge shared UI foundation and verify multilingual redesignONI-COLLI
- 2026-09-23 16:20Add monochrome SHAGRA logo for light and dark themessuber66
- 2026-09-23 16:17Add language and theme switching with simpler career screensONI-COLLI
- 2026-09-23 16:09Add shared dark UI system and role labelsAlmazCode
- 2026-09-23 15:47Merge branch 'main' of https://github.com/BAITC-Hacks/hack-3e883744-invinciblesAlmazCode
- 2026-09-23 15:46updAlmazCode
- 2026-09-23 15:46Add dark redesign mockups and validation evidenceONI-COLLI
- 2026-09-23 15:06Merge remote-tracking branch 'origin/main'ONI-COLLI
- 2026-09-23 15:05Merge branches 'main' and 'main' of https://github.com/BAITC-Hacks/hack-3e883744-invinciblessuber66
- 2026-09-23 15:05Merge remote-tracking branch 'origin/main'ONI-COLLI
- 2026-09-23 15:05Record exact-count schema live validationsuber66
- 2026-09-23 15:03Verify mobile preview and import actionsONI-COLLI
- 2026-09-23 15:02Constrain ranking choice count in structured schemasuber66
- 2026-09-23 15:02Document A3 delivery and verify live workflowONI-COLLI
- 2026-09-23 14:59Refresh A1 validation after A2 live resultsAlmazCode
- 2026-09-23 14:57Record successful isolated Docker integration checkAlmazCode
- 2026-09-23 14:57Merge branch 'main' of https://github.com/BAITC-Hacks/hack-3e883744-invinciblessuber66
- 2026-09-23 14:56Record live AI acceptance and latency resultssuber66
- 2026-09-23 14:54Improve structured ranking prompt and benchmark health pathsuber66
- 2026-09-23 14:52hello world 2ONI-COLLI
- 2026-09-23 14:45Document A2 integration and verify startup probe accountingAlmazCode
- 2026-09-23 14:43Integrate recommendation service into backend startupAlmazCode
- 2026-09-23 14:40chore: expand gitignore for local development artifactsAlmazCode
- 2026-09-23 14:32Validate benchmark cache miss and hit samplessuber66
- 2026-09-23 14:32Record blocked live AI and latency validationsuber66
- 2026-09-23 14:31Integrate recommendations with shared core contractssuber66
- 2026-09-23 14:28Merge branch 'main' of https://github.com/BAITC-Hacks/hack-3e883744-invinciblessuber66
- 2026-09-23 14:28Implement recommendation ranking and AI providerssuber66
- 2026-09-23 14:27Merge remote-tracking branch 'origin/main'AlmazCode
- 2026-09-23 14:26docs: refresh backend validation recordAlmazCode
- 2026-09-23 14:26test: verify history summaries and eligibility reasonsAlmazCode
- 2026-09-23 14:24docs: record backend validation evidence and remaining gatesAlmazCode
- 2026-09-23 14:24test: verify session boundaries and same-origin static servingAlmazCode
- 2026-09-23 14:22fix: reject unsupported import shapes and document HTTP errorsAlmazCode
- 2026-09-23 14:20test: verify full kit reimport and persisted completion retryAlmazCode
- 2026-09-23 14:18test: cover import edge cases and document backend handoffAlmazCode
- 2026-09-23 14:13refactor: align Python package path and strengthen acceptance checksAlmazCode
- 2026-09-23 14:11fix: align recommendation source with design contractAlmazCode
- 2026-09-23 14:09build: add pinned container runtime and exported OpenAPIAlmazCode
- 2026-09-23 14:04feat: add synthetic kit SQLite persistence and API workflowsAlmazCode
- 2026-09-23 13:54feat: establish Shagra contracts and core interfacesAlmazCode
- 2026-09-23 13:532suber66
- 2026-09-23 13:51hello worldONI-COLLI
- 2026-09-23 13:47docs: add hackathon requirements and competition rulesAlmazCode
- 2026-09-23 13:46docs: adopt Tailwind and OpenAI API for Shagra MVPAlmazCode
- 2026-09-23 13:36docs: specify Shagra MVP and three-agent work packagesAlmazCode
Структура репозитория (265 файлов)
.dockerignore .env.example .gitignore Dockerfile README.en.md README.kk.md README.md THIRD_PARTY.md TZ.txt backend/__init__.py backend/app/__init__.py backend/app/application/__init__.py backend/app/application/employees.py backend/app/application/hr.py backend/app/application/imports.py backend/app/bootstrap.py backend/app/contracts/__init__.py backend/app/contracts/api.py backend/app/contracts/domain.py backend/app/contracts/recommendation.py backend/app/core/__init__.py backend/app/core/eligibility.py backend/app/core/errors.py backend/app/core/history.py backend/app/core/progress.py backend/app/data/__init__.py backend/app/data/import_adapter.py backend/app/data/kit_v1.py backend/app/data/repository.py backend/app/data/schema.sql backend/app/data/validation.py backend/app/http/__init__.py backend/app/http/routes.py backend/app/main.py backend/app/recommendations/__init__.py backend/app/recommendations/candidates.py backend/app/recommendations/providers.py backend/app/recommendations/service.py backend/requirements.in backend/requirements.lock backend/tests/__init__.py backend/tests/api/__init__.py backend/tests/api/test_http.py backend/tests/api/test_import.py backend/tests/api/test_import_compatibility.py backend/tests/api/test_repository.py backend/tests/core/__init__.py backend/tests/core/test_progress.py backend/tests/recommendations/test_recommendations.py compose.offline.yaml compose.yaml config/jury-offline.env contracts/README.md contracts/examples/completion.json contracts/examples/error-stale.json contracts/examples/hr-overview.json contracts/examples/import-commit.json contracts/examples/import-invalid.json contracts/examples/import-valid.json contracts/examples/preview-request.json contracts/examples/preview.json contracts/examples/profile-active.json contracts/examples/profile-no-next-grade.json contracts/examples/recommendations-fallback.json contracts/examples/recommendations-llm.json contracts/openapi.json data/acceptance/q1-q3.json data/demo-import/README.md data/demo-import/activity_history.csv data/demo-import/employees.json data/synthetic/README.md data/synthetic/activity_history.csv data/synthetic/employees.json data/synthetic/events.json data/synthetic/manifest.json data/synthetic/skills.json docs/AI.md docs/ARCHITECTURE.md docs/DATA.md docs/DEMO.md docs/JURY.md docs/README.md docs/TESTING.md docs/implementation/README.md docs/implementation/a3-redesign-requirements.md docs/implementation/a3-template.jpg docs/implementation/agent-1-data-api.md docs/implementation/agent-2-recommendations.md docs/implementation/agent-3-ui-delivery.md docs/implementation/frontend-design-requirements.md docs/implementation/production-agent-1-ui.md docs/implementation/production-agent-2-hr.md docs/implementation/production-agent-3-api-release.md docs/superpowers/plans/2026-09-23-production-redesign.md docs/superpowers/specs/2026-09-23-shagra-design.md docs/validation/a1-handoff.md docs/validation/ai.json docs/validation/backend.json docs/validation/documentation-cleanup-2026-09-23.md docs/validation/jury-openai.json docs/validation/jury-readiness.json docs/validation/latency.json docs/validation/ui/README.md docs/validation/ui/hr-390.png docs/validation/ui/import-390.png docs/validation/ui/profile-1280.png docs/validation/ui/profile-390.png docs/validation/ui/redesign/README.md docs/validation/ui/redesign/assets-manifest.json docs/validation/ui/redesign/assets/LICENSE-ibm-plex-mono.txt docs/validation/ui/redesign/assets/LICENSE-ibm-plex-sans.txt docs/validation/ui/redesign/assets/LICENSE-lucide.txt docs/validation/ui/redesign/assets/files/ibm-plex-mono-cyrillic-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-cyrillic-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-cyrillic-ext-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-cyrillic-ext-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-latin-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-latin-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-latin-ext-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-latin-ext-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-vietnamese-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-mono-vietnamese-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-cyrillic-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-cyrillic-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-cyrillic-600-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-cyrillic-ext-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-cyrillic-ext-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-cyrillic-ext-600-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-greek-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-greek-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-greek-600-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-latin-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-latin-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-latin-600-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-latin-ext-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-latin-ext-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-latin-ext-600-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-vietnamese-400-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-vietnamese-500-normal.woff2 docs/validation/ui/redesign/assets/files/ibm-plex-sans-vietnamese-600-normal.woff2 docs/validation/ui/redesign/assets/mono-400.css docs/validation/ui/redesign/assets/mono-500.css docs/validation/ui/redesign/assets/sans-400.css docs/validation/ui/redesign/assets/sans-500.css docs/validation/ui/redesign/assets/sans-600.css docs/validation/ui/redesign/capture.mjs docs/validation/ui/redesign/data.js docs/validation/ui/redesign/generate_data.py docs/validation/ui/redesign/hr-1440x900.png docs/validation/ui/redesign/hr-390x844.png docs/validation/ui/redesign/index.html docs/validation/ui/redesign/preview.js docs/validation/ui/redesign/profile-1440x900.png docs/validation/ui/redesign/profile-390x844.png docs/validation/ui/redesign/style.css docs/validation/ui/redesign/validation.json docs/validation/ui/simple/README.md docs/validation/ui/simple/hr-1440-light.png docs/validation/ui/simple/hr-390-light.png docs/validation/ui/simple/live-hr-1440-dark.png docs/validation/ui/simple/live-hr-1440-light.png docs/validation/ui/simple/live-hr-390-dark.png docs/validation/ui/simple/live-hr-390-light.png docs/validation/ui/simple/live-preview.png docs/validation/ui/simple/live-profile-1440-dark.png docs/validation/ui/simple/live-profile-1440-light.png docs/validation/ui/simple/live-profile-390-dark.png docs/validation/ui/simple/live-profile-390-light.png docs/validation/ui/simple/login-390-en.png docs/validation/ui/simple/login-390-kk.png docs/validation/ui/simple/profile-1440-dark.png docs/validation/ui/simple/profile-1440-light.png docs/validation/ui/simple/profile-390-dark.png docs/validation/ui/simple/profile-390-light.png docs/validation/ui/simple/profile-empty.png docs/validation/ui/simple/profile-error.png docs/validation/ui/simple/profile-loading.png frontend/.gitignore frontend/index.html frontend/package-lock.json frontend/package.json frontend/playwright.config.ts frontend/playwright.live.config.ts frontend/public/brand/logo-dark.png frontend/public/brand/logo-light.png frontend/src/api.ts frontend/src/app/App.tsx frontend/src/app/AppShell.tsx frontend/src/entities/skill/SkillMap.tsx frontend/src/entities/skill/Skills.tsx frontend/src/features/completion/CompletionDialog.tsx frontend/src/features/import/files.ts frontend/src/features/preview/PreviewDialog.tsx frontend/src/features/recommendations/RecommendationCard.tsx frontend/src/main.tsx frontend/src/pages/HrPage.tsx frontend/src/pages/ImportPage.tsx frontend/src/pages/LoginPage.tsx frontend/src/pages/ProfilePage.tsx frontend/src/shared/api/client.ts frontend/src/shared/api/types.ts frontend/src/shared/lib/format.ts frontend/src/shared/lib/messages.ts frontend/src/shared/lib/preferences.tsx frontend/src/shared/styles/fonts/LICENSE-ibm-plex-mono.txt frontend/src/shared/styles/fonts/LICENSE-ibm-plex-sans.txt frontend/src/shared/styles/fonts/LICENSE-lucide.txt frontend/src/shared/styles/fonts/files/ibm-plex-mono-cyrillic-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-cyrillic-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-cyrillic-ext-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-cyrillic-ext-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-latin-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-latin-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-latin-ext-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-latin-ext-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-vietnamese-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-mono-vietnamese-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-cyrillic-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-cyrillic-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-cyrillic-600-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-cyrillic-ext-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-cyrillic-ext-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-cyrillic-ext-600-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-greek-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-greek-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-greek-600-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-latin-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-latin-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-latin-600-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-latin-ext-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-latin-ext-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-latin-ext-600-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-vietnamese-400-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-vietnamese-500-normal.woff2 frontend/src/shared/styles/fonts/files/ibm-plex-sans-vietnamese-600-normal.woff2 frontend/src/shared/styles/fonts/mono-400.css frontend/src/shared/styles/fonts/mono-500.css frontend/src/shared/styles/fonts/sans-400.css frontend/src/shared/styles/fonts/sans-500.css frontend/src/shared/styles/fonts/sans-600.css frontend/src/shared/styles/global.css frontend/src/shared/ui/BrandMark.tsx frontend/src/shared/ui/DataTable.tsx frontend/src/shared/ui/Dialog.tsx frontend/src/shared/ui/index.tsx frontend/src/types.ts frontend/src/vite-env.d.ts frontend/tests/employee-redesign.spec.ts frontend/tests/helpers.ts frontend/tests/live.spec.ts frontend/tests/simple-ui.spec.ts frontend/tsconfig.json frontend/vite.config.ts output/imagegen/shagra-logo-monochrome/PROMPTS.md output/imagegen/shagra-logo-monochrome/WEB-ASSETS.md output/imagegen/shagra-logo-monochrome/light-and-dark.png pytest.ini rules.md start-design.sh tools/benchmark.py tools/evaluate_recommendations.py tools/export_openapi.py tools/generate_contract_examples.py tools/generate_kit.py tools/validate_kit.py
Ветки (2)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.

