--- issueRef: "#299" version: 5 updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} updatedAt: 1788983152377 --- # Ticket #299 - Panneau MCP: detachement silencieux ## Signalement Le panneau MCP ne fonctionne pas en fenetre detachee: quand l'utilisateur veut le detacher, rien ne se passe. ## Cadrage UX - `Detacher` doit ouvrir immediatement une fenetre flottante/systeme titree `MCP`, avec le meme contenu/etat. - Une seule fenetre MCP: clics repetes => focus de la fenetre existante. - Fermer ou `Rattacher` remet MCP dans la cellule d'origine sans perte d'etat. - Si detachement impossible: ne pas rester silencieux; desactiver l'action ou afficher `Le panneau MCP ne peut pas etre detache pour le moment.` / erreur retry visible. ## Cadrage Architect Hypothese forte: desalignement frontend/backend. - Frontend declare `mcp` detachable dans `frontend/src/features/projects/viewPlacement.ts` et le rend via `ViewPanelBody`. - Backend Tauri `ViewPanel` dans `crates/app-tauri/src/commands.rs` ne connait probablement pas `Mcp`. - `open_view_window("mcp")` echoue en `INVALID`, et `detachPanel` dans `ProjectsView.tsx` avale l'echec, donc effet utilisateur: rien. Correctif attendu: - Ajouter `Mcp` a l'enum/backend `ViewPanel` et aux branches `parse`, `as_str`, `title`. - Garantir label `view-mcp`, URL `index.html?panel=mcp`, reconnaissance de `view-mcp`. - Ne pas refondre docking/FloatingWindow/LeafView; ne pas toucher `McpPanel` sans preuve. - Preserver: pas de ghost detached slot si erreur backend, `projects` reste non detachable. Tests attendus: - Rust app-tauri pour parse/as_str/title/label/url/reconnaissance label MCP. - Frontend: ViewWindow query `?panel=mcp`, detach MCP, viewPlacement detachable MCP. ## Etat orchestration Ticket cree par Main le 2026-09-09, statut inProgress. En attente branche Git puis implementation DevBackend/DevFrontend et validation QA. ## Implementation DevBackend - 2026-09-09 - Branche: `fix/299-mcp-panel-detach-window`. - Ajout de `ViewPanel::Mcp` dans `crates/app-tauri/src/commands.rs` avec les contrats: - parse `mcp`; - identifiant `mcp`; - titre `MCP`; - label stable `view-mcp`; - URL `index.html?panel=mcp`. - La reconnaissance des labels courants et la restauration des fenetres persistees acceptent desormais `view-mcp`. - Tests Rust ajoutes pour parse/as_str/title/label/url, reconnaissance du label et identite persistee MCP. - Validation executee: - `cargo fmt --all -- --check`: vert; - `cargo test -p app-tauri view_window_tests`: vert, 9 tests passes; - `cargo test -p app-tauri persisted_identity_accepts_mcp_view_label`: vert, 1 test passe. - Aucun changement frontend, aucun commit. Les modifications hors perimetre deja presentes dans le worktree ont ete laissees intactes. ## Implementation DevFrontend - 2026-09-09 - Verification du chemin existant: `mcp` est deja un `PanelId`, titre `MCP`, rendu par `ViewPanelBody` et accepte par `isDetachablePanel`; aucune refonte de docking/FloatingWindow/LeafView necessaire. - `ProjectsView.detachPanel` continue de n'appliquer le placement `detached` qu'apres succes de `openViewWindow("mcp")`, preservant l'absence de ghost slot en cas d'erreur. - L'echec de detachement n'est plus silencieux: alerte `Le panneau MCP ne peut pas etre detache pour le moment.` avec action `Reessayer`, tandis que le placement courant reste visible. - Tests frontend ajoutes/ajustes: - `ViewWindow` accepte explicitement `?panel=mcp`; - `ProjectsView` ouvre bien la fenetre OS avec l'identifiant `mcp`; - un echec conserve le panneau flottant, affiche l'alerte et permet un retry concluant; - `viewPlacement` confirme explicitement que `mcp` est detachable. - Validation executee: - `npm test -- --run src/app/ViewWindow.test.tsx src/features/projects/ProjectsView.detach.test.tsx src/features/projects/viewPlacement.test.ts`: vert, 3 fichiers / 22 tests; - `npm run build`: vert (`tsc --noEmit` + build Vite), avec uniquement l'avertissement existant de taille de chunk. - Aucun commit. Les changements backend et hors perimetre deja presents ont ete preserves. ## QA - 2026-09-09 Verdict: VERT pour #299 sur `fix/299-mcp-panel-detach-window`. Audit du diff: - Backend: `ViewPanel::Mcp` ajoute avec parse/as_str/title, label `view-mcp`, URL `index.html?panel=mcp`, et restauration des labels persistants. - Frontend: `?panel=mcp` accepte par `ViewWindow`, MCP explicitement detachable, `ProjectsView` ouvre la fenetre OS pour `mcp`, conserve le panneau si `openViewWindow` echoue, et affiche une alerte avec retry. Commandes executees: - `git status --short --branch`: branche `fix/299-mcp-panel-detach-window`, worktree non commite avec les changements #299 et fichiers tickets. - `git diff --stat` / `git diff -- ...`: diff inspecte, conforme au cadrage du ticket. - `cargo fmt --all -- --check`: vert. - `cargo test -p app-tauri view_window_tests`: vert, 9 tests passes, 0 failed. - `cargo test -p app-tauri persisted_identity_accepts_mcp_view_label`: vert, 1 test passe, 0 failed. - `npm test -- --run src/app/ViewWindow.test.tsx src/features/projects/ProjectsView.detach.test.tsx src/features/projects/viewPlacement.test.ts` depuis la racine: rouge attendu de commande (`ENOENT`, pas de `package.json` a la racine). Relance corrigee depuis `frontend/`. - Depuis `frontend/`, `npm test -- --run src/app/ViewWindow.test.tsx src/features/projects/ProjectsView.detach.test.tsx src/features/projects/viewPlacement.test.ts`: vert, 3 fichiers passes / 22 tests passes. Sortie avec avertissements Vite existants et `HTMLCanvasElement.getContext()` non implemente par jsdom, sans echec. - `git diff --check`: vert. - Depuis `frontend/`, `npm run build`: vert (`tsc --noEmit && vite build`), avec l'avertissement existant de chunk > 500 kB. Risques residuels: - Validation limitee aux tests automatises et au build; je n'ai pas ouvert l'AppImage/UI desktop live pour cliquer le detachement MCP dans une fenetre systeme reelle. - Le worktree contient aussi des modifications de metadonnees/tickets hors fichiers applicatifs #299 deja presentes; elles n'ont pas ete modifiees sauf ce carnet. ## Git - 2026-09-09 - Branche de travail: `fix/299-mcp-panel-detach-window`, creee depuis `develop` @ 602abfe. - Inspection du diff: 6 fichiers applicatifs dans le perimetre (commands.rs, lib.rs app-tauri; ViewWindow.test, ProjectsView.tsx, ProjectsView.detach.test, viewPlacement.test frontend), +101/-3. - QA reconfirmee par Git avant commit (note: rustup sans toolchain par defaut, commandes passees via `rustup run stable`): - `rustup run stable cargo fmt --all -- --check`: vert; - `git diff --check`: vert; - `cargo test -p app-tauri view_window_tests`: 9/9 dont `mcp_view_window_contract_is_stable`; - `cargo test -p app-tauri persisted_identity_accepts_mcp_view_label`: 1/1; - `npm test` frontend: 3 fichiers / 22 tests verts; - `npm run build` (`tsc --noEmit && vite build`): vert. - Commit du correctif: `e4622cd` sur la branche fix — uniquement les 6 fichiers applicatifs. - Merge local: `c47bc8d` `merge(views)` --no-ff vers `develop`; develop desormais 306 commits devant origin/develop. - Hors perimetre laisse intact/non commite: `.ideai/tickets/296/*`, `.ideai/tickets/299/` (ce carnet), `.ideai/tickets/counter.json`, `.ideai/tickets/index.json`, `scripts/` — sync store a la charge de Main. - Restants pour cloture: rebuild AppImage + validation live du detachement MCP depuis l'app installee (point deja signale par QA). - Aucun push distant. ## AppImage - 2026-09-09 - Rebuild execute par Main sur `develop` apres le merge `c47bc8d`: `npm --prefix frontend run build` vert, puis depuis `crates/app-tauri`: `CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage` vert. - Artefact: `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`, 119523832 octets, sha256 `31e400c6ef6caefef658fe11b51b371c8571ea8011555aa20e4d272a3eb2742b` (verifie par Git: presence, taille, horodatage 21:45 posterieur au merge). - Commit dedie `941db62` `chore(appimage)` --allow-empty sur `develop` (artefact sous target/ gitignore, bookkeeping store hors perimetre: le message de commit est la trace durable in-repo du rebuild, convention #298). - Tag annote `v0.42.0` pose sur `941db62` (convention vx.y.z: y incremente pour un rebuild commite sur develop; precedent v0.41.0). - Restant unique: validation live du detachement MCP depuis l'app installee. Aucun push distant.