fix(plugins): isole les menus plugin et durcit hello-plugin SDK contre la rechute #120

Requalification Architect du 2026-08-01: le crash INTERFACE INTERROMPUE au
chargement d'un plugin (menu + item) remonte via ProjectsView -> usePluginMenus
-> MenuBar jusqu'à RootErrorBoundary, quel que soit le plugin (ancien ou
reconstruit via SDK).

- usePluginMenus isole la résolution/conversion des contributions plugin :
  toute erreur retombe sur [] au lieu de propager.
- ProjectsView sépare les menus natifs des menus enrichis par plugin et rend
  MenuBar derrière une error boundary locale (fallback menus natifs seuls).
- hello-plugin (SDK) et les tests d'installation associés durcis en cohérence.

Bookkeeping ticket #120 uniquement (issue.md, carnet.md) ; les fichiers
counter.json/index.json et le dossier tickets/122/ restent hors commit car
une collision de numérotation #122 existe entre cette base et
feature/ticket120-hello-plugin-install-path-audit (deux tickets différents
revendiquent #122) — à arbitrer avant de committer le bookkeeping global.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-01 16:23:56 +02:00
parent 8031d86deb
commit 5a30ec8b9c
11 changed files with 516 additions and 75 deletions

View File

@ -1,6 +1,113 @@
---
issueRef: "#120"
version: 1
version: 5
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedAt: 1785534496259
updatedAt: 1785592705452
---
# Carnet de suivi — hello-plugin
## Etat courant
- Ticket canonique: `#120`
- Date de rechute confirmee: 2026-08-01
- Statut: investigation relancee sur rechute reelle post-rebuild SDK
- Severite: critique (l'UI d'IdeA tombe sur une erreur d'affichage lors de l'installation/chargement de `hello-plugin`)
## Constat central au 2026-08-01
Le probleme persiste meme apres reconstruction de `hello-plugin` comme plugin d'exemple 100% SDK.
Implication forte:
- la cause racine est probablement dans le systeme plugin / runtime frontend / chargement UI / integration layout-menu, et non dans l'ancien exemple `hello-plugin` uniquement.
## Trace utilisateur fournie le 2026-08-01
Message visible:
- `IdeA a rencontre une erreur d'affichage.`
- `L'application reste ouverte. Rechargez la fenetre apres avoir copie le diagnostic si le probleme doit etre investigue.`
Stack affichee:
```text
kT@tauri://localhost/assets/index-CXNCu-GC.js:88:32937
ST@tauri://localhost/assets/index-CXNCu-GC.js:88:31877
om@tauri://localhost/assets/index-CXNCu-GC.js:38:17019
oh@tauri://localhost/assets/index-CXNCu-GC.js:40:3141
$b@tauri://localhost/assets/index-CXNCu-GC.js:40:39779
SC@tauri://localhost/assets/index-CXNCu-GC.js:40:39707
sc@tauri://localhost/assets/index-CXNCu-GC.js:40:39559
yh@tauri://localhost/assets/index-CXNCu-GC.js:40:35923
Ob@tauri://localhost/assets/index-CXNCu-GC.js:40:34872
E@tauri://localhost/assets/index-CXNCu-GC.js:25:1541
L@tauri://localhost/assets/index-CXNCu-GC.js:25:1903
ST@tauri://localhost/assets/index-CXNCu-GC.js:88:28096
div
div
div
ID@tauri://localhost/assets/index-CXNCu-GC.js:94:63541
main
div
div
G4@tauri://localhost/assets/index-CXNCu-GC.js:129:18236
div
div
_T@tauri://localhost/assets/index-CXNCu-GC.js:88:24675
BP@tauri://localhost/assets/index-CXNCu-GC.js:88:1862
ez@tauri://localhost/assets/index-CXNCu-GC.js:129:31272
mP@tauri://localhost/assets/index-CXNCu-GC.js:82:27658
Iz@tauri://localhost/assets/index-CXNCu-GC.js:129:83025
```
## Faits etablis avant cette rechute
- Un rebuild SDK de `hello-plugin` a ete realise pour produire un plugin d'exemple minimal mais fonctionnel.
- Des verifications de build, packaging et tests locaux ont ete annoncees vertes par DevFrontend.
- QA avait pu valider partiellement:
- l'artefact SDK se reconstruit
- le plugin s'installe cote runtime/backend
- IdeA charge reellement le bundle plugin via `idea-plugin://.../dist/index.js`
- QA n'avait pas pu valider de bout en bout la surface UI visible (menu `Hello Plugin`, entree `hello-plugin`, rendu `hello-world`) faute d'une session UI observable sans ambiguite.
## Reinterpretation apres rechute utilisateur
- L'absence de validation UI de bout en bout n'etait pas un detail: la rechute utilisateur montre que le crash survient bien dans le flux reel d'affichage, malgre un plugin reconstruit proprement.
- Le signal pointe desormais plus fortement vers un probleme dans la consommation frontend des contributions plugin que vers le contenu fonctionnel du plugin lui-meme.
## Requalification Architect du 2026-08-01
- Fait cle: le meme hash de crash apparait avec deux plugins differents:
- ancien hello-plugin minimal (menu + item, sans layout utile)
- nouveau hello-plugin reconstruit via SDK (menu + item + layout)
- Denominateur commun probable: la contribution de menu, pas le layout.
- Zone la plus suspecte identifiee: `ProjectsView.tsx` sur l'injection de `pluginMenus` dans `<MenuBar>`.
- Point precis: le rendu des menus plugin est consomme dans l'app-shell sans isolation locale equivalente a celle deja ajoutee pour `PluginLayoutCellView`.
- Hypothese prioritaire: une entree de menu plugin ou son rendu dans `MenuBar` leve une erreur qui remonte jusqu'a `RootErrorBoundary`, produisant `INTERFACE INTERROMPUE`.
## Correctif systeme plugin/UI par DevFrontend
### Cause probable retenue
Deux plugins differents declenchent le meme crash minifie apres installation. Le denominateur commun le plus probable est le chemin `ProjectsView -> usePluginMenus -> MenuBar`.
### Correctif applique
- `usePluginMenus` isole defensivement la resolution/conversion des contributions plugin.
- Si la resolution de menus ou d'items plugin throw, le hook renvoie `[]` pour la surface plugin concernee au lieu de propager l'erreur.
- `ProjectsView` separe les menus natifs des menus enrichis par plugin.
- `ProjectsView` rend `MenuBar` derriere une error boundary locale: si le rendu enrichi plante, fallback immediat sur les menus natifs seuls.
- Logs ajoutes:
- `[plugins] menu contribution rejected` avec le contexte utile quand disponible
- `[plugins] menu render failed; using native menus only`
### Fichiers touches
- `frontend/src/features/plugins/usePluginMenus.ts`
- `frontend/src/features/plugins/usePluginMenus.test.tsx`
- `frontend/src/features/projects/ProjectsView.tsx`
### Verifications annoncees par DevFrontend
- `cd frontend && npm run typecheck` : OK
- `cd frontend && npx vitest run src/features/plugins/usePluginMenus.test.tsx src/features/plugins/menus.test.ts src/plugins/runtime/loader.test.ts src/features/projects/projects.test.tsx src/features/projects/pluginGitRepository.test.tsx src/shared/ui/FloatingWindow.test.tsx` : OK, 48 tests
- `cd frontend && npm test` : OK, 114 fichiers, 1046 tests
## Prochaine etape
- QA doit valider sur le flux reel d'installation du plugin si l'UI reste vivante et si les menus natifs sont conserves en fallback au lieu de tomber sur `INTERFACE INTERROMPUE`.

View File

@ -2,7 +2,7 @@
id: "f4218553-680a-4fbb-9514-a96eab79b8d8"
number: 120
title: "Réinvestiguer linstallation de hello-plugin: écran noir / perte daffichage IdeA"
status: "open"
status: "inProgress"
priority: "critical"
sprint: null
links: [{"target":"#116","kind":"relatesTo"}]
@ -11,8 +11,8 @@ attachments: []
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
createdAt: 1785534496259
updatedAt: 1785534496259
version: 1
updatedAt: 1785592705452
version: 5
---
## Constat utilisateur