Перейти до вмісту

Архітектура ​

Прийнята архітектура · 1 жовтня 2026, варіант 2

Agentfy містить harness; API Store Deputy надає єдиний MCP; модуль OpenCart — захищений REST/JSON API. Store Deputy перевіряє підключення, контекст працівника/покупця, права, погодження й аудит, не створюючи другого harness. Connect → вхід/реєстрація → безпечне підключення → автоматичне створення агента в Agentfy з MCP Store Deputy → повернення в модуль. В app: команди, агенти, акаунт, білінг і чат із кожним агентом.

Це замінює попереднє рішення того самого дня про MCP безпосередньо в модулі. Код і прототипи нижче ще не реалізують нову інтеграцію. Сесії покупців і справжній кошик OpenCart мають окрему перевірену прив'язку; cookie залишається в магазині. Див. рішення про єдиний MCP: межі, етапи та подальша робота над контрактом.

Стан · 1 жовтня 2026. Код мають три частини з п'яти — API, застосунок і перша чернетка сайту, — і працюють вони лише на машині розробника. Сайт документації опубліковано. Адмін-панель не створено. Жодного справжнього магазину не підключено: усе, що описано як зроблене, перевірялося лише на двох локальних тестових магазинах.

Store Deputy складається з п'яти частин в одному репозиторії — API, застосунок, адмін-панель, сайт і документація — та невеликого модуля, який встановлюється в магазин. Ці п'ять частин засновник назвав 1 жовтня 2026 року. Код дотримується CleanSlice — архітектурного стандарту, який проєкт використовує для застосунків на NestJS і Nuxt. CleanSlice охоплює API, застосунок і адмін-панель; маркетинговий сайт, сайт документації та код на PHP він не описує, і на відповідних сторінках про це сказано.

Частини ​

ЧастинаДля чогоХто користуєтьсяНа чомуСтан
APIЗнає людей, команди, ролі та підключені магазини. Єдина частина, яка звертається до магазинуЗастосунок; згодом — адмін-панель і агентиNestJS, Prisma, PostgreSQLОснову зроблено; працює локально
ЗастосунокТут людина входить і підтверджує підключення магазинуВласники магазинів та їхні командиNuxt, Vue 3, Pinia, TailwindВхід, реєстрацію та підключення зроблено; працює локально
Адмін-панельПанель для тих, хто керує самим Store DeputyОператори платформиNuxt, якщо будувати так, як описує CleanSliceНе створено; обсяг не визначено
СайтМаркетинговий сайт: те, що власник магазину читає, перш ніж вирішити спробувати продуктПокупціNuxt, Vue 3, TailwindЗроблено першу чернетку: одна сторінка; працює локально
ДокументаціяВнутрішня: дослідження, рішення, специфікації та прототипи дизайнуКоманда й агенти, що працюють над продуктомVitePressОпубліковано
Модуль магазинуВстановлюється в OpenCart. Виконує підписані запити API і дає власникові кнопки Connect, Pause і DisconnectВласник магазину; APIPHP 7.3+, OpenCart 3.0.3.5+Підключення зроблено; запускалося лише на локальних тестових магазинах

Модуль магазину описано в REST 1.0, тут він не повторюється.

Як частини спілкуються ​

покупець ───▶ сайт              маркетингова сторінка
власник ────▶ застосунок ───┐   вхід, реєстрація, підключення
оператор ───▶ адмін-панель ─┤   не створено
                            ▼
                           API ─────── PostgreSQL
                            │
                            │  Bridge Protocol v1: підписані запити
                            ▼
                  модуль у магазині (OpenCart 3)
  • Браузерні частини спілкуються лише з API. Клієнт API в застосунку генерується з опису маршрутів, який дає сам API, а не пишеться вручну.
  • До магазину звертається лише API — за REST 1.0. Застосунок ніколи не викликає магазин.
  • Підключення магазину проходить через три частини. Власник натискає Connect у модулі магазину й потрапляє в застосунок з одноразовим кодом. Застосунок просить API підключити магазин. API надсилає модулю підписаний запит, і власник повертається на сторінку модуля, з якої почав.

Чого CleanSlice вимагає від коду ​

