diff --git a/.ideai/tickets/284/carnet.md b/.ideai/tickets/284/carnet.md new file mode 100644 index 00000000..83601c7c --- /dev/null +++ b/.ideai/tickets/284/carnet.md @@ -0,0 +1,33 @@ +--- +issueRef: "#284" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788881637053 +--- +2026-09-08 Main: ticket créé suite demande utilisateur. UX a spécifié une surface Settings projet > Plugins avec action Attribuer aux agents + section Agent > Capabilities de plugins, distinction skills/tools MCP, états manquant/obsolète/conflit. Architect a diagnostiqué : cross-project ask/cancel sont WriteAction deny-by-default et doivent être exposés clairement via permissions ; workstate est project-root scoped donc il faut projection côté appelant + cible et corrélation/cancel par correlationId. Architect confirme que les commandes desktop d’assignation existent déjà : plugin_list_project_settings, plugin_set_project_enabled, plugin_assign/unassign_agent_skill/tool ; stockage canonique .ideai/project-plugins.json. Écarts : surface humaine/discoverability et web unsupported ; runtime MCP plugin tools à durcir. + +Git: branche active fix/284-cross-project-contact-plugin-assignment créée depuis develop @ df5728a. Git signale que #282/commit 86ed0aa aurait déjà livré Settings projet > Plugins avec détail capabilities, attribution agent et catalogue permissions ; DevFrontend doit vérifier l’existant avant de construire. QA devra inclure backend app tests, frontend npm/build, et rebuild AppImage pour validation runtime cross-project. + +2026-09-08 DevFrontend — lot assignation plugin livré, sans commit. Audit #282 : la persistance et l’édition existaient déjà via `useProjectPlugins` et `AgentPluginCapabilities`, mais l’assignation était uniquement visible dans le détail du panneau Agents, sans point d’entrée depuis Paramètres > Plugins. Ajout de l’action explicite « Attribuer aux agents » dans Plugins du projet ; elle ferme les paramètres et ouvre le panneau Agents en flottant s’il était fermé, tout en conservant son placement s’il est déjà ancré ou détaché. La section agent est désormais titrée « Capabilities de plugins — {agent} » et explique explicitement l’attribution des skills et tools MCP des plugins activés. + +Fichiers frontend modifiés : `frontend/src/features/plugins/ProjectPluginsPanel.tsx`, `PluginsPanel.tsx`, `AgentPluginCapabilities.tsx`, `ProjectPluginSettings.test.tsx`, `frontend/src/features/settings/SettingsView.tsx`, `frontend/src/features/projects/ProjectsView.tsx`. + +Commandes : `npm --prefix frontend test -- --run src/features/plugins/ProjectPluginSettings.test.tsx` → 1 fichier, 3 tests verts ; `npm --prefix frontend run build` → TypeScript + Vite verts (avertissement non bloquant sur chunk > 500 kB). Une première commande avec le filtre `frontend/src/...` n’a exécuté aucun test car le préfixe npm place déjà Vitest dans `frontend`; relance correcte ci-dessus. + +Risques / réserves : la surface web reste unsupported par le contrat existant et n’est pas étendue dans ce lot desktop. Le catalogue plugin expose des serveurs MCP mais pas la liste de leurs tools ; l’utilisateur saisit donc le nom du tool, conformément au contrat #282 existant. Les changements backend cross-project déjà présents dans le worktree n’ont pas été modifiés ni validés par DevFrontend. + +2026-09-08 DevBackend — lot cross-project finalisé, compilable et testé, sans commit. Cause confirmée : `correlationId` n’était utilisé que dans les diagnostics, `idea_project_cancel_agent` arrêtait directement la cible fournie sans corréler une demande active, et l’auto-projection live-state n’écrivait que dans le projet cible. Le service maintient désormais un registre des demandes actives clé par projet/agent appelant + `correlationId`; il refuse une corrélation vide/dupliquée, empêche de rediriger une annulation vers une autre cible, et route le cancel uniquement après correspondance exacte. L’appelant est projeté `Waiting` puis `Done` dans le live-state de son propre projet, avec `correlationId` exposé par `idea_workstate_read`; les gardes RAII réconcilient aussi la ligne en cas d’abandon du futur. Les tools ask/cancel restent `WriteAction` deny-by-default, apparaissent dans `tools/list` lorsqu’ils sont explicitement autorisés, et le refus indique maintenant où activer la permission. + +Fichiers backend/tests modifiés : `crates/domain/src/live_state.rs`, `crates/application/src/workstate/live.rs`, `crates/application/src/orchestrator/service.rs`, `crates/application/tests/orchestrator_service.rs`, `crates/infrastructure/src/orchestrator/mcp/server.rs`, `crates/infrastructure/src/orchestrator/mcp/tools.rs`, `crates/infrastructure/tests/mcp_server.rs`. + +Commandes réelles : `cargo check -p domain -p application -p infrastructure -p backend --lib` vert ; `cargo test -p application --test orchestrator_service` 79/79 verts ; `cargo test -p application correlated_update_is_preserved_in_the_lean_projection --lib -- --nocapture` 1/1 vert ; `cargo test -p infrastructure --test mcp_server` 40/40 verts ; `cargo test -p domain live_state --lib` 15/15 verts ; `cargo fmt --all -- --check` vert ; `git diff --check` vert. + +Risques / réserves backend : le registre de corrélation est volontairement en mémoire et ne survit pas à un redémarrage, comme les tours structurés qu’il représente. Le lot n’étend pas le runtime des tools MCP contribués par plugin : ce sujet n’est pas un correctif simple/local et reste la réserve #282 (catalogue dynamique de tools absent). Aucun fichier frontend n’a été touché par DevBackend. + +2026-09-08 QA — validation indépendante effectuée sur la branche `fix/284-cross-project-contact-plugin-assignment`, sans commit. Fichiers modifiés relus/identifiés : backend cross-project dans `crates/application/src/orchestrator/service.rs`, `crates/application/src/workstate/live.rs`, `crates/domain/src/live_state.rs`, `crates/infrastructure/src/orchestrator/mcp/server.rs`, `crates/infrastructure/src/orchestrator/mcp/tools.rs` et tests associés ; frontend assignation plugin dans `frontend/src/features/plugins/ProjectPluginsPanel.tsx`, `PluginsPanel.tsx`, `AgentPluginCapabilities.tsx`, `ProjectPluginSettings.test.tsx`, `frontend/src/features/settings/SettingsView.tsx`, `frontend/src/features/projects/ProjectsView.tsx`. + +Commandes réelles QA : `git status --short --branch` confirme la branche ; `git diff --name-status` et `git diff --stat` confirment le périmètre ; `git diff -- ...` backend/frontend relu ; `cargo check -p domain -p application -p infrastructure -p backend --lib` vert ; `cargo test -p application --test orchestrator_service` 79/79 vert ; `cargo test -p infrastructure --test mcp_server` 40/40 vert ; `cargo test -p domain live_state --lib` 15/15 vert ; `cargo test -p application correlated_update_is_preserved_in_the_lean_projection --lib -- --nocapture` 1/1 vert ; `npm --prefix frontend test -- --run src/features/plugins/ProjectPluginSettings.test.tsx` 1 fichier / 3 tests verts ; `npm --prefix frontend run build` vert avec l’avertissement Vite habituel chunk > 500 kB ; `cargo fmt --all -- --check` vert ; `git diff --check` vert ; `rg -n "Attribuer aux agents|Capabilities de plugins|onAssignPluginCapabilities|Skills de plugins|Tools MCP de plugins" frontend/src/features/plugins frontend/src/features/settings frontend/src/features/projects` confirme la surface visible/testée. + +Verdict QA : VERT pour le périmètre source/test. Réserves : la validation runtime réelle du contact UnityPlugin cross-project dans l’application en cours d’exécution nécessite un rebuild AppImage puis une validation live, car le binaire utilisé est l’AppImage et non les sources locales. Cette validation live AppImage n’a pas été exécutée dans ce passage. La surface web reste hors périmètre/unsupported, et le catalogue dynamique des tools MCP de plugins reste la réserve connue #282. + +2026-09-08 Main — rebuild AppImage exécuté après QA via workflow `build-appimage`. Commandes : `npm --prefix frontend run build` vert ; 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` vert. Artefact produit : `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. Conformément au workflow, Main n’a pas remplacé `/home/anthony/Documents/IdeA_0.1.0_amd64.AppImage` et n’a pas relancé IdeA pour ne pas tuer l’orchestrateur actif ; validation live UnityPlugin à faire après remplacement/relance par l’utilisateur. \ No newline at end of file diff --git a/.ideai/tickets/284/issue.md b/.ideai/tickets/284/issue.md new file mode 100644 index 00000000..c8f46c1e --- /dev/null +++ b/.ideai/tickets/284/issue.md @@ -0,0 +1,17 @@ +--- +id: "59222f44-0cef-4956-a12b-491fbbe47121" +number: 284 +title: "Corriger le contact inter-projet et ajouter l’assignation plugin par agent" +status: "qa" +priority: "high" +sprint: null +links: [{"target":"#283","kind":"relatesTo"}] +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: 1788879174173 +updatedAt: 1788881637053 +version: 6 +--- +Demande utilisateur du 2026-09-08 : UnityPlugin a tenté de contacter Main mais le contact inter-agent cross-project n’est pas arrivé côté workstate. En parallèle, l’utilisateur ne trouve pas d’interface pour assigner les skills et tools MCP d’un plugin à un agent ; actuellement Main du projet plugin a modifié .ideai/project-plugins.json à la main. Objectifs : diagnostiquer/corriger le contact inter-projet, vérifier l’existence d’une surface UI d’assignation plugin -> agents, et si absente livrer une interface permettant d’attribuer skills et tools MCP de plugin à un ou plusieurs agents avec persistance dans le contrat projet existant. \ No newline at end of file diff --git a/.ideai/tickets/285/carnet.md b/.ideai/tickets/285/carnet.md new file mode 100644 index 00000000..8b1540c4 --- /dev/null +++ b/.ideai/tickets/285/carnet.md @@ -0,0 +1,23 @@ +--- +issueRef: "#285" +version: 4 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788880858861 +--- +## 2026-09-08 - Clarification SDK pluginRoot + +Demande issue de Main UnityPlugin ticket #8 : verifier si un plugin runtime peut resoudre son package/plugin root depuis `activate(ctx)` pour lancer un script packagé via `ctx.services.tasks.runCommand()`. + +Constat Architect : non, aucune API publique runtime n'expose aujourd'hui pluginRoot/package root/archive root/file URL exploitable. `workspace.getProjectRoot()` et `tasks.runCommand().cwd` sont bornes au project root. `${pluginRoot}` / `${appDataDir}` existent cote host uniquement pour les `contributes.mcpServers` declares dans le manifest. + +Docs modifiees dans le submodule `sdk/IdeaSDK` sur branche `feature/285-plugin-root-scope-docs` : +- `docs/activation-context.md` : absence explicite de plugin install dir/package root et correction de la liste des champs publics. +- `docs/services.md` : `runCommand()` project/workspace scoped, pas de resolution package-relative. +- `docs/commands-and-feedback.md` : precondition + contre-exemple pour scripts packagés. +- `docs/manifest.md` : section `MCP Server Paths`, substitution limitee aux serveurs MCP declares. + +QA : VERT. Commandes reelles executees dans `sdk/IdeaSDK` : `git status --short --branch`, `git diff -- ...`, `rg -n ...`, `npm run`, `npm run check`. `npm run check` a execute `build`, `typecheck:examples`, `package:hello-plugin` et a cree l'archive hello-plugin attendue sans fichier modifie hors docs. + +Git : commits locaux dans le submodule `sdk/IdeaSDK` : `5f9c2f9` (`docs(sdk): clarify pluginRoot scope for runtime plugins — #285`) puis merge local `68019de` sur `develop`. Pas de push. Le pointeur du depot parent est volontairement laisse sur `7db819c` et le submodule reparké dessus pour eviter de melanger avec le travail #284 en cours ; le bump sera fait plus tard par Git avec le sync local approprie. L'utilisateur UnityPlugin peut reprendre/mettre a jour le sous-module vers `68019de`. + +Risque residuel : validation documentaire uniquement, pas de test runtime host sur la substitution `${pluginRoot}` des MCP servers. Docs-only, pas de rebuild AppImage requis. \ No newline at end of file diff --git a/.ideai/tickets/285/issue.md b/.ideai/tickets/285/issue.md new file mode 100644 index 00000000..1c93381c --- /dev/null +++ b/.ideai/tickets/285/issue.md @@ -0,0 +1,17 @@ +--- +id: "d553e008-9a19-49fd-a7d5-dc712a4cae68" +number: 285 +title: "Clarifier le chemin package/pluginRoot dans l'API SDK runtime" +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: 1788880495891 +updatedAt: 1788880858861 +version: 4 +--- +Demande UnityPlugin ticket #8 : verifier si ActivateContext/services publics exposent une API officielle pour resoudre le chemin du package/plugin installe depuis activate(ctx), notamment pour lancer un script packagé via tasks.runCommand. Si aucune API n'existe, documenter explicitement la limite ou cadrer la capacite prevue dans IdeaSDK/docs. \ No newline at end of file diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index db594665..68afd6d8 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 284 + "nextNumber": 286 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index fc57eb71..ece2ab1c 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -3875,6 +3875,36 @@ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, "updatedAt": 1788877456900 + }, + { + "issueRef": "#284", + "path": "284", + "title": "Corriger le contact inter-projet et ajouter l’assignation plugin par agent", + "status": "qa", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "ab328d90-c307-4771-a3b6-6c56089c8506" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788881637053 + }, + { + "issueRef": "#285", + "path": "285", + "title": "Clarifier le chemin package/pluginRoot dans l'API SDK runtime", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788880858861 } ] } \ No newline at end of file diff --git a/sdk/IdeaSDK b/sdk/IdeaSDK index 7db819c6..68019dec 160000 --- a/sdk/IdeaSDK +++ b/sdk/IdeaSDK @@ -1 +1 @@ -Subproject commit 7db819c64720baae1b38cd48060fd97bca5b2dd8 +Subproject commit 68019dec58e25cc4f7c8e45b1b7e35f76a7eb95c