feat: add reminders page, BMad skills upgrade, MCP server refactor

- Add reminders page with navigation support
- Upgrade BMad builder module to skills-based architecture
- Refactor MCP server: extract tools and auth into separate modules
- Add connections cache, custom AI provider support
- Update prisma schema and generated client
- Various UI/UX improvements and i18n updates
- Add service worker for PWA support

Made-with: Cursor
This commit is contained in:
Sepehr Ramezani
2026-04-13 21:02:53 +02:00
parent 18ed116e0d
commit fa7e166f3e
3099 changed files with 397228 additions and 14584 deletions

View File

@@ -325,6 +325,7 @@
"connections": "Connections",
"connection": "connection",
"connectionsBadge": "{count} connection{plural}",
"match": "{percentage}% match",
"fused": "Fused",
"clickToView": "Click to view note →",
"overlay": {
@@ -385,6 +386,11 @@
"unknownDate": "Unknown date"
}
},
"notification": {
"shared": "shared \"{title}\"",
"untitled": "Untitled",
"notifications": "Notifications"
},
"nav": {
"home": "Home",
"notes": "Notes",
@@ -560,11 +566,26 @@
"save": "Set reminder",
"cancel": "Cancel"
},
"reminders": {
"title": "Reminders",
"empty": "No reminders",
"emptyDescription": "Add a reminder to a note to find it here.",
"upcoming": "Upcoming",
"overdue": "Overdue",
"done": "Done",
"markDone": "Mark as done",
"markUndone": "Mark as undone",
"todayAt": "Today at {time}",
"tomorrowAt": "Tomorrow at {time}"
},
"notebook": {
"create": "Create Notebook",
"createNew": "Create New Notebook",
"createDescription": "Start a new collection to organize your notes, ideas, and projects efficiently.",
"name": "Notebook Name",
"namePlaceholder": "e.g. Q4 Marketing Strategy",
"myNotebook": "My Notebook",
"saving": "Saving...",
"selectIcon": "Icon",
"selectColor": "Color",
"cancel": "Cancel",
@@ -579,7 +600,13 @@
"generating": "Generating summary...",
"summaryError": "Error generating summary",
"labels": "Labels:",
"noLabels": "No labels"
"noLabels": "No labels",
"pdfTitle": "Summary — {name}",
"pdfNotesLabel": "Notes:",
"pdfGeneratedOn": "Generated on:",
"confidence": "confidence",
"savingReminder": "Failed to save reminder",
"removingReminder": "Failed to remove reminder"
},
"notebookSuggestion": {
"title": "Move to {icon} {name}?",
@@ -689,12 +716,27 @@
"embeddingsTestTitle": "Embeddings Test",
"embeddingsTestDescription": "Test the AI provider responsible for semantic search embeddings",
"howItWorksTitle": "How Testing Works",
"tagsGenerationTest": "🏷️ Tags Generation Test:",
"tagsStep1": "Sends a sample note to the AI provider",
"tagsStep2": "Requests 3-5 relevant tags based on the content",
"tagsStep3": "Displays the generated tags with confidence scores",
"tagsStep4": "Measures response time",
"embeddingsTestLabel": "🔍 Embeddings Test:",
"embeddingsStep1": "Sends a sample text to the embedding provider",
"embeddingsStep2": "Generates a vector representation (list of numbers)",
"embeddingsStep3": "Displays embedding dimensions and sample values",
"embeddingsStep4": "Verifies the vector is valid and properly formatted",
"tipContent": "You can use different providers for tags and embeddings! For example, use Ollama (free) for tags and OpenAI (best quality) for embeddings to optimize costs and performance.",
"provider": "Provider:",
"model": "Model:",
"testing": "Testing...",
"runTest": "Run Test",
"testPassed": "Test Passed",
"testFailed": "Test Failed",
"testSuccessToast": "{type} Test Successful!",
"testFailedToast": "{type} Test Failed",
"testingType": "Testing {type}...",
"technicalDetails": "Technical details",
"responseTime": "Response time: {time}ms",
"generatedTags": "Generated Tags:",
"embeddingDimensions": "Embedding Dimensions:",
@@ -704,6 +746,15 @@
"testError": "Test Error: {error}",
"tipTitle": "Tip:",
"tipDescription": "Use the AI Test Panel to diagnose configuration issues before testing."
},
"sidebar": {
"dashboard": "Dashboard",
"users": "Users",
"aiManagement": "AI Management",
"settings": "Settings"
},
"metrics": {
"vsLastPeriod": "vs last period"
}
},
"about": {

View File

@@ -80,6 +80,17 @@
"first5Values": "5 premières valeurs :",
"generatedTags": "Étiquettes générées :",
"howItWorksTitle": "Fonctionnement des tests",
"tagsGenerationTest": "🏷️ Test de génération d'étiquettes :",
"tagsStep1": "Envoie une note exemple au fournisseur IA",
"tagsStep2": "Demande 3-5 étiquettes pertinentes basées sur le contenu",
"tagsStep3": "Affiche les étiquettes générées avec les scores de confiance",
"tagsStep4": "Mesure le temps de réponse",
"embeddingsTestLabel": "🔍 Test d'embeddings :",
"embeddingsStep1": "Envoie un texte exemple au fournisseur d'embeddings",
"embeddingsStep2": "Génère une représentation vectorielle (liste de nombres)",
"embeddingsStep3": "Affiche les dimensions de l'embedding et des exemples de valeurs",
"embeddingsStep4": "Vérifie que le vecteur est valide et correctement formaté",
"tipContent": "Vous pouvez utiliser différents fournisseurs pour les étiquettes et les embeddings ! Par exemple, utilisez Ollama (gratuit) pour les étiquettes et OpenAI (meilleure qualité) pour les embeddings afin d'optimiser les coûts et les performances.",
"model": "Modèle :",
"provider": "Fournisseur :",
"responseTime": "Temps de réponse : {time}ms",
@@ -89,12 +100,25 @@
"testError": "Erreur de test : {error}",
"testFailed": "Test échoué",
"testPassed": "Test réussi",
"testSuccessToast": "Test {type} réussi !",
"testFailedToast": "Test {type} échoué",
"testingType": "Test de {type} en cours...",
"technicalDetails": "Détails techniques",
"testing": "Test en cours...",
"tipDescription": "Utilisez le panneau de test IA pour diagnostiquer les problèmes de configuration avant de tester.",
"tipTitle": "Astuce :",
"title": "Test des fournisseurs IA",
"vectorDimensions": "dimensions vectorielles"
},
"sidebar": {
"dashboard": "Tableau de bord",
"users": "Utilisateurs",
"aiManagement": "Gestion IA",
"settings": "Paramètres"
},
"metrics": {
"vsLastPeriod": "vs période précédente"
},
"aiTesting": "Test IA",
"security": {
"allowPublicRegistration": "Autoriser l'inscription publique",
@@ -201,7 +225,8 @@
"languageDetected": "Langue détectée",
"notebookSummary": {
"regenerate": "Régénérer le résumé",
"regenerating": "Régénération du résumé..."
"regenerating": "Régénération du résumé...",
"exportPDF": "Exporter en PDF"
},
"original": "Original",
"poweredByAI": "Propulsé par l'IA",
@@ -549,6 +574,7 @@
"connection": "connexion",
"connections": "Connexions",
"connectionsBadge": "{count} connexion{plural}",
"match": "{percentage}% correspondance",
"title": "💡 J'ai remarqué quelque chose...",
"description": "Connexions proactives entre vos notes",
"dailyInsight": "Aperçu quotidien de vos notes",
@@ -608,6 +634,11 @@
"unknownDate": "Date inconnue"
}
},
"notification": {
"shared": "a partagé « {title} »",
"untitled": "Sans titre",
"notifications": "Notifications"
},
"nav": {
"accountSettings": "Paramètres du compte",
"adminDashboard": "Tableau de bord Admin",
@@ -657,12 +688,21 @@
"generating": "Génération du résumé...",
"labels": "Étiquettes :",
"name": "Nom du carnet",
"namePlaceholder": "ex. Stratégie Marketing Q4",
"myNotebook": "Mon carnet",
"saving": "Enregistrement...",
"noLabels": "Aucune étiquette",
"selectColor": "Couleur",
"selectIcon": "Icône",
"summary": "Résumé du carnet",
"summaryDescription": "Générer un résumé alimenté par l'IA de toutes les notes de ce carnet.",
"summaryError": "Erreur lors de la génération du résumé"
"summaryError": "Erreur lors de la génération du résumé",
"pdfTitle": "Résumé — {name}",
"pdfNotesLabel": "Notes :",
"pdfGeneratedOn": "Généré le :",
"confidence": "confiance",
"savingReminder": "Erreur lors de la sauvegarde du rappel",
"removingReminder": "Erreur lors de la suppression du rappel"
},
"notebookSuggestion": {
"description": "Cette note semble appartenir à ce carnet",
@@ -906,6 +946,18 @@
"title": "Paramètres",
"version": "Version"
},
"reminders": {
"title": "Rappels",
"empty": "Aucun rappel",
"emptyDescription": "Ajoutez un rappel à une note pour le retrouver ici.",
"upcoming": "À venir",
"overdue": "En retard",
"done": "Terminés",
"markDone": "Marquer comme terminé",
"markUndone": "Marquer comme non terminé",
"todayAt": "Aujourd'hui à {time}",
"tomorrowAt": "Demain à {time}"
},
"sidebar": {
"archive": "Archives",
"editLabels": "Modifier les étiquettes",