参与贡献
欢迎提交错误报告、创意、翻译、文档和代码。本页说明在哪里交流、如何提交更改、代码遵循的约定,以及安全问题和许可证的规则。
在哪里交流
无论涉及 Antimatter 的哪个部分,一切都在社区仓库中开始:
- 错误和功能请求:新建问题,选择错误报告、功能请求或插件或集成请求。请先搜索现有问题;如果已有相关问题,请添加点赞或补充你的细节。
- 问题和创意:在讨论区的问答或创意分类中。
- 在进行较大更改之前,请先新建问题或讨论以商定方案。这样可以避免提交无法合并的拉取请求。
带有 good first issue 和 help wanted 标签的问题是很好的入手点。请在评论中说明你正在处理该问题。新问题会先被标记为 status/triage,随后标记为 status/accepted、status/planned 或 status/wontfix。无论问题内容如何,都保留在社区仓库中:代码仓库不接受问题。计划中的工作可在 Antimatter 路线图 上查看。
仓库与分支
代码位于AntimatterChat组织下;代码所在位置列出了各个仓库。在每个仓库中:
main是默认分支,包含 Antimatter 的代码。请从该分支创建分支,并向其发送拉取请求。- 从 Mattermost 分叉的仓库还有一个
upstream分支,它是 Mattermost 代码的镜像,用于引入其更改。请勿基于此分支开展工作。
每个仓库的 README 说明了如何构建和测试。对于服务器和 Web 界面,请参阅从源码构建;对于应用,请参阅构建、安装和调试。
拉取请求
- Fork 该仓库,并从
main创建一个分支。 - 每个 Pull Request 只包含一项更改。较小的 Pull Request 能更快通过审查。
- 遵循周围代码的风格,并在有意义的地方添加或更新测试。
- 描述你更改了什么以及原因,并链接它所修复的问题:
Fixes AntimatterChat/community#123。 - 确保检查通过。维护者会审查 Pull Request,并可能要求修改。
在服务器仓库中,填写 Pull Request 模板:摘要,以及发布说明块,该块必须始终存在。当更改不涉及 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 进行日志记录。在存储层中,使用
request.CTX,而不是context.Context。 - 新的 API 端点位于
server/channels/api4,其类型位于server/public/model,并且理想情况下,在model.Client4和 TypeScript 客户端中都有一个方法。
Web 界面 (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 的设计令牌;请遵循你旁边的文件。 - 不要为应用添加新的
window.*全局变量。新的面向应用的实用程序位于window.WebappUtils下,如webapp/AGENTS.md所述。 - 对应用注册表(
plugins/registry.ts)的修改通常应同时存在于两个界面的副本中。
翻译
Antimatter 及其内置应用已翻译为 37 种语言。贡献者添加英文字符串,其他语言则按批次更新。
向 Web 界面添加字符串
- 使用 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 的私有漏洞报告功能私下报告:打开受影响仓库(例如服务器)的安全选项卡,然后选择报告漏洞。如果不确定哪个仓库受影响,请在社区仓库上报告。请包含组件及其版本、攻击者可能执行的操作、复现步骤以及所依赖的配置。
维护者会在此处回复,并在修复过程中向您提供最新进展,待修复版本发布后发布安全公告。请在公开披露问题前给予他们合理的时间。修复将包含在最新发布的版本中。完整的政策请参阅 安全政策。
许可证
- 服务器 采用 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. 没有关联,也未获得其认可。
所有参与者都须遵守 行为准则。