AAYMA
RU
Войти

KazAST-AI

MVP Challenge Hub: бизнес создаёт черновик задачи, AI задаёт уточняющие вопросы и предлагает карточку, после подтверждения считается рейтинг полноты…

Рабочий MVP
Команда «KazAST-AI» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: KazAST-AI
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP

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

Суть

MVP Challenge Hub: бизнес создаёт черновик задачи, AI задаёт уточняющие вопросы и предлагает карточку, после подтверждения считается рейтинг полноты и задача публикуется в каталог, студенческие команды откликаются, бизнес выбирает команду.

Как устроено

Vue 3 + Vuex фронтенд обращается к Express 5 API, бизнес-сервисы пишут в PostgreSQL 16 через параметризованный SQL, с транзакциями, блокировкой строки и оптимистичной версией (409 VERSION_CONFLICT). Сервис clarification-ai генерирует 3–8 вопросов и предложение карточки через OpenAI Responses API со Structured Outputs (JSON Schema), есть локальная заглушка. Рейтинг вычисляется по полноте подтверждённого снимка карточки (JSONB), каталог сортируется по нему.

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

  • OpenAI Structured Outputs / JSON Schema
  • optimistic locking
  • SQL migrations
  • readiness scoring

Особенности

Версионирование задач с неизменяемыми подтверждёнными снимками карточки в JSONB и защитой от гонок; AI-вызов выполняется без удержания блокировки БД, версия перепроверяется перед записью.

Стек

JavaScript · Vue 3 · Vuex · Vue Router · Vite · Node.js · Express 5 · PostgreSQL · Docker Compose

Модели

GPT-4o-mini


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

README

README.md

KazAST-AI

MVP платформы практических задач для бизнеса и студенческих команд. Представитель бизнеса создаёт черновик, заполняет карточку, подтверждает сведения и публикует задачу. Полнота подтверждённой карточки определяет рейтинг и порядок в открытом каталоге.

Работает сквозной сценарий: черновик → AI-вопросы → ответы → предложение карточки → ручная проверка → подтверждение и рейтинг → публикация → отклик → выбор команды.

Реализованы API и интерфейсы конструктора, каталога с пагинацией по 12 задач, публичной карточки, «Моих задач» бизнеса и «Моих откликов» студента. AI работает через OpenAI либо явно обозначенную локальную заглушку. Подтверждение этапов работы и начисление баллов командам пока представлены только в БД.

Технический стек

СлойТехнологииНазначение
FrontendJavaScript, Vue 3.5, Vue Router 4, Vuex 4Страницы, навигация, состояние и API-запросы
Сборка frontendVite 6, @vitejs/plugin-vue 5Dev-сервер и production-сборка
ОформлениеHTML, CSS, собственный стайл-китТокены, кнопки, формы и общие стили без сторонней UI-библиотеки
BackendNode.js 22 в Docker, Express 5, ES modulesHTTP API, валидация, бизнес-операции
Доступ к БДpg 8, параметризованный SQLПул соединений и транзакции; ORM не используется
База данныхPostgreSQL 16Данные, ограничения, снимки карточек, вычисление рейтинга
МиграцииSQL-файлы и Node.js-скриптТранзакционное применение, контрольные суммы и блокировка запуска
ТестированиеВстроенный node:test, assert, реальный PostgreSQLAPI, ограничения БД, Vuex-модули
ОкружениеDocker, Docker ComposeСервисы frontend, backend, db, постоянные volumes
AIopenai SDK 5, Responses API, Structured OutputsУточняющие вопросы и подготовка карточки; локальный демо-режим

Диапазоны версий указаны в frontend/package.json и backend/package.json, точные версии зависимостей зафиксированы в соответствующих package-lock.json.

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

Нужны Docker и Docker Compose. Выполняйте команды из корня проекта.

Если .env ещё нет, создайте его из шаблона; существующий файл с настройками не перезаписывайте:

cp .env.example .env

Запустите сервисы и загрузите тестовые данные:

docker compose up --build -d
docker compose exec backend npm run db:seed
docker compose exec backend npm run db:seed:catalog

