v0.2.12-pre.002-fix.001
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# file: Cargo.toml
|
||||
# version: 287
|
||||
# version: 288
|
||||
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
members = ["crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.2.12-pre.2"
|
||||
version = "0.2.12-pre.2.fix.1"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||
|
||||
25
crates/ksp-app-solprices-desk/frontend/fonts/README.md
Normal file
25
crates/ksp-app-solprices-desk/frontend/fonts/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
<!-- file: crates/ksp-app-solprices-desk/frontend/fonts/README.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Fonts du splash SOL Prices Desk
|
||||
|
||||
SOL Prices Desk réutilise le gabarit de splash KSP déjà stabilisé dans Config Desk et Wallet Desk et conserve la police locale :
|
||||
|
||||
```text
|
||||
DOS_Amazigh.ttf
|
||||
font-family: Dos Amazigh
|
||||
```
|
||||
|
||||
Destination :
|
||||
|
||||
```text
|
||||
crates/ksp-app-solprices-desk/frontend/fonts/DOS_Amazigh.ttf
|
||||
```
|
||||
|
||||
Empreinte SHA-256 de l'asset repris du gabarit :
|
||||
|
||||
```text
|
||||
a01ff4b5a0d699db7cefcf5336bf0e379ff6fbf0d096087571a13c8782f9aa02
|
||||
```
|
||||
|
||||
`splash.scss` déclare `Dos Amazigh` avec `@font-face` et l'applique au titre `#app-name`.
|
||||
@@ -1,11 +1,11 @@
|
||||
<!-- file: crates/ksp-app-solprices-desk/frontend/main.html -->
|
||||
<!-- version: 2 -->
|
||||
<!-- version: 3 -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta charset="utf-8">
|
||||
<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>SOL Prices Desk — Prices</title>
|
||||
@@ -21,7 +21,6 @@
|
||||
<span class="mx-2 fs-5 text-body-secondary" aria-hidden="true">—</span>
|
||||
<span id="headerViewTitle" class="fs-5 text-body text-nowrap">Prices</span>
|
||||
</div>
|
||||
<span id="runtimeVersionBadge" class="badge text-bg-secondary">0.2.12-pre.2</span>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
@@ -51,7 +50,7 @@
|
||||
<p class="text-body-secondary mb-0">Scaffold desktop actif. Le runtime Off-chain et la table SOL/USD arrivent dans les tranches suivantes.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="scaffold-placeholder border rounded-3 d-flex align-items-center justify-content-center bg-body-tertiary text-center p-4">
|
||||
<div class="app-placeholder">
|
||||
<div>
|
||||
<i class="fa-solid fa-chart-line fa-3x text-body-secondary mb-3" aria-hidden="true"></i>
|
||||
<h2 class="h5">Surface prix volontairement inactive</h2>
|
||||
@@ -69,7 +68,7 @@
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-header fw-semibold">Runtime</div>
|
||||
<div class="card-body">
|
||||
<dl class="row mb-0">
|
||||
<dl class="row mb-0 app-runtime-list">
|
||||
<dt class="col-sm-5">Version</dt>
|
||||
<dd id="runtimeVersion" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Phase</dt>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-solprices-desk/frontend/sass/_app.scss
|
||||
// version: 2
|
||||
// version: 3
|
||||
|
||||
$app-header-height: 72px;
|
||||
$app-footer-height: 42px;
|
||||
@@ -46,22 +46,22 @@ body {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.app-scrollable {
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.app-logo {
|
||||
display: block;
|
||||
width: auto;
|
||||
height: 42px;
|
||||
}
|
||||
|
||||
.app-scrollable {
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.app-shell-card {
|
||||
max-width: 1320px;
|
||||
}
|
||||
|
||||
.app-shell-status {
|
||||
.app-runtime-list dd {
|
||||
font-family: var(--bs-font-monospace);
|
||||
}
|
||||
|
||||
@@ -85,10 +85,21 @@ body {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.app-overview-list dd {
|
||||
font-family: var(--bs-font-monospace);
|
||||
.app-placeholder {
|
||||
min-height: 320px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
padding: 2rem;
|
||||
border: 1px dashed var(--bs-border-color);
|
||||
border-radius: var(--bs-border-radius-lg);
|
||||
color: var(--bs-secondary-color);
|
||||
background: var(--bs-body-bg);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.scaffold-placeholder {
|
||||
min-height: 280px;
|
||||
.app-placeholder i {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
<!-- file: crates/ksp-app-solprices-desk/frontend/splash.html -->
|
||||
<!-- version: 1 -->
|
||||
<!-- version: 2 -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta charset="utf-8">
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport">
|
||||
<link rel="icon" href="imgs/logo.png">
|
||||
<link rel="stylesheet" href="sass/splash.scss">
|
||||
<title>Chargement — SOL Prices Desk</title>
|
||||
<title>KSP SOL Prices Desk — Chargement</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="splash-container" style="opacity: 0;">
|
||||
<img id="splash-image" src="imgs/splash.png" alt="Chargement de KSP Sol Prices Desk">
|
||||
<img id="splash-image" src="imgs/splash.png" alt="Chargement de KSP SOL Prices Desk">
|
||||
<div id="app-name">SOL Prices Desk</div>
|
||||
<div id="debug-info" aria-live="off" hidden></div>
|
||||
<div id="messages-container" aria-live="polite"></div>
|
||||
|
||||
@@ -1,23 +1,29 @@
|
||||
// file: crates/ksp-app-solprices-desk/frontend/ts/main.ts
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
import "bootstrap";
|
||||
import ResizeObserver from "resize-observer-polyfill";
|
||||
import "simplebar";
|
||||
import { getCurrentWindow } from "@tauri-apps/api/window";
|
||||
import type { RuntimeStatusDto } from "./bindings/ksp_app_solprices_desk/dto_common/RuntimeStatusDto.ts";
|
||||
import { frontendDebug, frontendInfo, frontendTrace, installFrontendConsoleBridge } from "./frontend_log";
|
||||
import { frontendDebug, frontendInfo, frontendTrace, frontendWarn, installFrontendConsoleBridge } from "./frontend_log";
|
||||
import { invokeKsp } from "./invoke";
|
||||
|
||||
(window as Window & typeof globalThis & { ResizeObserver?: typeof ResizeObserver }).ResizeObserver = ResizeObserver;
|
||||
installFrontendConsoleBridge("main");
|
||||
|
||||
const viewTitles: Record<string, string> = {
|
||||
type ViewId = "prices" | "diagnostics";
|
||||
|
||||
const viewTitles: Record<ViewId, string> = {
|
||||
prices: "Prices",
|
||||
diagnostics: "Diagnostics",
|
||||
};
|
||||
|
||||
function activateView(viewId: string): void {
|
||||
if (!(viewId in viewTitles)) {
|
||||
return;
|
||||
}
|
||||
function isViewId(value: string | undefined): value is ViewId {
|
||||
return value === "prices" || value === "diagnostics";
|
||||
}
|
||||
|
||||
function activateView(viewId: ViewId, source: "startup" | "user"): void {
|
||||
document.querySelectorAll<HTMLElement>("[data-view-panel]").forEach(panel => {
|
||||
panel.hidden = panel.dataset.viewPanel !== viewId;
|
||||
});
|
||||
@@ -28,7 +34,22 @@ function activateView(viewId: string): void {
|
||||
if (header) {
|
||||
header.textContent = viewTitles[viewId];
|
||||
}
|
||||
frontendDebug("main", "SOL Prices Desk view activated", { viewId });
|
||||
document.title = `SOL Prices Desk — ${viewTitles[viewId]}`;
|
||||
if (source !== "startup") {
|
||||
frontendDebug("main", "SOL Prices Desk view activated", { viewId, source });
|
||||
}
|
||||
}
|
||||
|
||||
function bindNavigation(): void {
|
||||
document.querySelectorAll<HTMLButtonElement>("[data-view]").forEach(button => {
|
||||
button.addEventListener("click", () => {
|
||||
const viewId = button.dataset.view;
|
||||
if (isViewId(viewId)) {
|
||||
activateView(viewId, "user");
|
||||
}
|
||||
});
|
||||
});
|
||||
frontendTrace("main", "SOL Prices Desk navigation handlers installed");
|
||||
}
|
||||
|
||||
function renderRuntimeStatus(status: RuntimeStatusDto): void {
|
||||
@@ -45,10 +66,6 @@ function renderRuntimeStatus(status: RuntimeStatusDto): void {
|
||||
element.textContent = value;
|
||||
}
|
||||
}
|
||||
const badge = document.querySelector<HTMLElement>("#runtimeVersionBadge");
|
||||
if (badge) {
|
||||
badge.textContent = status.applicationVersion;
|
||||
}
|
||||
const diagnostic = document.querySelector<HTMLElement>("#runtimeDiagnostic");
|
||||
if (diagnostic) {
|
||||
diagnostic.hidden = status.startupDiagnostic === null;
|
||||
@@ -60,19 +77,26 @@ function renderRuntimeStatus(status: RuntimeStatusDto): void {
|
||||
});
|
||||
}
|
||||
|
||||
async function initializeMain(): Promise<void> {
|
||||
frontendInfo("main", "SOL Prices Desk scaffold frontend loaded");
|
||||
document.querySelectorAll<HTMLButtonElement>("[data-view]").forEach(button => {
|
||||
button.addEventListener("click", () => {
|
||||
const viewId = button.dataset.view;
|
||||
if (viewId) {
|
||||
activateView(viewId);
|
||||
}
|
||||
});
|
||||
});
|
||||
const status = await invokeKsp<RuntimeStatusDto>("main", "runtime_status");
|
||||
async function loadRuntimeStatus(): Promise<void> {
|
||||
const status = await invokeKsp<RuntimeStatusDto>("main", "get_runtime_status");
|
||||
renderRuntimeStatus(status);
|
||||
activateView("prices");
|
||||
}
|
||||
|
||||
async function initializeMain(): Promise<void> {
|
||||
const windowLabel = getCurrentWindow().label;
|
||||
frontendInfo("main", "SOL Prices Desk main frontend loaded", { windowLabel });
|
||||
bindNavigation();
|
||||
activateView("prices", "startup");
|
||||
try {
|
||||
await loadRuntimeStatus();
|
||||
} catch {
|
||||
const diagnostic = document.querySelector<HTMLElement>("#runtimeDiagnostic");
|
||||
if (diagnostic) {
|
||||
diagnostic.hidden = false;
|
||||
diagnostic.textContent = "Le statut runtime initial n'a pas pu être chargé.";
|
||||
}
|
||||
frontendWarn("main", "SOL Prices Desk startup runtime status load failed");
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "ksp-app-solprices-desk",
|
||||
"private": true,
|
||||
"version": "0.2.12-pre.2",
|
||||
"version": "0.2.12-pre.2.fix.1",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-solprices-desk/src/tauri.rs
|
||||
// version: 1
|
||||
// version: 3
|
||||
|
||||
//! Tauri runtime assembly for the KSP SOL prices desktop application.
|
||||
|
||||
@@ -72,7 +72,7 @@ fn configure_plugins(builder: tauri::Builder<tauri::Wry>) -> tauri::Builder<taur
|
||||
|
||||
#[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![emit_frontend_log, runtime_status, splash_frontend_ready]);
|
||||
return builder.invoke_handler(tauri::generate_handler![emit_frontend_log, get_runtime_status, splash_frontend_ready,]);
|
||||
}
|
||||
|
||||
fn configure_setup(builder: tauri::Builder<tauri::Wry>) -> tauri::Builder<tauri::Wry> {
|
||||
@@ -85,10 +85,20 @@ fn configure_setup(builder: tauri::Builder<tauri::Wry>) -> tauri::Builder<tauri:
|
||||
if let std::result::Result::Err(error) = main {
|
||||
return std::result::Result::Err(std::boxed::Box::new(error));
|
||||
}
|
||||
ksp_logging_lib::debug!(target: crate::TRACING_TARGET, domain = crate::TRACING_DOMAIN_SHELL, "SOL Prices Desk Tauri shell setup completed");
|
||||
return std::result::Result::Ok(());
|
||||
});
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn get_runtime_status(state: tauri::State<'_, crate::AppState>) -> std::result::Result<crate::RuntimeStatusDto, crate::CommandErrorDto> {
|
||||
let result = state.runtime_status();
|
||||
return match result {
|
||||
std::result::Result::Ok(value) => std::result::Result::Ok(value),
|
||||
std::result::Result::Err(error) => std::result::Result::Err(crate::CommandErrorDto::from_error(&error)),
|
||||
};
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn emit_frontend_log(payload: crate::FrontendLogPayloadDto) -> std::result::Result<(), crate::CommandErrorDto> {
|
||||
let result = crate::emit_frontend_log_event(payload);
|
||||
@@ -98,15 +108,6 @@ fn emit_frontend_log(payload: crate::FrontendLogPayloadDto) -> std::result::Resu
|
||||
};
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn runtime_status(state: tauri::State<'_, crate::AppState>) -> std::result::Result<crate::RuntimeStatusDto, crate::CommandErrorDto> {
|
||||
let result = state.runtime_status();
|
||||
return match result {
|
||||
std::result::Result::Ok(value) => std::result::Result::Ok(value),
|
||||
std::result::Result::Err(error) => std::result::Result::Err(crate::CommandErrorDto::from_error(&error)),
|
||||
};
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
async fn splash_frontend_ready(
|
||||
app: tauri::AppHandle,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "KSP SOL Prices Desk",
|
||||
"version": "0.2.12-pre.2",
|
||||
"version": "0.2.12-pre.2.fix.1",
|
||||
"identifier": "com.sasedev.ksp-app-solprices-desk",
|
||||
"build": {
|
||||
"beforeDevCommand": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// file: crates/ksp-app-solprices-desk/tests/desktop_contract.rs
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
//! Desktop scaffold contract audits for SOL Prices Desk `0.2.12-pre.002`.
|
||||
//! Desktop scaffold and shared-template contract audits for SOL Prices Desk `0.2.12-pre.002` and its fixes.
|
||||
|
||||
fn app_root() -> std::path::PathBuf {
|
||||
return std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||
@@ -37,7 +37,9 @@ fn pre_002_shell_uses_reserved_ports_windows_and_owned_backend_paths() {
|
||||
let tauri = read_json(root.join("tauri.conf.json").as_path());
|
||||
assert_eq!(tauri.pointer("/productName").and_then(serde_json::Value::as_str), std::option::Option::Some("KSP SOL Prices Desk"));
|
||||
assert_eq!(tauri.pointer("/identifier").and_then(serde_json::Value::as_str), std::option::Option::Some("com.sasedev.ksp-app-solprices-desk"));
|
||||
assert_eq!(tauri.pointer("/version").and_then(serde_json::Value::as_str), std::option::Option::Some("0.2.12-pre.2"));
|
||||
assert_eq!(tauri.pointer("/version").and_then(serde_json::Value::as_str), std::option::Option::Some("0.2.12-pre.2.fix.1"));
|
||||
let package = read_json(root.join("package.json").as_path());
|
||||
assert_eq!(package.pointer("/version").and_then(serde_json::Value::as_str), std::option::Option::Some("0.2.12-pre.2.fix.1"));
|
||||
assert_eq!(tauri.pointer("/build/devUrl").and_then(serde_json::Value::as_str), std::option::Option::Some("http://localhost:1434"));
|
||||
assert_eq!(tauri.pointer("/build/beforeDevCommand/script").and_then(serde_json::Value::as_str), std::option::Option::Some("npm run dev"));
|
||||
assert_eq!(tauri.pointer("/build/beforeDevCommand/cwd").and_then(serde_json::Value::as_str), std::option::Option::Some("."));
|
||||
@@ -75,7 +77,8 @@ fn pre_002_package_is_mixed_lib_bin_and_frontend_is_scaffold_only() {
|
||||
let lib_rs = read_text(root.join("src/lib.rs").as_path());
|
||||
assert!(lib_rs.contains("pub use self::tauri::run"));
|
||||
let tauri_rs = read_text(root.join("src/tauri.rs").as_path());
|
||||
assert!(tauri_rs.contains("tauri::generate_handler![emit_frontend_log, runtime_status, splash_frontend_ready]"));
|
||||
assert!(tauri_rs.contains("get_runtime_status"));
|
||||
assert!(!tauri_rs.contains("fn runtime_status("));
|
||||
let main_html = read_text(root.join("frontend/main.html").as_path());
|
||||
assert!(main_html.contains("data-view=\"prices\""));
|
||||
assert!(main_html.contains("data-view=\"diagnostics\""));
|
||||
@@ -98,3 +101,50 @@ fn pre_002_packaging_contains_current_ten_config_resources_only() {
|
||||
assert!(tauri_source.contains("ksp_config_lib::prepare_packaged_runtime"));
|
||||
assert!(tauri_source.contains("std::env::set_current_dir(layout.runtime_root())"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_002_fix_001_reuses_the_common_ksp_desktop_template() {
|
||||
let root = app_root();
|
||||
let package = read_text(root.join("package.json").as_path());
|
||||
for dependency in ["@fltsci/tauri-plugin-tracing", "@fortawesome/fontawesome-free", "@tauri-apps/api", "bootstrap", "resize-observer-polyfill", "simplebar"]
|
||||
{
|
||||
assert!(package.contains(dependency), "missing common frontend dependency {dependency}");
|
||||
}
|
||||
let main_typescript = read_text(root.join("frontend/ts/main.ts").as_path());
|
||||
assert!(main_typescript.contains(r#"import ResizeObserver from "resize-observer-polyfill""#));
|
||||
assert!(main_typescript.contains(".ResizeObserver = ResizeObserver"));
|
||||
assert!(main_typescript.contains("getCurrentWindow().label"));
|
||||
assert!(main_typescript.contains(r#""get_runtime_status""#));
|
||||
let main_html = read_text(root.join("frontend/main.html").as_path());
|
||||
assert!(main_html.contains(r#"<footer class="app-footer bg-dark text-light">"#));
|
||||
assert!(main_html.contains(r#"class="app-placeholder""#));
|
||||
assert!(main_html.contains(r#"class="row mb-0 app-runtime-list""#));
|
||||
assert!(!main_html.contains("runtimeVersionBadge"));
|
||||
let splash_html = read_text(root.join("frontend/splash.html").as_path());
|
||||
assert!(splash_html.contains("<title>KSP SOL Prices Desk — Chargement</title>"));
|
||||
let splash_scss = read_text(root.join("frontend/sass/splash.scss").as_path());
|
||||
assert!(splash_scss.contains("DOS_Amazigh.ttf"));
|
||||
assert!(splash_scss.contains(r#"font-family: "Dos Amazigh", sans-serif"#));
|
||||
let font_manifest = read_text(root.join("frontend/fonts/README.md").as_path());
|
||||
assert!(font_manifest.contains("a01ff4b5a0d699db7cefcf5336bf0e379ff6fbf0d096087571a13c8782f9aa02"));
|
||||
let font = std::fs::read(root.join("frontend/fonts/DOS_Amazigh.ttf"));
|
||||
let config_font = std::fs::read(root.join("../ksp-app-config-desk/frontend/fonts/DOS_Amazigh.ttf"));
|
||||
let wallet_font = std::fs::read(root.join("../ksp-app-wallet-desk/frontend/fonts/DOS_Amazigh.ttf"));
|
||||
assert!(font.is_ok());
|
||||
assert!(config_font.is_ok());
|
||||
assert!(wallet_font.is_ok());
|
||||
if let (std::result::Result::Ok(font), std::result::Result::Ok(config_font), std::result::Result::Ok(wallet_font)) = (font, config_font, wallet_font) {
|
||||
assert_eq!(font, config_font);
|
||||
assert_eq!(font, wallet_font);
|
||||
}
|
||||
for relative in ["_bootswatch.scss", "_fontawesome.scss", "_simplebar.scss", "_variables.scss", "main.scss", "splash.scss"] {
|
||||
let sol = read_text(root.join("frontend/sass").join(relative).as_path());
|
||||
let config = read_text(root.join("../ksp-app-config-desk/frontend/sass").join(relative).as_path());
|
||||
let wallet = read_text(root.join("../ksp-app-wallet-desk/frontend/sass").join(relative).as_path());
|
||||
let sol_body = sol.lines().skip(3).collect::<std::vec::Vec<_>>().join("\n");
|
||||
let config_body = config.lines().skip(3).collect::<std::vec::Vec<_>>().join("\n");
|
||||
let wallet_body = wallet.lines().skip(3).collect::<std::vec::Vec<_>>().join("\n");
|
||||
assert_eq!(sol_body, config_body, "SOL Prices Desk diverges from Config Desk template in {relative}");
|
||||
assert_eq!(sol_body, wallet_body, "SOL Prices Desk diverges from Wallet Desk template in {relative}");
|
||||
}
|
||||
}
|
||||
|
||||
218
deltas/0.2.12/pre.002-fix.001.md
Normal file
218
deltas/0.2.12/pre.002-fix.001.md
Normal file
@@ -0,0 +1,218 @@
|
||||
<!-- file: deltas/0.2.12/pre.002-fix.001.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.2.12-pre.002-fix.001` — alignement strict du gabarit desktop commun
|
||||
|
||||
## 1. Base requise
|
||||
|
||||
Ce correctif s'applique exclusivement après :
|
||||
|
||||
```text
|
||||
v0.2.11
|
||||
+ 0.2.12-pre.001
|
||||
+ 0.2.12-pre.001-fix.001
|
||||
+ 0.2.12-pre.002
|
||||
```
|
||||
|
||||
La base opérateur fournie contient déjà plusieurs corrections locales du scaffold `pre.002`; elles sont conservées et servent de source réelle à ce fix.
|
||||
|
||||
## 2. Motif du correctif
|
||||
|
||||
Le scaffold initial était fonctionnel mais encore trop dérivé au lieu d'être une reprise stricte du gabarit desktop KSP. `KSP-APP-008/009/015/019/023/027/028` imposent que Config Desk reste la référence et que les Desks suivants réutilisent les conventions stabilisées sauf justification explicite.
|
||||
|
||||
L'opérateur avait déjà corrigé plusieurs écarts avant ce delta :
|
||||
|
||||
```text
|
||||
@fltsci/tauri-plugin-tracing ajouté à package.json
|
||||
resize-observer-polyfill ajouté à package.json
|
||||
footer commun rétabli dans main.html
|
||||
DOS_Amazigh.ttf rétabli pour le splash
|
||||
splash.scss réaligné sur la police commune
|
||||
```
|
||||
|
||||
Le présent fix poursuit cet alignement au lieu d'écraser ces corrections.
|
||||
|
||||
## 3. Version technique
|
||||
|
||||
Le fix modifie Rust, TypeScript, HTML, SCSS et configuration Tauri réellement consommés au runtime. Conformément à `VER-ID-007/010`, le signal Cargo devient :
|
||||
|
||||
```text
|
||||
workspace.package.version = 0.2.12-pre.2.fix.1
|
||||
```
|
||||
|
||||
Le nouveau Desk synchronise également son `package.json` et son `tauri.conf.json` sur `0.2.12-pre.2.fix.1`.
|
||||
|
||||
## 4. Commandes et conventions backend réalignées
|
||||
|
||||
Le wrapper Tauri temporaire :
|
||||
|
||||
```text
|
||||
runtime_status
|
||||
```
|
||||
|
||||
devient :
|
||||
|
||||
```text
|
||||
get_runtime_status
|
||||
```
|
||||
|
||||
Il reprend ainsi la convention déjà utilisée par Wallet Desk (`get_runtime_status`) et reste cohérent avec Config Desk (`get_logging_runtime_status`). La méthode interne `AppState::runtime_status` reste inchangée : seul le nom de commande IPC exposé suit le gabarit `get_*`.
|
||||
|
||||
`configure_commands()` adopte la même présentation progressive que les Desks existants. `configure_setup()` émet désormais l'événement shell via `TRACING_DOMAIN_SHELL`, ce qui supprime les deux warnings `unused import` / `dead_code` observés par l'opérateur sans supprimer une convention déjà utilisée dans Wallet Desk.
|
||||
|
||||
## 5. Frontend commun réellement repris
|
||||
|
||||
`frontend/ts/main.ts` réutilise désormais les invariants du template Config/Wallet :
|
||||
|
||||
```text
|
||||
ResizeObserver importé depuis resize-observer-polyfill
|
||||
window.ResizeObserver installé avant le shell SimpleBar
|
||||
getCurrentWindow().label lu au bootstrap
|
||||
navigation installée via helper dédié
|
||||
loadRuntimeStatus() dédié
|
||||
commande get_runtime_status
|
||||
startup data load protégé par try/catch + warning sûr
|
||||
```
|
||||
|
||||
Le package `resize-observer-polyfill` n'est donc plus seulement déclaré : il est réellement consommé par le bundle.
|
||||
|
||||
Le badge de version propre au scaffold est retiré du header. Comme dans Config/Wallet Desk, le header garde l'identité fonctionnelle et le titre de vue ; la version reste visible dans Diagnostics via le DTO runtime.
|
||||
|
||||
## 6. HTML/SASS et splash
|
||||
|
||||
Le shell réutilise le vocabulaire de classes déjà stabilisé dans Wallet Desk :
|
||||
|
||||
```text
|
||||
app-runtime-list
|
||||
app-placeholder
|
||||
app-placeholder i
|
||||
```
|
||||
|
||||
`_app.scss` reprend le socle partagé dans le même ordre et ne conserve que les différences réellement applicatives.
|
||||
|
||||
Les partials communs suivants restent byte-equivalents hors headers `file/version` avec Config Desk et Wallet Desk :
|
||||
|
||||
```text
|
||||
_bootswatch.scss
|
||||
_fontawesome.scss
|
||||
_simplebar.scss
|
||||
_variables.scss
|
||||
main.scss
|
||||
splash.scss
|
||||
```
|
||||
|
||||
Le splash est réaligné sur la forme de titre commune :
|
||||
|
||||
```text
|
||||
KSP SOL Prices Desk — Chargement
|
||||
```
|
||||
|
||||
Le fichier `frontend/fonts/README.md` est ajouté pour tracer la même police `DOS_Amazigh.ttf` et la même empreinte SHA-256 que les deux Desks existants.
|
||||
|
||||
## 7. Canari anti-dérive du gabarit
|
||||
|
||||
`tests/desktop_contract.rs` ajoute un canari durable qui vérifie :
|
||||
|
||||
- dépendances frontend communes présentes ;
|
||||
- consommation réelle de `resize-observer-polyfill` ;
|
||||
- bootstrap via `getCurrentWindow()` ;
|
||||
- commande `get_runtime_status` ;
|
||||
- footer et classes shell communes ;
|
||||
- présence du manifest de font ;
|
||||
- bytes `DOS_Amazigh.ttf` identiques dans les trois Desks ;
|
||||
- corps des six partials SCSS communs identiques entre Config, Wallet et SOL Prices Desk.
|
||||
|
||||
Le canari ne demande pas que les styles métier `_app.scss` soient identiques : seuls le socle et le vocabulaire du template doivent rester communs, les sélecteurs spécifiques à chaque application restant légitimes.
|
||||
|
||||
## 8. Scope fonctionnel inchangé
|
||||
|
||||
Le fix n'ajoute aucun :
|
||||
|
||||
```text
|
||||
MarketPriceService
|
||||
ResolvedOffchainTransportConfig
|
||||
composite cfg.composite.ksp-app-solprices-desk
|
||||
provider DTO
|
||||
refresh row/many/all
|
||||
table prix
|
||||
DataTables
|
||||
plugin dialog/fs/http/shell frontend
|
||||
```
|
||||
|
||||
`pre.003` reste propriétaire du composite Config et du bootstrap Off-chain.
|
||||
|
||||
## 9. Retour opérateur acquis sur la base avant fix
|
||||
|
||||
L'opérateur a exécuté sur `0.2.12-pre.2` :
|
||||
|
||||
```text
|
||||
npm i -D PASS / 0 vulnerability
|
||||
cargo fmt --all PASS
|
||||
cargo test -p ksp-app-solprices-desk PASS / 12 unit + 7 integration/public tests
|
||||
cargo tauri dev PASS lancement Vite 1434 + binaire Tauri
|
||||
```
|
||||
|
||||
Les seuls diagnostics Rust visibles étaient :
|
||||
|
||||
```text
|
||||
unused import TRACING_DOMAIN_SHELL
|
||||
constant TRACING_DOMAIN_SHELL is never used
|
||||
```
|
||||
|
||||
Ce fix corrige précisément ces warnings en conservant le domaine shell et en l'utilisant comme Wallet Desk.
|
||||
|
||||
## 10. Fichiers modifiés
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
crates/ksp-app-solprices-desk/package.json
|
||||
crates/ksp-app-solprices-desk/tauri.conf.json
|
||||
crates/ksp-app-solprices-desk/frontend/main.html
|
||||
crates/ksp-app-solprices-desk/frontend/splash.html
|
||||
crates/ksp-app-solprices-desk/frontend/sass/_app.scss
|
||||
crates/ksp-app-solprices-desk/frontend/ts/main.ts
|
||||
crates/ksp-app-solprices-desk/src/tauri.rs
|
||||
crates/ksp-app-solprices-desk/tests/desktop_contract.rs
|
||||
docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md
|
||||
docs/validation/015-V0_2_12_SOL_PRICES_DESK.md
|
||||
```
|
||||
|
||||
## 11. Fichier ajouté
|
||||
|
||||
```text
|
||||
crates/ksp-app-solprices-desk/frontend/fonts/README.md
|
||||
deltas/0.2.12/pre.002-fix.001.md
|
||||
```
|
||||
|
||||
## 12. Fichiers volontairement inchangés
|
||||
|
||||
```text
|
||||
crates/ksp-app-config-desk/**
|
||||
crates/ksp-app-wallet-desk/**
|
||||
deltas/0.2.12/pre.002.md
|
||||
ROADMAP.md
|
||||
CHANGELOG.md
|
||||
prompts/017-V0_2_12_START_PROMPT.md
|
||||
config/**
|
||||
```
|
||||
|
||||
Les deux Desks stables restent la référence ; le correctif réaligne le nouveau Desk sur leur socle commun au lieu de modifier rétroactivement leurs surfaces métier.
|
||||
|
||||
## 13. Gate opérateur attendu
|
||||
|
||||
Après application :
|
||||
|
||||
```bash
|
||||
cargo fmt --all
|
||||
python3 scripts/audit_rust_workspace_rules.py
|
||||
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.12
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets
|
||||
cargo test -p ksp-app-solprices-desk
|
||||
cargo test --workspace
|
||||
(cd crates/ksp-app-solprices-desk && cargo tauri dev)
|
||||
```
|
||||
|
||||
Le `cargo tauri dev` doit confirmer le splash/font/footer/styles, Vite `1434/1435`, l'absence de warnings `TRACING_DOMAIN_SHELL` et le chargement de Diagnostics via `get_runtime_status`.
|
||||
|
||||
Aucun `cargo tauri build` final n'est exigé par ce fix intermédiaire ; les builds de production restent dans le couloir final prévu par le plan.
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md -->
|
||||
<!-- version: 3 -->
|
||||
<!-- version: 4 -->
|
||||
|
||||
# Plan `0.2.12` — SOL Prices Desk + intégration prix Wallet Desk
|
||||
|
||||
@@ -289,13 +289,13 @@ Config effective secret values
|
||||
|
||||
| Command | Input | Output | Owner | Sensibilité |
|
||||
|-----------------------------|--------------------------------------|----------------------------------|----------------------------------|-----------------------|
|
||||
| `runtime_status` | aucun | `MarketPriceRuntimeStatusDto` | AppState/Config runtime | safe |
|
||||
| `get_runtime_status` | aucun | `MarketPriceRuntimeStatusDto` | AppState/Config runtime | safe |
|
||||
| `list_market_prices` | aucun | `Vec<MarketPriceProviderRowDto>` | MarketPriceRuntime + registry | safe |
|
||||
| `refresh_market_price` | `provider_id` | `MarketPriceRefreshResultDto` | MarketPriceService::refresh | safe ID |
|
||||
| `refresh_market_prices` | liste bornée `provider_id` | `MarketPriceRefreshResultDto` | MarketPriceService::refresh_many | safe IDs |
|
||||
| `refresh_all_market_prices` | aucun | `MarketPriceRefreshResultDto` | MarketPriceService::refresh_all | safe |
|
||||
| `splash_frontend_ready` | fenêtre invoquante | ordre splash existant | Tauri window lifecycle | safe |
|
||||
| `frontend_log` | niveau/target/message déjà contrôlés | ack | logging bridge | safe-only by contract |
|
||||
| `emit_frontend_log` | niveau/target/message déjà contrôlés | ack | logging bridge | safe-only by contract |
|
||||
|
||||
Aucune command n'accepte URL, credential, header, rate-limit override ou payload provider.
|
||||
|
||||
@@ -476,6 +476,12 @@ Remplacement du forecast tabulaire par des sous-sections éditables avec statut
|
||||
|
||||
Création du scaffold strict de `ksp-app-solprices-desk` : crate lib/bin, shell Tauri, frontend de base, splash, logging et paire de ports réservée `1434/1435`. La tranche n'implémente encore ni table prix, ni `MarketPriceService`, ni refresh réseau.
|
||||
|
||||
#### `pre.002-fix.001` — Alignement strict du gabarit desktop commun
|
||||
|
||||
**Statut : implémenté ; gate opérateur à confirmer.**
|
||||
|
||||
Correction du scaffold pour reprendre réellement les conventions communes Config/Wallet Desk : dépendances frontend de gabarit, `ResizeObserver`, identité de fenêtre, footer, police/provenance splash, vocabulaire SCSS partagé, commande `get_runtime_status`, instrumentation shell et canaris anti-dérive. Aucun runtime Off-chain, composite ni table prix n'est avancé.
|
||||
|
||||
### `pre.003` — Composite Config et bootstrap Off-chain
|
||||
|
||||
**Statut : planifié.**
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/015-V0_2_12_SOL_PRICES_DESK.md -->
|
||||
<!-- version: 2 -->
|
||||
<!-- version: 3 -->
|
||||
|
||||
# Validation `0.2.12` — SOL Prices Desk + intégration Wallet Desk
|
||||
|
||||
@@ -221,3 +221,22 @@ cargo fmt/check/clippy/test NOT RUN — c
|
||||
```
|
||||
|
||||
Le statut de `pre.002` reste donc « implémenté ; gate opérateur à confirmer » jusqu'au retour du gate Cargo de l'opérateur.
|
||||
|
||||
## 14. Gate `0.2.12-pre.002-fix.001`
|
||||
|
||||
Le correctif réaligne le nouveau Desk sur le gabarit desktop commun sans ouvrir le runtime prix :
|
||||
|
||||
```text
|
||||
package frontend commun : tracing + ResizeObserver + Bootstrap/SimpleBar PASS structurel
|
||||
ResizeObserver installé avant SimpleBar PASS structurel
|
||||
getCurrentWindow() utilisé au bootstrap main PASS structurel
|
||||
commande Tauri get_runtime_status PASS structurel
|
||||
footer commun PASS structurel
|
||||
police DOS_Amazigh + manifeste de provenance PASS structurel
|
||||
partials SCSS communs identiques hors headers de fichier PASS structurel
|
||||
_app.scss réutilise le vocabulaire app-runtime-list/app-placeholder PASS structurel
|
||||
TRACING_DOMAIN_SHELL réellement consommé PASS structurel
|
||||
MarketPriceService / composite / refresh / table prix absent par contrat
|
||||
```
|
||||
|
||||
Le gate Cargo du checkout opérateur précédent a confirmé que `pre.002` compile et que ses tests passent, mais il signalait deux warnings `TRACING_DOMAIN_SHELL` unused. Le fix consomme désormais ce domaine dans `configure_setup`; le gate complet doit être rejoué sur `0.2.12-pre.2.fix.1` avant passage à `pre.003`.
|
||||
|
||||
Reference in New Issue
Block a user