AAYMA
RU
Войти

SanaLink

Маркетплейс на Next.js. Бизнес с помощью AI превращает сырое описание задачи в карточку с рейтингом готовности 0–100, студенческие команды…

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

О проекте

Команда: Aimens
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт

Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд

Суть

Маркетплейс на Next.js. Бизнес с помощью AI превращает сырое описание задачи в карточку с рейтингом готовности 0–100, студенческие команды откликаются, бизнес вручную выбирает команду и подтверждает первый результат (+10 баллов).

Как устроено

Конструктор в четыре шага: черновик → 3–5 уточняющих вопросов → редактируемая карточка → публикация. OpenAI Responses API со Structured Outputs задаёт вопросы и заполняет поля с указанием источников; без ключа работает локальный помощник. Рейтинг готовности считает одна функция computeReadiness (9 критериев с весами, всё или ничего) на клиенте и повторно на сервере. Данные хранятся в SQLite через node:sqlite, валидация через Zod.

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

  • Structured Outputs
  • аддитивный рейтинг готовности
  • локальный фолбэк
  • геймификация баллами

Особенности

Сервер пересчитывает рейтинг сам и не доверяет баллу от клиента. Баллы команда получает только за подтверждённый бизнесом результат, один раз на пару задача–команда. Интерфейс на трёх языках (ru/kk/en).

Стек

TypeScript · Next.js 16 · React 19 · Tailwind CSS 4 · Node.js 24 · SQLite (node:sqlite) · Zod · Vitest · Playwright

Модели

gpt-4.1-mini-2025-04-14 (OpenAI)


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

README

README.md

SanaLink — от запроса бизнеса к проекту студенческой команды

У бизнеса есть задачи, для которых нужны свежий взгляд и конкретный первый результат, но исходный запрос часто слишком общий: непонятны исходные данные, ограничения и признаки успеха. Студенческим командам, в свою очередь, трудно найти практический проект с ясными ожиданиями и прямой связью с заказчиком. SanaLink помогает сторонам встретиться вокруг задачи, которую можно понять и начать решать.

Представитель бизнеса описывает проблему своими словами. Помощник находит пробелы, задаёт уточняющие вопросы и помогает собрать редактируемую карточку: что происходит сейчас, кому нужно решение, какие данные доступны, какой результат ожидается и как его проверить. Бизнес проверяет сведения и публикует задачу. Оценка готовности показывает, насколько описание полезно для старта работы и что ещё стоит уточнить. Более подготовленные задачи заметнее в общем каталоге, при этом открыты для просмотра и задачи, которым пока не хватает деталей.

Команды изучают задачи по интересам и навыкам, видят требования и степень готовности, предлагают идею, план работы и прототип. Бизнес сравнивает предложения и самостоятельно решает, с кем продолжить работу. Так компания получает варианты решения своей проблемы, а студенты — опыт работы с настоящим запросом, обратной связью и результатом, который можно показать в портфолио.

Проект команды Aimens по кейсу AI Sana / HackAlem. Репозиторий. Это запускаемое локальное демо на синтетических данных: для знакомства с основным сценарием регистрация и API-ключ не нужны.

Запуск · Сценарий для жюри · Архитектура · Ограничения

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

ВозможностьЧто можно сделать в приложении
Конструктор задачиПройти четыре шага: черновик → уточнение → карточка → публикация
ПомощникПолучить 3–5 уточняющих вопросов; с OpenAI — заполнить пустые поля сведениями из своего текста и увидеть источники
Редактирование и подтверждениеИсправить ответы, проверить полную карточку и вручную подтвердить публикацию
Объяснимый рейтингУвидеть готовность от 0 до 100, вклад каждого критерия и недостающие сведения
Открытый каталогИскать задачи, фильтровать по теме, готовности и формату работы, менять сортировку и сохранять избранное
Предложения командОтправить идею, план, срок и ссылку на прототип; сравнить предложения и вручную выбрать одну или несколько команд
Первый результатОтправить описание и ссылку, исправить их до подтверждения и получить 10 баллов после подтверждения бизнесом
Кабинеты и демопрофилиПереключаться между бизнесом и пятью командами, видеть задачи, отклики, решения и баллы
Собственная командаСоздать демокоманду с названием, интересами и значком, затем отправлять предложения от её имени
Языки интерфейсаПереключать русский, казахский и английский; введённые пользователем тексты сохраняются на языке оригинала
Сохранение данныхПродолжить работу после перезапуска: карточки, предложения и результаты хранятся в SQLite

