0.3.1-0-pre.2.fix.3
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# file: Cargo.toml
|
||||
# version: 73
|
||||
# version: 74
|
||||
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
@@ -21,7 +21,7 @@ members = [
|
||||
]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.3.1-0-pre.2.fix.2"
|
||||
version = "0.3.1-0-pre.2.fix.3"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/games"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: README.md -->
|
||||
<!-- version: 44 -->
|
||||
<!-- version: 45 -->
|
||||
|
||||
# games.sasedev
|
||||
|
||||
@@ -26,7 +26,7 @@ Workspace expérimental puis productif pour des jeux multiplateformes principale
|
||||
|
||||
Version stable de référence : `0.3.0`.
|
||||
|
||||
Version de développement courante : `0.3.1-0-pre.2.fix.2`.
|
||||
Version de développement courante : `0.3.1-0-pre.2.fix.3`.
|
||||
|
||||
Les deux premiers jeux sont des POC structurels : `game-reflex-poc` et `game-snake-poc`. Ils existent d'abord pour valider les frontières du workspace, le moteur, les assets et le packaging multiplateforme.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/apps/game-snake-poc-tauri/README.md -->
|
||||
<!-- version: 3 -->
|
||||
<!-- version: 4 -->
|
||||
|
||||
# game-snake-poc-tauri
|
||||
|
||||
@@ -22,6 +22,6 @@ Le frontend minimal de `0.3.1-0-pre.2` valide uniquement le démarrage Tauri, le
|
||||
|
||||
Les hooks `beforeDevCommand` et `beforeBuildCommand` de Tauri possèdent le build WASM et Vite. Aucun orchestrateur Python n'est utilisé. Les bindings WASM, la distribution Vite, les caches, `node_modules/` et le projet Android généré restent hors des sources livrées ou dans des chemins générés ignorés.
|
||||
|
||||
Le host ne modifie pas le projet Android généré par Tauri. La branche stable Tauri 2.11.x conserve son propre wrapper Gradle ; les commandes Android doivent donc s'exécuter avec un JDK compatible avec cette chaîne. Pour la machine de validation, `JAVA_HOME` doit pointer vers le JBR fourni par Android Studio (ou vers un autre JDK compatible), plutôt que vers le Java 25 global.
|
||||
Le host ne modifie pas le projet Android généré par Tauri. Pour `0.3.1`, la chaîne Tauri 2.11.x est conservée telle que générée : Gradle `8.14.3` et Android Gradle Plugin `8.11.0`. Le JDK Android de référence du projet est JDK 17, qui correspond au minimum et à la valeur par défaut documentés par AGP 8.11. Le Java 25 global et le JBR 25 de l'Android Studio actuellement installé ne doivent pas exécuter ce wrapper.
|
||||
|
||||
Voir [`USAGE.md`](USAGE.md) pour l'initialisation locale et les smokes Android.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/apps/game-snake-poc-tauri/USAGE.md -->
|
||||
<!-- version: 3 -->
|
||||
<!-- version: 4 -->
|
||||
|
||||
# Utilisation — Snake Tauri Android
|
||||
|
||||
@@ -9,16 +9,18 @@ Le host utilise Cargo/Rust, `cargo tauri`, Node/npm, `wasm-bindgen`, Java et le
|
||||
|
||||
`NDK_HOME` n'est pas un prérequis utilisateur du projet. Tauri sélectionne la version NDK side-by-side appropriée sous `$ANDROID_HOME/ndk/<version>` et peut injecter lui-même `NDK_HOME` dans ses sous-processus Android. Une variable globale ne doit donc pas être ajoutée uniquement pour satisfaire la documentation générique de Tauri.
|
||||
|
||||
Pour Android, `JAVA_HOME` doit pointer vers un JDK compatible avec la chaîne Gradle générée par la version stable de Tauri 2 utilisée par le projet. La documentation Tauri recommande le JBR fourni par Android Studio. Le Java 25 global de la machine de validation n'est pas utilisé pour les commandes Tauri Android tant qu'il reste incompatible avec le wrapper Gradle stable. Le Gradle global installé sur la machine n'est pas utilisé par `gradlew` et n'est pas un prérequis du projet.
|
||||
Pour `0.3.1`, le JDK Android de référence est **JDK 17**. Le template Tauri 2.11.x utilisé par le projet génère Gradle `8.14.3` avec Android Gradle Plugin `8.11.0` : AGP 8.11 exige au minimum JDK 17 et Gradle 8.14.x ne peut pas s'exécuter sur Java 25. JDK 17 fournit donc la baseline reproductible commune aux deux contraintes.
|
||||
|
||||
Exemple lorsque Android Studio est installé sous `/opt/android-studio` :
|
||||
Le Java 25 global de la machine de validation peut rester installé. En revanche, le JBR de l'Android Studio actuellement installé est lui aussi Java 25 et ne doit donc pas être utilisé pour cette gate malgré la recommandation générique de Tauri d'utiliser le JBR d'Android Studio. Le Gradle global installé sur la machine n'est pas utilisé par `gen/android/gradlew` et n'est pas un prérequis du projet.
|
||||
|
||||
Avant une commande Tauri Android, sélectionner explicitement un JDK 17 installé et vérifier la version :
|
||||
|
||||
```bash
|
||||
export JAVA_HOME=/opt/android-studio/jbr
|
||||
export JAVA_HOME=/chemin/vers/jdk-17
|
||||
"$JAVA_HOME/bin/java" -version
|
||||
```
|
||||
|
||||
Si Android Studio se trouve ailleurs, utiliser le chemin réel de son répertoire `jbr`. Ne pas modifier `gen/android` pour contourner une incompatibilité de JDK.
|
||||
Ne pas modifier `gen/android` pour contourner une incompatibilité de JDK.
|
||||
|
||||
Pour les cibles actuellement disponibles, `aarch64-linux-android` permet le smoke sur l'appareil ARM64 et `x86_64-linux-android` celui des AVD x86_64. Les autres ABI ne sont pas requises pour `0-pre.2`.
|
||||
|
||||
@@ -36,7 +38,16 @@ Initialiser une fois le projet Android généré par Tauri :
|
||||
(cd crates/apps/game-snake-poc-tauri && cargo tauri android init)
|
||||
```
|
||||
|
||||
Le répertoire `gen/` produit par Tauri est généré et ignoré ; il n'appartient pas aux deltas et ne doit pas être patché par des scripts propres au jeu. Une initialisation déjà réalisée reste utilisable ; il n'est pas nécessaire de rejouer `android init` pour ce fix.
|
||||
Le répertoire `gen/` produit par Tauri est généré et ignoré ; il n'appartient pas aux deltas et ne doit pas être patché par des scripts propres au jeu.
|
||||
|
||||
Si ce répertoire a été créé ou modifié par `0-pre.2.fix.1`, il est pollué par la tentative abandonnée de migration Gradle 9. Il faut alors le régénérer intégralement avec la CLI Tauri officielle, sous JDK 17 :
|
||||
|
||||
```bash
|
||||
rm -rf crates/apps/game-snake-poc-tauri/gen/android
|
||||
(cd crates/apps/game-snake-poc-tauri && cargo tauri android init)
|
||||
```
|
||||
|
||||
L'audit de distribution vérifie désormais un `gen/android` présent et refuse un wrapper/AGP qui ne correspondent pas au template Tauri 2.11.x attendu.
|
||||
|
||||
## Smoke Android de développement
|
||||
|
||||
|
||||
128
deltas/0.3.1/0-pre.2.fix.3.md
Normal file
128
deltas/0.3.1/0-pre.2.fix.3.md
Normal file
@@ -0,0 +1,128 @@
|
||||
<!-- file: deltas/0.3.1/0-pre.2.fix.3.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta 0.3.1-0-pre.2.fix.3
|
||||
|
||||
## Base
|
||||
|
||||
Base déclarée : `0.3.1-0-pre.2.fix.2`.
|
||||
|
||||
## Objet
|
||||
|
||||
Ce fix corrige la procédure Android après constat que le répertoire local `gen/android` avait été partiellement modifié par la tentative Gradle 9 abandonnée de `0-pre.2.fix.1`.
|
||||
|
||||
Aucun patch du projet Android généré n'est réintroduit. Le fix verrouille au contraire le contrat officiel Tauri 2.11.x et rend détectable tout `gen/android` local qui ne correspond plus à ce contrat.
|
||||
|
||||
## Diagnostic confirmé
|
||||
|
||||
Le smoke `0-pre.2.fix.2` a confirmé :
|
||||
|
||||
- les audits Python, Cargo, Clippy et les cinq tests `game-snake-poc-wasm` sont propres ;
|
||||
- le NDK side-by-side est détecté sans `NDK_HOME` utilisateur ;
|
||||
- le JBR de l'Android Studio local est Java 25, comme le Java global ;
|
||||
- `gen/android/gradle/wrapper/gradle-wrapper.properties` utilisait encore Gradle `9.6.1`, trace de `fix.1` ;
|
||||
- `buildSrc` restait partiellement au format Tauri 2.11.x et échouait donc sous Gradle 9 sur les appels `project.exec`/`exec`.
|
||||
|
||||
Le défaut n'est pas dans le host Rust/WASM : l'arbre Android généré local est incohérent et doit être régénéré.
|
||||
|
||||
## Toolchain Android retenu pour 0.3.1
|
||||
|
||||
Le projet conserve le template officiel Tauri 2.11.x :
|
||||
|
||||
```text
|
||||
Gradle 8.14.3
|
||||
Android Gradle Plugin 8.11.0
|
||||
Kotlin Gradle Plugin 1.9.25
|
||||
JDK de gate 17
|
||||
```
|
||||
|
||||
AGP 8.11 exige JDK 17 au minimum et Gradle 8.14.x prend en charge l'exécution jusqu'à Java 24, pas Java 25. JDK 17 est donc la baseline reproductible retenue pour cette version.
|
||||
|
||||
Le Java 25 global et le JBR 25 d'Android Studio restent installables mais ne sont pas utilisés pour `cargo tauri android init/dev/build` dans `0.3.1`.
|
||||
|
||||
## Régénération obligatoire du projet Android local
|
||||
|
||||
Toute machine ayant exécuté `0-pre.2.fix.1` doit supprimer uniquement l'arbre généré Android Snake puis le recréer officiellement :
|
||||
|
||||
```bash
|
||||
rm -rf crates/apps/game-snake-poc-tauri/gen/android
|
||||
export JAVA_HOME=/chemin/vers/jdk-17
|
||||
"$JAVA_HOME/bin/java" -version
|
||||
(cd crates/apps/game-snake-poc-tauri && cargo tauri android init)
|
||||
```
|
||||
|
||||
Le répertoire `gen/android` est ignoré et n'appartient à aucun delta. Sa suppression n'est donc pas un changement source.
|
||||
|
||||
## Audit ajouté
|
||||
|
||||
`audit_distribution_layout.py` vérifie désormais un `gen/android` présent sans le considérer comme source versionnée. Pour la tranche courante, il doit contenir les marqueurs du template Tauri 2.11.x : Gradle `8.14.3`, AGP `8.11.0` et Kotlin Gradle Plugin `1.9.25`.
|
||||
|
||||
Un arbre incomplet ou divergent provoque `DIST-LAYOUT-041/042` avec instruction de le supprimer puis de relancer `cargo tauri android init` sous JDK 17.
|
||||
|
||||
## Fichiers modifiés
|
||||
|
||||
- `Cargo.toml` ;
|
||||
- `README.md` ;
|
||||
- `crates/apps/game-snake-poc-tauri/README.md` ;
|
||||
- `crates/apps/game-snake-poc-tauri/USAGE.md` ;
|
||||
- `docs/plans/002-V0_3_1_TAURI_ANDROID_SNAKE_PLAN.md` ;
|
||||
- `docs/validation/001-VALIDATION_GATES.md` ;
|
||||
- `scripts/audit_distribution_layout.py`.
|
||||
|
||||
## Fichier ajouté
|
||||
|
||||
- `deltas/0.3.1/0-pre.2.fix.3.md`.
|
||||
|
||||
## Gate utilisateur
|
||||
|
||||
Après application du delta, commencer par disposer d'un JDK 17. Vérifier les JDK déjà installés avant d'en installer un nouveau :
|
||||
|
||||
```bash
|
||||
find /usr/lib/jvm "$HOME/.jdks" "$HOME/.sdkman/candidates/java" -maxdepth 3 -type f -path '*/bin/java' 2>/dev/null
|
||||
```
|
||||
|
||||
Sélectionner ensuite le JDK 17 réel :
|
||||
|
||||
```bash
|
||||
export JAVA_HOME=/chemin/vers/jdk-17
|
||||
"$JAVA_HOME/bin/java" -version
|
||||
```
|
||||
|
||||
Nettoyer l'arbre Android pollué par `fix.1`, puis le régénérer avec Tauri :
|
||||
|
||||
```bash
|
||||
rm -rf crates/apps/game-snake-poc-tauri/gen/android
|
||||
(cd crates/apps/game-snake-poc-tauri && cargo tauri android init)
|
||||
```
|
||||
|
||||
Rejouer ensuite la gate statique/build :
|
||||
|
||||
```bash
|
||||
python3 scripts/audit_rust_workspace_rules.py
|
||||
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates Android Web deltas history
|
||||
python3 scripts/audit_distribution_layout.py
|
||||
|
||||
cargo fmt --all
|
||||
cargo fmt --all -- --check
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||
cargo test -p game-snake-poc-wasm --all-targets --all-features
|
||||
```
|
||||
|
||||
Puis le smoke Android :
|
||||
|
||||
```bash
|
||||
(cd crates/apps/game-snake-poc-tauri && cargo tauri android dev)
|
||||
```
|
||||
|
||||
Ne pas exécuter `npm run dev` directement et ne modifier aucun fichier sous `gen/android` à la main.
|
||||
|
||||
## Critère d'acceptation
|
||||
|
||||
Le fix est accepté lorsque :
|
||||
|
||||
- les audits et gates Rust restent propres ;
|
||||
- `audit_distribution_layout.py` accepte le `gen/android` fraîchement généré ;
|
||||
- `gen/android/gradle/wrapper/gradle-wrapper.properties` référence Gradle `8.14.3` ;
|
||||
- la commande Android utilise JDK 17 ;
|
||||
- `cargo tauri android dev` assemble, installe et lance le host minimal sans erreur Gradle/Kotlin bloquante.
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/002-V0_3_1_TAURI_ANDROID_SNAKE_PLAN.md -->
|
||||
<!-- version: 4 -->
|
||||
<!-- version: 5 -->
|
||||
|
||||
# Plan v0.3.1 — second host Snake Tauri Android
|
||||
|
||||
@@ -77,7 +77,7 @@ La tranche vise un premier démarrage Tauri Android minimal, pas encore toute la
|
||||
|
||||
Gate utilisateur : audits, Cargo workspace strict, test ciblé de l'adapter WASM, non-régression du build Web direct, `cargo tauri android init` puis `cargo tauri android dev` sur un AVD ou appareil disponible. `cargo tauri android build` reste reporté aux phases finales sauf besoin diagnostique.
|
||||
|
||||
Le premier smoke `0-pre.2` a révélé deux défauts bornés : `build.rs` échouait sous Clippy strict à cause de la rustdoc manquante, et Java 25 ne pouvait pas exécuter le wrapper Gradle `8.14.3` généré par Tauri CLI `2.11.3`. `0-pre.2.fix.1` a tenté de migrer localement le scaffold généré vers Gradle 9 ; cette approche est abandonnée par `0-pre.2.fix.2` car la branche stable Tauri 2.11.x n'a pas encore publié cette migration et le projet ne doit pas maintenir un fork implicite des templates Android Tauri. Le fix utilise donc la chaîne Android générée officiellement par Tauri stable et impose pour les commandes Android un `JAVA_HOME` compatible, de préférence le JBR fourni par Android Studio. Le Gradle global de la machine ne fait pas partie du contrat reproductible.
|
||||
Le premier smoke `0-pre.2` a révélé deux défauts bornés : `build.rs` échouait sous Clippy strict à cause de la rustdoc manquante, et Java 25 ne pouvait pas exécuter le wrapper Gradle `8.14.3` généré par Tauri CLI `2.11.3`. `0-pre.2.fix.1` a tenté de migrer localement le scaffold généré vers Gradle 9 ; cette approche est abandonnée à partir de `0-pre.2.fix.2` car la branche stable Tauri 2.11.x n'a pas encore publié cette migration et le projet ne doit pas maintenir un fork implicite des templates Android Tauri. `0-pre.2.fix.3` fixe JDK 17 comme baseline Android reproductible pour la chaîne officielle Gradle `8.14.3` + AGP `8.11.0` et impose la régénération de tout `gen/android` touché par la tentative `fix.1`. Le Gradle global de la machine ne fait pas partie du contrat reproductible.
|
||||
|
||||
### `0-pre.3` — shell Snake, Canvas, input et assets
|
||||
|
||||
@@ -162,7 +162,7 @@ emulator -list-avds
|
||||
|
||||
L'absence d'un outil ne doit pas être masquée. Elle devient un prérequis concret de `0-pre.2` ou motive un fix borné de `0-pre.1`.
|
||||
|
||||
La gate `0-pre.1` validée le 2026-09-20 a confirmé Rust `1.94.1`, Tauri CLI `2.11.3`, Node `24.21.0`, npm `11.19.0`, wasm-bindgen `0.2.128`, OpenJDK `25.0.4.1`, `ANDROID_HOME=/home/sinus/DEV/AndroidSDK`, un appareil ARM64 réel et trois AVD disponibles. `JAVA_HOME` était vide et Java 25 était résolu depuis le `PATH`. Le smoke `0-pre.2` a confirmé que Tauri sélectionne lui-même le NDK side-by-side sous `$ANDROID_HOME/ndk/<version>` et injecte `NDK_HOME` dans ses sous-processus ; le défaut observé concernait Java 25 face au wrapper Gradle 8.14.3. Pour les commandes Android Tauri 2.11.x, `JAVA_HOME` doit donc pointer vers un JDK compatible, de préférence le JBR fourni par Android Studio.
|
||||
La gate `0-pre.1` validée le 2026-09-20 a confirmé Rust `1.94.1`, Tauri CLI `2.11.3`, Node `24.21.0`, npm `11.19.0`, wasm-bindgen `0.2.128`, OpenJDK `25.0.4.1`, `ANDROID_HOME=/home/sinus/DEV/AndroidSDK`, un appareil ARM64 réel et trois AVD disponibles. `JAVA_HOME` était vide et Java 25 était résolu depuis le `PATH`. Les smokes `0-pre.2` ont confirmé que Tauri sélectionne lui-même le NDK side-by-side sous `$ANDROID_HOME/ndk/<version>`. Le JBR de l'Android Studio local est également Java 25 ; il n'est donc pas compatible avec Gradle `8.14.3`. Pour `0.3.1`, `JAVA_HOME` doit pointer vers JDK 17 pendant `cargo tauri android init/dev/build`.
|
||||
|
||||
## Critères de fermeture de 0.3.1
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/001-VALIDATION_GATES.md -->
|
||||
<!-- version: 8 -->
|
||||
<!-- version: 9 -->
|
||||
|
||||
# Gates de validation
|
||||
|
||||
@@ -56,7 +56,9 @@ Si une commande échoue, ne pas avancer de prerelease. Produire un correctif du
|
||||
|
||||
## Android et Web
|
||||
|
||||
Le build Android n'est pas encore une gate : le projet Gradle exécutable et l'intégration SDL3/NDK restent planifiés pour une prerelease dédiée. Dès leur introduction, les tâches ciblées par module sont documentées avant d'être rendues obligatoires.
|
||||
Le build Android SDL3 historique n'est pas encore une gate : le projet Gradle exécutable et l'intégration SDL3/NDK restent planifiés pour une prerelease dédiée. Dès leur introduction, les tâches ciblées par module sont documentées avant d'être rendues obligatoires.
|
||||
|
||||
Le host Tauri Android Snake possède en revanche une gate réelle à partir de `0.3.1-0-pre.2`. Pour Tauri 2.11.x, les commandes Android utilisent le projet `gen/android` généré par la CLI officielle, sans patch local. La baseline de validation est JDK 17 avec Gradle `8.14.3` et AGP `8.11.0`. Si `gen/android` provient d'une tentative de migration différente, le supprimer puis rejouer `cargo tauri android init` sous JDK 17 avant le smoke `cargo tauri android dev`.
|
||||
|
||||
Le host navigateur direct Snake possède désormais une gate réelle. Lorsqu'il est touché, construire d'abord l'adapter WASM et ses bindings hors dépôt, puis le frontend :
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
# file: scripts/audit_distribution_layout.py
|
||||
# version: 10
|
||||
# version: 11
|
||||
|
||||
"""Audit the static distribution layout expected by supported POCs."""
|
||||
|
||||
@@ -204,6 +204,38 @@ def audit_snake_tauri_android_integration(root: pathlib.Path) -> list[str]:
|
||||
return violations
|
||||
|
||||
|
||||
def audit_snake_tauri_generated_android(root: pathlib.Path) -> list[str]:
|
||||
"""Reject a locally generated Snake Android tree that drifted from Tauri 2.11.x."""
|
||||
|
||||
violations: list[str] = []
|
||||
android_root = root / "crates/apps/game-snake-poc-tauri/gen/android"
|
||||
if not android_root.exists():
|
||||
return violations
|
||||
|
||||
wrapper_path = android_root / "gradle/wrapper/gradle-wrapper.properties"
|
||||
build_path = android_root / "build.gradle.kts"
|
||||
if not wrapper_path.exists() or not build_path.exists():
|
||||
violations.append(
|
||||
"DIST-LAYOUT-041: generated Snake Tauri Android tree is incomplete; remove gen/android and rerun cargo tauri android init"
|
||||
)
|
||||
return violations
|
||||
|
||||
wrapper = wrapper_path.read_text(encoding="utf-8")
|
||||
build = build_path.read_text(encoding="utf-8")
|
||||
expected_fragments = (
|
||||
(wrapper, "gradle-8.14.3-bin.zip", "Gradle 8.14.3"),
|
||||
(build, 'classpath("com.android.tools.build:gradle:8.11.0")', "Android Gradle Plugin 8.11.0"),
|
||||
(build, 'classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.25")', "Kotlin Gradle Plugin 1.9.25"),
|
||||
)
|
||||
for content, fragment, label in expected_fragments:
|
||||
if fragment not in content:
|
||||
violations.append(
|
||||
f"DIST-LAYOUT-042: generated Snake Tauri Android tree does not match Tauri 2.11.x {label}; "
|
||||
"remove gen/android and rerun cargo tauri android init under JDK 17"
|
||||
)
|
||||
return violations
|
||||
|
||||
|
||||
def main() -> int:
|
||||
"""Validate that every static distribution boundary exists."""
|
||||
|
||||
@@ -223,6 +255,7 @@ def main() -> int:
|
||||
contract_violations.extend(audit_snake_web_shell(root))
|
||||
contract_violations.extend(audit_snake_web_integration(root))
|
||||
contract_violations.extend(audit_snake_tauri_android_integration(root))
|
||||
contract_violations.extend(audit_snake_tauri_generated_android(root))
|
||||
if missing:
|
||||
for relative in missing:
|
||||
print(f"DIST-LAYOUT-001: missing required path: {relative}", file=sys.stderr)
|
||||
|
||||
Reference in New Issue
Block a user