feat(desktop): signature updater Tauri + wizard persistant + protocole E2E (#77)
CI / lint (push) Successful in 1m11s
CI / security (push) Successful in 43s
CI / test (push) Successful in 2m22s
CI / build (push) Successful in 1m41s
CI / e2e (push) Successful in 10m50s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s

- Signature des mises a jour Tauri : paire de cles minisign generee, cle publique dans tauri.conf.json, createUpdaterArtifacts actif, secrets CI exposes (repli build non signe si secret absent).

- Wizard 1er lancement : etat persistant wizard_done cote Rust (get_wizard_state/complete_wizard) pour ne plus reafficher la banniere, retro-compatible.

- Protocole des 6 tests E2E manuels : docs/DESKTOP_E2E_CHECKLIST.md.

- CI : desktop.test.mjs ajoute au job lint.

- Docs : ROADMAP, fiche desktop-tauri, CHANGELOG, README desktop, guide releases.

- fix(build): retirer les libs WeasyPrint inutiles du stage builder Docker.
This commit is contained in:
2026-09-12 09:29:47 -04:00
parent 31d4be8015
commit d3299166bb
14 changed files with 519 additions and 29 deletions
+11 -4
View File
@@ -142,8 +142,11 @@ export function shouldShowWizard(opts) {
return isDesktop && !dismissed && !hasVaultPath;
}
export function dismissWizard() {
export async function dismissWizard() {
try { localStorage.setItem(WIZARD_DISMISSED_KEY, '1'); } catch (e) { /* ignore */ }
// Persist on the Rust side too, so clearing the webview's localStorage does
// not resurrect the wizard on the next launch.
await invoke('complete_wizard');
}
export function getWizardDismissedKey() { return WIZARD_DISMISSED_KEY; }
@@ -173,9 +176,13 @@ export async function pickAndAddVault() {
// the user's Obsidian vault folder. Non-blocking; the default vault created
// by the Rust shell remains available if the user dismisses it.
export function initDesktopWizard() {
export async function initDesktopWizard() {
if (typeof window === 'undefined' || typeof document === 'undefined') return;
if (!shouldShowWizard({})) return;
// The authoritative "already done" signal lives in the desktop config
// (survives localStorage clears). Defaults to false when not on desktop.
const wizardDone = (await invoke('get_wizard_state')) === true;
if (!shouldShowWizard({ hasVaultPath: wizardDone })) return;
// Defer so the app shell is fully rendered before injecting the banner.
setTimeout(function () {
@@ -236,7 +243,7 @@ export async function initDesktopIntegration() {
} catch (e) { /* ignore */ }
// First-run vault wizard.
initDesktopWizard();
await initDesktopWizard();
return true;
}