Создать свою команду можно на /teams/new: укажите название, направления и один из десяти значков. Новый профиль сразу становится активным; переключение между бизнесом и командами доступно в меню справа. Язык выбирается в шапке и сохраняется в браузере.

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

flowchart LR
    A[Описание бизнеса] --> B[3–5 уточняющих вопросов]
    B --> C[Редактируемая карточка и рейтинг]
    C --> D[Подтверждение и публикация]
    D --> E[Предложения команд]
    E --> F[Ручной выбор бизнеса]
    F --> G[Первый результат]
    G --> H[Подтверждение бизнеса: +10 баллов]

AI помогает подготовить задачу. Публикацию, выбор команды и подтверждение результата выполняет человек. Все опубликованные задачи доступны каждой команде; низкая готовность не блокирует публикацию или отклик.

Два разных показателя

Готовность задачи — 0–100. Это полнота подтверждённой карточки, а не оценка компании или качества будущего решения. Единая функция computeReadiness(card) используется для предварительного показа и серверного пересчёта.

КритерийБаллы
Контекст10
Потребность10
Данные и способ доступа к ним20
Ожидаемый результат15
Показатель успеха и целевое значение15
Ограничения10
Пользователи10
Контакт5
Формат взаимодействия с бизнесом5
Итого100

Каждый критерий даёт полный вес или 0. Пустые значения не учитываются; отсутствие данных или способа доступа даёт 0 за данные. Название, тема, навыки и место работы баллы не добавляют.

0–3940–6970–8990–100
ЧерновикРабочаяГотоваяПриоритетная

До подтверждения рейтинг в редакторе предварительный. Для публикации достаточно названия, темы и явного подтверждения. Неподтверждённые правки не меняют публичную карточку. Каталог по умолчанию сортируется по убыванию готовности, затем по более ранней публикации и идентификатору.

Баллы команды — за подтверждённый результат. Отклик и выбор команды баллов не дают. Первый результат приносит 10 баллов один раз для пары «задача — команда». Повторное подтверждение и несколько предложений одной команды не увеличивают награду. Число предложений не ограничено; выбор одной команды не отклоняет остальные.

Технологии

СлойТехнологии
Язык и интерфейсTypeScript, React 19, Next.js 16 App Router
Стили и графикаTailwind CSS 4, CSS Modules, Lucide, локальный DM Sans и SVG/PNG
СерверNode.js 24.x, HTTP-обработчики Next.js в Node runtime
ВалидацияZod
ХранениеSQLite через встроенный node:sqlite, без ORM
AIOpenAI SDK, Responses API, Structured Outputs; модель по умолчанию gpt-4.1-mini-2025-04-14
ПроверкиVitest, Playwright, ESLint, TypeScript

Точные версии зависимостей зафиксированы в package-lock.json; npm ci устанавливает их без пересчёта. Исходники создавались с помощью Codex. OpenAI — единственный необязательный внешний сервис анализа.

Архитектура

Один Node.js процесс обслуживает интерфейс и API. Отдельный backend, сервер базы данных и очередь задач для запуска не нужны.

flowchart TD
    UI[Браузер: страницы и формы] --> API[Next.js: HTTP API]
    UI --> RULES[Общие правила: типы, Zod, рейтинг]
    API --> RULES
    API --> STORE[Серверные операции]
    STORE --> DB[(SQLite)]
    API --> AI[Адаптер анализа]
    AI --> OPENAI[OpenAI Responses API]
    AI --> LOCAL[Локальные вопросы при недоступности AI]
src/
  app/                     страницы, HTTP API и общие стили
  components/              каталог, кабинеты, предложения и рейтинг
    task-builder/          четыре шага конструктора и состояние формы
  domain/                  типы, валидация, рейтинг и демоданные
  server/                  SQLite, бизнес-операции и адаптер AI
public/assets/             локальные изображения
scripts/                   проверка production-запуска и экспорт графики
tests/                     модульные, серверные и браузерные тесты
docs/                      подробные контракты и сценарий демонстрации

Основные сущности: Task — задача, Team — команда, Proposal — предложение, Progress — первый результат. API: GET /api/demo возвращает данные текущего демопрофиля, POST /api/demo выполняет действия, POST /api/analyze анализирует описание. Сервер проверяет входные данные и пересчитывает рейтинг; готовый балл от клиента не принимается как источник истины.

