Перейти к содержимому
GitHubXDiscord

Стандарты кода

Triggery — это TypeScript-first монорепо со строгими настройками и небольшим набором мнений. Следуй им — и ревью PR будет фокусироваться на логике, а не на форматировании.

  • 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 у @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. Атрибутируй работу людям.