Compose ждёт готовности PostgreSQL, затем backend применяет миграции и запускает сервер. Frontend стартует после успешной проверки backend. Изменения исходников подхватываются в режиме разработки. Новые миграции применяются при запуске backend; для уже работающего контейнера выполните docker compose exec backend npm run db:migrate. Текущие миграции: 001_initial.sql (основная схема), 002_task_version.sql (версия задачи), 003_clarification_sessions.sql (раунды уточнения).

Если в существующих volumes остались старые зависимости, обновите их и пересоздайте сервисы:

docker compose run --rm --no-deps backend npm ci
docker compose run --rm --no-deps frontend npm ci
docker compose up --build -d

Обычная остановка: docker compose down. Данные БД остаются в volume postgres_data. Команда docker compose down -v удаляет volumes вместе с данными.

Настройки окружения

ПеременнаяНазначение
POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORDНастройки PostgreSQL в Compose; локальные значения приведены в .env.example
DATABASE_URLПодключение Node.js к БД. Compose собирает URL с хостом db; для запуска Node на хосте нужен адрес localhost:5433
DEMO_AUTH_ENABLEDЛокальный демо-доступ к операциям владельца; по умолчанию включён в Compose
VITE_API_URLАдрес backend для браузера; в Compose — http://localhost:3000
VITE_DEMO_USER_IDНеобязательный UUID демо-пользователя фронтенда; по умолчанию первый бизнес-пользователь seed
OPENAI_API_KEYКлюч реального AI-режима, только на backend
AI_MODEopenai или local; пустое — выбор по наличию ключа
OPENAI_MODELМодель Structured Outputs; по умолчанию gpt-4o-mini

Compose передаёт сервисам только переменные, перечисленные в их environment. Для переопределения VITE_DEMO_USER_ID добавьте его в frontend.environment или задайте в окружении локального Vite. Node-скрипты самостоятельно .env не загружают. Пароли со специальными символами URI нужно кодировать в DATABASE_URL.

.env исключён из Git. Ключ AI передаётся только backend, не в переменных VITE_* или исходниках.

Архитектура бэкенда

Vue-компонент → Vuex action → API-клиент → Express route
                                            ↓
                                      бизнес-сервис
                                            ↓
                                  pg Pool → PostgreSQL
  • src/server.js запускает HTTP-сервер, src/app.js собирает Express-приложение, CORS, JSON-парсер и обработку ошибок.
  • src/routes/ связывает HTTP-методы с сервисами и проверкой демо-пользователя.
  • src/services/tasks.js валидирует поля и выполняет создание, чтение владельцем, редактирование, подтверждение и публикацию.
  • src/services/proposals.js проверяет членство в команде, сохраняет отклики и решения бизнеса; src/routes/proposals.js предоставляет методы откликов и списка своих команд.
  • src/services/catalog.js возвращает открытый каталог и отдельную опубликованную карточку; my-tasks.js — список собственных черновиков и публикаций.
  • src/services/clarifications.js управляет раундами уточнения, сохранением ответов и предложений карточки; clarification-state.js читает последний раунд.
  • src/services/clarification-ai.js содержит промпт, JSON Schema, проверку результата, OpenAI-адаптер и локальную заглушку. Внешний вызов выполняется без удержания блокировки БД; перед записью версия проверяется повторно.
  • src/db/pool.js предоставляет пул PostgreSQL. Все значения в SQL передаются параметрами.
  • src/middleware/demo-auth.js проверяет существование пользователя и требуемую маршрутом роль business или student. Сервисы дополнительно проверяют владельца задачи.

Редактирование, подтверждение и публикация используют транзакции и блокировку строки задачи. Клиент передаёт expected_version: устаревшая версия приводит к 409 VERSION_CONFLICT. Сохранение карточки, изменение опубликованного снимка и успешные операции уточнения увеличивают task.version. Повторное подтверждение неизменившейся карточки не создаёт новый снимок; повторная публикация текущего снимка с актуальной версией не меняет дату и версию задачи.

Доступные API

