chore(tickets): sync store local — cycles #278 rebuild AppImage post-#277 et #279 plugins sans restart install_from_directory/soft refresh UI (branches fix/277-agent-cell-busy-cancel→feature/279-plugin-soft-refresh, merges develop e12b8f6/0b709b9, QA verte, tickets fermés; exclusion scripts/restart-idea-over-ssh.sh hors périmètre)
This commit is contained in:
29
.ideai/tickets/278/carnet.md
Normal file
29
.ideai/tickets/278/carnet.md
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
issueRef: "#278"
|
||||
version: 3
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedAt: 1788862724800
|
||||
---
|
||||
# Ticket #278 — Rebuild AppImage
|
||||
|
||||
## Demande
|
||||
Rebuild opérationnel demandé après le fix #277. Ne pas remplacer l’AppImage installée ni relancer IdeA sans demande explicite.
|
||||
|
||||
## Workflow appliqué
|
||||
Skill utilisé : `build-appimage`.
|
||||
Project root : `/home/anthony/Documents/Projects/IdeA`.
|
||||
|
||||
Commandes exécutées :
|
||||
- `npm --prefix frontend run build` — OK. Build Vite terminé, avec avertissement habituel de chunk > 500 kB.
|
||||
- Depuis `crates/app-tauri` : `mkdir -p /tmp/idea-cargo-home && CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage` — OK.
|
||||
|
||||
Le build Tauri a relancé `npm --prefix ../frontend run build:bundle`, typecheck inclus, puis a compilé `app-tauri` en release et produit l’AppImage.
|
||||
|
||||
## Artefact produit
|
||||
`/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`
|
||||
|
||||
Vérification :
|
||||
- `ls -lh target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` — `-rwxr-xr-x`, 114M, Sep 8 12:18.
|
||||
|
||||
## Limite
|
||||
Remplacement de `/home/anthony/Documents/IdeA_0.1.0_amd64.AppImage` et relance IdeA non effectués, conformément au skill : étape manuelle à faire seulement quand l’utilisateur est prêt, car relancer IdeA tue l’orchestrateur actif.
|
||||
17
.ideai/tickets/278/issue.md
Normal file
17
.ideai/tickets/278/issue.md
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
id: "784ad096-8cbd-4d71-9ad3-64ff281ef493"
|
||||
number: 278
|
||||
title: "Rebuild AppImage après retrait Busy/Cancel cellule agent"
|
||||
status: "closed"
|
||||
priority: "medium"
|
||||
sprint: null
|
||||
links: []
|
||||
agentRefs: []
|
||||
attachments: []
|
||||
createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
createdAt: 1788862572846
|
||||
updatedAt: 1788862724800
|
||||
version: 3
|
||||
---
|
||||
Rebuild opérationnel demandé par l'utilisateur après le fix #277. Produire une nouvelle AppImage Linux via le workflow validé build-appimage. Ne pas remplacer l'AppImage installée ni relancer IdeA sans demande explicite.
|
||||
131
.ideai/tickets/279/carnet.md
Normal file
131
.ideai/tickets/279/carnet.md
Normal file
@ -0,0 +1,131 @@
|
||||
---
|
||||
issueRef: "#279"
|
||||
version: 8
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedAt: 1788865967900
|
||||
---
|
||||
# Ticket #279 — Plugins sans restart + refresh UI + tools MCP
|
||||
|
||||
## Demande utilisateur
|
||||
- Quand un plugin est ajouté à IdeA, ne plus demander de redémarrer si un reload d’interface suffit.
|
||||
- Déclencher automatiquement ce refresh après le load du plugin.
|
||||
- Après refresh, restaurer le même état : projets ouverts, projet actif, fenêtres/layouts, panneaux/onglets, agents visibles, conversations sélectionnées, état UI raisonnablement restaurable.
|
||||
- Ne pas couper les agents en cours.
|
||||
- Ajouter un tool MCP permettant à un agent d’installer un plugin dans IdeA depuis un dossier.
|
||||
- Ajouter un tool MCP permettant à un agent de hot reload l’affichage après modifications dans le dossier d’un plugin déjà installé.
|
||||
- Puis rebuild AppImage.
|
||||
|
||||
## Mémoire pertinente
|
||||
`plugin-hot-reload-agent-facing-delivered` : un use case backend `ReloadPlugin` et un tool agent-facing `idea_plugin_reload({ pluginId, expectedContentHash? })` existent déjà. Limite V1 : les contributions UI React chargées par `PluginRuntimeProvider` ne sont pas rafraîchies après `PluginReloaded`.
|
||||
|
||||
## Cadrage UX
|
||||
- Comportement attendu : soft refresh UI discret, déclenché après confirmation que le plugin est chargé côté système.
|
||||
- Ne plus afficher de demande générique `Redémarrez IdeA` par défaut.
|
||||
- Messages possibles : `Chargement du plugin…`, `Mise à jour de l’interface…`, succès discret `Plugin chargé. Interface mise à jour.` / `Plugin rechargé. Affichage mis à jour.`
|
||||
- Fallback seulement si nécessaire : `Plugin chargé, mais l’interface n’a pas pu être mise à jour automatiquement. Rechargez l’affichage pour voir les changements.` ou `Plugin chargé. Un redémarrage d’IdeA est nécessaire pour appliquer tous les changements.`
|
||||
- Préserver projets ouverts, fenêtres flottantes, layouts, tailles, onglets, panneaux, sélection, scroll/filtres raisonnables.
|
||||
- Les agents en cours ne doivent pas être arrêtés, relancés, masqués durablement ou marqués perdus.
|
||||
|
||||
## Cadrage Architecture
|
||||
Verdict : faisable sans restart IdeA. Contrat = soft refresh du runtime plugin UI, pas restart process ni `window.location.reload()`.
|
||||
|
||||
### Backend/MCP
|
||||
- Ajouter `idea_plugin_install_from_directory` agent-facing.
|
||||
- Réutiliser `InstallPluginFromDirectory` existant côté application.
|
||||
- Paramètres : `{ path: string, expectedPluginId?: string }`.
|
||||
- Chemin relatif au project root requester accepté ; chemin absolu hors project root rejeté sauf règle explicite future.
|
||||
- Rejeter fichiers, archives, symlinks échappants, manifest absent/id invalide, mismatch `expectedPluginId`.
|
||||
- Retourner le même shape que l’install UI : plugin, review, restartRequired, warnings si disponibles.
|
||||
- `idea_plugin_reload` reste tool canonique pour le reload depuis la source enregistrée ; ne pas créer de doublon si son contrat/description couvre bien le refresh UI via event.
|
||||
- Les deux tools sont WriteAction.
|
||||
|
||||
### Frontend
|
||||
- `PluginRuntimeProvider` s’abonne aux événements `pluginInstalled`/`pluginReloaded`.
|
||||
- Sur événement, il relit `plugin.listRuntimeContributions()` puis reconstruit le registry via `loadPlugins`.
|
||||
- Le contexte plugin est remplacé sans `window.location.reload()` ni remount de l’app/workspace.
|
||||
- Les layouts plugin existants restent en place ; fallback existant si contribution absente/invalide.
|
||||
|
||||
## Implémentation backend
|
||||
Fichiers modifiés :
|
||||
- `crates/application/src/plugin/mod.rs`
|
||||
- `crates/backend/src/lib.rs`
|
||||
- `crates/infrastructure/src/orchestrator/mcp/plugins.rs`
|
||||
- `crates/infrastructure/src/orchestrator/mcp/tools.rs`
|
||||
- `crates/infrastructure/tests/mcp_server.rs`
|
||||
- `crates/infrastructure/tests/plugin_install_load.rs`
|
||||
|
||||
Résultat :
|
||||
- Nouveau tool `idea_plugin_install_from_directory({ path, expectedPluginId? })`.
|
||||
- Chemin canonique confiné au project root du demandeur ; fichiers et symlinks sortants rejetés.
|
||||
- Validation `expectedPluginId` avant commit.
|
||||
- Tool classé `WriteAction`, masqué/refusé sans permission explicite.
|
||||
- Installation avec `restartRequired: false` et publication `PluginInstalled`.
|
||||
- `idea_plugin_reload` conservé comme tool canonique, publication `PluginReloaded`.
|
||||
|
||||
Tests DevBackend :
|
||||
- `cargo fmt --all -- --check` — OK
|
||||
- `cargo check -p application -p infrastructure -p backend` — OK
|
||||
- `cargo test -p application directory_install_ --lib -- --nocapture` — 2 OK
|
||||
- `cargo test -p backend plugin_directory_resolution_ --lib -- --nocapture` — 4 OK
|
||||
- `cargo test -p infrastructure --test mcp_server plugin_ -- --nocapture` — 2 OK
|
||||
- `cargo test -p infrastructure --test plugin_install_load -- --nocapture` — 5 OK
|
||||
- `cargo test -p application plugin::tests --lib -- --nocapture` — 34 OK
|
||||
- `cargo test -p infrastructure --test mcp_server -- --nocapture` — 39 OK
|
||||
- `git diff --check -- <six fichiers>` — OK
|
||||
|
||||
## Implémentation frontend
|
||||
Fichiers modifiés :
|
||||
- `frontend/src/domain/index.ts`
|
||||
- `frontend/src/features/plugins/PluginRuntimeProvider.tsx`
|
||||
- `frontend/src/features/plugins/PluginRuntimeProvider.test.tsx`
|
||||
- `frontend/src/features/plugins/plugins.test.tsx`
|
||||
- `frontend/src/adapters/mock/index.ts`
|
||||
- `frontend/src/plugins/runtime/loader.ts`
|
||||
|
||||
Résultat :
|
||||
- Événements typés `pluginInstalled` et `pluginReloaded`.
|
||||
- Rechargement atomique du registre plugin sur ces événements.
|
||||
- Aucun remount workspace ni reload WebView.
|
||||
- État enfant préservé.
|
||||
- Contributions absentes/invalides : fallback existant, cellule conservée.
|
||||
- Fenêtres secondaires couvertes via leur propre provider.
|
||||
- Installation mock alignée sur `restartRequired: false`; plus de message `Redémarrage requis` quand non nécessaire.
|
||||
|
||||
Tests DevFrontend :
|
||||
- `npm run typecheck` — OK
|
||||
- `npm test -- --run src/features/plugins/PluginRuntimeProvider.test.tsx src/features/plugins/plugins.test.tsx src/features/plugins/PluginLayoutCellView.test.tsx src/app/ViewWindow.test.tsx` — 4 fichiers, 24 OK
|
||||
- `git diff --check` — OK
|
||||
|
||||
## QA
|
||||
Verdict QA : VERT sur `feature/279-plugin-soft-refresh`.
|
||||
|
||||
Commandes QA :
|
||||
- `cargo fmt --all --check` — OK
|
||||
- `git diff --check` — OK
|
||||
- `cargo test -p infrastructure --test mcp_server -- --nocapture` — 39 OK
|
||||
- `cargo test -p infrastructure --test plugin_install_load -- --nocapture` — 5 OK
|
||||
- `cargo test -p backend plugin_directory_resolution -- --nocapture` — 4 OK
|
||||
- `cargo test -p application plugin -- --nocapture` — global vert, incluant install soft-refresh, mismatch expectedPluginId, reload/hash/reconcile.
|
||||
- `cargo test -p application open_plugin_layout_window -- --nocapture` — 2 OK
|
||||
- `cargo test -p application restore_open_windows -- --nocapture` — 2 OK
|
||||
- `cd frontend && npm run typecheck` — OK
|
||||
- `cd frontend && npm test -- --run src/features/plugins/PluginRuntimeProvider.test.tsx src/features/plugins/plugins.test.tsx` — 2 fichiers, 13 OK
|
||||
- `cd frontend && npm test -- --run src/features/plugins/PluginLayoutCellView.test.tsx src/features/projects/pluginGitRepository.test.tsx src/features/layout/layoutTabsGitGraph.test.tsx src/features/agents/CustomAgentChatView.test.tsx` — 4 fichiers, 78 OK
|
||||
|
||||
## Git
|
||||
- `979965a` — backend #279.
|
||||
- `44dc677` — frontend #279.
|
||||
- `0b709b9` — merge local `--no-ff` vers `develop`.
|
||||
- Aucun push distant.
|
||||
|
||||
## Rebuild AppImage
|
||||
Skill utilisé : `build-appimage`.
|
||||
Commandes :
|
||||
- `npm --prefix frontend run build` — OK.
|
||||
- Depuis `crates/app-tauri` : `mkdir -p /tmp/idea-cargo-home && CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage` — OK.
|
||||
|
||||
Artefact : `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`.
|
||||
Vérification : `-rwxr-xr-x`, 114M, Sep 8 13:11.
|
||||
|
||||
## Limite d’application live
|
||||
L’AppImage installée n’a pas été remplacée et IdeA n’a pas été relancé. Pour rendre le correctif actif dans l’application en cours, il faudra remplacer l’AppImage installée puis relancer IdeA quand l’utilisateur est prêt.
|
||||
17
.ideai/tickets/279/issue.md
Normal file
17
.ideai/tickets/279/issue.md
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
id: "57173ec9-fb4a-48d4-9378-3cd0825321e7"
|
||||
number: 279
|
||||
title: "Plugins sans restart : refresh UI préservant l’état + tools MCP install/reload affichage"
|
||||
status: "closed"
|
||||
priority: "high"
|
||||
sprint: null
|
||||
links: []
|
||||
agentRefs: [{"agentId":"ab328d90-c307-4771-a3b6-6c56089c8506","role":"assigned"}]
|
||||
attachments: []
|
||||
createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
createdAt: 1788863673305
|
||||
updatedAt: 1788865967900
|
||||
version: 8
|
||||
---
|
||||
Demande utilisateur : lorsqu’un plugin est ajouté à IdeA, ne plus demander de redémarrer l’application si un reload d’interface suffit ; déclencher automatiquement le refresh après load du plugin ; préserver l’état utilisateur après refresh (projets ouverts, fenêtres/layouts, état de l’UI) et ne pas couper les agents en cours. Ajouter aussi un tool MCP permettant à un agent d’installer un plugin dans IdeA depuis un dossier, pour qu’un projet créant des plugins puisse appliquer son plugin, et un tool MCP permettant à un agent de hot reload l’affichage après modification du dossier d’un plugin déjà installé. Puis rebuild l’AppImage. À cadrer : réutiliser le hot reload agent-facing existant (#269 / idea_plugin_reload), ne pas redémarrer le runtime, distinguer refresh UI de restart process, permissions WriteAction et contraintes de chemin.
|
||||
@ -1,3 +1,3 @@
|
||||
{
|
||||
"nextNumber": 278
|
||||
"nextNumber": 280
|
||||
}
|
||||
@ -3789,6 +3789,36 @@
|
||||
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
|
||||
},
|
||||
"updatedAt": 1788862496223
|
||||
},
|
||||
{
|
||||
"issueRef": "#278",
|
||||
"path": "278",
|
||||
"title": "Rebuild AppImage après retrait Busy/Cancel cellule agent",
|
||||
"status": "closed",
|
||||
"priority": "medium",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [],
|
||||
"createdBy": {
|
||||
"kind": "agent",
|
||||
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
|
||||
},
|
||||
"updatedAt": 1788862724800
|
||||
},
|
||||
{
|
||||
"issueRef": "#279",
|
||||
"path": "279",
|
||||
"title": "Plugins sans restart : refresh UI préservant l’état + tools MCP install/reload affichage",
|
||||
"status": "closed",
|
||||
"priority": "high",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"ab328d90-c307-4771-a3b6-6c56089c8506"
|
||||
],
|
||||
"createdBy": {
|
||||
"kind": "agent",
|
||||
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
|
||||
},
|
||||
"updatedAt": 1788865967900
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user