Contribuir

Se aceptan informes de errores, ideas, traducciones, documentación y código. Esta página explica dónde hablar, cómo enviar un cambio, las convenciones que sigue el código y las reglas para los problemas de seguridad y las licencias.

Dónde hablar

Todo comienza en el repositorio de la comunidad, sin importar qué parte de Antimatter afecte:

  • Errores y solicitudes de funciones: abra un problema y seleccione Informe de error, Solicitud de función o Solicitud de plugin o integración. Busque primero en los problemas existentes; si el suyo ya está, añada un pulgar hacia arriba o sus detalles.
  • Preguntas e ideas: las Discusiones, en las categorías de Preguntas y respuestas o Ideas.
  • Antes de un cambio importante, abra un problema o una discusión para acordar primero el enfoque. Esto evita una solicitud de extracción que no pueda fusionarse tal como está.

Las incidencias etiquetadas como good first issue y help wanted son buenos puntos de partida. Indica en un comentario que estás trabajando en una de ellas. Las nuevas incidencias se etiquetan como status/triage y, después, como status/accepted, status/planned o status/wontfix. Las incidencias permanecen en el repositorio de la comunidad independientemente de su contenido: los repositorios de código no aceptan incidencias. El trabajo planificado se encuentra en la hoja de ruta de Antimatter.

Repositorios y ramas

El código está en la organización AntimatterChat; Dónde está el código enumera los repositorios. En cada repositorio:

  • main es la rama predeterminada y contiene el código de Antimatter. Cree ramas a partir de ella y envíe solicitudes de extracción hacia ella.
  • Los repositorios bifurcados de Mattermost también tienen una rama upstream, un espejo del código de Mattermost utilizado para incorporar sus cambios. No base su trabajo en ella.

El README de cada repositorio explica cómo compilarlo y probarlo. Para el servidor y las interfaces web, consulte Compilar desde el código fuente; para las aplicaciones, Compilar, instalar y depurar.

Solicitudes de extracción

  1. Haz un bifurcación (fork) del repositorio y crea una rama desde main.
  2. Limita cada solicitud de extracción (pull request) a un solo cambio. Las solicitudes pequeñas se revisan más rápido.
  3. Sigue el estilo del código circundante y añade o actualiza pruebas cuando tenga sentido.
  4. Describe qué cambiaste y por qué, y enlaza el problema que resuelve: Fixes AntimatterChat/community#123.
  5. Asegúrate de que las comprobaciones pasen. Un mantenedor revisará la solicitud de extracción y puede solicitar cambios.

En el repositorio del servidor, completa la plantilla de la solicitud de extracción: un Resumen y el bloque Nota de versión, que debe estar siempre presente. Escribe NONE en él cuando el cambio no afecte a la API, la configuración, el esquema de la base de datos o el comportamiento visible.

Al contribuir, aceptas que tu contribución está licenciada bajo la licencia del repositorio al que contribuyes.

Commits y estilo de código

Commits

Los mensajes de commit en el historial son una frase corta que indica qué cambia, en mayúscula inicial y sin punto final. Los cambios a una parte se prefijan con ella, por ejemplo Fusion: a compact conversation header on phones o Server: community attributes, and admin-only user attributes. Un commit por cambio; explica las razones en el cuerpo cuando no sean evidentes.

Servidor (Go)

  • Ejecuta make check-style en server/ antes de enviar.
  • Nunca ejecutes go mod tidy directamente; ejecuta make modules-tidy.
  • En las rutas de solicitud, registra con el registrador de la solicitud. En la capa de almacenamiento, toma un request.CTX, no un context.Context.
  • Los nuevos puntos finales de la API van en server/channels/api4, con sus tipos en server/public/model y, idealmente, un método en model.Client4 y en el cliente de TypeScript.

Interfaces web (TypeScript y React)

  • Ejecuta make check-style y make check-types en webapp/.
  • La interfaz clásica sigue webapp/STYLE_GUIDE.md: componentes funcionales, hooks para Redux, variables de tema para colores y marcado accesible.
  • Los componentes de Fusion están en webapp/fusion/src/fusion, con sus estilos en webapp/fusion/src/fusion/styles. Construyen nombres de clases con el helper am() y usan los tokens de diseño de Fusion; sigue los archivos que están junto a los tuyos.
  • No añadas nuevos globales window.* para aplicaciones. Las nuevas utilidades orientadas a aplicaciones van bajo window.WebappUtils, como explica webapp/AGENTS.md.
  • Un cambio en el registro de la aplicación (plugins/registry.ts) suele pertenecer a las copias de ambas interfaces.