Все пути начинаются с /api. Полные тела запросов, ответы и ошибки — в backend/API.md.

МетодПутьДоступ и действие
GET/healthПроверка сервера и БД
GET/tasksОткрытый каталог: page, industry, readiness_level, по 12 задач
GET/tasks/:id/publishedОткрытая опубликованная карточка
GET/tasks/mineБизнес: свои задачи, фильтр status=draft/published, по 12 на странице
POST/tasksБизнес-пользователь: создание черновика
GET/tasks/:idВладелец: рабочая копия, последнее подтверждение и последний раунд уточнения
PATCH/tasks/:idВладелец: частичное редактирование
POST/tasks/:id/confirmВладелец: подтверждение и расчёт рейтинга
POST/tasks/:id/publishВладелец: публикация или обновление опубликованной версии
POST/tasks/:id/clarification/questionsВладелец: генерация и сохранение 3–8 вопросов
PATCH/tasks/:id/clarification/answersВладелец: сохранение ответов текущего раунда
POST/tasks/:id/clarification/cardВладелец: подготовка предложения карточки
GET/teams/mineСтудент: команды, в которых он состоит
POST/tasks/:id/proposalsСтудент: отправка отклика от своей команды
GET/proposals/mineСтудент: отклики своих команд
GET/tasks/:id/proposalsВладелец: предложения по задаче
PATCH/proposals/:id/statusВладелец: принять или отклонить отклик

Демо-личность выбирается заголовком X-User-Id. После seed доступен UUID 00000000-0000-4000-8000-010000000001. Это не аутентификация для публичного сервера: знающий UUID может выбрать пользователя. В NODE_ENV=production демо-доступ отключается. Открытые каталог и карточки не требуют заголовка.

PostgreSQL и бизнес-данные

Таблица / представлениеСодержимое и назначение
usersПользователи с ролями business / student, без паролей
teams, team_membersКоманды, интересы, навыки, технологии и участники
tasksИсходное описание, редактируемые поля, владелец, версия и ссылка на публикацию
clarification_questionsВопросы и ответы раундов уточнения
clarification_sessionsРаунды уточнения и предложенные карточки
task_revisionsНеизменяемые подтверждённые снимки card в JSONB, автор подтверждения и вычисляемый рейтинг
proposalsПредложения команд и статусы pending, accepted, rejected; подключены к API
progress_milestonesПодтверждённые этапы и баллы; пока только слой БД
schema_migrationsПрименённые миграции, контрольные суммы и время применения
task_catalogПредставление опубликованных снимков, рейтинга, уровней и недостающих сведений
team_progressПредставление суммы баллов за подтверждённые этапы команд

Основные связи: пользователь владеет задачами; задача содержит вопросы и подтверждённые версии; отклик связывает задачу с командой; этап прогресса относится к отклику. Участники связаны с командами через team_members. Внешние ключи защищают связи; каскадного удаления нет.

Жизненный цикл карточки

  1. Сохранение меняет рабочую копию в tasks.
  2. Подтверждение создаёт снимок task_revisions и рассчитывает его рейтинг.
  3. Публикация записывает ссылку на подтверждённый снимок в tasks.published_revision_id и дату published_at.
  4. Обновление требует сохранить и подтвердить правки, затем снова опубликовать. До этого каталог показывает прежний снимок.

БД запрещает изменение подтверждённых снимков и публикацию версии другой задачи. API публикации требует совпадения текущей карточки с последним подтверждением. Нулевой рейтинг публикации не мешает. Статус публикации независим от уровня готовности draft.

Рейтинг и каталог

Рейтинг считается в PostgreSQL функциями readiness_breakdown и readiness_score, хранится вычисляемым столбцом снимка и не принимается от клиента.

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

Группа получает полный вес за непустые подтверждённые поля, иначе 0. Это проверка полноты, а не смыслового качества текста. Уровни: draft 0–39, working 40–69, ready 70–89, priority 90–100.

