L'analyse de l'historique Git révèle 3 phases distinctes dans l'évolution de l'architecture :
-
Phase 1 : Sample basique (9ef09bd)
- Configuration ultra-simple d'Obsidian
- Juste esbuild.config.mjs basique
- Aucun script avancé
-
Phase 2 : Scripts locaux élaborés (0fc65a6)
- +622 lignes, -320 lignes = transformation majeure
- Scripts personnalisés : acp.ts, esbuild.config.ts, release.ts, update-version.ts
- Configuration TypeScript avancée
-
Phase 3 : Architecture centralisée (1510573)
- Suppression de tous les scripts locaux
- Appels vers
../obsidian-plugin-config/scripts/ - Dépendance
"obsidian-plugin-config": "file:../obsidian-plugin-config"
- ✅ Avantage : Mise à jour centralisée, cohérence
- ❌ Inconvénient : Dépendance locale obligatoire, pas d'injection à distance
- ✅ Besoin : Adapter la config à chaque plugin
- ❌ Problème : Perte de la centralisation
- ✅ Réalité : Même avec l'IA, setup complexe et long
- ❌ Idéal : Configuration instantanée et simple
- ✅ Besoin : Conserver les configs qui marchent
- ❌ Réalité : Difficile d'extraire la "bonne" config d'un plugin existant
src/
├── modals/ # Composants modaux réutilisables
├── tools/ # Fonctions utilitaires simples
├── utils/ # Fonctions utilitaires avancées
└── index.ts # Exports principaux
scripts/
├── esbuild.config.ts # Configuration build centralisée
├── update-exports.js # Auto-génération exports package.json
├── acp.ts # Automatisation Git (add, commit, push)
├── migrate-config.ts # CLI de migration automatique
└── update-version.ts # Gestion des versions
templates/
├── package-versions.json # Source unique des versions
├── eslint.config.ts # Configuration ESLint standardisée
├── tsconfig.json # Configuration TypeScript optimisée
├── .npmrc # Protection yarn obligatoire
├── .vscode/settings.json # Settings VSCode pour yarn
└── .gitignore # Règles git optimisées
// Dans le plugin template
import { showCentralizedModal } from "obsidian-plugin-config/modals";Fonctionnement :
- Dépendance file:
"obsidian-plugin-config": "file:../obsidian-plugin-config" - yarn crée un symlink dans node_modules du template
- TypeScript résout les imports via package.json exports
- Le processus de build bundle tout correctement
Problème : Pour le développement in-place dans .obsidian/plugins, il faut :
cd .obsidian/plugins
git clone https://github.com/3C0D/obsidian-plugin-config
git clone https://github.com/3C0D/[votre-plugin]Impact : Pollution du dossier plugins, contrainte de structure
Objectif : Éliminer la dépendance locale en injectant les configurations directement depuis GitHub.
// Au lieu de file:../obsidian-plugin-config
// Injection directe depuis GitHub raw URLs
const configUrl =
"https://raw.githubusercontent.com/3C0D/obsidian-plugin-config/main";- ✅ Aucune pollution locale : Pas besoin de cloner plugin-config
- ✅ Mise à jour instantanée : Toujours la dernière version
- ✅ Sélection modulaire : Choisir quelles parties injecter
- ✅ Développement in-place : Fonctionne partout sans contrainte
- ✅ Zéro configuration : Installation immédiate
# Injection complète
yarn inject-config
# Injection sélective
yarn inject-config --scripts --templates
yarn inject-config --only=esbuild,tsconfigobsidian-plugin-config/templates/
├── basic/ # Configuration simple
├── advanced/ # Configuration actuelle élaborée
├── svelte/ # Configuration Svelte
├── react/ # Configuration React
└── custom/ # Configurations sauvegardées
// Système de patches locaux
const localPatches = {
"tsconfig.json": { compilerOptions: { strict: false } },
"package.json": { scripts: { custom: "my-command" } },
};- Configuration minimale
- Scripts essentiels (dev, build)
- Dépendances de base
- Configuration actuelle complète
- Tous les scripts (acp, release, version)
- Protection yarn/npm
- ESLint, TypeScript strict
- Configuration Svelte optimisée
- Plugins esbuild spécifiques
- Types Svelte
- Configurations sauvegardées depuis plugins existants
- Système de "snapshot" de configuration
- Réutilisation sur nouveaux projets
try {
// Tentative d'injection depuis GitHub
await injectFromRemote(configUrl);
} catch (error) {
// Fallback vers installation locale
await useLocalConfig("../obsidian-plugin-config");
}# Extraire la config d'un plugin qui marche
yarn snapshot-config ../working-plugin --name="my-custom-config"
# Réutiliser sur nouveau projet
yarn inject-config --template=my-custom-config# Mise à jour sélective
yarn update-config --preserve-local --only=scripts
# Mise à jour complète avec merge
yarn update-config --merge-localyarn migrate-config <path> # Migration standard
yarn migrate-config --force <path> # Re-migration avec sync versions
yarn migrate-config --dry-run <path> # Simulation
yarn migrate-config --interactive # Interface guidée- 100% des scripts centralisés
- 100% des configurations centralisées (eslint, tsconfig, .npmrc, .vscode)
- Réduction 60-80% des dépendances par plugin
- Protection complète yarn/npm
- Synchronisation automatique des versions
Migration typique :
📦 Total dependencies: 37 → 8 (-78%)
📁 Local scripts: 6 → 0 (-100%)
💾 node_modules size: ~150MB → ~50MB (-67%)
- ✅ obsidian-sample-plugin-modif : Template de référence
- ✅ obsidian-vault-name-in-status-bar : Premier plugin migré
- ✅ obsidian-duplicate-line : Plugin complexe avec fonctionnalités avancées
- Développement externe : Fonctionne parfaitement
- Développement in-place : Nécessite clonage de plugin-config dans .obsidian/plugins
- Modifications dans plugin-config → Amélioration centralisée ✅
- Modifications locales → Risque de perte lors des mises à jour ❌
- CLI de migration automatique opérationnel
- Templates centralisés complets
- Protection yarn/npm robuste
- Documentation stratégique unifiée
- Message d'aide pour contrainte in-place
- Développement du système d'injection GitHub
- Templates multiples (basic, advanced, svelte)
- Système de snapshot de configuration
- Fallback intelligent local/distant
- Interface web pour gestion des templates
- CI/CD pour propagation automatique
- Marketplace de configurations
- Intégration VSCode extension
- Continuer avec l'architecture actuelle pour nouveaux plugins
- Utiliser le CLI de migration pour plugins existants
- Documenter les contraintes dans les README des plugins
- Tester l'injection à distance sur un plugin pilote
- Ajouter message d'aide explicite pour développement in-place
- Créer templates spécialisés (Svelte, React)
- Développer système de snapshot pour sauvegarder configs
- Prototyper injection à distance avec GitHub raw URLs
L'architecture centralisée actuelle représente un équilibre optimal entre :
- ✅ Fonctionnalité : CLI opérationnel, migration automatique
- ✅ Simplicité : Commandes unifiées, protection automatique
- ✅ Évolutivité : Base solide pour injection à distance
⚠️ Contraintes : Limitation in-place documentée et contournable
Prochaine étape recommandée : Implémenter l'injection à distance pour éliminer définitivement la contrainte de structure locale.