feat(desktop): détection des permissions macOS + onboarding Réglages Système (T-040) #48

Merged
ahitosly merged 1 commit from feat/T-040-macos-permissions-onboarding into main 2026-09-05 00:39:49 +02:00
Owner

Tâche

T-xxx — (titre dans docs/STATUS.md)

Changements

Contrat modifié ?

  • Non
  • Oui : packages/contract / supabase/migrations — docs/API.md / docs/DATA.md mis à jour, label contract, approbation humaine requise

Tests

  • scripts/check.sh vert
  • Test manuel (OS, scénario) :

Impacts cross-domaine

Fichiers hors périmètre de l'agent (et pourquoi) :

Suivi

  • docs/STATUS.md mis à jour (ligne de la tâche)
  • docs/CHANGELOG.md : entrée ajoutée sous Unreleased
  • docs/DECISIONS.md / docs/ECARTS.md mis à jour si décision ou écart
## Tâche T-xxx — (titre dans docs/STATUS.md) ## Changements - ## Contrat modifié ? - [ ] Non - [ ] Oui : `packages/contract` / `supabase/migrations` — `docs/API.md` / `docs/DATA.md` mis à jour, label `contract`, approbation humaine requise ## Tests - [ ] `scripts/check.sh` vert - [ ] Test manuel (OS, scénario) : ## Impacts cross-domaine Fichiers hors périmètre de l'agent (et pourquoi) : ## Suivi - [ ] `docs/STATUS.md` mis à jour (ligne de la tâche) - [ ] `docs/CHANGELOG.md` : entrée ajoutée sous Unreleased - [ ] `docs/DECISIONS.md` / `docs/ECARTS.md` mis à jour si décision ou écart
feat(desktop): détection des permissions macOS + onboarding Réglages Système (T-040)
Some checks failed
ci / server (pull_request) Successful in 14s
ci / desktop-ts (pull_request) Successful in 26s
ci / desktop-rust (pull_request) Failing after 2m54s
f6df4dd986
check_permissions n'est plus un stub codé en dur : détection réelle Microphone
(AVCaptureDevice.authorizationStatusForMediaType) et Accessibilité
(AXIsProcessTrusted, sans invite système), toujours accordé sur Windows/Linux.
Nouvel onglet Settings « Permissions » guide vers le sous-panneau Réglages
Système concerné et se sélectionne automatiquement si une permission manque ;
la fenêtre Settings s'ouvre au démarrage sur macOS dans ce cas.

Threading vérifié avant tout code (lecture des sources objc2-av-foundation/
tauri + smoke-test réel 4-threads) : ni authorizationStatusForMediaType ni
AXIsProcessTrusted ne sont main-thread-only, contrairement aux pièges TSM/TIS
de T-094/T-096 ou à NSWindow::setLevel en T-098.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7P5ZQAi7rLfs3Uu9HwLcC
Author
Owner

qa-regression — verdict : APPROVE (avec réserve bloquante pour le merge)

