v0.2.6-pre.014-fix.001
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
# file: Cargo.toml
|
# file: Cargo.toml
|
||||||
# version: 186
|
# version: 187
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "3"
|
resolver = "3"
|
||||||
members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
|
members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.2.6-pre.14"
|
version = "0.2.6-pre.14.fix.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-app-config-desk/README.md -->
|
<!-- file: crates/ksp-app-config-desk/README.md -->
|
||||||
<!-- version: 25 -->
|
<!-- version: 26 -->
|
||||||
|
|
||||||
# `ksp-app-config-desk`
|
# `ksp-app-config-desk`
|
||||||
|
|
||||||
@@ -109,7 +109,7 @@ Le port HTTP est strict. Les futures applications desk utilisent les couples sui
|
|||||||
|
|
||||||
Les bibliothèques consommées par le bundle applicatif sont déclarées sous `dependencies` : `@fltsci/tauri-plugin-tracing`, `@fortawesome/fontawesome-free`, `@tauri-apps/api`, `bootstrap`, `simplebar` et `resize-observer-polyfill`.
|
Les bibliothèques consommées par le bundle applicatif sont déclarées sous `dependencies` : `@fltsci/tauri-plugin-tracing`, `@fortawesome/fontawesome-free`, `@tauri-apps/api`, `bootstrap`, `simplebar` et `resize-observer-polyfill`.
|
||||||
|
|
||||||
Les outils de compilation/développement et déclarations de types appartiennent à `devDependencies`, notamment `@tauri-apps/cli`, `@types/bootstrap`, `@types/node`, `sass-embedded`, `typescript` et `vite`. Les commandes npm directes sont réservées à l'installation ou à la mise à jour de ces dépendances ; le cycle normal de développement et de build est lancé depuis la racine du workspace par Tauri avec la configuration explicite de l'application.
|
Les outils de compilation/développement et déclarations de types appartiennent à `devDependencies`, notamment `@tauri-apps/cli`, `@types/bootstrap`, `@types/node`, `sass-embedded`, `typescript` et `vite`. Les commandes npm directes sont réservées à l'installation ou à la mise à jour de ces dépendances. Le cycle normal de développement et de build est **crate-local** : l'opérateur peut rester positionné à la racine du workspace, mais la commande exécute d'abord `cd crates/ksp-app-config-desk` puis `cargo tauri dev`/`build`. `-c/--config` n'est pas utilisé comme sélecteur de crate.
|
||||||
|
|
||||||
|
|
||||||
## Logging frontend KSP
|
## Logging frontend KSP
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-app-config-desk/USAGE.md -->
|
<!-- file: crates/ksp-app-config-desk/USAGE.md -->
|
||||||
<!-- version: 25 -->
|
<!-- version: 26 -->
|
||||||
|
|
||||||
# Utilisation de `ksp-app-config-desk`
|
# Utilisation de `ksp-app-config-desk`
|
||||||
|
|
||||||
@@ -24,11 +24,11 @@ npm i -D
|
|||||||
cd ../../
|
cd ../../
|
||||||
```
|
```
|
||||||
|
|
||||||
`npm i -D` sans nom de package installe les dépendances déclarées du package ; la classification `dependencies` / `devDependencies` reste celle de `package.json`. Les lockfiles frontend restent ignorés et ne sont pas versionnés. Après cette installation, les commandes Cargo/Tauri sont exécutées depuis la racine du workspace.
|
`npm i -D` sans nom de package installe les dépendances déclarées du package ; la classification `dependencies` / `devDependencies` reste celle de `package.json`. Les lockfiles frontend restent ignorés et ne sont pas versionnés. Après cette installation, l'opérateur peut revenir à la racine du workspace, mais chaque commande Tauri entre explicitement dans la crate ciblée avant d'exécuter le CLI.
|
||||||
|
|
||||||
## Développement normal
|
## Développement normal
|
||||||
|
|
||||||
Le frontend n'est pas lancé directement avec npm. KSP est un workspace Rust multi-app : depuis la racine du workspace, la configuration Tauri de l'application doit être sélectionnée explicitement :
|
Le frontend n'est pas lancé directement avec npm. KSP est un workspace Rust multi-app : `-c/--config` ne sélectionne pas une crate Tauri. Depuis la racine du workspace, la crate applicative est donc sélectionnée en changeant explicitement de répertoire :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
(cd crates/ksp-app-config-desk && cargo tauri dev)
|
(cd crates/ksp-app-config-desk && cargo tauri dev)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-app-config-desk/frontend/main.html -->
|
<!-- file: crates/ksp-app-config-desk/frontend/main.html -->
|
||||||
<!-- version: 17 -->
|
<!-- version: 18 -->
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="fr">
|
<html lang="fr">
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main class="app-main container-fluid p-0">
|
<main class="app-main container-fluid p-0">
|
||||||
<div class="row g-0 h-100">
|
<div class="row g-0 h-100 flex-nowrap">
|
||||||
<aside class="col-auto app-sidebar border-end bg-body-tertiary">
|
<aside class="col-auto app-sidebar border-end bg-body-tertiary">
|
||||||
<div class="app-sidebar-scroll h-100" data-simplebar>
|
<div class="app-sidebar-scroll h-100" data-simplebar>
|
||||||
<nav class="nav nav-pills flex-column gap-1 p-3" aria-label="Navigation Config Desk">
|
<nav class="nav nav-pills flex-column gap-1 p-3" aria-label="Navigation Config Desk">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-config-desk/frontend/sass/_app.scss
|
// file: crates/ksp-app-config-desk/frontend/sass/_app.scss
|
||||||
// version: 6
|
// version: 7
|
||||||
|
|
||||||
$app-header-height: 72px;
|
$app-header-height: 72px;
|
||||||
$app-footer-height: 42px;
|
$app-footer-height: 42px;
|
||||||
@@ -41,6 +41,11 @@ body {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.app-main > .row {
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.app-scrollable {
|
.app-scrollable {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
@@ -72,6 +77,10 @@ body {
|
|||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.app-content {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.app-sidebar .nav-link {
|
.app-sidebar .nav-link {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-config-desk/frontend/sass/splash.scss
|
// file: crates/ksp-app-config-desk/frontend/sass/splash.scss
|
||||||
// version: 4
|
// version: 5
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Dos Amazigh";
|
font-family: "Dos Amazigh";
|
||||||
@@ -80,7 +80,7 @@ body {
|
|||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
width: 55%;
|
width: 100%;
|
||||||
max-height: 30%;
|
max-height: 30%;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ksp-app-config-desk",
|
"name": "ksp-app-config-desk",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.2.6-pre.14",
|
"version": "0.2.6-pre.14.fix.1",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "KSP Config Desk",
|
"productName": "KSP Config Desk",
|
||||||
"version": "0.2.6-pre.14",
|
"version": "0.2.6-pre.14.fix.1",
|
||||||
"identifier": "com.sasedev.ksp-app-config-desk",
|
"identifier": "com.sasedev.ksp-app-config-desk",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": {
|
"beforeDevCommand": {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-config-desk/tests/desktop_contract.rs
|
// file: crates/ksp-app-config-desk/tests/desktop_contract.rs
|
||||||
// version: 3
|
// version: 4
|
||||||
|
|
||||||
//! Desktop build/shell contract audits for Config Desk.
|
//! Desktop build/shell contract audits for Config Desk.
|
||||||
|
|
||||||
@@ -80,16 +80,21 @@ fn pre_014_template_uses_sidebar_navigation_and_kbot_style_splash_contract() {
|
|||||||
let root = app_root();
|
let root = app_root();
|
||||||
let main = read_text(root.join("frontend/main.html").as_path());
|
let main = read_text(root.join("frontend/main.html").as_path());
|
||||||
let splash = read_text(root.join("frontend/splash.html").as_path());
|
let splash = read_text(root.join("frontend/splash.html").as_path());
|
||||||
|
let app_style = read_text(root.join("frontend/sass/_app.scss").as_path());
|
||||||
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
|
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
|
||||||
let splash_ts = read_text(root.join("frontend/ts/splash.ts").as_path());
|
let splash_ts = read_text(root.join("frontend/ts/splash.ts").as_path());
|
||||||
assert!(main.starts_with("<!-- file: crates/ksp-app-config-desk/frontend/main.html -->"));
|
assert!(main.starts_with("<!-- file: crates/ksp-app-config-desk/frontend/main.html -->"));
|
||||||
assert!(main.contains("app-sidebar"));
|
assert!(main.contains("app-sidebar"));
|
||||||
|
assert!(main.contains("row g-0 h-100 flex-nowrap"));
|
||||||
|
assert!(app_style.contains("flex-wrap: nowrap"));
|
||||||
|
assert!(app_style.contains("min-width: 0"));
|
||||||
assert!(main.contains("nav nav-pills flex-column"));
|
assert!(main.contains("nav nav-pills flex-column"));
|
||||||
assert!(splash.starts_with("<!-- file: crates/ksp-app-config-desk/frontend/splash.html -->"));
|
assert!(splash.starts_with("<!-- file: crates/ksp-app-config-desk/frontend/splash.html -->"));
|
||||||
assert!(splash.contains("id=\"debug-info\""));
|
assert!(splash.contains("id=\"debug-info\""));
|
||||||
assert!(splash.contains("id=\"messages-container\""));
|
assert!(splash.contains("id=\"messages-container\""));
|
||||||
assert!(splash.contains("sass/splash.scss"));
|
assert!(splash.contains("sass/splash.scss"));
|
||||||
assert!(splash_style.contains("overflow: hidden"));
|
assert!(splash_style.contains("overflow: hidden"));
|
||||||
|
assert!(splash_style.contains("width: 100%"));
|
||||||
assert!(splash_style.contains("user-select: none"));
|
assert!(splash_style.contains("user-select: none"));
|
||||||
assert!(splash_ts.contains("add_debug"));
|
assert!(splash_ts.contains("add_debug"));
|
||||||
assert!(splash_ts.contains("add_message"));
|
assert!(splash_ts.contains("add_message"));
|
||||||
|
|||||||
@@ -1,32 +1,37 @@
|
|||||||
<!-- file: crates/ksp-app-wallet-desk/frontend/main.html -->
|
<!-- file: crates/ksp-app-wallet-desk/frontend/main.html -->
|
||||||
<!-- version: 1 -->
|
<!-- version: 2 -->
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="fr">
|
<html lang="fr">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="icon" href="imgs/logo.png">
|
||||||
|
<link rel="stylesheet" href="sass/main.scss">
|
||||||
<title>Wallet Desk — Dashboard</title>
|
<title>Wallet Desk — Dashboard</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header class="app-header shadow-sm">
|
<header class="app-header">
|
||||||
<nav class="navbar h-100 py-0 bg-light text-dark">
|
<nav class="navbar h-100 py-0 bg-light text-dark">
|
||||||
<div class="container-fluid h-100 d-flex align-items-center gap-3 px-4 flex-nowrap">
|
<div class="container-fluid px-4 flex-nowrap">
|
||||||
<img class="app-logo" src="./imgs/logo.png" alt="KSP">
|
<div class="navbar-brand d-flex align-items-center me-4 flex-nowrap">
|
||||||
<div class="d-flex flex-column me-auto">
|
<img alt="KSP" src="imgs/logo.png" class="app-logo">
|
||||||
<span class="fw-semibold text-primary">Wallet Desk — <span id="headerViewTitle" class="text-body">Dashboard</span></span>
|
<span class="ps-2 fs-4 fw-semibold text-primary text-nowrap">Wallet Desk</span>
|
||||||
<small id="shellStatus" class="text-body-secondary app-shell-status">Initialisation du shell…</small>
|
<span class="mx-2 fs-5 text-body-secondary" aria-hidden="true">—</span>
|
||||||
|
<span id="headerViewTitle" class="fs-5 text-body text-nowrap">Dashboard</span>
|
||||||
|
</div>
|
||||||
|
<div class="ms-auto d-flex align-items-center gap-2 flex-nowrap">
|
||||||
|
<button class="btn btn-outline-secondary btn-sm" type="button" data-shell-action="deselect" disabled>
|
||||||
|
<i class="fa-solid fa-xmark me-2" aria-hidden="true"></i>Deselect
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-outline-primary btn-sm" type="button" data-shell-action="lock" disabled>
|
||||||
|
<i class="fa-solid fa-lock me-2" aria-hidden="true"></i>Lock
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-outline-secondary btn-sm" type="button" data-shell-action="deselect" disabled>
|
|
||||||
<i class="fa-solid fa-xmark me-2" aria-hidden="true"></i>Deselect
|
|
||||||
</button>
|
|
||||||
<button class="btn btn-outline-primary btn-sm" type="button" data-shell-action="lock" disabled>
|
|
||||||
<i class="fa-solid fa-lock me-2" aria-hidden="true"></i>Lock
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
<main class="app-main container-fluid p-0">
|
<main class="app-main container-fluid p-0">
|
||||||
<div class="row g-0 h-100">
|
<div class="row g-0 h-100 flex-nowrap">
|
||||||
<aside class="col-auto app-sidebar border-end bg-body-tertiary">
|
<aside class="col-auto app-sidebar border-end bg-body-tertiary">
|
||||||
<div class="app-sidebar-scroll h-100" data-simplebar>
|
<div class="app-sidebar-scroll h-100" data-simplebar>
|
||||||
<nav class="nav nav-pills flex-column gap-1 p-3" aria-label="Navigation Wallet Desk">
|
<nav class="nav nav-pills flex-column gap-1 p-3" aria-label="Navigation Wallet Desk">
|
||||||
@@ -39,14 +44,16 @@
|
|||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
<section class="col app-content h-100" data-simplebar>
|
<section class="col app-content app-scrollable h-100" data-simplebar>
|
||||||
<div class="p-4">
|
<div class="container-fluid px-4 py-4">
|
||||||
|
<div class="card app-shell-card mx-auto shadow-sm border-0">
|
||||||
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center justify-content-between mb-4">
|
<div class="d-flex align-items-center justify-content-between mb-4">
|
||||||
<div>
|
<div>
|
||||||
<h1 id="viewTitle" class="h3 mb-1">Dashboard</h1>
|
<h1 id="viewTitle" class="h3 mb-1">Dashboard</h1>
|
||||||
<p class="text-body-secondary mb-0">Identité autorisée et balance SOL via le Transport HTTP composite sont actives.</p>
|
<p class="text-body-secondary mb-0">Identité autorisée et balance SOL via le Transport HTTP composite sont actives.</p>
|
||||||
</div>
|
</div>
|
||||||
<span class="badge text-bg-secondary">0.2.6-pre.014</span>
|
<span class="badge text-bg-secondary">0.2.6-pre.14.fix.1</span>
|
||||||
</div>
|
</div>
|
||||||
<section data-view-panel="dashboard">
|
<section data-view-panel="dashboard">
|
||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
@@ -419,6 +426,8 @@
|
|||||||
<dt class="col-md-4">Rôle balance</dt><dd id="diagnosticsTransportRole" class="col-md-8">—</dd>
|
<dt class="col-md-4">Rôle balance</dt><dd id="diagnosticsTransportRole" class="col-md-8">—</dd>
|
||||||
</dl></div></div>
|
</dl></div></div>
|
||||||
</section>
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
@@ -483,9 +492,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<footer class="app-footer bg-dark text-white-50 d-flex align-items-center px-4">
|
<footer class="app-footer bg-dark text-light">
|
||||||
<span>KSP Wallet Desk · integration / compliance pre.013</span>
|
<div class="container h-100 d-flex align-items-center justify-content-center">
|
||||||
|
<small>© 2026 SASEDEV</small>
|
||||||
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
<script type="module" src="./ts/main.ts"></script>
|
<script type="module" src="ts/main.ts" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-wallet-desk/frontend/sass/_app.scss
|
// file: crates/ksp-app-wallet-desk/frontend/sass/_app.scss
|
||||||
// version: 1
|
// version: 2
|
||||||
|
|
||||||
$app-header-height: 72px;
|
$app-header-height: 72px;
|
||||||
$app-footer-height: 42px;
|
$app-footer-height: 42px;
|
||||||
@@ -41,13 +41,26 @@ body {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.app-main > .row {
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.app-logo {
|
.app-logo {
|
||||||
display: block;
|
display: block;
|
||||||
width: auto;
|
width: auto;
|
||||||
height: 42px;
|
height: 42px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-shell-status,
|
.app-scrollable {
|
||||||
|
height: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-shell-card {
|
||||||
|
max-width: 1320px;
|
||||||
|
}
|
||||||
|
|
||||||
.app-runtime-list dd,
|
.app-runtime-list dd,
|
||||||
#walletInventoryTable td:nth-child(2),
|
#walletInventoryTable td:nth-child(2),
|
||||||
#walletInventoryTable td:nth-child(3) {
|
#walletInventoryTable td:nth-child(3) {
|
||||||
@@ -66,6 +79,10 @@ body {
|
|||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.app-content {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.app-sidebar .nav-link {
|
.app-sidebar .nav-link {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-wallet-desk/frontend/sass/splash.scss
|
// file: crates/ksp-app-wallet-desk/frontend/sass/splash.scss
|
||||||
// version: 2
|
// version: 3
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Dos Amazigh";
|
font-family: "Dos Amazigh";
|
||||||
@@ -80,7 +80,7 @@ body {
|
|||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
width: 55%;
|
width: 100%;
|
||||||
max-height: 30%;
|
max-height: 30%;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-wallet-desk/frontend/ts/main.ts
|
// file: crates/ksp-app-wallet-desk/frontend/ts/main.ts
|
||||||
// version: 15
|
// version: 16
|
||||||
|
|
||||||
import { Modal } from "bootstrap";
|
import { Modal } from "bootstrap";
|
||||||
import DataTable from "datatables.net-bs5";
|
import DataTable from "datatables.net-bs5";
|
||||||
@@ -31,7 +31,6 @@ import type { WalletSessionDto } from "./bindings/ksp_app_wallet_desk/wallet_ses
|
|||||||
import type { WalletUnlockRequestDto } from "./bindings/ksp_app_wallet_desk/wallet_session/WalletUnlockRequestDto.ts";
|
import type { WalletUnlockRequestDto } from "./bindings/ksp_app_wallet_desk/wallet_session/WalletUnlockRequestDto.ts";
|
||||||
import { frontendDebug, frontendInfo, frontendTrace, frontendWarn, installFrontendConsoleBridge } from "./frontend_log";
|
import { frontendDebug, frontendInfo, frontendTrace, frontendWarn, installFrontendConsoleBridge } from "./frontend_log";
|
||||||
import { invokeKsp } from "./invoke";
|
import { invokeKsp } from "./invoke";
|
||||||
import "../sass/main.scss";
|
|
||||||
|
|
||||||
(window as Window & typeof globalThis & { ResizeObserver?: typeof ResizeObserver }).ResizeObserver = ResizeObserver;
|
(window as Window & typeof globalThis & { ResizeObserver?: typeof ResizeObserver }).ResizeObserver = ResizeObserver;
|
||||||
installFrontendConsoleBridge("main");
|
installFrontendConsoleBridge("main");
|
||||||
@@ -1437,7 +1436,6 @@ function renderRuntimeStatus(status: RuntimeStatusDto): void {
|
|||||||
setText("#runtimeEffectiveWalletsDirectory", status.effectiveWalletsDirectory);
|
setText("#runtimeEffectiveWalletsDirectory", status.effectiveWalletsDirectory);
|
||||||
setText("#runtimeWalletDirectoryCreated", status.effectiveWalletsDirectoryCreatedOnStartup ? "oui" : "non, déjà présent");
|
setText("#runtimeWalletDirectoryCreated", status.effectiveWalletsDirectoryCreatedOnStartup ? "oui" : "non, déjà présent");
|
||||||
setText("#runtimeShellPhase", status.shellPhase);
|
setText("#runtimeShellPhase", status.shellPhase);
|
||||||
setText("#shellStatus", "Config/Transport résolus ; import/export, VIEW/OWNER, metadata, rotations, strong VIEW et getBalance prêts.");
|
|
||||||
frontendTrace("main", "Wallet Desk runtime status rendered", {
|
frontendTrace("main", "Wallet Desk runtime status rendered", {
|
||||||
compositeProfile: status.activeCompositeProfile,
|
compositeProfile: status.activeCompositeProfile,
|
||||||
fallbackLoggingActive: status.fallbackLoggingActive,
|
fallbackLoggingActive: status.fallbackLoggingActive,
|
||||||
@@ -1500,7 +1498,6 @@ async function initializeMain(): Promise<void> {
|
|||||||
await loadWalletInventory("list_wallets", false);
|
await loadWalletInventory("list_wallets", false);
|
||||||
} catch {
|
} catch {
|
||||||
renderWalletInventory([]);
|
renderWalletInventory([]);
|
||||||
setText("#shellStatus", "Le statut runtime ou l'inventaire Wallet n'a pas pu être chargé.");
|
|
||||||
frontendWarn("main", "Wallet Desk startup data load failed");
|
frontendWarn("main", "Wallet Desk startup data load failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ksp-app-wallet-desk",
|
"name": "ksp-app-wallet-desk",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.2.6-pre.14",
|
"version": "0.2.6-pre.14.fix.1",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "KSP Wallet Desk",
|
"productName": "KSP Wallet Desk",
|
||||||
"version": "0.2.6-pre.14",
|
"version": "0.2.6-pre.14.fix.1",
|
||||||
"identifier": "com.sasedev.ksp-app-wallet-desk",
|
"identifier": "com.sasedev.ksp-app-wallet-desk",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": {
|
"beforeDevCommand": {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-wallet-desk/tests/desktop_contract.rs
|
// file: crates/ksp-app-wallet-desk/tests/desktop_contract.rs
|
||||||
// version: 15
|
// version: 16
|
||||||
|
|
||||||
//! Desktop build, shell and Config-status contract audits for Wallet Desk.
|
//! Desktop build, shell and Config-status contract audits for Wallet Desk.
|
||||||
|
|
||||||
@@ -338,13 +338,9 @@ fn pre_012_owner_export_uses_rust_native_save_picker_and_wallet_file_adapter() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn pre_013_integration_compliance_and_devnet_smoke_are_durable_release_gates() {
|
fn pre_013_integration_compliance_and_devnet_smoke_are_durable_release_gates() {
|
||||||
let root = app_root();
|
let root = app_root();
|
||||||
let state = read_text(root.join("src/app_state.rs").as_path());
|
|
||||||
let main = read_text(root.join("frontend/ts/main.ts").as_path());
|
|
||||||
let compliance = read_text(root.join("tests/release_compliance.rs").as_path());
|
let compliance = read_text(root.join("tests/release_compliance.rs").as_path());
|
||||||
let smoke = read_text(root.join("tests/wallet_desk_devnet_smoke.rs").as_path());
|
let smoke = read_text(root.join("tests/wallet_desk_devnet_smoke.rs").as_path());
|
||||||
let validation = read_text(root.join("../../docs/validation/009-V0_2_6_WALLET_DESK_COMPLIANCE.md").as_path());
|
let validation = read_text(root.join("../../docs/validation/009-V0_2_6_WALLET_DESK_COMPLIANCE.md").as_path());
|
||||||
assert!(state.contains("pre.013-integration-compliance"));
|
|
||||||
assert!(main.contains("pre.013-integration-compliance"));
|
|
||||||
assert!(compliance.contains("wallet_desk_dependency_firewall_and_tauri_capabilities_are_minimal"));
|
assert!(compliance.contains("wallet_desk_dependency_firewall_and_tauri_capabilities_are_minimal"));
|
||||||
assert!(compliance.contains("frontend_has_no_direct_filesystem_network_or_secret_persistence_surface"));
|
assert!(compliance.contains("frontend_has_no_direct_filesystem_network_or_secret_persistence_surface"));
|
||||||
assert!(smoke.contains("committed_wallet_desk_composite_creates_wallet_and_reaches_devnet_balance"));
|
assert!(smoke.contains("committed_wallet_desk_composite_creates_wallet_and_reaches_devnet_balance"));
|
||||||
@@ -357,16 +353,32 @@ fn pre_014_template_has_normalized_html_headers_light_header_and_kbot_style_spla
|
|||||||
let root = app_root();
|
let root = app_root();
|
||||||
let main = read_text(root.join("frontend/main.html").as_path());
|
let main = read_text(root.join("frontend/main.html").as_path());
|
||||||
let splash = read_text(root.join("frontend/splash.html").as_path());
|
let splash = read_text(root.join("frontend/splash.html").as_path());
|
||||||
|
let app_style = read_text(root.join("frontend/sass/_app.scss").as_path());
|
||||||
|
let main_ts = read_text(root.join("frontend/ts/main.ts").as_path());
|
||||||
|
let state = read_text(root.join("src/app_state.rs").as_path());
|
||||||
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
|
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
|
||||||
let splash_ts = read_text(root.join("frontend/ts/splash.ts").as_path());
|
let splash_ts = read_text(root.join("frontend/ts/splash.ts").as_path());
|
||||||
assert!(main.starts_with("<!-- file: crates/ksp-app-wallet-desk/frontend/main.html -->"));
|
assert!(main.starts_with("<!-- file: crates/ksp-app-wallet-desk/frontend/main.html -->"));
|
||||||
assert!(main.contains("navbar h-100 py-0 bg-light text-dark"));
|
assert!(main.contains("navbar h-100 py-0 bg-light text-dark"));
|
||||||
|
assert!(main.contains("ps-2 fs-4 fw-semibold text-primary text-nowrap\">Wallet Desk"));
|
||||||
|
assert!(main.contains("row g-0 h-100 flex-nowrap"));
|
||||||
|
assert!(main.contains("col app-content app-scrollable h-100"));
|
||||||
|
assert!(main.contains("card app-shell-card mx-auto shadow-sm border-0"));
|
||||||
|
assert!(main.contains("card-body p-4"));
|
||||||
|
assert!(main.contains("© 2026 SASEDEV"));
|
||||||
|
assert!(!main.contains("id=\"shellStatus\""));
|
||||||
|
assert!(app_style.contains("flex-wrap: nowrap"));
|
||||||
|
assert!(app_style.contains("min-width: 0"));
|
||||||
|
assert!(state.contains("pre.014-desktop-polish"));
|
||||||
|
assert!(main_ts.contains("pre.014-desktop-polish"));
|
||||||
|
assert!(!main_ts.contains("#shellStatus"));
|
||||||
assert!(main.contains("app-sidebar"));
|
assert!(main.contains("app-sidebar"));
|
||||||
assert!(splash.starts_with("<!-- file: crates/ksp-app-wallet-desk/frontend/splash.html -->"));
|
assert!(splash.starts_with("<!-- file: crates/ksp-app-wallet-desk/frontend/splash.html -->"));
|
||||||
assert!(splash.contains("id=\"debug-info\""));
|
assert!(splash.contains("id=\"debug-info\""));
|
||||||
assert!(splash.contains("id=\"messages-container\""));
|
assert!(splash.contains("id=\"messages-container\""));
|
||||||
assert!(splash.contains("sass/splash.scss"));
|
assert!(splash.contains("sass/splash.scss"));
|
||||||
assert!(splash_style.contains("overflow: hidden"));
|
assert!(splash_style.contains("overflow: hidden"));
|
||||||
|
assert!(splash_style.contains("width: 100%"));
|
||||||
assert!(splash_style.contains("user-select: none"));
|
assert!(splash_style.contains("user-select: none"));
|
||||||
assert!(splash_ts.contains("add_debug"));
|
assert!(splash_ts.contains("add_debug"));
|
||||||
assert!(splash_ts.contains("add_message"));
|
assert!(splash_ts.contains("add_message"));
|
||||||
|
|||||||
121
deltas/0.2.6/pre.014-fix.001.md
Normal file
121
deltas/0.2.6/pre.014-fix.001.md
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
<!-- file: deltas/0.2.6/pre.014-fix.001.md -->
|
||||||
|
<!-- version: 1 -->
|
||||||
|
|
||||||
|
# Delta `0.2.6-pre.014-fix.001` — layout desktop partagé et canari `pre.013` durable
|
||||||
|
|
||||||
|
## Base requise
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.2.6-pre.014 appliquée
|
||||||
|
workspace.package.version = 0.2.6-pre.14
|
||||||
|
```
|
||||||
|
|
||||||
|
Le checkpoint opérateur fourni confirme `fmt`, audit Rust, `cargo check`, Clippy et Config Desk. `cargo test -p ksp-app-wallet-desk` révèle un seul échec : le canari `pre_013_integration_compliance_and_devnet_smoke_are_durable_release_gates` fige encore l'ancienne phase `pre.013-integration-compliance`, alors que `pre.014` a légitimement fait évoluer le runtime vers `pre.014-desktop-polish`.
|
||||||
|
|
||||||
|
## Signal technique
|
||||||
|
|
||||||
|
```text
|
||||||
|
workspace.package.version = 0.2.6-pre.14.fix.1
|
||||||
|
commit = v0.2.6-pre.014-fix.001
|
||||||
|
```
|
||||||
|
|
||||||
|
Les `package.json` et `tauri.conf.json` des deux Desks suivent le même signal. Aucun tag prerelease.
|
||||||
|
|
||||||
|
## Corrections
|
||||||
|
|
||||||
|
### Tauri crate-local et current working directory
|
||||||
|
|
||||||
|
Le workflow `cargo tauri dev` reste crate-local :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
(cd crates/ksp-app-config-desk && cargo tauri dev)
|
||||||
|
(cd crates/ksp-app-wallet-desk && cargo tauri dev)
|
||||||
|
```
|
||||||
|
|
||||||
|
Le backend **debug** ne conserve pas le CWD de cette commande : les deux `main.rs` exécutent avant Config `set_current_dir(env!("CARGO_MANIFEST_DIR")/../..)`. Ainsi `config`, `config/schemas`, `./.env`, ainsi que les roots relatifs `logs`/`wallets`, restent ancrés sur la racine workspace pendant `cargo tauri dev`.
|
||||||
|
|
||||||
|
Le chemin release n'effectue actuellement aucun recalage. `pre.015` doit fermer explicitement cette différence avant le build final et documenter la stratégie bundle/production.
|
||||||
|
|
||||||
|
### Splash
|
||||||
|
|
||||||
|
Dans Config Desk et Wallet Desk :
|
||||||
|
|
||||||
|
```text
|
||||||
|
#debug-info width: 55% -> 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
Le feed conserve sa hauteur maximale, son scroll interne et ses scrollbars masquées.
|
||||||
|
|
||||||
|
### Layout principal partagé
|
||||||
|
|
||||||
|
Les deux Desks empêchent désormais le `row` principal Bootstrap de wrapper :
|
||||||
|
|
||||||
|
```text
|
||||||
|
row principal -> flex-nowrap
|
||||||
|
.app-main > .row -> flex-wrap: nowrap
|
||||||
|
.app-content -> min-width: 0
|
||||||
|
```
|
||||||
|
|
||||||
|
Le contenu peut donc rétrécir/scroll sans passer sous la sidebar.
|
||||||
|
|
||||||
|
### Wallet Desk aligné sur Config Desk
|
||||||
|
|
||||||
|
Wallet Desk adopte le même gabarit structurel :
|
||||||
|
|
||||||
|
```text
|
||||||
|
header : logo + fs-4 app name + tiret + fs-5 view title
|
||||||
|
header : Deselect/Lock restent à droite
|
||||||
|
#shellStatus : supprimé
|
||||||
|
content : container-fluid px-4 py-4
|
||||||
|
content : card app-shell-card shadow-sm border-0
|
||||||
|
content : card-body p-4
|
||||||
|
footer : copyright centré identique à Config Desk
|
||||||
|
main stylesheet : chargé dans <head> comme Config Desk
|
||||||
|
```
|
||||||
|
|
||||||
|
Aucune commande Wallet, aucun DTO et aucun lifecycle VIEW/OWNER ne changent.
|
||||||
|
|
||||||
|
### Canari `pre.013`
|
||||||
|
|
||||||
|
Le test de durabilité `pre.013` continue de vérifier :
|
||||||
|
|
||||||
|
```text
|
||||||
|
release_compliance
|
||||||
|
smoke Devnet ignored/opt-in
|
||||||
|
validation 009
|
||||||
|
```
|
||||||
|
|
||||||
|
Il ne vérifie plus une `shell_phase` historique, qui est volontairement un indicateur de tranche mutable. Le test `pre.014` devient propriétaire de l'assertion `pre.014-desktop-polish` et des invariants de gabarit actuels.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Sont mis à jour :
|
||||||
|
|
||||||
|
```text
|
||||||
|
crates/ksp-app-config-desk/README.md
|
||||||
|
crates/ksp-app-config-desk/USAGE.md
|
||||||
|
docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md
|
||||||
|
prompts/011-V0_2_6_START_PROMPT.md
|
||||||
|
```
|
||||||
|
|
||||||
|
Restent volontairement inchangés :
|
||||||
|
|
||||||
|
```text
|
||||||
|
ROADMAP.md
|
||||||
|
CHANGELOG.md
|
||||||
|
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validation opérateur requise
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo fmt --all
|
||||||
|
python3 scripts/audit_rust_workspace_rules.py
|
||||||
|
cargo check --workspace
|
||||||
|
cargo clippy --workspace --all-targets
|
||||||
|
cargo test -p ksp-app-config-desk
|
||||||
|
cargo test -p ksp-app-wallet-desk
|
||||||
|
cargo test --workspace
|
||||||
|
```
|
||||||
|
|
||||||
|
Puis validation visuelle crate-local des deux Desks. **Ne pas exécuter `cargo tauri build`** : il reste réservé à `pre.015` et doit demeurer l'ultime opération de validation de la release.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md -->
|
<!-- file: docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md -->
|
||||||
<!-- version: 31 -->
|
<!-- version: 32 -->
|
||||||
|
|
||||||
# Plan `0.2.6` — Wallet Desk
|
# Plan `0.2.6` — Wallet Desk
|
||||||
|
|
||||||
@@ -1872,3 +1872,21 @@ bash -lc 'cd crates/ksp-app-wallet-desk && cargo tauri dev'
|
|||||||
```
|
```
|
||||||
|
|
||||||
Le build Tauri de production reste reporté à `pre.015` et doit demeurer l’absolue dernière opération.
|
Le build Tauri de production reste reporté à `pre.015` et doit demeurer l’absolue dernière opération.
|
||||||
|
|
||||||
|
|
||||||
|
### Correctif `0.2.6-pre.014-fix.001` — layout desktop et canari durable
|
||||||
|
|
||||||
|
Le retour opérateur de `pre.014` confirme le lancement Tauri crate-local mais révèle plusieurs écarts purement gabarit. Le correctif conserve `pre.014` comme tranche de polish et applique les décisions suivantes :
|
||||||
|
|
||||||
|
```text
|
||||||
|
Tauri dev : crate-local, puis backend debug recale explicitement le CWD sur la racine workspace
|
||||||
|
main : row sidebar/content non wrappable + contenu min-width: 0
|
||||||
|
Wallet Desk : header typographique, shell card/card-body et footer alignés sur Config Desk
|
||||||
|
Wallet Desk : #shellStatus supprimé du HTML et du TypeScript
|
||||||
|
splash : feed #debug-info pleine largeur dans les deux Desks
|
||||||
|
pre.013 gate : le canari ne fige plus une shell_phase destinée à évoluer à chaque tranche
|
||||||
|
```
|
||||||
|
|
||||||
|
Le recalage du CWD n'existe actuellement qu'en `debug_assertions` dans les deux `main.rs`. La candidate `pre.015` doit donc vérifier explicitement la stratégie de résolution production/bundle pour `config`, `.env`, `logs` et `wallets` avant le build final ; le comportement release ne doit pas être supposé identique au parcours `cargo tauri dev`.
|
||||||
|
|
||||||
|
Ce fix touche le frontend/build contract et porte donc le signal technique `workspace.package.version = 0.2.6-pre.14.fix.1`. `ROADMAP.md`, `CHANGELOG.md` et `docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md` restent inchangés.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: prompts/011-V0_2_6_START_PROMPT.md -->
|
<!-- file: prompts/011-V0_2_6_START_PROMPT.md -->
|
||||||
<!-- version: 4 -->
|
<!-- version: 5 -->
|
||||||
|
|
||||||
# Prompt de démarrage `0.2.6` — Wallet Desk
|
# Prompt de démarrage `0.2.6` — Wallet Desk
|
||||||
|
|
||||||
@@ -703,3 +703,19 @@ Ensuite :
|
|||||||
5. **ne pas commencer l'implémentation UI lourde avant ce gate**.
|
5. **ne pas commencer l'implémentation UI lourde avant ce gate**.
|
||||||
|
|
||||||
Les règles de la session ne doivent pas être renégociées au fil des corrections : elles sont dans les documents KSP versionnés et doivent être appliquées dès chaque premier patch. Si un conflit ou une règle manquante est découvert, corriger la règle et son contrôle durable avant de propager une nouvelle convention.
|
Les règles de la session ne doivent pas être renégociées au fil des corrections : elles sont dans les documents KSP versionnés et doivent être appliquées dès chaque premier patch. Si un conflit ou une règle manquante est découvert, corriger la règle et son contrôle durable avant de propager une nouvelle convention.
|
||||||
|
|
||||||
|
|
||||||
|
## `pre.014-fix.001` — retour opérateur après reprise de session
|
||||||
|
|
||||||
|
Le correctif de polish après `pre.014` traite uniquement les régressions de gabarit et de canari :
|
||||||
|
|
||||||
|
```text
|
||||||
|
sidebar/content : aucun wrap lors du redimensionnement
|
||||||
|
Wallet Desk : header/footer/shell card alignés sur Config Desk
|
||||||
|
Wallet Desk : suppression de #shellStatus
|
||||||
|
splash : #debug-info sur toute la largeur
|
||||||
|
canari pre.013 : ne plus figer la phase shell historique
|
||||||
|
version technique : 0.2.6-pre.14.fix.1
|
||||||
|
```
|
||||||
|
|
||||||
|
Le workflow Tauri reste crate-local. En debug, les deux binaires recalent ensuite leur current working directory sur la racine du workspace via `CARGO_MANIFEST_DIR/../..`; la stratégie release/bundle reste un point explicite à fermer en `pre.015`.
|
||||||
|
|||||||
Reference in New Issue
Block a user