Что это. Движок интернет-магазина на TypeScript: корзина, заказы, платежи, склад — как набор модулей, из которых собирают свой магазин. Сам проект описывает себя так: «The world's most flexible commerce platform for agents and developers».
Возраст. Репозиторий заведён 18 января 2020 года; первые коммиты в тот же день, автор Sebastian Rindom: «Adds lerna», «Lerna setup», «Add core». Проект ведёт компания MedusaJS, Inc. Лицензия MIT, кроме материалов Enterprise Edition — у них отдельная лицензия и отдельный файл. Основная ветка называется develop, не main.
Размер. 36 100 звёзд, 5 200 форков, 9 400 влитых PR на сентябрь 2026. Открытых PR — 141, открытых задач — 58: очередь короткая, потому что её подрезает бот (об этом ниже). Самый частый автор коммитов — Shahed Nasser, больше трёх тысяч; дальше Oli Juhl, Sebastian Rindom, Adrien de Peretti. Последний выпуск на момент карточки — v2.19.0 от 13 августа 2026.
Правила — в CONTRIBUTING.md и в шаблоне PR.
Свои — вперёд, и это сказано прямо. Раздел «Important» в самом начале:
Our core maintainers prioritize pull requests (PRs) from within our organization. External contributions are regularly triaged, but not at any fixed cadence. It varies depending on how busy the maintainers are.
Основные мейнтейнеры отдают приоритет PR изнутри организации. Внешние правки разбираются регулярно, но без фиксированного ритма — как заняты мейнтейнеры.
И тут же — обещание: «Within a couple of days a Medusa team member will review, comment and eventually approve your PR» (в течение пары дней кто-то из команды посмотрит). Оба абзаца стоят в одном документе.
Сначала задача, потом PR. Раздел так и называется — «Issues before PRs». Большую фичу просят не присылать, а обсудить с CODEOWNERS: «which will be the case if it does not align with our roadmap» — если она не по дорожной карте, её не примут.
Описание PR — четыре слова. What, Why, How, Testing. Ровно эти четыре заголовка в CONTRIBUTING, в шаблоне PR и в проверке бота: если хоть один пуст, ревью останавливается и просит дописать.
Changeset — обязателен. Любая правка, которая должна выйти в релизе, идёт с файлом в .changeset/; «Every non-breaking change should be marked as a patch». В шаблоне это первая галочка, и бот сверяет её с отдельным changeset-bot.
Всё вливается сквошем. «All pull requests are squashed and merged». Вливает не человек, а kodiakhq по метке automerge; метки on hold, wip, blocked его останавливают.
Тесты — двух видов, оба «must». Unit в __tests__ рядом с кодом, интеграционные в integration-tests/*/__tests__. При этом во внутренних правилах бота есть оговорка: «Minor bug fixes may omit tests if the fix is trivial and clear».
Наблюдения из задач #14757, #14758, #16292, #16377 и семи PR к ним, февраль — сентябрь 2026:
- Первым отвечает бот, и отвечает по существу.
medusa-os-bot— это Claude, запущенный из GitHub Actions (в репозитории лежит и workflow, и почти семьсот строк инструкции для него). На задачу он отвечает через три минуты, и не «спасибо, посмотрим», а с диагнозом: в #16292 — какая строка какого файла и почему это ведёт к двойному списанию; в #14758 — 30 секунд ожидания замка, две минуты TTL, «which matches your reported ~2-minute wait». Ставит меткиtype: bugиrequires-team. - PR он тоже смотрит первым — и только чужие. Список команды лежит в
.github/teams.yml; авторов из него бот пропускает. Остальным ставитinitial-approval(«Initial automated review looks good») илиrequires-more(«A few items need to be addressed»). Он читает только — прав не имеет, выдаёт JSON с решением, а метки ставит отдельный шаг. - Замечания бота — про форму. Нет changeset; в changeset написано
Fix:вместоfix(payment):; в комментарии к коду упомянут#16097— «PR/issue references in source code comments are not allowed»; новые строки без отступа — «Running Prettier on the file will correct this». Автор #16405 прошёл три круга за двадцать минут и остался с одним: отступ. - Дубликаты бот видит, но не блокирует. «Heads up: PR #16293 (opened 2026-08-03) and PR #16390 (opened 2026-08-10) are both earlier open PRs that reference issue #16292… If either is merged first, this PR may be closed as a duplicate.» Это информация, не отказ.
- Живой ревью — редкость, и приходит с вопросом. На четыре PR в плагине лояльности — одно ревью человека, через пятнадцать дней: «The update is correct, though would like to understand first what real use case does calling this workflow with amount = 0 cover». На три PR про ключ идемпотентности — ни одного.
- Автор не ждёт, а чинит сам. blockgroot открыл #16292 в 09:44 и PR #16293 к нему в 10:00. giladv открыл #16377 в 14:24 — PR от lazerg пришёл в 14:58, второй в 15:26, третий через два дня.
- Задачи закрывает бот, и говорит при этом не то. Пометка
Staleприходит с текстом «open 60 days with no activity», а в конфиге порог — 15 дней. 21.04.2026 порог опустили с 60 до 15, текст не тронули. Задача #14758 закрыта так дважды: первый раз её открыл заново NicolasGorga — в тот день, когда поднимал порог с 30 до 60. - Про ИИ в задачах спорят в самих задачах. В #16377: «Using Codex to resolve issues is a great way to be more efficient but I strongly dislike AI as a "source of truth"» — и ответ автора: «the ease of AI driven tickets empowers us to document issues that might otherwise be slipping between the cracks. I think that's a fair tradeoff».
Что из этого следует для того, кто придёт со своей правкой. Первый ответ будет быстрым, точным и от машины. Дальше — метка, тишина и через пятнадцать дней пометка Stale. По семи PR из наших разборов на 02.09.2026 влит ноль; строка let amount = input.amount ? … : … в develop та же, что 9 августа.
Без точек с запятой. Первая строка раздела Code Style в правилах для бота: «No semicolons». Двойные кавычки, два пробела, хвостовые запятые по ES5, скобки вокруг единственного аргумента стрелки: (x) => x + 1. При этом в файле из разбора про ноль на develop тридцать три строки кончаются точкой с запятой; автор #16379 заодно убрал их все, и бот отметил: «correct per Medusa convention but unrelated to the bug fix». Правило есть, код ему следует не весь.
Свойства объектов — snake_case, переменные — camelCase:
В коде нет номеров задач. «Comments in source files must not reference GitHub issue or PR numbers»: // fixes #1234 — обязательное замечание. Связь правки с задачей живёт в описании PR и в коммите.
Ошибки — только MedusaError. new MedusaError(MedusaError.Types.NOT_FOUND, "..."); голый throw new Error(...) — нельзя. Запись в базу — только через workflow; API-роут не зовёт сервис на запись напрямую.
Ветки — fix/, feat/, docs/. Changeset — fix(loyalty-plugin): allow 0 as a valid store credit amount: строчными, имя пакета в скобках. Сообщение коммита после сквоша — заголовок PR с номером: fix(loyalty-plugin): lock account on debit (#16347).
Всё ниже — из документов проекта и из того, что видно в его ветках.
Сначала — задача. Без неё правку попросят обосновать; для большой правки — сначала письмо CODEOWNERS, а не PR.
Проверить, нет ли уже PR. Бот скажет вам об этом сам, но не остановит: у #16292 три открытых PR от трёх людей, все с initial-approval, ни один не влит.
Заполнить четыре раздела и добавить changeset. Иначе первый ответ будет requires-more, и он придёт через четыре минуты.
Убрать номера задач из комментариев в коде и прогнать Prettier — две самые частые придирки бота в наших разборах.
Не рассчитывать на «пару дней». CONTRIBUTING обещает их, но тут же оговаривает: свои — вперёд, внешние — «not at any fixed cadence». Из семи PR в наших разборах человек ответил в одном.
Успеть за пятнадцать дней — или написать что-нибудь. Пометка Stale снимается любым комментарием; через пять дней после неё PR закроют. Автор #16378 так и сделал 31 августа: «This has been sitting since Aug 9 with a green fix, a test, and no maintainer review yet» — и позвал по имени.
Люди, встреченные в наших разборах этого проекта и в его истории. Подробные карточки — в «Определителе».
- srindom — Sebastian Rindom, @medusajs. Первые коммиты 18 января 2020 года.
- shahednasser — Shahed Nasser, @medusajs. Самый частый автор коммитов; собрал бота-ревьюера и бота-триажёра (апрель 2026) и опустил порог
Staleдо 15 дней, не поправив текст. Блокировка счёта от двойного списания (#16347). - NicolasGorga — Nicolas Gorga, MedusaJS. Открыл заново #14758 и в тот же день поднял порог
Staleдо 60; единственное живое ревью на четыре PR в плагине лояльности: «what real use case…». - olivermrbl — Oli Juhl, @medusajs. Завёл
Stale-бота в сентябре 2024 (#9184). - sricharan505, в профиле — sricharan. Завёл #14757, сам закрыл через десять минут и завёл #14758 с тем же названием; на три вопроса бота не ответил.
- blockgroot, без имени в профиле. Задача #16292 про ключ, который каждый раз новый, и PR #16293 к ней шестнадцать минут спустя.
- sunYtokki — Sun Kim. #16390: продолжение #16293 — «keeps this PR's mechanism and both of its tests (with commit co-attribution)» — для случая, когда повтор ключа не сходится.
- MohamedMBG — BAGHDAD Mohamed. #16433, третий PR к той же задаче; сам спросил команду, нужен ли он: «could the team confirm whether #16433 should continue as an alternative implementation».
- giladv, без имени в профиле. Завёл #16377 про ноль, который списывал всё; отстаивал задачи, написанные с ИИ.
- msaikens — Mitchell Aikens. «I strongly dislike AI as a "source of truth"».
- lazerg — Lazizbek Ergashev. #16378, первая починка нуля — через 34 минуты после задачи; 31 августа напомнил о себе.
- ekley — Hossein Ekramian. #16401, третья починка нуля — та, что получила единственное ревью человека.
- actualmayank — mayank k. #16405:
parallelizeтам, где документация обещала «сначала удалить, потом создать». - Автор #16379 — аккаунт удалён, GitHub показывает
ghost. Закрыл свой PR сам через 51 минуту.
- «Ноль, который списывал всё» —
input.amount ? …принимал ноль за «не передали» и списывал весь остаток; верная проверка лежала тремя строками ниже; четыре PR за три дня, одно ревью человека, ни одного вливания. - «Ключ, который каждый раз новый» — защита от двойной отправки отказывает там, где повтор безобиден, и пропускает там, где он стоит денег; три PR к одной задаче, все с
initial-approval.
Карточка собрана 02.09.2026 из открытых источников: репозиторий, документы проекта, переписка в PR и задачах. Фотографий и личных данных здесь нет и не будет. Нашли неточность или хотите, чтобы вас убрали, — напишите, поправим без вопросов.