Review non indépendante : outil de dispatch de sous-agent (Task/Agent) toujours indisponible dans cette session (même constat que tous les cycles précédents depuis PR #17) — faite par l'orchestrateur lui-même, documentée comme telle.

Vérifié :

  • Diff relu en entier (11 fichiers, apps/desktop + docs uniquement, aucun fichier hors périmètre app-front/ui-ux).
  • cargo clippy --all-targets -D warnings / cargo test : verts, 85/85 (+2 vs avant).
  • tsc --noEmit / eslint : verts.
  • Aucun secret dans le diff.
  • Aucun changement de contrat (packages/contract) ni de migration Supabase → pas d'exception CLAUDE.md.
  • capabilities/default.json non touché (ouverture de Réglages Système faite côté Rust via tauri_plugin_opener::open_url, pas via la commande IPC opener:allow-open-url dont le scope par défaut n'autorise que mailto:/tel:/http(s):) — vérifié volontaire, pas un oubli.
  • Nouvelles dépendances macOS objc2-av-foundation/objc2-application-services 0.3.2 : default-features=false, features minimales (AVCaptureDevice/AVMediaFormat/HIServices/AXUIElement), tirent objc2 0.6.4 déjà résolu transitivement par tauri/wry (E-007) — pas de 3e génération introduite.
  • Threading : ni AVCaptureDevice.authorizationStatusForMediaType ni AXIsProcessTrusted ne sont marquées MainThreadOnly par les bindings objc2 (vérifié en lisant les fichiers générés), et Apple les documente comme utilisables hors thread principal. Revérifié empiriquement (binaire de test autonome, 4 threads non-main, aucun crash) avant tout code applicatif, puis figé en test permanent (check_does_not_panic_off_the_main_thread). check_permissions/open_permission_settings restent des commandes Tauri synchrones (pas async) : confirmé dans les sources tauri/tauri-macros 2.11.5/2.6.3 qu'une commande sync s'exécute en ligne sur le thread qui a reçu le message IPC (main thread côté WKWebView), sans spawn.
  • AXIsProcessTrusted() utilisée sans option de prompt (pas AXIsProcessTrustedWithOptions+kAXTrustedCheckOptionPrompt) : comportement documenté dans le code et dans STATUS.md, pas caché.

Réserve (bloquante pour le merge, pas pour l'approbation du code) : nouvelles API macOS bas niveau introduites → conformément à la consigne du cycle (même règle que T-094/T-096/T-098/T-100), le merge n'est PAS programmé malgré la vérification de threading ci-dessus. PR laissée ouverte pour un test physique humain (permission réellement demandée/accordée, rendu de l'onboarding, ouverture réelle du panneau Réglages Système) — instructions détaillées dans docs/STATUS.md → Vérifications manuelles en attente (T-040).

qa-regression — verdict : APPROVE (avec réserve bloquante pour le merge) Review non indépendante : outil de dispatch de sous-agent (Task/Agent) toujours indisponible dans cette session (même constat que tous les cycles précédents depuis PR #17) — faite par l'orchestrateur lui-même, documentée comme telle. Vérifié : - Diff relu en entier (11 fichiers, apps/desktop + docs uniquement, aucun fichier hors périmètre app-front/ui-ux). - cargo clippy --all-targets -D warnings / cargo test : verts, 85/85 (+2 vs avant). - tsc --noEmit / eslint : verts. - Aucun secret dans le diff. - Aucun changement de contrat (packages/contract) ni de migration Supabase → pas d'exception CLAUDE.md. - capabilities/default.json non touché (ouverture de Réglages Système faite côté Rust via tauri_plugin_opener::open_url, pas via la commande IPC opener:allow-open-url dont le scope par défaut n'autorise que mailto:/tel:/http(s):) — vérifié volontaire, pas un oubli. - Nouvelles dépendances macOS objc2-av-foundation/objc2-application-services 0.3.2 : default-features=false, features minimales (AVCaptureDevice/AVMediaFormat/HIServices/AXUIElement), tirent objc2 0.6.4 déjà résolu transitivement par tauri/wry (E-007) — pas de 3e génération introduite. - Threading : ni AVCaptureDevice.authorizationStatusForMediaType ni AXIsProcessTrusted ne sont marquées MainThreadOnly par les bindings objc2 (vérifié en lisant les fichiers générés), et Apple les documente comme utilisables hors thread principal. Revérifié empiriquement (binaire de test autonome, 4 threads non-main, aucun crash) avant tout code applicatif, puis figé en test permanent (check_does_not_panic_off_the_main_thread). check_permissions/open_permission_settings restent des commandes Tauri synchrones (pas async) : confirmé dans les sources tauri/tauri-macros 2.11.5/2.6.3 qu'une commande sync s'exécute en ligne sur le thread qui a reçu le message IPC (main thread côté WKWebView), sans spawn. - AXIsProcessTrusted() utilisée sans option de prompt (pas AXIsProcessTrustedWithOptions+kAXTrustedCheckOptionPrompt) : comportement documenté dans le code et dans STATUS.md, pas caché. Réserve (bloquante pour le merge, pas pour l'approbation du code) : nouvelles API macOS bas niveau introduites → conformément à la consigne du cycle (même règle que T-094/T-096/T-098/T-100), le merge n'est PAS programmé malgré la vérification de threading ci-dessus. PR laissée ouverte pour un test physique humain (permission réellement demandée/accordée, rendu de l'onboarding, ouverture réelle du panneau Réglages Système) — instructions détaillées dans docs/STATUS.md → Vérifications manuelles en attente (T-040).
ahitosly scheduled this pull request to auto merge when all checks succeed 2026-09-05 00:34:25 +02:00
ahitosly deleted branch feat/T-040-macos-permissions-onboarding 2026-09-05 09:33:55 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
cloud-rennais/aria!48
No description provided.