chore(tickets): sync store local — #295 passage qa après QA verte (carnet complet cause/fix/validations post-restart transcript, capture utilisateur UnitySoundTool attachée; index/counter) + rattrapage store #293/#294 clos (carnets docs SDK contrat MCP plugins et lancement serveurs Node; bumps pointeur IdeaSDK déjà mergés sur develop via 1935e98/b1c173f); scripts/ hors périmètre; aucun push

This commit is contained in:
2026-09-09 18:44:08 +02:00
parent 1b1476de52
commit 8482fc5bd2
10 changed files with 465 additions and 1 deletions

View File

@ -0,0 +1,13 @@
{
"id": "16cf2489-b2c1-4038-8f2f-4d5011775430",
"projectId": "97b49ac2-8376-4aa3-8ea9-bf3ac81d0023",
"agentId": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d",
"sessionId": "7293ea58-3ce4-4280-a6b7-ddaa2f78aaa1",
"filename": "clipboard-image-1788969852787.png",
"mime": "image/png",
"sizeBytes": 28204,
"sourceKind": "clipboard",
"storagePath": "agent-chat/7293ea58-3ce4-4280-a6b7-ddaa2f78aaa1/16cf2489-b2c1-4038-8f2f-4d5011775430-clipboard-image-1788969852787.png",
"readablePath": "/home/anthony/Documents/Projects/IdeA/.ideai/attachments/agent-chat/7293ea58-3ce4-4280-a6b7-ddaa2f78aaa1/16cf2489-b2c1-4038-8f2f-4d5011775430-clipboard-image-1788969852787.png",
"createdAt": 1788969926078
}

View File

@ -0,0 +1,90 @@
---
issueRef: "#293"
version: 4
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedAt: 1788962603796
---
## QA - 2026-09-09 - Validation doc-only SDK
Périmètre vérifié dans le submodule `sdk/IdeaSDK`, branche `feature/293-mcp-tools-exposure-docs`.
Diff relu : modifications limitées à `docs/activation-context.md`, `docs/manifest.md` et `docs/project-plugin-assignments.md`.
Commandes exécutées :
```bash
git status --short --branch
```
Sortie :
```text
## feature/293-mcp-tools-exposure-docs
M docs/activation-context.md
M docs/manifest.md
M docs/project-plugin-assignments.md
```
```bash
git diff --stat
```
Sortie :
```text
docs/activation-context.md | 11 ++++++++
docs/manifest.md | 58 ++++++++++++++++++++++++++++++++++++++
docs/project-plugin-assignments.md | 13 +++++++++
3 files changed, 82 insertions(+)
```
```bash
npm run check
```
Sortie essentielle :
```text
> @idea/plugin-sdk@0.1.0 check
> npm run build && npm run typecheck:examples && npm run package:hello-plugin
> @idea/plugin-sdk@0.1.0 build
> tsc -p tsconfig.json
> @idea/plugin-sdk@0.1.0 typecheck:examples
> tsc -p examples/hello-plugin/tsconfig.json --noEmit
> @idea/plugin-sdk@0.1.0 package:hello-plugin
> npm run build && npm run build:hello-plugin && node scripts/package-hello-plugin.mjs
> @idea/plugin-sdk@0.1.0 build
> tsc -p tsconfig.json
> @idea/plugin-sdk@0.1.0 build:hello-plugin
> tsc -p examples/hello-plugin/tsconfig.build.json
created /home/anthony/Documents/Projects/IdeA/sdk/IdeaSDK/examples/hello-plugin/build/hello-plugin-0.1.0.zip
```
Lecture QA : la documentation clarifie bien que les tools agent MCP viennent de `contributes.mcpServers` via serveurs MCP stdio et `tools/list`, pas d'une API `activate(ctx)` ; elle couvre `ctx.pluginRoot`, `autoStart: true`, le triplet `pluginId`/`serverId`/`toolName`, et la recommandation skill -> MCP tool pour les scripts packagés.
Verdict QA : VERT.
## Git - 2026-09-09 - Intégration locale
Git a intégré la branche dédiée du submodule SDK :
- Submodule `sdk/IdeaSDK`: `develop` pointe sur `68fd612` (`merge(sdk): intègre feature/293-mcp-tools-exposure-docs`).
- Commit de feature SDK: `42567a5` (`docs(sdk): contrat d'exposition des tools MCP par les plugins`).
- Repo parent IdeA: `develop` pointe sur `1935e98` (`chore(sdk): pointe le submodule sur develop`).
Aucune action distante effectuée. État parent restant hors périmètre : fichiers tickets locaux et répertoire `scripts/` déjà visibles/non liés à la doc SDK.
## Réponse contractuelle pour UnityPlugin #11
1. Contrat manifest/runtime : exposer un serveur MCP stdio dans `idea-plugin.json` sous `contributes.mcpServers` avec `id`, `displayName`, `command`, `transport: "stdio"`, idéalement `autoStart: true`; l'agent reçoit les tools via assignation `pluginId`/`serverId`/`toolName` après activation projet et relance agent.
2. Pas de support SDK actuel pour enregistrer des tools MCP directement depuis `activate(ctx)`; seuls les serveurs MCP déclarés/externes sont le contrat agent-callable.
3. `ctx.pluginRoot` est l'API officielle pour résoudre la racine du package installé depuis le runtime. `import.meta.url` peut servir à de la résolution module JS, mais n'est pas le contrat host/plugin. Pour `contributes.mcpServers`, `${pluginRoot}` et `${appDataDir}` sont substitués au démarrage du serveur.
4. Recommandation court terme UnityPlugin : packager un serveur MCP stdio Node/script dans le plugin, le déclarer via `contributes.mcpServers`, assigner les tools aux agents, et modifier les skills pour demander l'appel des tools plutôt que référencer `../../scripts/...` depuis le Markdown.
5. Documentation SDK enrichie dans `manifest.md`, `activation-context.md`, `project-plugin-assignments.md`.

