diff --git a/.ideai/memory/MEMORY.md b/.ideai/memory/MEMORY.md index b2a34e2a..9ae8a36b 100644 --- a/.ideai/memory/MEMORY.md +++ b/.ideai/memory/MEMORY.md @@ -88,3 +88,4 @@ - [plugin-soft-refresh-and-agent-install-tools-delivered](plugin-soft-refresh-and-agent-install-tools-delivered.md) — memory note plugin-soft-refresh-and-agent-install-tools-delivered - [cross-project-ask-drop-cleans-live-state](cross-project-ask-drop-cleans-live-state.md) — memory note cross-project-ask-drop-cleans-live-state - [project-plugin-skills-multi-harness-contract](project-plugin-skills-multi-harness-contract.md) — memory note project-plugin-skills-multi-harness-contract +- [ticket284-cross-project-contact-plugin-assignment](ticket284-cross-project-contact-plugin-assignment.md) — memory note ticket284-cross-project-contact-plugin-assignment diff --git a/.ideai/memory/ticket284-cross-project-contact-plugin-assignment.md b/.ideai/memory/ticket284-cross-project-contact-plugin-assignment.md new file mode 100644 index 00000000..89da881a --- /dev/null +++ b/.ideai/memory/ticket284-cross-project-contact-plugin-assignment.md @@ -0,0 +1,29 @@ +--- +name: ticket284-cross-project-contact-plugin-assignment +description: memory note ticket284-cross-project-contact-plugin-assignment +metadata: + type: project +--- +# Ticket #284 — contact cross-project et assignation plugin par agent + +Le ticket #284 a été livré et mergé localement dans `develop` le 2026-09-08. + +## Correctif cross-project + +Cause corrigée : `correlationId` servait surtout au diagnostic, `idea_project_cancel_agent` pouvait arrêter la cible fournie sans la relier à une demande active, et la projection live-state écrivait principalement côté projet cible. Le service maintient maintenant un registre mémoire des demandes actives par projet/agent appelant + `correlationId`, refuse les corrélations vides/dupliquées, empêche la redirection d’un cancel vers une autre cible, et projette aussi l’appelant `Waiting` puis `Done` dans son propre workstate avec `correlationId` exposé. + +Les tools cross-project ask/cancel restent `WriteAction` deny-by-default, mais le catalogue/erreur indique plus clairement qu’il faut autoriser `idea_project_ask_agent` / `idea_project_cancel_agent`. + +## Assignation plugin par agent + +L’API et la persistance existaient déjà via `.ideai/project-plugins.json` et les commandes desktop `plugin_*`. Le défaut utilisateur était surtout la découvrabilité. La surface `Settings projet > Plugins` expose désormais un bouton explicite `Attribuer aux agents`, ouvrant le panneau Agents, et la section agent affiche `Capabilities de plugins — {agent}` avec séparation skills/tools MCP. + +## Validation + +QA vert : cargo check ciblé, tests `orchestrator_service` 79/79, `mcp_server` 40/40, `domain live_state` 15/15, test frontend plugin settings 3/3, `npm --prefix frontend run build`, `cargo fmt --all -- --check`, `git diff --check`. + +AppImage rebuilt : `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. + +## Réserve opérationnelle + +Le binaire en cours d’exécution reste l’ancienne AppImage tant que l’utilisateur ne remplace pas `/home/anthony/Documents/IdeA_0.1.0_amd64.AppImage` et ne relance pas IdeA. Ne pas automatiser cette étape depuis une session active, car elle tue l’orchestrateur. \ No newline at end of file diff --git a/.ideai/tickets/285/carnet.md b/.ideai/tickets/285/carnet.md index 8b1540c4..cf34a287 100644 --- a/.ideai/tickets/285/carnet.md +++ b/.ideai/tickets/285/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#285" -version: 4 +version: 8 updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} -updatedAt: 1788880858861 +updatedAt: 1788885132878 --- ## 2026-09-08 - Clarification SDK pluginRoot @@ -20,4 +20,70 @@ QA : VERT. Commandes reelles executees dans `sdk/IdeaSDK` : `git status --short 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 +Risque residuel : validation documentaire uniquement, pas de test runtime host sur la substitution `${pluginRoot}` des MCP servers. Docs-only, pas de rebuild AppImage requis. + +## 2026-09-08 - API runtime officielle `ctx.pluginRoot` + +Le constat documentaire precedent est remplace par une implementation runtime : le catalogue host projette la racine canonique du package installe actif, le DTO la transporte sous `pluginRoot`, et le loader l'injecte dans `activate(ctx)`. Le SDK expose ce champ obligatoire dans `ActivateContext`. L'exemple hello-plugin execute un script inclus dans son archive en construisant son chemin depuis `ctx.pluginRoot`. + +Fichiers modifies dans le depot parent : +- `crates/domain/src/ports.rs` +- `crates/infrastructure/src/plugin/mod.rs` +- `crates/infrastructure/tests/plugin_install_load.rs` +- `crates/application/src/plugin/mod.rs` +- `crates/application/src/slash_command.rs` +- `crates/backend/src/dto.rs` +- `crates/app-tauri/tests/dto_plugins.rs` +- `frontend/src/domain/index.ts` +- `frontend/src/plugins/runtime/loader.ts` +- `frontend/src/plugins/runtime/loader.test.ts` +- `frontend/src/features/plugins/PluginRuntimeProvider.test.tsx` +- `frontend/src/features/plugins/plugins.test.tsx` + +Fichiers modifies dans le submodule `sdk/IdeaSDK` : +- `src/runtime.ts` +- `docs/activation-context.md` +- `docs/commands-and-feedback.md` +- `docs/manifest.md` +- `docs/services.md` +- `examples/hello-plugin/README.md` +- `examples/hello-plugin/src/core/workspace.ts` +- `examples/hello-plugin/scripts/hello-task.mjs` (nouveau) +- `scripts/package-hello-plugin.mjs` + +Commandes reelles et resultats : +- `cargo fmt --all` : succes. +- `cargo check -p domain -p application -p infrastructure -p backend -p app-tauri --lib` : succes. +- `cargo test -p application runtime_catalog_ --lib` : 5 passes, 0 echec. +- `cargo test -p infrastructure --test plugin_install_load` : 5 passes, 0 echec. +- `cargo test -p app-tauri --test dto_plugins` : 2 passes, 0 echec. +- `npm run check` dans `sdk/IdeaSDK` : succes (`build`, `typecheck:examples`, `package:hello-plugin`) ; archive hello-plugin creee. +- `npm run typecheck` dans `frontend` : succes. +- `npm test -- --run src/plugins/runtime/loader.test.ts src/features/plugins/PluginRuntimeProvider.test.tsx src/features/plugins/plugins.test.tsx` dans `frontend` : 3 fichiers, 33 tests passes, 0 echec. + +Reserves : +- Aucun test end-to-end avec chargement dans l'AppImage en cours d'execution ; les validations couvrent les frontieres store/catalogue/DTO/loader et le packaging SDK. +- Les avertissements Vite sur les options `esbuild` depreciees sont preexistants et non bloquants. +- Aucun commit, push, bump ou merge du submodule effectue dans ce lot. + +## 2026-09-08 - QA indépendante API `ctx.pluginRoot` + +Validation QA indépendante effectuée sur la branche parent `feature/285-plugin-root-runtime-api` et le submodule `sdk/IdeaSDK` également sur `feature/285-plugin-root-runtime-api`, sans commit ni action distante. + +Diffs relus/identifiés : +- Parent : `PluginPackageStore::installed_plugin_root`, implémentation FS canonique, propagation `PluginRuntimePlugin.plugin_root`, DTO backend `pluginRoot`, loader frontend `IdeaPluginContext.pluginRoot`, tests catalogue/DTO/loader. +- SDK : `ActivateContext.pluginRoot`, docs `activation-context`, `services`, `commands-and-feedback`, `manifest`, exemple hello-plugin et packaging du script `scripts/hello-task.mjs`. + +Commandes réelles QA : +- Parent : `git status --short --branch` ; `git diff --name-status` ; `git diff --stat` ; `git diff -- crates/domain/src/ports.rs crates/infrastructure/src/plugin/mod.rs crates/application/src/plugin/mod.rs crates/backend/src/dto.rs frontend/src/domain/index.ts frontend/src/plugins/runtime/loader.ts`. +- SDK : `git status --short --branch` ; `git diff --name-status` ; `git diff --stat` ; `git diff -- src/runtime.ts docs/activation-context.md docs/services.md docs/commands-and-feedback.md docs/manifest.md examples/hello-plugin/README.md examples/hello-plugin/src/core/workspace.ts scripts/package-hello-plugin.mjs`. +- Docs : `rg -n "does not expose|does not currently provide|no public runtime|there is no public runtime|Packaged scripts cannot be launched|unavailable to|package-path resolver" docs src examples scripts` dans le SDK. Aucun ancien énoncé contradictoire sur l'absence de `pluginRoot` runtime ; seul match restant : commentaire SDK générique indiquant que `services` n'expose pas les gateways internes IdeA. +- SDK occurrences : `rg -n "pluginRoot|installed plugin root|installed package|hello-task|package-relative|contributes\\.mcpServers" src docs examples scripts`. +- Parent occurrences : `rg -n "pluginRoot|plugin_root|installed_plugin_root|runtime_catalog|missing installed plugin root" crates frontend/src`. +- Script packagé : `sed -n '1,160p' examples/hello-plugin/scripts/hello-task.mjs`. +- Rust : `cargo check -p domain -p application -p infrastructure -p backend -p app-tauri --lib` vert ; `cargo test -p application runtime_catalog_ --lib` 5/5 vert ; `cargo test -p infrastructure --test plugin_install_load` 5/5 vert ; `cargo test -p app-tauri --test dto_plugins` 2/2 vert. +- Frontend : `npm run typecheck` dans `frontend` vert ; `npm test -- --run src/plugins/runtime/loader.test.ts src/features/plugins/PluginRuntimeProvider.test.tsx src/features/plugins/plugins.test.tsx` dans `frontend` 3 fichiers / 33 tests verts. +- SDK : `npm run check` dans `sdk/IdeaSDK` vert (`build`, `typecheck:examples`, `package:hello-plugin`) ; `unzip -l examples/hello-plugin/build/hello-plugin-0.1.0.zip | rg "idea-plugin.json|dist/index.js|scripts/hello-task.mjs|README.md"` confirme l'inclusion du script packagé. +- Hygiène : `cargo fmt --all -- --check` vert ; `git diff --check` parent vert ; `git diff --check` SDK vert. + +Verdict QA : VERT pour le périmètre source/test. Réserves : un rebuild AppImage puis une validation live sont nécessaires pour prouver l'usage réel de `ctx.pluginRoot` dans le binaire actuellement utilisé par l'application, car les tests exécutés valident les frontières source/store/catalogue/DTO/loader/SDK mais ne remplacent pas le binaire AppImage lancé. Le submodule reste dirty par ses modifications locales et le parent pointe vers ce submodule dirty ; aucun commit/bump/push/merge n'a été fait par QA. diff --git a/.ideai/tickets/285/issue.md b/.ideai/tickets/285/issue.md index 1c93381c..e237cfa8 100644 --- a/.ideai/tickets/285/issue.md +++ b/.ideai/tickets/285/issue.md @@ -1,17 +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" +title: "Ajouter pluginRoot officiel au SDK activate(ctx)" +status: "qa" +priority: "high" sprint: null links: [] -agentRefs: [] +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: 1788880495891 -updatedAt: 1788880858861 -version: 4 +updatedAt: 1788885132878 +version: 7 --- -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 +Demande utilisateur 2026-09-08 : UnityPlugin ne peut pas appeler proprement des scripts packagés depuis un handler TS car l’API SDK officielle n’expose pas le dossier installé du plugin depuis activate(ctx). Le ticket précédent documentait seulement l’absence d’API ; il faut maintenant implémenter l’API dans IdeaSDK/host, l’exposer au contexte activate(ctx), documenter son usage et ses limites, ajouter/adapter exemples et tests pertinents. \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index ece2ab1c..c3f2b0c0 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -3895,16 +3895,18 @@ { "issueRef": "#285", "path": "285", - "title": "Clarifier le chemin package/pluginRoot dans l'API SDK runtime", - "status": "closed", - "priority": "medium", + "title": "Ajouter pluginRoot officiel au SDK activate(ctx)", + "status": "qa", + "priority": "high", "sprint": null, - "assignedAgentIds": [], + "assignedAgentIds": [ + "ab328d90-c307-4771-a3b6-6c56089c8506" + ], "createdBy": { "kind": "agent", "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, - "updatedAt": 1788880858861 + "updatedAt": 1788885132878 } ] } \ No newline at end of file