Rattrapage de l'état runtime .ideai/ (tickets #119-#139/#147 clôturés, compteur→149, ticket #148 clos et QA verte, métadonnées plugin android) — séparé du code de feature avant d'ouvrir le travail sur le nouveau bug de lancement CLI custom. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.8 KiB
id, number, title, status, priority, sprint, links, agentRefs, attachments, createdBy, updatedBy, createdAt, updatedAt, version
| id | number | title | status | priority | sprint | links | agentRefs | attachments | createdBy | updatedBy | createdAt | updatedAt | version | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| f5296d8b-6bef-45c4-ac8a-cf6e0f90ae9c | 133 | Plugins: contrat de service des assets idea-plugin:// (multi-fichiers ESM) & confinement | closed | high | null |
|
|
|
1785702640094 | 1785881187645 | 5 |
Bug diagnostiqué : crates/app-tauri/src/plugins.rs:504-536 (asset_allowed) n'autorise que main/icon déclarés au manifeste, ou un chemin préfixé assets/. Tout import ESM relatif secondaire (./constants.js, ./core/x.js) depuis le main est donc rejeté 403 → "Importing a module script failed." côté navigateur. Le SDK (sdk/IdeaSDK/README.md) documente main: dist/index.js comme point d'entrée sans jamais imposer un bundle mono-fichier, ce qui sous-entend un support multi-fichiers jamais réellement vérifié (l'exemple hello-plugin est mono-fichier).
Objectif de ce ticket : trancher le contrat d'architecture, PAS l'implémenter.
À décider et documenter :
- Élargir la politique de service à : tout chemin relatif confiné du package installé, dès lors que
entry.content_hash == hash(intégrité du package entier déjà vérifiée) ETentry.lifecycle_state.is_runtime_active()ET confinement canonicalize (target.starts_with(root), déjà en place lignes 467-483). Ces trois garanties suffisent déjà sans dépendre d'une déclaration par-fichier dans le manifeste. - Figer la limite explicite : imports ESM relatifs uniquement, pas de résolution
node_modules/bare specifiers (hors scope, pas de résolveur de modules à construire) — un plugin qui a des dépendances tierces doit les vendorer en relatif ou les bundler lui-même, à son choix, jamais une obligation d'IdeA. - Formaliser le contrat de confinement + désinstallation propre : aucune écriture ne doit jamais sortir de
app_data/plugins/installed/<id>(pas de pollution project root ni.ideai/), et la désinstallation doit être 100% (dossier + entrée registry, zéro résidu), à la manière VSCode.
Livrable : note d'architecture (+ mise à jour de la doc plugin existante si présente) qui fait foi pour les tickets d'implémentation liés (DevBackend, SDK/doc, QA).
Critères d'acceptation :
- Le contrat écrit référence explicitement le code actuel (plugins.rs:504-536) et explique pourquoi hash+lifecycle+confinement remplacent l'allowlist par fichier sans régression de sécurité.
- La limite bare-specifiers/node_modules est tranchée noir sur blanc (in ou out, et pourquoi).
- Le contrat de confinement/désinstallation est écrit explicitement (racine autorisée, ce qui est interdit, ce que "propre" veut dire).