Współpraca
Zgłoszenia błędów, pomysły, tłumaczenia, dokumentacja i kod są zawsze mile widziane. Ta strona wyjaśnia, gdzie rozmawiać, jak wysłać zmianę, jakie konwencje stosuje kod oraz jakie zasady obowiązują w przypadku problemów bezpieczeństwa i licencji.
Gdzie rozmawiać
Wszystko zaczyna się w repozytorium społeczności, niezależnie od tego, która część Antimatter jest przedmiotem rozmowy:
- Błędy i prośby o nowe funkcje: utwórz zgłoszenie i wybierz Bug report, Feature request lub Plugin or integration request. Najpierw wyszukaj istniejące zgłoszenia; jeśli Twoje już istnieje, dodaj do niego kciuk w górę lub swoje uwagi.
- Pytania i pomysły: Dyskusje, w kategoriach Q&A lub Ideas.
- Przed większą zmianą utwórz zgłoszenie lub dyskusję, aby najpierw ustalić podejście. Pozwoli to uniknąć wysłania pull requesta, który nie może zostać scalony w obecnej formie.
Dobrym punktem wyjścia są problemy oznaczone etykietami good first issue i help wanted. W komentarzu poinformuj, że pracujesz nad danym problemem. Nowe problemy otrzymują etykietę status/triage, a następnie status/accepted, status/planned lub status/wontfix. Problemy pozostają w repozytorium społeczności niezależnie od ich tematu: repozytoria kodu nie przyjmują zgłoszeń. Zaplanowane prace znajdują się w drodze rozwoju Antimatter.
Repozytoria i gałęzie
Kod znajduje się w organizacji AntimatterChat; lista repozytoriów znajduje się w sekcji Gdzie znajduje się kod. W każdym repozytorium:
mainto gałąź domyślna, zawierająca kod Antimatter. Twórz od niej gałęzie i wysyłaj do niej pull requesty.- Repozytoria wywiedzione z Mattermost mają również gałąź
upstream, która jest lustrem kodu Mattermosta, używanym do włączania jego zmian. Nie opieraj na niej swojej pracy.
Plik README każdego repozytorium wyjaśnia, jak je budować i testować. W przypadku serwera i interfejsów webowych zobacz Budowanie ze źródła; w przypadku aplikacji, Budowanie, instalacja i debugowanie.
Pull requesty
- Stwórz fork repozytorium i gałąź od
main. - Ogranicz każdą prośbę o połączenie (pull request) do jednej zmiany. Małe prośby o połączenie są recenzowane szybciej.
- Stosuj się do stylu kodu w otoczeniu i dodawaj lub aktualizuj testy, gdy ma to sens.
- Opisz, co zmieniłeś i dlaczego, oraz podaj link do problemu, który rozwiązujesz:
Fixes AntimatterChat/community#123. - Upewnij się, że kontrole przechodzą. Utrzymujący (maintainer) recenzuje prośbę o połączenie i może poprosić o zmiany.
W repozytorium serwera wypełnij szablon prośby o połączenie: Podsumowanie oraz blok Uwaga do wydania, który musi zawsze być obecny. Wpisz w nim NONE, gdy zmiana nie dotyczy API, konfiguracji, schematu bazy danych ani widocznego zachowania.
Przyczyniając się do projektu, wyrażasz zgodę na to, że Twój wkład jest licencjonowany na podstawie licencji repozytorium, do którego przyczyniasz się.
Zobowiązania i styl kodu
Zobowiązania
Komunikaty zobowiązań w historii to jedno krótkie zdanie mówiące, co się zmienia, pisane z małej litery i bez kropki na końcu. Zmiany dotyczące jednej części są poprzedzone jej nazwą, na przykład Fusion: a compact conversation header on phones lub Server: community attributes, and admin-only user attributes. Jedno zobowiązanie na zmianę; wyjaśnij powody w treści, gdy nie są oczywiste.
Serwer (Go)
- Uruchom
make check-stylewserver/przed wysłaniem. - Nigdy nie uruchamiaj bezpośrednio
go mod tidy; uruchommake modules-tidy. - W ścieżkach żądań loguj za pomocą loggera żądania. W warstwie magazynu (store) przyjmuj
request.CTX, a niecontext.Context. - Nowe punkty końcowe API umieszczaj w
server/channels/api4, z ich typami wserver/public/modeloraz, idealnie, metodą wmodel.Client4i w kliencie TypeScript.
Interfejsy webowe (TypeScript i React)
- Uruchom
make check-styleimake check-typeswwebapp/. - Klasyczny interfejs stosuje się do
webapp/STYLE_GUIDE.md: komponenty funkcjonalne, hooki dla Reduxa, zmienne motywu dla kolorów, dostępny znacznik (markup). - Komponenty Fusion znajdują się w
webapp/fusion/src/fusion, a ich style wwebapp/fusion/src/fusion/styles. Budują nazwy klas za pomocą pomocnikaam()i używają tokenów projektowych Fusion; stosuj się do plików znajdujących się obok Twoich. - Nie dodawaj nowych globalnych zmiennych
window.*dla aplikacji. Nowe narzędzia skierowane do aplikacji umieszczaj podwindow.WebappUtils, jak wyjaśniawebapp/AGENTS.md. - Zmiana w rejestrze aplikacji (
plugins/registry.ts) zwykle należy do kopii obu interfejsów.
Tłumaczenia
Antimatter i jego wbudowane aplikacje są tłumaczone na 37 języków. Współtwórcy dodają angielskie łańcuchy znaków, a pozostałe języki są aktualizowane partiami.
Dodawanie łańcucha znaków do interfejsów webowych
- Napisz go z identyfikatorem i dosłownym tekstem angielskim:
formatMessage({id: 'fusion.channelMenu.settings', defaultMessage: 'Channel settings'})lub<FormattedMessage id='…' defaultMessage='…'/>. Angielski tekst wyświetlany w aplikacji pochodzi zdefaultMessage. - Uruchom
make i18n-extractwwebapp/(lubnpm run i18n-extractwwebapp/fusionlubwebapp/channels). Aktualizuje tosrc/i18n/en.jsondanego pakietu. - Wypełnij
descriptionnowego wpisu wen.json: gdzie łańcuch znaków się pojawia i jak jest używany. Stanowi on kontekst, z którego korzystają tłumacze, zarówno ludzcy, jak i maszynowi.
npm run i18n-extract:check kończy się błędem, gdy en.json jest nieaktualny w stosunku do kodu.
Dodawanie łańcucha znaków do serwera
- Użyj identyfikatora w kodzie, na przykład
model.NewAppError(…, "app.community_attributes.invalid.app_error", …)lubi18n.T("…"). - Uruchom
make i18n-extractwserver/. Dodaje to identyfikator doserver/i18n/en.jsonw odpowiedniej kolejności. - Napisz angielskie
translationorazdescriptionnowego wpisu.
Inne języki
Każdy język ma własny plik obok en.json (fr.json, pt-BR.json, zh-TW.json…). Aby zgłosić błędny tłumaczenie, otwórz problem (issue) w repozytorium społecznościowym, podając język, tekst i miejsce, w którym się pojawia.
Wbudowane aplikacje przechowują swoje łańcuchy znaków w webapp/i18n/; zobacz Tłumaczenia na stronie aplikacji.
Dokumentacja i ta witryna
Ta witryna i jej dokumentacja znajdują się w repozytorium antimatter.chat. Strony to fragmenty HTML w src/pages/; python3 src/build.py buduje witrynę. Poprawki i brakujące wyjaśnienia są mile widziane jako problemy (issues) lub żądania połączenia (pull requests).
Problemy bezpieczeństwa
Zgłoś to prywatnie za pomocą mechanizmu zgłaszania podatności GitHuba: otwórz zakładkę Bezpieczeństwo w odpowiednim repozytorium (na przykład serwera) i wybierz Zgłoś podatność. Jeśli nie wiesz, które repozytorium jest dotknięte podatnością, zgłoś ją w repozytorium społeczności. Podaj komponent i jego wersję, to, co może zrobić napastnik, sposób odtworzenia problemu oraz wszelkie zależności od konfiguracji.
Utrzymujący odpowiedzą tam, będą informować Cię o postępach podczas naprawy i opublikują komunikat o podatności, gdy tylko wyjdzie poprawiona wersja. Prosimy o udzielenie im rozsądnego czasu przed publicznym ujawnieniem problemu. Poprawki trafiają do najnowszej wersji. Pełna polityka bezpieczeństwa znajduje się w polityce bezpieczeństwa.
Licencje
- Serwer jest objęty licencją GNU Affero General Public License v3.0 (AGPL v3). W tym samym repozytorium narzędzia administracyjne i pliki konfiguracyjne (
server/templates/,server/i18n/,server/public/orazwebapp/) są objęte licencją Apache License 2.0. ZobaczLICENSE.txtiNOTICE.txt. - Aplikacje: własne aplikacje Antimatter, takie jak Ankiety, są objęte licencją AGPL v3; aplikacje rozwinięte z Mattermost zachowują swoją oryginalną licencję. Każde repozytorium wskazuje to w swoim pliku
LICENSE. - Aplikacje na komputery stacjonarne i urządzenia mobilne są objęte licencją Apache License 2.0. Repozytorium Docker jest objęte licencją Apache License 2.0, z wyjątkiem pliku
Dockerfile, który jest objęty licencją AGPL v3.
Licencja AGPL oznacza, że jeśli uruchamiasz zmodyfikowany serwer Antimatter dla innych osób przez sieć, musisz udostępnić im kod źródłowy swoich zmian. Antimatter jest oparty na Mattermost; nie jest powiązany ani wspierany przez Mattermost, Inc.
Wszyscy uczestnicy przestrzegają kodeksu postępowania.