0.3.1-0-pre.3

This commit is contained in:
2026-09-21 01:13:37 +02:00
parent e4b657d0d3
commit 4f677dbc77
19 changed files with 1001 additions and 98 deletions

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3
# file: scripts/audit_distribution_layout.py
# version: 11
# version: 12
"""Audit the static distribution layout expected by supported POCs."""
@@ -40,7 +40,12 @@ REQUIRED_PATHS = (
"crates/apps/game-snake-poc-tauri/capabilities/default.json",
"crates/apps/game-snake-poc-tauri/icons/icon.png",
"crates/apps/game-snake-poc-tauri/frontend/main.html",
"crates/apps/game-snake-poc-tauri/frontend/css/main.css",
"crates/apps/game-snake-poc-tauri/frontend/ts/assets.ts",
"crates/apps/game-snake-poc-tauri/frontend/ts/game.ts",
"crates/apps/game-snake-poc-tauri/frontend/ts/input.ts",
"crates/apps/game-snake-poc-tauri/frontend/ts/main.ts",
"crates/apps/game-snake-poc-tauri/frontend/ts/provenance.ts",
"Web/game-snake-poc/package.json",
"Web/game-snake-poc/tsconfig.json",
"Web/game-snake-poc/vite.config.ts",
@@ -148,18 +153,40 @@ def audit_snake_web_integration(root: pathlib.Path) -> list[str]:
return violations
def audit_snake_tauri_android_integration(root: pathlib.Path) -> list[str]:
"""Validate the minimal Snake Tauri Android host boundary."""
"""Validate the playable Snake Tauri Android reference POC boundary."""
violations: list[str] = []
cargo_path = root / "crates/apps/game-snake-poc-tauri/Cargo.toml"
package_path = root / "crates/apps/game-snake-poc-tauri/package.json"
tauri_path = root / "crates/apps/game-snake-poc-tauri/tauri.conf.json"
tauri_rust_path = root / "crates/apps/game-snake-poc-tauri/src/tauri.rs"
build_script_path = root / "crates/apps/game-snake-poc-tauri/build.rs"
frontend_path = root / "crates/apps/game-snake-poc-tauri/frontend/ts/main.ts"
logging_path = root / "crates/apps/game-snake-poc-tauri/frontend/ts/logging.ts"
app_root = root / "crates/apps/game-snake-poc-tauri"
cargo_path = app_root / "Cargo.toml"
package_path = app_root / "package.json"
tauri_path = app_root / "tauri.conf.json"
tauri_rust_path = app_root / "src/tauri.rs"
build_script_path = app_root / "build.rs"
html_path = app_root / "frontend/main.html"
main_path = app_root / "frontend/ts/main.ts"
assets_path = app_root / "frontend/ts/assets.ts"
game_path = app_root / "frontend/ts/game.ts"
input_path = app_root / "frontend/ts/input.ts"
provenance_path = app_root / "frontend/ts/provenance.ts"
logging_path = app_root / "frontend/ts/logging.ts"
vite_path = app_root / "vite.config.ts"
wasm_runtime_path = root / "crates/apps/game-snake-poc-wasm/src/runtime.rs"
paths = (cargo_path, package_path, tauri_path, tauri_rust_path, build_script_path, frontend_path, logging_path, wasm_runtime_path)
paths = (
cargo_path,
package_path,
tauri_path,
tauri_rust_path,
build_script_path,
html_path,
main_path,
assets_path,
game_path,
input_path,
provenance_path,
logging_path,
vite_path,
wasm_runtime_path,
)
if not all(path.exists() for path in paths):
return violations
@@ -168,8 +195,14 @@ def audit_snake_tauri_android_integration(root: pathlib.Path) -> list[str]:
tauri = tauri_path.read_text(encoding="utf-8")
tauri_rust = tauri_rust_path.read_text(encoding="utf-8")
build_script = build_script_path.read_text(encoding="utf-8")
frontend = frontend_path.read_text(encoding="utf-8")
html = html_path.read_text(encoding="utf-8")
main = main_path.read_text(encoding="utf-8")
assets = assets_path.read_text(encoding="utf-8")
game = game_path.read_text(encoding="utf-8")
input_module = input_path.read_text(encoding="utf-8")
provenance = provenance_path.read_text(encoding="utf-8")
logging = logging_path.read_text(encoding="utf-8")
vite = vite_path.read_text(encoding="utf-8")
wasm_runtime = wasm_runtime_path.read_text(encoding="utf-8")
required_fragments = (
(cargo, 'game-logging-lib = { path = "../../common/game-logging-lib" }', "DIST-LAYOUT-021: Snake Tauri host must use shared Rust logging"),
@@ -178,12 +211,27 @@ def audit_snake_tauri_android_integration(root: pathlib.Path) -> list[str]:
(package, 'wasm-bindgen ../../../../builds/sasedev-games/', "DIST-LAYOUT-024: Snake Tauri bindings must be generated outside the repository"),
(package, '"dev": "npm run wasm:dev && vite"', "DIST-LAYOUT-036: Snake Tauri dev hook must leave Android generation to Tauri"),
(package, '"build": "npm run wasm:build && tsc && vite build"', "DIST-LAYOUT-037: Snake Tauri build hook must leave Android generation to Tauri"),
(package, '"vite-plugin-static-copy"', "DIST-LAYOUT-043: Snake Tauri package must declare static asset packaging"),
(build_script, "tauri_build::build();", "DIST-LAYOUT-038: Snake Tauri build script must delegate Android integration to tauri-build"),
(tauri, '"script": "npm run dev"', "DIST-LAYOUT-025: Tauri must own the frontend development hook"),
(tauri, '"script": "npm run build"', "DIST-LAYOUT-026: Tauri must own the frontend production hook"),
(tauri_rust, '#[tauri::mobile_entry_point]', "DIST-LAYOUT-027: Snake Tauri run entry point must support Tauri mobile"),
(tauri_rust, 'tauri_plugin_tracing::Builder::new()', "DIST-LAYOUT-028: Snake Tauri runtime must install the tracing plugin"),
(frontend, 'configure_runtime_provenance(', "DIST-LAYOUT-029: Snake Tauri frontend must configure provenance through the shared adapter"),
(html, '<canvas id="game"', "DIST-LAYOUT-044: Snake Tauri reference POC must expose the Canvas"),
(html, 'data-direction="up"', "DIST-LAYOUT-045: Snake Tauri reference POC must expose touch direction controls"),
(main, 'loadSnakeTauriAssets()', "DIST-LAYOUT-046: Snake Tauri startup must load canonical runtime assets"),
(main, 'startGame(canvas, score, length, provenance, descriptor)', "DIST-LAYOUT-047: Snake Tauri startup must run the shared WASM game through Canvas"),
(main, 'bindInputs(session, buttons)', "DIST-LAYOUT-048: Snake Tauri startup must bind host inputs"),
(assets, './common/data/runtime.json', "DIST-LAYOUT-049: Snake Tauri asset probe must load common runtime metadata"),
(assets, './game/data/game.json', "DIST-LAYOUT-050: Snake Tauri asset probe must load Snake metadata"),
(game, 'window.requestAnimationFrame(frame)', "DIST-LAYOUT-051: Snake Tauri Canvas host must schedule its fixed-step session"),
(game, 'game.rectangle_count()', "DIST-LAYOUT-052: Snake Tauri Canvas host must render the shared WASM scene"),
(input_module, '"pointerdown"', "DIST-LAYOUT-053: Snake Tauri input must support pointer/touch controls"),
(input_module, '"keydown"', "DIST-LAYOUT-054: Snake Tauri input must retain keyboard controls when available"),
(provenance, '"touch"', "DIST-LAYOUT-055: Snake Tauri provenance must observe touch input"),
(provenance, '"keyboard-mouse"', "DIST-LAYOUT-056: Snake Tauri provenance must observe keyboard/mouse input"),
(vite, 'dest: "common/data", rename: { stripBase: true }', "DIST-LAYOUT-057: Snake Tauri common assets must retain the common/data namespace"),
(vite, 'dest: "game/data", rename: { stripBase: true }', "DIST-LAYOUT-058: Snake Tauri game assets must retain the game/data namespace"),
(logging, '@fltsci/tauri-plugin-tracing', "DIST-LAYOUT-030: Snake Tauri frontend logs must use the tracing bridge"),
(wasm_runtime, '"tauri-webview" => Some(engine_v1_platform_api::RuntimeHost::TauriWebView)', "DIST-LAYOUT-031: Snake WASM adapter must accept the Tauri WebView host"),
(wasm_runtime, '"android" => Some(engine_v1_platform_api::PlatformFamily::Android)', "DIST-LAYOUT-032: Snake WASM adapter must accept Android provenance"),
@@ -196,7 +244,7 @@ def audit_snake_tauri_android_integration(root: pathlib.Path) -> list[str]:
(package, "android:prepare", "DIST-LAYOUT-039: Snake Tauri build hooks must not patch generated Android Gradle files"),
(build_script, "gen/android", "DIST-LAYOUT-040: Snake Tauri build script must not mutate generated Android Gradle files"),
(tauri, "python", "DIST-LAYOUT-034: Snake Tauri configuration must not use Python build orchestration"),
(frontend, "console.", "DIST-LAYOUT-035: Snake Tauri application frontend must not log directly through console.*"),
(main, "console.", "DIST-LAYOUT-035: Snake Tauri application frontend must not log directly through console.*"),
)
for content, fragment, message in forbidden_fragments:
if fragment in content.lower():