Подробнее: архитектура и HTTP-контракт.

Дополнительно POST /api/suggest-topic предлагает одно из 12 направлений, а POST /api/review-task возвращает необязательные рекомендации по содержанию. Эта отдельная оценка не влияет на рейтинг готовности, каталог или возможность публикации.

Установка и запуск

1. Подготовьте окружение

Нужны Node.js 24.x, npm и Git. В проекте указан npm 11.17.0. Проверьте установленную версию Node:

node --version
npm --version

2. Скачайте проект и установите зависимости

git clone --branch main https://github.com/BAITC-Hacks/hack-0ae2732e-aimens.git
cd hack-0ae2732e-aimens
npm ci

Команда клонирования выбирает ветку с текущей реализацией. Интернет нужен для скачивания проекта и зависимостей.

3. Запустите приложение

npm run dev

Откройте http://127.0.0.1:3000. Без .env.local и API-ключа автоматически включается локальный помощник. После установки зависимостей основной сценарий работает без интернета; шрифты и изображения находятся в проекте.

SQLite создаётся автоматически в data/praktika.sqlite. Начальные записи добавляются без дублирования и без перезаписи пользовательских изменений. Не удаляйте файл базы, если хотите сохранить результаты проверки.

Если порт 3000 занят:

npm run dev -- --port 3001

В этом случае откройте http://127.0.0.1:3001.

Production-запуск

Остановите dev-сервер и выполните:

npm run build
npm start

Адрес по умолчанию тот же: http://127.0.0.1:3000.

Подключение OpenAI — необязательно

Скопируйте .env.example в .env.local:

# Windows PowerShell
Copy-Item .env.example .env.local
# macOS / Linux
cp .env.example .env.local

Заполните OPENAI_API_KEY в .env.local и перезапустите сервер.

ПеременнаяПо умолчаниюНазначение
AI_MODEautolocal принудительно включает локальный режим
OPENAI_API_KEYПустоСерверный ключ OpenAI
OPENAI_MODELgpt-4.1-mini-2025-04-14Модель для анализа
DATABASE_PATHdata/praktika.sqliteПуть к сохраняемой базе

Ключ не передаётся браузеру; .env.local исключён из Git. Реальные ключи нельзя добавлять в репозиторий.

Как проверить решение

Основной сценарий для жюри — около пяти минут

1. Опишите проблему. В режиме «Бизнес» нажмите «Разместить задачу», выберите тему «Торговля» и введите:

У нас сеть кофеен. Каждый вечер остаётся выпечка, и мы не понимаем, сколько готовить завтра.

Нажмите «Помочь с описанием». Появятся 3–5 вопросов и подпись режима анализа. Без ключа это локальный помощник; он задаёт вопросы, но не генерирует ответы.

2. Подготовьте карточку. Ответьте на вопросы и нажмите «Перейти к карточке». Для воспроизводимой проверки используйте следующие синтетические сведения:

ПолеПример значения
НазваниеСнизить списания выпечки в сети кофеен
КонтекстКаждый вечер остаётся непроданная выпечка
ПотребностьТочнее планировать производство на завтра
ПользователиУправляющие кофейнями
ДанныеТаблица продаж и списаний за три месяца
Доступ к даннымБудут предоставлены
Ожидаемый результатПрототип расчёта объёма выпечки на следующий день
Показатель успехаДоля списанной выпечки
Целевое значениеСнизить на 20% на тестовой выборке
ОграниченияТолько синтетические данные, без кассовых интеграций
Контакт[email protected]
ВзаимодействиеКонсультация раз в неделю

Ожидается: ответы редактируются, рейтинг меняется при заполнении. Все девять критериев дают 100/100. Данные вместе с доступом добавляют 20 баллов, показатель вместе с целью — 15.

3. Опубликуйте задачу. Нажмите «Предпросмотр», отметьте проверку сведений, затем «Подтвердить карточку» → «Опубликовать задачу». Найдите публикацию в каталоге.

4. Отправьте предложение. Переключитесь в режим «Студент» и выберите Qyran Lab в меню профиля. Откройте созданную задачу и отправьте:

  • Идея: прогноз спроса по истории продаж.
  • План: изучить таблицу, собрать базовый прогноз, проверить с бизнесом.
  • Срок: две недели.
  • Ссылка на прототип: https://example.com/prototype.