View File

@ -0,0 +1,17 @@
---
id: "79792d0c-92a2-499d-8dc3-7b0e65d38dcc"
number: 293
title: "Clarifier et documenter l’exposition de tools MCP par les plugins IdeA"
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: 1788962113957
updatedAt: 1788962603796
version: 4
---
Demande entrante depuis Main du projet UnityPlugin, ticket #11. Clarifier le contrat SDK/manifest/runtime pour exposer des tools MCP depuis un plugin IdeA, vérifier si le SDK supporte les tools fournis directement par le runtime ou seulement des MCP servers déclarés/externes, préciser la résolution du répertoire d’installation plugin, et enrichir IdeaSDK/docs si le point est absent ou ambigu.

View File

@ -0,0 +1,112 @@
---
issueRef: "#294"
version: 4
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedAt: 1788963918771
---
## QA - 2026-09-09 - Validation doc-only SDK
Périmètre vérifié dans le submodule `sdk/IdeaSDK`, branche `feature/294-node-mcp-launch-docs`.
Diff relu : modifications limitées à `docs/manifest.md`, `docs/services.md` et `docs/packaging-distribution.md`.
Commandes exécutées :
```bash
git status --short --branch
```
Sortie :
```text
## feature/294-node-mcp-launch-docs
M docs/manifest.md
M docs/packaging-distribution.md
M docs/services.md
```
```bash
git diff --stat
```
Sortie :
```text
docs/manifest.md | 56 ++++++++++++++++++++++++++++++++++++------
docs/packaging-distribution.md | 19 ++++++++++++++
docs/services.md | 9 ++++++-
3 files changed, 76 insertions(+), 8 deletions(-)
```
```bash
rg -n "\\$\\{node\\}|\\$\\{runtimeNode\\}|\\$\\{hostNode\\}|runtime Node|plugin-scoped Node|command: \\\"node\\\"|allowAbsoluteCommand|shell|package-relative|runCommand\\(\\)|\\$\\{pluginRoot\\}|\\$\\{appDataDir\\}" docs/manifest.md docs/services.md docs/packaging-distribution.md
```
Sortie essentielle :
```text
docs/packaging-distribution.md:49:starting the declared `command` directly. IdeA does not inject a shell and does
docs/packaging-distribution.md:50:not provide a plugin-scoped Node.js runtime.
docs/packaging-distribution.md:52:For a packaged MCP server, prefer a package-relative executable such as
docs/packaging-distribution.md:61:or declare an explicit absolute host dependency with `allowAbsoluteCommand:
docs/packaging-distribution.md:62:true`. Avoid relying on a bare `command: "node"` in distributed or multi-harness
docs/services.md:45:as read-only. Unlike manifest-declared MCP servers, `runCommand()` does not
docs/services.md:54: command: "node",
docs/services.md:63:[Manifest](manifest.md), where a bare `command: "node"` is package-relative
docs/manifest.md:313:and no `runtime` field. IdeA does not provide a plugin-scoped Node.js runtime
docs/manifest.md:321:`command` is not shell syntax. IdeA starts it directly and passes `args`
docs/manifest.md:351:Avoid `command: "node"` for a packaged MCP server. With
docs/manifest.md:352:`allowAbsoluteCommand: false`, it is treated as package-relative and resolves to
docs/manifest.md:353:`${pluginRoot}/node`. With `allowAbsoluteCommand: true`, it is passed as a host
```
```bash
npm run check
```
Sortie essentielle :
```text
> @idea/plugin-sdk@0.1.0 check
> npm run build && npm run typecheck:examples && npm run package:hello-plugin
> @idea/plugin-sdk@0.1.0 build
> tsc -p tsconfig.json
> @idea/plugin-sdk@0.1.0 typecheck:examples
> tsc -p examples/hello-plugin/tsconfig.json --noEmit
> @idea/plugin-sdk@0.1.0 package:hello-plugin
> npm run build && npm run build:hello-plugin && node scripts/package-hello-plugin.mjs
> @idea/plugin-sdk@0.1.0 build
> tsc -p tsconfig.json
> @idea/plugin-sdk@0.1.0 build:hello-plugin
> tsc -p examples/hello-plugin/tsconfig.build.json
created /home/anthony/Documents/Projects/IdeA/sdk/IdeaSDK/examples/hello-plugin/build/hello-plugin-0.1.0.zip
```
Lecture QA : la documentation clarifie bien qu'il n'existe pas de substitution `${node}`, `${runtimeNode}`, `${hostNode}` ni de runtime Node plugin fourni par IdeA ; qu'un `command` MCP est lancé directement sans shell ; qu'un `command` relatif est résolu sous `${pluginRoot}` ; que `command: "node"` devient `${pluginRoot}/node` avec `allowAbsoluteCommand: false` ; qu'une dépendance host absolue requiert `allowAbsoluteCommand: true` ; et que les serveurs JS reproductibles doivent vendor/installer un runtime ou déclarer explicitement une dépendance absolue.
Verdict QA : VERT.
## Git - 2026-09-09 - Intégration locale
Cycle Git terminé, sans push.
- SDK submodule `sdk/IdeaSDK` : commit feature `b5a3556` (`docs(sdk): clarifie le lancement Node des serveurs MCP plugins`) puis merge local `fdb3a90` sur `develop`.
- Repo parent IdeA : commit `b1c173f` sur `develop` (`chore(sdk): bump du pointeur IdeaSDK pour #294`).
- Vérification reconfirmée par Git : `npm run check` vert.
Réserves : le submodule SDK est en avance sur origin avec les travaux #293/#294, et le parent `develop` est en avance localement. Aucune action distante effectuée. Fichiers `.ideai/tickets/*` et `scripts/` hors périmètre laissés tels quels.
## Réponse contractuelle pour UnityPlugin #12
1. Pour un serveur MCP stdio JavaScript packagé, le contrat actuel est de lancer un `command` manifest direct, sans shell. Pour ne pas dépendre du PATH shell utilisateur, il faut pointer `command` vers un exécutable reproductible : package-relative sous `${pluginRoot}` ou géré sous `${appDataDir}`. Un `.mjs` avec shebang `#!/usr/bin/env node` reste dépendant du Node visible par le process IdeA, pas du shell interactif.
2. Il n'existe pas de substitution officielle `${node}`, `${runtimeNode}`, `${hostNode}` ni de champ `runtime`. IdeA ne fournit pas actuellement de runtime Node plugin-scoped.
3. `allowAbsoluteCommand: false` rejette les commandes absolues littérales dans le manifest, mais n'interdit pas un `command` qui devient absolu après substitution `${pluginRoot}`/`${appDataDir}`. `command: "bash"` est relatif et devient `${pluginRoot}/bash`; `/bin/bash` exige `allowAbsoluteCommand: true`. Préférer `command: "scripts/wrapper"` pour un wrapper packagé exécutable.
4. Solution compatible aujourd'hui : packager un exécutable MCP autonome ou installer/vendor un runtime sous le package/appData et pointer dessus. À défaut, déclarer explicitement une dépendance host absolue (`/usr/bin/node` ou `/bin/bash`) avec `allowAbsoluteCommand: true`. Un wrapper de résolution Node peut améliorer le diagnostic, mais ne supprime pas la dépendance si aucun runtime n'est fourni.
5. Documentation SDK enrichie dans `docs/manifest.md`, `docs/services.md`, `docs/packaging-distribution.md`.