Каталог показывает только опубликованные версии. Порядок: рейтинг по убыванию, дата публикации по убыванию, UUID по возрастанию. Фильтры применяются до подсчёта и пагинации. Размер страницы фиксирован — 12. Слишком большой номер страницы приводит к последней доступной странице; пустой результат имеет page=1, total_pages=0.

Подробности схемы, миграций и ограничений — backend/db/README.md.

Frontend

МаршрутЭкран
/Главная
/tasksКаталог с фильтрами и пагинацией
/tasks/newСоздание черновика
/tasks/:id/editРедактор с AI-уточнением, подтверждение и публикация
/tasks/:idПубличная карточка и форма отклика студента
/tasks/mineСвои задачи бизнеса, статусы и счётчики откликов
/proposalsОтклики команд текущего студента
/tasks/:id/proposalsПредложения команд и решения владельца

Vuex-модули tasks, catalog, published_task, proposals, my_tasks, app_status хранят данные и состояние запросов. HTTP-запросы выполняются в actions через src/services/api.js, изменения состояния — в mutations. Постоянное хранение обеспечивает PostgreSQL; после перезагрузки данные восстанавливаются через API. Несохранённый текст формы остаётся только в памяти.

Страница редактора использует переиспользуемые поля, секции, уведомления, рейтинг, панель публикации и clarification_panel. Состояние уточнения и ответы хранятся в модуле tasks. Каталог — карточки и пагинацию; публичная страница — секции сведений. Компонентная логика находится в JS-файлах, оформление — в frontend/style/: tokens.css, controls.css, global.css. Правила разработки: FRONTEND_GUIDE.md.

Отклики и выбор команды

В шапке приложения выберите демо-роль. «Студент» использует первого студента seed и его команды, «Бизнес» — бизнес-пользователя редактора. Выбор сохраняется в sessionStorage текущей вкладки; это только демо-доступ, не полноценная авторизация. Открытие редактора задачи переключает кабинет в режим бизнеса.

В режиме студента откройте публичную карточку и заполните форму «Предложить решение»: команда, идея, план, срок и необязательная ссылка. На /proposals доступны «Мои отклики» и текущие статусы. В режиме бизнеса ссылка «Посмотреть отклики» открывает /tasks/:id/proposals; сервер разрешает просмотр и решение только владельцу задачи. Ссылка на предложения также есть в редакторе.

Кнопки «Выбрать команду» и «Отклонить» требуют подтверждения окончательного решения. Можно выбрать несколько команд; принятие не закрывает задачу. Модуль Vuex proposals хранит формы, списки, ошибки и состояния запросов. Неотправленные формы сохраняются при переходах в пределах работающего приложения, но не после перезагрузки. При неопределённом сетевом результате повторная отправка блокируется до обновления списка, чтобы пользователь мог проверить, не сохранился ли отклик.

Мои задачи бизнеса

На /tasks/mine бизнес видит собственные черновики и публикации: по 12 карточек, фильтр по статусу, рейтинги подтверждённой и опубликованной версий, отметки о неопубликованных изменениях и счётчики откликов. Из карточки можно открыть редактор, отклики или публичную страницу. Данные поступают из PostgreSQL через GET /api/tasks/mine и Vuex-модуль my_tasks; доступ использует текущий демо-механизм X-User-Id.

AI-уточнение: настройка и проверка

Режим работы

Для реального AI задайте в .env:

AI_MODE=openai
OPENAI_API_KEY=your_api_key_here
OPENAI_MODEL=gpt-4o-mini

Для локальной демонстрации без внешних запросов задайте AI_MODE=local. В этом режиме стандартные вопросы выбираются прежде всего по незаполненным полям, а ответы копируются дословно; смыслового анализа описания нет. Интерфейс показывает «Локальный демо-режим» после получения вопросов.

При пустом AI_MODE backend выбирает OpenAI, если ключ задан, иначе local. Ошибка OpenAI не переключает приложение на заглушку автоматически. После изменения .env пересоздайте backend:

docker compose up -d --force-recreate backend