5. Выберите команду. Вернитесь в режим «Бизнес» и нажмите «Выбрать команду» у предложения. На этом этапе баллы команды не меняются.

6. Подтвердите результат. В режиме Qyran Lab отправьте первый результат: «Подготовлен прототип прогноза по синтетическим данным», ссылка https://example.com/result. Вернитесь в бизнес и нажмите «Подтвердить результат · +10».

Ожидается: у команды стало на 10 баллов больше. Повторное подтверждение той же пары «задача — команда» не даёт дополнительную награду. Ссылки example.com нужны для проверки формы и не ведут на настоящий прототип.

Проверка сохранения: запомните URL задачи, остановите сервер и запустите его снова с тем же DATABASE_PATH. Карточка, предложение, результат и баллы должны сохраниться.

Подробный сценарий демонстрации.

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

После npm ci выполните:

npm test
npm run typecheck
npm run lint
npx playwright install chromium
npm run test:e2e
npm run build
npm run test:production
ПроверкаЧто проверяет
npm testФормулу и границы рейтинга, правила публикации, предложения, начисление баллов, AI-валидацию и серверные операции
npm run typecheck / npm run lintТипы и статический анализ кода
npm run test:e2eПользовательские сценарии в реальном браузере, включая полный путь и работу конструктора
npm run buildСборку приложения для production
npm run test:productionHTTP-сценарий без ключа, реальный перезапуск сервера, сохранность SQLite и защиту от повторного начисления

Playwright использует порт 3100, локальный AI и отдельную временную базу. Порт должен быть свободен. Production-проверка также создаёт временную базу; рабочие данные не затрагиваются.

Итоговая версия проверена 23 сентября 2026 в чистой копии, без .env.local, API-ключа и рабочей базы; Node.js 24.18.0 / npm 11.17.0.

КомандаРезультат
npm ciУстановка по lockfile успешна
npm test87 тестов прошли
npm run test:e2e38 сценариев прошли, Chromium; полный прогон около 2 минут
npm run buildProduction-сборка успешна
npm run typecheck, npm run lintБез ошибок
npm run test:productionПолный путь без ключа, публикация при нулевом рейтинге, независимость AI-рекомендаций, перезапуск и однократные +10 баллов

В автоматических тестах внешних AI-ответов используется подмена; доступность реального OpenAI API проверяется отдельно. Состав итогового объединения веток.

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

Демоданные

На свежей базе автоматически создаются 5 исходных черновиков, 5 опубликованных задач, 5 команд и 5 предложений. Опубликованные задачи имеют готовность 100 / 90 / 75 / 55 / 20, чтобы можно было проверить разные уровни и фильтры. Черновики доступны бизнесу, скрыты от каталога и имеют официальный рейтинг 0.

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

AI-анализ

В OpenAI передаются исходное описание, тема и уже введённые сведения. Сервер запрашивает структурированный ответ, проверяет его через Zod и принимает извлечённое значение только при дословном совпадении с фрагментом пользовательского ввода. Пустые поля заполняются автоматически; источники видны рядом, ответы можно исправить. Кнопка «Заполнить с ИИ» доступна над вопросами и у текстовых полей карточки. Введённые ответы не перезаписываются.

Если ключ отсутствует, API недоступен, превышен тайм-аут 20 секунд, получен отказ или некорректный ответ, приложение явно включает локальный режим. Он определяет пробелы правилами и задаёт вопросы по текущему вводу, без внешней модели и без выдуманных ответов. Ошибка анализа не очищает форму. Для внешнего запроса используется store: false.

Промпт, формат входа/выхода и пример некорректного ответа.

Ограничения

  • Демонстрационные роли вместо регистрации. Один демобизнес управляет задачами; переключатель профиля не проверяет личность. Для публичной эксплуатации нужны аутентификация и разделение владельцев.
  • Один сервер с локальной SQLite. Распределённое развёртывание, масштабирование и production-инфраструктура не реализованы; нужен сохраняемый диск.
  • AI ограничен исходным текстом. Он не проверяет истинность фактов и не гарантирует смысловую уместность цитаты. Карточку проверяет человек. Локальный режим задаёт вопросы, но не выполняет AI-автозаполнение.
  • Локализация интерфейса использует словари. Пользовательские данные и свободные ответы AI автоматически не переводятся; отдельные новые формулировки могут оставаться на русском.
  • Нет загрузки файлов и бизнес-интеграций. Прототип и результат представлены текстом и ссылкой. Чат, уведомления, календарь и сложный трекер не входят в MVP.
  • Несохранённая форма теряется при перезагрузке. Для продолжения работы используйте «Сохранить черновик». Сохранённые данные остаются в SQLite, избранное — в браузере.
  • Решения по предложению окончательны. Выбор или отклонение нельзя отменить; первый результат редактируется только до подтверждения бизнесом.

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

