diff --git a/README.md b/README.md index 1eaf924..fb50f48 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,11 @@ This project is independent from the original Reticulum MeshChat project and is - Website: [meshchatx.com](https://meshchatx.com) - Source: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX) - Official GitHub Mirror: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) -- Releases: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases) +- Releases: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) - Changelog: [`CHANGELOG.md`](CHANGELOG.md) -- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects) + +rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX` +NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu` ## Important Changes from Reticulum MeshChat diff --git a/lang/README.de.md b/lang/README.de.md index a5cc954..0a609b9 100644 --- a/lang/README.de.md +++ b/lang/README.de.md @@ -8,14 +8,16 @@ Dieses Projekt ist unabhaengig vom originalen Reticulum MeshChat und steht in ke - Website: [meshchatx.com](https://meshchatx.com) - Quellcode: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX) -- Offizieller Spiegel: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) – derzeit auch fuer Windows- und macOS-Builds genutzt. -- Releases: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases) +- Offizielles GitHub-Mirror: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) +- Releases: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) - Aenderungsprotokoll: [`CHANGELOG.md`](../CHANGELOG.md) -- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects) + +rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX` +NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu` ## Wichtige Aenderungen gegenueber Reticulum MeshChat -- Verwendet LXST +- Verwendet LXST fuer Anrufe - Peewee-ORM durch direktes SQL ersetzt - Axios durch natives `fetch` ersetzt - Electron 41.x (mit Node-24-Laufzeit) @@ -27,7 +29,7 @@ Dieses Projekt ist unabhaengig vom originalen Reticulum MeshChat und steht in ke > MeshChatX garantiert keine Datenkompatibilitaet mit aelteren Reticulum-MeshChat-Versionen. Erstellen Sie vor Migration oder Tests eine Datensicherung. > [!WARNING] -> Aeltere Systeme werden noch nicht vollstaendig unterstuetzt. Aktuelle Mindestanforderungen: Python `>=3.11` und Node `>=24` (Electron 41 entspricht Node 24; `engines` in `package.json` und CI folgen derselben Vorgabe). +> Aeltere Systeme werden noch nicht unterstuetzt. Aktuelle Basis: Python `>=3.11` und Node `>=24` (Electron 41 entspricht Node 24; `engines` in `package.json` und CI folgen derselben Linie). ## Voraussetzungen @@ -53,15 +55,15 @@ Waehlen Sie die Methode passend zu Umgebung und Paketierung. | Python Wheel (`.whl`) | Ja | Jede Python-unterstuetzte Architektur | Headless/Webserver ohne Node-Build | | Linux AppImage | Ja | `x64`, `arm64` | Portabler Desktop-Einsatz | | Debian-Paket (`.deb`) | Ja | `x64`, `arm64` | Debian/Ubuntu-Installation | -| RPM-Paket (`.rpm`) | Ja | CI-abhaengig | Fedora/RHEL/openSUSE | +| RPM-Paket (`.rpm`) | Ja | Vom CI-Runner abhaengig (Veroeffentlichung) | Fedora/RHEL/openSUSE | | Aus Quellcode | Lokal gebaut | Host-Architektur | Entwicklung und individuelle Builds | Hinweise: -- Der Release-Workflow baut explizit Linux `x64` und `arm64` AppImage + DEB. -- RPM wird ebenfalls versucht und bei Erfolg hochgeladen. +- GitHub Actions baut getaggte Releases: Windows und macOS in `.github/workflows/build-release.yml`, Linux Wheel/AppImage/deb/rpm in `.github/workflows/build-linux-release.yml` und das Container-Image in `.github/workflows/docker.yml`. +- Linux `x64` und `arm64` AppImage + DEB werden auf GitHub gebaut; RPM wird versucht und hochgeladen, wenn es erzeugt wird. -## Schnellstart: Docker +## Docker - **Docker Hub:** `quad4io/meshchatx` - **GHCR:** `ghcr.io/quad4-software/meshchatx` @@ -70,8 +72,6 @@ Hinweise: docker compose up -d ``` -Entsprechend ohne Compose (gleiche Port-Bindung und Config-Volume): - ```bash docker run -d --name reticulum-meshchatx \ --restart unless-stopped \ @@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \ ghcr.io/quad4-software/meshchatx:latest ``` -Alternativ kann das Image `quad4io/meshchatx:latest` (Docker Hub) verwendet werden. +Sie koennen `quad4io/meshchatx:latest` statt des GHCR-Images verwenden, wenn Sie Docker Hub bevorzugen. Standard-Compose-Datei: @@ -160,7 +160,7 @@ Hinweise zu den Installationsbefehlen: - `pnpm install --frozen-lockfile` verweigert Aenderungen an `pnpm-lock.yaml` und schlaegt fehl, wenn die Lockdatei nicht zu `package.json` passt. Damit wird verhindert, dass eine unerwartete Upstream-Version still eingespielt wird. - `verify-store-integrity=true` ist auch in der projektweiten `.npmrc` gesetzt; die explizite `pnpm config set`-Zeile haertet zusaetzlich die Benutzerkonfiguration. -- Lifecycle-Skripte (`preinstall`/`postinstall`) sind in pnpm v10+ standardmaessig blockiert. Nur die unter `pnpm.onlyBuiltDependencies` in `package.json` aufgefuehrten Pakete duerfen Installationsskripte ausfuehren (aktuell `electron`, `electron-winstaller`, `esbuild`, `protobufjs`). +- Lifecycle-Skripte (`preinstall`/`postinstall`) sind in pnpm v10+ standardmaessig blockiert. Nur die unter `pnpm.onlyBuiltDependencies` in `package.json` aufgefuehrten Pakete duerfen Installationsskripte ausfuehren (aktuell `electron`, `electron-winstaller`, `esbuild`). - `poetry check --lock` schlaegt frueh fehl, wenn `poetry.lock` nicht mit `pyproject.toml` synchron ist; `poetry install` aufloest danach nur aus der Lockdatei. - Fuer eine strikte Lockfile-Installation (ohne implizite Lock-Aktualisierung) Poetry mit `pip install "poetry==2.3.4"` pinnen, passend zur CI-Version. @@ -172,7 +172,7 @@ Um das native `meshchatx`-Programm (Alias: `meshchat`) mit zusaetzlicher Dateisy - [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md) -Dieselbe Seite erscheint in der in-app-**Dokumentation** (MeshChatX-Docs), wenn sie aus den gebuendelten oder synchronisierten `meshchatx-docs`-Dateien ausgeliefert wird. +Dieselbe Seite erscheint in der in-app-Liste **Dokumentation** (MeshChatX-Dokumentation), wenn sie aus den gebuendelten oder synchronisierten `meshchatx-docs`-Dateien ausgeliefert wird. ## Linux-Desktop: Emoji-Schriften @@ -214,6 +214,32 @@ Oder ueber Task: task dist:fe:rpm ``` +## Container-Build (Wheel, AppImage, deb, rpm) + +`Dockerfile.build` fuehrt die gleichen Schritte wie die CI aus (Poetry, pnpm, `task`, APT-Paketabhaengigkeiten). Ausgelegt auf **linux/amd64** (NodeSource amd64, Task amd64). Standardziel ist alles; per Build-Arg ueberschreibbar. + +Werte fuer `MESHCHATX_BUILD_TARGETS`: `all` (Standard), `wheel` oder `electron` (AppImage + deb fuer x64 und arm64, RPM best-effort, kein wheel). + +Build: + +```bash +docker build -f Dockerfile.build -t meshchatx-build:local . +``` + +Nur Wheel: + +```bash +docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel . +``` + +`/artifacts` aus dem fertigen Image auf den Host kopieren: + +```bash +cid=$(docker create meshchatx-build:local) +docker cp "${cid}:/artifacts" ./meshchatx-artifacts +docker rm "${cid}" +``` + ## Architekturunterstuetzung - Docker-Image: `amd64`, `arm64` @@ -221,7 +247,7 @@ task dist:fe:rpm - Linux DEB: `x64`, `arm64` - Windows: `x64`, `arm64` (Build-Skripte vorhanden) - macOS: Build-Skripte vorhanden (`arm64`, `universal`) fuer lokale Build-Umgebungen -- Android: native APKs — ABIs `arm64-v8a`, `x86_64`, plus universal +- Android: native APKs — ABIs `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), plus universal ## Android @@ -235,23 +261,26 @@ Vom Repository-Root: # 1) Chaquopy-Wheels gemaess android/app/build.gradle bauen bash scripts/build-android-wheels-local.sh -# 2) Universal-APKs bauen (ein Debug- und ein Release-APK; siehe android/README.md) +# 2) Universal-APK bauen (ein Debug + ein Release pro Lauf; siehe android/README.md) cd android ./gradlew --no-daemon :app:assembleDebug :app:assembleRelease ``` -Es gibt nur eine Android-Variante (keine `slim`-/`full`-Flavors). Gradle synchronisiert den gesamten `meshchatx/`-Baum nach `app/src/main/python/meshchatx/`, inklusive Offline-Repository-Raeder. **ABI-Packaging:** `universal` (Standard) oder `split` (siehe `android/app/build.gradle`). +**Eine** Android-Variante. Gradle synchronisiert den gesamten `meshchatx/`-Ordner nach `app/src/main/python/meshchatx/`, inklusive Offline-Repository-Raeder. **ABI-Verpackung:** `universal` (Standard) oder `split` (siehe `android/app/build.gradle`). -Mit **`-PmeshchatxAbiPackaging=universal`** (Standard): +Bei **`-PmeshchatxAbiPackaging=universal`** (Standard) liefert jeder Buildtyp ein APK mit allen gewaehlten ABIs: - Debug: `android/app/build/outputs/apk/debug/app-debug.apk` - Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk` +Bei **`-PmeshchatxAbiPackaging=split`** und mehr als einem ABI in `-PmeshchatxAbis` koennen pro-ABI-APKs entstehen, wie in [`android/README.md`](../android/README.md) beschrieben. + Hinweise: -- Release-Ausgaben sind standardmaessig unsigniert (`scripts/sign-android-apks.sh`). -- ABI: `-PmeshchatxAbis` oder `MESHCHATX_ABIS`; Packaging: `-PmeshchatxAbiPackaging` oder `MESHCHATX_ABI_PACKAGING`. -- Existiert im Repo-Root `dist/reticulum_meshchatx-*.whl` (z. B. nach `python -m build --wheel -o dist .`), wird dieses Rad beim Bundling bevorzugt. Details in [`android/README.md`](../android/README.md). +- Release-Builds sind standardmaessig unsigniert, bis die Signatur konfiguriert ist (`scripts/sign-android-apks.sh`). +- Android richtet sich nach den in `android/app/build.gradle` gelisteten ABIs (einschliesslich `armeabi-v7a`, falls aktiviert). Das Bauen von Radern fuer `armeabi-v7a` erfordert ein Android-SDK in `ANDROID_HOME` (siehe `android/README.md`). +- ABI-Liste: `-PmeshchatxAbis` oder `MESHCHATX_ABIS`. Verpackung: `-PmeshchatxAbiPackaging=universal|split` oder `MESHCHATX_ABI_PACKAGING`. +- Existiert im Repo-Root `dist/reticulum_meshchatx-*.whl` (z. B. nach `python -m build --wheel -o dist .`), bevorzugt die Aktualisierung des Offline-Repositorys dieses Wheel gegueber PyPI. In der CI wird das Wheel vor dem Android-Gradle-Schritt gebaut. Weitere Dokumentation: @@ -270,7 +299,7 @@ Weitere Dokumentation: | `--headless` | `MESHCHAT_HEADLESS` | `false` | Browser nicht automatisch oeffnen | | `--auth` | `MESHCHAT_AUTH` | `false` | Basis-Authentifizierung aktivieren | | `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | Datenverzeichnis | -| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Frontend-Verzeichnis (fuer Installationen ohne gebundelte Assets) | +| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Frontend-Verzeichnis (fuer Quell-Installationen ohne gebundelte Assets) | ## Branches @@ -305,51 +334,50 @@ task build:all Aktuelle Version in diesem Repository: `4.6.0`. -- `package.json` ist die Quelle fuer die JavaScript/Electron-Version. -- `meshchatx/src/version.py` wird aus `package.json` synchronisiert mit: - -```bash -pnpm run version:sync -``` - -Fuer konsistente Releases die Versionsfelder dort abgleichen, wo noetig (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`). +- Fuer Release-Bumps bearbeiten Sie **nur** `version` in **`package.json`**. +- **`pnpm run version:sync`** (wird auch zu Beginn von **`pnpm run build`** ausgefuehrt) verbreitet diese Version in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (Produktzeile), **README** / **lang/README.*** (Zeilen mit aktueller Version), **`docs/meshchatx_on_raspberry_pi.md`** (pipx-Beispiel) und Hilfsfelder in **`packaging/arch/PKGBUILD`**. +- **`meshchatx.__version__`** wird aus **`meshchatx/src/version.py`** gelesen, ohne `meshchatx.src` zu importieren, damit ein normales `import meshchatx` leicht bleibt. +- **Changelog**-Eintrage bleiben beim Release manuell. ## Sicherheit - [`SECURITY.md`](../SECURITY.md) -- Integrierte Integritaetspruefungen und HTTPS/WSS-Standardeinstellungen in der App -- CI- und Release-Workflows in `.github/workflows/`; auf Gitea nur `.gitea/workflows/github-release-sync.yml` für GitHub-Release-Sync (siehe `SECURITY.md`) +- [`LEGAL.md`](../LEGAL.md) +- Eingebaute Integritaetspruefungen und HTTPS/WSS-Standardwerte in der App-Laufzeit. +- CI- und Release-Builds in GitHub Actions. ## Sprache hinzufuegen -Die Locale-Erkennung erfolgt automatisch. Legen Sie eine neue Datei unter `meshchatx/src/frontend/locales/` an (z. B. `xx.json`) mit denselben Schluesseln wie `en.json` und einem obersten Feld `_languageName` fuer die Anzeige in der Sprachauswahl. Sie koennen `en.json` kopieren und alles von Hand uebersetzen; **maschinelle Erzeugung ist optional** und nie verpflichtend. +Arbeitsablauf des Autors: ArgosTranslate, dann lokales LLM (Qwen 3 + Gemma 4). -**Korrekturen und menschliche Uebersetzungen sind willkommen.** Verbesserungen an bestehenden Locale-Dateien oder vollstaendig manuell uebersetzte Dateien koennen Sie per Pull Request oder Issue im [Quellcode-Repository](https://git.quad4.io/RNS-Things/MeshChatX) oder beim [GitHub-Spiegel](https://github.com/Quad4-Software/MeshChatX) einreichen. +Korrekturen von der Community sind willkommen — per LXMF oder wo Sie erreichbar sind. -**Optional: Argos-Translate-Bootstrap** -- Wenn Sie einen maschinellen Erstentwurf aus `en.json` wollen, koennen Sie `scripts/argos_translate.py` nutzen. Es kuemmert sich um Formatierung und schuetzt Interpolationsvariablen (wie `{count}`) vor versehentlichen Aenderungen. +Die Locale-Erkennung erfolgt automatisch. Fuegen Sie Dateien unter `meshchatx/src/frontend/locales/` hinzu (z. B. `xx.json`) mit denselben Schluesseln wie `en.json` und oberstes `_languageName` fuer die Sprachauswahl. Sie koennen `en.json` kopieren und alles manuell uebersetzen; **maschinenunterstuetzte Erzeugung (optional)** ist niemals erforderlich. + +**Optional: Argos-Translate-Start** — fuer einen Entwurf aus `en.json` koennen Sie `scripts/argos_translate.py` nutzen; es behandelt Formatierung, farbige Ausgabe und schuetzt z. B. `{count}`. ```bash -# Installieren Sie argostranslate, falls noch nicht geschehen -pip install argostranslate +# argostranslate ggf. installieren +pipx install argostranslate -# Fuehren Sie das Uebersetzungsskript aus +# Uebersetzungsskript ausfuehren python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Ihr Sprachname" ``` -Nach einem maschinellen Entwurf sollten ein LLM oder ein Mensch Grammatik, Kontext und Ton pruefen (z. B. formell vs. informell). +Nach jeder maschinellen Runde Grammatik, Kontext und Ton (formell vs. informell) mit LLM oder Mensch pruefen. -Schluesselparitaet pruefen: `pnpm test -- tests/frontend/i18n.test.js --run` +`pnpm test -- tests/frontend/i18n.test.js --run` prueft die Schluesselparitaet mit `en.json`. Keine weiteren Code-Aenderungen noetig. App, Sprachwahl und Tests lesen Locales zur Build-Zeit aus `meshchatx/src/frontend/locales/`. ## Mitwirkende - [Liam Cottle](https://github.com/liamcottle) - Originales Reticulum MeshChat -- [RFnexus](https://github.com/RFnexus) - Micron-Parser (JavaScript) +- [RFnexus](https://github.com/RFnexus) - micron-Parser (JavaScript) - [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST ## Lizenz Die projekt-eigenen Anteile stehen unter 0BSD. -Urspruengliche Upstream-Anteile von MeshChat bleiben unter MIT. +Urspruengliche Upstream-Anteile von Reticulum MeshChat bleiben unter MIT. Vollstaendiger Text und Hinweise in [`../LICENSE`](../LICENSE). diff --git a/lang/README.it.md b/lang/README.it.md index 9068330..fffebaf 100644 --- a/lang/README.it.md +++ b/lang/README.it.md @@ -8,14 +8,16 @@ Questo progetto e indipendente dal progetto originale Reticulum MeshChat e non e - Sito web: [meshchatx.com](https://meshchatx.com) - Codice sorgente: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX) -- Mirror ufficiale: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — usato anche per le build Windows e macOS al momento. -- Release: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases) +- Mirror ufficiale su GitHub: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) +- Release: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) - Changelog: [`CHANGELOG.md`](../CHANGELOG.md) -- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects) + +rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX` +NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu` ## Modifiche importanti rispetto a Reticulum MeshChat -- Usa LXST +- Usa LXST per le chiamate - Peewee ORM sostituito con SQL diretto - Axios sostituito con `fetch` nativo - Electron 41.x (runtime Node 24 incluso) @@ -27,7 +29,7 @@ Questo progetto e indipendente dal progetto originale Reticulum MeshChat e non e > MeshChatX non garantisce la compatibilita dei dati con le versioni precedenti di Reticulum MeshChat. Eseguire un backup prima della migrazione o dei test. > [!WARNING] -> I sistemi legacy non sono ancora completamente supportati. Requisiti minimi attuali: Python `>=3.11` e Node `>=24` (Electron 41 allinea a Node 24; `engines` in `package.json` e la CI seguono la stessa linea). +> I sistemi legacy non sono ancora supportati. Base attuale: Python `>=3.11` e Node `>=24` (Electron 41 allineato a Node 24; `engines` in `package.json` e la CI seguono la stessa linea). ## Requisiti @@ -53,15 +55,15 @@ Scegli il metodo in base all'ambiente e al formato del pacchetto. | Python wheel (`.whl`) | Si | Qualsiasi architettura supportata da Python | Installazione headless/web-server senza build Node | | Linux AppImage | Si | `x64`, `arm64` | Uso desktop portatile | | Pacchetto Debian (`.deb`) | Si | `x64`, `arm64` | Installazione Debian/Ubuntu | -| Pacchetto RPM (`.rpm`) | Si | Dipende dal CI | Fedora/RHEL/openSUSE | +| Pacchetto RPM (`.rpm`) | Si | Dipende dal runner CI per l'artefatto pubblicato | Fedora/RHEL/openSUSE | | Da sorgente | Compilato localmente | Architettura host | Sviluppo e build personalizzati | Note: -- Il workflow di release compila esplicitamente Linux `x64` e `arm64` AppImage + DEB. -- RPM viene anche tentato e caricato quando prodotto con successo. +- GitHub Actions compila le release con tag: Windows e macOS tramite `.github/workflows/build-release.yml`, Linux wheel/AppImage/deb/rpm tramite `.github/workflows/build-linux-release.yml`, e l'immagine container tramite `.github/workflows/docker.yml`. +- Per Linux, `x64` e `arm64` AppImage + DEB sono compilate su GitHub; il RPM e tentato e viene caricato quando l'artefatto e prodotto. -## Avvio rapido: Docker +## Docker - **Docker Hub:** `quad4io/meshchatx` - **GHCR:** `ghcr.io/quad4-software/meshchatx` @@ -70,8 +72,6 @@ Note: docker compose up -d ``` -Equivalente senza Compose (stessa porta e volume di configurazione): - ```bash docker run -d --name reticulum-meshchatx \ --restart unless-stopped \ @@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \ ghcr.io/quad4-software/meshchatx:latest ``` -Puoi usare l'immagine `quad4io/meshchatx:latest` (Docker Hub) al posto di GHCR. +Al posto dell'immagine GHCR puoi usare `quad4io/meshchatx:latest` se preferisci Docker Hub. Il file compose predefinito mappa: @@ -160,7 +160,7 @@ Note sui comandi di installazione: - `pnpm install --frozen-lockfile` rifiuta di aggiornare `pnpm-lock.yaml` e fallisce se il lockfile non corrisponde a `package.json`. Cosi' si evita che una versione upstream inattesa venga installata silenziosamente. - `verify-store-integrity=true` e' impostato anche nel `.npmrc` del progetto; la riga esplicita `pnpm config set` rafforza inoltre la configurazione utente. -- Gli script di lifecycle (`preinstall`/`postinstall`) sono bloccati di default in pnpm v10+. Solo i pacchetti elencati in `pnpm.onlyBuiltDependencies` di `package.json` possono eseguire script di installazione (attualmente `electron`, `electron-winstaller`, `esbuild`, `protobufjs`). +- Gli script di lifecycle (`preinstall`/`postinstall`) sono bloccati di default in pnpm v10+. Solo i pacchetti elencati in `pnpm.onlyBuiltDependencies` di `package.json` possono eseguire script di installazione (attualmente `electron`, `electron-winstaller`, `esbuild`). - `poetry check --lock` fallisce subito se `poetry.lock` non e' allineato con `pyproject.toml`; `poetry install` risolve poi solo dal lockfile. - Per un'installazione Poetry strettamente basata sul lockfile (senza refresh implicito), fissa Poetry con `pip install "poetry==2.3.4"`, in linea con la CI. @@ -172,7 +172,7 @@ Per eseguire il binario nativo `meshchatx` (alias: `meshchat`) con isolamento ag - [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md) -La stessa pagina compare nell'elenco **Documentazione** in-app (documentazione MeshChatX) quando viene servita dai file `meshchatx-docs` inclusi o sincronizzati. +La stessa pagina compare nell'elenco **Documentazione** (documentazione MeshChatX) in-app quando viene servita dai file `meshchatx-docs` in bundle o sincronizzati. ## Desktop Linux: font emoji @@ -214,6 +214,32 @@ Oppure tramite Task: task dist:fe:rpm ``` +## Build container (wheel, AppImage, deb, rpm) + +`Dockerfile.build` esegue le stesse fasi usate in CI (Poetry, pnpm, `task`, dipendenze APT). Orientato a **linux/amd64** (tarball NodeSource amd64, Task amd64). Il target predefinito e completo; si puo sovrascrivere con un build-arg. + +Valori per `MESHCHATX_BUILD_TARGETS`: `all` (default), `wheel` o `electron` (AppImage + deb per x64 e arm64, RPM se possibile, senza wheel). + +Build: + +```bash +docker build -f Dockerfile.build -t meshchatx-build:local . +``` + +Solo wheel: + +```bash +docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel . +``` + +Copiare `/artifacts` dall'immagine finita all'host: + +```bash +cid=$(docker create meshchatx-build:local) +docker cp "${cid}:/artifacts" ./meshchatx-artifacts +docker rm "${cid}" +``` + ## Supporto architetture - Immagine Docker: `amd64`, `arm64` @@ -221,7 +247,7 @@ task dist:fe:rpm - Linux DEB: `x64`, `arm64` - Windows: `x64`, `arm64` (script di build disponibili) - macOS: script di build disponibili (`arm64`, `universal`) per ambienti di build locali -- Android: APK nativi — `arm64-v8a`, `x86_64`, universale +- Android: APK nativi — `arm64-v8a`, `x86_64`, `armeabi-v7a` (ARM a 32 bit), piu universale ## Android @@ -235,23 +261,26 @@ Dalla root del repository: # 1) Build delle wheel Chaquopy usate da android/app/build.gradle bash scripts/build-android-wheels-local.sh -# 2) Build APK universali (un debug e una release; vedi android/README.md) +# 2) Build APK universal (un debug + una release per esecuzione; vedi android/README.md) cd android ./gradlew --no-daemon :app:assembleDebug :app:assembleRelease ``` -Esiste una sola variante Android (niente flavor `slim` / `full`). Gradle sincronizza l'intero albero `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. **Imballaggio ABI:** `universal` (predefinito) o `split` (vedi `android/app/build.gradle`). +**Una** sola variante Android. Gradle sincronizza l'intera directory `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. **Packaging ABI:** `universal` (predefinito) o `split` (vedi `android/app/build.gradle`). -Con **`-PmeshchatxAbiPackaging=universal`** (predefinito): +Con **`-PmeshchatxAbiPackaging=universal`** (predefinito) ogni tipo di build e un APK con tutti gli ABI scelti: - Debug: `android/app/build/outputs/apk/debug/app-debug.apk` - Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk` +Con **`-PmeshchatxAbiPackaging=split`** e piu di un ABI in `-PmeshchatxAbis`, Gradle puo emettere APK per ABI come documentato in [`android/README.md`](../android/README.md). + Note: -- Le release sono non firmate di default (`scripts/sign-android-apks.sh`). -- ABI: `-PmeshchatxAbis` o `MESHCHATX_ABIS`; imballaggio: `-PmeshchatxAbiPackaging` o `MESHCHATX_ABI_PACKAGING`. -- Se nella root del repo esiste `dist/reticulum_meshchatx-*.whl` (es. dopo `python -m build --wheel -o dist .`), quella wheel ha priorita nel bundle. Dettagli in [`android/README.md`](../android/README.md). +- Gli output di release non sono firmati finche non configuri la firma (`scripts/sign-android-apks.sh`). +- Android punta agli ABI elencati in `android/app/build.gradle` (incluso `armeabi-v7a` se abilitato). Le wheel per `armeabi-v7a` richiedono Android SDK su `ANDROID_HOME` (vedi `android/README.md`). +- Selezione ABI: `-PmeshchatxAbis` o `MESHCHATX_ABIS`. Packaging: `-PmeshchatxAbiPackaging=universal|split` o `MESHCHATX_ABI_PACKAGING`. +- Se esiste in root `dist/reticulum_meshchatx-*.whl` (es. da `python -m build --wheel -o dist .`), l'aggiornamento del repository in bundle preferisce quella wheel rispetto a PyPI. In CI la wheel viene costruita prima del passo Gradle Android. Documentazione aggiuntiva: @@ -270,7 +299,7 @@ Documentazione aggiuntiva: | `--headless` | `MESHCHAT_HEADLESS` | `false` | Non aprire il browser automaticamente | | `--auth` | `MESHCHAT_AUTH` | `false` | Attiva autenticazione base | | `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | Directory dei dati | -| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundle | Directory dei file frontend (per installazioni senza asset inclusi) | +| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Directory dei file frontend (necessaria per installazioni da sorgente senza asset in bundle) | ## Branch @@ -301,55 +330,54 @@ Scorciatoie `Makefile`: | `make test` | Test frontend e backend | | `make clean` | Rimuove artefatti di build e node_modules | -## Versioning +## Versionamento Versione attuale nel repository: `4.6.0`. -- La fonte della versione JavaScript/Electron e `package.json`. -- `meshchatx/src/version.py` e sincronizzato da `package.json` con: - -```bash -pnpm run version:sync -``` - -Per release coerenti, allineare i campi di versione dove richiesto (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`). +- L'unico valore che modifichi per un bump di release e **`version` in `package.json`**. +- Esegui **`pnpm run version:sync`** (all'inizio anche di **`pnpm run build`**) per propagare in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (riga prodotto), **README** / **lang/README.\*** (righe "versione attuale"), **esempio pipx in `docs/meshchatx_on_raspberry_pi.md`**, e aiuti in **`packaging/arch/PKGBUILD`**. +- **`meshchatx.__version__`** si legge da **`meshchatx/src/version.py`** senza importare **`meshchatx.src`**, cosi un semplice `import meshchatx` resta leggero. +- Le voci del **changelog** restano manuali quando tagghi una release. ## Sicurezza - [`SECURITY.md`](../SECURITY.md) -- Controlli di integrita integrati e HTTPS/WSS predefiniti nell'app -- CI e release in `.github/workflows/`; su Gitea solo `.gitea/workflows/github-release-sync.yml` per il sync delle release su GitHub (vedi `SECURITY.md`) +- [`LEGAL.md`](../LEGAL.md) +- Controlli di integrita integrati e valori predefiniti HTTPS/WSS nel runtime dell'app. +- Build CI e release su GitHub Actions. ## Aggiungere una lingua -Il rilevamento della lingua locale è automatico. Aggiungi un nuovo file in `meshchatx/src/frontend/locales/` (ad esempio `xx.json`) con le stesse chiavi di `en.json` e un campo in cima `_languageName` per l'etichetta nel selettore lingue. Puoi copiare `en.json` e tradurre tutto a mano; **la generazione automatica è opzionale** e non è mai obbligatoria. +Flusso dell'autore: ArgosTranslate, poi LLM locale (Qwen 3 + Gemma 4). -**Correzioni e traduzioni umane sono benvenute.** Miglioramenti a un file esistente o un file interamente tradotto a mano possono essere inviati con una pull request o una segnalazione sul [repository sorgente](https://git.quad4.io/RNS-Things/MeshChatX) o sul [mirror GitHub](https://github.com/Quad4-Software/MeshChatX). +Poi si accettano volentieri fix dalla community (LXMF o come mi contattate). -**Opzionale: bozza con Argos Translate** -- Se vuoi una prima bozza generata da `en.json`, puoi usare `scripts/argos_translate.py`. Gestisce la formattazione e aiuta a proteggere le variabili di interpolazione (come `{count}`). +Il rilevamento locale e automatico. Aggiungi un file in `meshchatx/src/frontend/locales/` (es. `xx.json`) con le stesse chiavi di `en.json` e un `_languageName` in cima per l'etichetta nel selettore. Puoi copiare `en.json` e tradurre tutto a mano; **la generazione assistita da machine e opzionale** e non e mai obbligatoria. + +**Opzionale: avvio con Argos Translate** -- per una bozza partendo da `en.json` puoi usare `scripts/argos_translate.py` (formattazione, output a colori, variabili di interpolazione come `{count}`). ```bash -# Installa argostranslate se non l'hai già fatto -pip install argostranslate +# Installa argostranslate se non l'hai gia +pipx install argostranslate # Esegui lo script di traduzione python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Nome della tua lingua" ``` -Dopo una passata automatica, fai verificare grammatica, contesto e tono a un LLM o a un revisore umano (es. formale vs informale). +Dopo qualsiasi passaggio automatico, un LLM o un revisore umano controlli grammatica, contesto e tono (es. formale vs informale). -Verifica la parità delle chiavi con: `pnpm test -- tests/frontend/i18n.test.js --run` +Esegui `pnpm test -- tests/frontend/i18n.test.js --run` per verificare la parita delle chiavi con `en.json`. Non sono necessarie altre modifiche al codice. L'app, il selettore della lingua e i test scoprono le lingue dalla cartella `meshchatx/src/frontend/locales/` durante la compilazione. ## Crediti - [Liam Cottle](https://github.com/liamcottle) - Reticulum MeshChat originale -- [RFnexus](https://github.com/RFnexus) - Parser Micron (JavaScript) +- [RFnexus](https://github.com/RFnexus) - parser micron (JavaScript) - [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST ## Licenza Le parti di proprieta del progetto sono rilasciate sotto 0BSD. -Le parti originali upstream derivate da MeshChat restano sotto MIT. +Le parti originali upstream da Reticulum MeshChat restano sotto MIT. Per testo completo e note, vedi [`../LICENSE`](../LICENSE). diff --git a/lang/README.ja.md b/lang/README.ja.md index 9fe361e..7e5c2ec 100644 --- a/lang/README.ja.md +++ b/lang/README.ja.md @@ -8,14 +8,16 @@ Liam Cottle 氏による Reticulum MeshChat を大幅に改修・機能拡張し - ウェブサイト: [meshchatx.com](https://meshchatx.com) - ソースコード: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX) -- 公式ミラー: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — 現時点では Windows / macOS ビルドにも使用。 -- リリース: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases) +- 公式 GitHub ミラー: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) +- リリース: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) - 変更履歴: [`CHANGELOG.md`](../CHANGELOG.md) -- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects) + +rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX` +NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu` ## Reticulum MeshChat からの主な変更 -- LXST を使用 +- 通話に LXST を使用 - Peewee ORM を生 SQL に置き換え - Axios をネイティブ `fetch` に置き換え - Electron 41.x(同梱 Node 24 ランタイム) @@ -27,7 +29,7 @@ Liam Cottle 氏による Reticulum MeshChat を大幅に改修・機能拡張し > MeshChatX は旧バージョンの Reticulum MeshChat とのデータ互換性を保証しません。マイグレーションやテスト前にデータをバックアップしてください。 > [!WARNING] -> レガシーシステムはまだ完全にはサポートされていません。現在の最低要件: Python `>=3.11`、Node `>=24`(Electron 41 は Node 24 系;`package.json` の `engines` と CI は同じ基準)。 +> レガシーシステムはまだサポートされません。現在の基準は Python `>=3.11` と Node `>=24`(Electron 41 は Node 24 に揃う;`package.json` の `engines` と CI も同じライン)。 ## 必要条件 @@ -53,15 +55,15 @@ task build:all | Python wheel (`.whl`) | はい | Python がサポートする全アーキテクチャ | Node ビルド不要のヘッドレス/Web サーバー | | Linux AppImage | はい | `x64`, `arm64` | ポータブルデスクトップ | | Debian パッケージ (`.deb`) | はい | `x64`, `arm64` | Debian/Ubuntu | -| RPM パッケージ (`.rpm`) | はい | CI 依存 | Fedora/RHEL/openSUSE | +| RPM パッケージ (`.rpm`) | はい | 公開用 CI ランナーに依存 | Fedora/RHEL/openSUSE | | ソースから | ローカルビルド | ホストアーキテクチャ | 開発・カスタムビルド | 備考: -- リリースワークフローは Linux `x64` および `arm64` の AppImage + DEB を明示的にビルドします。 -- RPM も試行され、成功時にアップロードされます。 +- GitHub Actions はタグ付きリリースをビルドします: Windows / macOS は `.github/workflows/build-release.yml`、Linux wheel / AppImage / deb / rpm は `.github/workflows/build-linux-release.yml`、コンテナイメージは `.github/workflows/docker.yml`。 +- Linux `x64` および `arm64` の AppImage + DEB は GitHub でビルド。RPM も試行し、成果物があればアップロードします。 -## クイックスタート: Docker +## Docker - **Docker Hub:** `quad4io/meshchatx` - **GHCR:** `ghcr.io/quad4-software/meshchatx` @@ -70,8 +72,6 @@ task build:all docker compose up -d ``` -Compose を使わない場合の同等例(同じポート割り当てと設定ボリューム): - ```bash docker run -d --name reticulum-meshchatx \ --restart unless-stopped \ @@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \ ghcr.io/quad4-software/meshchatx:latest ``` -イメージは Docker Hub の `quad4io/meshchatx:latest` に置き換え可能です。 +GHCR の代わりに Docker Hub の `quad4io/meshchatx:latest` を使えます。 デフォルトの compose ファイル: @@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1 - `pnpm install --frozen-lockfile` は `pnpm-lock.yaml` の更新を拒否し、ロックファイルが `package.json` と一致しない場合は失敗します。これにより、想定外の上流バージョンが暗黙的にインストールされるのを防げます。 - `verify-store-integrity=true` はプロジェクトの `.npmrc` にも設定されています。上記の `pnpm config set` の行はユーザー設定側も明示的に固めるためのものです。 -- pnpm v10 以降、ライフサイクルスクリプト (`preinstall`/`postinstall`) はデフォルトでブロックされます。インストールスクリプトを実行できるのは `package.json` の `pnpm.onlyBuiltDependencies` に列挙されたパッケージ (現在は `electron`、`electron-winstaller`、`esbuild`、`protobufjs`) だけです。 +- pnpm v10 以降、ライフサイクルスクリプト (`preinstall`/`postinstall`) はデフォルトでブロックされます。インストールスクリプトを実行できるのは `package.json` の `pnpm.onlyBuiltDependencies` に列挙されたパッケージ(現在 `electron`、`electron-winstaller`、`esbuild`)だけです。 - `poetry check --lock` は `poetry.lock` と `pyproject.toml` が同期していない場合に即時失敗します。その後の `poetry install` はロックファイルからのみ解決します。 - 厳密にロックファイルだけで Poetry をインストールしたい場合は、CI と揃えるために `pip install "poetry==2.3.4"` で Poetry バージョンを固定してください。 @@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1 - [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md) -同梱または同期された `meshchatx-docs` から配信される場合、アプリ内の **ドキュメント**(MeshChatX ドキュメント)一覧にも同じページが表示されます。 +同梱または同期された `meshchatx-docs` から配信する場合、同じページがアプリ内 **ドキュメント** 一覧(MeshChatX ドキュメント)にも表示されます。 ## Linux デスクトップ: 絵文字フォント @@ -214,6 +214,32 @@ Task 経由: task dist:fe:rpm ``` +## コンテナビルド(wheel、AppImage、deb、rpm) + +`Dockerfile.build` は CI と同じ手順(Poetry、pnpm、`task`、APT 依存)を実行します。**linux/amd64** 向け(NodeSource の amd64 tarball、Task の amd64 バイナリ)。デフォルトは全ターゲット。build-arg で上書き可能。 + +`MESHCHATX_BUILD_TARGETS` の値: `all`(既定)、`wheel`、または `electron`(x64 / arm64 の AppImage + deb、RPM はベストエフォート、wheel なし)。 + +ビルド: + +```bash +docker build -f Dockerfile.build -t meshchatx-build:local . +``` + +wheel のみ: + +```bash +docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel . +``` + +完成したイメージから `/artifacts` をホストにコピー: + +```bash +cid=$(docker create meshchatx-build:local) +docker cp "${cid}:/artifacts" ./meshchatx-artifacts +docker rm "${cid}" +``` + ## アーキテクチャサポート - Docker イメージ: `amd64`, `arm64` @@ -221,7 +247,7 @@ task dist:fe:rpm - Linux DEB: `x64`, `arm64` - Windows: `x64`, `arm64`(ビルドスクリプトあり) - macOS: ローカルビルド向けにビルドスクリプトあり(`arm64`, `universal`) -- Android: ネイティブ APK — ABI `arm64-v8a`、`x86_64`、および universal +- Android: ネイティブ APK — ABI `arm64-v8a`、`x86_64`、`armeabi-v7a`(32-bit ARM)、および universal ## Android @@ -235,23 +261,26 @@ MeshChatX はネイティブ Android APK のビルドに対応しています( # 1) android/app/build.gradle で使う Chaquopy 用ホイールをビルド bash scripts/build-android-wheels-local.sh -# 2) 汎用 APK をビルド(debug と release 各 1 つ;android/README.md 参照) +# 2) universal APK をビルド(1 回の実行で debug 1 本 + release 1 本;android/README.md 参照) cd android ./gradlew --no-daemon :app:assembleDebug :app:assembleRelease ``` -Android は単一バリアント(`slim` / `full` フレーバーなし)。Gradle が `meshchatx/` 全体を `app/src/main/python/meshchatx/` に同期し、オフラインリポジトリ用ホイールも含みます。**ABI パッケージング:** `universal`(既定)または `split`(`android/app/build.gradle`)。 +**単一**の Android バリアント。Gradle が `meshchatx/` ツリー全体を `app/src/main/python/meshchatx/` に同期し、オフラインリポジトリ用ホイールも含みます。**ABI パッケージング:** `universal`(既定)または `split`(`android/app/build.gradle`)。 -**`-PmeshchatxAbiPackaging=universal`**(既定)のとき: +**`-PmeshchatxAbiPackaging=universal`**(既定)では、各ビルド種別は選択した全 ABI を含む 1 つの APK です: - デバッグ: `android/app/build/outputs/apk/debug/app-debug.apk` - リリース: `android/app/build/outputs/apk/release/app-release-unsigned.apk` +**`-PmeshchatxAbiPackaging=split`** かつ `-PmeshchatxAbis` に ABI が複数ある場合、ABI 別 APK になることがあります([`android/README.md`](../android/README.md) 参照)。 + 備考: -- リリースは既定で未署名(`scripts/sign-android-apks.sh`)。 -- ABI は `-PmeshchatxAbis` または `MESHCHATX_ABIS`、パッケージングは `-PmeshchatxAbiPackaging` または `MESHCHATX_ABI_PACKAGING`。 -- リポジトリルートに `dist/reticulum_meshchatx-*.whl` がある場合(例: `python -m build --wheel -o dist .` の後)、バンドルではそれが優先されます。詳細は [`android/README.md`](../android/README.md)。 +- リリース成果物は、署名を設定するまで既定で未署名(`scripts/sign-android-apks.sh`)。 +- 対象 ABI は `android/app/build.gradle` の一覧(`armeabi-v7a` 有効時を含む)。`armeabi-v7a` 用ホイールのビルドには `ANDROID_HOME` の Android SDK が必要(`android/README.md` 参照)。 +- ABI 上書き: `-PmeshchatxAbis` または `MESHCHATX_ABIS`。パッケージング: `-PmeshchatxAbiPackaging=universal|split` または `MESHCHATX_ABI_PACKAGING`。 +- リポジトリルートに `dist/reticulum_meshchatx-*.whl` があると(例: `python -m build --wheel -o dist .`)、同梱リポジトリの更新で PyPI よりその MeshChatX ホイールを優先。CI では Android Gradle の前にそのホイールをビルドします。 追加ドキュメント: @@ -270,7 +299,7 @@ Android は単一バリアント(`slim` / `full` フレーバーなし)。Gr | `--headless` | `MESHCHAT_HEADLESS` | `false` | ブラウザを自動で開かない | | `--auth` | `MESHCHAT_AUTH` | `false` | 基本認証を有効化 | | `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | データディレクトリ | -| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自動/同梱 | フロントエンドファイルディレクトリ(同梱資産のないインストール向け) | +| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自動/同梱 | フロントエンドのディレクトリ(同梱資産なしのソースインストールで必要) | ## ブランチ @@ -305,51 +334,50 @@ task build:all このリポジトリの現在のバージョンは `4.6.0` です。 -- JavaScript / Electron のバージョンソースは `package.json`。 -- `meshchatx/src/version.py` は次で `package.json` と同期します: - -```bash -pnpm run version:sync -``` - -リリースの一貫性のため、必要に応じて (`package.json`、`pyproject.toml`、`meshchatx/__init__.py`) のバージョンを揃えてください。 +- リリースのバージョン上げは **`package.json` の `version` のみ**編集します。 +- **`pnpm run version:sync`**(**`pnpm run build`** 開始時にも実行)で、**`pyproject.toml`**、**`meshchatx/src/version.py`**、**`THIRD_PARTY_NOTICES.txt`**(製品行)、**README** / **lang/README.***(現在のバージョン行)、**`docs/meshchatx_on_raspberry_pi.md`** の pipx 例、**`packaging/arch/PKGBUILD`** の補助フィールドに反映します。 +- **`meshchatx.__version__`** は **`meshchatx/src/version.py`** から読み、**`meshchatx.src`** をインポートしないため、単なる `import meshchatx` は軽量のままです。 +- **Changelog** のエントリはリリース時に手作業のままです。 ## セキュリティ - [`SECURITY.md`](../SECURITY.md) -- アプリ実行時の組み込み整合性チェックとデフォルトの HTTPS/WSS -- CI とリリースは `.github/workflows/`。Gitea では GitHub リリース同期用に `.gitea/workflows/github-release-sync.yml` のみ(`SECURITY.md` を参照) +- [`LEGAL.md`](../LEGAL.md) +- アプリランタイムの組み込み整合性チェックと既定の HTTPS/WSS。 +- GitHub Actions での CI およびリリースビルド。 ## 言語の追加 -ロケールの検出は自動で行われます。`meshchatx/src/frontend/locales/` に新しい JSON(例: `xx.json`)を追加し、`en.json` と同じキーに加え、言語選択に表示する名前を `_languageName` で指定します。`en.json` をコピーしてすべて手翻訳しても構いません。**機械翻訳による生成は任意**で、必須ではありません。 +作業手順: ArgosTranslate から ローカル LLM(Qwen 3 + Gemma 4)へ。 -**修正や人間による翻訳の提供を歓迎します。** 既存ロケールの改善や完全な手翻訳ファイルは、[ソースリポジトリ](https://git.quad4.io/RNS-Things/MeshChatX)または [GitHub ミラー](https://github.com/Quad4-Software/MeshChatX) にプルリクエストまたは issue で送ってください。 +そのあと、LXMF 等で修正を歓迎します。 -**任意: Argos Translate による下書き** -- `en.json` から機械翻訳のたたき台が欲しい場合は `scripts/argos_translate.py` を使えます。フォーマット処理や補間変数(`{count}` など)の保護に役立ちます。 +ロケールの検出は自動です。`meshchatx/src/frontend/locales/` に新しいファイル(例: `xx.json`)を追加し、`en.json` と同じキーに加え、セレクタ表示用の `_languageName` を最上位に置きます。`en.json` をコピーし手作業で訳すこともできます。**機械補助は任意**で、求められません。 + +**任意: Argos Translate で土台** -- `en.json` から下書きするには `scripts/argos_translate.py`(整形・カラー出力、 `{count}` 等の保護)を使えます。 ```bash -# argostranslate をまだインストールしていない場合はインストールします -pip install argostranslate +# 必要なら argostranslate を導入 +pipx install argostranslate -# 翻訳スクリプトを実行します +# 翻訳スクリプトを実行 python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "言語名" ``` -機械下書きのあとは、LLM または人間が文法・文脈・トーン(フォーマル/カジュアルなど)を確認するとよいでしょう。 +機械下書きのあと、文法・文脈・トーンは LLM か人が確認(フォーマル/カジュアル等)。 -`pnpm test -- tests/frontend/i18n.test.js --run` を実行して、`en.json` とのキーの一致を確認します。 +`pnpm test -- tests/frontend/i18n.test.js --run` で `en.json` とのキー一致を検証。 その他のコードの変更は必要ありません。アプリ、言語セレクター、およびテストは、ビルド時に `meshchatx/src/frontend/locales/` ディレクトリからロケールを検出します。 ## クレジット - [Liam Cottle](https://github.com/liamcottle) - オリジナル Reticulum MeshChat -- [RFnexus](https://github.com/RFnexus) - Micron パーサー(JavaScript) +- [RFnexus](https://github.com/RFnexus) - micron パーサー(JavaScript) - [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST ## ライセンス プロジェクト独自の部分は 0BSD です。 -MeshChat 由来の元の上流部分は MIT のままです。 +Reticulum MeshChat 由来の元の上流部分は MIT のままです。 全文と通知は [`../LICENSE`](../LICENSE) を参照してください。 diff --git a/lang/README.ru.md b/lang/README.ru.md index 3a1adb3..8bcef21 100644 --- a/lang/README.ru.md +++ b/lang/README.ru.md @@ -8,14 +8,16 @@ - Сайт: [meshchatx.com](https://meshchatx.com) - Исходный код: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX) -- Официальное зеркало: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — пока также используется для сборок Windows и macOS. -- Релизы: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases) +- Официальное зеркало на GitHub: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) +- Релизы: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) - Журнал изменений: [`CHANGELOG.md`](../CHANGELOG.md) -- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects) + +rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX` +NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu` ## Важные отличия от Reticulum MeshChat -- Используется LXST +- Для вызовов используется LXST - Peewee ORM заменён на прямой SQL - Axios заменён на нативный `fetch` - Electron 41.x (встроенная среда Node 24) @@ -27,7 +29,7 @@ > MeshChatX не гарантирует совместимость данных со старыми версиями Reticulum MeshChat. Сделайте резервную копию перед миграцией или тестированием. > [!WARNING] -> Устаревшие системы пока не полностью поддерживаются. Текущие требования: Python `>=3.11` и Node `>=24` (Electron 41 соответствует Node 24; поле `engines` в `package.json` и CI на той же линии). +> Устаревшие системы пока не поддерживаются. Текущий базис: Python `>=3.11` и Node `>=24` (Electron 41 выровнен с Node 24; поле `engines` в `package.json` и CI на той же линии). ## Требования @@ -53,15 +55,15 @@ task build:all | Python wheel (`.whl`) | Да | Любая архитектура, поддерживаемая Python | Безголовый/веб-сервер без сборки Node | | Linux AppImage | Да | `x64`, `arm64` | Портативное использование на ПК | | Debian-пакет (`.deb`) | Да | `x64`, `arm64` | Установка на Debian/Ubuntu | -| RPM-пакет (`.rpm`) | Да | Зависит от CI | Fedora/RHEL/openSUSE | +| RPM-пакет (`.rpm`) | Да | Зависит от раннера CI для публикуемого артефакта | Fedora/RHEL/openSUSE | | Из исходников | Собирается локально | Архитектура хоста | Разработка и кастомные сборки | Примечания: -- Релизный workflow явно собирает Linux `x64` и `arm64` AppImage + DEB. -- RPM также собирается при попытке и загружается при успехе. +- GitHub Actions собирает помеченные тегом релизы: Windows и macOS в `.github/workflows/build-release.yml`, Linux wheel/AppImage/deb/rpm в `.github/workflows/build-linux-release.yml`, образ контейнера в `.github/workflows/docker.yml`. +- AppImage + DEB для Linux `x64` и `arm64` собираются на GitHub; RPM собирается по возможности и выкладывается, если шаг дал артефакт. -## Быстрый старт: Docker +## Docker - **Docker Hub:** `quad4io/meshchatx` - **GHCR:** `ghcr.io/quad4-software/meshchatx` @@ -70,8 +72,6 @@ task build:all docker compose up -d ``` -То же самое без Compose (тот же порт и том конфигурации): - ```bash docker run -d --name reticulum-meshchatx \ --restart unless-stopped \ @@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \ ghcr.io/quad4-software/meshchatx:latest ``` -Вместо образа можно указать `quad4io/meshchatx:latest` (Docker Hub). +Вместо образа GHCR можно указать `quad4io/meshchatx:latest`, если предпочитаете Docker Hub. Compose-файл по умолчанию: @@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1 - `pnpm install --frozen-lockfile` запрещает обновление `pnpm-lock.yaml` и завершится с ошибкой, если lock-файл не соответствует `package.json`. Это исключает скрытую установку неожиданной upstream-версии. - `verify-store-integrity=true` уже задан в `.npmrc` проекта; явный `pnpm config set` дополнительно ужесточает пользовательскую конфигурацию. -- Lifecycle-скрипты (`preinstall`/`postinstall`) по умолчанию заблокированы в pnpm v10+. Скрипты установки могут запускать только пакеты из `pnpm.onlyBuiltDependencies` в `package.json` (сейчас это `electron`, `electron-winstaller`, `esbuild`, `protobufjs`). +- Lifecycle-скрипты (`preinstall`/`postinstall`) по умолчанию заблокированы в pnpm v10+. Скрипты установки могут запускать только пакеты из `pnpm.onlyBuiltDependencies` в `package.json` (сейчас `electron`, `electron-winstaller`, `esbuild`). - `poetry check --lock` сразу падает, если `poetry.lock` не синхронизирован с `pyproject.toml`; затем `poetry install` ставит зависимости только из lock-файла. - Для строгой установки Poetry только из lock-файла зафиксируйте версию Poetry через `pip install "poetry==2.3.4"`, как это делает CI. @@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1 - [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md) -Та же страница отображается во встроенной **Документации** (документация MeshChatX), когда она отдаётся из `meshchatx-docs`. +Та же страница отображается в списке **Документация** (документация MeshChatX) в приложении, если файлы отдаются из встроенных или синхронизированных `meshchatx-docs`. ## Linux на ПК: шрифты эмодзи @@ -214,6 +214,32 @@ pnpm run dist:rpm task dist:fe:rpm ``` +## Сборка в контейнере (wheel, AppImage, deb, rpm) + +`Dockerfile.build` выполняет те же шаги, что и CI (Poetry, pnpm, `task`, пакетные зависимости APT). Ориентирован на **linux/amd64** (NodeSource amd64, Task amd64). Цель по умолчанию — всё; её можно переопределить build-arg. + +Для `MESHCHATX_BUILD_TARGETS` доступны: `all` (по умолчанию), `wheel` или `electron` (AppImage + deb для x64 и arm64, RPM по возможности, без wheel). + +Сборка: + +```bash +docker build -f Dockerfile.build -t meshchatx-build:local . +``` + +Только wheel: + +```bash +docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel . +``` + +Скопируйте `/artifacts` из готового образа на хост: + +```bash +cid=$(docker create meshchatx-build:local) +docker cp "${cid}:/artifacts" ./meshchatx-artifacts +docker rm "${cid}" +``` + ## Поддержка архитектур - Образ Docker: `amd64`, `arm64` @@ -221,7 +247,7 @@ task dist:fe:rpm - Linux DEB: `x64`, `arm64` - Windows: `x64`, `arm64` (скрипты сборки есть) - macOS: скрипты сборки (`arm64`, `universal`) для локальных сред -- Android: нативные APK — ABI `arm64-v8a`, `x86_64`, плюс universal +- Android: нативные APK — ABI `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), плюс universal ## Android @@ -235,23 +261,26 @@ MeshChatX поддерживает нативные Android APK (не тольк # 1) Собрать колёса Chaquopy для android/app/build.gradle bash scripts/build-android-wheels-local.sh -# 2) Собрать универсальные APK (debug и release; см. android/README.md) +# 2) Собрать universal APK (один debug + один release за прогон; см. android/README.md) cd android ./gradlew --no-daemon :app:assembleDebug :app:assembleRelease ``` -Одна вариант-сборка Android (без flavor `slim` / `full`). Gradle синхронизирует весь `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. **ABI-упаковка:** `universal` (по умолчанию) или `split` (см. `android/app/build.gradle`). +**Один** вариант Android. Gradle синхронизирует весь каталог `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. **Упаковка ABI:** `universal` (по умолчанию) или `split` (см. `android/app/build.gradle`). -При **`-PmeshchatxAbiPackaging=universal`** (по умолчанию): +С **`-PmeshchatxAbiPackaging=universal`** (по умолчанию) у каждого типа сборки один APK со всеми выбранными ABI: -- Отладка: `android/app/build/outputs/apk/debug/app-debug.apk` -- Релиз: `android/app/build/outputs/apk/release/app-release-unsigned.apk` +- Debug: `android/app/build/outputs/apk/debug/app-debug.apk` +- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk` + +С **`-PmeshchatxAbiPackaging=split`** и более чем одним ABI в `-PmeshchatxAbis` Gradle может выдавать отдельные APK по ABI, как в [`android/README.md`](../android/README.md). Примечания: -- Релизы по умолчанию не подписаны (`scripts/sign-android-apks.sh`). -- ABI: `-PmeshchatxAbis` или `MESHCHATX_ABIS`; упаковка: `-PmeshchatxAbiPackaging` или `MESHCHATX_ABI_PACKAGING`. -- Если в корне репозитория есть `dist/reticulum_meshchatx-*.whl` (например после `python -m build --wheel -o dist .`), оно предпочитается при бандле. Подробнее в [`android/README.md`](../android/README.md). +- Релизы по умолчанию не подписаны, пока не настроена подпись (`scripts/sign-android-apks.sh`). +- Android ориентируется на ABI из `android/app/build.gradle` (в т.ч. `armeabi-v7a`, если включён). Сборка колёс для `armeabi-v7a` требует Android SDK в `ANDROID_HOME` (см. `android/README.md`). +- Список ABI: `-PmeshchatxAbis` или `MESHCHATX_ABIS`. Упаковка: `-PmeshchatxAbiPackaging=universal|split` или `MESHCHATX_ABI_PACKAGING`. +- Если в корне репо есть `dist/reticulum_meshchatx-*.whl` (например из `python -m build --wheel -o dist .`), обновление встроенного репозитория предпочитает эту wheel пакету MeshChatX с PyPI. В CI wheel собирается до шага Android Gradle. Дополнительная документация: @@ -305,51 +334,50 @@ task build:all Текущая версия в репозитории: `4.6.0`. -- Источник версии JS/Electron — `package.json`. -- `meshchatx/src/version.py` синхронизируется из `package.json`: - -```bash -pnpm run version:sync -``` - -Для согласованных релизов выравнивайте поля версий где нужно (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`). +- Редактируйте для релизного бампа **только** поле `version` в **`package.json`**. +- Команда **`pnpm run version:sync`** (также в начале **`pnpm run build`**) распространяет эту версию в **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (строка продукта), **README** / **lang/README.\*** (строки «текущая версия»), **`docs/meshchatx_on_raspberry_pi.md`** (пример pipx) и вспомогательные поля **`packaging/arch/PKGBUILD`**. +- **`meshchatx.__version__`** читается из **`meshchatx/src/version.py`** без импорта **`meshchatx.src`**, поэтому обычный `import meshchatx` остаётся лёгким. +- Записи **changelog** по-прежнему вносятся вручную при релизе. ## Безопасность - [`SECURITY.md`](../SECURITY.md) -- Встроенные проверки целостности и HTTPS/WSS по умолчанию в приложении -- CI и релизы в `.github/workflows/`; на Gitea только `.gitea/workflows/github-release-sync.yml` для выгрузки релизов на GitHub (см. `SECURITY.md`) +- [`LEGAL.md`](../LEGAL.md) +- Встроенные проверки целостности и значения по умолчанию HTTPS/WSS в рантайме приложения. +- Сборка CI и релизы на GitHub Actions. ## Добавление языка -Обнаружение локали происходит автоматически. Добавьте новый файл в `meshchatx/src/frontend/locales/` (например `xx.json`) с теми же ключами, что и в `en.json`, и полем `_languageName` в начале для подписи в селекторе языка. Можно скопировать `en.json` и перевести всё вручную; **автоматическая генерация (Argos и т. п.) необязательна** и не требуется. +Авторский рабочий процесс: ArgosTranslate, затем локальная LLM (Qwen 3 + Gemma 4). -**Исправления и переводы от людей приветствуются.** Улучшения существующих файлов локали или полностью ручной перевод можно прислать через pull request или issue в [исходном репозитории](https://git.quad4.io/RNS-Things/MeshChatX) или на [зеркале GitHub](https://github.com/Quad4-Software/MeshChatX). +Затем правки и улучшения от сообщества приветствуются — через LXMF или любой доступный канал. -**По желанию: черновик через Argos Translate** -- если нужен машинный первый проход из `en.json`, можно использовать `scripts/argos_translate.py`. Он обрабатывает форматирование и помогает защитить переменные интерполяции (например `{count}`). +Обнаружение локали автоматическое. Добавьте файл в `meshchatx/src/frontend/locales/` (например `xx.json`) с теми же ключами, что в `en.json`, и строку верхнего уровня `_languageName` для подписи в селекторе. Можно скопировать `en.json` и перевести вручную; **машинная генерация (в т. ч. Argos) необязательна** и никогда не требуется. + +**По желанию: старт с Argos Translate** — для чернового перевода из `en.json` можно вызвать `scripts/argos_translate.py` (форматирование, цветной вывод, защита плейсхолдеров вроде `{count}`). ```bash -# Установите argostranslate, если вы еще этого не сделали -pip install argostranslate +# Установите argostranslate при необходимости +pipx install argostranslate # Запустите скрипт перевода -python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Название вашего языка" +python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Название языка" ``` -После машинного черновика имеет смысл проверить грамматику, контекст и тон с помощью LLM или человека (формальный или неформальный стиль). +После любой машинной прогонки пусть LLM или человек проверяет грамматику, контекст и тон (например формальный/неформальный стиль). -Проверьте совпадение ключей с помощью: `pnpm test -- tests/frontend/i18n.test.js --run` +`pnpm test -- tests/frontend/i18n.test.js --run` — проверка равенства ключей с `en.json`. Никаких других изменений в коде не требуется. Приложение, селектор языка и тесты обнаруживают локали из каталога `meshchatx/src/frontend/locales/` во время сборки. ## Авторы - [Liam Cottle](https://github.com/liamcottle) — оригинальный Reticulum MeshChat -- [RFnexus](https://github.com/RFnexus) — парсер Micron (JavaScript) +- [RFnexus](https://github.com/RFnexus) — парсер micron (JavaScript) - [markqvist](https://github.com/markqvist) — Reticulum, LXMF, LXST ## Лицензия Собственные части проекта лицензированы по 0BSD. -Оригинальные upstream-части, унаследованные от MeshChat, остаются под MIT. +Оригинальные upstream-части из Reticulum MeshChat остаются под MIT. Полный текст и уведомления см. в [`../LICENSE`](../LICENSE). diff --git a/lang/README.zh.md b/lang/README.zh.md index 83c1422..b3a926e 100644 --- a/lang/README.zh.md +++ b/lang/README.zh.md @@ -8,14 +8,16 @@ Liam Cottle 开发的 Reticulum MeshChat 的一个功能丰富的深度修改分 - 网站: [meshchatx.com](https://meshchatx.com) - 源码: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX) -- 官方镜像: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — 目前亦用于 Windows 与 macOS 构建。 -- 发行版: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases) +- 官方 GitHub 镜像: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) +- 发行版: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) - 变更日志: [`CHANGELOG.md`](../CHANGELOG.md) -- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects) + +rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX` +NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu` ## 与 Reticulum MeshChat 的重要差异 -- 使用 LXST +- 通话使用 LXST - 以原生 SQL 替代 Peewee ORM - 以原生 `fetch` 替代 Axios - 使用 Electron 41.x(内置 Node 24 运行时) @@ -27,7 +29,7 @@ Liam Cottle 开发的 Reticulum MeshChat 的一个功能丰富的深度修改分 > MeshChatX 不保证与旧版 Reticulum MeshChat 的数据兼容。迁移或测试前请备份数据。 > [!WARNING] -> 旧系统尚未完全支持。当前最低要求:Python `>=3.11`,Node `>=24`(Electron 41 与 Node 24 一致;`package.json` 的 `engines` 与 CI 同一基线)。 +> 旧系统尚不支持。当前基线为 Python `>=3.11` 与 Node `>=24`(Electron 41 与 Node 24 一致;`package.json` 的 `engines` 与 CI 同一基线)。 ## 系统要求 @@ -53,15 +55,15 @@ task build:all | Python wheel (`.whl`) | 是 | 任何 Python 支持的架构 | 无需 Node 构建的无头/Web 服务器安装 | | Linux AppImage | 是 | `x64`, `arm64` | 便携式桌面使用 | | Debian 包 (`.deb`) | 是 | `x64`, `arm64` | Debian/Ubuntu 安装 | -| RPM 包 (`.rpm`) | 是 | 取决于 CI | Fedora/RHEL/openSUSE | +| RPM 包 (`.rpm`) | 是 | 取决于发布所用 CI 运行环境 | Fedora/RHEL/openSUSE | | 从源码 | 本地构建 | 主机架构 | 开发与自定义构建 | 说明: -- 发布工作流明确构建 Linux `x64` 与 `arm64` 的 AppImage + DEB。 -- RPM 亦会尝试构建,成功时上传。 +- GitHub Actions 构建带标签的发行版:Windows 与 macOS 见 `.github/workflows/build-release.yml`,Linux wheel/AppImage/deb/rpm 见 `.github/workflows/build-linux-release.yml`,容器镜像见 `.github/workflows/docker.yml`。 +- Linux `x64` 与 `arm64` 的 AppImage + DEB 在 GitHub 上构建;RPM 会尝试构建,产出则上传。 -## 快速开始: Docker +## Docker - **Docker Hub:** `quad4io/meshchatx` - **GHCR:** `ghcr.io/quad4-software/meshchatx` @@ -70,8 +72,6 @@ task build:all docker compose up -d ``` -不使用 Compose 时的等效命令(相同的端口绑定与配置卷): - ```bash docker run -d --name reticulum-meshchatx \ --restart unless-stopped \ @@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \ ghcr.io/quad4-software/meshchatx:latest ``` -镜像也可换为 Docker Hub 的 `quad4io/meshchatx:latest`。 +若倾向 Docker Hub,可将镜像换为 `quad4io/meshchatx:latest`。 默认 compose 文件映射: @@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1 - `pnpm install --frozen-lockfile` 禁止更新 `pnpm-lock.yaml`,若 lockfile 与 `package.json` 不一致则直接失败。这能阻止意外的上游版本被静默安装。 - `verify-store-integrity=true` 已在项目的 `.npmrc` 中设置;显式的 `pnpm config set` 行同时加固用户级配置。 -- pnpm v10+ 默认禁用所有生命周期脚本(`preinstall`/`postinstall`)。仅 `package.json` 中 `pnpm.onlyBuiltDependencies` 列出的包允许执行安装脚本(当前为 `electron`、`electron-winstaller`、`esbuild`、`protobufjs`)。 +- pnpm v10+ 默认禁用所有生命周期脚本(`preinstall`/`postinstall`)。仅 `package.json` 中 `pnpm.onlyBuiltDependencies` 列出的包允许执行安装脚本(当前为 `electron`、`electron-winstaller`、`esbuild`)。 - `poetry check --lock` 会在 `poetry.lock` 与 `pyproject.toml` 不同步时立即失败;随后的 `poetry install` 只会从 lock 文件解析依赖。 - 若需严格按 lock 文件安装 Poetry 依赖(不进行隐式刷新),用 `pip install "poetry==2.3.4"` 固定 Poetry 版本,与 CI 保持一致。 @@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1 - [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md) -在提供已捆绑或已同步的 `meshchatx-docs` 时,应用内 **文档**(MeshChatX 文档)列表亦会显示同一页面。 +从已捆绑或已同步的 `meshchatx-docs` 文件提供服务时,应用内 **文档** 列表(MeshChatX 文档)亦会显示同一页面。 ## Linux 桌面:绘文字字体 @@ -214,6 +214,32 @@ pnpm run dist:rpm task dist:fe:rpm ``` +## 容器构建(wheel、AppImage、deb、rpm) + +`Dockerfile.build` 执行与 CI 相同的步骤(Poetry、pnpm、`task`、APT 等)。面向 **linux/amd64**(NodeSource amd64 压缩包、Task amd64 二进制)。默认目标为全部;可用 build 参数覆盖。 + +`MESHCHATX_BUILD_TARGETS` 可选:`all`(默认)、`wheel` 或 `electron`(x64 与 arm64 的 AppImage + deb、尽力构建 RPM、不含 wheel)。 + +构建: + +```bash +docker build -f Dockerfile.build -t meshchatx-build:local . +``` + +仅 wheel: + +```bash +docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel . +``` + +将完成镜像中的 `/artifacts` 拷到本机: + +```bash +cid=$(docker create meshchatx-build:local) +docker cp "${cid}:/artifacts" ./meshchatx-artifacts +docker rm "${cid}" +``` + ## 架构支持 - Docker 镜像: `amd64`, `arm64` @@ -221,7 +247,7 @@ task dist:fe:rpm - Linux DEB: `x64`, `arm64` - Windows: `x64`, `arm64`(提供构建脚本) - macOS: 提供构建脚本(`arm64`、`universal`),适用于本地构建环境 -- Android: 原生 APK — ABI `arm64-v8a`、`x86_64` 与 universal +- Android: 原生 APK — ABI `arm64-v8a`、`x86_64`、`armeabi-v7a`(32 位 ARM),以及 universal ## Android @@ -235,23 +261,26 @@ MeshChatX 支持构建原生 Android APK(不仅限于 Termux)。 # 1) 构建 android/app/build.gradle 所需的 Chaquopy 轮子 bash scripts/build-android-wheels-local.sh -# 2) 构建通用 APK(一次 debug + 一次 release;见 android/README.md) +# 2) 构建 universal APK(每次运行各一 debug + 一 release;见 android/README.md) cd android ./gradlew --no-daemon :app:assembleDebug :app:assembleRelease ``` -仅一种 Android 变体(无 `slim` / `full` flavor)。Gradle 将完整 `meshchatx/` 同步到 `app/src/main/python/meshchatx/`,含离线仓库 wheel。**ABI 打包:** `universal`(默认)或 `split`(见 `android/app/build.gradle`)。 +**单一** Android 变体。Gradle 将完整 `meshchatx/` 树同步到 `app/src/main/python/meshchatx/`,含离线仓库 wheel 包。**ABI 打包:** `universal`(默认)或 `split`(见 `android/app/build.gradle`)。 -**`-PmeshchatxAbiPackaging=universal`**(默认)时: +**`-PmeshchatxAbiPackaging=universal`**(默认)下,每种构建类型各一个包含所有已选 ABI 的 APK: - 调试:`android/app/build/outputs/apk/debug/app-debug.apk` - 发布:`android/app/build/outputs/apk/release/app-release-unsigned.apk` +**`-PmeshchatxAbiPackaging=split`** 且 `-PmeshchatxAbis` 含多个 ABI 时,Gradle 可能按 ABI 分别产出 APK,见 [`android/README.md`](../android/README.md)。 + 说明: -- 发布构建默认未签名(`scripts/sign-android-apks.sh`)。 -- ABI:`-PmeshchatxAbis` 或 `MESHCHATX_ABIS`;打包:`-PmeshchatxAbiPackaging` 或 `MESHCHATX_ABI_PACKAGING`。 -- 若仓库根存在 `dist/reticulum_meshchatx-*.whl`(例如 `python -m build --wheel -o dist .` 后),捆绑时优先使用该 wheel。详见 [`android/README.md`](../android/README.md)。 +- 发布产物默认未签名,除非配置签名(`scripts/sign-android-apks.sh`)。 +- Android 目标 ABI 以 `android/app/build.gradle` 为准(含启用时的 `armeabi-v7a`)。为 `armeabi-v7a` 构建 wheel 需本机 `ANDROID_HOME` 上有 Android SDK(见 `android/README.md`)。 +- 覆盖 ABI:`-PmeshchatxAbis` 或 `MESHCHATX_ABIS`。打包:`-PmeshchatxAbiPackaging=universal|split` 或 `MESHCHATX_ABI_PACKAGING`。 +- 若仓库根存在 `dist/reticulum_meshchatx-*.whl`(例如 `python -m build --wheel -o dist .`),刷新内置仓库时优先于 PyPI 使用该 MeshChatX wheel。CI 在 Android Gradle 步骤前会构建该 wheel。 更多文档: @@ -270,7 +299,7 @@ cd android | `--headless` | `MESHCHAT_HEADLESS` | `false` | 不自动打开浏览器 | | `--auth` | `MESHCHAT_AUTH` | `false` | 启用基本认证 | | `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | 数据目录 | -| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自动/捆绑 | 前端文件目录(无捆绑资源安装时需要) | +| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自动/捆绑 | 前端文件目录(源码安装且未捆绑资源时需要) | ## 分支 @@ -301,55 +330,54 @@ task build:all | `make test` | 运行前端与后端测试 | | `make clean` | 移除构建产物与 node_modules | -## 版本 +## 版本管理 本仓库当前版本: `4.6.0`。 -- JavaScript/Electron 版本以 `package.json` 为准。 -- `meshchatx/src/version.py` 通过以下命令与 `package.json` 同步: - -```bash -pnpm run version:sync -``` - -发布时请保持相关字段一致(`package.json`、`pyproject.toml`、`meshchatx/__init__.py`)。 +- 发布版本号**只**改 **`package.json` 的 `version`**。 +- 运行 **`pnpm run version:sync`**(在 **`pnpm run build`** 开头也会执行)可将该版本同步到 **`pyproject.toml`**、**`meshchatx/src/version.py`**、**`THIRD_PARTY_NOTICES.txt`**(产品行)、**README** / **lang/README.\*** 中的“当前版本”行、**`docs/meshchatx_on_raspberry_pi.md`** 的 pipx 示例,以及 **`packaging/arch/PKGBUILD`** 的辅助字段。 +- **`meshchatx.__version__`** 从 **`meshchatx/src/version.py`** 读取且不导入 **`meshchatx.src`**,因此普通 `import meshchatx` 仍很轻量。 +- **变更日志**在发版时仍由人工维护。 ## 安全 - [`SECURITY.md`](../SECURITY.md) -- 应用内置完整性检查与默认 HTTPS/WSS -- CI 与发版在 `.github/workflows/`;Gitea 仅保留 `.gitea/workflows/github-release-sync.yml` 用于同步 GitHub Release(见 `SECURITY.md`) +- [`LEGAL.md`](../LEGAL.md) +- 应用运行时内置完整性检查与默认 HTTPS/WSS。 +- CI 与发行构建在 GitHub Actions。 ## 添加语言 -语言检测是自动的。在 `meshchatx/src/frontend/locales/` 下新增 JSON 文件(例如 `xx.json`),键与 `en.json` 一致,并在顶层设置 `_languageName` 作为语言选择器中的显示名称。可以复制 `en.json` 后完全人工翻译;**使用 Argos 等机器辅助生成是可选的**,并非必需。 +作者流程:ArgosTranslate,再到本地 LLM(Qwen 3 + Gemma 4)。 -**欢迎提交纠错与人工翻译。** 若修正现有语言文件或提交完整人工翻译,请通过合并请求或议题提交至[项目源码仓库](https://git.quad4.io/RNS-Things/MeshChatX)或 [GitHub 镜像](https://github.com/Quad4-Software/MeshChatX)。 +之后欢迎通过 LXMF 或其他方式提交修正。 -**可选:Argos Translate 初稿** -- 若需要从 `en.json` 生成机器翻译初稿,可使用 `scripts/argos_translate.py`。它会处理格式并有助于保护插值变量(如 `{count}`)。 +语言环境为自动发现。在 `meshchatx/src/frontend/locales/` 添加新文件(如 `xx.json`),键与 `en.json` 相同,并设顶层 `_languageName` 作为选择器标签。可复制 `en.json` 全手工翻译;**机器辅助生成(可选)**从不要求。 + +**可选:Argos Translate 起步** -- 若需从 `en.json` 生成初稿,可使用 `scripts/argos_translate.py`(处理格式、彩色输出,并保护如 `{count}` 的插值变量)。 ```bash -# 如果尚未安装,请安装 argostranslate -pip install argostranslate +# 若尚未安装 argostranslate +pipx install argostranslate # 运行翻译脚本 python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "您的语言名称" ``` -机器初稿之后,建议由 LLM 或人工审校语法、语境与语气(如正式与非正式)。 +任何机器辅助之后,请用 LLM 或人工核对语法、语境与语气(如正式/非正式)。 -运行 `pnpm test -- tests/frontend/i18n.test.js --run` 验证与 `en.json` 的键一致性。 +运行 `pnpm test -- tests/frontend/i18n.test.js --run` 校验与 `en.json` 的键一致。 不需要其他代码更改。应用程序、语言选择器和测试在构建时从 `meshchatx/src/frontend/locales/` 目录发现所有语言环境。 ## 致谢 - [Liam Cottle](https://github.com/liamcottle) - 原始 Reticulum MeshChat -- [RFnexus](https://github.com/RFnexus) - Micron 解析器(JavaScript) +- [RFnexus](https://github.com/RFnexus) - micron 解析器(JavaScript) - [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST ## 许可证 项目自有部分采用 0BSD 许可。 -源自 MeshChat 的原始上游部分继续采用 MIT 许可。 +源自 Reticulum MeshChat 的原始上游部分继续采用 MIT 许可。 完整文本与声明请见 [`../LICENSE`](../LICENSE)。