В OpenAI отправляются сохранённое описание, поля карточки и ответы. Ключ остаётся на сервере. Промпт запрещает выдумывать факты, неизвестные сведения должны оставаться пустыми. Сервер проверяет структуру ответа; фактическую точность проверяет пользователь. Промпт и схемы — в clarification-ai.js, контракты — в API.md.

Ручная проверка

  1. Откройте /tasks/new и введите: «Заявки клиентов теряются в переписке. Хотим собирать их в одном месте и отслеживать обработку».
  2. Нажмите «Создать черновик», затем «Получить вопросы». Ожидается 3–8 уточняющих вопросов.
  3. Ответьте на известные вопросы и нажмите «Сохранить ответы». Перезагрузите страницу: ответы должны восстановиться. Для подготовки карточки достаточно одного непустого ответа.
  4. Нажмите «Подготовить карточку». Должен появиться предпросмотр; рабочие поля, рейтинг и публикация ещё не меняются. Проверьте, что неизвестные контакты, сроки и материалы не выдуманы.
  5. Нажмите «Перенести в форму», при необходимости исправьте текст. Он остаётся несохранённым до нажатия «Сохранить изменения».
  6. Нажмите «Подтвердить карточку»: рейтинг рассчитывается по заполненным подтверждённым полям. После этого отдельно нажмите «Опубликовать» и проверьте карточку в каталоге.
  7. Для продолжения сквозного сценария перейдите в каталог, переключите демо-роль на «Студент» и отправьте отклик. Вернитесь в «Бизнес», откройте «Мои задачи» → «Отклики» и выберите либо отклоните команду.

Сохранённые ответы и предложение хранятся в PostgreSQL. Новые вопросы создают новый раунд, прежние записи остаются в БД; интерфейс показывает последний раунд. Изменение рабочей карточки делает прежний раунд устаревшим: для следующего уточнения получите новые вопросы. Правки ответов сбрасывают ранее подготовленное предложение. AI не подтверждает и не публикует задачу автоматически.

Диагностика

В DevTools → Network смотрите ответ запроса clarification/questions, clarification/answers или clarification/card.

ОшибкаЧто делать
AI_NOT_CONFIGUREDПроверить AI_MODE и наличие ключа на backend, пересоздать контейнер
AI_UNAVAILABLEПроверить доступ к API, ключ, модель и лимиты; повторить позже
AI_INVALID_RESPONSEМодель вернула неправильный, незавершённый ответ или отказ; повторить запрос
VERSION_CONFLICTСохранить копию несохранённого текста и загрузить актуальную задачу
CLARIFICATION_STALEПолучить новый раунд вопросов для текущей карточки
ANSWERS_REQUIREDСохранить хотя бы один непустой ответ
NETWORK_ERRORПроверить доступность backend; перед повтором проверить сохранённую задачу

Вызов модели ограничен 45 секундами без автоматических повторов; frontend ждёт до 60 секунд. Ошибка генерации не меняет сохранённые ответы или карточку. /api/health проверяет сервер и БД, но не соединение с OpenAI. Состояние сервисов и журналы доступны командами:

docker compose ps
docker compose logs --tail=100 backend

Демо-данные и проверки

  • db:seed создаёт 5 бизнес-пользователей, 5 студентов, 5 команд, 6 исходных описаний, 5 опубликованных карточек, 15 вопросов и 5 откликов.
  • db:seed:catalog добавляет 24 опубликованные синтетические задачи с разными темами и рейтингами. Вместе с базовым seed это 29 карточек: страницы 12 / 12 / 5. Пользовательские и ручные тестовые задачи увеличивают это количество.
  • Seed-скрипты используют фиксированные UUID и допускают повторный запуск без дубликатов. Расширенный seed не изменяет существующие задачи.
docker compose exec backend npm run test:db
docker compose exec backend npm run test:api
docker compose exec frontend npm test
docker compose exec frontend npm run build

