feat: audit and explicitly clean orphan plugin dependencies (W2-2) - #484
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Symptôme
W2-2 / F10 : chaque identité de plugin possède son
deps, sans commande permettant de contrôler les répertoires devenus inutiles. PR empilée sur #483.Cause racine
Les registres disponibles ne prouvent pas l'absence d'une identité dans tous les projets, réglages gérés ou sessions vivantes. Les plugins inline/synced peuvent ne pas être enregistrés et la normalisation d'identité est non injective. Une suppression automatique par différence d'ensembles serait injustifiée. Source : Claude Code, référence plugins.
Changement
Le launcher propose
--cleanup-deps --dry-run(défaut), puis--applyavec au moins un--plugin-idvérifié explicitement par le propriétaire. Il protège l'identité courante, les installations et les références de settings, même désactivées, dans les projets connus. Registres incomplets/corrompus, scopes inconnus, doublons JSON et identités inline/synced sont refusés. Les dossiers non identifiés restent indéterminés.L'audit optionnel ne s'exécute qu'au démarrage du serveur
mcp_serversiCORTEX_CLAUDE_DIRest explicite. Aucun import de nettoyage ni scan de registre dans les hooks ou workers ; les imports de maintenance sont paresseux. Les arguments ordinaires d'un module restent transmis.Le retrait ne vise que le sous-répertoire
deps. Accès par descripteurs,O_NOFOLLOW, refus des liens/fichiers spéciaux et relecture des protections avant chaque retrait ; identité parente et fichiers frères conservés. Python 3.10 permet l'audit mais refuse l'application faute dermtree(dir_fd), ajouté en 3.11. Sources : Python os, Python shutil.rmtree.Preuve
Base
7ea80be4cbcbc8c0f54e5e2a2693c811a0a2e4a9. Python 3.13.7, macOS ARM64. 35 tests stdlib passent en 0,639 s : arbres factices avec identités protégées/orphelines/courantes, registres corrompus ou changeants, liens, scopes inconnus, conservation des frères et dispatch avant bootstrap. Deux tests supplémentaires au patch initial vérifient l'absence totale d'import de nettoyage pour les hooks/workers et l'audit unique du serveur explicite.Gates locaux terminés code 0 : Ruff/format 1 428 fichiers, craftsmanship, Pyright zéro diagnostic ; scripts 865 passed, 5 skipped, 341 subtests en 12,57 s ; suite complète 7 641 passed, 221 skipped, 341 subtests en 133,71 s. PostgreSQL volontairement indisponible sur socket privé inexistant ; dépendances et SQLite de tests privés. Journal
/private/tmp/cortex-green-w2-2-gates.log, charge initiale 4,05 / 10 cœurs, disque 61 GiB avant/après. SHA final288603fb5758522eddf81f3d6d572b09abf61f55. CI externe 34044760164 terminée verte sur ce SHA.Les tests ne touchent que des arbres temporaires. Aucun
~/.clauderéel inspecté, aucun nettoyage de production. Les 3,3 Go du constat F10 restent à vérifier par le propriétaire ; ce changement ne revendique aucun espace effectivement libéré.Conformité
Nouveaux modules sous 300 lignes, fonctions sous 40 lignes/quatre paramètres.
launcher.maindemeure inchangé. Aucune entrée baseline ajoutée. Dépendances et opérations de maintenance limitées à la bibliothèque standard. Un seul travail lourd local à la fois.Candidats issues
Aucun verrou de registre interprocessus n'est documenté par Claude. L'absence dans les seuls registres connus ne suffit pas : le propriétaire vérifie aussi les autres scopes et arrête les sessions avant
--apply. Suppression automatique au démarrage abandonnée pour cette cause démontrée. Aucun ticket créé.Runbook
Propriétaire uniquement :
CORTEX_CLAUDE_DIR=/absolute/claude-root CLAUDE_PLUGIN_DATA=/absolute/claude-root/plugins/data/current-identity python3.11 scripts/launcher.py --cleanup-deps --dry-run --plugin-id old@marketplace; vérifier les candidats et autres scopes, arrêter les sessions concernées, puis remplacer--dry-runpar--apply. La suppression conserve le dossier d'identité et ses autres fichiers. Aucun passage effectué pendant cette tâche.