Traducciones

Antimatter y sus aplicaciones integradas se traducen a 37 idiomas. Los colaboradores añaden las cadenas en inglés; los demás idiomas se actualizan por lotes.

Añadir una cadena a las interfaces web

  1. Escríbala con un ID y un texto literal en inglés: formatMessage({id: 'fusion.channelMenu.settings', defaultMessage: 'Channel settings'}) o <FormattedMessage id='…' defaultMessage='…'/>. El inglés que se muestra en la aplicación proviene de defaultMessage.
  2. Ejecute make i18n-extract en webapp/ (o npm run i18n-extract en webapp/fusion o webapp/channels). Actualiza el archivo src/i18n/en.json de ese paquete.
  3. Complete el campo description de la nueva entrada en en.json: dónde aparece la cadena y cómo se utiliza. Es el contexto desde el que trabajan los traductores, ya sean humanos o máquinas.

npm run i18n-extract:check falla cuando en.json no está actualizado con el código.

Añadir una cadena al servidor

  1. Use un ID en el código, por ejemplo model.NewAppError(…, "app.community_attributes.invalid.app_error", …) o i18n.T("…").
  2. Ejecute make i18n-extract en server/. Añade el ID a server/i18n/en.json en el orden correcto.
  3. Escriba la translation en inglés y la description de la nueva entrada.

Otros idiomas

Cada idioma tiene su propio archivo junto a en.json (fr.json, pt-BR.json, zh-TW.json…). Para reportar una traducción incorrecta, abra un problema en el repositorio de la comunidad con el idioma, el texto y dónde aparece.

Las aplicaciones integradas mantienen sus cadenas en webapp/i18n/; consulte Traducciones en la página de aplicaciones.

Documentación y este sitio web

Este sitio web y su documentación están en el repositorio antimatter.chat. Las páginas son fragmentos HTML en src/pages/; python3 src/build.py compila el sitio. Las correcciones y las explicaciones que faltan son bienvenidas como problemas o solicitudes de extracción (pull requests).

Problemas de seguridad

Nunca informe sobre un problema de seguridad en un problema, discusión o solicitud de extracción (pull request) públicos.

Inforíalo de forma privada mediante el informe de vulnerabilidades privado de GitHub: abre la pestaña Seguridad del repositorio afectado (por ejemplo, el servidor) y selecciona Report a vulnerability. Si no sabes qué repositorio está afectado, inforíalo en el repositorio de la comunidad. Incluye el componente y su versión, lo que un atacante podría hacer, cómo reproducirlo y cualquier configuración de la que dependa.

Los mantenedores responden allí, te mantienen informado mientras lo corrigen y publican un aviso de seguridad cuando se publique una versión corregida. Por favor, dales un tiempo razonable antes de divulgar el problema. Las correcciones se incluyen en la última versión. La política completa está en la política de seguridad.

Licencias

  • El servidor está bajo la GNU Affero General Public License v3.0 (AGPL v3). En el mismo repositorio, las herramientas de administración y los archivos de configuración (server/templates/, server/i18n/, server/public/ y webapp/) están bajo la Apache License 2.0. Consulta LICENSE.txt y NOTICE.txt.
  • Aplicaciones: las aplicaciones propias de Antimatter, como Encuestas, están bajo la AGPL v3; las aplicaciones derivadas de Mattermost conservan su licencia original. Cada repositorio indica cuál en su archivo LICENSE.
  • Las aplicaciones de escritorio y móviles están bajo la Apache License 2.0. El repositorio de Docker está bajo la Apache License 2.0, excepto su Dockerfile, que está bajo la AGPL v3.

La AGPL significa que, si ejecutas un servidor de Antimatter modificado para otras personas a través de una red, debes ofrecerles el código fuente de tus cambios. Antimatter se basa en Mattermost; no está afiliado ni respaldado por Mattermost, Inc.

Todas las personas que participan siguen el código de conducta.