View File

@ -0,0 +1,17 @@
---
id: "5ec58e6e-29f1-4f22-95bd-c5e24da5bbc3"
number: 294
title: "Clarifier le lancement de serveurs MCP JavaScript packagés par les plugins IdeA"
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: 1788963442298
updatedAt: 1788963918771
version: 4
---
Demande entrante depuis Main UnityPlugin, ticket #12. Après fix #11, le plugin com.idea.unity-developer-tools recharge avec changed=true/restartRequired=false mais le serveur MCP déclaré command:"node" échoue ENOENT. Clarifier le contrat de lancement Node/runtime pour contributes.mcpServers, l'existence ou non d'une substitution ${node}/${runtimeNode}, l'effet de allowAbsoluteCommand, et documenter la solution compatible directory plugin/multi-harness.

View File

@ -0,0 +1,156 @@
---
issueRef: "#295"
version: 2
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedAt: 1788971880464
---
## QA - 2026-09-09 - Validation post-restart chat transcript
Branche vérifiée : `fix/295-custom-chat-transcript-after-restart`.
Diff relu sur les zones déclarées :
- `crates/app-tauri/src/chat.rs`, `crates/app-tauri/src/commands.rs`
- `crates/app-tauri/tests/chat_bridge.rs`, `crates/app-tauri/tests/dto_chat.rs`
- `crates/backend/src/dto.rs`, `crates/backend/src/stream.rs`
- `crates/web-server/src/lib.rs`
- `frontend/src/adapters/agent.ts`, `frontend/src/adapters/http/*`, `frontend/src/ports/index.ts`
- `frontend/src/features/agents/CustomAgentChatView.tsx`, `CustomAgentChatView.test.tsx`
Lecture QA : le fix couvre bien le contrat attendu. Côté Tauri, `ChatBridge` conserve/rekey scrollback, sink et propriétaire stable, et `reattach_agent_chat` peut récupérer une session vivante par `projectId`/`agentId` en renvoyant `sessionId` effectif et `conversationId`. Côté backend partagé, le DTO expose l'id effectif et `ReplayOutputBridge::rekey` préserve le flux logique. Côté web-server, `chat.attach` accepte le fallback stable et enregistre le sink sous le nouveau `sessionId`. Côté frontend, la vue réconcilie `agentRestartCompleted`, retente un stale `NOT_FOUND` avec identité stable, applique le scrollback, met à jour les ids effectifs et évite l'écran vide quand une conversation/run/workstate lié existe.
Commandes exécutées :
```bash
git status --short --branch
```
Sortie essentielle :
```text
## fix/295-custom-chat-transcript-after-restart
M crates/app-tauri/src/chat.rs
M crates/app-tauri/src/commands.rs
M crates/app-tauri/tests/chat_bridge.rs
M crates/app-tauri/tests/dto_chat.rs
M crates/backend/src/dto.rs
M crates/backend/src/stream.rs
M crates/web-server/src/lib.rs
M frontend/src/adapters/agent.ts
M frontend/src/adapters/http/agentGateway.test.ts
M frontend/src/adapters/http/frames.ts
M frontend/src/adapters/http/streamGateways.ts
M frontend/src/features/agents/CustomAgentChatView.test.tsx
M frontend/src/features/agents/CustomAgentChatView.tsx
M frontend/src/ports/index.ts
```
```bash
git diff --check
```
Sortie : aucune.
```bash
cargo fmt --all --check
```
Sortie : aucune.
```bash
cargo test -p app-tauri --test chat_bridge --test dto_chat
```
Sortie essentielle :
```text
Running tests/chat_bridge.rs
running 34 tests
...
test result: ok. 34 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running tests/dto_chat.rs
running 24 tests
...
test result: ok. 24 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
```
```bash
cargo check -p app-tauri
```
Sortie essentielle :
```text
Finished `dev` profile [unoptimized + debuginfo] target(s) in 11.14s
```
```bash
cargo test -p backend && cargo check -p backend
```
Sortie essentielle :
```text
Running unittests src/lib.rs
running 98 tests
...
test result: ok. 91 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out
Doc-tests backend
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.13s
```
Note : les 7 tests backend ignorés sont déclarés `ignored` car ils requièrent une permission de bind socket local ; ce n'est pas un échec et ce n'est pas bloquant pour #295.
```bash
cargo test -p web-server websocket_chat_attach && cargo check -p web-server
```
Sortie essentielle :
```text
running 3 tests
test tests::websocket_chat_attach_emits_chat_attached_and_registers_sink ... ok
test tests::websocket_chat_attach_recovers_stale_session_from_live_project_agent ... ok
test tests::websocket_chat_attach_stale_session_without_fallback_stays_not_found ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 109 filtered out
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.13s
```
```bash
npm test -- CustomAgentChatView.test.tsx agentGateway.test.ts
```
Sortie essentielle :
```text
Test Files 2 passed (2)
Tests 77 passed (77)
```
Note : Vite a émis deux warnings de dépréciation de configuration `esbuild`/`oxc`; non bloquant pour #295.
```bash
npm run build
```
Sortie essentielle :
```text
> idea-frontend@0.3.0 build
> tsc --noEmit && vite build
✓ 515 modules transformed.
✓ built in 2.61s
```
Note : Vite signale un chunk minifié > 500 kB ; avertissement existant/non bloquant pour #295.
Verdict QA : VERT.