Проверки БД выполняются с откатом тестовой транзакции. API-тесты создают отдельные схемы PostgreSQL и удаляют их после выполнения; пользователю БД нужно право создания схем. Проверяются права владельца, конфликты версий, публикация и обновление снимков, каталог, фильтры и пагинация. Дополнительно проверяются AI-контракты, ошибки модели, сохранение ответов, устаревшие раунды и отсутствие автоматической публикации. Frontend-тесты проверяют Vuex-сценарии, ручное применение предложения и обработку устаревших ответов. Автотесты AI используют локальный адаптер и подменённые ответы, не требуют ключа и не обращаются к платной модели; реальное соединение проверяйте ручным сценарием выше.

Структура проекта

backend/
  src/
    app.js, server.js
    routes/                 HTTP-маршруты
    services/               Бизнес-операции и каталог
    middleware/             Демо-доступ
    db/                     Пул PostgreSQL
  db/migrations/            SQL-миграции
  db/README.md              Схема и правила хранения
  scripts/                  Миграции и seed-данные
  test/                     Проверки API и БД
  API.md                    Контракт API
frontend/
  src/
    pages/, components/     Экраны и переиспользуемые элементы
    router/                 Маршруты
    store/modules/          Vuex
    services/               HTTP-клиент
    domain/                 Описание полей и критериев
  style/                    Общий CSS-пакет
  test/                     Проверки Vuex
compose.yaml                Локальное окружение
.env.example                Шаблон настроек

Что осталось

  • Прогресс команд: API и интерфейс добавления результата этапа, подтверждения бизнесом и начисления баллов. Таблицы progress_milestones и представление team_progress уже есть; пользовательский сценарий ещё не подключён.
  • Подготовка сдачи: выбрать один демонстрационный пример и отрепетировать сквозной сценарий до 5 минут.

Полноценная регистрация, восстановление пароля, чат, уведомления, файловое хранилище и производственная инфраструктура не входят в обязательный объём хакатонного MVP. Текущий X-User-Id предназначен для локальной демонстрации; перед публичным запуском потребуется настоящая аутентификация.

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

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

overworker13 12auranurali 5Darkhan Tasbulatov 5Merey Zholaman 3merey02 1

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

  • 2026-09-23 17:07Add student proposals and business interactionMerey Zholaman
  • 2026-09-23 16:59Add files via uploadauranurali
  • 2026-09-23 16:58Add files via uploadauranurali
  • 2026-09-23 17:41project update added ai questionsoverworker13
  • 2026-09-23 17:22updated readmeoverworker13
  • 2026-09-23 17:21upadted frontendoverworker13
  • 2026-09-23 17:21updated backendoverworker13
  • 2026-09-23 15:48Add home pageMerey Zholaman
Все коммиты (26)
  • 2026-09-23 15:44Add files via uploadauranurali
  • 2026-09-23 16:42Merge pull request #5 from BAITC-Hacks/home-pageDarkhan Tasbulatov
  • 2026-09-23 16:37updated readme docker composeoverworker13
  • 2026-09-23 16:36Updated server logicoverworker13
  • 2026-09-23 16:36Added and updated frontend pages componentsoverworker13
  • 2026-09-23 15:03Add MongoDB models, seed data and database integrationMerey Zholaman
  • 2026-09-23 15:49Merge pull request #4 from BAITC-Hacks/auranurali--Doc-EditDarkhan Tasbulatov
  • 2026-09-23 14:35Add files via uploadauranurali
  • 2026-09-23 14:33Add files via uploadmerey02
  • 2026-09-23 13:59Add files via uploadauranurali
  • 2026-09-23 14:43addd vue router, pages componentsoverworker13
  • 2026-09-23 14:39Merge pull request #2 from BAITC-Hacks/merey02-frontendfixDarkhan Tasbulatov
  • 2026-09-23 14:35Merge pull request #3 from BAITC-Hacks/auranurali-ReadmeEditDarkhan Tasbulatov
  • 2026-09-23 14:04changed style css components add to folder and renamedoverworker13
  • 2026-09-23 14:01Merge pull request #1 from BAITC-Hacks/auranurali-CSS-colorsDarkhan Tasbulatov
  • 2026-09-23 13:52fixed bugoverworker13
  • 2026-09-23 13:43added vuex and changes To guidlineoverworker13
  • 2026-09-23 13:28first commitoverworker13
