feat: finalisation éditeur Forge + mode hors-ligne PWA + consolidation roadmap
CI / lint (push) Failing after 7s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / security (push) Failing after -7s

- Forge: Tab indent, Ctrl+K, auto-focus, AI status, messages erreur FR
- Forge: slash commands clean, cache-bust iframe, preview serveur
- Forge: iframe 82vh, hauteur auto, table inline, sélecteur langage
- PWA hors-ligne: IndexedDB (offline-db.js + offline.js)
- Mermaid: thème dark complet, highlight.js preview
- Backend: màj CSP, rename chain, bookmarks/history/shares
- Roadmap: consolidation dans docs/ROADMAP.md (75 items)
- Infra: docker-compose.podman.yml, suppression test-vault
- .gitignore: exclusion odysseus/
This commit is contained in:
2026-06-14 20:27:37 -04:00
parent 0cdebc5b40
commit feeb46b873
31 changed files with 1769 additions and 981 deletions
+71 -49
View File
@@ -1137,46 +1137,23 @@
<div class="editor-modal" id="editor-modal">
<div class="editor-container">
<div class="editor-header">
<div class="editor-title" id="editor-title">Édition</div>
<div class="editor-actions">
<button
class="editor-btn danger"
id="editor-delete"
title="Supprimer"
aria-label="Supprimer"
>
<i
data-lucide="trash-2"
style="width: 16px; height: 16px"
></i>
</button>
<button
class="editor-btn"
id="editor-cancel"
title="Annuler"
aria-label="Annuler"
>
<i
data-lucide="x"
style="width: 16px; height: 16px"
></i>
</button>
<button
class="editor-btn primary"
id="editor-save"
title="Sauvegarder"
aria-label="Sauvegarder"
>
<i
data-lucide="check"
style="width: 16px; height: 16px"
></i>
</button>
</div>
<span class="editor-brand">ObsiGate</span>
<input class="editor-title-input" id="editor-title-input" placeholder="Titre..." spellcheck="false" title="Titre (sync avec # Heading)">
<span class="editor-sep">/</span>
<input class="editor-filename-input" id="editor-filename-input" placeholder="nom.md" spellcheck="false" title="Renommer le fichier">
<div class="editor-spacer"></div>
<span class="editor-save-dot ok" id="editor-save-dot"><span class="dot"></span><span id="editor-save-label">Saved</span></span>
<button class="editor-btn danger" id="editor-delete" title="Supprimer" aria-label="Supprimer">&#128465;</button>
<button class="editor-btn" id="editor-cancel" title="Annuler" aria-label="Annuler">&#10005;</button>
<button class="editor-btn primary" id="editor-save" title="Sauvegarder" aria-label="Sauvegarder">&#10003;</button>
</div>
<div class="editor-body" id="editor-body">
<div class="editor-body editor-body-cm" id="editor-body">
<div id="ai-toolbar-container"></div>
</div>
<div class="editor-footer">
<span class="editor-stat-file" id="editor-stat-file"></span>
<span class="editor-stat-words" id="editor-stat-words">0 words</span>
</div>
</div>
</div>
@@ -1199,10 +1176,26 @@
</button>
</div>
</div>
<div class="editor-body" id="config-body">
<div class="editor-body help-body" id="config-body">
<nav class="help-nav" id="config-nav">
<div class="help-nav-header"><div class="help-nav-title">Configuration</div></div>
<div class="help-nav-search-wrap">
<input type="text" class="help-nav-search" id="config-nav-search" placeholder="Rechercher..." autocomplete="off" spellcheck="false">
<button class="help-search-clear" id="config-search-clear" title="Effacer" onclick="var s=document.getElementById('config-nav-search');if(s){s.value='';s.dispatchEvent(new Event('input'));s.focus();}">X</button>
</div>
<ul class="help-nav-list">
<li><a href="#cfg-search" class="help-nav-link">🔍 Recherche</a></li>
<li><a href="#cfg-backend" class="help-nav-link">⚙️ Backend</a></li>
<li><a href="#cfg-sync" class="help-nav-link">🔄 Synchronisation</a></li>
<li><a href="#cfg-diags" class="help-nav-link">🩺 Diagnostics</a></li>
<li><a href="#cfg-ai" class="help-nav-link">🤖 IA</a></li>
<li><a href="#cfg-about" class="help-nav-link">📦 A propos</a></li>
</ul>
</nav>
<div class="help-content" id="config-scroll">
<div class="config-content">
<!-- Performance Settings - Frontend -->
<section class="config-section">
<section class="config-section help-section" id="cfg-search">
<h2>Paramètres de recherche</h2>
<p class="config-description">
Ces paramètres s'appliquent immédiatement côté
@@ -1286,7 +1279,7 @@
</section>
<!-- Historique récent -->
<section class="config-section">
<section class="config-section help-section">
<h2>
📋 Historique récent
<span class="config-badge-restart"
@@ -1335,7 +1328,7 @@
</section>
<!-- Performance Settings - Backend -->
<section class="config-section">
<section class="config-section help-section">
<h2>
Paramètres backend
<span class="config-badge-restart"
@@ -1465,7 +1458,7 @@
</section>
<!-- Tag Filtering (existing) -->
<section class="config-section">
<section class="config-section help-section">
<h2>Filtrage de tags</h2>
<p class="config-description">
Définissez les patterns de tags à masquer dans
@@ -1505,7 +1498,7 @@
</section>
<!-- Watcher / Synchronisation -->
<section class="config-section">
<section class="config-section help-section" id="cfg-sync">
<h2>Synchronisation automatique</h2>
<p class="config-description">
Surveillance des fichiers en temps réel via
@@ -1595,7 +1588,7 @@
</section>
<!-- Hidden Files/Folders Configuration -->
<section class="config-section">
<section class="config-section help-section">
<h2>🗂️ Fichiers cachés</h2>
<p class="config-description">
Contrôlez l'affichage des fichiers/dossiers
@@ -1635,7 +1628,7 @@
</section>
<!-- Diagnostics -->
<section class="config-section">
<section class="config-section help-section" id="cfg-diags">
<h2>Diagnostics</h2>
<p class="config-description">
Statistiques de l'index et du moteur de
@@ -1658,8 +1651,36 @@
</button>
</section>
<!-- Cles API AI -->
<section class="config-section help-section" id="cfg-ai">
<h2>🤖 Cles API Intelligence Artificielle</h2>
<p class="config-description">
Configurez vos cles API. Cliquez sur <strong>Tester</strong> pour charger les modeles.
</p>
<div class="config-row">
<label class="config-label" for="cfg-deepseek-key">DeepSeek API Key</label>
<input type="password" id="cfg-deepseek-key" class="config-input" placeholder="sk-..." autocomplete="off">
<select id="cfg-deepseek-model" class="config-select" style="width:200px"><option value="">-- Modele --</option></select>
</div>
<div class="config-row">
<label class="config-label" for="cfg-openrouter-key">OpenRouter API Key</label>
<input type="password" id="cfg-openrouter-key" class="config-input" placeholder="sk-or-..." autocomplete="off">
<select id="cfg-openrouter-model" class="config-select" style="width:200px"><option value="">-- Modele --</option></select>
</div>
<div class="config-row">
<label class="config-label" for="cfg-gemini-key">Gemini API Key</label>
<input type="password" id="cfg-gemini-key" class="config-input" placeholder="AIza..." autocomplete="off">
<select id="cfg-gemini-model" class="config-select" style="width:200px"><option value="">-- Modele --</option></select>
</div>
<div class="config-actions-row" style="margin-top:16px">
<button class="config-btn-save" id="cfg-save-ai-keys">Sauvegarder</button>
<button class="config-btn-secondary" id="cfg-test-ai-keys">Tester</button>
<span id="cfg-ai-status" style="font-size:12px;color:var(--text-muted);margin-left:12px"></span>
</div>
</section>
<!-- À propos -->
<section class="config-section">
<section class="config-section help-section" id="cfg-about">
<h2>📦 À propos</h2>
<div id="config-about" class="config-diagnostics">
<div class="config-diag-loading">
@@ -1669,7 +1690,7 @@
</section>
<!-- Webhooks -->
<section class="config-section">
<section class="config-section help-section">
<h2>🔔 Webhooks</h2>
<p class="config-description">
Notifications HTTP vers des services externes
@@ -1701,7 +1722,7 @@
</section>
<!-- Partages publics -->
<section class="config-section">
<section class="config-section help-section">
<h2>📤 Partages publics</h2>
<p class="config-description">
Liens de partage publics pour des documents
@@ -1710,6 +1731,7 @@
<div id="shares-list"></div>
</section>
</div>
</div>
</div>
</div>
</div>
@@ -2968,7 +2990,7 @@
<li>
<strong>Barre d'outils AI</strong> :
Complétion, réécriture, traduction (voir
section <a href="#help-ia">IA</a>)
section <a href="#help-ia">🤖 IA</a>)
</li>
</ul>
</section>