mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
132 lines
9.5 KiB
Markdown
132 lines
9.5 KiB
Markdown
---
|
||||
|
|
description: "Как участвовать в развитии SnapOtter. Отчёты об ошибках, запросы функций, pull request'ы и требования CLA."
|
|||
|
|
i18n_source_hash: 528802503035
|
|||
|
|
i18n_provenance: human
|
|||
|
|
i18n_output_hash: fc5a31dca269
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Участие {#contributing}
|
|||
|
|
|
|||
|
|
Спасибо за интерес к участию в проекте. Это руководство описывает, как участвовать, что мы принимаем и с чего начать.
|
|||
|
|
|
|||
|
|
## Способы участия {#ways-to-contribute}
|
|||
|
|
|
|||
|
|
### Issues (без настройки) {#issues-no-setup-required}
|
|||
|
|
|
|||
|
|
- **Отчёты об ошибках** - Что-то сломалось? Откройте [отчёт об ошибке](https://github.com/snapotter-hq/snapotter/issues/new?template=bug_report.yml) с шагами воспроизведения.
|
|||
|
|
- **Запросы функций** - Есть идея? Начните [обсуждение](https://github.com/snapotter-hq/snapotter/discussions/new?category=ideas), чтобы сообщество могло высказаться и проголосовать за неё.
|
|||
|
|
- **Проблемы с переводом** - Заметили неверный или отсутствующий перевод? Откройте [issue о переводе](https://github.com/snapotter-hq/snapotter/issues/new?template=translation.yml).
|
|||
|
|
- **Проблемы с документацией** - Что-то не так в документации? Откройте [issue о документации](https://github.com/snapotter-hq/snapotter/issues/new?template=documentation.yml).
|
|||
|
|
|
|||
|
|
### Код (требует CLA) {#code-requires-cla}
|
|||
|
|
|
|||
|
|
Мы принимаем pull request'ы для:
|
|||
|
|
|
|||
|
|
| Тип | Процесс |
|
|||
|
|
|------|---------|
|
|||
|
|
| Исправления ошибок | Откройте PR напрямую (сошлитесь на issue, если он есть) |
|
|||
|
|
| Новые переводы | Откройте PR напрямую (см. [руководство по переводу](/ru/guide/translations)) |
|
|||
|
|
| Улучшения документации | Откройте PR напрямую |
|
|||
|
|
| Улучшения покрытия тестами | Откройте PR напрямую |
|
|||
|
|
| Новые инструменты или функции | Сначала начните [обсуждение](https://github.com/snapotter-hq/snapotter/discussions/new?category=ideas); мейнтейнер превращает одобренные идеи в отслеживаемый issue до того, как вы начнёте писать код |
|
|||
|
|
| Рефакторинг или изменения архитектуры | Сначала начните [обсуждение](https://github.com/snapotter-hq/snapotter/discussions/new?category=ideas) и дождитесь одобрения мейнтейнера перед написанием кода |
|
|||
|
|
|
|||
|
|
### Что мы не принимаем {#what-we-will-not-accept}
|
|||
|
|
|
|||
|
|
- Изменения в CI/CD-пайплайнах, конфигурации релизов или конфигурации линтера/компилятора
|
|||
|
|
- PR'ы без подписанного [Contributor License Agreement](#contributor-license-agreement)
|
|||
|
|
- PR'ы с изменениями более чем на 400 строк (разбивайте большую работу на меньшие PR'ы)
|
|||
|
|
- Функции, которые не были предварительно обсуждены и одобрены
|
|||
|
|
- Изменения в `packages/ai/` без предварительного обсуждения
|
|||
|
|
|
|||
|
|
## Contributor License Agreement {#contributor-license-agreement}
|
|||
|
|
|
|||
|
|
Прежде чем мы сможем принять ваш первый PR, вы должны подписать наше [индивидуальное CLA](https://github.com/snapotter-hq/snapotter/blob/main/CLA.md). Это одноразовое требование.
|
|||
|
|
|
|||
|
|
**Почему:** SnapOtter распространяется под двойной лицензией (AGPLv3 + коммерческая). CLA предоставляет нам право распространять ваш вклад под обеими лицензиями. Вы сохраняете полное авторское право на свою работу.
|
|||
|
|
|
|||
|
|
**Как:** Когда вы откроете свой первый PR, бот CLA Assistant оставит комментарий со ссылкой. Нажмите на неё, ознакомьтесь с соглашением и подпишите его своей учётной записью GitHub. Это займёт 30 секунд.
|
|||
|
|
|
|||
|
|
Если вы вносите вклад от имени работодателя и он сохраняет права на интеллектуальную собственность в отношении вашей работы, свяжитесь с contact@snapotter.com, чтобы оформить корпоративное CLA перед отправкой.
|
|||
|
|
|
|||
|
|
## Начало работы {#getting-started}
|
|||
|
|
|
|||
|
|
### Предварительные требования {#prerequisites}
|
|||
|
|
|
|||
|
|
- Node.js 22+
|
|||
|
|
- pnpm 9+
|
|||
|
|
- Python 3.11+ (только для AI-инструментов)
|
|||
|
|
- Docker (опционально, для полного интеграционного тестирования)
|
|||
|
|
|
|||
|
|
### Настройка {#setup}
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Fork and clone
|
|||
|
|
git clone https://github.com/<your-username>/snapotter.git
|
|||
|
|
cd snapotter
|
|||
|
|
|
|||
|
|
# Start Postgres + Redis for local dev
|
|||
|
|
docker compose -f docker-compose.dev.yml up -d
|
|||
|
|
|
|||
|
|
# Install dependencies
|
|||
|
|
pnpm install
|
|||
|
|
|
|||
|
|
# Start dev servers (web on :1349, API on :13490)
|
|||
|
|
pnpm dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Запуск проверок {#running-checks}
|
|||
|
|
|
|||
|
|
Перед отправкой PR убедитесь, что все проверки проходят локально:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
pnpm lint # Biome lint + format check
|
|||
|
|
pnpm typecheck # TypeScript across monorepo
|
|||
|
|
pnpm test # Vitest unit + integration tests
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Процесс pull request {#pull-request-process}
|
|||
|
|
|
|||
|
|
1. Сделайте форк репозитория и создайте ветку от `main` (`feat/my-feature` или `fix/issue-123`)
|
|||
|
|
2. Вносите изменения сфокусированными, пригодными для ревью коммитами, используя [conventional commits](https://www.conventionalcommits.org/)
|
|||
|
|
3. Добавьте или обновите тесты для своих изменений
|
|||
|
|
4. Запустите `pnpm lint && pnpm typecheck && pnpm test` локально
|
|||
|
|
5. Откройте PR против `main` и заполните шаблон
|
|||
|
|
6. Подпишите CLA, если будет предложено
|
|||
|
|
7. Дождитесь прохождения CI и ревью от мейнтейнера
|
|||
|
|
|
|||
|
|
### Ожидания по ревью {#review-expectations}
|
|||
|
|
|
|||
|
|
- Мы стремимся отвечать на PR'ы в течение 7 дней
|
|||
|
|
- Небольшие, сфокусированные PR'ы проходят ревью быстрее
|
|||
|
|
- Если вы не получили ответа в течение 7 дней, оставьте комментарий с упоминанием в треде
|
|||
|
|
- Мы можем запросить изменения, предложить другой подход или закрыть PR, если он не соответствует направлению проекта
|
|||
|
|
|
|||
|
|
### После того как ваш PR будет принят {#after-your-pr-is-merged}
|
|||
|
|
|
|||
|
|
Ваш вклад войдёт в следующий релиз и будет упомянут в списке изменений.
|
|||
|
|
|
|||
|
|
## Хорошие первые задачи {#good-first-issues}
|
|||
|
|
|
|||
|
|
Ищете, над чем поработать? Загляните в наши [хорошие первые задачи](https://github.com/snapotter-hq/snapotter/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22), подходящие для новичков, или в [help wanted](https://github.com/snapotter-hq/snapotter/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) для более крупных задач, где мы будем рады помощи сообщества.
|
|||
|
|
|
|||
|
|
## Стиль кода {#code-style}
|
|||
|
|
|
|||
|
|
- Biome отвечает за форматирование и линтинг (двойные кавычки, точки с запятой, отступ в 2 пробела)
|
|||
|
|
- Pre-commit-хук автоматически запускает `biome check --write` на staged-файлах
|
|||
|
|
- Если линтер ругается, исправляйте код (не изменяйте конфигурацию Biome)
|
|||
|
|
- ES-модули везде (`import`/`export`)
|
|||
|
|
- Conventional commits: `feat:`, `fix:`, `refactor:`, `docs:`, `test:`, `chore:`
|
|||
|
|
|
|||
|
|
Полные детали архитектуры смотрите в [руководстве разработчика](/ru/guide/developer).
|
|||
|
|
|
|||
|
|
## Безопасность {#security}
|
|||
|
|
|
|||
|
|
**Не открывайте публичный PR или issue для уязвимостей безопасности.** Сообщайте о них приватно через [GitHub Security Advisories](https://github.com/snapotter-hq/snapotter/security/advisories/new) или по email contact@snapotter.com. Полные детали смотрите в [SECURITY.md](https://github.com/snapotter-hq/snapotter/blob/main/SECURITY.md).
|
|||
|
|
|
|||
|
|
## Вопросы? {#questions}
|
|||
|
|
|
|||
|
|
- [Документация](https://docs.snapotter.com/)
|
|||
|
|
- [Discord](https://discord.gg/hr3s7HPUsr)
|
|||
|
|
- [GitHub Discussions](https://github.com/snapotter-hq/snapotter/discussions)
|