diff --git a/.ideai/memory/MEMORY.md b/.ideai/memory/MEMORY.md index 025817f6..a2ce023e 100644 --- a/.ideai/memory/MEMORY.md +++ b/.ideai/memory/MEMORY.md @@ -84,3 +84,4 @@ - [opencode-streaming-progress-mcp-surfacing-157](opencode-streaming-progress-mcp-surfacing-157.md) — memory note opencode-streaming-progress-mcp-surfacing-157 - [toolchain-rust-partage-acces-agents](toolchain-rust-partage-acces-agents.md) — Diagnostic et solution durable pour l'accès partagé au toolchain Rust/Tauri dans les run-dirs agents isolés. - [web-ui-refactor-surface-addressable-architecture](web-ui-refactor-surface-addressable-architecture.md) — memory note web-ui-refactor-surface-addressable-architecture +- [plugin-hot-reload-agent-facing-delivered](plugin-hot-reload-agent-facing-delivered.md) — memory note plugin-hot-reload-agent-facing-delivered diff --git a/.ideai/memory/plugin-hot-reload-agent-facing-delivered.md b/.ideai/memory/plugin-hot-reload-agent-facing-delivered.md new file mode 100644 index 00000000..37db319c --- /dev/null +++ b/.ideai/memory/plugin-hot-reload-agent-facing-delivered.md @@ -0,0 +1,52 @@ +--- +name: plugin-hot-reload-agent-facing-delivered +description: memory note plugin-hot-reload-agent-facing-delivered +metadata: + type: project +--- +# Hot reload plugins agent-facing livre + +Le chantier #269 a livre le hot reload des plugins sans relancer IdeA, integre localement sur `develop` par le merge `ad2c6b4` (commit backend `805b1b4`). + +## Contrat livre + +- Nouveau use case backend `ReloadPlugin` pour recharger un plugin installe depuis une source directory. +- Nouveau tool agent-facing `idea_plugin_reload({ pluginId, expectedContentHash? })` expose cote MCP/OpenAI/direct selon les catalogues existants. +- Le tool est une `WriteAction` et reste refuse/masque par defaut tant que les permissions ne l'autorisent pas explicitement. +- Le chemin agent-facing ne prend pas de chemin arbitraire: la source relodable vient du registry du plugin installe. +- Le reload revalide manifest/id, recalcule le hash, met a jour le registry avec `restart_required=false`, publie un evenement `plugin_reloaded`, et lance la reconciliation des serveurs MCP de plugin. +- Le resultat structure fournit notamment `changed`, anciens/nouveaux hashes, statuts MCP et warnings/erreurs. + +## UX / Frontend + +Aucune nouvelle surface humaine dediee n'a ete livree en V1. Decision UX/DevFrontend: le besoin principal est agent-facing; le resultat structure du tool et le flux agent existant suffisent. + +Limite assumee: les contributions UI React des plugins (menus/layouts/commandes runtime frontend) restent chargees une fois par session par `PluginRuntimeProvider` et ne sont pas rafraichies apres `PluginReloaded` en V1. Cela n'affecte pas les tools MCP agent-facing. + +## QA + +QA #273 vert sur `feature/269-backend` avant merge: +- `cargo +stable test -p application plugin::tests -- --nocapture` => 32 passed. +- `cargo +stable test -p infrastructure --test mcp_server -- --nocapture` => 38 passed. +- `cargo +stable test -p backend openai_tools::tests -- --nocapture` => 10 passed. +- `cargo +stable test -p infrastructure --test plugin_install_load -- --nocapture` => 5 passed. +- `cargo +stable test -p infrastructure plugin -- --nocapture` => 10 passed. +- `cargo +stable test -p backend plugin_reloaded_relays_hashes_and_changed_flag_to_wire -- --nocapture` => 1 passed. +- `cargo +stable test -p app-tauri backend_core_builds_without_desktop_runtime -- --nocapture` => app-tauri compile OK. + +Risque restant: IdeA garantit que serveur/registry/prochains `tools/list` voient le nouvel etat. Certains providers/CLIs actifs peuvent garder leur propre cache de tools et devoir relister les tools ou reconnecter MCP en interne; pas de redemarrage IdeA requis par le contrat backend. + +## Note submodule test + +Dans les worktrees de feature, `git worktree add` n'initialise pas `sdk/IdeaSDK`. Pour les tests `plugin_install_load`, Git a utilise le submodule local du worktree principal: + +```bash +WT=; MOD=$(git -C $WT rev-parse --git-path modules/sdk/IdeaSDK) +rm -rf "$MOD" $WT/sdk/IdeaSDK +git -C $WT \ + -c submodule.sdk/IdeaSDK.url=/home/anthony/Documents/Projects/IdeA/sdk/IdeaSDK \ + -c protocol.file.allow=always \ + submodule update --init --recursive sdk/IdeaSDK +``` + +Aucun rebuild AppImage/live validation n'a ete fait dans ce cycle; creer un ticket dedie si validation live installee est demandee. \ No newline at end of file diff --git a/.ideai/system-permissions.json b/.ideai/system-permissions.json index bfd2f3da..380e48fb 100644 --- a/.ideai/system-permissions.json +++ b/.ideai/system-permissions.json @@ -2,5 +2,13 @@ "version": 1, "projectDefault": { "network": "allow" - } + }, + "agents": [ + { + "agentId": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d", + "permissions": { + "network": "allow" + } + } + ] } diff --git a/.ideai/tickets/267/carnet.md b/.ideai/tickets/267/carnet.md index 8a8d3c70..75294e17 100644 --- a/.ideai/tickets/267/carnet.md +++ b/.ideai/tickets/267/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#267" -version: 4 +version: 5 updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} -updatedAt: 1788797485001 +updatedAt: 1788797669968 --- # Ticket #267 - reprise orchestrée par Main diff --git a/.ideai/tickets/267/issue.md b/.ideai/tickets/267/issue.md index d69fcf73..286127f2 100644 --- a/.ideai/tickets/267/issue.md +++ b/.ideai/tickets/267/issue.md @@ -2,7 +2,7 @@ id: "e68681a5-2a9e-4742-912b-9c1d726ca789" number: 267 title: "Corriger permissions cross-project agents/templates et reconstruire l’AppImage" -status: "qa" +status: "closed" priority: "critical" sprint: null links: [{"target":"#260","kind":"relatesTo"},{"target":"#264","kind":"relatesTo"},{"target":"#265","kind":"relatesTo"}] @@ -11,7 +11,7 @@ attachments: [] createdBy: {"kind":"agent","agent_id":"fe887179-933f-47d4-960f-c3b06827f86c"} updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} createdAt: 1788795096659 -updatedAt: 1788797485001 -version: 4 +updatedAt: 1788797669968 +version: 5 --- Cycle complet demandé par l’utilisateur. Corriger : (1) exposer les tools MCP cross-project dans l’éditeur de permissions agent/projet et dans les templates ; (2) permettre d’autoriser précisément idea_project_list/read_context/list_agents/ask_agent/cancel_agent selon le catalogue canonique ; (3) persister et réafficher correctement defaultContactable dans TemplateEditor après save/reopen ; (4) conserver la permission agent Contactable depuis d’autres projets dans Permissions ; (5) tests frontend/backend/transport/persistance, QA complète ; (6) intégration Git puis nouvelle AppImage clairement publiée à la place de l’ancienne artefact visible. \ No newline at end of file diff --git a/.ideai/tickets/269/carnet.md b/.ideai/tickets/269/carnet.md new file mode 100644 index 00000000..9e0cfb2b --- /dev/null +++ b/.ideai/tickets/269/carnet.md @@ -0,0 +1,61 @@ +--- +issueRef: "#269" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788802262284 +--- +## Topologie git locale (décision Git, 2026-09-07) + +- **Base** : `develop` @ `8d2be75` (inclut le merge cross-project #260/#267 — fondation MCP inter-projets du chantier — + chore gitignore backups AppImage `.old-*`). +- **Branches chantier** (pattern #260) : + - `feature/269-backend` → worktree `.ideai/run/fe887179-933f-47d4-960f-c3b06827f86c/worktree` (DevBackend, ticket #271). + - `feature/269-frontend` → worktree `.ideai/run/8f7da528-58df-4315-97e9-0562230ecc19/worktree` (UX + DevFrontend, ticket #272). Si #272 reste agent-facing (doc only), branche supprimée sans merge. +- **QA (#273)** : pas de branche dédiée ; tests exécutés sur `feature/269-backend` puis sur develop après merge. +- **Worktree principal** : reste sur `develop`, contient l'état runtime `.ideai/` vivant (tickets 269-273 non trackés, permissions). Ne pas stash, ne pas switcher. +- **Branches #260** (`feature/260-backend/frontend/cross-project-agents`) : fusionnées dans develop, conservées comme historique (convention repo). Worktrees nettoyés/retargetés. +- **Aucun push** : develop reste en avance de 238+ commits sur origin ; rien ne sort sans validation utilisateur. +- **Fusion vers develop** : uniquement par Git, après QA verte, en merge commit référençant #269/#271/#272. + +### Garde-fous devs +- Travailler uniquement dans son worktree (checkout de sa branche déjà fait). Jamais de `git add -A` / `git add .` : `scripts/` et l'état `.ideai/` du worktree principal doivent rester hors commits de code. +- Commits convention `type(scope): ... — #27x`. Pas de push, pas de merge, pas de rebase : à Git. + +## Submodule sdk/IdeaSDK dans les worktrees (fix QA #273, 2026-09-07) + +`git worktree add` n'initialise pas les submodules, et `d1c3c00` (gitlink develop) n'existe que localement (jamais poussé) → `git submodule update --init` échoue sur gitea. Préparation appliquée par Git sur les DEUX worktrees (backend + frontend), sans rien toucher d'autre : + +```bash +WT= ; MOD=$(git -C $WT rev-parse --git-path modules/sdk/IdeaSDK) +rm -rf "$MOD" $WT/sdk/IdeaSDK # restes d'un clone échoué éventuels +git -C $WT \ + -c submodule.sdk/IdeaSDK.url=/home/anthony/Documents/Projects/IdeA/sdk/IdeaSDK \ + -c protocol.file.allow=always \ + submodule update --init --recursive sdk/IdeaSDK +``` + +- Origine du submodule dans chaque worktree = chemin local du submodule principal (offline-safe). Config partagée du repo NON modifiée (reste gitea). +- État vérifié : `git submodule status --recursive` → ` d1c3c00... sdk/IdeaSDK` propre sur les deux worktrees ; fixture `sdk/IdeaSDK/examples/hello-plugin` présente. +- Travail non commité DevBackend vérifié intact (13 fichiers modifiés + `mcp/plugins.rs` non suivi). +- Test QA relancé par Git dans le worktree backend : `cargo +stable test -p infrastructure --test plugin_install_load` → **5 passed / 0 failed** (dont les 2 `hello-plugin` rouges). QA peut reprendre l'exécution officielle. +- Racine du blocage cargo en env agent : `RUSTUP_HOME` isolé sans default → utiliser `cargo +stable` (ou configurer le default). + +## Cadrage produit/architecture initial (2026-09-07) + +Besoin livré par #269: permettre a un agent du projet A de demander a un projet/plugin B d'ajouter/modifier des tools, puis de recharger le plugin dans A sans relancer IdeA. + +Verdict Architect: faisable. Le backend relit deja registry/manifest a la demande et le protocole `idea-plugin:///current//...` evite le cache ESM si le hash change. Les blocages actuels sont le runtime plugin frontend charge une fois au mount et le catalogue MCP agent-facing statique. + +Limite a annoncer/tester: IdeA peut garantir que le serveur, le registry et les prochains `tools/list` voient le nouvel etat. Elle ne peut pas forcer tous les CLIs/providers actifs a refaire leur introspection interne instantanement; selon provider, le tool peut etre visible au tour suivant ou apres reconnexion MCP interne, sans redemarrage IdeA. + +Decision UX: pas de nouvelle surface humaine dediee en V1. Feedback dans la cellule/flux agent: reload en cours, succes, deja a jour, echec non bloquant avec anciens tools conserves. + +## Intégration locale (Git, 2026-09-07) + +- **Commit branche** : `805b1b4` sur `feature/269-backend` — 14 fichiers du chantier uniquement (add explicite, pas de `.ideai`, pas d'artefacts), 863 insertions / 32 suppressions, créé `crates/infrastructure/src/orchestrator/mcp/plugins.rs`. +- **Merge local** : `ad2c6b4` `merge(plugins)` `--no-ff` vers `develop` (réf. #269/#271/#272, QA verte #273). Aucune divergence pré-merge (base `8d2be75` = HEAD develop) → arbre develop == arbre branche, résultats QA transposables tels quels. +- **Frontend** : #272 clos sans code → worktree `8f7da528…/worktree` retiré (`--force`, requis car submodule), branche `feature/269-frontend` supprimée, `git worktree prune` fait. Résidus session (AGENTS.md, patch #210-212) laissés dans le run dir. +- **Backend** : worktree `fe887179…/worktree` conservé sur `feature/269-backend` (historique + session DevBackend), submodule local propre. +- **Worktree principal** : état runtime `.ideai` + `scripts/` préservés à l'identique pendant le merge. +- **Statuts** : #271 QA→closed par Git (v8). #269 parent laissé à Main (v4 au moment de l'intégration). +- **Rien poussé** : develop avance localement uniquement. +- Note : pas de rebuild AppImage dans ce cycle ; si validation live du hot reload est voulue, créer un ticket rebuild (comme #265 l'avait été pour #260). diff --git a/.ideai/tickets/269/issue.md b/.ideai/tickets/269/issue.md new file mode 100644 index 00000000..037e125f --- /dev/null +++ b/.ideai/tickets/269/issue.md @@ -0,0 +1,17 @@ +--- +id: "9386e2dc-5dd1-488c-afe6-0e99ad297a0b" +number: 269 +title: "Hot reload des plugins sans relancer IdeA pour les agents inter-projets" +status: "closed" +priority: "high" +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: 1788799296392 +updatedAt: 1788802262284 +version: 6 +--- +Besoin produit: un agent d'un projet A doit pouvoir demander a un projet/plugin B de creer ou modifier des tools, puis recharger le plugin concerne et utiliser les nouveaux tools sans redemarrer IdeA. Le chantier doit etablir ce qui est techniquement faisable, livrer le chemin minimal robuste et couvrir le flux inter-projets. Contraintes: architecture hexagonale, pas de relance IdeA, pas de push/publication sans validation utilisateur, compatibilite avec les outils MCP/skills existants et le contexte injecte aux agents actifs. \ No newline at end of file diff --git a/.ideai/tickets/270/carnet.md b/.ideai/tickets/270/carnet.md new file mode 100644 index 00000000..1648f2bb --- /dev/null +++ b/.ideai/tickets/270/carnet.md @@ -0,0 +1,33 @@ +--- +issueRef: "#270" +version: 4 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788799729583 +--- +## Verdict Architect (2026-09-07) + +Faisable sans relancer IdeA, avec un contrat a expliciter: IdeA garantit le refresh serveur/registry/MCP et les prochains `tools/list`; certains clients CLI actifs peuvent garder un cache interne de tools jusqu'au tour suivant ou une reconnexion MCP interne. + +Points de chargement actuels: +- Backend registry/package: `crates/infrastructure/src/plugin/mod.rs`, `FsPluginPackageStore`, `registry.json`, `bundle_url()` en `idea-plugin:///current//
`. +- Runtime catalog: `crates/application/src/plugin/mod.rs`, `ListPluginRuntimeContributions::execute()` relit le registry a chaque appel. +- MCP plugin servers: install/enable/uninstall/reconcile appellent deja `PluginMcpSupervisor::reconcile`. +- Frontend runtime: `frontend/src/features/plugins/PluginRuntimeProvider.tsx` liste une fois au mount. +- Frontend loader: `frontend/src/plugins/runtime/loader.ts` importe les bundles une fois dans un `PluginRuntimeRegistry` neuf. +- Tools IdeA agent-facing: `crates/infrastructure/src/orchestrator/mcp/tools.rs` et `crates/app-tauri/src/openai_tools.rs` sont statiques. + +Design retenu V1: +- Use case `ReloadPlugin`. +- Input `ReloadPluginInput { plugin_id, expected_content_hash?: Option }`. +- Output `PluginReloadResult { plugin, old_content_hash, new_content_hash, changed, runtime_catalog_entry?: PluginRuntimePlugin, mcp_statuses, warnings }`. +- Support initial: plugins installes depuis `PluginInstallSource::Directory`; pas de chemin arbitraire agent-facing. +- Refaire `install_from_directory`, valider manifest/id, recalculer hash, commit atomique, upsert registry avec `restart_required=false`, publier `PluginReloaded`, puis `reconcile(active_mcp_specs)`. +- Hash identique: `changed=false`, reconcile idempotent autorise. +- `expected_content_hash` mismatch: erreur `CONFLICT`. +- Archive sans chemin relodable: `UNSUPPORTED`/`INVALID` explicite. +- Commande agent-facing: `idea_plugin_reload({ pluginId, expectedContentHash? })`, `WriteAction`, permission refusee par defaut. + +Decoupage: +- #271 backend: use case, DTO Tauri, tool MCP, event domaine, reconcile, tests backend/MCP. +- #272 frontend: gateway reload + provider reload ciblé + feedback agent/cellule uniquement si necessaire. +- #273 QA: unitaires, integration MCP/tools, supervisor, frontend si #272, scenario inter-projets representatif. diff --git a/.ideai/tickets/270/issue.md b/.ideai/tickets/270/issue.md new file mode 100644 index 00000000..4207a43d --- /dev/null +++ b/.ideai/tickets/270/issue.md @@ -0,0 +1,17 @@ +--- +id: "3ae594f3-7bab-4931-b3ad-a684b7a5e03c" +number: 270 +title: "Cadrer l'architecture du hot reload plugin et des tools dynamiques" +status: "closed" +priority: "high" +sprint: null +links: [{"target":"#269","kind":"dependsOn"}] +agentRefs: [{"agentId":"b4730d7f-c54d-4736-8a04-c6203aa2fd49","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1788799296413 +updatedAt: 1788799729583 +version: 4 +--- +Analyser le systeme actuel de plugins/MCP/apps/skills et definir le contrat de hot reload: declencheur agent, port/use case, invalidation cache, redecouverte tools, scope projet/plugin, erreurs, concurrence, securite et limites. Produire un decoupage backend/frontend/QA exploitable. \ No newline at end of file diff --git a/.ideai/tickets/271/carnet.md b/.ideai/tickets/271/carnet.md new file mode 100644 index 00000000..d7cf446c --- /dev/null +++ b/.ideai/tickets/271/carnet.md @@ -0,0 +1,76 @@ +--- +issueRef: "#271" +version: 8 +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +updatedAt: 1788802202168 +--- +## Contrat d'implementation initial (Architect, 2026-09-07) + +Implementer le backend du hot reload plugin sans relance IdeA. + +Use case: `ReloadPlugin`. +Input: `ReloadPluginInput { plugin_id, expected_content_hash?: Option }`. +Output: `PluginReloadResult { plugin, old_content_hash, new_content_hash, changed, runtime_catalog_entry?: PluginRuntimePlugin, mcp_statuses, warnings }`. + +Perimetre V1: +- Supporter d'abord `PluginInstallSource::Directory`. +- Le tool agent-facing ne doit pas accepter de chemin arbitraire; le chemin relodable vient du registry installe. +- Refaire `install_from_directory`, valider manifest/id, recalcul hash, commit atomique, upsert registry `restart_required=false`. +- Publier `PluginReloaded { plugin_id, old_content_hash, new_content_hash, changed }`. +- Appeler `PluginMcpSupervisor::reconcile` apres reload. +- Hash identique => `changed=false`, reconcile idempotent. +- `expected_content_hash` mismatch => erreur `CONFLICT`. +- Source archive non relodable => erreur explicite `UNSUPPORTED` ou `INVALID`. + +Agent-facing: +- Ajouter `idea_plugin_reload({ pluginId, expectedContentHash? })`. +- Classer en `WriteAction`, permission refusee par defaut. +- Cabler aussi le schema OpenAI/direct si le catalogue tools est duplique dans `crates/app-tauri/src/openai_tools.rs`. + +Points code a inspecter: +- `crates/infrastructure/src/plugin/mod.rs` +- `crates/application/src/plugin/mod.rs` +- `crates/infrastructure/src/orchestrator/mcp/tools.rs` +- `crates/app-tauri/src/openai_tools.rs` + +Limite a preserver dans le resultat: IdeA garantit registry/serveur/prochains `tools/list`; certains providers peuvent cacher leur introspection interne jusqu'au tour suivant/reconnexion MCP interne. + +## Verification Main apres timeout DevBackend (2026-09-07) + +DevBackend a rendu un handoff: implementation partielle, non compilee/testee, non committee. + +Worktree `feature/269-backend` modifie: +- `crates/app-tauri/src/lib.rs` +- `crates/app-tauri/src/plugins.rs` +- `crates/application/src/lib.rs` +- `crates/application/src/plugin/mod.rs` +- `crates/backend/src/dto.rs` +- `crates/backend/src/events.rs` +- `crates/backend/src/lib.rs` +- `crates/backend/src/openai_tools.rs` +- `crates/domain/src/events.rs` +- `crates/infrastructure/src/orchestrator/mcp/mod.rs` +- `crates/infrastructure/src/orchestrator/mcp/server.rs` +- `crates/infrastructure/src/orchestrator/mcp/tools.rs` +- `crates/infrastructure/src/orchestrator/mcp/plugins.rs` (nouveau) + +Commandes Main: +- `cargo fmt --all -- --check` => KO, formatage requis dans `crates/app-tauri/src/plugins.rs`, `crates/application/src/lib.rs`, `crates/application/src/plugin/mod.rs`, `crates/backend/src/lib.rs`, `crates/infrastructure/src/orchestrator/mcp/mod.rs`, `crates/infrastructure/src/orchestrator/mcp/server.rs`. +- `cargo check --workspace` => KO. Erreurs principales: + - `crates/backend/src/lib.rs:107`: unresolved import `infrastructure::PluginToolProvider`; suggestion `infrastructure::orchestrator::mcp::PluginToolProvider`. + - `crates/backend/src/openai_tools.rs:18`: unresolved import `infrastructure::PluginToolProvider`. + - `crates/backend/src/lib.rs:166/168/174/183/185`: `infrastructure::PluginToolError` introuvable; importer/referrer `infrastructure::orchestrator::mcp::PluginToolError` ou re-exporter proprement. + +Retour DevBackend requis: corriger format + compile, ajouter/ajuster tests, executer les commandes pertinentes avant handoff. Pas de commit avant vert. + +## Verification Main apres second timeout DevBackend (2026-09-07) + +DevBackend a de nouveau timeout cote rendez-vous mais son workstate est `done` et le worktree a avance. + +Etat git: toujours non committe sur `feature/269-backend`; ajout de `crates/infrastructure/tests/mcp_server.rs` aux fichiers modifies. + +Commandes Main: +- `cargo fmt --all -- --check` => OK. +- `cargo check --workspace` => OK (`backend`, `web-server`, `app-tauri` check termines). + +Suite: passage QA #273 sur l'etat non committe de la branche backend. QA doit verifier les tests reels et remonter tout ecart avant commit. diff --git a/.ideai/tickets/271/issue.md b/.ideai/tickets/271/issue.md new file mode 100644 index 00000000..c9110bdd --- /dev/null +++ b/.ideai/tickets/271/issue.md @@ -0,0 +1,17 @@ +--- +id: "bb6cdd1b-f100-4c47-b48c-58e163110508" +number: 271 +title: "Expose agent-facing plugin reload command/tool" +status: "closed" +priority: "high" +sprint: null +links: [{"target":"#269","kind":"dependsOn"}] +agentRefs: [{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +createdAt: 1788799296464 +updatedAt: 1788802202168 +version: 8 +--- +Implementer le chemin backend permettant a un agent autorise de demander le reload d'un plugin installe/cache localement, puis de rendre les capabilities/tools rafraichies disponibles sans redemarrage d'IdeA. Le contrat final sera precise par Architect. \ No newline at end of file diff --git a/.ideai/tickets/272/carnet.md b/.ideai/tickets/272/carnet.md new file mode 100644 index 00000000..af8f6e93 --- /dev/null +++ b/.ideai/tickets/272/carnet.md @@ -0,0 +1,41 @@ +--- +issueRef: "#272" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788802083238 +--- +## Spec UX (2026-09-07) + +Decision: aucune nouvelle surface humaine dediee en V1. Le hot reload de plugin est un mecanisme agent-facing dans le flux inter-agent/projet; pas de page, panneau permanent ou modale de gestion plugins pour ce besoin. + +Emplacement minimal: cellule de l'agent du projet A, dans le flux d'activite/conversation; overlay/busy existant seulement si la recharge bloque temporairement l'usage des tools. + +Etats et libelles: +- Detection: `Nouveaux tools détectés pour le plugin {pluginName}.` +- En cours: `Rechargement du plugin {pluginName}...` avec spinner/progress indetermine discret. +- Succes: `Plugin {pluginName} rechargé. Nouveaux tools disponibles.` +- Aucun changement: `Plugin {pluginName} déjà à jour.` +- Echec: `Impossible de recharger le plugin {pluginName}. Les anciens tools restent disponibles.` Detail court possible: `Manifest invalide`, `Plugin introuvable`, `Erreur de chargement MCP`, `Permission refusée`. + +Regle de continuite: ne jamais ressembler a un redemarrage. Conserver conversation, contexte agent, cellule, historique et anciens tools si echec. + +Frontend attendu seulement si Architect/DevBackend exposent un event ou gateway utile: feedback dans surfaces existantes + eventuel refresh ciblé du runtime plugin; pas de nouvelle navigation. + +## Decision DevFrontend (2026-09-07) + +Aucun changement frontend requis pour la V1 de #272. + +Raison: +- `idea_plugin_reload` fonctionne dans le flux agent existant. +- La reconciliation MCP est terminee avant la reponse du tool. +- Le resultat structure fournit `changed`, hashes, statuts MCP et warnings/erreurs, suffisant comme feedback agent-facing. +- Aucune surface d'administration plugin n'est necessaire selon UX. + +Limite assumee: +- Les contributions UI React des plugins (menus, layouts, commandes runtime) restent chargees une fois par session par `PluginRuntimeProvider` et ne sont pas rafraichies apres `PluginReloaded` en V1. +- Cette limite n'affecte pas les tools MCP agent-facing; leur hot reload est gere cote backend. + +Fichiers touches: aucun. Commit: aucun. Branche `feature/269-frontend` propre. + +Tests DevFrontend: +- `npm test -- --run src/features/plugins/plugins.test.tsx src/plugins/runtime/loader.test.ts` => 31 tests reussis, 2 fichiers reussis. diff --git a/.ideai/tickets/272/issue.md b/.ideai/tickets/272/issue.md new file mode 100644 index 00000000..87294e28 --- /dev/null +++ b/.ideai/tickets/272/issue.md @@ -0,0 +1,17 @@ +--- +id: "a5e8fed5-a516-46a4-a2ae-c9901e08e650" +number: 272 +title: "Surface UX de reload plugin et feedback agent/utilisateur" +status: "closed" +priority: "medium" +sprint: null +links: [{"target":"#269","kind":"dependsOn"}] +agentRefs: [{"agentId":"757430bb-014a-40fa-b82b-f2429dab9766","role":"assigned"},{"agentId":"8f7da528-58df-4315-97e9-0562230ecc19","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1788799296491 +updatedAt: 1788802083238 +version: 6 +--- +Definir puis implementer uniquement les surfaces necessaires: etat reload en cours, resultat, erreur actionnable, eventuel bouton/commande cote UI si pertinent. Si le flux doit rester agent-facing uniquement, documenter l'absence de nouvelle surface humaine. \ No newline at end of file diff --git a/.ideai/tickets/273/carnet.md b/.ideai/tickets/273/carnet.md new file mode 100644 index 00000000..92d5ec0c --- /dev/null +++ b/.ideai/tickets/273/carnet.md @@ -0,0 +1,72 @@ +--- +issueRef: "#273" +version: 7 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788801870891 +--- +## Plan QA initial (Architect + UX, 2026-09-07) + +Backend/application: +- reload d'un plugin directory modifie => hash change et `restart_required=false`. +- manifest id mismatch => erreur. +- `expectedContentHash` mismatch => `CONFLICT`. +- source archive/non relodable => `UNSUPPORTED`/`INVALID` explicite. +- manifest invalide: etat/erreur robuste, anciens tools conserves. + +Infra/protocole: +- package commit atomique. +- ancien bundle URL hash rejete apres registry update; nouveau hash servi. +- `PluginMcpSupervisor::reconcile` stoppe les serveurs retires et demarre les nouveaux. + +MCP/tools: +- `tools/list` contient `idea_plugin_reload`. +- permission refusee par defaut. +- permission autorisee => retour JSON conforme. +- non-regression des tools IdeA existants. + +Frontend si #272 implemente: +- provider recharge un seul plugin, appelle `dispose`, remplace commands/layouts/tools, conserve les autres plugins. +- feedback cellule: en cours, succes, deja a jour, echec non bloquant. +- echec conserve les anciens tools. + +Scenario representatif: +- projet A demande a agent projet B/plugin de modifier un plugin directory. +- A appelle `idea_plugin_reload` sans redemarrer IdeA. +- A utilise le nouveau tool ou valide qu'un nouveau `tools/list` l'expose. Noter explicitement toute limite provider si un CLI actif garde un cache interne. + +## Premier verdict QA (2026-09-07) + +Verdict initial: ROUGE pour validation complète, mais les tests ciblés hot reload sont verts. Bloquant identifié: fixture SDK absente dans le worktree DevBackend, pas un défaut direct de `ReloadPlugin`. + +Preuves vertes QA: +- `cargo test -p application plugin::tests -- --nocapture` => 32 passed. +- `cargo test -p infrastructure --test mcp_server -- --nocapture` => 38 passed. +- `cargo test -p backend openai_tools::tests -- --nocapture` => 10 passed. +- `cargo test -p backend plugin_reloaded_relays_hashes_and_changed_flag_to_wire -- --nocapture` => 1 passed. +- `cargo test -p app-tauri backend_core_builds_without_desktop_runtime -- --nocapture` => compile app-tauri OK, tests filtres OK. + +KO initial: +- `cargo test -p infrastructure --test plugin_install_load -- --nocapture` => 3 passed, 2 failed, `No such file or directory` sur `sdk/IdeaSDK/examples/hello-plugin`. + +Diagnostic Main/Git: +- Worktree principal: submodule `sdk/IdeaSDK` initialise, fixture presente. +- Worktree backend: submodule non initialise (`-d1c3c00... sdk/IdeaSDK`). +- Git a initialise `sdk/IdeaSDK` dans les worktrees backend + frontend via source locale `/home/anthony/Documents/Projects/IdeA/sdk/IdeaSDK`, sans modifier les changements DevBackend, push, merge ou rebase. +- Git a relance `cargo +stable test -p infrastructure --test plugin_install_load` dans le worktree backend => 5 passed / 0 failed. + +## Verdict QA officiel (2026-09-07) + +VERT pour #273/#271 sur `feature/269-backend`. + +Commandes relancees: +- `cargo +stable test -p application plugin::tests -- --nocapture` => 32 passed. +- `cargo +stable test -p infrastructure --test mcp_server -- --nocapture` => 38 passed. +- `cargo +stable test -p backend openai_tools::tests -- --nocapture` => 10 passed. +- `cargo +stable test -p infrastructure --test plugin_install_load -- --nocapture` => 5 passed. +- `cargo +stable test -p infrastructure plugin -- --nocapture` => 10 passed. +- `cargo +stable test -p backend plugin_reloaded_relays_hashes_and_changed_flag_to_wire -- --nocapture` => 1 passed. +- `cargo +stable test -p app-tauri backend_core_builds_without_desktop_runtime -- --nocapture` => app-tauri compile OK, filtered binaries OK. + +Couverture validee: `ReloadPlugin`, hash changé/identique/conflit, source archive refusée, store plugin reel, confinement install archive/directory, MCP `tools/list`, permission write refusee par defaut et autorisee explicitement, routage OpenAI/MCP camelCase, evenement backend, non-regression tools MCP existants. + +Risque restant: la validation prouve exposition/routage cote serveur/provider. Elle ne prouve pas qu'un provider CLI actif invalide toujours son cache local de `tools/list`; selon provider, l'agent peut devoir relister les tools avant d'utiliser `idea_plugin_reload` ou un tool ajoute par le plugin recharge. diff --git a/.ideai/tickets/273/issue.md b/.ideai/tickets/273/issue.md new file mode 100644 index 00000000..ff485158 --- /dev/null +++ b/.ideai/tickets/273/issue.md @@ -0,0 +1,17 @@ +--- +id: "08564396-1229-4cf0-8a1d-b26957bbfd27" +number: 273 +title: "QA hot reload plugin sans relance IdeA" +status: "closed" +priority: "high" +sprint: null +links: [{"target":"#269","kind":"dependsOn"}] +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: 1788799296523 +updatedAt: 1788801870891 +version: 7 +--- +Ecrire et executer les tests pertinents pour valider le hot reload plugin: unitaires backend, integration MCP/tools, non-regression des outils existants, et scenario representatif ou un outil ajoute/modifie devient utilisable par un agent actif sans relancer IdeA. Inclure les commandes et sorties reelles. \ No newline at end of file diff --git a/.ideai/tickets/274/carnet.md b/.ideai/tickets/274/carnet.md new file mode 100644 index 00000000..1853ae34 --- /dev/null +++ b/.ideai/tickets/274/carnet.md @@ -0,0 +1,41 @@ +--- +issueRef: "#274" +version: 3 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788803503214 +--- +## Rebuild AppImage (2026-09-07) + +Skill utilise: `build-appimage`. + +Objectif: reconstruire l'AppImage apres merge local du chantier #269/#271 pour rendre le hot reload plugin disponible dans le binaire apres remplacement manuel. + +Commandes executees depuis `/home/anthony/Documents/Projects/IdeA`: + +```bash +npm --prefix frontend run build +``` + +Resultat: OK (`tsc --noEmit` + `vite build`). Warning Vite existant: chunk JS > 500 kB. + +Commande bundle depuis `crates/app-tauri/`: + +```bash +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 +``` + +Resultat: OK. Tauri a relance le beforeBuildCommand `npm --prefix ../frontend run build:bundle`, puis compile Rust release et bundle AppImage. + +Artefact produit: + +```text +/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage +``` + +Verification: +- taille: 114M +- permissions: executable `-rwxr-xr-x` +- sha256: `dca819a3419a70aea46c5f378d5e48a159fcbb940dbae0270c2d2b59f61c5716` + +Note: l'AppImage installee n'a pas ete remplacee et IdeA n'a pas ete relance, conformement au skill: cette etape tuerait la session active et doit etre faite manuellement ou apres validation explicite utilisateur. diff --git a/.ideai/tickets/274/issue.md b/.ideai/tickets/274/issue.md new file mode 100644 index 00000000..e4210ce2 --- /dev/null +++ b/.ideai/tickets/274/issue.md @@ -0,0 +1,17 @@ +--- +id: "9a3e30b9-28e0-406a-ba00-e49364396c18" +number: 274 +title: "Rebuild AppImage apres hot reload plugins #269" +status: "closed" +priority: "high" +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: 1788803310537 +updatedAt: 1788803503214 +version: 3 +--- +Reconstruire l'AppImage Linux apres merge local du chantier #269/#271 afin que le hot reload plugin agent-facing soit disponible dans le binaire installe apres remplacement manuel. Ne pas remplacer ni relancer IdeA automatiquement pendant la session active. \ No newline at end of file diff --git a/.ideai/tickets/275/carnet.md b/.ideai/tickets/275/carnet.md new file mode 100644 index 00000000..ef7fe540 --- /dev/null +++ b/.ideai/tickets/275/carnet.md @@ -0,0 +1,13 @@ +--- +issueRef: "#275" +version: 3 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788811630535 +--- +# Reprise + +Contexte projet global initialise le 2026-09-07 par Main via `idea_context_update`. + +Contenu ecrit : synthese d'orientation du projet IdeA, roles des agents, cycle de developpement, acquis fonctionnels, conventions stables, points d'attention et principales notes memoire a consulter. + +Verification : `idea_context_read` retourne maintenant le contexte Markdown complet avec la version `539321b724883fd49c1fed7ccfbd6a5380852bc3d8d5dc904939d66314e8eaa9`. \ No newline at end of file diff --git a/.ideai/tickets/275/issue.md b/.ideai/tickets/275/issue.md new file mode 100644 index 00000000..b63ec2e5 --- /dev/null +++ b/.ideai/tickets/275/issue.md @@ -0,0 +1,17 @@ +--- +id: "468121bd-cc48-412f-abcc-49291d1e110c" +number: 275 +title: "Mettre a jour le contexte projet global IdeA" +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: 1788811577381 +updatedAt: 1788811630535 +version: 3 +--- +Initialiser le contexte projet global visible dans Panneaux -> Context avec une synthese stable de l'etat actuel du projet, des regles de pilotage et des principaux chantiers livres/restants. \ No newline at end of file diff --git a/.ideai/tickets/276/carnet.md b/.ideai/tickets/276/carnet.md new file mode 100644 index 00000000..fe9963f0 --- /dev/null +++ b/.ideai/tickets/276/carnet.md @@ -0,0 +1,142 @@ +--- +issueRef: "#276" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1788814093598 +--- +## Décision Git — 2026-09-07 + +- Arbitrage acté : `isOrchestrator` conservé comme rôle single-writer du contexte global, distinct des permissions MCP ; à exposer/configurer par agent (contrats + implémentation + surface UX + tests). +- Branche locale de travail : `feature/276-orchestrator-context-writer`, créée depuis `develop` @ ad2c6b4 (pointe intégrée, QA #269/#273 verte). Aucune branche parallèle backend/frontend nécessaire — périmètre modéré, branche unique. +- Changements préexistants transportés sur la branche (non commités) : bookkeeping du store `.ideai/` (permissions, tickets, memory) — Git les traitera dans un chore séparé au moment du commit. +- Point d'attention signalé à Main : `.ideai/CONTEXT.md` (contexte global) est non suivi et non gitignoré — décider en cours de cycle s'il doit être versionné ou exclu. +- Consigne devs : travailler directement sur `feature/276-orchestrator-context-writer`, ne pas créer de branche, ne pas commiter (Git s'en charge), aucune action distante. + +## Handoff DevBackend — 2026-09-07 + +Implémentation backend présente dans le working tree : + +- use case `UpdateProjectOrchestrator` : vérifie que l'agent appartient au projet, persiste sa désignation dans le manifeste, reste idempotent si le writer est déjà effectif, puis publie `DomainEvent::OrchestratorChanged` après succès de persistance ; +- câblage dans `BackendCore` et commande Tauri `update_project_orchestrator` enregistrée ; +- DTO wire camelCase : requête `{ projectId, agentId }`, réponse `{ orchestratorAgentId }` ; +- préservation de la désignation explicite lors des mutations d'agent, skills et templates ; suppression du writer explicite avec succession automatique vers le plus ancien agent restant ; +- message de refus de `idea_context_update` enrichi avec le writer courant et l'orientation vers `idea_context_propose` ; catalogue MCP clarifié : les permissions MCP ne confèrent pas le rôle de writer ; +- tests ciblés ajoutés pour désignation, agent inconnu, préservation lors d'une mutation, suppression/succession, message de refus et désérialisation DTO. + +Fichiers volontairement modifiés : + +- `crates/application/src/agent/lifecycle.rs` +- `crates/application/src/agent/mod.rs` +- `crates/application/src/lib.rs` +- `crates/application/src/orchestrator/context_guard.rs` +- `crates/application/src/skill/usecases.rs` +- `crates/application/src/template/usecases.rs` +- `crates/application/tests/agent_lifecycle.rs` +- `crates/backend/src/dto.rs` +- `crates/backend/src/lib.rs` +- `crates/app-tauri/src/commands.rs` +- `crates/app-tauri/src/lib.rs` +- `crates/app-tauri/tests/dto_agents.rs` +- `crates/domain/src/fileguard.rs` +- `crates/infrastructure/src/orchestrator/mcp/tools.rs` + +Validation récupérable après timeout : `git diff --check` est vert. Aucun verdict Cargo complet n'est récupérable dans la session reprise ; ne pas considérer ce lot validé avant `cargo fmt --all --check`, les tests ciblés application/app-tauri/infrastructure, puis le check workspace par QA. + +Contrat frontend : invoquer `update_project_orchestrator` avec `{ projectId: string, agentId: string }`; succès `{ orchestratorAgentId: string }`. Rafraîchir la liste des agents pour lire les indicateurs `isOrchestrator` effectifs (radio/single-writer). + +## Handoff DevFrontend — 2026-09-07 + +Implémentation frontend livrée dans le working tree, sans commit ni action distante : + +- `Agent.isOrchestrator` ajouté au DTO frontend et `AgentGateway.updateProjectOrchestrator(projectId, agentId)` ajouté au port ; +- adapters Tauri et HTTP branchés sur `update_project_orchestrator` avec le payload `{ request: { projectId, agentId } }` et la réponse `{ orchestratorAgentId }` ; mock gateway aligné sur l'exclusivité single-writer ; +- `useAgents.updateProjectOrchestrator` appelle le backend, rafraîchit ensuite `listAgents` et expose les erreurs via l'alerte existante ; +- dans la ligne sélectionnée de la fiche agent, section `Rôle dans le projet` avant les autres contrôles, radio `Writer du contexte projet global` et aide UX littérale ; +- badge sobre `Writer contexte` dans l'identité de l'agent effectif ; +- confirmation avant transfert lorsque la liste expose déjà un autre writer, avec noms de l'ancien et du nouveau writer ; +- aucun changement au panneau ni aux checkboxes de permissions MCP. + +Fichiers frontend modifiés : + +- `frontend/src/domain/index.ts` +- `frontend/src/ports/index.ts` +- `frontend/src/adapters/agent.ts` +- `frontend/src/adapters/http/streamGateways.ts` +- `frontend/src/adapters/mock/index.ts` +- `frontend/src/features/agents/useAgents.ts` +- `frontend/src/features/agents/AgentsPanel.tsx` +- `frontend/src/adapters/agent.test.ts` +- `frontend/src/adapters/http/agentGateway.test.ts` +- `frontend/src/features/agents/agents.test.tsx` + +Validation exécutée : + +- `cd frontend && npm test -- --run src/features/agents/agents.test.tsx src/adapters/agent.test.ts src/adapters/http/agentGateway.test.ts` — vert, 3 fichiers / 69 tests ; avertissement jsdom connu sur `HTMLCanvasElement.getContext`, sans échec. +- `cd frontend && npm run typecheck` — vert. +- `git diff --check` — vert. + +Verdict DevFrontend : lot #276 implémenté et prêt pour validation QA. Aucun ajustement backend effectué. + +## Verdict QA — 2026-09-07 + +Verdict QA officiel : VERT sur `feature/276-orchestrator-context-writer` @ `ad2c6b4`. + +Inspection rapide : les diffs pertinents correspondent au périmètre annoncé : rôle `isOrchestrator` conservé comme writer single-writer distinct des permissions MCP, use case/commande/DTO/adapters ajoutés, garde `idea_context_update` clarifiée, UI agent avec section rôle/radio/badge/confirmation. + +Commandes exécutées et résultats : + +```bash +git -C /home/anthony/Documents/Projects/IdeA status --short --branch +# ## feature/276-orchestrator-context-writer +# worktree sale attendu : changements feature + bookkeeping .ideai/ non suivis/modifiés + +git -C /home/anthony/Documents/Projects/IdeA rev-parse --short HEAD +# ad2c6b4 + +git -C /home/anthony/Documents/Projects/IdeA diff --check +# exit 0 + +cargo fmt --all --check +# exit 0 + +cargo test -p application --test agent_lifecycle orchestrator -- --nocapture +# 5 passed; 0 failed; 106 filtered out + +cargo test -p application context_update -- --nocapture +# 1 passed; 0 failed; 165 filtered out + +cargo test -p application --test skill_usecases -- --nocapture +# 9 passed; 0 failed + +cargo test -p application --test template_usecases -- --nocapture +# 11 passed; 0 failed + +cargo test -p app-tauri update_project_orchestrator -- --nocapture +# 1 passed; 0 failed; autres cibles filtrées + +cargo test -p app-tauri --test dto_agents orchestrator -- --nocapture +# 1 passed; 0 failed; 29 filtered out + +cargo test -p infrastructure tools -- --nocapture +# lib: 28 passed; 0 failed; mcp_server: 10 passed; 0 failed; autres cibles filtrées + +cargo test -p infrastructure --test context_store orchestrator -- --nocapture +# 2 passed; 0 failed; 5 filtered out + +cargo check -p backend -p app-tauri +# Finished dev profile successfully + +cargo test -p backend --lib -- --nocapture +# 83 passed; 0 failed; 7 ignored + +cd frontend && npm test -- --run src/features/agents/agents.test.tsx src/adapters/agent.test.ts src/adapters/http/agentGateway.test.ts +# Test Files 3 passed; Tests 69 passed +# Avertissement connu jsdom: HTMLCanvasElement.getContext non implémenté, sans échec + +cd frontend && npm run typecheck +# tsc --noEmit OK +``` + +Commandes de ciblage non comptées comme validation : un essai `cargo test -p application --test orchestrator_context_guard ...` a échoué car cette cible n'existe pas ; un filtre `cargo test -p infrastructure --test mcp_server context_update ...` a sélectionné 0 test. Les validations utiles ci-dessus remplacent ces filtres. + +Risques résiduels : pas de test manuel AppImage/runtime desktop exécuté ; validation limitée aux tests ciblés backend/frontend et au check de compilation. Les fichiers `.ideai/` et `scripts/` non suivis/modifiés restent à arbitrer par Git comme prévu dans le carnet. \ No newline at end of file diff --git a/.ideai/tickets/276/issue.md b/.ideai/tickets/276/issue.md new file mode 100644 index 00000000..e697d05b --- /dev/null +++ b/.ideai/tickets/276/issue.md @@ -0,0 +1,17 @@ +--- +id: "4c4ba97b-d56f-48f0-880b-602a9dfd0ea4" +number: 276 +title: "Clarifier et exposer le writer du contexte projet global" +status: "qa" +priority: "high" +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: 1788812362189 +updatedAt: 1788814093598 +version: 6 +--- +Le tool `idea_context_update` refuse l'ecriture du contexte projet global si l'agent n'est pas marque `isOrchestrator`, alors que l'utilisateur s'attend a piloter les droits via le menu Permissions. Arbitrer le modele juste pour IdeA : supprimer ce garde-fou si les permissions suffisent, ou conserver un writer/orchestrateur explicite et configurable par agent dans l'UI. Mettre a jour les contrats, l'implementation, la surface UX et les tests. \ No newline at end of file diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index c771f694..0ef9f353 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 269 + "nextNumber": 277 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index daf34a8f..88e0654b 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -3623,7 +3623,7 @@ "issueRef": "#267", "path": "267", "title": "Corriger permissions cross-project agents/templates et reconstruire l’AppImage", - "status": "qa", + "status": "closed", "priority": "critical", "sprint": null, "assignedAgentIds": [ @@ -3637,7 +3637,7 @@ "kind": "agent", "agent_id": "fe887179-933f-47d4-960f-c3b06827f86c" }, - "updatedAt": 1788797485001 + "updatedAt": 1788797669968 }, { "issueRef": "#268", @@ -3652,6 +3652,127 @@ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, "updatedAt": 1788796144919 + }, + { + "issueRef": "#269", + "path": "269", + "title": "Hot reload des plugins sans relancer IdeA pour les agents inter-projets", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788802262284 + }, + { + "issueRef": "#270", + "path": "270", + "title": "Cadrer l'architecture du hot reload plugin et des tools dynamiques", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "b4730d7f-c54d-4736-8a04-c6203aa2fd49" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788799729583 + }, + { + "issueRef": "#271", + "path": "271", + "title": "Expose agent-facing plugin reload command/tool", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "fe887179-933f-47d4-960f-c3b06827f86c" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788802202168 + }, + { + "issueRef": "#272", + "path": "272", + "title": "Surface UX de reload plugin et feedback agent/utilisateur", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "757430bb-014a-40fa-b82b-f2429dab9766", + "8f7da528-58df-4315-97e9-0562230ecc19" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788802083238 + }, + { + "issueRef": "#273", + "path": "273", + "title": "QA hot reload plugin sans relance IdeA", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "ab328d90-c307-4771-a3b6-6c56089c8506" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788801870891 + }, + { + "issueRef": "#274", + "path": "274", + "title": "Rebuild AppImage apres hot reload plugins #269", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788803503214 + }, + { + "issueRef": "#275", + "path": "275", + "title": "Mettre a jour le contexte projet global IdeA", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788811630535 + }, + { + "issueRef": "#276", + "path": "276", + "title": "Clarifier et exposer le writer du contexte projet global", + "status": "qa", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1788814093598 } ] } \ No newline at end of file