参与贡献

欢迎提交错误报告、创意、翻译、文档和代码。本页说明在哪里交流、如何提交更改、代码遵循的约定,以及安全问题和许可证的规则。

在哪里交流

无论涉及 Antimatter 的哪个部分,一切都在社区仓库中开始:

  • 错误和功能请求:新建问题,选择错误报告、功能请求或插件或集成请求。请先搜索现有问题;如果已有相关问题,请添加点赞或补充你的细节。
  • 问题和创意:在讨论区的问答或创意分类中。
  • 在进行较大更改之前,请先新建问题或讨论以商定方案。这样可以避免提交无法合并的拉取请求。

带有 good first issue 和 help wanted 标签的问题是很好的入手点。请在评论中说明你正在处理该问题。新问题会先被标记为 status/triage,随后标记为 status/accepted、status/planned 或 status/wontfix。无论问题内容如何,都保留在社区仓库中:代码仓库不接受问题。计划中的工作可在 Antimatter 路线图 上查看。

仓库与分支

代码位于AntimatterChat组织下;代码所在位置列出了各个仓库。在每个仓库中:

  • main是默认分支,包含 Antimatter 的代码。请从该分支创建分支,并向其发送拉取请求。
  • 从 Mattermost 分叉的仓库还有一个upstream分支,它是 Mattermost 代码的镜像,用于引入其更改。请勿基于此分支开展工作。

每个仓库的 README 说明了如何构建和测试。对于服务器和 Web 界面,请参阅从源码构建;对于应用,请参阅构建、安装和调试。

拉取请求

  1. Fork 该仓库,并从 main 创建一个分支。
  2. 每个 Pull Request 只包含一项更改。较小的 Pull Request 能更快通过审查。
  3. 遵循周围代码的风格,并在有意义的地方添加或更新测试。
  4. 描述你更改了什么以及原因,并链接它所修复的问题:Fixes AntimatterChat/community#123。
  5. 确保检查通过。维护者会审查 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 界面添加字符串

  1. 使用 ID 和英文原文进行编写:formatMessage({id: 'fusion.channelMenu.settings', defaultMessage: 'Channel settings'}) 或 <FormattedMessage id='…' defaultMessage='…'/>。应用中显示的英文来自 defaultMessage。
  2. 在 webapp/ 中运行 make i18n-extract(或在 webapp/fusion 或 webapp/channels 中运行 npm run i18n-extract)。这将更新该包的 src/i18n/en.json。
  3. 在 en.json 中填写新条目的 description:说明该字符串出现的位置及其用途。这是翻译者(无论是人工还是机器)工作的上下文依据。

如果 en.json 与代码不同步,npm run i18n-extract:check 将会失败。

向服务器添加字符串

  1. 在代码中使用 ID,例如 model.NewAppError(…, "app.community_attributes.invalid.app_error", …) 或 i18n.T("…")。
  2. 在 server/ 中运行 make i18n-extract。它会将 ID 按正确顺序添加到 server/i18n/en.json 中。
  3. 编写新条目的英文 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 提交更正和补充说明。

安全问题

切勿在公开的 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. 没有关联,也未获得其认可。

所有参与者都须遵守 行为准则。