--- issueRef: "#296" version: 4 updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} updatedAt: 1788976624245 --- ## QA - 2026-09-09 - Validation unified agent capabilities Branche vérifiée : `feature/296-unified-agent-capabilities`. Périmètre relu : - Backend/application : catalogue MCP natif structuré, mutation atomique `SetAgentMcpToolAllowed`, validation metadata plugin `mcpServers[].tools`. - Backend DTO/Tauri/web-server : DTO additive `catalogue.tools`, request `set_agent_mcp_tool_allowed`, wiring commande Tauri et invoke web-server. - SDK `sdk/IdeaSDK` : type exporté `IdeAPluginMcpToolMetadata`, validation manifest, script `test:manifest`, doc `docs/manifest.md`. - Frontend : `AgentPluginCapabilities` devient la surface unifiée Skills/Tools MCP natifs et plugins ; `AgentsPanel` retire l'ancienne assignation skills séparée ; `ProjectPluginsPanel` recentré sur enable/disable ; adapters Tauri/HTTP/mock pour la mutation native. Diff vérifié : les 6 fichiers web en échec dans la suite complète ne sont pas modifiés par ce ticket (`git diff --name-only | rg '^(frontend/src/features/web/|frontend/src/features/projects/ProjectsView|frontend/src/features/web/tickets/)'` ne retourne rien). Commandes vertes exécutées : ```bash git diff --check cargo fmt --all --check ``` Sortie : aucune. ```bash cargo test -p application mcp_tool_permissions --lib cargo test -p application plugin::tests:: --lib ``` Sortie essentielle : ```text test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 170 filtered out test result: ok. 37 passed; 0 failed; 0 ignored; 0 measured; 138 filtered out ``` ```bash cargo test -p backend mcp_tool_permissions --lib cargo test -p backend backend_core_exposes_structured_native_mcp_catalogue_with_descriptions --lib cargo test -p backend dto::tests::project_mcp_tool_permissions_dto_uses_stable_camel_case_contract --lib cargo check -p backend cargo check -p application cargo check -p domain ``` Sortie essentielle : ```text test dto::tests::project_mcp_tool_permissions_dto_uses_stable_camel_case_contract ... ok test backend_core_build_tests::backend_core_exposes_structured_native_mcp_catalogue_with_descriptions ... ok Finished `dev` profile [unoptimized + debuginfo] ``` ```bash cargo check -p app-tauri cargo test -p app-tauri --test dto --test dto_plugins --test dto_agents ``` Sortie essentielle : ```text Finished `dev` profile [unoptimized + debuginfo] test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out test result: ok. 30 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out ``` ```bash cargo test -p web-server set_agent_mcp_tool_allowed --lib cargo check -p web-server ``` Sortie essentielle : ```text running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 112 filtered out Finished `dev` profile [unoptimized + debuginfo] ``` Note : aucun test web-server ne cible directement le nom `set_agent_mcp_tool_allowed`; la commande n'est donc pas probante en test, mais le routage apparaît dans la suite `web_invoke_routes_permission_commands` de la lib complète, qui passe en exécution série avant les échecs PTY hors périmètre listés plus bas. ```bash npm --prefix sdk/IdeaSDK run check ``` Sortie essentielle : ```text > @idea/plugin-sdk@0.1.0 check > npm run test:manifest && npm run typecheck:examples && npm run package:hello-plugin > @idea/plugin-sdk@0.1.0 test:manifest > npm run build && node scripts/check-manifest-tools.mjs created /home/anthony/Documents/Projects/IdeA/sdk/IdeaSDK/examples/hello-plugin/build/hello-plugin-0.1.0.zip ``` ```bash npm test -- ProjectPluginSettings.test.tsx skills.test.tsx permission.test.ts httpInvoker.test.ts npm test -- agents.test.tsx plugins.test.tsx plugin.test.ts McpToolPermissionsPanel.test.tsx ``` Sortie essentielle : ```text Test Files 4 passed (4) Tests 35 passed (35) Test Files 4 passed (4) Tests 65 passed (65) ``` ```bash npm run build npm run build:web ``` Sortie essentielle : ```text ✓ 515 modules transformed. ✓ built in 2.75s ✓ 515 modules transformed. ✓ built in 2.56s ``` Notes : warnings Vite de configuration `esbuild`/`oxc`, warning `HTMLCanvasElement.getContext()` jsdom dans des tests, et warning chunk > 500 kB au build ; non bloquants pour #296. Suites rouges exécutées et classification : ```bash cargo test -p web-server --lib ``` Sortie essentielle parallèle : ```text test result: FAILED. 72 passed; 40 failed; 0 ignored; 0 measured; 0 filtered out premier échec: Failed building the Runtime: Os { code: 24, message: "Too many open files" } ``` Classification : échec environnemental par limite de fichiers ouverts sous forte parallélisation, non bloquant pour #296. Relance série : ```bash cargo test -p web-server --lib -- --test-threads=1 ``` Sortie essentielle : ```text test result: FAILED. 105 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out ``` Les 7 échecs série sont tous des scénarios terminal/agent launch attendant `terminal.attached` et recevant `error` : - `websocket_attach_terminal_replays_scrollback_in_attached_ack` - `websocket_close_terminal_emits_exited_status_and_releases_session` - `websocket_launch_agent_different_cell_is_refused_by_singleton_guard` - `websocket_launch_agent_emits_attached_with_assigned_conversation_id` - `websocket_launch_agent_reattach_replays_scrollback_without_respawn` - `websocket_launch_agent_same_cell_is_idempotent_singleton` - `websocket_open_terminal_emits_attached_with_empty_scrollback` Ces 7 tests passent individuellement avec `cargo test -p web-server --lib`. Classification : instabilité/interférence de suite web-server PTY existante, hors périmètre #296. Non bloquant pour #296. ```bash npm test ``` Sortie essentielle : ```text Test Files 6 failed | 120 passed (126) Tests 32 failed | 1223 passed (1255) ``` Classification précise des 32 échecs frontend complets : hors périmètre #296, car ils sont dans des fichiers web non modifiés par ce ticket et ne concernent pas la surface `Capacités de l'agent`, les adapters de capabilities, ni le contrat backend/SDK MCP. - `frontend/src/features/projects/ProjectsView.ls7.test.tsx` : 3 échecs LS7 conversation viewer, bouton `open conversation conversation-open-me` introuvable. - `frontend/src/features/web/WebAgentCell.test.tsx` : 1 échec, le message mobile custom CLI contient `invalid node id` alors que le test attend son masquage. - `frontend/src/features/web/WebApp.test.tsx` : 3 échecs pairing routing, requête `getByText("Projets")` ambiguë car plusieurs éléments correspondent. - `frontend/src/features/web/WebDesktopWorkspace.test.tsx` : 1 échec, bouton `Project context` introuvable. - `frontend/src/features/web/WebMenus.test.tsx` : 8 échecs, attentes d'ancienne navigation/testids (`web-desktop-shell`, `Panneaux : ...`, `Surface ...`) non alignées avec l'UI rendue. - `frontend/src/features/web/tickets/WebTicketsSprints.test.tsx` : 16 échecs, attentes `Panneaux : ...`/navigation tickets-sprints web non alignées avec l'UI rendue. Relance des 6 fichiers web seuls reproduite avec les mêmes 32 échecs (`32 failed | 24 passed`), et relance isolée de `WebAgentCell.test.tsx`, `WebMenus.test.tsx`, `ProjectsView.ls7.test.tsx` confirme que ces familles échouent indépendamment de #296. Non bloquant pour #296. Verdict QA : VERT pour le périmètre #296, avec dette de tests web hors périmètre confirmée. ## Git - 2026-09-09 - Intégration locale Cycle Git terminé, sans push. Submodule `sdk/IdeaSDK` : - Commit feature : `d93e302` (`feat(sdk): ...`). - Merge local develop : `436ed59`. Repo parent : - Commit applicatif : `e283f4a` (`feat(agents,plugins): ...`). - Commit pointeur SDK : `fda1b2d`. - Commit tickets : `2c3234e`. - Merge local vers `develop` : `f78f009`. Réserves Git : suites complètes rouges classées non bloquantes par QA; rebuild AppImage/validation live restaient à faire au moment du merge; aucun push; `scripts/` non suivi hors périmètre. ## AppImage - 2026-09-09 - Build local Workflow `build-appimage` exécuté après merge pour produire un artefact installable/testable. Commandes : ```bash npm --prefix frontend run build cd 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 ``` Résultat : ```text Finished 1 bundle at: /home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage ``` Artefact : `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`, 114M, sha256 `baddb3e9970c804f4123880fff1567f2344d140cf3dbcfaf85dc7d657851777f`. Remplacement de l'AppImage installée et relance IdeA non automatisés volontairement: cela tuerait la session d'orchestration active. Validation live de l'attribution depuis la fiche agent à faire après installation manuelle de cet artefact.