Contribuție

Raporturile de erori, ideile, traducerile, documentația și codul sunt toate binevenite. Această pagină explică unde să discuți, cum să trimiți o modificare, convențiile pe care le urmează codul și regulile pentru problemele de securitate și licențe.

Unde să discuți

Totul pornește din depozitul comunității, indiferent de ce parte a Antimatter este vorba:

  • Erori și cereri de funcționalități: deschide o problemă și alege Raport de eroare, Cerere de funcționalitate sau Cerere de plugin sau integrare. Caută mai întâi problemele existente; dacă a ta se află acolo, adaugă un „deget mare în sus” sau detaliile tale.
  • Întrebări și idei: Discuțiile, în categoriile Întrebări și răspunsuri sau Idei.
  • Înainte de o modificare mai mare, deschide o problemă sau o discuție pentru a fi de acord cu abordarea. Astfel eviți o cerere de preluare care nu poate fi integrată în forma în care se află.

Problemele etichetate cu good first issue și help wanted sunt un punct de plecare bun. Menționează într-un comentariu că lucrezi la una dintre ele. Problemele noi primesc eticheta status/triage, apoi status/accepted, status/planned sau status/wontfix. Problemele rămân în depozitul comunității, indiferent de subiect: depozitele de cod nu acceptă probleme. Lucrările planificate se află în Antimatter roadmap.

Depozite și ramuri

Codul se află în organizația AntimatterChat; Unde se află codul listează depozitele. În fiecare depozit:

  • main este ramura implicită și conține codul Antimatter. Creează ramuri din ea și trimite cereri de preluare către ea.
  • Depozitele bifurcate (forked) din Mattermost au și o ramură upstream, o oglindă a codului Mattermost, folosită pentru a prelua modificările acestuia. Nu bazați-vă lucrările pe ea.

README-ul fiecărui depozit explică cum să îl construiți și să îl testați. Pentru server și interfețele web, consultați Construire din sursă; pentru aplicații, Construire, instalare și depanare.

Cereri de preluare

  1. Fork repository-ul și creează o ramură din main.
  2. Limitează fiecare pull request la o singură modificare. Pull request-urile mici sunt verificate mai rapid.
  3. Respectă stilul codului din jurul tău și adaugă sau actualizează testele acolo unde este relevant.
  4. Descrie ce ai modificat și de ce, și adaugă un link către problema pe care o rezolvi: Fixes AntimatterChat/community#123.
  5. Asigură-te că verificările trec. Un menținător va verifica pull request-ul și poate solicita modificări.

În repository-ul serverului, completează șablonul pull request-ului: un Rezumat și blocul Notă de versiune, care trebuie să fie întotdeauna prezent. Scrie NONE în acesta dacă modificarea nu afectează API-ul, configurația, schema bazei de date sau comportamentul vizibil.

Prin contribuție, ești de acord că contribuția ta este licențiată sub licența repository-ului la care contribuie.

Commits și stilul codului

Commits

Mesajele de commit din istoric sunt o frază scurtă care spune ce se modifică, cu prima literă mare și fără punct final. Modificările la o anumită parte sunt prefixate cu numele acesteia, de exemplu Fusion: a compact conversation header on phones sau Server: community attributes, and admin-only user attributes. Un commit per modificare; explică motivele în corpul mesajului dacă nu sunt evidente.

Server (Go)

  • Rulează make check-style în server/ înainte de a face push.
  • Nu rula niciodată go mod tidy direct; rulează make modules-tidy.
  • În căile de cerere, înregistrează în jurnal (log) folosind logger-ul cererii. În stratul de stocare, primește un request.CTX, nu un context.Context.
  • Endpoint-urile API noi se adaugă în server/channels/api4, cu tipurile lor în server/public/model și, ideal, o metodă în model.Client4 și în clientul TypeScript.

Interfețele web (TypeScript și React)

  • Rulează make check-style și make check-types în webapp/.
  • Interfața clasică urmează webapp/STYLE_GUIDE.md: componente funcționale, hooks pentru Redux, variabile de temă pentru culori, markup accesibil.
  • Componentele Fusion se află în webapp/fusion/src/fusion, cu stilurile lor în webapp/fusion/src/fusion/styles. Construiesc nume de clase cu helper-ul am() și folosesc tokenii de design ai Fusion; urmează fișierele din vecinătatea ta.
  • Nu adăuga noi globale window.* pentru aplicații. Utilitățile noi destinate aplicațiilor se adaugă sub window.WebappUtils, așa cum explică webapp/AGENTS.md.
  • O modificare în registrul aplicațiilor (plugins/registry.ts) aparține de obicei copiilor ambelor interfețe.

