diff --git a/Android/game-reflex-poc/build.gradle b/Android/game-reflex-poc/build.gradle index 627b1b8..c7b1a66 100644 --- a/Android/game-reflex-poc/build.gradle +++ b/Android/game-reflex-poc/build.gradle @@ -1,5 +1,5 @@ // file: Android/game-reflex-poc/build.gradle -// version: 18 +// version: 19 plugins { id 'com.android.application' @@ -18,7 +18,7 @@ android { minSdk 21 targetSdk 36 versionCode 1 - versionName '0.1.0-2-beta.1.fix.1' + versionName '0.1.0-2-beta.1.fix.2' } compileOptions { diff --git a/Android/game-snake-poc/build.gradle b/Android/game-snake-poc/build.gradle index 4037c9f..e4f1f77 100644 --- a/Android/game-snake-poc/build.gradle +++ b/Android/game-snake-poc/build.gradle @@ -1,5 +1,5 @@ // file: Android/game-snake-poc/build.gradle -// version: 18 +// version: 19 plugins { id 'com.android.application' @@ -18,7 +18,7 @@ android { minSdk 21 targetSdk 36 versionCode 1 - versionName '0.1.0-2-beta.1.fix.1' + versionName '0.1.0-2-beta.1.fix.2' } compileOptions { diff --git a/Cargo.toml b/Cargo.toml index 92b658f..238ad8a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ members = [ ] [workspace.package] -version = "0.1.0-2-beta.1.fix.1" +version = "0.1.0-2-beta.1.fix.2" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/games" diff --git a/crates/apps/game-reflex-poc-tauri/package.json b/crates/apps/game-reflex-poc-tauri/package.json index e15cc24..e3d4200 100644 --- a/crates/apps/game-reflex-poc-tauri/package.json +++ b/crates/apps/game-reflex-poc-tauri/package.json @@ -1,7 +1,7 @@ { "name": "game-reflex-poc-tauri", "private": true, - "version": "0.1.0-2-beta.1.fix.1", + "version": "0.1.0-2-beta.1.fix.2", "type": "module", "scripts": { "dev": "vite", diff --git a/crates/apps/game-reflex-poc-tauri/tauri.conf.json b/crates/apps/game-reflex-poc-tauri/tauri.conf.json index 2945bfd..639dc61 100644 --- a/crates/apps/game-reflex-poc-tauri/tauri.conf.json +++ b/crates/apps/game-reflex-poc-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Reflex POC Tauri", - "version": "0.1.0-2-beta.1.fix.1", + "version": "0.1.0-2-beta.1.fix.2", "identifier": "com.sasedev.games.reflex.tauri", "build": { "beforeDevCommand": { @@ -13,7 +13,7 @@ "script": "python3 ../../../scripts/build_reflex_tauri_wasm.py && npm run build", "cwd": "." }, - "frontendDist": "../../../builds/sasedev-games/game-reflex-poc-tauri/dist" + "frontendDist": "../../../../builds/sasedev-games/game-reflex-poc-tauri/dist" }, "app": { "windows": [ diff --git a/crates/apps/game-reflex-poc-tauri/vite.config.ts b/crates/apps/game-reflex-poc-tauri/vite.config.ts index 862bf8a..26aac33 100644 --- a/crates/apps/game-reflex-poc-tauri/vite.config.ts +++ b/crates/apps/game-reflex-poc-tauri/vite.config.ts @@ -1,5 +1,5 @@ // file: crates/apps/game-reflex-poc-tauri/vite.config.ts -// version: 1 +// version: 2 import { fileURLToPath } from "node:url"; import { resolve } from "node:path"; @@ -7,10 +7,13 @@ import { defineConfig, normalizePath } from "vite"; const appRoot = fileURLToPath(new URL(".", import.meta.url)); const frontendRoot = normalizePath(resolve(appRoot, "frontend")); -const frontendDist = normalizePath(resolve(appRoot, "../../../builds/sasedev-games/game-reflex-poc-tauri/dist")); +const externalBuildRoot = normalizePath(resolve(appRoot, "../../../../builds/sasedev-games/game-reflex-poc-tauri")); +const frontendDist = normalizePath(resolve(externalBuildRoot, "dist")); +const viteCacheDir = normalizePath(resolve(externalBuildRoot, "vite-cache")); const devHost = process.env.TAURI_DEV_HOST; export default defineConfig({ + cacheDir: viteCacheDir, clearScreen: false, root: frontendRoot, publicDir: false, diff --git a/deltas/0.1.0/2-beta.1.fix.2.md b/deltas/0.1.0/2-beta.1.fix.2.md new file mode 100644 index 0000000..25bd5ca --- /dev/null +++ b/deltas/0.1.0/2-beta.1.fix.2.md @@ -0,0 +1,111 @@ + + + +# Delta 0.1.0-2-beta.1.fix.2 + +## Base + +Base déclarée : `0.1.0-2-beta.1.fix.1`. + +Le packaging Tauri de `fix.1` passe, mais le chemin de sortie Vite pointe encore dans la racine du dépôt. + +## Défaut + +Depuis : + +```text +crates/apps/game-reflex-poc-tauri +``` + +le chemin : + +```text +../../../builds/sasedev-games/game-reflex-poc-tauri/dist +``` + +résout vers : + +```text +sasedev-games/builds/sasedev-games/game-reflex-poc-tauri/dist +``` + +et fait apparaître un répertoire généré `builds/` dans le dépôt. + +## Correctif + +Vite utilise désormais : + +```text +../../../../builds/sasedev-games/game-reflex-poc-tauri +``` + +avec : + +```text +dist/ +vite-cache/ +``` + +`tauri.conf.json` utilise le même `dist/` externe. + +Cette règle est cohérente avec `.cargo/config.toml`, qui place déjà Cargo sous : + +```text +../builds/sasedev-games/target +``` + +## Audit + +`scripts/audit_distribution_layout.py` rejette désormais explicitement : + +```text +./builds +``` + +à la racine du dépôt. + +## Nettoyage local unique + +Si l'ancien répertoire généré existe encore : + +```bash +rm -rf builds +``` + +Cette suppression vise uniquement l'ancien artefact de build créé sous la racine du dépôt. + +## Validation + +```bash +cargo fmt --all +cargo fmt --all -- --check + +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 deltas history +python3 scripts/audit_distribution_layout.py + +cargo check --workspace +cargo clippy --workspace --all-targets --all-features -- -D warnings +``` + +Puis : + +```bash +cd crates/apps/game-reflex-poc-tauri +cargo tauri build +cd ../../.. +``` + +Attendu côté Vite : le chemin affiché doit viser le répertoire frère `../builds/sasedev-games/game-reflex-poc-tauri/dist`, jamais `sasedev-games/builds/...`. + +## Vérification + +```bash +test ! -e builds +test -d ../builds/sasedev-games/game-reflex-poc-tauri/dist +test -d ../builds/sasedev-games/target +``` + +## Transition + +Si ces gates passent, reprendre la matrice beta restante sur `0.1.0-2-beta.1.fix.2`. diff --git a/docs/development/008-WASM_TAURI_POC.md b/docs/development/008-WASM_TAURI_POC.md index 2b32954..1e25092 100644 --- a/docs/development/008-WASM_TAURI_POC.md +++ b/docs/development/008-WASM_TAURI_POC.md @@ -1,5 +1,5 @@ - + # POC WebAssembly embarqué dans Tauri @@ -169,3 +169,25 @@ keydown Escape ``` Une future politique de pause/confirmation pourra retourner `Continue` sans modifier le bridge Tauri. + +## Répertoire de build externe + +Comme Cargo via `.cargo/config.toml`, Tauri/Vite ne doivent créer aucun répertoire de build dans `sasedev-games`. + +Depuis `crates/apps/game-reflex-poc-tauri`, le root de build Vite résout désormais : + +```text +../../../../builds/sasedev-games/game-reflex-poc-tauri/ +``` + +soit, depuis la racine du dépôt : + +```text +../builds/sasedev-games/game-reflex-poc-tauri/ +├── dist/ +└── vite-cache/ +``` + +`tauri.conf.json` référence le même `dist/` externe. + +La racine du dépôt ne doit jamais contenir `builds/`. diff --git a/docs/rules/RULES_PROJECT.md b/docs/rules/RULES_PROJECT.md index 9331cd5..1da0445 100644 --- a/docs/rules/RULES_PROJECT.md +++ b/docs/rules/RULES_PROJECT.md @@ -1,5 +1,5 @@ - + # Règles spécifiques games.sasedev @@ -70,3 +70,5 @@ - **GAME-PLATFORM-012** — Le plugin tracing Tauri ne remplace pas l'initialisation du subscriber Rust ; une app Tauri initialise le runtime de logging partagé avant son premier événement `tracing`. - **GAME-PLATFORM-013** — Les demandes de sortie Tauri sont évaluées par la politique `EngineGame::quit_requested` avant toute fermeture native. + +- **GAME-BUILD-001** — Les artefacts générés Cargo, Tauri, Vite et caches frontend sont placés hors de la racine du dépôt, sous `../builds/sasedev-games/`; un répertoire racine `builds/` dans le dépôt est interdit. diff --git a/scripts/audit_distribution_layout.py b/scripts/audit_distribution_layout.py index 8706961..b43fc01 100644 --- a/scripts/audit_distribution_layout.py +++ b/scripts/audit_distribution_layout.py @@ -11,6 +11,11 @@ import pathlib import sys +FORBIDDEN_PATHS = ( + "builds", +) + + REQUIRED_PATHS = ( "crates/apps/game-reflex-poc-desktop/Cargo.toml", "crates/apps/game-snake-poc-desktop/Cargo.toml", @@ -42,15 +47,24 @@ def main() -> int: arguments = parser.parse_args() root = pathlib.Path(arguments.root).resolve() missing: list[str] = [] + forbidden_present: list[str] = [] for relative in REQUIRED_PATHS: if not (root / relative).exists(): missing.append(relative) + for relative in FORBIDDEN_PATHS: + if (root / relative).exists(): + forbidden_present.append(relative) if missing: for relative in missing: print(f"DIST-LAYOUT-001: missing required path: {relative}", file=sys.stderr) print(f"Distribution layout audit: {len(missing)} violation(s)", file=sys.stderr) return 1 - print(f"Distribution layout audit: clean ({len(REQUIRED_PATHS)} required path(s))") + if forbidden_present: + for relative in forbidden_present: + print(f"DIST-LAYOUT-002: generated path must stay outside repository: {relative}", file=sys.stderr) + print(f"Distribution layout audit: {len(forbidden_present)} violation(s)", file=sys.stderr) + return 1 + print(f"Distribution layout audit: clean ({len(REQUIRED_PATHS)} required path(s), {len(FORBIDDEN_PATHS)} forbidden path(s) absent)") return 0