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:
112
.ideai/tickets/294/carnet.md
Normal file
112
.ideai/tickets/294/carnet.md
Normal 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`.
|
||||
17
.ideai/tickets/294/issue.md
Normal file
17
.ideai/tickets/294/issue.md
Normal 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.
|
||||
Reference in New Issue
Block a user