Подтверждённая ссылка на публичную deployed-версию в репозитории не указана. Для оценки используйте локальный запуск по инструкции выше.

Репозиторий: BAITC-Hacks / hack-0ae2732e-aimens.

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

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

ubatora 15Magic-Duke 10Sashasavin18 1

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

  • 2026-09-23 17:59Restore detailed project description in READMEMagic-Duke
  • 2026-09-23 17:54merge: reconcile concurrent main integration with verified final versionubatora
  • 2026-09-23 17:53merge: incorporate final marketplace documentationubatora
  • 2026-09-23 17:53merge: integrate SanaLink branches with verified MVP rulesubatora
  • 2026-09-23 17:51Merge marketplace, localization and README into mainMagic-Duke
  • 2026-09-23 17:46Document three languages and team creationMagic-Duke
  • 2026-09-23 17:45Clarify project purpose and value in READMEMagic-Duke
  • 2026-09-23 17:39docs: rewrite README for hackathon juryubatora
Все коммиты (26)
  • 2026-09-23 17:37Add Kazakh Russian and English interface localizationMagic-Duke
  • 2026-09-23 17:28Mix Kazakh Russian and English demo brandsMagic-Duke
  • 2026-09-23 17:27feat: add AI-assisted filling to task builder and clarification questionsubatora
  • 2026-09-23 17:24Brighten marketplace palette and card depthMagic-Duke
  • 2026-09-23 17:20Improve task scoring and marketplace experienceMagic-Duke
  • 2026-09-23 16:53docs: record SanaLink audit and verified production workflowubatora
  • 2026-09-23 16:53fix: harden demo flows and improve marketplace navigationubatora
  • 2026-09-23 16:53fix: prioritize unanswered fields in AI clarificationubatora
  • 2026-09-23 16:44feat: add task assessment and team creation flowsMagic-Duke
  • 2026-09-23 16:23docs: record confirmed HackAlem submissionubatora
  • 2026-09-23 16:22docs: record verified HackAlem requirements and clean launchubatora
  • 2026-09-23 16:18fix: complete contextual AI and draft-to-result workflowubatora
  • 2026-09-23 15:30merge: combine SanaLink design and scoring hardeningubatora
  • 2026-09-23 15:20feat: build SanaLink marketplace demoubatora
  • 2026-09-23 15:07Update README.mdSashasavin18
  • 2026-09-23 15:07feat: harden scoring AI and gamificationMagic-Duke
  • 2026-09-23 14:21feat: redesign Praktika demo with accessible UI tokensubatora
  • 2026-09-23 13:58feat: add Praktika hackathon demo with complete business-team workflowubatora
