Skip to content

Compare versions

From:To:
+22
11¶ # Medusa
22
33 **Что это.** Движок интернет-магазина на TypeScript: корзина, заказы, платежи, склад — как набор модулей, из которых собирают свой магазин. Сам проект описывает себя так: «The world's most flexible commerce platform for agents and developers».
44
55 **Возраст.** Репозиторий заведён 18 января 2020 года; первые коммиты в тот же день, автор Sebastian Rindom: «Adds lerna», «Lerna setup», «Add core». Проект ведёт компания MedusaJS, Inc. Лицензия MIT, кроме материалов Enterprise Edition — у них отдельная лицензия и отдельный файл. Основная ветка называется `develop`, не `main`.
66
77 **Размер.** 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.
88¶ ## Привычки, описанные им самим
99
1010 Правила — в [CONTRIBUTING.md](https://github.com/medusajs/medusa/blob/develop/CONTRIBUTING.md) и в [шаблоне PR](https://github.com/medusajs/medusa/blob/develop/.github/pull_request_template.md).
1111
1212 **Свои — вперёд, и это сказано прямо.** Раздел «Important» в самом начале:
1313
1414 > 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.
1515
1616 *Основные мейнтейнеры отдают приоритет PR изнутри организации. Внешние правки разбираются регулярно, но без фиксированного ритма — как заняты мейнтейнеры.*
1717
1818 И тут же — обещание: «Within a couple of days a Medusa team member will review, comment and eventually approve your PR» (*в течение пары дней кто-то из команды посмотрит*). Оба абзаца стоят в одном документе.
1919
2020 **Сначала задача, потом PR.** Раздел так и называется — «Issues before PRs». Большую фичу просят не присылать, а обсудить с CODEOWNERS: «which will be the case if it does not align with our roadmap» — *если она не по дорожной карте, её не примут*.
2121
2222 **Описание PR — четыре слова.** What, Why, How, Testing. Ровно эти четыре заголовка в CONTRIBUTING, в шаблоне PR и в проверке бота: если хоть один пуст, ревью останавливается и просит дописать.
2323
2424 **Changeset — обязателен.** Любая правка, которая должна выйти в релизе, идёт с файлом в `.changeset/`; «Every non-breaking change should be marked as a patch». В шаблоне это первая галочка, и бот сверяет её с отдельным `changeset-bot`.
2525
2626 **Всё вливается сквошем.** «All pull requests are squashed and merged». Вливает не человек, а `kodiakhq` по метке `automerge`; метки `on hold`, `wip`, `blocked` его останавливают.
2727
2828 **Тесты — двух видов, оба «must».** Unit в `__tests__` рядом с кодом, интеграционные в `integration-tests/*/__tests__`. При этом во внутренних правилах бота есть оговорка: «Minor bug fixes may omit tests if the fix is trivial and clear».
2929¶ ## Привычки, видные по переписке
3030
3131 Наблюдения из задач [#14757](https://github.com/medusajs/medusa/issues/14757), [#14758](https://github.com/medusajs/medusa/issues/14758), [#16292](https://github.com/medusajs/medusa/issues/16292), [#16377](https://github.com/medusajs/medusa/issues/16377) и семи PR к ним, февраль — сентябрь 2026:
3232
3333 - **Первым отвечает бот, и отвечает по существу.** `medusa-os-bot` — это Claude, запущенный из GitHub Actions (в репозитории лежит и workflow, и почти семьсот строк инструкции для него). На задачу он отвечает через три минуты, и не «спасибо, посмотрим», а с диагнозом: в #16292 — какая строка какого файла и почему это ведёт к двойному списанию; в #14758 — 30 секунд ожидания замка, две минуты TTL, «which matches your reported ~2-minute wait». Ставит метки `type: bug` и `requires-team`.
3434 - **PR он тоже смотрит первым — и только чужие.** Список команды лежит в `.github/teams.yml`; авторов из него бот пропускает. Остальным ставит `initial-approval` («Initial automated review looks good») или `requires-more` («A few items need to be addressed»). Он читает только — прав не имеет, выдаёт JSON с решением, а метки ставит отдельный шаг.
3535 - **Замечания бота — про форму.** Нет 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 прошёл три круга за двадцать минут и остался с одним: отступ.
3636 - **Дубликаты бот видит, но не блокирует.** «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.» Это информация, не отказ.
3737 - **Живой ревью — редкость, и приходит с вопросом.** На четыре PR в плагине лояльности — одно ревью человека, через пятнадцать дней: «The update is correct, though would like to understand first what real use case does calling this workflow with amount = 0 cover». На три PR про ключ идемпотентности — ни одного.
3838 - **Автор не ждёт, а чинит сам.** blockgroot открыл #16292 в 09:44 и PR #16293 к нему в 10:00. giladv открыл #16377 в 14:24 — PR от lazerg пришёл в 14:58, второй в 15:26, третий через два дня.
3939 - **Задачи закрывает бот, и говорит при этом не то.** Пометка `Stale` приходит с текстом «open 60 days with no activity», а в конфиге порог — 15 дней. 21.04.2026 порог опустили с 60 до 15, текст не тронули. Задача #14758 закрыта так дважды: первый раз её открыл заново NicolasGorga — в тот день, когда поднимал порог с 30 до 60.
4040 - **Про ИИ в задачах спорят в самих задачах.** В #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».
4141
42 **Что из этого следует для того, кто придёт со своей правкой.** Первый ответ будет быстрым, точным и от машины. Дальше — метка, тишина и через пятнадцать дней пометка `Stale`. По семи PR из наших разборов на 02.09.2026 влит ноль; строка `input.amount ? input.amount : …` в `develop` та же, что 9 августа.
42+ **Что из этого следует для того, кто придёт со своей правкой.** Первый ответ будет быстрым, точным и от машины. Дальше — метка, тишина и через пятнадцать дней пометка `Stale`. По семи PR из наших разборов на 02.09.2026 влит ноль; строка `let amount = input.amount ? … : …` в `develop` та же, что 9 августа.
4343¶ ## Мелкие правила, по которым узнаётся свой
4444
45 **Без точек с запятой.** Первая строка раздела Code Style в правилах для бота: «No semicolons». Двойные кавычки, два пробела, хвостовые запятые по ES5, скобки вокруг единственного аргумента стрелки: `(x) => x + 1`.
45+ **Без точек с запятой.** Первая строка раздела Code Style в правилах для бота: «No semicolons». Двойные кавычки, два пробела, хвостовые запятые по ES5, скобки вокруг единственного аргумента стрелки: `(x) => x + 1`. При этом в файле из разбора про ноль на `develop` тридцать три строки кончаются точкой с запятой; автор #16379 заодно убрал их все, и бот отметил: «correct per Medusa convention but unrelated to the bug fix». Правило есть, код ему следует не весь.
4646
4747 **Свойства объектов — snake_case, переменные — camelCase:**
4848
4949 ```
5050 region_id, created_at ← поля
5151 regionId, createdAt ← переменные
5252 this.service_, manager_ ← приватные поля класса, с подчёркиванием в конце
5353 order-module-service.ts ← файлы, kebab-case
5454 ```
5555
5656 **В коде нет номеров задач.** «Comments in source files must not reference GitHub issue or PR numbers»: `// fixes #1234` — обязательное замечание. Связь правки с задачей живёт в описании PR и в коммите.
5757
5858 **Ошибки — только `MedusaError`.** `new MedusaError(MedusaError.Types.NOT_FOUND, "...")`; голый `throw new Error(...)` — нельзя. Запись в базу — только через workflow; API-роут не зовёт сервис на запись напрямую.
5959
6060 **Ветки** — `fix/`, `feat/`, `docs/`. **Changeset** — `fix(loyalty-plugin): allow 0 as a valid store credit amount`: строчными, имя пакета в скобках. **Сообщение коммита после сквоша** — заголовок PR с номером: `fix(loyalty-plugin): lock account on debit (#16347)`.
6161¶ ## Чего ждать, если придёте со своей правкой
6262
6363 Всё ниже — из документов проекта и из того, что видно в его ветках.
6464
6565 **Сначала — задача.** Без неё правку попросят обосновать; для большой правки — сначала письмо CODEOWNERS, а не PR.
6666
6767 **Проверить, нет ли уже PR.** Бот скажет вам об этом сам, но не остановит: у #16292 три открытых PR от трёх людей, все с `initial-approval`, ни один не влит.
6868
6969 **Заполнить четыре раздела и добавить changeset.** Иначе первый ответ будет `requires-more`, и он придёт через четыре минуты.
7070
7171 **Убрать номера задач из комментариев в коде** и прогнать Prettier — две самые частые придирки бота в наших разборах.
7272
7373 **Не рассчитывать на «пару дней».** CONTRIBUTING обещает их, но тут же оговаривает: свои — вперёд, внешние — «not at any fixed cadence». Из семи PR в наших разборах человек ответил в одном.
7474
7575 **Успеть за пятнадцать дней — или написать что-нибудь.** Пометка `Stale` снимается любым комментарием; через пять дней после неё PR закроют. Автор #16378 так и сделал 31 августа: «This has been sitting since Aug 9 with a green fix, a test, and no maintainer review yet» — и позвал по имени.
7676¶ ## Кто в кадре
7777
7878 Люди, встреченные в наших разборах этого проекта и в его истории. Подробные карточки — в «Определителе».
7979
8080 - **srindom — Sebastian Rindom**, @medusajs. Первые коммиты 18 января 2020 года.
8181 - **shahednasser — Shahed Nasser**, @medusajs. Самый частый автор коммитов; собрал бота-ревьюера и бота-триажёра (апрель 2026) и опустил порог `Stale` до 15 дней, не поправив текст. Блокировка счёта от двойного списания (#16347).
8282 - **NicolasGorga — Nicolas Gorga**, MedusaJS. Открыл заново #14758 и в тот же день поднял порог `Stale` до 60; единственное живое ревью на четыре PR в плагине лояльности: «what real use case…».
8383 - **olivermrbl — Oli Juhl**, @medusajs. Завёл `Stale`-бота в сентябре 2024 (#9184).
8484 - **sricharan505**, в профиле — sricharan. Завёл #14757, сам закрыл через десять минут и завёл #14758 с тем же названием; на три вопроса бота не ответил.
8585 - **blockgroot**, без имени в профиле. Задача #16292 про ключ, который каждый раз новый, и PR #16293 к ней шестнадцать минут спустя.
8686 - **sunYtokki — Sun Kim.** #16390: продолжение #16293 — «keeps this PR's mechanism and both of its tests (with commit co-attribution)» — для случая, когда повтор ключа не сходится.
8787 - **MohamedMBG — BAGHDAD Mohamed.** #16433, третий PR к той же задаче; сам спросил команду, нужен ли он: «could the team confirm whether #16433 should continue as an alternative implementation».
8888 - **giladv**, без имени в профиле. Завёл #16377 про ноль, который списывал всё; отстаивал задачи, написанные с ИИ.
8989 - **msaikens — Mitchell Aikens.** «I strongly dislike AI as a "source of truth"».
9090 - **lazerg — Lazizbek Ergashev.** #16378, первая починка нуля — через 34 минуты после задачи; 31 августа напомнил о себе.
9191 - **ekley — Hossein Ekramian.** #16401, третья починка нуля — та, что получила единственное ревью человека.
9292 - **actualmayank — mayank k.** #16405: `parallelize` там, где документация обещала «сначала удалить, потом создать».
9393 - **Автор #16379** — аккаунт удалён, GitHub показывает `ghost`. Закрыл свой PR сам через 51 минуту.
9494¶ ## Разборы, где встречается
9595
9696 - **«Ноль, который списывал всё»** — `input.amount ? …` принимал ноль за «не передали» и списывал весь остаток; верная проверка лежала тремя строками ниже; четыре PR за три дня, одно ревью человека, ни одного вливания.
9797 - **«Ключ, который каждый раз новый»** — защита от двойной отправки отказывает там, где повтор безобиден, и пропускает там, где он стоит денег; три PR к одной задаче, все с `initial-approval`.
9898
9999 ---
100100
101101 *Карточка собрана 02.09.2026 из открытых источников: репозиторий, документы проекта, переписка в PR и задачах. Фотографий и личных данных здесь нет и не будет. Нашли неточность или хотите, чтобы вас убрали, — напишите, поправим без вопросов.*