From 8b921f1adbe3568b143cbacfaf63fa604d7c825f Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sat, 14 Feb 2026 14:40:11 +0100 Subject: [PATCH] refacto: look after remanso now --- .kilocode/rules/brief.md | 5 - package.json | 2 +- plan.md | 529 ------------------------------ src/components/WelcomeWorld.vue | 2 +- src/data/data.ts | 34 +- src/modules/atproto/getUrl.ts | 2 +- src/modules/repo/services/repo.ts | 2 +- src/utils/twitter.ts | 10 +- 8 files changed, 26 insertions(+), 560 deletions(-) delete mode 100644 .kilocode/rules/brief.md delete mode 100644 plan.md diff --git a/.kilocode/rules/brief.md b/.kilocode/rules/brief.md deleted file mode 100644 index f512c32..0000000 --- a/.kilocode/rules/brief.md +++ /dev/null @@ -1,5 +0,0 @@ -# brief.md - -LiteNote is a UI web app for note taking. It connects with GitHub and, starting from README.md, create beautiful pages to display markdown files with links adding pages à la Matuschak. - -The url looks like `https://litenote.space/{user}/{repo}`. If the repo is public, LiteNote will directly get raw markdown files. If the repo is private, the user must authenticate first. diff --git a/package.json b/package.json index 5029a3b..bdd4cb2 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "lite-notes", + "name": "remanso", "version": "1.0.0", "private": true, "scripts": { diff --git a/plan.md b/plan.md deleted file mode 100644 index 3fdaf7d..0000000 --- a/plan.md +++ /dev/null @@ -1,529 +0,0 @@ -# Plan d'Implémentation - Partage Public de Notes LiteNote - -## 🎯 Vision de la Fonctionnalité - -Permettre aux utilisateurs de LiteNote de **partager publiquement certaines notes de leurs dépôts privés** sans aucune infrastructure supplémentaire. Cette fonctionnalité utilise un système de "miroir public" intelligent qui synchronise automatiquement les notes marquées comme publiques vers un dépôt GitHub public dédié. - -## 🏗️ Architecture Technique - -### Composants Principaux - -1. **Système de Métadonnées YAML** : Utilise le frontmatter pour marquer les notes publiques -2. **Dépôt Miroir Automatique** : `{username}-litenote-public` créé automatiquement -3. **Service de Synchronisation** : Gestion intelligente des mises à jour -4. **Processeur de Liens** : Transformation des liens inter-notes -5. **Gestionnaire d'Erreurs** : Résolution automatique et manuelle des conflits - -### Flux de Fonctionnement - -```mermaid -graph LR - A[Note Privée] --> B[Métadonnées public: true] - B --> C[Détection Automatique] - C --> D[Traitement des Liens] - D --> E[Synchronisation Miroir] - E --> F[Note Publique Accessible] -``` - -## 📝 Système de Métadonnées - -### Format des Métadonnées Publiques - -```yaml ---- -# Métadonnées de publication -public: true -public_title: "Mon Guide Public" -public_description: "Description visible publiquement" -public_tags: ["guide", "tutorial", "public"] -public_category: "documentation" - -# Métadonnées de synchronisation -public_created: "2024-01-15T10:30:00Z" -public_updated: "2024-01-20T14:45:00Z" -public_version: 2 - -# Options de publication -public_show_backlinks: false -public_allow_comments: true -public_featured: false ---- - -# Contenu de la note... -``` - -### Métadonnées Disponibles - -| Champ | Obligatoire | Description | Exemple | -| ----------------------- | ----------- | --------------------------------------- | ---------------------------- | -| `public` | ✅ | Active le partage public | `true` | -| `public_title` | ❌ | Titre personnalisé pour le public | `"Mon Guide Complet"` | -| `public_description` | ❌ | Description visible publiquement | `"Un guide détaillé sur..."` | -| `public_tags` | ❌ | Tags pour organiser vos notes publiques | `["guide", "tutorial"]` | -| `public_category` | ❌ | Catégorie de la note | `"documentation"` | -| `public_show_backlinks` | ❌ | Afficher les liens entrants | `false` | -| `public_featured` | ❌ | Mettre en avant cette note | `true` | - -## 🗂️ Structure du Dépôt Miroir Public - -```sh -{username}-litenote-public/ -├── README.md # Page d'accueil générée -├── .litenote-mirror.json # Configuration du miroir -├── .github/ -│ └── workflows/ -│ └── pages.yml # Déploiement GitHub Pages (optionnel) -├── notes/ -│ ├── index.md # Index des notes publiques -│ ├── guides/ -│ │ ├── guide-1.md -│ │ └── guide-2.md -│ └── articles/ -│ └── article-1.md -├── assets/ -│ ├── images/ -│ └── files/ -└── _data/ - ├── notes-index.json # Index searchable - └── tags.json # Index des tags -``` - -### Configuration du Miroir (.litenote-mirror.json) - -```json -{ - "version": "1.0", - "source_repo": "username/private-notes", - "created": "2024-01-15T10:30:00Z", - "last_sync": "2024-01-20T14:45:00Z", - "sync_count": 42, - "settings": { - "auto_generate_index": true, - "preserve_folder_structure": true, - "copy_assets": true, - "generate_rss": false - }, - "stats": { - "total_notes": 15, - "total_assets": 8, - "total_tags": 12 - } -} -``` - -## 🔄 Service de Synchronisation - -### Architecture du Service - -```typescript -interface MirrorSyncService { - // Gestion du dépôt miroir - createMirrorRepo(username: string): Promise - getMirrorRepoName(username: string): string - checkMirrorExists(username: string): Promise - - // Synchronisation des notes - syncNote(note: PublicNote): Promise - syncAllPublicNotes(): Promise - removeNoteFromMirror(notePath: string): Promise - - // Gestion des assets - syncAssets(assets: string[]): Promise - updateAssetReferences(content: string, assetMap: Map): string - - // Utilitaires - generateMirrorIndex(): Promise - updateMirrorConfig(): Promise -} -``` - -### Flux de Synchronisation - -```mermaid -graph TD - A[Note modifiée] --> B[Détection changement] - B --> C{Note publique?} - C -->|Non| D[Vérifier si était publique] - C -->|Oui| E[Extraire métadonnées] - D -->|Était publique| F[Supprimer du miroir] - D -->|N'était pas publique| G[Aucune action] - E --> H[Analyser assets référencés] - H --> I[Préparer contenu pour miroir] - I --> J{Dépôt miroir existe?} - J -->|Non| K[Créer dépôt miroir] - J -->|Oui| L[Synchroniser assets] - K --> L - L --> M[Commit note vers miroir] - M --> N[Mettre à jour index] - N --> O[Notification utilisateur] - F --> P[Mettre à jour index] - P --> O -``` - -## 🔗 Gestion des Liens Inter-Notes - -### Problématique des Liens - -Dans LiteNote, les utilisateurs utilisent la syntaxe `[[nom-de-note]]` pour créer des liens entre notes. Quand une note devient publique, ces liens peuvent pointer vers : - -1. **Notes publiques** → Doivent être transformés en liens fonctionnels -2. **Notes privées** → Doivent être gérés avec avertissement -3. **Notes inexistantes** → Doivent être préservés comme liens brisés - -### Algorithme de Transformation - -```mermaid -graph TD - A[Contenu avec liens [[note]]] --> B[Extraire tous les liens] - B --> C[Pour chaque lien] - C --> D{Note existe?} - D -->|Non| E[Marquer comme lien brisé] - D -->|Oui| F{Note est publique?} - F -->|Oui| G[Transformer en lien relatif] - F -->|Non| H[Transformer en lien désactivé] - G --> I[Ajouter à la liste des liens publics] - H --> J[Ajouter à la liste des liens privés] - E --> K[Ajouter à la liste des liens brisés] - I --> L[Générer contenu final] - J --> L - K --> L -``` - -### Transformation des Liens - -```markdown - -Voir aussi [[ma-note-privee]] et [[ma-note-publique]] - - -Voir aussi [ma-note-privee](# "Cette note n'est pas publique") et [ma-note-publique](./ma-note-publique.md) -``` - -## 🎛️ Interface Utilisateur - -### Indicateurs Visuels - -**Dans la liste des notes** : - -- 🌐 Icône pour les notes publiques -- 📝 Icône pour les notes privées -- ⏳ Icône pour les notes en cours de synchronisation - -**Dans l'éditeur de note** : - -- Badge "PUBLIC" dans l'en-tête -- Lien vers la version publique -- Statut de synchronisation - -### Dashboard des Notes Publiques - -```vue - - -``` - -## ⚠️ Gestion des Erreurs et Conflits - -### Types d'Erreurs - -1. **Erreurs de Création du Dépôt Miroir** - - Nom de dépôt déjà pris → Proposition de noms alternatifs - - Permissions insuffisantes → Guide pour configurer les permissions GitHub - - Quota GitHub dépassé → Information sur les limites et solutions - -2. **Erreurs de Synchronisation** - - Conflits de contenu → Résolution automatique ou manuelle - - Fichiers trop volumineux → Compression ou exclusion automatique - - Rate limiting GitHub → Queue avec retry automatique - -3. **Erreurs de Réseau** - - Perte de connexion → Mise en queue pour synchronisation ultérieure - - Timeout API → Retry avec backoff exponentiel - - Authentification expirée → Refresh automatique du token - -### Interface de Résolution des Conflits - -```vue - - -``` - -## 🌐 URLs Publiques - -Vos notes publiques sont accessibles via : - -```md -Format principal : -https://litenote.space/{username}/{username}-litenote-public - -Note spécifique : -https://litenote.space/{username}/{username}-litenote-public?note=notes/ma-note.md - -Avec GitHub Pages (optionnel) : -https://{username}.github.io/{username}-litenote-public/ -``` - -## 🔒 Sécurité et Confidentialité - -### Ce qui est Partagé - -- ✅ **Contenu des notes** marquées `public: true` -- ✅ **Assets référencés** (images, fichiers) dans ces notes -- ✅ **Métadonnées publiques** définies par vous - -### Ce qui Reste Privé - -- ❌ **Toutes les autres notes** de votre dépôt privé -- ❌ **Historique des commits** du dépôt privé -- ❌ **Métadonnées privées** (dates de création, etc.) -- ❌ **Structure complète** de votre dépôt privé - -## 🚀 Plan d'Implémentation - -### Phase 1 : Fondations (2-3 semaines) - -#### 1.1 Système de Détection des Métadonnées - -- [ ] Parser de frontmatter YAML -- [ ] Interface `PublicNoteMetadata` -- [ ] Détecteur de changements de statut public - -#### 1.2 Service de Base du Dépôt Miroir - -- [ ] Création automatique du dépôt miroir -- [ ] Vérification d'existence -- [ ] Configuration initiale - -#### 1.3 Synchronisation Basique - -- [ ] Commit de notes vers le miroir -- [ ] Suppression de notes du miroir -- [ ] Mise à jour des métadonnées du miroir - -### Phase 2 : Fonctionnalités Avancées (2-3 semaines) - -#### 2.1 Processeur de Liens Intelligent - -- [ ] Détection des liens `[[note]]` -- [ ] Transformation des liens publics -- [ ] Gestion des liens privés et brisés -- [ ] Interface d'avertissement des liens - -#### 2.2 Interface Utilisateur Complète - -- [ ] Dashboard des notes publiques -- [ ] Indicateurs visuels dans l'interface -- [ ] Composant de gestion des métadonnées publiques -- [ ] Aperçu des notes publiques - -#### 2.3 Gestion des Assets - -- [ ] Détection des assets référencés -- [ ] Copie vers le dépôt miroir -- [ ] Mise à jour des références - -### Phase 3 : Robustesse et Optimisation (1-2 semaines) - -#### 3.1 Gestion des Erreurs - -- [ ] Gestionnaire d'erreurs complet -- [ ] Interface de résolution des conflits -- [ ] Queue de synchronisation avec retry -- [ ] Notifications utilisateur - -#### 3.2 Performance et Cache - -- [ ] Optimisation des requêtes GitHub -- [ ] Cache des métadonnées publiques -- [ ] Synchronisation incrémentale - -#### 3.3 Documentation et Tests - -- [ ] Documentation utilisateur complète -- [ ] Tests unitaires et d'intégration -- [ ] Guide de migration - -## 📊 Fichiers à Créer/Modifier - -### Nouveaux Fichiers - -```sh -src/modules/public-sharing/ -├── interfaces/ -│ ├── PublicNoteMetadata.ts -│ ├── MirrorConfig.ts -│ └── SyncResult.ts -├── services/ -│ ├── MirrorSyncService.ts -│ ├── FrontmatterParser.ts -│ ├── LinkProcessor.ts -│ └── ErrorHandler.ts -├── hooks/ -│ ├── usePublicNoteSync.ts -│ ├── usePublicNotes.ts -│ └── useMirrorRepo.ts -├── components/ -│ ├── PublicNotesDashboard.vue -│ ├── PublicNoteManager.vue -│ ├── LinkWarningsPanel.vue -│ ├── ConflictResolutionModal.vue -│ └── SyncStatusNotification.vue -└── store/ - └── publicNotes.store.ts -``` - -### Fichiers à Modifier - -```sh -src/hooks/useGitHubContent.hook.ts # Intégration sync publique -src/hooks/useFile.hook.ts # Détection métadonnées -src/components/FluxNote.vue # Indicateurs visuels -src/router/router.ts # Nouvelles routes -src/views/ShareNotes.vue # Amélioration partage -``` - -## 🎯 Critères de Succès - -### Fonctionnels - -- [ ] Une note avec `public: true` est automatiquement synchronisée -- [ ] Le dépôt miroir est créé automatiquement -- [ ] Les liens inter-notes sont correctement transformés -- [ ] L'interface utilisateur est intuitive et informative -- [ ] Les erreurs sont gérées gracieusement - -### Non-Fonctionnels - -- [ ] Synchronisation en moins de 5 secondes pour une note standard -- [ ] Interface réactive et sans blocage -- [ ] Gestion robuste des pannes réseau -- [ ] Sécurité : aucune fuite de données privées - -### Expérience Utilisateur - -- [ ] Workflow simple : ajouter `public: true` suffit -- [ ] Feedback visuel clair sur le statut de synchronisation -- [ ] Résolution guidée des conflits -- [ ] Documentation claire et accessible - -## 🔮 Évolutions Futures - -### Fonctionnalités Avancées - -- **Intégrations tierces** : RSS, SEO, analytics -- **Fonctionnalités sociales** : Commentaires, likes, partages -- **Thèmes personnalisés** : Apparence des notes publiques -- **Collaboration** : Co-édition de notes publiques - -### Optimisations Techniques - -- **CDN pour assets** : Performance améliorée -- **Indexation full-text** : Recherche dans les notes publiques -- **API publique** : Accès programmatique aux notes -- **Webhooks** : Notifications de changements - ---- - -## 📋 Checklist de Validation - -### Avant Implémentation - -- [ ] Architecture validée par l'équipe -- [ ] Spécifications techniques approuvées -- [ ] Maquettes UI/UX validées -- [ ] Plan de tests défini - -### Pendant l'Implémentation - -- [ ] Tests unitaires pour chaque composant -- [ ] Tests d'intégration avec GitHub API -- [ ] Validation de sécurité -- [ ] Tests de performance - -### Avant Déploiement - -- [ ] Tests utilisateur avec groupe pilote -- [ ] Documentation utilisateur complète -- [ ] Plan de rollback défini -- [ ] Monitoring et alertes configurés - ---- - -*Ce plan constitue la feuille de route complète pour l'implémentation de la fonctionnalité de partage public de LiteNote. Il peut être adapté selon les priorités et contraintes du projet.* diff --git a/src/components/WelcomeWorld.vue b/src/components/WelcomeWorld.vue index 8c8b393..22f2742 100644 --- a/src/components/WelcomeWorld.vue +++ b/src/components/WelcomeWorld.vue @@ -21,7 +21,7 @@ Get started>( - model: T + model: T, ): Promise { try { if (!model._id) { @@ -71,7 +71,7 @@ class Data { } const result = await this.locale?.put({ ...doc, - _deleted: true + _deleted: true, }) return result?.ok ?? false } catch { @@ -80,7 +80,7 @@ class Data { } public async get
>( - id: string + id: string, ): Promise { try { return ((await this.locale?.get(id)) as T) || null @@ -91,7 +91,7 @@ class Data { public async getOrCreate
>( id: string, - initialValue: T + initialValue: T, ): Promise { const element = await this.get(id) @@ -108,7 +108,7 @@ class Data { prefix, includeDocs = true, includeAttachments = false, - keys = [] + keys = [], }: GetAllParams): Promise { if (!this.locale) { return [] @@ -118,13 +118,13 @@ class Data { const response = await this.locale.allDocs({ include_docs: includeDocs, attachments: includeAttachments, - keys: keys.map((key) => this.generateId(prefix, key)) + keys: keys.map((key) => this.generateId(prefix, key)), }) if (includeDocs) { return response.rows .map((row) => { - if ('error' in row) { + if ("error" in row) { return null } @@ -134,7 +134,7 @@ class Data { } else { return response.rows .map((row) => { - if ('error' in row) { + if ("error" in row) { return null } @@ -148,7 +148,7 @@ class Data { include_docs: includeDocs, attachments: includeAttachments, startkey: prefix ? prefix : undefined, - endkey: prefix ? `${prefix}\ufff0` : undefined + endkey: prefix ? `${prefix}\ufff0` : undefined, }) return response.rows.map((row) => row.doc) as T[] diff --git a/src/modules/atproto/getUrl.ts b/src/modules/atproto/getUrl.ts index 5a8a282..f951957 100644 --- a/src/modules/atproto/getUrl.ts +++ b/src/modules/atproto/getUrl.ts @@ -20,7 +20,7 @@ export const getUrl = async ({ did, rkey }: { did: string; rkey: string }) => { await getEndpoint(did), ) url.searchParams.set("repo", did) - url.searchParams.set("collection", "space.litenote.note") + url.searchParams.set("collection", "space.remanso.note") url.searchParams.set("rkey", rkey) return url.toString() diff --git a/src/modules/repo/services/repo.ts b/src/modules/repo/services/repo.ts index b844918..75ac7ac 100644 --- a/src/modules/repo/services/repo.ts +++ b/src/modules/repo/services/repo.ts @@ -92,7 +92,7 @@ export const getUserSettingsContent = async ( repo: string, files: RepoFile[], ): Promise | null> => { - const configFile = files.find((file) => file.path === ".litenote.json") + const configFile = files.find((file) => file.path === ".remanso.json") if (!configFile?.sha) { return null diff --git a/src/utils/twitter.ts b/src/utils/twitter.ts index 53d6fe9..5fb3e35 100644 --- a/src/utils/twitter.ts +++ b/src/utils/twitter.ts @@ -10,7 +10,7 @@ window.twttr = (function (d, s, id) { const js = d.createElement(s) js.id = id - js.src = 'https://platform.twitter.com/widgets.js' + js.src = "https://platform.twitter.com/widgets.js" fjs.parentNode.insertBefore(js, fjs) t._e = [] @@ -19,22 +19,22 @@ window.twttr = (function (d, s, id) { } return t -})(document, 'script', 'twitter-lite-note') +})(document, "script", "twitter-remanso") export const createTweet = ( tweetId: string, - theme: 'light' | 'dark' = 'light' + theme: "light" | "dark" = "light", ) => { window.twttr.ready(() => { window.twttr.widgets.createTweet( tweetId, - document.getElementById(`tweet-${tweetId}`, { theme }) + document.getElementById(`tweet-${tweetId}`, { theme }), ) }) } export const generateTweets = () => { - const elements = document.querySelectorAll('.markdown-tweet') + const elements = document.querySelectorAll(".markdown-tweet") elements.forEach((element) => { createTweet(element.dataset.tweetId)