v0.1.4-pre.008-fix.002
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# file: Cargo.toml
|
||||
# version: 73
|
||||
# version: 74
|
||||
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
members = ["crates/ksp-app-config-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.1.4-pre.8.fix.1"
|
||||
version = "0.1.4-pre.8.fix.2"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-app-config-desk/README.md -->
|
||||
<!-- version: 7 -->
|
||||
<!-- version: 8 -->
|
||||
|
||||
# `ksp-app-config-desk`
|
||||
|
||||
@@ -102,11 +102,11 @@ main -> ksp-app-config-desk.frontend.main
|
||||
splash -> ksp-app-config-desk.frontend.splash
|
||||
```
|
||||
|
||||
Rust valide le niveau et le `targetId`, choisit un callsite statique puis émet exclusivement via les macros de `ksp-logging-lib`. Le package applicatif n'importe pas directement `tracing`. Le panneau manuel de test Logging, ses targets `test.*` et ses domaines personnalisables restent une surface distincte prévue plus tard.
|
||||
Rust valide le niveau et le `targetId`, choisit un callsite statique puis émet exclusivement via les macros de `ksp-logging-lib`. Le package applicatif n'importe pas directement `tracing`. Le pont actuel garantit donc le trajet WebView -> Rust tout en conservant l'affichage local des appels `console.*` dans la console WebKit. Il ne réémet pas encore les événements Rust arbitraires vers la console WebKit : cette direction nécessitera une intégration contrôlée de `tauri_plugin_tracing::WebviewLayer` dans le subscriber possédé par `ksp-logging-lib`, sans second subscriber ni boucle avec le bridge KSP. Le panneau manuel de test Logging, ses targets `test.*` et ses domaines personnalisables restent une surface distincte prévue plus tard.
|
||||
|
||||
## Bootstrap Config et Logging
|
||||
|
||||
Au démarrage, l'application construit `ConfigBootstrapOptions`, `ConfigFileRegistry`, `ConfigDocumentEngine` et `ConfigManagement` à partir des arguments complets du processus. Elle tente ensuite de résoudre le profil Logging par défaut avec un snapshot `ConfigEnvironment` frais.
|
||||
Au démarrage, l'application construit `ConfigBootstrapOptions`, `ConfigFileRegistry`, `ConfigDocumentEngine` et `ConfigManagement` à partir des arguments complets du processus. En développement, le launcher normalise d'abord le current working directory Rust vers la racine du workspace : `cargo tauri dev -c ...` peut sinon lancer le binaire depuis la crate Tauri, ce qui ferait manquer les chemins Config relatifs `config/`, `config/schemas/` et le `.env` racine. Cette normalisation ne lit ni ne parse aucun fichier Config elle-même ; l'ownership reste intégralement dans `ksp-config-lib`. Elle tente ensuite de résoudre le profil Logging par défaut avec un snapshot `ConfigEnvironment` frais.
|
||||
|
||||
Si le document Logging, sa résolution environnementale ou l'initialisation du runtime configuré échoue avant installation du subscriber, Config Desk installe un fallback **transitoire** en mémoire : console stderr, niveau `Info`, aucun fichier, aucun span lifecycle. Ce fallback n'est jamais persisté et son diagnostic frontend est limité à `domain`, `code` et `message`.
|
||||
|
||||
@@ -121,9 +121,9 @@ KSP_DESK_SPLASH_MINIMUM_MS=1200
|
||||
KSP_DESK_SPLASH_FADE_MS=300
|
||||
```
|
||||
|
||||
Après la durée minimale, le splash reçoit son fade-out, `tw_main.rs` affiche/focalise `main`, puis le splash est détruit. Une valeur splash invalide ne bloque pas le manager : des timings de fallback sûrs restent en mémoire afin que la future surface `.env` puisse permettre la réparation.
|
||||
Après la readiness frontend, Rust émet `fade_in`, attend la durée minimale, émet `fade_out`, attend la durée de fade puis `tw_main.rs` affiche/focalise `main` avant destruction du splash. Le backend journalise en `debug` les valeurs résolues, leur provenance (`process`, `dotenv` ou `fallback`), chaque attente réellement observée et la durée totale. Avec `12000/3000`, la durée backend attendue entre readiness et activation de `main` est donc d'environ `15000 ms`. Une valeur splash invalide ne bloque pas le manager : des timings de fallback sûrs restent en mémoire afin que la future surface `.env` puisse permettre la réparation.
|
||||
|
||||
Le shell principal expose les cinq routes de référence `Vue d'ensemble`, `Documents`, `Profils`, `Environnement / .env` et `Logging`. Les routes non encore fonctionnelles affichent un placeholder sans réimplémenter les services prévus par les prereleases suivantes.
|
||||
Le shell principal expose les cinq routes de référence `Vue d'ensemble`, `Documents`, `Profils`, `Environnement / .env` et `Logging`. Le logo porte déjà l'identité KSP ; le texte du header suit donc la forme `Config Desk — <vue active>` au lieu de répéter `KSP`. Les quelques commandes principales restent des pills/tabs à droite ; un dropdown sera préféré lorsqu'une application possède trop de commandes pour conserver ce format lisible. Les routes non encore fonctionnelles affichent un placeholder sans réimplémenter les services prévus par les prereleases suivantes.
|
||||
|
||||
## Traçabilité frontend
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-app-config-desk/TODO.md -->
|
||||
<!-- version: 6 -->
|
||||
<!-- version: 7 -->
|
||||
|
||||
# TODO `ksp-app-config-desk`
|
||||
|
||||
@@ -9,4 +9,5 @@ Les prochaines tranches doivent encore :
|
||||
|
||||
- développer les panneaux Documents, Profils, Environnement/`.env`, Secrets et Logging ;
|
||||
- introduire DataTables au premier tableau qui exige tri, filtrage, sélection ou checkbox ;
|
||||
- démontrer le hot reload Logging et le panneau de test de routage.
|
||||
- démontrer le hot reload Logging et le panneau de test de routage ;
|
||||
- étudier puis intégrer le retour Rust -> console WebKit via `tauri_plugin_tracing::WebviewLayer` dans le subscriber possédé par `ksp-logging-lib`, afin de pouvoir utiliser `attachConsole()` sans second subscriber, double émission ni boucle avec le bridge KSP.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-app-config-desk/USAGE.md -->
|
||||
<!-- version: 7 -->
|
||||
<!-- version: 8 -->
|
||||
|
||||
# Utilisation de `ksp-app-config-desk`
|
||||
|
||||
@@ -85,7 +85,7 @@ splash
|
||||
|
||||
Ils sont convertis côté Rust vers des targets KSP statiques `ksp-app-config-desk.frontend*` et émis uniquement via `ksp-logging-lib`. Un niveau différent de `trace`, `debug`, `info`, `warn` ou `error`, ou un `targetId` non whitelisté, est rejeté avec un `CommandErrorDto` sûr.
|
||||
|
||||
`main.ts` et `splash.ts` installent aussi le bridge `console.*`; l'échec éventuel d'un `invoke` est écrit uniquement sur la console WebView originale afin d'éviter une boucle de logging.
|
||||
`main.ts` et `splash.ts` installent aussi le bridge `console.*`; l'échec éventuel d'un `invoke` est écrit uniquement sur la console WebView originale afin d'éviter une boucle de logging. Ce bridge conserve donc les messages JavaScript dans la console WebKit et les transmet vers Rust, mais il ne reflète pas encore les événements Rust généraux dans cette console. `attachConsole()` du package officiel nécessite que le subscriber Rust publie vers une `WebviewLayer`; cette couche devra être raccordée plus tard à l'ownership de `ksp-logging-lib` plutôt que d'installer un subscriber Tauri parallèle.
|
||||
|
||||
## Bindings TS-RS
|
||||
|
||||
@@ -100,7 +100,7 @@ Les bindings sont générés au premier DTO Tauri réel ; aucune structure facti
|
||||
|
||||
## Bootstrap backend
|
||||
|
||||
Les arguments `--cfgpath`, `--schemapath` et `--filemap=...` sont transmis tels quels à `ksp-config-lib`. Le profil Logging initial est le `default_profile` de `std.logging.json`.
|
||||
Les arguments `--cfgpath`, `--schemapath` et `--filemap=...` sont transmis tels quels à `ksp-config-lib`. En build debug, le launcher replace le current working directory Rust à la racine du workspace avant ce bootstrap afin que les defaults relatifs `config/`, `config/schemas/` et `.env` désignent les ressources racine même lorsque Tauri lance `cargo run` depuis la crate de l'application. Le launcher ne lit pas ces ressources lui-même. Le profil Logging initial est le `default_profile` de `std.logging.json`.
|
||||
|
||||
Si cette configuration ne peut pas être utilisée, l'application doit rester démarrable pour permettre sa réparation : elle utilise alors un fallback Logging console/stderr en mémoire. Le fallback n'écrit aucun fichier de configuration et n'écrase aucune valeur utilisateur.
|
||||
|
||||
@@ -117,7 +117,7 @@ KSP_DESK_SPLASH_FADE_MS=300
|
||||
|
||||
La priorité est celle de Config : process > `.env` > fallback. Les valeurs sont lues uniquement via `ksp-config-lib`. Une valeur non numérique ou hors borne déclenche un fallback runtime en mémoire plutôt qu'un refus de démarrer Config Desk.
|
||||
|
||||
Le frontend `splash.ts` installe son listener puis appelle `splash_frontend_ready`. Le backend vérifie que l'appel provient réellement de la WebView `splash`; une readiness dupliquée (par exemple après reload Vite) est ignorée.
|
||||
Le frontend `splash.ts` installe son listener puis appelle `splash_frontend_ready`. Le backend vérifie que l'appel provient réellement de la WebView `splash`; une readiness dupliquée (par exemple après reload Vite) est ignorée. La durée minimale commence à cette readiness : Rust émet le fade-in, attend `minimum`, émet le fade-out, attend `fade`, puis active `main`. Ainsi `KSP_DESK_SPLASH_MINIMUM_MS=12000` et `KSP_DESK_SPLASH_FADE_MS=3000` donnent environ `15000 ms` de lifecycle backend. Des logs `debug` indiquent source des deux valeurs, attentes configurées/réelles et durée totale afin de vérifier ce contrat.
|
||||
|
||||
## Navigation principale
|
||||
|
||||
@@ -131,7 +131,7 @@ Environnement / .env
|
||||
Logging
|
||||
```
|
||||
|
||||
Seule la vue d'ensemble consomme déjà `get_app_snapshot`; les autres routes restent des placeholders jusqu'à leurs tranches fonctionnelles. Chaque clic de navigation est tracé en `debug` et chaque remplacement/rendu de section en `trace`. Les appels Tauri partagés utilisent `frontend/ts/invoke.ts`, qui journalise le début et la fin d'une commande sans journaliser ses arguments.
|
||||
Seule la vue d'ensemble consomme déjà `get_app_snapshot`; les autres routes restent des placeholders jusqu'à leurs tranches fonctionnelles. Le header affiche `Config Desk — <vue active>` : le logo fournit déjà l'identité KSP. Les commandes principales peu nombreuses utilisent des pills/tabs alignées à droite ; une application plus chargée devra préférer un dropdown. Chaque clic de tab est tracé en `trace`, l'activation utilisateur significative reste tracée en `debug`, et chaque remplacement/rendu de section en `trace`. Les appels Tauri partagés utilisent `frontend/ts/invoke.ts`, qui journalise le début et la fin d'une commande sans journaliser ses arguments.
|
||||
|
||||
## Asset font du splash
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-app-config-desk/frontend/main.html -->
|
||||
<!-- version: 2 -->
|
||||
<!-- version: 3 -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
@@ -8,18 +8,20 @@
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport">
|
||||
<link rel="icon" href="imgs/logo.png">
|
||||
<link rel="stylesheet" href="sass/main.scss">
|
||||
<title>KSP Config Desk</title>
|
||||
<title>Config Desk — Vue d'ensemble</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header class="app-header">
|
||||
<nav class="navbar h-100 py-0 bg-light text-dark">
|
||||
<div class="container-fluid px-4 flex-nowrap">
|
||||
<div class="navbar-brand d-flex align-items-center me-4">
|
||||
<div class="navbar-brand d-flex align-items-center me-4 flex-nowrap">
|
||||
<img alt="KSP" src="imgs/logo.png" class="app-logo">
|
||||
<span class="ps-2 fs-4 fw-bold text-primary">KSP — <span class="badge text-bg-primary">Config Desk</span></span>
|
||||
<span class="ps-2 fs-4 fw-semibold text-primary text-nowrap">Config Desk</span>
|
||||
<span class="mx-2 fs-5 text-body-secondary" aria-hidden="true">—</span>
|
||||
<span id="headerViewTitle" class="fs-5 text-body text-nowrap">Vue d'ensemble</span>
|
||||
</div>
|
||||
<div class="app-nav nav nav-pills flex-nowrap gap-1" aria-label="Navigation Config Desk">
|
||||
<div class="app-nav nav nav-pills flex-nowrap gap-1 ms-auto" aria-label="Navigation Config Desk">
|
||||
<button class="nav-link app-nav-button active" type="button" data-view="overview">Vue d'ensemble</button>
|
||||
<button class="nav-link app-nav-button" type="button" data-view="documents">Documents</button>
|
||||
<button class="nav-link app-nav-button" type="button" data-view="profiles">Profils</button>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-config-desk/frontend/ts/main.ts
|
||||
// version: 3
|
||||
// version: 4
|
||||
|
||||
import "bootstrap";
|
||||
import ResizeObserver from "resize-observer-polyfill";
|
||||
@@ -47,10 +47,15 @@ function activateView(viewId: ViewId, source: "startup" | "user"): void {
|
||||
}
|
||||
const copy = viewCopy[viewId];
|
||||
const title = document.querySelector<HTMLElement>("#viewTitle");
|
||||
const headerTitle = document.querySelector<HTMLElement>("#headerViewTitle");
|
||||
const description = document.querySelector<HTMLElement>("#viewDescription");
|
||||
if (title) {
|
||||
title.textContent = copy.title;
|
||||
}
|
||||
if (headerTitle) {
|
||||
headerTitle.textContent = copy.title;
|
||||
}
|
||||
document.title = `Config Desk — ${copy.title}`;
|
||||
if (description) {
|
||||
description.textContent = copy.description;
|
||||
}
|
||||
@@ -59,6 +64,7 @@ function activateView(viewId: ViewId, source: "startup" | "user"): void {
|
||||
button.classList.toggle("active", active);
|
||||
button.setAttribute("aria-current", active ? "page" : "false");
|
||||
});
|
||||
frontendTrace("main", "Main navigation tab state changed", { viewId, source });
|
||||
const overview = document.querySelector<HTMLElement>("#overviewPanel");
|
||||
if (overview) {
|
||||
overview.hidden = viewId !== "overview";
|
||||
@@ -74,6 +80,7 @@ function bindNavigation(): void {
|
||||
document.querySelectorAll<HTMLButtonElement>("[data-view]").forEach(button => {
|
||||
button.addEventListener("click", () => {
|
||||
const requestedView = button.dataset.view;
|
||||
frontendTrace("main", "Main navigation tab clicked", { requestedView: requestedView ?? null });
|
||||
if (requestedView && isViewId(requestedView)) {
|
||||
activateView(requestedView, "user");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-config-desk/src/app_state.rs
|
||||
// version: 2
|
||||
// version: 3
|
||||
|
||||
//! Shared backend state owned by the Tauri application.
|
||||
|
||||
@@ -50,7 +50,10 @@ impl AppState {
|
||||
target: crate::TRACING_TARGET,
|
||||
domain = crate::TRACING_DOMAIN_WINDOWS,
|
||||
minimum_ms = splash_settings.minimum_ms(),
|
||||
minimum_source = splash_settings.minimum_source(),
|
||||
fade_ms = splash_settings.fade_ms(),
|
||||
fade_source = splash_settings.fade_source(),
|
||||
expected_backend_lifecycle_ms = splash_settings.expected_backend_lifecycle_ms(),
|
||||
"resolved Config Desk splash timings"
|
||||
);
|
||||
return std::result::Result::Ok(Self {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-config-desk/src/main.rs
|
||||
// version: 2
|
||||
// version: 3
|
||||
|
||||
//! Binary entry point for the KSP configuration desktop application.
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
use fs2::FileExt; // rust-rules: trait-import
|
||||
|
||||
fn main() -> std::process::ExitCode {
|
||||
let working_directory = configure_runtime_working_directory();
|
||||
if let std::result::Result::Err(error) = working_directory {
|
||||
eprintln!("cannot configure Config Desk runtime working directory: {error}");
|
||||
return std::process::ExitCode::FAILURE;
|
||||
}
|
||||
let mut lock_path = std::env::temp_dir();
|
||||
lock_path.push("com_sasedev_ksp_app_config_desk.lock");
|
||||
let lock_file = match std::fs::OpenOptions::new().read(true).write(true).create(true).truncate(false).open(&lock_path) {
|
||||
@@ -39,3 +44,15 @@ fn main() -> std::process::ExitCode {
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
fn configure_runtime_working_directory() -> std::io::Result<()> {
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
let workspace_root = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../..");
|
||||
return std::env::set_current_dir(workspace_root);
|
||||
}
|
||||
#[cfg(not(debug_assertions))]
|
||||
{
|
||||
return std::result::Result::Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-config-desk/src/splash.rs
|
||||
// version: 2
|
||||
// version: 3
|
||||
|
||||
//! Common splash settings and frontend event contracts for Config Desk.
|
||||
|
||||
@@ -17,6 +17,8 @@ const MAX_SPLASH_FADE_MS: u32 = 10_000;
|
||||
pub(crate) struct SplashSettings {
|
||||
minimum_ms: u64,
|
||||
fade_ms: u32,
|
||||
minimum_source: ksp_config_lib::ConfigEnvironmentSource,
|
||||
fade_source: ksp_config_lib::ConfigEnvironmentSource,
|
||||
}
|
||||
|
||||
impl SplashSettings {
|
||||
@@ -47,13 +49,18 @@ impl SplashSettings {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
return std::result::Result::Ok(Self { minimum_ms, fade_ms });
|
||||
return std::result::Result::Ok(Self { minimum_ms, fade_ms, minimum_source: minimum.source(), fade_source: fade.source() });
|
||||
}
|
||||
|
||||
/// Returns safe in-memory timings used when the managed environment cannot be resolved.
|
||||
#[must_use]
|
||||
pub(crate) const fn fallback() -> Self {
|
||||
return Self { minimum_ms: DEFAULT_SPLASH_MINIMUM_MS, fade_ms: DEFAULT_SPLASH_FADE_MS };
|
||||
return Self {
|
||||
minimum_ms: DEFAULT_SPLASH_MINIMUM_MS,
|
||||
fade_ms: DEFAULT_SPLASH_FADE_MS,
|
||||
minimum_source: ksp_config_lib::ConfigEnvironmentSource::Fallback,
|
||||
fade_source: ksp_config_lib::ConfigEnvironmentSource::Fallback,
|
||||
};
|
||||
}
|
||||
|
||||
/// Returns the minimum visible duration after splash frontend readiness.
|
||||
@@ -67,6 +74,32 @@ impl SplashSettings {
|
||||
pub(crate) const fn fade_ms(self) -> u32 {
|
||||
return self.fade_ms;
|
||||
}
|
||||
|
||||
/// Returns the safe provenance code for the minimum duration.
|
||||
#[must_use]
|
||||
pub(crate) const fn minimum_source(self) -> &'static str {
|
||||
return environment_source_code(self.minimum_source);
|
||||
}
|
||||
|
||||
/// Returns the safe provenance code for the fade duration.
|
||||
#[must_use]
|
||||
pub(crate) const fn fade_source(self) -> &'static str {
|
||||
return environment_source_code(self.fade_source);
|
||||
}
|
||||
|
||||
/// Returns the minimum backend lifecycle duration from readiness until main activation.
|
||||
#[must_use]
|
||||
pub(crate) fn expected_backend_lifecycle_ms(self) -> u64 {
|
||||
return self.minimum_ms + u64::from(self.fade_ms);
|
||||
}
|
||||
}
|
||||
|
||||
const fn environment_source_code(source: ksp_config_lib::ConfigEnvironmentSource) -> &'static str {
|
||||
return match source {
|
||||
ksp_config_lib::ConfigEnvironmentSource::Process => "process",
|
||||
ksp_config_lib::ConfigEnvironmentSource::DotEnv => "dotenv",
|
||||
ksp_config_lib::ConfigEnvironmentSource::Fallback => "fallback",
|
||||
};
|
||||
}
|
||||
|
||||
/// Command emitted by Rust to the splash frontend.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-config-desk/src/tauri.rs
|
||||
// version: 5
|
||||
// version: 6
|
||||
|
||||
//! Tauri runtime assembly for the KSP configuration desktop application.
|
||||
|
||||
@@ -35,7 +35,7 @@ fn configure_plugins(builder: tauri::Builder<tauri::Wry>) -> tauri::Builder<taur
|
||||
return builder.plugin(tracing_plugin);
|
||||
}
|
||||
|
||||
#[allow(clippy::question_mark_used)]
|
||||
#[allow(clippy::question_mark_used)] // Tauri generates the question-mark operator internally for async command dispatch.
|
||||
fn configure_commands(builder: tauri::Builder<tauri::Wry>) -> tauri::Builder<tauri::Wry> {
|
||||
return builder.invoke_handler(tauri::generate_handler![get_app_snapshot, emit_frontend_log, splash_frontend_ready]);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-config-desk/src/tw_splash.rs
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
//! Tauri-window lifecycle for the Config Desk splash window.
|
||||
|
||||
@@ -37,12 +37,17 @@ pub(crate) async fn frontend_ready(app: tauri::AppHandle, invoking_window: tauri
|
||||
return std::result::Result::Ok(());
|
||||
}
|
||||
let settings = state.splash_settings();
|
||||
let lifecycle_started = std::time::Instant::now();
|
||||
ksp_logging_lib::debug!(
|
||||
target: crate::TRACING_TARGET,
|
||||
domain = crate::TRACING_DOMAIN_WINDOWS,
|
||||
window_label = WINDOW_LABEL_SPLASH,
|
||||
minimum_ms = settings.minimum_ms(),
|
||||
minimum_source = settings.minimum_source(),
|
||||
fade_ms = settings.fade_ms(),
|
||||
"starting splash to main lifecycle"
|
||||
fade_source = settings.fade_source(),
|
||||
expected_backend_lifecycle_ms = settings.expected_backend_lifecycle_ms(),
|
||||
"splash frontend readiness accepted; starting splash to main lifecycle"
|
||||
);
|
||||
let fade_in = emit_order(
|
||||
&invoking_window,
|
||||
@@ -51,7 +56,17 @@ pub(crate) async fn frontend_ready(app: tauri::AppHandle, invoking_window: tauri
|
||||
if let std::result::Result::Err(error) = fade_in {
|
||||
return std::result::Result::Err(error);
|
||||
}
|
||||
let minimum_wait_started = std::time::Instant::now();
|
||||
tokio::time::sleep(std::time::Duration::from_millis(settings.minimum_ms())).await;
|
||||
ksp_logging_lib::debug!(
|
||||
target: crate::TRACING_TARGET,
|
||||
domain = crate::TRACING_DOMAIN_WINDOWS,
|
||||
window_label = WINDOW_LABEL_SPLASH,
|
||||
configured_wait_ms = settings.minimum_ms(),
|
||||
actual_wait_ms = minimum_wait_started.elapsed().as_secs_f64() * 1000.0,
|
||||
lifecycle_elapsed_ms = lifecycle_started.elapsed().as_secs_f64() * 1000.0,
|
||||
"splash minimum wait completed"
|
||||
);
|
||||
let fade_out = emit_order(
|
||||
&invoking_window,
|
||||
crate::SplashOrderDto::new("fade_out", std::option::Option::Some("Initialisation terminée."), std::option::Option::Some(settings.fade_ms())),
|
||||
@@ -59,7 +74,17 @@ pub(crate) async fn frontend_ready(app: tauri::AppHandle, invoking_window: tauri
|
||||
if let std::result::Result::Err(error) = fade_out {
|
||||
return std::result::Result::Err(error);
|
||||
}
|
||||
let fade_wait_started = std::time::Instant::now();
|
||||
tokio::time::sleep(std::time::Duration::from_millis(u64::from(settings.fade_ms()))).await;
|
||||
ksp_logging_lib::debug!(
|
||||
target: crate::TRACING_TARGET,
|
||||
domain = crate::TRACING_DOMAIN_WINDOWS,
|
||||
window_label = WINDOW_LABEL_SPLASH,
|
||||
configured_wait_ms = settings.fade_ms(),
|
||||
actual_wait_ms = fade_wait_started.elapsed().as_secs_f64() * 1000.0,
|
||||
lifecycle_elapsed_ms = lifecycle_started.elapsed().as_secs_f64() * 1000.0,
|
||||
"splash fade-out wait completed"
|
||||
);
|
||||
let show_main = crate::show_main_window(&app);
|
||||
if let std::result::Result::Err(error) = show_main {
|
||||
return std::result::Result::Err(error);
|
||||
@@ -76,6 +101,8 @@ pub(crate) async fn frontend_ready(app: tauri::AppHandle, invoking_window: tauri
|
||||
target: crate::TRACING_TARGET,
|
||||
domain = crate::TRACING_DOMAIN_WINDOWS,
|
||||
window_label = WINDOW_LABEL_SPLASH,
|
||||
expected_backend_lifecycle_ms = settings.expected_backend_lifecycle_ms(),
|
||||
actual_backend_lifecycle_ms = lifecycle_started.elapsed().as_secs_f64() * 1000.0,
|
||||
"splash window destroyed after main activation"
|
||||
);
|
||||
return std::result::Result::Ok(());
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
// file: crates/ksp-app-config-desk/unit_tests/splash.rs
|
||||
// version: 2
|
||||
// version: 3
|
||||
|
||||
#[test]
|
||||
fn fallback_splash_settings_are_short_and_ordered() {
|
||||
let settings = crate::SplashSettings::fallback();
|
||||
assert_eq!(settings.minimum_ms(), 1200);
|
||||
assert_eq!(settings.fade_ms(), 300);
|
||||
assert_eq!(settings.minimum_source(), "fallback");
|
||||
assert_eq!(settings.fade_source(), "fallback");
|
||||
assert_eq!(settings.expected_backend_lifecycle_ms(), 1500);
|
||||
assert!(settings.minimum_ms() >= u64::from(settings.fade_ms()));
|
||||
}
|
||||
|
||||
@@ -26,9 +29,9 @@ fn splash_duration_parser_rejects_invalid_or_unbounded_values() {
|
||||
assert!(oversized_minimum.is_err());
|
||||
assert!(oversized_fade.is_err());
|
||||
if let std::result::Result::Err(error) = oversized_minimum {
|
||||
assert!(error.context().iter().any(|field| field.key() == "maximum_ms" && field.value() == "60000"));
|
||||
assert!(error.context().iter().any(|field| return field.key() == "maximum_ms" && field.value() == "60000"));
|
||||
}
|
||||
if let std::result::Result::Err(error) = oversized_fade {
|
||||
assert!(error.context().iter().any(|field| field.key() == "maximum_ms" && field.value() == "10000"));
|
||||
assert!(error.context().iter().any(|field| return field.key() == "maximum_ms" && field.value() == "10000"));
|
||||
}
|
||||
}
|
||||
|
||||
276
deltas/0.1.4/pre.008-fix.002.md
Normal file
276
deltas/0.1.4/pre.008-fix.002.md
Normal file
@@ -0,0 +1,276 @@
|
||||
<!-- file: deltas/0.1.4/pre.008-fix.002.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# `0.1.4-pre.008-fix.002` — Clippy Tauri, racine Config, timings splash et header principal
|
||||
|
||||
## 1. Motif du fix
|
||||
|
||||
La validation locale de `0.1.4-pre.8.fix.1` confirme que `cargo check`, les tests de l'application et les tests Config passent, mais `cargo clippy --workspace --all-targets` révèle encore trois erreurs :
|
||||
|
||||
- deux closures de test violent `clippy::implicit_return` ;
|
||||
- l'expansion générée par Tauri pour la commande async `splash_frontend_ready` utilise l'opérateur `?`, alors que le workspace refuse `clippy::question_mark_used`.
|
||||
|
||||
Le test desktop révèle en parallèle un point runtime plus important : le démarrage utilise toujours le fallback Logging avec `json_file_read_failed`, alors que `config/std.logging.json` existe à la racine du workspace. Le même bootstrap résout les timings du splash via `ConfigEnvironment`; le `.env` racine peut donc être manqué pour la même raison lorsque Tauri lance `cargo run` depuis la crate applicative.
|
||||
|
||||
Le correctif traite également les remarques UI liées à la tranche `pre.008` : identité du header et traçage fin des changements de tabs.
|
||||
|
||||
## 2. Version technique
|
||||
|
||||
Le fix touche Rust, TypeScript, HTML et documentation :
|
||||
|
||||
```text
|
||||
workspace.package.version = "0.1.4-pre.8.fix.2"
|
||||
```
|
||||
|
||||
La version applicative frontend/Tauri reste `0.1.4` selon la politique KSP courante.
|
||||
|
||||
## 3. Clippy sur les closures de test
|
||||
|
||||
Les predicates passés à `Iterator::any()` sont écrits avec le `return` explicite requis par le workspace :
|
||||
|
||||
```rust
|
||||
.any(|field| return field.key() == "maximum_ms" && field.value() == "60000")
|
||||
```
|
||||
|
||||
et :
|
||||
|
||||
```rust
|
||||
.any(|field| return field.key() == "maximum_ms" && field.value() == "10000")
|
||||
```
|
||||
|
||||
Le test du fallback est en plus renforcé pour verrouiller :
|
||||
|
||||
```text
|
||||
minimum_source = fallback
|
||||
fade_source = fallback
|
||||
expected_backend_lifecycle_ms = 1500
|
||||
```
|
||||
|
||||
## 4. Exception Clippy strictement bornée au code généré Tauri
|
||||
|
||||
Le code source KSP de `splash_frontend_ready` n'utilise toujours aucun `?`.
|
||||
|
||||
La violation provient de l'expansion de `tauri::generate_handler!` pour une commande async. L'exception est donc placée uniquement sur le helper d'assemblage qui invoque ce macro :
|
||||
|
||||
```rust
|
||||
#[allow(clippy::question_mark_used)] // Tauri generates `?` internally for async command dispatch.
|
||||
fn configure_commands(...)
|
||||
```
|
||||
|
||||
Aucun `allow` global et aucune détente de `clippy::question_mark` / `clippy::question_mark_used` au niveau workspace ne sont introduits.
|
||||
|
||||
## 5. Current working directory du runtime debug
|
||||
|
||||
Le workflow KSP lance l'application depuis la racine avec :
|
||||
|
||||
```bash
|
||||
cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json
|
||||
```
|
||||
|
||||
Tauri peut néanmoins exécuter le `cargo run` applicatif depuis la crate Tauri. Les defaults de `ksp-config-lib` restent volontairement :
|
||||
|
||||
```text
|
||||
config/
|
||||
config/schemas/
|
||||
./.env
|
||||
```
|
||||
|
||||
Afin de conserver ces ressources enracinées au projet sans transférer leur ownership à l'application, `main.rs` normalise en build debug le current working directory Rust vers :
|
||||
|
||||
```text
|
||||
env!("CARGO_MANIFEST_DIR")/../..
|
||||
```
|
||||
|
||||
avant d'appeler le bootstrap Config.
|
||||
|
||||
Cette adaptation :
|
||||
|
||||
- ne lit pas `.env` ;
|
||||
- ne parse aucune variable `KSP_*` / `KSPB_*` ;
|
||||
- ne lit aucun JSON Config ;
|
||||
- laisse `ConfigBootstrapOptions`, `ConfigFileRegistry`, `ConfigManagement` et `ConfigEnvironment` effectuer toutes les lectures ;
|
||||
- ne s'applique pas au build release, dont le modèle de ressources distribuées sera traité séparément.
|
||||
|
||||
Le test desktop doit confirmer que le warning `json_file_read_failed` disparaît lorsque `config/std.logging.json` racine est valide.
|
||||
|
||||
## 6. Instrumentation Rust du lifecycle splash
|
||||
|
||||
`SplashSettings` conserve désormais la provenance sûre de chaque valeur :
|
||||
|
||||
```text
|
||||
process
|
||||
|
||||
dotenv
|
||||
|
||||
fallback
|
||||
```
|
||||
|
||||
Le runtime journalise en `debug` :
|
||||
|
||||
1. les valeurs résolues et leur provenance ;
|
||||
2. la readiness acceptée ;
|
||||
3. la fin de l'attente minimale avec durée configurée et durée réelle ;
|
||||
4. la fin de l'attente du fade-out avec durée configurée et durée réelle ;
|
||||
5. la destruction du splash après activation de `main`, avec durée totale attendue/réelle.
|
||||
|
||||
Le contrat temporel KSP reste celui fixé par `pre.008` :
|
||||
|
||||
```text
|
||||
readiness
|
||||
-> emit fade_in
|
||||
-> wait minimum
|
||||
-> emit fade_out
|
||||
-> wait fade
|
||||
-> show/focus main
|
||||
-> destroy splash
|
||||
```
|
||||
|
||||
Il n'est pas remplacé par les trois temporisations historiques de bot3. Avec :
|
||||
|
||||
```text
|
||||
KSP_DESK_SPLASH_MINIMUM_MS=12000
|
||||
KSP_DESK_SPLASH_FADE_MS=3000
|
||||
```
|
||||
|
||||
le lifecycle backend attendu de readiness à activation de `main` est donc approximativement :
|
||||
|
||||
```text
|
||||
15000 ms
|
||||
```
|
||||
|
||||
Les nouveaux logs permettent de distinguer immédiatement un défaut de résolution `.env` d'un défaut d'attente async.
|
||||
|
||||
## 7. Header principal et tabs
|
||||
|
||||
Le logo contenant déjà l'identité visuelle KSP, le header n'affiche plus `KSP — Config Desk`.
|
||||
|
||||
La convention devient :
|
||||
|
||||
```text
|
||||
[logo K] Config Desk — <vue active>
|
||||
```
|
||||
|
||||
Par exemple :
|
||||
|
||||
```text
|
||||
Config Desk — Vue d'ensemble
|
||||
Config Desk — Documents
|
||||
Config Desk — Logging
|
||||
```
|
||||
|
||||
Le `<title>` WebView suit la même vue active.
|
||||
|
||||
Les cinq commandes principales restent sous forme de pills/tabs alignées à droite, adaptée à cette application monofenêtre compacte. La règle de gabarit prévoit un dropdown lorsque le nombre de commandes devient trop important.
|
||||
|
||||
Le frontend trace désormais :
|
||||
|
||||
- chaque clic de tab en `trace` ;
|
||||
- l'état de tab actif après changement en `trace` ;
|
||||
- l'activation utilisateur significative de la vue en `debug` ;
|
||||
- les remplacements de contenu restent en `trace`.
|
||||
|
||||
## 8. `@fltsci/tauri-plugin-tracing` et console WebKit
|
||||
|
||||
Le plugin Rust `tauri-plugin-tracing` reste réellement installé ; ce qui n'est pas encore utilisé est la façade JS officielle pour le routing applicatif.
|
||||
|
||||
Le bridge KSP actuel fournit :
|
||||
|
||||
```text
|
||||
console/WebView JS
|
||||
-> affichage dans la console WebKit originale
|
||||
-> emit_frontend_log
|
||||
-> ksp-logging-lib
|
||||
-> runtime Rust
|
||||
```
|
||||
|
||||
Il **ne fournit pas encore** le trajet général inverse :
|
||||
|
||||
```text
|
||||
événement tracing Rust
|
||||
-> console WebKit
|
||||
```
|
||||
|
||||
Le package officiel expose `attachConsole()`, `interceptConsole()` et `takeoverConsole()`, mais avec le subscriber custom possédé par KSP, le retour Rust -> WebView nécessite que ce subscriber intègre `tauri_plugin_tracing::WebviewLayer`.
|
||||
|
||||
Décision : ne pas appeler artificiellement `takeoverConsole()` dans ce fix. Une future tranche raccordera éventuellement `WebviewLayer` à `ksp-logging-lib`, de façon à pouvoir utiliser `attachConsole()` sans second subscriber, sans double émission JS -> Rust et sans boucle avec `frontend_log.ts`.
|
||||
|
||||
## 9. Règles et plan
|
||||
|
||||
`RULES_KSP.md` ajoute :
|
||||
|
||||
- `KSP-APP-028` pour l'identité de header et le choix tabs/pills vs dropdown ;
|
||||
- `KSP-APP-029` pour la normalisation du CWD debug avant bootstrap Config dans un workspace Tauri multi-app.
|
||||
|
||||
Le plan `0.1.4` passe en version 9 et documente :
|
||||
|
||||
- la sémantique temporelle exacte du splash ;
|
||||
- les métriques `debug` ;
|
||||
- le CWD runtime debug ;
|
||||
- la convention du header ;
|
||||
- l'état réel du bridge console et le besoin futur de `WebviewLayer`.
|
||||
|
||||
## 10. Fichiers modifiés
|
||||
|
||||
| Fichier | Action |
|
||||
|---------------------------------------------------|--------:|
|
||||
| `Cargo.toml` | modifié |
|
||||
| `crates/ksp-app-config-desk/src/main.rs` | modifié |
|
||||
| `crates/ksp-app-config-desk/src/tauri.rs` | modifié |
|
||||
| `crates/ksp-app-config-desk/src/splash.rs` | modifié |
|
||||
| `crates/ksp-app-config-desk/src/app_state.rs` | modifié |
|
||||
| `crates/ksp-app-config-desk/src/tw_splash.rs` | modifié |
|
||||
| `crates/ksp-app-config-desk/unit_tests/splash.rs` | modifié |
|
||||
| `crates/ksp-app-config-desk/frontend/main.html` | modifié |
|
||||
| `crates/ksp-app-config-desk/frontend/ts/main.ts` | modifié |
|
||||
| `crates/ksp-app-config-desk/README.md` | modifié |
|
||||
| `crates/ksp-app-config-desk/USAGE.md` | modifié |
|
||||
| `crates/ksp-app-config-desk/TODO.md` | modifié |
|
||||
| `docs/rules/RULES_KSP.md` | modifié |
|
||||
| `docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md` | modifié |
|
||||
| `deltas/0.1.4/pre.008-fix.002.md` | ajouté |
|
||||
|
||||
Aucune dépendance n'est ajoutée et aucun asset binaire n'est modifié.
|
||||
|
||||
## 11. Validations demandées
|
||||
|
||||
Depuis la racine du workspace :
|
||||
|
||||
```bash
|
||||
cargo fmt --all
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets
|
||||
cargo test -p ksp-app-config-desk
|
||||
cargo test -p ksp-config-lib
|
||||
cargo tree -p ksp-app-config-desk
|
||||
cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json
|
||||
```
|
||||
|
||||
Avec le `.env` utilisateur :
|
||||
|
||||
```text
|
||||
KSP_DESK_SPLASH_MINIMUM_MS=12000
|
||||
KSP_DESK_SPLASH_FADE_MS=3000
|
||||
```
|
||||
|
||||
le lancement doit notamment montrer en `debug` :
|
||||
|
||||
```text
|
||||
minimum_ms=12000
|
||||
minimum_source="dotenv"
|
||||
fade_ms=3000
|
||||
fade_source="dotenv"
|
||||
expected_backend_lifecycle_ms=15000
|
||||
```
|
||||
|
||||
puis deux attentes proches de `12000 ms` et `3000 ms`, et une durée backend totale proche de `15000 ms` avant activation de `main`.
|
||||
|
||||
Le lancement doit également confirmer :
|
||||
|
||||
- disparition de `json_file_read_failed` si le document Logging racine est valide ;
|
||||
- chargement du profil Logging `local_dev` au lieu du fallback startup ;
|
||||
- header `Config Desk — Vue d'ensemble` puis mise à jour du titre lors des changements de tabs ;
|
||||
- logs `trace` sur les clics/changements de tabs lorsque le filtre runtime laisse passer `trace`.
|
||||
|
||||
## 12. Suite
|
||||
|
||||
Après validation de ce fix, `pre.008` peut être considérée fermée et `pre.009` peut commencer la surface Documents + diagnostics.
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md -->
|
||||
<!-- version: 8 -->
|
||||
<!-- version: 9 -->
|
||||
|
||||
# Plan `0.1.4` — `ksp-app-config-desk`
|
||||
|
||||
@@ -316,7 +316,8 @@ Décision `0.1.4` :
|
||||
- reprendre/refondre le pont `frontend_logging` de bot3 : helpers TypeScript -> commande Tauri dédiée -> service Rust -> façade `ksp-logging-lib` ;
|
||||
- normaliser/whitelister les targets frontend et de test côté Rust afin qu'un texte arbitraire reçu depuis la webview ne devienne jamais un target de callsite arbitraire ;
|
||||
- utiliser le package officiel pour les fonctions réellement utiles du plugin (`attachConsole` ou autre) uniquement lorsque leur comportement reste compatible avec le runtime KSP ;
|
||||
- ne pas utiliser directement `interceptConsole()` / `takeoverConsole()` comme unique pont JS -> Rust si cela produit des événements impossibles à router selon les targets KSP ;
|
||||
- le bridge KSP actuel couvre WebView -> Rust et conserve les appels JavaScript dans la console WebKit, mais ne couvre pas encore Rust -> WebKit ; avec le subscriber custom de KSP, `attachConsole()` requiert une `tauri_plugin_tracing::WebviewLayer` intégrée au subscriber possédé par `ksp-logging-lib` ; cette capacité sera ajoutée seulement via un adapter qui préserve cet ownership ;
|
||||
- ne pas utiliser directement `interceptConsole()` / `takeoverConsole()` comme unique pont JS -> Rust si cela produit des événements impossibles à router selon les targets KSP ou une boucle/double émission avec le bridge KSP ;
|
||||
- pour les événements de test Logging de `0.1.4`, utiliser la façade/macros de `ksp-logging-lib` avec un target KSP contrôlé et un `domain` structuré optionnel ;
|
||||
- revérifier ce point lors de l'introduction réelle des dépendances, car une nouvelle version du plugin pourrait étendre son contrat frontend.
|
||||
|
||||
@@ -950,7 +951,15 @@ KSP_DESK_SPLASH_FADE_MS=300
|
||||
|
||||
Elles sont résolues uniquement via `ConfigEnvironment` avec priorité process > `.env` > fallback. `KSP_DESK_SPLASH_MINIMUM_MS` est bornée à 60 000 ms et `KSP_DESK_SPLASH_FADE_MS` à 10 000 ms. Une valeur invalide ne doit pas rendre Config Desk inutilisable : l’application conserve les timings de fallback en mémoire, journalise seulement domaine/code de l’erreur et laisse la future surface `.env` permettre la réparation.
|
||||
|
||||
Le frontend ne reçoit que la durée d’animation réellement nécessaire dans les ordres du splash; la durée minimale reste backend. Aucun close delay distinct n’est nécessaire : Rust attend la durée de fade-out avant d’afficher/focaliser `main` puis de détruire `splash`. Les variables sont ajoutées à `.env.example` dans `pre.008`.
|
||||
Le frontend ne reçoit que la durée d’animation réellement nécessaire dans les ordres du splash; la durée minimale reste backend. La référence temporelle est la readiness frontend : Rust émet `fade_in`, attend `minimum`, émet `fade_out`, attend `fade`, puis affiche/focalise `main` et détruit `splash`. Aucun close delay distinct n’est nécessaire. Avec `minimum=12000` et `fade=3000`, le lifecycle backend attendu est donc proche de `15000 ms`, et non des trois délais indépendants historiques de bot3. `tw_splash` journalise en `debug` la provenance des valeurs, les attentes configurées et réellement observées ainsi que la durée totale. Les variables sont ajoutées à `.env.example` dans `pre.008`.
|
||||
|
||||
### 13.3 Racine runtime en développement
|
||||
|
||||
Avec le workflow workspace `cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json`, Tauri peut lancer le binaire Rust avec la crate applicative comme current working directory. Les defaults Config `config/`, `config/schemas/` et `.env` sont cependant des chemins de projet enracinés à la racine du workspace. En build debug, le launcher replace donc le CWD sur `env!("CARGO_MANIFEST_DIR")/../..` **avant** le bootstrap Config. Il ne lit aucune ressource KSP lui-même ; `ksp-config-lib` continue à gérer paths, `.env`, precedence et validation. Un runtime distribué ne doit pas dépendre de cette racine source et sera cadré séparément.
|
||||
|
||||
### 13.4 Header et navigation
|
||||
|
||||
Le logo de Config Desk porte déjà l’identité graphique KSP. Le header ne répète donc pas `KSP` en texte : il suit `Config Desk — <vue active>`. Les cinq commandes principales restent des tabs/pills alignées à droite tant que leur nombre reste compact ; les futures applications qui dépassent cette surface utiliseront un dropdown. Les clics/changements de tabs sont tracés (`trace` pour le clic/état technique, `debug` pour l’activation utilisateur significative).
|
||||
|
||||
## 14. Présentation et Markdown
|
||||
|
||||
@@ -1182,9 +1191,10 @@ pre.008 shell main + splash de référence
|
||||
- tw_splash + tw_main
|
||||
- lifecycle splash configurable
|
||||
- KSP_DESK_SPLASH_MINIMUM_MS / KSP_DESK_SPLASH_FADE_MS + .env.example
|
||||
- navigation monofenêtre
|
||||
- normalisation du CWD debug vers la racine workspace avant bootstrap Config
|
||||
- navigation monofenêtre + header `Config Desk — <vue>`
|
||||
- helpers show/focus/destroy
|
||||
- instrumentation debug/trace des interactions et mutations frontend
|
||||
- instrumentation debug/trace des interactions, tabs et timings splash
|
||||
|
||||
pre.009 Documents + diagnostics
|
||||
- inventaire générique par registre
|
||||
@@ -1419,6 +1429,6 @@ Aucune question n'empêche d'ouvrir le développement après validation du prés
|
||||
2. nom exact et nombre minimal de variables splash Config/.env ;
|
||||
3. features Cargo minimales de Tauri/Tokio nécessaires au shell/splash ;
|
||||
4. détails du fallback Logging minimal utilisé uniquement lorsque la Config Logging ne peut pas être résolue au démarrage ;
|
||||
5. usage exact des helpers console de `@fltsci/tauri-plugin-tracing` (`attachConsole`, `interceptConsole`, `takeoverConsole`) compatible avec le bridge KSP sans boucle/double émission ; si la version introduite permet un target JS namespacé `ksp-*`, l'adapter pourra être simplifié sans affaiblir Logging.
|
||||
5. implémentation exacte du retour Rust -> console WebKit : `attachConsole()` est retenu comme capacité candidate, mais seulement après intégration d'une `tauri_plugin_tracing::WebviewLayer` dans le subscriber possédé par `ksp-logging-lib`; `interceptConsole()`/`takeoverConsole()` ne doivent pas doubler le bridge JS -> Rust KSP ni réintroduire des targets non conformes.
|
||||
|
||||
Ces points doivent être résolus par code/tests dans les prereleases prévues, pas par contournement applicatif.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/rules/RULES_KSP.md -->
|
||||
<!-- version: 25 -->
|
||||
<!-- version: 26 -->
|
||||
|
||||
# Règles spécifiques à KSP
|
||||
|
||||
@@ -220,6 +220,8 @@
|
||||
- **KSP-APP-025** — Dans `package.json`, les bibliothèques consommées par le bundle applicatif appartiennent à `dependencies`; les outils de build/développement et paquets `@types/*` appartiennent à `devDependencies`. npm est utilisé directement uniquement pour installer ou mettre à jour ces dépendances. Le cycle normal de développement/build passe par Tauri, qui déclenche les scripts npm configurés via `beforeDevCommand`/`beforeBuildCommand`; les lockfiles frontend restent non versionnés.
|
||||
- **KSP-APP-026** — KSP étant un workspace Rust multi-app, les commandes Tauri lancées depuis la racine sélectionnent explicitement la configuration de l'application avec `-c crates/<app>/tauri.conf.json` (par exemple `cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json`). Après une installation npm effectuée depuis `crates/<app>`, l'opérateur revient à la racine du workspace avant le cycle Cargo/Tauri.
|
||||
- **KSP-APP-027** — Les applications Tauri KSP instrumentent systématiquement le comportement frontend via le bridge Logging commun : actions utilisateur et transitions d’état significatives en `debug`, événements techniques fins, rendu/remplacement de sections et étapes fréquentes en `trace`. Les chargements/rafraîchissements de données sont tracés au début et à la fin sans journaliser les payloads sensibles. Cette instrumentation doit permettre de reconstruire le déroulement frontend sans dépendre uniquement de l’état visuel.
|
||||
- **KSP-APP-028** — Le header d’une application desk ne répète pas inutilement l’identité déjà portée par son logo : il affiche le nom ou l’abréviation fonctionnelle de l’application, puis un tiret cadratin `—` et le titre de la vue active. Les commandes principales peu nombreuses peuvent utiliser des tabs/pills alignées à droite ; lorsque leur nombre nuit à la lisibilité ou à l’espace disponible, un dropdown est préféré.
|
||||
- **KSP-APP-029** — En développement workspace, une application desk Tauri normalise le current working directory du processus Rust vers la racine du workspace avant le bootstrap Config lorsque `cargo tauri ... -c crates/<app>/tauri.conf.json` lance le binaire depuis la crate. Cette adaptation ne lit ni ne parse directement `config/`, `.env` ou les variables `KSP_*`/`KSPB_*` : `ksp-config-lib` reste seul propriétaire de ces ressources. Le comportement de distribution/release reste défini séparément et ne doit pas dépendre d’un checkout source.
|
||||
|
||||
## Data plane / control plane
|
||||
|
||||
|
||||
Reference in New Issue
Block a user