Стандарты кода
Triggery — это TypeScript-first монорепо со строгими настройками и небольшим набором мнений. Следуй им — и ревью PR будет фокусироваться на логике, а не на форматировании.
TypeScript
Заголовок раздела «TypeScript»strict: trueвключён в корневомtsconfig.jsonи наследуется везде. Никакогоany. Используйunknown+ сужение, когда типы намеренно открыты.- Никаких non-null assertion (
!) без комментария, объясняющего, почему значение в этой точке заведомо не null. - Никаких type assertion (
as Foo), кроме случаев интеропа со сторонним API, где типы кривые; предпочитай type guard. - Поле
exportsвpackage.json— единственная истина в последней инстанции для входных точек. Используй его, не полагайся на эвристикиmain/module.
Именование
Заголовок раздела «Именование»- Файлы: kebab-case —
create-trigger.ts,inspector-buffer.ts. Тесты лежат рядом с исходником как*.test.ts. - Экспорты: camelCase для значений (
createTrigger,getDefaultRuntime), PascalCase для типов и компонентов React/Solid/Vue (TriggerSchema,TriggerRuntimeProvider). - Идентификаторы триггеров: существительные в kebab-case, описывающие сценарий (
message-received, а неon-new-message). - События: глаголы в kebab-case, с colon-namespace если кросс-фичные (
chat:message-received). - Условия / действия: существительные в camelCase (
activeChannelId,showToast).
Формат модулей
Заголовок раздела «Формат модулей»- Только ESM, никакого CommonJS.
"type": "module"везде. - Чистые модули — никаких побочных эффектов на этапе импорта. Рантайм лениво создаётся при первом использовании.
- Side-effect-free — в каждом
package.jsonстоит"sideEffects": false(кроме случаев, когда бандлам нужно иначе; такое бывает редко).
Зависимости
Заголовок раздела «Зависимости»- У
@triggery/coreноль рантайм-зависимостей. Это жёсткое ограничение. - Пакеты-адаптеры берут целевую библиотеку как
peerDependency(Zustand, Redux, Jotai, …). Они не бандлят библиотеку-хост. - Биндинги для фреймворков (
@triggery/reactи т.п.) берут фреймворк как peer. - Добавление новой зависимости в любой пакет требует явного обоснования в описании PR.
Форматирование и линт
Заголовок раздела «Форматирование и линт»- Biome — единственный источник истины для форматирования и базового линта. Запускай
pnpm format(запись) илиpnpm lint(проверка). - CI запускает
pnpm lintна каждом PR и отклоняет диффы, не совпадающие с выводом Biome. Натрави «format on save» в редакторе на Biome. - Никаких комментариев, повторяющих код. Комментируй только почему — скрытый инвариант, осознанный компромисс, известный браузерный косяк. Подстраивайся под стиль вокруг.
Соглашения по публичному API
Заголовок раздела «Соглашения по публичному API»Поверхность публичного API у @triggery/core короткая — createTrigger, createRuntime, getDefaultRuntime, setDefaultRuntime, createCheck, createInspector, createScheduler и горстка типов. Всё новое в core — изменение публичного API и идёт через RFC-процесс.
Для биндингов фреймворков: держи паритет. Если хук появляется в @triggery/react, он должен появиться в @triggery/solid и @triggery/vue с той же сигнатурой. Гарантия «API работает в трёх фреймворках» — и маркетинговое обещание, и бюджет на сопровождение. Уважай оба.
Атрибуция
Заголовок раздела «Атрибуция»Не добавляй AI-атрибуцию (Co-Authored-By: Claude … и т.п.) в коммиты или PR. Атрибутируй работу людям.