v0.1.4-pre.015-fix.001
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# file: Cargo.toml
|
||||
# version: 84
|
||||
# version: 85
|
||||
|
||||
[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.15"
|
||||
version = "0.1.4-pre.15.fix.1"
|
||||
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: 16 -->
|
||||
<!-- version: 17 -->
|
||||
|
||||
# `ksp-app-config-desk`
|
||||
|
||||
@@ -145,7 +145,7 @@ L'inspection expose le profil par défaut ou une sélection explicite, les vues
|
||||
|
||||
La vue **Logging** charge le document standard exclusivement avec `ConfigManagement::load_logging_document()`. Rust mappe ensuite les types publics `LoggingConfigDocument`, `LoggingProfileConfig`, `LoggingConsoleConfig`, `LoggingFileConfig`, `LoggingOutputFilterConfig` et `LoggingTargetFilterConfig` vers des DTO TS-RS dédiés. Le frontend ne parse donc ni le JSON source ni son schema.
|
||||
|
||||
Le panneau expose `format_version`, `logs_directory`, `default_profile`, tous les profils, la console, les fichiers persistants, les filtres locaux, les target overrides et les listes de targets/domains. En `pre.015`, le frontend maintient un brouillon typé : create/clone/rename/delete de profils, 0/1/N file sinks et target filters restent locaux jusqu'à **Sauvegarder**. Le backend reconstruit les types publics Config et appelle `ConfigManagement::save_logging_document()`, qui valide la totalité du candidat avant remplacement atomique. Le runtime actif n'est pas reconfiguré avant `pre.016`.
|
||||
Le panneau expose `format_version`, `logs_directory`, `default_profile`, tous les profils, la console, les fichiers persistants, les filtres locaux, les target overrides et les listes de targets/domains. En `pre.015`, le frontend maintient un brouillon typé : create/clone/rename/delete de profils, 0/1/N file sinks et target filters restent locaux jusqu'à **Sauvegarder**. Le backend reconstruit les types publics Config et appelle `ConfigManagement::save_logging_document()`, qui valide la totalité du candidat avant remplacement atomique. **Sauvegarder** et **Recharger le document** n'agissent que sur la source persistée : le subscriber `tracing` actif conserve la configuration installée au démarrage. Un redémarrage de l'application applique la source persistée ; le hot reload sans redémarrage est réservé à `pre.016`.
|
||||
|
||||
## Traçabilité frontend
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-app-config-desk/USAGE.md -->
|
||||
<!-- version: 16 -->
|
||||
<!-- version: 17 -->
|
||||
|
||||
# Utilisation de `ksp-app-config-desk`
|
||||
|
||||
@@ -210,5 +210,5 @@ La vue **Logging** appelle `get_logging_document`. Le backend charge le document
|
||||
- tous les fichiers (`output_id`, path, rotation, format, ANSI et filtre) ;
|
||||
- tous les `target_filters` globaux.
|
||||
|
||||
Le sélecteur **Profil édité** travaille sur un brouillon local. `logs_directory`, `default_profile`, profils, console, file sinks, filtres et target overrides sont modifiables. **Créer**, **Cloner**, **Renommer** et **Supprimer** agissent d'abord sur le brouillon ; la suppression de profil est confirmée par modal Bootstrap. **Sauvegarder** envoie un candidat typé à `save_logging_document`, qui reconstruit les contrats Config et persiste atomiquement après validation. **Recharger** resynchronise depuis la source et demande confirmation si le brouillon contient des changements non sauvegardés. Le runtime Logging actif ne change pas dans `pre.015`.
|
||||
Le sélecteur **Profil édité** travaille sur un brouillon local. `logs_directory`, `default_profile`, profils, console, file sinks, filtres et target overrides sont modifiables. **Créer**, **Cloner**, **Renommer** et **Supprimer** agissent d'abord sur le brouillon ; la suppression de profil est confirmée par modal Bootstrap. **Sauvegarder** envoie un candidat typé à `save_logging_document`, qui reconstruit les contrats Config et persiste atomiquement après validation. **Recharger le document** resynchronise le brouillon depuis la source persistée et demande confirmation si des changements non sauvegardés existent. Ni cette action ni **Sauvegarder** ne reconstruisent le subscriber `tracing` actif en `pre.015` : la configuration persistée prend effet après redémarrage de l'application ; le hot reload sans redémarrage est livré en `pre.016`. Les messages Cargo/Tauri/Vite affichés par `cargo tauri dev` sont externes au runtime Logging KSP et ne dépendent pas de `console.enabled`.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-app-config-desk/frontend/main.html -->
|
||||
<!-- version: 11 -->
|
||||
<!-- version: 12 -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
@@ -301,12 +301,12 @@
|
||||
<div class="d-flex flex-wrap gap-2 align-items-center justify-content-between mb-3">
|
||||
<div>
|
||||
<h2 class="h5 mb-1">Logging editor — mutations/persistence</h2>
|
||||
<p class="text-body-secondary small mb-0">Brouillon typé de <code>std.logging.json</code>, validé et persisté atomiquement par <code>ksp-config-lib</code>. Le runtime Logging n'est pas rechargé dans cette tranche.</p>
|
||||
<p class="text-body-secondary small mb-0">Brouillon typé de <code>std.logging.json</code>, validé et persisté atomiquement par <code>ksp-config-lib</code>. Sauvegarder ou recharger le document ne reconfigure pas le runtime Logging déjà actif.</p>
|
||||
</div>
|
||||
<div class="d-flex gap-2">
|
||||
<button id="refreshLoggingDocument" class="btn btn-outline-primary btn-sm" type="button">
|
||||
<i class="fa-solid fa-rotate me-1" aria-hidden="true"></i>
|
||||
Recharger
|
||||
Recharger le document
|
||||
</button>
|
||||
<button id="saveLoggingDocument" class="btn btn-primary btn-sm" type="button" disabled>
|
||||
<i class="fa-solid fa-floppy-disk me-1" aria-hidden="true"></i>
|
||||
@@ -437,7 +437,10 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div id="loggingSaveReport" class="small text-body-secondary mb-2">Aucune sauvegarde effectuée pendant ce lancement.</div>
|
||||
<div class="alert alert-warning small py-2 mb-2" role="note">
|
||||
<strong>Runtime actif :</strong> le subscriber <code>tracing</code> a été construit au démarrage de l'application. Les boutons <strong>Sauvegarder</strong> et <strong>Recharger le document</strong> agissent uniquement sur <code>std.logging.json</code>. Pour appliquer la source persistée en <code>pre.015</code>, il faut redémarrer l'application ; le hot reload sans redémarrage arrive en <code>pre.016</code>.
|
||||
</div>
|
||||
<div id="loggingSaveReport" class="small text-body-secondary mb-2">Aucune sauvegarde effectuée pendant ce lancement ; runtime actif inchangé.</div>
|
||||
<div id="loggingStatus" class="alert alert-primary mb-0" role="status" aria-live="polite">Chargement du document Logging typé...</div>
|
||||
</section>
|
||||
|
||||
@@ -459,11 +462,11 @@
|
||||
<button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Annuler"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p class="mb-0">Des modifications non sauvegardées existent. Recharger la source les abandonnera.</p>
|
||||
<p class="mb-0">Des modifications non sauvegardées existent. Recharger le document depuis la source persistée les abandonnera. Cette action ne recharge pas le runtime Logging.</p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">Annuler</button>
|
||||
<button id="loggingDiscardDraftConfirm" class="btn btn-danger" type="button">Abandonner et recharger</button>
|
||||
<button id="loggingDiscardDraftConfirm" class="btn btn-danger" type="button">Abandonner et recharger le document</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-config-desk/frontend/ts/logging.ts
|
||||
// version: 2
|
||||
// version: 3
|
||||
|
||||
//! Typed Logging editor backed exclusively by ConfigManagement validation and persistence.
|
||||
|
||||
@@ -512,8 +512,13 @@ async function saveLoggingDocument(): Promise<void> {
|
||||
try {
|
||||
const result = await invokeKsp<LoggingDocumentSaveResultDto>("main", "save_logging_document", { candidate: draft });
|
||||
renderDocument(result.document);
|
||||
setText("#loggingSaveReport", `source_changed=${result.sourceChanged} · reload_required=${result.reloadRequired} · runtime Logging inchangé`);
|
||||
setLoggingStatus(result.sourceChanged ? "Document Logging validé et persisté. Le runtime sera traité en pre.016." : "Document Logging valide mais source inchangée.", "success");
|
||||
setText("#loggingSaveReport", `source_changed=${result.sourceChanged} · reload_required=${result.reloadRequired} · document persisté · runtime actif inchangé`);
|
||||
setLoggingStatus(
|
||||
result.sourceChanged
|
||||
? "Document Logging validé et persisté. Le subscriber actif conserve la configuration du démarrage jusqu'au redémarrage de l'application ou au hot reload de pre.016."
|
||||
: "Document Logging valide mais source inchangée. Le runtime actif n'a pas été reconfiguré.",
|
||||
"success",
|
||||
);
|
||||
frontendDebug("main", "Typed Logging document persistence completed", {
|
||||
sourceChanged: result.sourceChanged,
|
||||
reloadRequired: result.reloadRequired,
|
||||
@@ -556,7 +561,10 @@ async function refreshLoggingDocument(source: "startup" | "user"): Promise<void>
|
||||
try {
|
||||
const documentDto = await invokeKsp<LoggingDocumentDto>("main", "get_logging_document");
|
||||
renderDocument(documentDto);
|
||||
setLoggingStatus(`${documentDto.profiles.length} profil(s) Logging chargé(s). Le brouillon est synchronisé avec la source.`, "success");
|
||||
setLoggingStatus(
|
||||
`${documentDto.profiles.length} profil(s) Logging chargé(s). Le brouillon est synchronisé avec la source persistée ; le runtime actif reste celui du démarrage.`,
|
||||
"success",
|
||||
);
|
||||
frontendDebug("main", "Logging document reload completed", {
|
||||
profileCount: documentDto.profiles.length,
|
||||
defaultProfile: documentDto.defaultProfile,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-config-lib/tests/public_api.rs
|
||||
// version: 14
|
||||
// version: 15
|
||||
|
||||
//! Integration tests for the public `ksp-config-lib` bootstrap, registry, JSON/profile/composite, environment-resolution, sensitivity, Logging-adapter and
|
||||
//! management contracts.
|
||||
@@ -219,11 +219,11 @@ fn management_contracts_are_available_from_crate_root() {
|
||||
assert_eq!(logging.profiles()[0].profile_id(), "local_dev");
|
||||
assert_eq!(logging.profiles()[0].files().len(), 2);
|
||||
assert!(!logging.profiles()[0].files()[0].ansi());
|
||||
if let std::option::Option::Some(profile) = logging.profiles_mut().first_mut() {
|
||||
if let std::option::Option::Some(file) = profile.files_mut().first_mut() {
|
||||
file.set_ansi(false);
|
||||
assert!(!file.ansi());
|
||||
}
|
||||
if let std::option::Option::Some(profile) = logging.profiles_mut().first_mut()
|
||||
&& let std::option::Option::Some(file) = profile.files_mut().first_mut()
|
||||
{
|
||||
file.set_ansi(false);
|
||||
assert!(!file.ansi());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
73
deltas/0.1.4/pre.015-fix.001.md
Normal file
73
deltas/0.1.4/pre.015-fix.001.md
Normal file
@@ -0,0 +1,73 @@
|
||||
<!-- file: deltas/0.1.4/pre.015-fix.001.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.1.4-pre.015-fix.001` — clarification document/runtime Logging et Clippy
|
||||
|
||||
## Statut
|
||||
|
||||
Correctif de `0.1.4-pre.015` livré pour validation locale.
|
||||
|
||||
La persistence typée de `pre.015` fonctionne : création/clonage/renommage/suppression de profils, multi-sinks, sauvegarde atomique et refus d'un candidat invalide ont été exercés. Deux points nécessitent néanmoins un correctif avant validation de la tranche :
|
||||
|
||||
- `cargo clippy --workspace --all-targets` signale un `collapsible_if` dans le test public de `ksp-config-lib` ;
|
||||
- l'interface peut laisser croire que **Recharger** applique au runtime actif une modification persistée, alors que `pre.015` ne fait volontairement aucun hot reload.
|
||||
|
||||
## Cause du comportement console
|
||||
|
||||
`console.enabled=false` est bien persisté dans `std.logging.json`, mais le subscriber `tracing` global a déjà été construit au démarrage du processus. En `pre.015`, ni **Sauvegarder** ni le rechargement du brouillon ne passent par `ksp_logging_lib::reinitialize()`.
|
||||
|
||||
Par conséquent :
|
||||
|
||||
1. la sauvegarde modifie la source persistée ;
|
||||
2. **Recharger le document** relit cette source et resynchronise le brouillon ;
|
||||
3. le runtime Logging du processus courant reste inchangé ;
|
||||
4. un redémarrage de l'application applique la nouvelle source ;
|
||||
5. le hot reload sans redémarrage reste la responsabilité de `pre.016`.
|
||||
|
||||
Les lignes émises par Cargo, Tauri CLI et Vite avant/pendant `cargo tauri dev` ne sont pas des événements du runtime Logging KSP et ne sont jamais contrôlées par `console.enabled`.
|
||||
|
||||
## Modifications
|
||||
|
||||
### Clippy
|
||||
|
||||
- correction du `collapsible_if` dans `crates/ksp-config-lib/tests/public_api.rs` avec une chaîne `if let ... && let ...` compatible Rust 2024 ;
|
||||
- aucun affaiblissement du test public `LoggingFileConfig::set_ansi()`.
|
||||
|
||||
### Config Desk
|
||||
|
||||
- renommage du bouton Logging **Recharger** en **Recharger le document** ;
|
||||
- ajout d'un avertissement permanent distinguant clairement la source persistée du subscriber actif ;
|
||||
- après sauvegarde, le rapport indique explicitement `document persisté · runtime actif inchangé` ;
|
||||
- après rechargement, le statut précise que seul le brouillon est resynchronisé avec la source ;
|
||||
- le modal d'abandon d'un brouillon sale précise lui aussi qu'il ne recharge pas le runtime.
|
||||
|
||||
### Documentation
|
||||
|
||||
- README et USAGE explicitent la frontière `document persisté` / `runtime actif` ;
|
||||
- USAGE rappelle que les sorties Cargo/Tauri/Vite restent visibles même lorsque la console KSP est désactivée ;
|
||||
- plan `0.1.4` complète `pre.015` avec cette distinction et conserve `pre.016` comme propriétaire du hot reload.
|
||||
|
||||
## Version technique
|
||||
|
||||
```text
|
||||
0.1.4-pre.15.fix.1
|
||||
```
|
||||
|
||||
## Validation attendue
|
||||
|
||||
```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 tauri dev -c crates/ksp-app-config-desk/tauri.conf.json
|
||||
```
|
||||
|
||||
Puis :
|
||||
|
||||
1. dans Logging, décocher **Console / Enabled** pour le profil par défaut ;
|
||||
2. sauvegarder puis **Recharger le document** : la case doit rester décochée, mais les logs applicatifs du processus courant peuvent continuer car le runtime n'a pas été reconfiguré ;
|
||||
3. arrêter complètement l'application puis relancer `cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json` ;
|
||||
4. distinguer les messages Cargo/Tauri/Vite des événements KSP : avec `console.enabled=false`, aucune nouvelle ligne applicative horodatée `ksp-app-config-desk...` ne doit être routée vers la console par le runtime KSP ;
|
||||
5. réactiver ensuite la console dans la source si nécessaire pour poursuivre les validations `pre.015` avant `pre.016`.
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md -->
|
||||
<!-- version: 17 -->
|
||||
<!-- version: 18 -->
|
||||
|
||||
# Plan `0.1.4` — `ksp-app-config-desk`
|
||||
|
||||
@@ -1243,6 +1243,8 @@ pre.015 Logging editor — mutations/persistence [en cours]
|
||||
- default_profile
|
||||
- mono-fichier/multi-fichiers
|
||||
- save_logging_document
|
||||
- UI explicite : rechargement du document != reconfiguration du runtime actif
|
||||
- source persistée appliquée au prochain démarrage tant que pre.016 n'est pas livrée
|
||||
|
||||
pre.016 Logging runtime
|
||||
- fichiers applicatifs uniques par lancement avec timestamp de démarrage
|
||||
|
||||
Reference in New Issue
Block a user