CleanSlice поєднує дві ідеї. Код згруповано за функціями, а всередині кожної функції розділено за відповідальністю.

  • Слайс — це одна функція в одній теці. Усе, що потрібно функції, лежить разом. Додати функцію — означає додати теку; зрозуміти функцію — означає прочитати одну теку.
  • Три шари всередині слайса. Подання приймає ввід і оформлює вивід: контролери та форми запитів в API, сторінки й компоненти в браузерному застосунку. Домен містить правила та контракти для всього зовнішнього. Дані виконують ці контракти, звертаючись до бази або до іншого сервісу.
  • Правила не залежать від інфраструктури. Доменний шар описує, що йому потрібно, у вигляді контракту — шлюзу (gateway). Шар даних його реалізує. Правило на кшталт «підключити магазин може лише власник або адмін» читається й перевіряється без бази даних і мережі.
  • Службові слайси та слайси функцій. Службові (setup) несуть спільну інфраструктуру: підключення до бази, формат помилок, тему, клієнт API. Слайси функцій несуть сам продукт.
  • Пов'язані слайси лежать у спільній теці-просторі імен. Вхід, команди та членство зібрано в user/. Сама батьківська тека коду не містить.
  • Слайси зустрічаються через домен. Слайс може використовувати правила й типи іншого слайса, але не його шар даних.
  • Імена. Теки слайсів — в однині (user, store); маршрути — у множині (/teams).
  • Фіксований стек. NestJS і Prisma для API; Nuxt, Vue 3, Pinia і Tailwind для браузерних застосунків.
  • Чотири фази, що узгоджуються. Загальний план, детальний план, реалізація, огляд — кожна узгоджується до початку наступної; спершу API, потім застосунок.

Коли джерела розходяться, порядок у цьому репозиторії такий: CleanSlice, потім настанова для агентів у репозиторії, потім наявний код.

Де репозиторій відступає від CleanSlice ​

CleanSliceТутЧому
Схеми баз даних зі слайсів зшиває пакет prisma-importЇх зшиває невеликий власний скриптЗаписана причина: пакет востаннє публікувався в лютому 2024 року під Prisma 4
Помилки форматує перехоплювач (interceptor)Їх форматує глобальний фільтр винятківПерехоплювач не бачить помилку, яку кинула перевірка входу, тож відповідь «не увійшов» прийшла б в іншому форматі
Стандарт NestJS показує контролер, що викликає шлюз; сторінка про шари — контролер, що викликає сервісУсюди контролер → сервіс → шлюзПравила ролей — це бізнес-правила, їхнє місце в сервісі
В еталонному застосунку є службовий слайс упровадження залежностейУ застосунку його немаєПоки не потрібен. Сам CleanSlice лишає його для слайсів, яким потрібні підмінні або офлайн-реалізації
Компоненти інтерфейсу генерує shadcn-vueП'ять компонентів написано вручну в тому самому стиліРішення від 29 вересня 2026 року. Повернутися до shadcn-vue, коли знадобляться діалоги, меню чи таблиці
У кожній теці компонентів є Provider.vueУ теці спільної шапки сторінки його немаєПомічено 1 жовтня 2026 року; як рішення не записано

Локальні адреси ​

Усе нижче — машина розробника. Публічної адреси продукт не має.

ЧастинаПортПримітка
Застосунок4140
Адмін-панель4141Зарезервовано; нічого не запущено
API4142Інтерактивний опис маршрутів — за адресою /api
Тестові магазини4143, 4144OpenCart 3.0.3.5 і 3.0.5.1
База даних API4145PostgreSQL у Docker
Документація4146Попередній перегляд продакшн-збірки — на 4147
Локальний дашборд4152Посилання, стан сервісів і логи для розробника; не частина продукту
Сайт4148
  • API — які слайси є і як один запит проходить крізь шари.
  • Застосунок — що людина може зробити сьогодні і як застосунок влаштовано.
  • Адмін-панель — що зарезервовано і що треба вирішити до початку роботи.
  • Сайт — маркетинговий сайт: що на ньому, як його влаштовано і що вирішити далі.
  • Документація — як влаштовано цей сайт і чому CleanSlice на нього не поширюється.
  • План реалізації — цільовий дизайн роботи з каталогом, схвалень і завдань; нічого з цього ще не зроблено.