Compare commits
18
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5dd6809ef0 | ||
|
|
7b8bc52650 | ||
|
|
1758c3b6d2 | ||
|
|
6669633902 | ||
|
|
a65d282c0b | ||
|
|
524b43cc40 | ||
|
|
4e0b27c4d7 | ||
|
|
c6d7acfd99 | ||
|
|
bf941c71ec | ||
|
|
6713510ce9 | ||
|
|
bf5b32de16 | ||
|
|
2a1780b43d | ||
|
|
be05ec99b5 | ||
|
|
3a42bc034d | ||
|
|
27e7664ef0 | ||
|
|
ccbf1d3269 | ||
|
|
0ca14739f9 | ||
|
|
d9192ef355 |
+5
-1
@@ -6,7 +6,7 @@ Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
|
|||||||
et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
> **En cours de développement** : les changements à venir sont listés dans la section
|
> **En cours de développement** : les changements à venir sont listés dans la section
|
||||||
> [Unreleased](#unreleased). La dernière version livrée est **2.81.0**.
|
> [Unreleased](#unreleased). La dernière version livrée est **2.81.1**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -14,6 +14,10 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [2.81.1] — 2026-10-28
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [2.81.0] — 2026-10-28
|
## [2.81.0] — 2026-10-28
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
+3
-3
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.
|
**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.
|
||||||
|
|
||||||
[]()
|
[]()
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
[](https://www.python.org/)
|
[](https://www.python.org/)
|
||||||
@@ -977,8 +977,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 Changelog
|
||||||
|
|
||||||
Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.81.0).
|
Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.81.1).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Projet : ObsiGate | Version : 2.81.0 | Dernière mise à jour : Septembre 2026*
|
*Projet : ObsiGate | Version : 2.81.1 | Dernière mise à jour : Septembre 2026*
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface.
|
**Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface.
|
||||||
|
|
||||||
[]()
|
[]()
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
[](https://www.python.org/)
|
[](https://www.python.org/)
|
||||||
@@ -1152,8 +1152,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE)
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 Changelog
|
||||||
|
|
||||||
See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.81.0).
|
See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.81.1).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Project: ObsiGate | Version: 2.81.0 | Last updated: September 2026*
|
*Project: ObsiGate | Version: 2.81.1 | Last updated: September 2026*
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ TAGS_METADATA: list[dict[str, str]] = [
|
|||||||
{"name": "Webhooks", "description": "HTTP callbacks signed with HMAC-SHA256 for file events."},
|
{"name": "Webhooks", "description": "HTTP callbacks signed with HMAC-SHA256 for file events."},
|
||||||
{"name": "Conflicts", "description": "Detect and resolve Syncthing sync-conflict files."},
|
{"name": "Conflicts", "description": "Detect and resolve Syncthing sync-conflict files."},
|
||||||
{"name": "Admin", "description": "Admin-only system monitoring: stats, audit log, backup stats and live stream."},
|
{"name": "Admin", "description": "Admin-only system monitoring: stats, audit log, backup stats and live stream."},
|
||||||
|
{"name": "Coffres Secrets", "description": "Secret vaults: encrypted coffres, secrets, consumers, grants and distribution — metadata only, values are never exposed."},
|
||||||
{"name": "Plugins", "description": "Install, enable and manage user plugins."},
|
{"name": "Plugins", "description": "Install, enable and manage user plugins."},
|
||||||
{"name": "Push", "description": "Web Push (VAPID) subscription management and test notifications."},
|
{"name": "Push", "description": "Web Push (VAPID) subscription management and test notifications."},
|
||||||
{"name": "Duplicates", "description": "Duplicate-note detection and confirmed merge (#166)."},
|
{"name": "Duplicates", "description": "Duplicate-note detection and confirmed merge (#166)."},
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ from __future__ import annotations
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from backend.auth.middleware import require_admin, require_auth
|
|
||||||
from fastapi import APIRouter, Body, Depends, HTTPException, Request
|
from fastapi import APIRouter, Body, Depends, HTTPException, Request
|
||||||
|
|
||||||
from backend.audit import get_recent_entries, log_coffre_event
|
from backend.audit import get_recent_entries, log_coffre_event
|
||||||
|
from backend.auth.middleware import require_admin, require_auth
|
||||||
from backend.coffre_crypto import (
|
from backend.coffre_crypto import (
|
||||||
CryptoIndisponibleError,
|
CryptoIndisponibleError,
|
||||||
KEKAbsenteError,
|
KEKAbsenteError,
|
||||||
|
|||||||
Generated
+1
-1
@@ -2626,7 +2626,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.81.0"
|
version = "2.81.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.81.0"
|
version = "2.81.1"
|
||||||
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
|
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
|
||||||
authors = ["Bruno Charest"]
|
authors = ["Bruno Charest"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
|
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
|
||||||
"productName": "ObsiGate",
|
"productName": "ObsiGate",
|
||||||
"version": "2.81.0",
|
"version": "2.81.1",
|
||||||
"identifier": "com.obsigate.desktop",
|
"identifier": "com.obsigate.desktop",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../frontend",
|
"frontendDist": "../frontend",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# ObsiGate — Roadmap
|
# ObsiGate — Roadmap
|
||||||
|
|
||||||
> **Version :** 2.81.0 | **Dernière mise à jour :** 2026-10-28
|
> **Version :** 2.81.1 | **Dernière mise à jour :** 2026-10-28
|
||||||
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
|
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
|
||||||
> vers les fonctionnalités livrées.
|
> vers les fonctionnalités livrées.
|
||||||
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
||||||
|
|||||||
@@ -59,11 +59,11 @@ function _sharedIcon(size = 16) {
|
|||||||
// renommer/déplacer/supprimer). Le menu ⋮ est un menu propre ci-dessous.
|
// renommer/déplacer/supprimer). Le menu ⋮ est un menu propre ci-dessous.
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
/** Icône cadenas (U+1F510) du nœud Secrets, distincte de la maison et du diamant. */
|
/** Icône coffre-fort du nœud Secrets (SVG Safe Vault Streamline, fourni par Bruno), distincte de la maison et du diamant. Le tracé utilise currentColor pour rester lisible en thème clair comme sombre (le noir d'origine serait invisible en sombre). */
|
||||||
function _secretsIcon() {
|
function _secretsIcon() {
|
||||||
const s = document.createElement("span");
|
const s = document.createElement("span");
|
||||||
s.className = "coffres-icon-lock";
|
s.className = "coffres-icon-lock";
|
||||||
s.textContent = "\u{1F510}";
|
s.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14" aria-hidden="true"><g stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"><path d="M12.5 0.5h-11c-0.552285 0 -1 0.447715 -1 1V11c0 0.5523 0.447715 1 1 1h11c0.5523 0 1 -0.4477 1 -1V1.5c0 -0.552285 -0.4477 -1 -1 -1Z"/><path d="M8.5 8c0.9665 0 1.75 -0.7835 1.75 -1.75S9.4665 4.5 8.5 4.5s-1.75 0.7835 -1.75 1.75S7.5335 8 8.5 8Z"/><path d="M8.5 3.25V4.5"/><path d="M8.5 8v1.25"/><path d="M11.5 6.25h-1.25"/><path d="M6.75 6.25H5.5"/><path d="m10.62 4.12988 -0.88001 0.88"/><path d="m7.26 7.48999 -0.88 0.88"/><path d="m10.62 8.36999 -0.88001 -0.88"/><path d="m7.26 5.00988 -0.88 -0.88"/><path d="M3 4.5V8"/><path d="M2 12v1.5"/><path d="M11.5 12v1.5"/></g></svg>';
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -653,7 +653,7 @@ function applyTheme(themeKey, mode) {
|
|||||||
root.style.setProperty(key, vars[key]);
|
root.style.setProperty(key, vars[key]);
|
||||||
});
|
});
|
||||||
// #180 — the spreadsheet grid follows the active theme: derive its tokens
|
// #180 — the spreadsheet grid follows the active theme: derive its tokens
|
||||||
// from the generic surfaces so every theme (15 built-in × 4 modes, custom
|
// from the generic surfaces so every theme (16 built-in × 4 modes, custom
|
||||||
// imports) gets a matching grid instead of the hardcoded dark/light pair.
|
// imports) gets a matching grid instead of the hardcoded dark/light pair.
|
||||||
// color-mix keeps the zebra stripe subtle on both dark and light grounds.
|
// color-mix keeps the zebra stripe subtle on both dark and light grounds.
|
||||||
// #185 — `--grid-border` no longer reuses `--border` (which sits 1-2% off the
|
// #185 — `--grid-border` no longer reuses `--border` (which sits 1-2% off the
|
||||||
|
|||||||
+2
-1
@@ -14372,7 +14372,8 @@ body.has-draco-bar .app-container { height: calc(100vh - 60px); }
|
|||||||
.coffres-alerts { margin: 12px 0; }
|
.coffres-alerts { margin: 12px 0; }
|
||||||
.coffres-alert { color: var(--warning, #f59e0b); padding: 2px 0; }
|
.coffres-alert { color: var(--warning, #f59e0b); padding: 2px 0; }
|
||||||
.coffres-form { display: grid; gap: 8px; max-width: 560px; margin: 8px 0; }
|
.coffres-form { display: grid; gap: 8px; max-width: 560px; margin: 8px 0; }
|
||||||
.coffres-icon-lock { font-size: 16px; line-height: 1; }
|
.coffres-icon-lock { display: inline-flex; align-items: center; line-height: 1; }
|
||||||
|
.coffres-icon-lock svg { width: 16px; height: 16px; flex: none; }
|
||||||
.coffres-alert-dot { color: var(--warning, #f59e0b); font-weight: 700; margin-left: 4px; }
|
.coffres-alert-dot { color: var(--warning, #f59e0b); font-weight: 700; margin-left: 4px; }
|
||||||
.coffres-context-menu { position: fixed; z-index: 1000; min-width: 220px; background: var(--bg-secondary, #161b22); border: 1px solid var(--border, #21262d); border-radius: 8px; padding: 4px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); }
|
.coffres-context-menu { position: fixed; z-index: 1000; min-width: 220px; background: var(--bg-secondary, #161b22); border: 1px solid var(--border, #21262d); border-radius: 8px; padding: 4px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); }
|
||||||
.coffres-context-item { display: block; width: 100%; text-align: left; padding: 8px 12px; background: transparent; border: none; color: var(--text-primary, #e6edf3); cursor: pointer; border-radius: 6px; }
|
.coffres-context-item { display: block; width: 100%; text-align: left; padding: 8px 12px; background: transparent; border: none; color: var(--text-primary, #e6edf3); cursor: pointer; border-radius: 6px; }
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsigate",
|
"name": "obsigate",
|
||||||
"version": "2.81.0",
|
"version": "2.81.1",
|
||||||
"description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.",
|
"description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.",
|
||||||
"main": "patch.js",
|
"main": "patch.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Validates:
|
Validates:
|
||||||
- Theme JSON structure validity
|
- Theme JSON structure validity
|
||||||
- All 15 built-in themes have required keys and valid CSS colors
|
- All 16 built-in themes have required keys and valid CSS colors
|
||||||
- High-contrast and sepia mode generators produce valid CSS vars
|
- High-contrast and sepia mode generators produce valid CSS vars
|
||||||
- Import/export round-trip
|
- Import/export round-trip
|
||||||
- AVAILABLE_MODES includes all 4 modes
|
- AVAILABLE_MODES includes all 4 modes
|
||||||
@@ -80,9 +80,9 @@ class TestThemeStructure:
|
|||||||
assert '_genSepia' in self.content
|
assert '_genSepia' in self.content
|
||||||
|
|
||||||
def test_theme_count(self):
|
def test_theme_count(self):
|
||||||
"""Should have 15 built-in themes."""
|
"""Should have 16 built-in themes."""
|
||||||
names = _extract_theme_names(self.content)
|
names = _extract_theme_names(self.content)
|
||||||
assert len(names) == 15, f"Expected 15 themes, found {len(names)}: {names}"
|
assert len(names) == 16, f"Expected 16 themes, found {len(names)}: {names}"
|
||||||
|
|
||||||
def test_required_export_functions(self):
|
def test_required_export_functions(self):
|
||||||
"""All required functions should be exported."""
|
"""All required functions should be exported."""
|
||||||
|
|||||||
Reference in New Issue
Block a user