- `docs/ISSUES_TODOLIST.md` : deux lignes ajoutées au journal (features #189 mobile tableur et #169 chat par fichier, avec vérifications et résultats CI), exigées par le DoD pour tout passage d'IA modifiant du code. - `docs/ROADMAP.md` : colonne version de l'index corrigée — #189 → 2.56.0, #169 → 2.57.0 (le hook de bump ne resynchronise pas ces rangées).
74 KiB
ObsiGate — Roadmap
Version : 2.57.1 | Dernière mise à jour : 2026-10-08 Ce fichier ne contient que le travail à venir (🔵 En cours + ⚪ Backlog) et un index compact vers les fonctionnalités livrées.
- Méthode de livraison à appliquer pour toute tâche : DELIVERY_WORKFLOW.md
- Historique des versions : CHANGELOG.md
- Détail des fonctionnalités livrées : docs/archive/COMPLETED_v1-v2.md
- Fiches détaillées par feature : docs/features/
- Bugs / TODO : ISSUES_TODOLIST.md
Légende
| Icône | Signification |
|---|---|
| ✅ | Terminé |
| 🔵 | En cours |
| ⚪ | Prévu / Backlog |
| 🔴 Impact | Critique / Bloquant |
| 🟡 Impact | Utile / Attendu |
| 🟢 Impact | Nice-to-have / Confort |
Convention : chaque item porte un ID stable
#NN(clé de jointure entre roadmap, changelog et commits). Une fonctionnalité livrée sort de ce fichier et entre dans l'index « Complété » ci-dessous, avec son détail dansdocs/features/ou l'archive.
🔵 En cours
77. Application Desktop native — Tauri (Windows / Linux / macOS)
- Effort : 8-12 jours | Impact : 🟡 | Framework : Tauri v2 (Rust + Webview)
- Statut : livré (A→F) — projet Tauri, backend Python embarqué, fonctionnalités natives, jumplist vaults, bannière 1er lancement, build CI, UX, 24 tests Rust. Détail complet : features/desktop-tauri.md
- Reste à faire :
- Signature de l'updater Tauri (gratuit) : paire de clés générée,
pubkeyrenseignée,createUpdaterArtifactsactivé, secrets CI câblés - Manifeste
latest.jsongénéré parscripts/updater_manifest.py(intégré àpublish_release.py), endpoint updater pointé surmain - Signature de code Windows : non retenue — décision confirmée le 2026-09-26 : livraison non signée + documentation SmartScreen (« Exécuter quand même »). Alternatives écartées sauf retour utilisateur : SignPath.io (OSS gratuit), Certum OSS, Azure Trusted Signing, certificat EV
- Exécuter les 6 tests E2E manuels — protocole documenté : DESKTOP_E2E_CHECKLIST.md
- Signature de l'updater Tauri (gratuit) : paire de clés générée,
✅ Terminé — Visionneuse & édition Excel (P0/P1/P2)
153. Visionneuse & édition XLSX — complétude (fidélité, recherche, IA, UX, formats)
- Effort : 8-13 jours (P0 ✅ 2-3 j · P1 : 4-6 j · P2 : 2-4 j) | Impact : 🟡
- Statut : ✅ livré le 2026-09-28 — P0 le 2026-09-27 (BUG-085 → BUG-088), A5/A10/A12 le 2026-09-28 (avec BUG-089), A8/A9/A9bis le 2026-09-28 (avec BUG-090), puis v2.33.0 → v2.39.0 : A6, A7, A13, A14, A15, A16, A17 (+ A11 déjà au CI) — backlog #153 terminé
- Analyse, risques et critères d'acceptation : features/xlsx-viewer.md
- Description : #152 (visionneuse XLSX, 2.27.0) lit et édite correctement la grille de
valeurs d'un
.xlsx, mais l'ensemble supporté est étroit : valeurs seulement (ni structure, ni styles en écriture, ni formule recalculée), écriture destructive d'une partie du classeur, tableurs invisibles à la recherche et inutilisables par l'IA au-delà de la création. Ce lot suit ces ajouts ; les cases ci-dessous sont le suivi de référence, la fiche feature porte le détail. - Constat (points de départ) :
MAX_ROWS = 500/MAX_COLS = 40sans indicateur (troncature silencieuse) ·wb.save()non atomique et sans verrou (concurrence) · saisie=…stockée comme formule par openpyxl (injection DDE) ·content=""à l'indexation (recherche TF-IDF et sémantique aveugles) · aucun outil IA de lecture/édition d'un classeur existant · aucun test frontend ni E2E sur le viewer. - Périmètre réel des pertes au round-trip (mesuré sur openpyxl 3.1.5, 2026-09-27) : graphiques, images, dessins et tableaux croisés sont préservés ; sont perdus les valeurs calculées en cache, slicers/chronologies, contrôles de formulaire, connexions/requêtes, custom XML, signature numérique, commentaires enrichis et macros.
- Sous-tâches :
- P0 — garde-fous d'écriture (🔴, 2-3 j) — 🟢 livré
- A1 Alerte de fidélité avant écriture :
inspect_workbook()→xlsx_lossy_features+ bandeau FR/EN + 409xlsx_lossy_contentsansforce(confirmation explicite puis reprise) — BUG-085 - A2 Écriture atomique (
wb.save(.tmp)+os.replace(), backup inchangé) — BUG-086 - A3 Verrou par fichier autour du read-modify-write (timeout 15 s + 409
conflict) — BUG-087 - A4 Neutralisation de l'injection de formule (
=/@stockés en texte, opt-inallow_formula+ boutonf(x)) — BUG-088
- A1 Alerte de fidélité avant écriture :
- P1 — recherche, IA, UX (🟡, 4-6 j) — 🟢 livré
- A5 Indexation du contenu des feuilles (noms de feuilles + 20 premières lignes, plafond 5 k caractères) — les mots tapés dans une cellule rendent le fichier trouvable ; au passage BUG-089 (reindex manuel ne reconstruisait pas l'index inversé)
- A6 Outils IA
update_xlsx_cells/append_xlsx_rows/xlsx_to_markdown/list_xlsx_sheets(v2.33.0) - A7 Navigation clavier + barre de formule + nom de cellule (Tab/Entrée/flèches) (v2.34.0)
- A8
theadsticky + bandeau « feuille tronquée » (lève la troncature silencieuse) — BUG-090 - A9 Chargement paresseux par feuille (
GET …/xlsx/sheet?offset&limit, défilement virtuel) - A10 Types & formats de saisie (nombre/texte, booléens
TRUE/FAUX, dates FRJJ/MM/AAAAjour-first) - A11 Tests frontend (
tests/frontend/xlsx-viewer.test.mjs) + E2E (tests/e2e/xlsx-viewer.spec.js) au CI (JSDOM dans le job lint depuis v2.31.0 ; spec E2E livrée avec A9bis) - A12 Valeur calculée affichée sous la formule (2ᵉ lecture
data_only=Trueseulement si l'archive contient un<v>, info-bulle FR/EN)
- P2 — étendu (🟢, 2-4 j) — 🟢 livré
- A13 Tri / filtre / recherche dans la feuille + export CSV de la sélection (v2.35.0)
- A14 CRUD de feuilles, lignes et colonnes (renommer, insérer, supprimer, dupliquer) (v2.36.0)
- A15 Styles minimaux + lecture fidèle (gras, fond, formats, fusions, volets figés) (v2.37.0)
- A16 Formats additionnels (
.xlsmaveckeep_vba,.xls/.odslecture seule via xlrd/odfpy,.csvéditable) (v2.38.0) - A17 Vue « tableau de bord » (plages nommées, TCD/graphiques, KPI par feuille, hint actions IA) (v2.39.0)
- P0 — garde-fous d'écriture (🔴, 2-3 j) — 🟢 livré
- Convention de suivi : chaque sous-tâche démarre par son ID stable (
#153-A<n>dans cette Roadmap) ; celles qui sont des défauts sont aussi ouvertes commeBUG-NNNdans ISSUES_TODOLIST.md (A1→BUG-085, A2→BUG-086, A3→BUG-087, A4→BUG-088 ; A8 le sera à son tour).
✅ Terminé — Refonte UI/UX tableur (P2)
154. Refonte UI/UX de la visionneuse & éditeur XLSX (ruban, grille, inspecteur)
- Effort : 6-9 jours (Lot 1 ✅ · Lot 2 · Lot 3 · Lot 4) | Impact : 🟡
- Statut : ✅ livré le 2026-09-29 (Lots 1 → 5, A1-A5) — ruban de commandes groupé, onglets
de feuilles permanents avec bouton « + », badges d'état lecture seule / formules non recalculées,
tokens de grille et affordances ; dialogues thémés
showConfirm/showPrompt, bandeau de conflit 409 non bloquant, indicateur dirty ; inspecteur droit repliable (tableau de bord + entrée Assistant IA, redimensionnable) ; undo/redo, chargement viaIntersectionObserver, ARIArole="grid"; extraction des unités sans état dansfrontend/js/xlsx/*. - Analyse, architecture cible et plan par lots : features/xlsx-ui-redesign.md
- Description : la visionneuse XLSX (#152/#153) est fonctionnelle mais peu conviviale :
commandes à plat sans hiérarchie, en-têtes de grille indistincts des cellules, états avancés
(tableau de bord, troncature, lecture seule, formules non recalculées, conflits) mal intégrés.
La refonte s'appuie sur les standards Excel/Google Sheets/Airtable sans renier la contrainte
vanilla JS, zéro framework, zéro build npm. - Sous-tâches :
- A1 Coquille : barre de commandes groupée, onglets feuilles permanents + « + », badges d'état, tokens de grille et affordances visuelles (Lot 1)
- A2 Dialogues thémés (modales + toasts) et feedback non bloquant des conflits 409 (Lot 2)
- A3 Inspecteur droit repliable : Tableau de bord + entrée Assistant IA (Lot 3)
- A4 Undo/redo, chargement via
IntersectionObserver, sémantique ARIA (Lot 4) - A5 Découpage
frontend/js/xlsx/*, lien dashboard → grille, inspecteur redimensionnable (Lot 5)
✅ Terminé — Ergonomie tableur
155. Ergonomie tableur — menu contextuel & sélection type Excel
- Effort : 2-4 jours | Impact : 🟡
- Statut : ✅ livré — 2026-09-29 (menu contextuel clic droit + appui long, sélection type Excel)
- Analyse, conception et critères : features/xlsx-context-menu.md
- Description : retours utilisateur après #154 — ajouter un menu contextuel (clic droit +
appui long tactile) sur les cellules et en-têtes, et aligner la sélection/curseur sur le
comportement d'Excel (plage par glisser,
Maj, sélection de ligne/colonne par en-tête). - Sous-tâches :
- A1 Menu contextuel thémé (clic droit + appui long) : insérer/supprimer ligne & colonne, trier, effacer le contenu
- A2 Sélection type Excel : plage (glisser /
Maj+clic/Maj+flèches), en-têtes ligne/colonne, curseur croix, zone Nom affichant la plage
✅ Terminé — Polish menus tableur
179. Éditeur tableur — icônes des menus & boutons, fermeture au focus, polish mobile
- Effort : 1-2 jours | Impact : 🟡
- Statut : ✅ livré le 2026-10-04 (v2.53.0) — ouvert le 2026-10-04
- Fiche : features/xlsx-menus-179.md
- Description : la grille (#155), les menus Structure/Mise en forme/Export
(#156-A8/A11/A14) et les boutons du ruban (#154) sont textuels et restent
ouverts quand le focus quitte le menu. Ajouter des icônes Lucide
représentatives, fermer tout menu à la perte de focus (clic extérieur,
focusout,Échap, défilement), naviguer au clavier dans le menu grille, et garantir des cibles tactiles ≥ 44 px + menus dans le viewport en mobile. - Sous-tâches :
- A1 Icônes des entrées du menu contextuel de la grille (+
item.icon) - A2 Icônes des menus Structure / Mise en forme / Export + boutons Enregistrer / « + » onglet
- A3 Fermeture à la perte de focus (helper partageable : extérieur,
focusout,Échap, scroll/resize) + navigation clavier du menu grille - A4 Polish mobile (44 px tactile, menus bornés au viewport) + tests
JSDOM + E2E
xlsx-viewer.spec.js
- A1 Icônes des entrées du menu contextuel de la grille (+
✅ Terminé — Ergonomie & grille du tableur
186. Création d'un fichier Excel depuis « Créer un fichier »
- Effort : 0,5 jour | Impact : 🟢
- Statut : ✅ livré le 2026-10-05 - ouvert le 2026-10-05
- Fiche : features/create-file-xlsx-186.md
- Description : l'éditeur Excel étant disponible, la modale « Créer un fichier » ne
proposait que des formats texte (
.md,.txt,.py,.js,.json,.yaml,.sh,.ps1) + Excalidraw : impossible de démarrer un classeur depuis l'UI. Il fallait passer par l'assistant IA (create_xlsx) ou déposer un fichier existant. - Sous-tâches :
- A1 Option Excel (.xlsx) dans la liste des types, et les 10 libellés du
<select>passés en i18n FR/EN (modal.ext_*) — ils étaient codés en dur - A2
create_file()backend : un.xlsxest une archive OPC, pas du texte — le classeur est construit avec openpyxl (une feuilleFeuille1) au lieu d'écrire la charge utile vide, sinon le fichier est illisible par la visionneuse - A3 Tests : non-régression pytest (
test_api_main.py— classeur relu par openpyxl et servi enis_xlsx), E2Exlsx-viewer.spec.js(option présente, création depuis le menu contextuel, ouverture dans la grille)
- A1 Option Excel (.xlsx) dans la liste des types, et les 10 libellés du
✅ Terminé — Assistant IA
187. Assistant IA — mode agent toujours actif, retrait du bouton toggle
- Effort : 0,5 jour | Impact : 🟢
- Statut : ✅ livré le 2026-10-07 (v2.53.2) — ouvert le 2026-10-06
- Description : le bouton « mode agent » du panneau (toggle persisté en
localStorage, défaut OFF) n'était plus protecteur : Deep Research et les
quick actions
agent: truebasculaient déjà le mode en silence. Un utilisateur pouvait donc voir l'assistant agir sans jamais avoir activé le bouton. Retiré au profit d'un agent toujours actif : toute requête texte part sur/api/ai/bookslm/agent(outils lire/lister/chercher/modifier ; les mutations gardent la confirmation two-step) ; les images seules restent sur/api/ai/bookslm/chat(endpoint multimodal, la boucle agent étant textuelle). - Sous-tâches :
- A1 Frontend : bouton header,
_agentMode, toggle/persistance et les auto-bascules (Deep Research, quick actions) supprimés ;_postChatroute texte→/agent, images→/chat; aide et i18n FR/EN mises à jour - A2 Optimisations requêtes AI :
/agentrésout désormais le provider comme/chat(avant :req.providerbrut transmis au provider adapter → moteur réel ≠ étiquette SSE) ; schémas d'outils mis en cache (~27 ms de pydantic économisés par requête agent/MCP) - A3 Tests :
ai.test.mjsadapté (100/100) ; non-régression pytest (test_bookslm.pyprovider résolu,test_tools.pycache sûr) ; ruff/mypy 0 erreur ; build + instance Docker locale à jour
- A1 Frontend : bouton header,
✅ Terminé — Barre de menus & grille du tableur
185. Tableur — barre de menus Google Sheets (10 menus), ruban Sheets, grille unie
- Effort : 1-2 jours | Impact : 🟡
- Statut : ✅ livré le 2026-10-08 (v2.54.0) — ouvert le 2026-10-05
- Fiche : features/xlsx-menus-185.md
- Description : l'éditeur n'avait aucune barre de menus (ni Fichier, ni Modifier, ni Affichage, ni Insertion, ni Format, ni Données, ni Outils, ni Gemini, ni Extensions, ni Aide) : beaucoup de fonctions n'étaient atteignables que par clic droit. Le ruban gardait un chromer bordersé qui ne ressemblait à rien et la grille n'était bordée qu'en bas avec une couleur quasi identique au fond des cellules — le quadrillage se lisait comme une tache.
- Sous-tâches :
- A1
frontend/js/xlsx/menus.js: les dix menus de Google Sheets, dans l'ordre et avec les libellés exacts (161 entrées) ; sections en accordéon ; le menu Fichier quitte la barre d'onglets pour la barre de menus en conservant ses identifiants, seul Enregistrer reste épinglé - A2 Majorité des fonctions câblées : Partager, Renommer, Corbeille, Historique, Détails ; Annuler/Rétablir/Couper/Copier/Coller, Collage spécial (valeurs), Supprimer, Tout sélectionner, Rechercher-et-remplacer ; Figer, Afficher (barre de formule / grille / en-têtes / tableau de bord), Zoom, Plein écran ; Lignes / Colonnes / Cellules, Lien, Commentaire, Fonction ; Nombre, Thème, B/I/U/S, Taille, Alignement, Retour ligne, Rotation, Couleurs alternées, Effacer ; Trier, Filtre, Plages nommées, Nettoyage (doublons / espaces), Diviser le texte en colonnes ; Autocomplétion, Accessibilité ; Gemini ; Aide, Mises à jour, Raccourcis, Signalement. Les 36 options absentes d'ObsiGate sont listées et le disent au clic
- A3 Ruban façon Sheets : boutons plats 30 × 30 sans chromer, survol discret, groupes par filets ; nouveau bouton grille piloté par le menu Affichage
- A4 Grille unie et visible : 1 px sur les quatre côtés de
chaque cellule (en-têtes compris) et un seul
--grid-borderdérivé du thème (color-mixtexte → surface) au lieu de--borderinvisible - Tests JSDOM (
xlsx-menus+xlsx-viewer), E2Exlsx-viewer.spec.js, i18n FR/EN (134 clésxlsx.m*/xlsx.mi_*)
- A1
184. Tableur — peinture de format, multi-lignes/colonnes, grille A→Z × 1000
- Effort : 1 jour | Impact : 🟡
- Statut : ✅ livré le 2026-10-08 (v2.54.0) — ouvert le 2026-10-05
- Fiche : features/xlsx-sheet-input-181.md (§8)
- Description : « Peindre le format » échouait quand la source n'avait pas de format propre ; il manquait la sélection de plusieurs lignes/colonnes depuis les marges ; la grille s'arrêtait aux dimensions réelles du fichier au lieu d'aller jusqu'à A → Z et 1000 lignes.
- Sous-tâches :
- A1 Peinture de format complète (toutes propriétés) + source sans format ⇒ réinitialisation de la cible ; fuite du handler annulé
- A2 Sélection multi-lignes / multi-colonnes par glissement sur les
marges et
Maj+clic ; le geste de redimensionnement garde la priorité - A3 Grille étendue à A → Z × 1000 lignes, cellules vides éditables, padding à l'activation de l'onglet, pas de doublons
- A4 Performance : index de cellules
findTd, court-circuits formule/styles, marqueurdata-wired
✅ Terminé — Panneau de couleurs du tableur
183. Panneau de sélection de couleurs façon Google Sheets (texte et fond)
- Effort : 0,5-1 jour | Impact : 🟡
- Statut : ✅ livré le 2026-10-08 (v2.54.0) — ouvert le 2026-10-05
- Fiche : features/xlsx-sheet-input-181.md (§7)
- Description : le sélecteur natif
<input type="color">du ruban et du menu Mise en forme est remplacé par un panneau conforme aux maquettes : Réinitialiser, palette 8 × 10, STANDARD, PERSONNALISÉ, pied de page. Un clic sur une pastille referme le panneau et applique la couleur. - Sous-tâches :
- A1 Module
frontend/js/xlsx/color-picker.js: palette 8 × 10 (8 gris puis 8 teintes × 9 nuances), sortie en#rrggbb - A2 Coche de sélection blanche/noire selon la luminance
- A3 Câblage ruban + menu Mise en forme, fermeture au clic, application sur cellule ou plage, réinitialisation, « + » / crayons vers le sélecteur natif
- A4 Chrome du panneau thémé (variables CSS), i18n FR/EN (21 clés), pied de page honnête (message explicite pour les fonctions absentes)
- A1 Module
✅ Terminé — Correctifs éditeur tableur
182. Tableur — désélection fiable & couleurs sur une plage
- Effort : 0,5 jour | Impact : 🟡
- Statut : ✅ livré le 2026-10-08 (v2.54.0) — ouvert le 2026-10-05
- Fiche : features/xlsx-sheet-input-181.md (§6)
- Description : suite de #181 — la sélection multiple se dessinait mais ne s'effaçait plus, et l'application d'une couleur de texte / de fond sur une plage paraissait inerte.
- Sous-tâches :
- A1 Le clic simple efface toujours la plage, sans dépendre de
l'événement
focus(cause :Maj+clic +preventDefault()figeait le focus, donc aucunfocusne partait au clic suivant) - A2 Après
Maj+clic, le focus suit la cellule cliquée ; la zone Nom affiche la plage après un glissement - A3 Couleurs de texte et de fond vérifiées sur les 3 chemins
(menu Mise en forme, nuanciers du ruban,
Maj+flèches et glissement) - A4 Pastille de couleur sur les nuanciers du ruban (retour visuel)
- A5 Contours de plage qui s'empilaient : le sélecteur de
nettoyage oubliait le
.des classes (querySelectorAll("xlsx-sel-top")cherche une balise) — rien n'était effacé, les encadrés restaient et s'ajoutaient à chaque changement de cellule. Même famille de faute sur les en-têtes reflétés - A6 Pendant la saisie, les flèches valident et déplacent la
sélection (au lieu de déplacer le curseur), comme Google Sheets ;
Alt+flèche garde le saut de ligne - Tests JSDOM
xlsx-viewer152/152 (+6), suites frontend vertes
- A1 Le clic simple efface toujours la plage, sans dépendre de
l'événement
✅ Terminé — Polish éditeur tableur (mise en page & thèmes)
181. Éditeur tableur — modèle de saisie Google Sheets (sélection ≠ édition) & écarts fonctionnels
- Effort : 1 jour (A1-A3) + inventaire des écarts (A4) | Impact : 🟡
- Statut : ✅ livré le 2026-10-08 (v2.54.0) — ouvert le 2026-10-05
- Fiche : features/xlsx-sheet-input-181.md
- Description : l'éditeur ne distingue pas sélectionner une cellule et
l'éditer : le curseur de texte est visible en permanence,
Entréevalide puis perd le focus, et l'indicateur de plage est discret. Aligner le modèle de saisie sur Google Sheets / Excel (A1-A3) et inventorier précisément ce qui manque encore face à un tableur de référence (A4) — le rapprochement exhaustif n'est pas réalisable en une tranche. - Sous-tâches :
- A1 Deux états distincts : sélection (clic / flèches, pas de
curseur via
caret-color: transparent, contour visible) et édition (double-clic en place, première frappe qui remplace,F2,Alt+flèche pour un saut de ligne,Échapqui restaure) - A2 Sélection multiple : glisser,
Maj+clic,Maj+flèches, avec contour de plage (.xlsx-sel-*sur les 4 bords réels) + en-têtesA/B… et1/2… reflétés - A3
Entréecontextuelle : en édition → valide et passe à la cellule du dessous ; en sélection → bascule en mode édition - A4 Inventaire des écarts vs Google Sheets / Excel et priorisation (P1 poignée de recopie / remplacer / validation de données / filtre auto / tri multi-critères ; P2 mise en forme conditionnelle / création de graphiques / TCD éditables / protection ; P3 analyse de données, historique, macros) — voir fiche
- Tests JSDOM (
xlsx-viewer146/146, +10 cas #181), suites frontend vertes, build + déploiement de l'instance Docker locale
- A1 Deux états distincts : sélection (clic / flèches, pas de
curseur via
180. Éditeur tableur — redimensionnement au curseur, grille thémée, menu Fichier & barre épinglée
- Effort : 1-2 jours | Impact : 🟡
- Statut : ✅ livré le 2026-10-08 (v2.54.0) — ouvert le 2026-10-05
- Fiche : features/xlsx-sheetbar-180.md
- Description : retours utilisateur après #179 — (1) le redimensionnement des
colonnes/lignes par les marges (
A, B, C…/1, 2, 3…) doit afficher un curseur iconique (col-resize/row-resize) quand le pointeur est sur le bord ; (2) la grille doit suivre le thème de l'utilisateur (15 thèmes × 4 modes + importés : tokens dérivés, plus de fond figé) ; (3) regrouper Télécharger / CSV / Exporter dans un menu Fichier en haut à droite, au niveau des onglets de feuilles, avec Enregistrer juste à côté ; (4) retirer l'indicateur « Formules calculées localement » ; (5) épingler la barre de boutons en haut, au bord de la marge, et étendre l'éditeur à la largeur de la page. - Sous-tâches :
- A1 Curseur de redimensionnement sur les marges d'en-têtes
(en-tête de bord miroité en ligne + classe de repaint
.xlsx-resize-col/row) - A2 Grille compatible tous thèmes (
--grid-*dérivés dansthemes.js, replis CSS, modes contraste élevé / sépia, menu Export sur--surface) - A3 Menu Fichier + Enregistrer au niveau des onglets (
.xlsx-sheetbar, identifiants des contrôles conservés) - A4 Retrait de l'indicateur de formules + barre épinglée pleine largeur
(
position: sticky,:has(.xlsx-viewer)en plein cadre) - Tests JSDOM (
xlsx-viewer136/136,xlsx-menus12/12), E2Exlsx-viewer.spec.js, i18n FR/EN, 8 tests réalignés sur l'application locale des écritures
- A1 Curseur de redimensionnement sur les marges d'en-têtes
(en-tête de bord miroité en ligne + classe de repaint
✅ Terminé — Navigation
158. Navigation — vue répertoire en onglet, filtres & tris, retour Home complet
- Effort : 1-2 jours | Impact : 🟡
- Statut : ✅ livré — 2026-10-02 (A1 onglet, A2 contenu/filtres/tris, A3 retour Home + BUG-100)
- Détail de conception : features/navigation-tab-158.md
- Description : la vue « chemin + Récents + fichiers du répertoire » (vault home) n'apparaît qu'en mode focus vault, disparaît dès qu'un fichier est ouvert, n'expose ni sous-répertoires ni filtres, et le clic sur le titre ne redonne pas la vraie page d'accueil (section Raccourcis & Astuces manquante, recherche/filtres non effacés).
- Sous-tâches :
- A1 — onglet de navigation. Tout clic sur un répertoire de l'arbre (en mode focus vault et en mode All) ouvre/actualise un onglet de navigation dédié, qui coexiste avec les onglets de fichiers ouverts. La ligne d'un vault dans l'arbre garde son rôle d'expansion ; la racine du vault s'atteint depuis la vue (fil d'Ariane, facette Vaults) ou le sélecteur de vault.
- A2 — contenu de la vue. Liste des sous-répertoires cliquables, panneau de facettes Vaults · Tags · Extensions (même mécanisme/visuel que la page de recherche), boutons de tri Pertinence / Date et bouton Sauver.
- A3 — retour Home complet. Clic sur le titre = page d'accueil d'un refresh (section Raccourcis & Astuces restaurée) + effacement de la recherche globale et de la barre de filtre de la sidebar gauche.
- A4 — onglet Accueil. Le clic sur le titre affiche la page d'accueil dans un onglet (icône Maison) épinglé en tête de barre, réactivable à tout moment.
- A5 — menus contextuels de la page de navigation. Clic droit identique à la sidebar sur les répertoires et les fichiers de la vue ; la ligne d'un vault dans l'arbre ouvre la page de navigation (racine du vault).
- A6 — icône des répertoires de la section Répertoires à la couleur de l'arbre
(
var(--accent)).
✅ Terminé — Tableur Excel (complétude)
156. Éditeur Excel — complétude fonctionnelle (presse-papiers, mise en forme, calcul, robustesse)
- Effort : 15-22 jours (P0 2-3 j ✅ · P1 4-6 j ✅ · P2 5-7 j ✅ · P3 4-6 j ✅) | Impact : 🟡
- Statut : ✅ livré le 2026-09-30 — P0 (4 défauts BUG-096 → BUG-099 corrigés),
P1 (A5-A7 : presse-papiers de plage, clavier complet, zone Nom éditable), P2
(A8 mise en forme en écriture, A9 décision « pas de moteur de formule, annoncée dans
l'UI », A10 undo/redo unifié conservé au re-rendu) et P3 (A11 export sélection/
Markdown/HTML/impression + recherche multi-feuilles, A12 concurrence optimiste
If-Match, A13 cache des métadonnées, A14 outils IA.xlsm/.csv+ recherche/analyse/structure) - Analyse, défauts, risques et critères d'acceptation : features/xlsx-editor-completeness.md
- Description : #153 a rendu l'éditeur correct sur la grille de valeurs, #154/#155 l'ont rendu convivial (ruban, inspecteur, undo/redo des cellules, sélection et menu contextuel type Excel). Il reste l'écart avec un vrai éditeur tableur : coller une plage, écrire la mise en forme, calculer, sortir le résultat, et détecter un écrivain concurrent. La fiche porte l'audit ; les cases ci-dessous sont le suivi de référence.
- Défauts corrigés le 2026-09-29 (cf. ISSUES_TODOLIST.md) :
- ✅ BUG-096 — enregistrer un
.csvdepuis la visionneuse levait unTypeError(sheet: sheets[…].namealors qu'un CSV n'a pas dexlsx_sheets) : aucunPUT …/csv/saven'était émis (reproduit en JSDOM, corrigé + test) ; - ✅ BUG-097 — feuille
.xlsmtronquée : « Charger la suite » échouait en 415 —GET …/xlsx/sheetaccepte désormais.xlsxet.xlsm; - ✅ BUG-098 — délimiteur CSV détecté (
;/,/tabulation) et réutilisé à l'écriture : un CSV français s'affiche en colonnes et le reste après édition ; - ✅ BUG-099 — sonde de perte par feuille + signal
cached_values_unverifiedquand le budget est épuisé : plus de perte silencieuse possible des valeurs calculées.
- ✅ BUG-096 — enregistrer un
- Sous-tâches :
- P0 — défauts (🔴, 2-3 j) — ✅ livré le 2026-09-29
- A1 Sauvegarde
.csvdepuis la visionneuse — BUG-096 (test JSDOM :PUT …/csv/saveémis) - A2 Chargement paresseux des
.xlsm— BUG-097 (GET …/xlsx/sheetaccepte.xlsx/.xlsm) - A3 Délimiteur CSV détecté et réutilisé à l'écriture — BUG-098 (
sniff_csv_delimiter) - A4 Sonde de perte par feuille + signal
cached_values_unverified— BUG-099
- A1 Sauvegarde
- P1 — presse-papiers & clavier (🟡, 4-6 j) — ✅ livré le 2026-09-29
- A5 Presse-papiers de plage — copier/couper/coller un bloc TSV (
Ctrl+C/Ctrl+X/Ctrl+V, menu contextuel), presse-papiers interne + système, remplissage multi-cellules (tests JSDOM :A1:B2→D5:E6) - A6 Clavier complet —
Ctrl+S,Ctrl+A,Suppr,F2,Ctrl+Home/End,Home/End,PgUp/PgDn,Ctrl+flèches,Maj+Entrée(saut de ligne en cellule) - A7 Zone Nom éditable (« Atteindre » :
B12,A1:B3,Feuille!A1) + aide à la saisie des fonctions
- A5 Presse-papiers de plage — copier/couper/coller un bloc TSV (
- P2 — mise en forme, calcul, undo (🟡, 5-7 j) — ✅ livré le 2026-09-30
- A8 Mise en forme en écriture — bouton Mise en forme (gras/italique/souligné, alignements, couleurs, formats de nombre, fusions, volets figés, largeur/hauteur) via
PUT …/xlsx/style(verrou, backup, garde de perte,If-Match) - A9 Calcul — décision documentée : pas de moteur de formule, l'enregistrement annonce « enregistrée comme texte » (la garde anti-DDE reste)
- A10 Undo/redo unifié (cellules, effacement, tri/filtre, structure) et conservé au re-rendu (
_xlsxHistorypar fichier)
- A8 Mise en forme en écriture — bouton Mise en forme (gras/italique/souligné, alignements, couleurs, formats de nombre, fusions, volets figés, largeur/hauteur) via
- P3 — sortie, robustesse, performances (🟢, 4-6 j) — ✅ livré le 2026-09-30
- A11 Sortie & recherche : export de la sélection / Markdown / HTML / impression, recherche sur toutes les feuilles (compteur
n/m · k feuilles) - A12 Concurrence optimiste inter-processus (
ETag/If-Match, 409 réparable, bouton « Réessayer » qui relit) - A13 Performances : cache des métadonnées par
(chemin, mtime, taille)(LRU 8), invalidé à chaque écriture (axe des colonnes >MAX_COLS: hors périmètre) - A14 Outils IA étendus —
.xlsm/.csvacceptés,search_workbook,analyze_range,edit_xlsx_structure
- A11 Sortie & recherche : export de la sélection / Markdown / HTML / impression, recherche sur toutes les feuilles (compteur
- P0 — défauts (🔴, 2-3 j) — ✅ livré le 2026-09-29
✅ Terminé — Secrets masqués
188. Secrets masqués — couverture universelle des clés API & mots de passe + clic pour copier
- Effort : 1 jour | Impact : 🟡
- Statut : ✅ livré le 2026-10-08 — ouvert le 2026-10-08
- Fiche : features/secret-mask-188.md
- Description : le redacteur (
secret_redactor.py) ne couvrait que les JWT, cléssk-/AKIA/ghp_, connection strings et affectationskey=valuede 20+ caractères — la plupart des clés API réelles et tous les mots de passe courts passaient en clair dans l'aperçu markdown, et un masque affiché n'était pas récupérable sans ouvrir la source. #188 couvre la majorité des formats de clés, masque les mots de passe quelle que soit leur longueur et rend chaque masque cliquable dans l'aperçu authentifié (copie dans le presse-papiers) sans jamais exposer la valeur à l'extérieur (partages, PDF, IA/MCP). - Sous-tâches :
- A1 Détection universelle : table de formats fournisseur (OpenAI,
Stripe, GitLab, GitHub, Google, AWS, Slack, SendGrid, Hugging Face,
npm, Docker, Resend, Square, Atlassian, Discord, Telegram,
Bearer …) + plancher des affectations génériques 20 → 8 caractères - A2 Mots de passe :
[MOT DE PASSE MASQUÉ]toute longueur / quote (password=,"passwd":,db_password=,mot de passe=) ;PWD=shell épargné - A3 Clic → copie : placeholders markdown-safe (blocs de code
compris) réécrits en
<span class="secret-mask" data-secret>côté aperçu authentifié (listener délégué, toast + infobulle i18n FR/EN) ; libellé seul pour partages / PDF / IA / MCP ; code masqué non re-coloré (highlight.js perdrait le badge) - A4 Guide in-app FR/EN,
GUIDES/AUTHENTIFICATION_SECURITE.md, README FR/EN, testsTestSecretRedactor(+33)
- A1 Détection universelle : table de formats fournisseur (OpenAI,
Stripe, GitLab, GitHub, Google, AWS, Slack, SendGrid, Hugging Face,
npm, Docker, Resend, Square, Atlassian, Discord, Telegram,
✅ Terminé — Mise en page mobile du tableur
189. Tableur — mise en page mobile (barres repliées, grille prioritaire)
- Effort : 0,5-1 jour | Impact : 🟡 | Framework : CSS vanilla +
frontend/js/viewer.js - Statut : ✅ livré le 2026-10-08 — ouvert le 2026-10-08
- Fiche : features/xlsx-mobile-layout-189.md
- Description : sur mobile, la barre de menus + le ruban + la barre de
formule s'empilaient et occupaient plus de 50 % de la hauteur d'écran.
Sous 768 px,
.xlsx-menubar,.xlsx-cmdbaret le groupe Recherche sont repliés par défaut (la barre de formule fx et les onglets restent visibles) et un bouton unique#xlsx-tools-toggledans la barre des feuilles déplie/replie l'ensemble (aria-expanded, état actif) — desktop inchangé (bouton masqué). - Sous-tâches :
- A1 Repli CSS par défaut ≤ 768 px + révélation via
.xlsx-toolbar.xlsx-tools-open(menubar, ruban, Recherche) - A2 Bascule
#xlsx-tools-toggledans.xlsx-sheetbar(aria-expanded+ classeactive+ i18nxlsx.tools_toggleFR/EN) - A3 Tactile : cibles ≥ 44 px, onglets en défilement horizontal, champs de la barre de formule en 16 px (anti-zoom iOS), barre de formule en 2 lignes quand les outils sont ouverts
- A4 Tests : JSDOM
xlsx-viewer.test.mjs(+2, 165/165) et E2E mobile (repli par défaut, dépliage, no-overflow ruban, 44 px) ;openXlsx()déplie automatiquement ≤ 768 px pour les tests desktop
- A1 Repli CSS par défaut ≤ 768 px + révélation via
⚪ Backlog — Priorité 4 (P4)
73. Synchronisation multi-appareils — Obsidian Sync compatible
- Effort : 6-8 jours | Impact : 🟢
- Décision 2026-09-26 : reporté (P4) — axe prioritaire = dette & sécurité (#85/#87) ; #73 hors chemin critique. Si réactivé : partir d'un MVP export/hash/LWW adossé à #59 (PWA offline) + #62 (collab Yjs/CRDT) plutôt qu'un protocole parallèle.
- Périmètre élargi le 2026-10-04 (liste v1.2 Ph.3) : la synchronisation des favoris
(répertoires compris, cf. #161) et la synchronisation des préférences utilisateur (thèmes
#65/#174, langue, historique de recherche et de modifications, recherches sauvegardées #162) sont
fusionnées dans cet item plutôt que portées par des items séparés — même API de sync, même
résolution de conflits. Store local actuel : JSON par utilisateur dans
data/(pas de tableuser_preferencesdistincte ; un addendum de schéma suffirait si #73 est réactivé). - Description : Synchronisation des vaults entre plusieurs instances d'ObsiGate via un protocole de synchronisation décentralisé ou compatible Obsidian Sync. Alternative self-hosted à Obsidian Sync.
- Sous-tâches :
- Protocole : évaluation CRDT vs OT vs diff/patch pour fichiers markdown
- Transport : WebSocket ou polling HTTPS avec compression
- Merge strategy : LWW (Last Writer Wins) avec historique des deux versions
- Détection de changements : hash SHA-256 par fichier, journal des modifications
- UI : page « Synchronisation » avec statut par appareil, historique des syncs
- Conflits : UI de résolution manuelle (diff côte à côte entre version locale et distante)
- Chiffrement : optionnel, chiffrement AES-256-GCM avant transmission
- Pairing : échange de clé publique + code QR pour appairage des appareils
- Périmètre v1.2 : sync des favoris (#161) et des préférences (thème, langue, historique, recherches sauvegardées) avec résolution de conflits (priorité à la dernière modification) + indicateur « préférences synchronisées »
⚪ Backlog — Sécurité, architecture & performance (P0/P1)
87. Amélioration continue — tests, CI/CD, revues de sécurité (phase 4)
- Effort : 3-5 jours | Impact : 🟡 | Zone :
.gitea/workflows/,tests/ - Décision 2026-09-26 : prioritaire (axe Dette & sécurité).
- Statut : 🔵 en cours depuis 2026-09-26 — par tranches. T1 livrée (v2.28.1) : bandit bloquant (
nosecjustifiés B324/B404/B603/B607/B406, B105 exclu commepyproject),npm auditbloquant (0 vulnérabilité), 5 suites frontend intégrées au CI (upload,pretty,media-viewer,mfa-settings,config-ai-keys). pip-audit reste consultatif (montées starlette/weasyprint à qualifier). - T6 livrée (v2.28.15) : dépendances qualifiées — mistune 3.3.3, python-multipart 0.0.31, weasyprint 70, mcp 1.28.1, fastapi 0.141.1 + starlette 1.7.0, setuptools 84 (
castmistune 3 sites) — suite 1359 passed, ruff/mypy 0,pip-auditbloquant, 0 vulnérabilité (seule exception documentée : PYSEC-2026-1325 ecdsa, sans correctif upstream, JWT HS256 uniquement). - T7 livrée (v2.28.15) : semgrep bloquant sur ruleset 100 % local
semgrep-rules/(8 règles, 0 finding, contrôle négatif OK) ; trivy écarté (binaire + DB réseau, couche Python couverte). - T8 livrée (v2.28.15, fin BUG-034) : cookies
Secureauto (true|false|auto,X-Forwarded-ProtosousTRUST_PROXY, warning affiné,TRUST_PROXY=trueen prod) ;CORSMiddlewaresame-origin explicite ;style-src 'unsafe-inline'conservé assumé (189style=+ 343el.style, T5c ayant verrouilléscript-src). - Description : renforcer le pipeline (
.gitea/workflows/ci.yml,desktop-build.yml) pour le rendre bloquant par défaut et accompagner les phases 1 → 3. Constat 2026-09-26 : jobsecuritynon bloquant (bandit/pip-auditen|| echo, ni semgrep ni trivy), E2E limité àchromium-desktop, 5 suites frontend hors CI. - Sous-tâches :
- Jobs CI sécurité bloquants (bandit/semgrep/trivy, audits pip/npm) + tests E2E XSS (page de partage + lecteur markdown) — T4 livrée :
tests/e2e/xss.spec.js(BUG-021/022, 2/2 vert) +scripts/e2e-server.ps1(cycle de vie serveur E2E avec progressionstart|stop|status|logs) + validation locale projetchromium-desktop: 108/108 verts (obsigate 44, split 37, viewers 24, xss/header 3), mobiles ciblés 10/10 - Tests de concurrence (
users.json), fuzzing de timing regex, couverture des composants critiques ; intégrer au CI les 5 suites frontend hors CI (upload,pretty,media-viewer,mfa-settings,config-ai-keys) — T2 livrée (v2.28.2) :tests/test_hardening_concurrency.py(users.json concurrent + budget temps regex) ; 5 suites au CI (T1) - Finir BUG-034 (migration CSP nonce, conversion des handlers inline),
Securecookies àtruepar défaut, politique CORS same-origin explicite ; confirmer la rotation de la clé DeepSeek (BUG-006, clé dans l'historique Git) — T3 livrée (v2.28.3) (helper + avertissement + CORS attesté) ; T5a livrée (v2.28.6) (16 handlers inline → listeners, CSP inchangée) ; T5b livrée : nonce frais par réponse (backend/csp.py,script-src), injection dans les 6 pages HTML (dont nouvelle route/excalidraw-editor.html),unsafe-inlineconservé (inerte) ; T5c livrée (v2.28.13) (script-srcsansunsafe-inline) ; T8 livrée (v2.28.15) (fin BUG-034 : Secure auto + CORS explicite ;style-srcrésiduel assumé ; rotation DeepSeek BUG-006 toujours côté utilisateur) - Revue périodique des dépendances ; documentation utilisateur FR/EN synchronisée ; contrôle automatisé de la conformité au DoD — T6/T9 livrées (v2.28.15) (
pip-audit0,npm audit0, locales FR/EN 2213 clés parité testéetest_i18n_parity.py, gardestest_version.py+test_ci_workflow.py) - Revue périodique des dépendances ; documentation utilisateur FR/EN synchronisée ; contrôle automatisé de la conformité au DoD
- Jobs CI sécurité bloquants (bandit/semgrep/trivy, audits pip/npm) + tests E2E XSS (page de partage + lecteur markdown) — T4 livrée :
⚪ Backlog — Améliorations produit & évolutions agent IA (liste v1.2) — P1/P2
Ouvert le 2026-10-04 à partir de la liste « Roadmap ObsiGate – Développement des Fonctionnalités » v1.2 (phases 1-3 + suggestions agent IA numérotées 161-180 dans la liste source). Évaluation croisée avec le code réel (2026-10-04) : 7 propositions sont déjà livrées et n'ouvrent donc pas d'ID ; seul le périmètre manquant reçoit un ID ObsiGate stable
#161→#178. Les numéros de la liste source ne sont pas repris tels quels (règle du dépôt : un ID n'est jamais attribué à du déjà-fait ni réutilisé). Chaque item doit passer par DELIVERY_WORKFLOW.md (DoD) à son ouverture.
Table de correspondance (liste v1.2 → ObsiGate)
| Proposition v1.2 | Verdict 2026-10-04 (vérifié dans le code) | ID ObsiGate |
|---|---|---|
| Ph.1 — Sauvegarde des recherches fréquentes | Sauvegarde déjà livrée (backend/saved_searches.py, store data/{user}_saved_searches.json, bouton « Sauver » #158) ; fréquence & rappels manquants |
⚪ #162 |
| Ph.1 — Liens de répertoires aux favoris | Marque-page existant sur fichiers uniquement (dashboard) ; répertoires absents | ⚪ #161 |
| Ph.1 — Recherche dans la page | Déjà livrée en vue lecture (FindInPageManager, Ctrl+F + navigation + regex, tableur via #153-A13) ; reste l'intégration Forge |
⚪ #163 |
| Ph.2 — Auto-complétion intelligente | Déjà livrée (frontend/js/autocomplete.js : Mermaid, code fence, frontmatter, wikilinks, table — partagé Forge/CodeMirror) |
✅ |
| Ph.2 — Suggestions contextuelles (historique & préférences) | Non livré | ⚪ #164 |
| Ph.3 — Synchronisation favoris + préférences multiplateforme | Fusionné dans le périmètre de #73 (reporté P4, décision 2026-09-26) | ⚪ #73 |
| 161 — Synchronisation Git automatique des vaults | Non livré (les outils git_* #92 ciblent Gitea/GitHub pour l'IA, pas la sync de vault) |
⚪ #165 |
| 162 — Génération de résumés automatiques | Déjà livrée (POST /api/ai/summarize, actions instantanées #106, skills backend/skills.py) |
✅ |
| 163 — Détection & fusion de doublons | Non livré (brique embeddings/TF-IDF #70 disponible) | ⚪ #166 |
| 164 — Traduction automatique | Déjà livrée (toolbar IA « Traduire », #106) | ✅ |
| 165 — Analyse de ton/style | Déjà livrée (toolbar IA « Ton », #106) | ✅ |
| 166 — APIs tierces (Google Drive, Notion) | Partiel : sources connectées Gitea/GitHub livrées (#103, backend/tools/connected.py) ; Drive/Notion manquants |
⚪ #167 |
| 167 — Notifications externes (Slack, Discord, Email) | Partiel : webhooks #9 + Push API #67 livrés ; canaux Slack/Discord/SMTP et choix des déclencheurs à câbler | ⚪ #168 |
| 168 — Édition collaborative temps réel | Déjà livrée (#62 — Yjs/CRDT, WebSocket, awareness, v2.3.0) | ✅ |
| 169 — Scripts personnalisés sandboxés | Déjà livrée (#61 — plugins en sandbox Web Worker, hooks, 9 endpoints, v2.2.0) | ✅ |
| 170 — Planification de tâches automatiques (cron) | Non livré | ⚪ #170 |
| 171 — Audit des accès | Partiel : backend/audit.py + /api/admin/audit + dashboard admin #71 existent ; historique par fichier, filtres avancés et export CSV manquants |
⚪ #171 |
| 172 — Chiffrement/déchiffrement de fichiers | Non livré (AES-GCM interne réservé aux tokens) | ⚪ #172 |
| 173 — Vues personnalisées (Kanban, Calendrier) | Non livré | ⚪ #173 |
| 174 — Optimisation mobile | Base largement livrée (#69 éditeur mobile, #83 ruban mobile, #114 config responsive 44 px) ; reste un audit du solde | ⚪ #178 |
| 175 — Chat intégré | Livré le 2026-10-08 (SSE, panneau latéral, historique, toast) | ✅ #169 |
| 176 — Thèmes dynamiques (règles heure/date) | Base livrée (#65 thèmes + import/export) ; règles automatiques manquantes | ⚪ #174 |
| 177 — Export formats propriétaires (OneNote, Evernote) | Base livrée (#66 HTML/MD bundle/ePub + PDF #74) ; formats tiers manquants | ⚪ #175 |
| 178 — Webhooks pour événements | Déjà livrée (#9 — backend/webhooks.py, événements + secrets + validation d'URL SSRF-safe) |
✅ |
| 179 — Gestion fine des permissions | Non livré (ACLs par vault/dossier racine seulement) | ⚪ #176 |
| 180 — Historique des révisions visuel | Partiel : gestion des backups avec diff livrée (#40-46, outil IA diff_backup) ; UI côte à côte manquante |
⚪ #177 |
161. Favoris — répertoires et liens de vault (menu contextuel)
- Effort : 0,5-1 jour | Impact : 🟡 | Ouvert : 2026-10-04 | Statut : ⚪ non commencé
- Description : le marque-page actuel ne couvre que les fichiers ; ajouter les répertoires aux favoris (proposition « liens de répertoires », liste v1.2 Ph.1).
- Sous-tâches :
- Étendre le modèle de favoris aux répertoires (vérification d'accès backend via
_resolve_safe_path(), permissions) - Entrée « Ajouter aux favoris » dans le menu contextuel de l'arbre et de la page de navigation (#158-A5)
- Section « Favoris » dans la sidebar (répertoires + fichiers)
- i18n FR/EN, tests (unit + E2E si UI), fiche
docs/features/
- Étendre le modèle de favoris aux répertoires (vérification d'accès backend via
162. Recherches fréquentes — fréquence d'utilisation & rappels
- Effort : 1-2 jours | Impact : 🟢 | Ouvert : 2026-10-04 | Statut : ⚪ non commencé
- Cadrage : la sauvegarde des recherches existe déjà (
backend/saved_searches.py, bouton « Sauver » de #158). Cet item n'ouvre que l'incrément manquant de la liste v1.2 Ph.1. - Sous-tâches :
- Compteur d'utilisation par recherche sauvegardée (horodatage + fréquence)
- Section dédiée « Recherches fréquentes » (page de résultats + sidebar) et épinglage
- Rappel optionnel (« Vous avez souvent cherché X ») via notifications #67, interruptible en Configuration
- i18n FR/EN + tests
163. Recherche dans la page — éditeur Forge
- Effort : 0,5-1 jour | Impact : 🟡 | Ouvert : 2026-10-04 | Statut : ⚪ non commencé
- Cadrage :
FindInPageManager(Ctrl+F, surbrillance, navigation ↑/↓, casse / mot entier / regex) est livré pour la vue lecture ; le tableur a sa propre recherche (#153-A13). Reste à raccorder la recherche à l'éditeur Forge et à l'exposer en commande/. - Sous-tâches :
- Raccorder
FindInPageManagerà Forge (textarea et CodeMirror) : surbrillance dans le contenu édité, navigation avec boucle, conservation du curseur - Commande
/recherche-dans-page(mécanisme de commandes #81) - Non-régression des raccourcis existants (Ctrl+F vs recherche globale, Échap) ; i18n ; tests JSDOM + E2E
- Raccorder
164. Suggestions contextuelles dans l'éditeur (historique & préférences)
- Effort : 3-5 jours | Impact : 🟢 | Ouvert : 2026-10-04 | Statut : ⚪ non commencé
- Cadrage : l'auto-complétion contextuelle (Mermaid, code, Markdown, wikilinks, frontmatter)
est déjà livrée (
frontend/js/autocomplete.js) — la proposition v1.2 Ph.2 « Auto-complétion intelligente » est couverte. Cet item n'ouvre que les suggestions apprises du contexte utilisateur. - Sous-tâches :
- Mesure locale des snippets les plus utilisés par l'utilisateur (fréquence, sans cloud)
- Suggestions basées sur l'historique de modification (termes récurrents, patterns du type « souvent inséré après … ») — option locale, IA légère si disponible
- Bascule on/off en Configuration ; intégration à la complétion existante
- i18n FR/EN + tests
⚪ Évolutions agent IA (liste v1.2 « Phase 4 », IDs ObsiGate #165 → #178)
| ID | Fonctionnalité | Effort | Impact | Dépendances / socle à étendre |
|---|---|---|---|---|
| 165 | Synchronisation automatique des vaults avec Git (add/commit/push/pull, résolution de conflits, auth SSH/token, option planification X heures) | 4-6 j | 🟡 | subprocess/gitpython ; UI dans Configuration (#160) ; distinct des outils git_* #92 (IA, Gitea/GitHub) |
| 166 | Détection & fusion de doublons (score de similarité, liste des paires potentielles, outil de fusion) — ✅ livré le 2026-10-04 (fiche) | 3-4 j | 🟢 | embeddings/TF-IDF #70 ; jamais de fusion sans confirmation explicite (+ backup préalable) |
| 167 | Connexions tierces — Google Drive & Notion (import/export, OAuth2, respect des quotas) | 5-7 j | 🟡 | page « sources connectées » #103 ; rate-limit existant |
| 168 | Notifications externes — canaux Slack/Discord (webhooks) et Email (SMTP) + choix des déclencheurs — ✅ livré le 2026-10-04 (fiche ; périmètre : Discord, Telegram, SMTP, webhook générique — Slack via webhook générique) | 3-4 j | 🟢 | backend/webhooks.py #9 ; Push API #67 |
| 169 | Chat intégré par fichier (panneau latéral, historique, notifications de nouveaux messages) — ✅ livré le 2026-10-08 (fiche ; transport SSE #62, pas de 2ᵉ WebSocket) | 3-4 j | 🟢 | transport SSE #62 |
| 170 | Planification de tâches automatiques (type cron ; actions = outils existants create_file/append_to_file ; notifications d'échec) — ✅ livré le 2026-10-04 (fiche ; tick asyncio 60 s, API + outils, sans UI dédiée) |
3-4 j | 🟢 | scheduler backend (APScheduler ou asyncio) ; UI de création de tâches |
| 171 | Audit des accès — extension : historique lecture/édition par fichier, filtres (utilisateur/fichier/date), export CSV | 2-3 j | 🟡 | backend/audit.py + /api/admin/audit (#71) |
| 172 | Chiffrement/déchiffrement de fichiers sensibles (AES-256-GCM, gestion de clés, confirmation) | 3-4 j | 🟡 | backup automatique préalable ; clés hors dépôt (jamais de secret committé) |
| 173 | Vues personnalisées Kanban & Calendrier (glisser-déposer, colonnes/date par tags & métadonnées) | 5-6 j | 🟢 | facettes/tags #157-#158 ; store JSON par utilisateur (pattern data/*.json) |
| 174 | Thèmes dynamiques (règles heure/date, ex. mode sombre 18h-8h, règles personnalisables) | 2-3 j | 🟢 | thèmes #65 ; préférence persistée (candidate à la sync #73) |
| 175 | Export vers formats propriétaires (OneNote, Evernote) avec conservation des métadonnées (tags, liens, images) | 3-4 j | 🟢 | export.py #66 (HTML/MD bundle/ePub) + PDF #74 |
| 176 | Permissions fines par fichier/dossier (utilisateur/groupe + actions, héritage, journal des changements) | 4-5 j | 🟡 | ACLs vaults/dossiers existantes ; passerelle obligatoire par _resolve_safe_path() |
| 177 | Historique des révisions visuel (diff côte à côte, surlignage ajouts/suppressions, navigation Précédent/Suivant) | 3-4 j | 🟢 | backups + diff #40-46 (diff_backup) ; difflib backend |
| 178 | Optimisation mobile — solde (audit cibles tactiles ≥ 44 px, lazy-loading images/médias, raccourcis clavier virtuel) | 4-5 j | 🟡 | base livrée #69/#83/#114 ; lazy-loading déjà partiel (#153-A9) |
- Critères d'acceptation transverses (liste v1.2 harmonisée avec la DoD du dépôt) : test
desktop et mobile ; documentation utilisateur FR/EN dans
docs/GUIDES/(l'appel « Guide_MCP_ObsiGate.md » de la liste source est ramené à la cartographie documentaire du dépôt) ; backup automatique avant toute modification destructive ; i18n FR/EN systématique ; passage de l'ID à « en cours » avant codage (AGENTS.md, « Avant de commencer »).
✅ Complété — index
Détail complet dans docs/archive/COMPLETED_v1-v2.md et docs/features/. Cette table est la seule source de navigation ; ne pas re-détailler les items livrés ici.
| # | Domaine / fonctionnalité | Version | Détails |
|---|---|---|---|
| 152 | Viewer XLSX — affichage multi-feuilles, édition des cellules, téléchargement | 2.27.0 | archive |
| 154 | Tableur — Refonte UI/UX (ruban groupé, onglets permanents, badges d'état, inspecteur droit, undo/redo) | 2.40.0→2.43.1 | features/xlsx-ui-redesign.md |
| 155 | Tableur — Menu contextuel (clic droit / appui long) & sélection type Excel | 2.44.0 | features/xlsx-context-menu.md |
| 156 | Tableur — Complétude éditeur : presse-papiers/clavier (A5-A7), mise en forme (A8), décision calcul (A9), undo unifié (A10), export + recherche multi-feuilles (A11), concurrence optimiste (A12), cache méta (A13), outils IA .xlsm/.csv (A14) + BUG-096 → BUG-099 |
2.45.0 | features/xlsx-editor-completeness.md |
| 179 | Tableur — icônes des menus & boutons, fermeture au focus, polish mobile | 2.53.0 | features/xlsx-menus-179.md |
| 180 | Tableur — redimensionnement au curseur, grille thémée, menu Fichier, barre épinglée | 2.54.0 | features/xlsx-sheetbar-180.md |
| 181 | Tableur — modèle de saisie Google Sheets (sélection ≠ édition) & inventaire des écarts | 2.54.0 | features/xlsx-sheet-input-181.md |
| 182 | Tableur — désélection fiable, contours non empilés, couleurs sur une plage | 2.54.0 | features/xlsx-sheet-input-181.md |
| 183 | Tableur — panneau de couleurs façon Google Sheets (texte et fond) | 2.54.0 | features/xlsx-sheet-input-181.md |
| 184 | Tableur — peinture de format complète, multi-lignes/colonnes, grille A → Z × 1000 (croissance par blocs) | 2.54.0 | features/xlsx-sheet-input-181.md |
| 185 | Tableur — barre de menus Google Sheets (10 menus), ruban Sheets, grille unie | 2.54.0 | features/xlsx-menus-185.md |
| 186 | Création d'un fichier Excel (.xlsx) depuis la modale « Créer un fichier » |
2.54.0 | features/create-file-xlsx-186.md |
| 188 | Secrets — détection universelle des clés API & mots de passe, masque cliquable (clic = copie) | Unreleased | features/secret-mask-188.md |
| 189 | Tableur — mise en page mobile : barres repliées par défaut, bascule unique, cibles tactiles 44 px | 2.56.0 | features/xlsx-mobile-layout-189.md |
| 169 | Chat intégré par fichier (panneau latéral, historique, temps réel SSE, toast de notification) | 2.57.0 | features/file-chat-169.md |
| 159 | Desktop — gestion des vaults & dossiers : retrait par menu contextuel + section Configuration (ajout vault/dossier racine) | 2.50.0 | features/desktop-tauri.md |
| 160 | Desktop — premier lancement professionnel (répertoire %USERPROFILE%\ObsiGate + Prise en main.md) et section Configuration harmonisée |
2.51.0 | features/desktop-tauri.md |
| BUG-047 | Versionnage — source unique VERSION + bump SemVer automatique au commit (hooks + tag) |
2.3.0 | DEVELOPMENT_AND_RELEASES.md |
| 90 | Barre d'actions du document — regroupement fonctionnel + spacers | 2.3.0 | archive |
| 89 | Drag & drop complet de fichiers/dossiers & intégration Assistant IA | 2.3.0 | features/drag-and-drop-ai.md |
| 1–8 | Fondations (FastAPI, TF-IDF + stemming, watchdog, SPA, sécurité, path traversal, gzip, PWA) | 1.0.0→1.4.0 | archive |
| 9–20 | UX & productivité (share, webhooks, dashboard, conflits, backlinks, redaction, backups, graphe, header, aperçu) | 1.5.0→1.6.0 | archive |
| 21–22 | Architecture (split app.js → 16 modules, validateur imports CI) |
1.5.1 | archive |
| 23–25 | CI/CD & qualité (Gitea Actions, Ruff/Mypy/Bandit/Pip-audit, pytest) | 1.6.0 | archive |
| 26–29 | AI Editor (toolbar, multi-provider, 16 endpoints, auto-save) | 1.7.0 | archive |
| 30–39 | Fonctionnalités avancées (export PDF, palette, mobile, drag & drop, filtres, indexation non-bloquante) | 1.8.0→1.9.0 | archive |
| 40–46 | Gestion des backups (diff, gestionnaire, purge, auto, rétention) | 1.9.0 | archive |
| 47–57 | Mermaid.js (22 templates, live preview, thèmes, zoom, plein écran, pré-processeur Obsidian) | 2.0.0 | archive |
| 58 | Tests E2E Playwright (44 desktop + 12 mobile, CI) | 2.0.0 | archive |
| 59 | Mode hors-ligne PWA complet (IndexedDB, file de synchro, conflits) | 2.0.0 | archive |
| 63 | Internationalisation i18n FR/EN | 2.0.0 | archive |
| 65 | Thèmes personnalisés (light/dark/high-contrast/sepia, import/export) | 2.0.0 | archive |
| 66 | Export multi-formats (HTML, MD bundle, ePub) | 2.0.0 | archive |
| 71 | Tableau de bord administrateur | 2.0.0 | archive |
| 64 | MFA (TOTP + WebAuthn + recovery codes) | 2.1.0 | archive |
| 74 | Support complet des documents PDF | 2.1.0 | features/pdf.md |
| 75 | Éditeur multi-panneaux (Split View) | 2.1.0 | features/split-view.md |
| 61 | Plugins système (sandbox Web Worker, hooks, 9 endpoints) | 2.2.0 | archive |
| 67 | Notifications web — Push API | 2.2.0 | archive |
| 68 | Health check enrichi | 2.2.0 | archive |
| 72 | API publique documentée — OpenAPI 3.1 | 2.2.0 | archive |
| 76 | BooksLM — Console AI contextuelle par répertoire | 2.2.0 | features/bookslm.md |
| 78 | Éditeur Excalidraw | 2.2.0 | features/excalidraw.md |
| 62 | Collaboration temps réel — Édition simultanée (Yjs/CRDT, WebSocket, awareness) | 2.3.0 | features/collaboration.md |
| 79 | Assistant IA — Outils (function calling) & serveur MCP | 2.3.0 | features/ai-tools-mcp.md |
| 80 | Assistant IA — Rendu Markdown, liens fichiers/paths & sessions | 2.3.0 | features/ai-assistant-ux.md |
| 81 | Assistant IA — Commandes (@, /), skills, images & capacités des modèles |
2.3.0 | features/ai-assistant-commands.md |
| 82 | Assistant IA — Section « Fournisseur & modèle » compacte (recherche modèle + info capacités, BUG-043) | 2.3.0 | features/ai-provider-picker.md |
| 69 | Éditeur mobile natif — Interface tactile optimisée | 2.3.0 | features/mobile-editor.md |
| 70 | Recherche sémantique — Embeddings vectoriels (hybride TF-IDF + RRF) | 2.3.0 | features/semantic-search.md |
| 77 | Application Desktop native — Tauri | 🔵 en cours | features/desktop-tauri.md |
| 84 | Consolidation & sécurité — revue statique 2026-09-13 (phase 1, BUG-021→034) | 2.3.0 | archive |
| 83 | Barre d'outils d'édition mobile — ruban style Obsidian Android | 2.3.0 | archive |
| 88 | Assistant IA — contexte applicatif (documents ouverts, répertoire, recherche, fichiers récents) & liens de fichiers fiables (BUG-041, BUG-042) | 2.3.0 | features/ai-app-context.md |
| 91 | Assistant IA — Zone de discussion façon Notion : post ancré en haut, fournisseur/modèle discret & barre d'actions | 2.3.0 | features/ai-assistant-conversation-ux.md |
| 93 | Édition inline — « Editer » et « Forge » remplacent la vue lecture (assistant IA qui met le document à jour) | 2.3.0 | features/editeur-inline.md |
| 94 | Assistant IA — Bouton de soumission arrondi + icône renouvelée (arrow-up) | 2.4.0 | features/ai-assistant-history.md |
| 95 | Assistant IA — Historique permanent des conversations (persistance backend) | 2.4.0 | features/ai-assistant-history.md |
| 96 | Assistant IA — Accès rapide à l'historique depuis la sidebar de navigation | 2.4.0 | features/ai-assistant-history.md |
| 97 | Assistant IA — Panneau « + » extensible (fichiers, Deep Research, contextes, skills…) | 2.4.0 | features/ai-assistant-history.md |
| 98 | Assistant IA — Filtre de recherche dans la sidebar « Historique IA » | 2.5.0 | features/ai-assistant-history.md |
| 99 | Sidebar — Filtrage des vues « Récents » et « Sauvegardes » | 2.6.0 | features/sidebar-filters.md |
| 100 | Assistant IA — Deep Research en pastille (au lieu du texte injecté) | 2.6.0 | features/ai-assistant-history.md |
| 101 | Forge — Assistant IA partagé (bouton AI Panel = assistant, fournisseur/modèle configuré, autocomplétion) + plein écran Forge/Editer | 2.8.0 | features/forge-assistant.md |
| BUG-057 | Assistant IA — bouton « Ajouter » fonctionnel dans l'éditeur Forge (en plus d'« Editer ») | 2.9.0 | archive |
| 102 | Assistant IA — bouton « Ajouter la section » par bloc de code (insertion du bloc seul) | 2.9.0 | archive |
| 92 | Assistant IA — Écosystème d'outils phase 2 (recherche à clé, cache/retry, Playwright, crawl, Gitea/GitHub, documents XLSX/DOCX/CSV/PDF) | 2.10.0 | features/ai-tools-roadmap.md |
| 103 | Configuration — clés utilisateur des sources connectées & recherche à clé (page Configurations, data/api_keys.json, priorité sur l'env) |
2.11.0 | features/ai-tools-roadmap.md |
| 104 | Configuration — Redesign UI de la section « Clés API IA » : recherche fournisseurs, carte défaut 2 colonnes + badges de capacités, cartes dépliables, footer d'actions sticky | 2.12.0 | features/ai-keys-ui.md |
| 105 | Guide d'utilisation — audit de couverture complet, téléchargement Markdown/PDF, guide desktop élargi, section Architecture (Mermaid) + BUG-067 | 2.13.0 | features/guide-coverage-105.md |
| 106 | Assistant IA — Actions instantanées contextuelles, catalogue « Toutes les actions » & frontmatter complet | 2.14.0 | features/ai-quick-actions.md |
| 107 | Configuration — Gestion des clés API & MCP : création/révocation de jetons longue durée (1 j, 1 mois, 6 mois, 1 an, sans fin), une seule clé pour l'API REST et le serveur MCP, « dernière utilisation », store data/api_tokens.json sans secret persisté |
2.15.0 | features/api-mcp-tokens-107.md |
| 86 | Optimisation globale des performances (phase 3) — scan différentiel, excalidraw différé, garde-fou replace (inverted index / PDF lazy / caps regex déjà livrés via BUG-033/040/025) |
2.16.0 | features/perf-phase3-86.md |
| 108 | Support complet des images — arborescence, visionneuse (zoom/pan/navigation/miniatures), indexation nom+métadonnées, media_types.py, filtre ext:, SVG sandbox |
2.17.0 | features/image-support.md |
| 109 | Support audio & vidéo — lecteurs HTML5 intégrés, streaming HTTP Range (/api/media), fallback codec/taille |
2.18.0 | features/media-viewers-109.md |
| 110 | Lecteur média persistant « Now Playing » — élément partagé téléporté (inline ⇄ dock), Media Session, mini-vidéo PiP, mobile, reprise | 2.19.0 | features/media-viewers-109.md |
| 111 | Visionneuse d'images — navigation fluide : image ajustée au cadre, navigation en place (cache annuaire + préchargement), pellicule persistante, flèches latérales au survol | 2.20.0 | features/image-navigation-111.md |
| 112 | En-tête allégé & compte en sidebar — version dans le menu Options, retrait utilisateur/déconnexion du header, section compte en bas de la sidebar, pellicule d'images défilable (molette + flèches) | 2.21.0 | features/header-user-sidebar-112.md |
| 113 | Configuration — ordre naturel des sections (Profil 1er, À propos dernier, TOC = page) & avatar utilisateur (import PNG/JPG/WEBP, persistance serveur, cercle sidebar) | 2.22.0 | features/settings-order-avatar-113.md |
| 114 | Configuration — refonte mobile-responsive (modale plein écran 100dvh, sommaire en drawer coulissant, cibles tactiles ≥ 44 px, inputs 16 px anti-zoom, sauvegarde sticky, MFA 1 colonne, purge i18n/HTML) | 2.23.0 | features/settings-mobile-114.md |
| BUG-078 | Fichiers de code — coloration syntaxique restaurée (feuilles highlight.js basculées sur le mode de thème et non la clé) | 2.25.0 | features/viewer-toolbar-highlight-avatars.md |
| 115 | Viewer — barre d'outils de lecture épinglée au défilement | 2.25.0 | features/viewer-toolbar-highlight-avatars.md |
| 117 | Configuration — avatars prédéfinis dans le profil utilisateur (12 images) | 2.25.0 | features/viewer-toolbar-highlight-avatars.md |
| 85 | Refonte architecturale — découpage du monolithe (14 routers, main.py 4 827 → ~750 lignes), stores JSON verrouillés, rate-limit SQLite optionnel |
2.27.2→2.27.13 | features/archi-refonte-85.md |
| 157 | Recherche — facette « Extensions » dans les résultats (3ᵉ filtre avec Vaults et Tags) + panneau repliable | 2.46.0→2.47.0 | archive |
| 158 | Navigation — clic répertoire → onglet de navigation (sous-répertoires, facettes Vaults/Tags/Extensions, tri Pertinence/Date, Sauver), onglet Accueil, menus contextuels + retour Home complet (BUG-100 → BUG-102) | 2.48.0→2.49.0 | features/navigation-tab-158.md |
| 166 | Assistant IA — détection & fusion de doublons (score déterministe, paires candidates, fusion backup + confirmation) | Unreleased | features/agent-phase4-166-168-170.md |
| 168 | Assistant IA — notifications externes Discord / Telegram / SMTP / webhook (déclencheurs, secrets hors config, SSRF-safe) | Unreleased | features/agent-phase4-166-168-170.md |
| 170 | Assistant IA — tâches planifiées type cron (create/append/notify, interval/daily/once, tick 60 s, échec notifié) | Unreleased | features/agent-phase4-166-168-170.md |
📊 Résumé des efforts
| Priorité | Items | Effort total estimé |
|---|---|---|
| ✅ Complété | #1 → #59, #61–72, #74–76, #78–86, #88–93, #94–100, #102–115, #117, #92 | ~141 jours réalisés |
| 🔵 Finitions | #77 Desktop : 6 tests E2E manuels (protocole) — signature Windows non retenue (décision 2026-09-26) | ~0,5-1 jour |
| ⚪ P4 reporté | #73 Sync — reporté (décision 2026-09-26), hors chemin critique ; périmètre élargi 2026-10-04 (favoris #161 + préférences) | 6-8 jours si réactivé |
| ⚪ P1/P2 nouvelles (liste v1.2) | #161 favoris répertoires · #162 recherches fréquentes · #163 recherche Forge · #164 suggestions contextuelles | ~5-9 jours |
| ⚪ Évolutions agent IA (#165 → #178) | Git sync, doublons, Drive/Notion, notifications, chat, cron, audit, chiffrement, Kanban, thèmes dynamiques, OneNote/Evernote, permissions, diff visuel, mobile | ~45-63 jours si tout activé (à prioriser par tranches) |
| ⚪ P0/P1 prioritaire | #87 CI/CD (BUG-035 → BUG-040 corrigés, #86 livré) | ~3-5 jours |
| ✅ Terminé | #153 Visionneuse & édition XLSX — complétude (A1-A17 toutes livrées, v2.27.0 → v2.39.0) | 0 jour restant |
| ✅ Terminé | #154 Refonte UI/UX tableur (A1-A5 toutes livrées, v2.40.0 → v2.43.1) | 0 jour restant |
| ✅ Terminé | #155 Ergonomie tableur — menu contextuel & sélection type Excel | 0 jour restant |
| ✅ Terminé | #156 Éditeur Excel — complétude — P0-P3 ✅ livrés le 2026-09-30 (BUG-096 → BUG-099, A5-A14) | 0 jour restant |
| Total chemin critique | #77 fin + #87 | ~4-6 jours |
Notes
- Décisions 2026-09-26 : axe prioritaire = dette & sécurité (#85/#87) ; #73 Sync reporté (P4, hors chemin critique) ; desktop livré non signé + doc SmartScreen.
- Ajout 2026-09-27 : #153 ouvert à la suite de l'audit de la visionneuse XLSX (limitations, risques de perte de données, périmètre IA/recherche) — détail et critères dans features/xlsx-viewer.md.
- Ajout 2026-09-29 : #154 ouvert — refonte UI/UX de la visionneuse/éditeur XLSX (audit UX, architecture cible, plan par lots) dans features/xlsx-ui-redesign.md ; livré en 5 lots (ruban groupé, onglets permanents + « + », badges d'état, tokens de grille, dialogues thémés, inspecteur droit, undo/redo, extraction
frontend/js/xlsx/*). - Ajout 2026-09-29 : #155 livré — menu contextuel (clic droit / appui long) et sélection type Excel sur la grille (features/xlsx-context-menu.md) ; au passage BUG-094 corrigé (feuille vide/nouvelle désormais éditable, quadrillage vierge 20×8).
- Clôture 2026-09-30 : #156 livré (P0 → P3) — A8 mise en forme en écriture (bouton Mise en forme : gras/italique/souligné, alignements, couleurs, formats de nombre, fusions, volets figés, largeur/hauteur — via
PUT …/xlsx/style), A9 décision « pas de moteur de formule, annoncée dans l'UI », A10 undo/redo unifié conservé au re-rendu, A11 export de la sélection / Markdown / HTML / impression + recherche sur toutes les feuilles, A12 concurrence optimiste (If-Match, 409 réparable), A13 cache des métadonnées parmtime, A14 outils IA.xlsm/.csv+search_workbook/analyze_range/edit_xlsx_structure— détail dans features/xlsx-editor-completeness.md. - Ajout 2026-09-29 : #156 P1 livré — A5 presse-papiers de plage (copier/couper/coller un bloc, presse-papiers interne + système, entrées du menu contextuel, remplissage multi-cellules), A6 clavier complet (
Ctrl+S/Ctrl+A/Suppr/F2/Ctrl+Home|End/PgUp|PgDn/Ctrl+flèches/Maj+Entrée) et A7 zone Nom éditable + aide à la saisie ; restent P2 (mise en forme, calcul, undo unifié) et P3 (sortie, concurrence optimiste, performances, outils IA). - Ajout 2026-09-29 : #156 ouvert — audit de complétude de l'éditeur Excel : 4 défauts recensés (BUG-096 enregistrement
.csv, BUG-097 lazy-load.xlsm, BUG-098 délimiteur CSV, BUG-099 sonde de perte), corrigés le jour même (P0 ✅) avec tests de non-régression ; restent P1-P3 (presse-papiers, clavier, mise en forme, calcul, export, concurrence optimiste) puis presse-papiers de plage, clavier complet, mise en forme en écriture, calcul, undo/redo unifié, export/impression, concurrence optimiste — détail dans features/xlsx-editor-completeness.md. - Ajout 2026-10-04 : intégration de la liste « Roadmap – Développement des Fonctionnalités »
v1.2 (phases 1-3 + suggestions agent IA). Évaluation croisée avec le code : 7 propositions déjà
livrées (auto-complétion
autocomplete.js, résumés/traduction/ton #106, édition collaborative #62, scripts/plugins #61, webhooks #9, recherche dans la page en vue lecture) → pas d'ID ; périmètre manquant ouvert en backlog #161 → #178 avec table de correspondance en tête de la nouvelle section ; sync favoris/préférences fusionnée dans #73 (reporté P4). Les numéros 161-180 de la liste source ne sont pas repris tels quels (règle dépôt : ID jamais attribué au déjà-fait) ; la correspondance figure item par item. - Clôture #85 (v2.27.13) : monolithe découpé (T1→T9), stores verrouillés + rate-limit SQLite (T10), fiche
docs/features/archi-refonte-85.md. - Les items P3/P4 ne sont pas ordonnés par priorité interne — à raffiner selon les retours utilisateurs.
- L'effort inclut le développement + tests unitaires + intégration CI, mais pas la documentation utilisateur.
- Les items marqués 🟢 (nice-to-have) sont de bons candidats pour des contributions externes.
- Maintenance de ce fichier : quand un item passe à ✅, déplacer son détail vers
docs/features/<slug>.md(grosse feature) oudocs/archive/COMPLETED_v1-v2.md(item court), ajouter une ligne dans l'index « Complété », et consigner la version dans le CHANGELOG.