View File

@ -0,0 +1,17 @@
---
id: "bc0fe5e4-8398-4c47-aeca-2c2e93a0d1d3"
number: 295
title: "Corriger l’affichage du transcript après redémarrage automatique d’un agent"
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: 1788969948217
updatedAt: 1788971880464
version: 2
---
Bug utilisateur observé sur UnitySoundTool: après redémarrage automatique de l'agent Main, l'agent continue réellement à travailler et les workstates changent, mais aucun message ne s'affiche après le message indiquant que l'agent a bien redémarré. Après changement de projet puis retour, l'affichage se nettoie et ne montre plus que des bandeaux/progress d'agents sollicités par Main en haut de la cellule. Contexte: le redémarrage est survenu après appel à Main UnityPlugin pour recharger un plugin modifié. Capture jointe dans la conversation utilisateur.

View File

@ -1,3 +1,3 @@
{
"nextNumber": 293
"nextNumber": 296
}

View File

@ -4009,6 +4009,48 @@
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
"updatedAt": 1788956518862
},
{
"issueRef": "#293",
"path": "293",
"title": "Clarifier et documenter l’exposition de tools MCP par les plugins IdeA",
"status": "closed",
"priority": "high",
"sprint": null,
"assignedAgentIds": [],
"createdBy": {
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
"updatedAt": 1788962603796
},
{
"issueRef": "#294",
"path": "294",
"title": "Clarifier le lancement de serveurs MCP JavaScript packagés par les plugins IdeA",
"status": "closed",
"priority": "high",
"sprint": null,
"assignedAgentIds": [],
"createdBy": {
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
"updatedAt": 1788963918771
},
{
"issueRef": "#295",
"path": "295",
"title": "Corriger l’affichage du transcript après redémarrage automatique d’un agent",
"status": "qa",
"priority": "high",
"sprint": null,
"assignedAgentIds": [],
"createdBy": {
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
"updatedAt": 1788971880464
}
]
}