Traduceri

Antimatter și aplicațiile incluse sunt traduse în 37 de limbi. Contribuitorii adaugă șirurile în engleză; celelalte limbi sunt actualizate în loturi.

Adăugarea unui șir în interfețele web

  1. Scrie-l cu un ID și un text literal în engleză: formatMessage({id: 'fusion.channelMenu.settings', defaultMessage: 'Channel settings'}) sau <FormattedMessage id='…' defaultMessage='…'/>. Textul în engleză afișat în aplicație provine din defaultMessage.
  2. Rulează make i18n-extract în webapp/ (sau npm run i18n-extract în webapp/fusion sau webapp/channels). Actualizează src/i18n/en.json al acelui pachet.
  3. Completează description al noii intrări în en.json: unde apare șirul și cum este folosit. Este contextul de lucru pentru traducători, fie ei umani sau mașini.

npm run i18n-extract:check eșuează dacă en.json nu este actualizat în raport cu codul.

Adăugarea unui șir în server

  1. Folosește un ID în cod, de exemplu model.NewAppError(…, "app.community_attributes.invalid.app_error", …) sau i18n.T("…").
  2. Rulează make i18n-extract în server/. Adaugă ID-ul în server/i18n/en.json în ordinea corectă.
  3. Scrie translation în engleză și description pentru noua intrare.

Alte limbi

Fiecare limbă are propriul fișier lângă en.json (fr.json, pt-BR.json, zh-TW.json…). Pentru a semnala o traducere incorectă, deschide o problemă în depozitul comunității, specificând limba, textul și locul unde apare.

Aplicațiile incluse își păstrează șirurile în webapp/i18n/; vezi Traduceri în pagina aplicațiilor.

Documentație și acest site

Acest site și documentația sa se află în depozitul antimatter.chat. Paginile sunt fragmente HTML în src/pages/; python3 src/build.py construiește site-ul. Corecțiile și explicațiile lipsă sunt binevenite ca probleme sau cereri de preluare (pull requests).

Probleme de securitate

Nu raporta niciodată o problemă de securitate într-o problemă publică, într-o discuție sau într-o cerere de preluare.

Raportează-l în mod privat prin sistemul de raportare a vulnerabilităților private de la GitHub: deschideți fila Securitate a depozitului afectat (de exemplu serverul) și alegeți Report a vulnerability. Dacă nu știți ce depozit este afectat, raportați-l în depozitul comunității. Includeți componenta și versiunea acesteia, ce ar putea face un atacator, cum se poate reproduce problema și de ce configurație depinde.

Mentorii răspund acolo, vă țin la curent în timp ce o repară și publică un comunicat de securitate odată ce este disponibilă o versiune corectată. Vă rugăm să le acordați un timp rezonabil înainte de a divulga problema. Corecțiile intră în cea mai recentă versiune. Politica completă se găsește în politica de securitate.

Licențe

  • Serverul este sub licența GNU Affero General Public License v3.0 (AGPL v3). În același depozit, instrumentele de administrare și fișierele de configurare (server/templates/, server/i18n/, server/public/ și webapp/) sunt sub licența Apache License 2.0. Consultați LICENSE.txt și NOTICE.txt.
  • Aplicațiile: aplicațiile proprii Antimatter, cum ar fi Sondaje, sunt sub AGPL v3; aplicațiile derivate din Mattermost își păstrează licența originală. Fiecare depozit specifică acest lucru în fișierul LICENSE.
  • Aplicațiile desktop și mobile sunt sub licența Apache License 2.0. Depozitul Docker este sub licența Apache License 2.0, cu excepția Dockerfile, care este sub AGPL v3.

AGPL înseamnă că, dacă rulați un server Antimatter modificat pentru alte persoane prin rețea, trebuie să le oferiți codul sursă al modificărilor dumneavoastră. Antimatter se bazează pe Mattermost; nu este afiliată sau susținută de Mattermost, Inc.

Toți participanții respectă codul de conduită.