貢獻
歡迎提交錯誤報告、構想、翻譯、文件與程式碼。本頁說明討論的場所、如何提交變更、程式碼遵循的慣例,以及安全性問題與授權條款的規則。
討論場所
無論涉及 Antimatter 的哪個部分,一切都從社群儲存庫開始:
- 錯誤與功能請求:開啟一個問題,並選擇錯誤報告、功能請求或外掛或整合請求。請先搜尋現有問題;如果您的問題已存在,請加上大拇指或補充您的詳細資訊。
- 問題與構想:討論區,位於問答或構想分類中。
- 進行較大變更之前,請先開啟一個問題或討論,以達成方法上的共識。這可以避免提交無法合併的拉取請求。
標記為 good first issue 和 help wanted 的議題是很好的入門選擇。請在留言中說明您正在處理該議題。新的議題會先標記為 status/triage,然後根據情況標記為 status/accepted、status/planned 或 status/wontfix。無論議題內容為何,都應保留在社群儲存庫中:程式碼儲存庫不接受議題。已規劃的工作可在 Antimatter 路線圖 上查看。
儲存庫與分支
程式碼位於 AntimatterChat 組織中;程式碼所在位置列出了各儲存庫。在每個儲存庫中:
main是預設分支,包含 Antimatter 的程式碼。請從該分支建立分支,並向該分支發送拉取請求。- 從 Mattermost 分叉的儲存庫也有一個
upstream分支,這是 Mattermost 程式碼的鏡像,用於引入其變更。請勿以此作為工作的基礎。
每個儲存庫的 README 說明了如何建置與測試。對於伺服器與網頁介面,請參閱從原始碼建置;對於應用程式,請參閱建置、安裝與除錯。
拉取請求
- 複製(fork)儲存庫,並從
main建立分支。 - 每個拉取請求(pull request)只包含一項變更。較小的拉取請求能更快完成審查。
- 遵循周圍程式碼的風格,並在適當的地方新增或更新測試。
- 描述您變更的內容與原因,並連結所修復的議題:
Fixes AntimatterChat/community#123。 - 確保所有檢查通過。維護者會審查拉取請求,並可能要求修改。
在伺服器儲存庫中,填寫拉取請求模板:摘要,以及Release Note區塊(此區塊必須存在)。若變更未涉及 API、設定、資料庫結構或可見的行為,請在此填入 NONE。
透過貢獻,您同意您的貢獻將採用您所貢獻之儲存庫的授權條款。
提交與程式碼風格
提交
歷史記錄中的提交訊息應為一句簡短的句子,說明變更內容,使用句子大小寫格式,且結尾不加句號。對特定部分的變更應以其名稱作為前綴,例如 Fusion: a compact conversation header on phones 或 Server: community attributes, and admin-only user attributes。每次變更對應一個提交;若原因不明顯,請在訊息主體中加以說明。
伺服器(Go)
- 在
server/目錄中,推送前請執行make check-style。 - 切勿直接執行
go mod tidy;請執行make modules-tidy。 - 在請求路徑中,請使用該請求的記錄器(logger)進行記錄。在儲存層(store layer)中,請使用
request.CTX,而非context.Context。 - 新的 API 端點應放在
server/channels/api4,其型別放在server/public/model,並理想上在model.Client4和 TypeScript 客戶端中新增對應的方法。
網頁介面(TypeScript 和 React)
- 在
webapp/目錄中,執行make check-style和make check-types。 - 經典介面遵循
webapp/STYLE_GUIDE.md:使用函數式元件、用於 Redux 的 hooks、用於顏色的主題變數,以及無障礙標記。 - Fusion 的元件位於
webapp/fusion/src/fusion,其樣式位於webapp/fusion/src/fusion/styles。它們使用am()輔助函數建立類別名稱,並使用 Fusion 的設計令牌(design tokens);請遵循您旁邊檔案的寫法。 - 請勿為應用程式新增新的
window.*全域變數。新的應用程式端工具應放在window.WebappUtils下,詳見webapp/AGENTS.md的說明。 - 對應用程式登錄檔(
plugins/registry.ts)的變更,通常應同時包含在兩個介面的副本中。
翻譯
Antimatter 及其內建應用程式已翻譯成 37 種語言。貢獻者負責新增英文字串;其他語言則以批次方式更新。
在網頁介面中新增字串
- 請使用 ID 和英文原文撰寫:
formatMessage({id: 'fusion.channelMenu.settings', defaultMessage: 'Channel settings'})或<FormattedMessage id='…' defaultMessage='…'/>。應用程式中顯示的英文來自defaultMessage。 - 在
webapp/中執行make i18n-extract(或在webapp/fusion或webapp/channels中執行npm run i18n-extract)。這會更新該套件的src/i18n/en.json。 - 在
en.json中填寫新條目的description:說明該字串出現的位置及其用途。這是翻譯者(人類或機器)工作的依據。
當 en.json 與程式碼不同步時,npm run i18n-extract:check 會失敗。
在伺服器端新增字串
- 在程式碼中使用 ID,例如
model.NewAppError(…, "app.community_attributes.invalid.app_error", …)或i18n.T("…")。 - 在
server/中執行make i18n-extract。這會將 ID 依正確順序新增到server/i18n/en.json。 - 撰寫新條目的英文
translation和description。
其他語言
每種語言都有位於 en.json 旁邊的獨立檔案(fr.json、pt-BR.json、zh-TW.json…)。若要回報錯誤的翻譯,請在社群儲存庫中開啟一個 issue,並附上語言、文字以及出現的位置。
內建應用程式將其字串保留在 webapp/i18n/ 中;請參閱應用程式頁面中的 翻譯。
文件與本網站
本網站及其文件位於 antimatter.chat 儲存庫中。頁面是 src/pages/ 中的 HTML 片段;python3 src/build.py 用於建置網站。歡迎透過 issue 或 pull request 提出更正或補充說明。
安全性問題
請透過 GitHub 的私人漏洞報告功能進行報告:開啟受影響儲存庫的 安全性 分頁(例如 伺服器),並選擇 Report a vulnerability。如果您不確定哪個儲存庫受到影響,請在 社群儲存庫 上進行報告。請包含元件及其版本、攻擊者可能執行的操作、重現步驟,以及任何相關的設定。
維護者會在此回覆,並在修復過程中向您提供最新進度,待修復版本釋出後會發布安全公告。請在公開揭露問題前,給予他們合理的處理時間。修復內容將納入最新版本。完整的政策請參閱 安全性政策。
授權條款
- 伺服器 採用 GNU Affero General Public License v3.0 (AGPL v3) 授權。在同一儲存庫中,管理工具與設定檔(
server/templates/、server/i18n/、server/public/以及webapp/)採用 Apache License 2.0 授權。請參閱LICENSE.txt和NOTICE.txt。 - 應用程式:Antimatter 自家的應用程式(例如投票)採用 AGPL v3 授權;從 Mattermost 分支出來的應用程式則保留其原始授權條款。各儲存庫的
LICENSE檔案中會說明具體授權方式。 - 桌面版與行動版應用程式 採用 Apache License 2.0 授權。Docker 儲存庫 採用 Apache License 2.0 授權,但其
Dockerfile採用 AGPL v3 授權。
AGPL 授權表示,如果您透過網路為他人執行修改過的 Antimatter 伺服器,您必須向他們提供您修改內容的原始碼。Antimatter 基於 Mattermost 開發;它與 Mattermost, Inc. 無隸屬或背書關係。
所有參與者都必須遵守 行為準則。