Структура репозитория (102 файлов)
.dockerignore
.env.example
.gitignore
FRONTEND_GUIDE.md
README.md
backend/API.md
backend/Dockerfile
backend/db/README.md
backend/db/migrations/001_initial.sql
backend/db/migrations/002_task_version.sql
backend/db/migrations/003_clarification_sessions.sql
backend/package-lock.json
backend/package.json
backend/scripts/migrate.js
backend/scripts/seed.js
backend/scripts/seed_catalog.js
backend/src/app.js
backend/src/db/pool.js
backend/src/middleware/demo-auth.js
backend/src/routes/index.js
backend/src/routes/proposals.js
backend/src/routes/tasks.js
backend/src/server.js
backend/src/services/catalog.js
backend/src/services/clarification-ai.js
backend/src/services/clarification-state.js
backend/src/services/clarifications.js
backend/src/services/my-tasks.js
backend/src/services/proposals.js
backend/src/services/tasks.js
backend/test/catalog-api.test.js
backend/test/clarification-api.test.js
backend/test/database.test.js
backend/test/my-tasks-api.test.js
backend/test/proposals-api.test.js
backend/test/tasks-api.test.js
compose.yaml
frontend/Dockerfile
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/src/App.vue
frontend/src/components/app_header.js
frontend/src/components/app_header.vue
frontend/src/components/app_layout.vue
frontend/src/components/catalog_card/catalog_card.js
frontend/src/components/catalog_card/catalog_card.vue
frontend/src/components/clarification_panel/clarification_panel.js
frontend/src/components/clarification_panel/clarification_panel.vue
frontend/src/components/feature_card.vue
frontend/src/components/feedback_notice/feedback_notice.js
frontend/src/components/feedback_notice/feedback_notice.vue
frontend/src/components/form_field/form_field.js
frontend/src/components/form_field/form_field.vue
frontend/src/components/form_section/form_section.js
frontend/src/components/form_section/form_section.vue
frontend/src/components/owned_task_card/owned_task_card.js
frontend/src/components/owned_task_card/owned_task_card.vue
frontend/src/components/page_pagination/page_pagination.js
frontend/src/components/page_pagination/page_pagination.vue
frontend/src/components/proposal_card/proposal_card.js
frontend/src/components/proposal_card/proposal_card.vue
frontend/src/components/proposal_workspace/proposal_workspace.js
frontend/src/components/proposal_workspace/proposal_workspace.vue
frontend/src/components/publication_panel/publication_panel.js
frontend/src/components/publication_panel/publication_panel.vue
frontend/src/components/task_information/task_information.js
frontend/src/components/task_information/task_information.vue
frontend/src/components/task_readiness/task_readiness.js
frontend/src/components/task_readiness/task_readiness.vue
frontend/src/domain/task_fields.js
frontend/src/main.js
frontend/src/pages/home_page.vue
frontend/src/pages/my_tasks_page.js
frontend/src/pages/my_tasks_page.vue
frontend/src/pages/proposals_page.js
frontend/src/pages/proposals_page.vue
frontend/src/pages/task_catalog_page.js
frontend/src/pages/task_catalog_page.vue
frontend/src/pages/task_create_page.js
frontend/src/pages/task_create_page.vue
frontend/src/pages/task_detail_page.js
frontend/src/pages/task_detail_page.vue
frontend/src/router/index.js
frontend/src/services/api.js
frontend/src/store/index.js
frontend/src/store/modules/app_status.js
frontend/src/store/modules/catalog.js
frontend/src/store/modules/my_tasks.js
frontend/src/store/modules/proposals.js
frontend/src/store/modules/published_task.js
frontend/src/store/modules/tasks.js
frontend/style/controls.css
frontend/style/global.css
frontend/style/tokens.css
frontend/test/catalog_store.test.js
frontend/test/clarification_store.test.js
frontend/test/my_tasks_store.test.js
frontend/test/proposals_store.test.js
frontend/test/published_task_store.test.js
frontend/test/tasks_store.test.js
frontend/vite.config.js
Ветки (10)

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

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

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