Структура репозитория (231 файлов)
.env.example
.gitignore
.npmrc
AGENTS.md
AUDIT.md
HACKALEM_STRUCTURE.md
PLAN.md
README.md
data/sample/.gitkeep
docs/AI_PROMPT.md
docs/ARCHITECTURE.md
docs/DEMO.md
docs/DESIGN_SYSTEM.md
docs/INTEGRATION.md
docs/REQUIREMENTS_AUDIT.md
docs/TASK_BUILDER.md
docs/ai.md
docs/progress.md
docs/sources.md
docs/task.md
eslint.config.mjs
next.config.ts
package-lock.json
package.json
playwright.config.ts
postcss.config.mjs
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/hero-preview.png
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/png/[email protected]
public/assets/svg/arrow-right.svg
public/assets/svg/bookmark.svg
public/assets/svg/briefcase.svg
public/assets/svg/calendar.svg
public/assets/svg/category-commerce.svg
public/assets/svg/category-design.svg
public/assets/svg/category-eco.svg
public/assets/svg/category-education.svg
public/assets/svg/category-finance.svg
public/assets/svg/category-it.svg
public/assets/svg/category-logistics.svg
public/assets/svg/category-marketing.svg
public/assets/svg/chart.svg
public/assets/svg/check.svg
public/assets/svg/chevron-down.svg
public/assets/svg/close.svg
public/assets/svg/company.svg
public/assets/svg/document.svg
public/assets/svg/edit.svg
public/assets/svg/empty-state.svg
public/assets/svg/filter.svg
public/assets/svg/hero-illustration.svg
public/assets/svg/link.svg
public/assets/svg/location.svg
public/assets/svg/logo-mark.svg
public/assets/svg/logo.svg
public/assets/svg/search.svg
public/assets/svg/send.svg
public/assets/svg/sparkles-ai.svg
public/assets/svg/students.svg
public/assets/svg/team.svg
public/assets/svg/trophy.svg
scripts/export-assets.mjs
scripts/verify-production.mjs
src/.gitkeep
src/app/api/analyze/route.ts
src/app/api/demo/route.ts
src/app/api/review-task/route.ts
src/app/api/suggest-topic/route.ts
src/app/business/page.tsx
src/app/catalog/page.tsx
src/app/globals.css
src/app/guide/page.tsx
src/app/layout.tsx
src/app/page.tsx
src/app/tasks/[id]/edit/page.tsx
src/app/tasks/[id]/page.tsx
src/app/tasks/new/page.tsx
src/app/team/page.tsx
src/app/teams/new/page.tsx
src/app/teams/page.tsx
src/app/tokens.css
src/assets/svg/arrow-right.svg
src/assets/svg/bookmark.svg
src/assets/svg/briefcase.svg
src/assets/svg/calendar.svg
src/assets/svg/category-commerce.svg
src/assets/svg/category-design.svg
src/assets/svg/category-eco.svg
src/assets/svg/category-education.svg
src/assets/svg/category-finance.svg
src/assets/svg/category-it.svg
src/assets/svg/category-logistics.svg
src/assets/svg/category-marketing.svg
src/assets/svg/chart.svg
src/assets/svg/check.svg
src/assets/svg/chevron-down.svg
src/assets/svg/close.svg
src/assets/svg/company.svg
src/assets/svg/document.svg
src/assets/svg/edit.svg
src/assets/svg/empty-state.svg
src/assets/svg/filter.svg
src/assets/svg/hero-illustration.svg
src/assets/svg/link.svg
src/assets/svg/location.svg
src/assets/svg/logo-mark.svg
src/assets/svg/logo.svg
src/assets/svg/search.svg
src/assets/svg/send.svg
src/assets/svg/sparkles-ai.svg
src/assets/svg/students.svg
src/assets/svg/team.svg
src/assets/svg/trophy.svg
src/components/catalog.tsx
src/components/demo-provider.tsx
src/components/favorites.tsx
src/components/locale-provider.tsx
src/components/proposal-comparison.tsx
src/components/proposals.tsx
src/components/score-ring.tsx
src/components/shell.tsx
src/components/task-builder/card-fields.tsx
src/components/task-builder/clarification-step.tsx
src/components/task-builder/draft-step.tsx
src/components/task-builder/publish-step.tsx
src/components/task-builder/task-builder.module.css
src/components/task-builder/use-task-builder.ts
src/components/task-editor.tsx
src/components/team-icon.tsx
src/components/ui.tsx
src/domain/builder-analysis.ts
src/domain/catalog.ts
src/domain/demo-data.ts
src/domain/task.ts
src/i18n/en.ts
src/i18n/kk.ts
src/i18n/ru.ts
src/server/ai.ts
src/server/http.ts
src/server/review-tickets.ts
src/server/store.ts
tasks/plan.md
tasks/todo.md
tests/.gitkeep
tests/ai-fallback.test.ts
tests/ai-readiness.test.ts
tests/ai.test.ts
tests/analyze-route.test.ts
tests/builder-analysis.test.ts
tests/catalog.test.ts
tests/e2e/advice.spec.ts
tests/e2e/builder-ai.spec.ts
tests/e2e/builder.spec.ts
tests/e2e/catalog.spec.ts
tests/e2e/demo.spec.ts
tests/e2e/localization.spec.ts
tests/e2e/proposals.spec.ts
tests/e2e/provider.spec.ts
tests/e2e/surfaces.spec.ts
tests/e2e/teams.spec.ts
tests/http.test.ts
tests/quality-assessment.test.ts
tests/readiness.test.ts
tests/review-tickets.test.ts
tests/store.test.ts
tests/topic.test.ts
tsconfig.json
vitest.config.ts
Правила оценивания.docx
Ветки (5)

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

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

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