core-hn_pseudobsidian-ization/CHANGELOG.md
Axelle Abbadie 0c1347c07a chore: release v0.1.9
Publie les correctifs de compatibilité 1.12.7 et de sécurité (protobufjs)
accumulés sur dev.
2026-07-17 17:58:45 +02:00

18 KiB

Changelog

Previous entries in French: CHANGELOG.fr.md

[prod] v0.1.9 — 17 July 2026

Fixes

  • minAppVersion lowered back to 1.12.7 (from 1.13.0) — Obsidian 1.13 is still Catalyst-only (early access); most users are on the public 1.12.7 release
  • Settings tab: added a display() fallback alongside getSettingDefinitions() so the tab still renders on Obsidian < 1.13, which doesn't know about the declarative Settings API
  • setDestructive() (1.13.0-only) reverted to setWarning() on the delete/confirm buttons in EditRuleModal and ConfirmModal, for the same pre-1.13 compatibility reason
  • Security: forced protobufjs to ^7.6.5 via npm overrides — the transitive dependency pulled in by @xenova/transformersonnxruntime-webonnx-proto was pinned to a version vulnerable to arbitrary code execution (GHSA-xq3m-2v4x-88gg, CVSS 9.8)

[prod] v0.1.8 — 9 July 2026

Fixes

  • NoScribeHtmlParser — anchor names with a suffix containing non-word characters (e.g. ts_95480_96512_//S01, produced when an overlap annotation like //S01: is typed right before a noScribe segment break) were rejected by TS_NAME_RE (\w*), silently dropping the entire anchor's text. Whole overlapping-speech segments could disappear on HTML import. The suffix is now accepted as-is.

[prod] v0.1.7 — 10 June 2026

New features

i18n

  • Russian (ru) and Spanish (es) locales added (~240 keys each), alongside French and English

Exports

  • markdownToNoScribeHtml() — reconstruct pseudonymized noScribe HTML with word-level ts_ timestamp anchors, via proportional index mapping on words.json; new export-as-HTML command and panel button
  • markdownToEaf() — export to ELAN .eaf (FORMAT 3.0): per-speaker tiers, deduplicated/sorted TIME_SLOTs, optional MEDIA_DESCRIPTOR, XML escaping; new export-as-EAF command and panel button (shown for VTT/HTML-sourced files)

Settings

  • Settings tab rewritten using the Obsidian 1.13.0 declarative getSettingDefinitions() API
  • minAppVersion raised to 1.13.0

Fixes

  • autoConvert now skips files created inside the exports/mappings folders, preventing re-import of freshly written exports
  • pseudonymizeActiveFile respects exportMirrorClasses — the intermediate .pseudonymized.md is written into the correct class subfolder (new shared helper getClassSub())
  • "New class" button in the Corpus tab now opens CorpusModal instead of window.prompt (blocked in Electron); window.confirm/window.prompt replaced throughout by ConfirmModal/TextInputModal
  • Removed the "next to source" export destination option
  • Various fixes from the Obsidian community plugin review (no require(), no unnecessary type assertions, no floating promises, setDestructive() instead of deprecated setWarning())

[prod] v0.1.6 — 17 May 2026

New features

Corpus tab

  • New Corpus tab (last in the panel) — transcription files organized by class with status badges: rule count, pseudonymized version, final export format
  • Class management: create, rename (coming), delete classes (moves files to root)
  • Move files between classes: dropdown per file — moves .md + .mapping.json + .words.json + audio + source files in sync
  • Export destination settings (inline in the tab): vault folder (with optional class-structure mirroring), next to source, or external folder; FolderSuggest autocomplete on all folder fields
  • FolderSuggest component — folder autocomplete in Settings and Onboarding wizard

Scan modal — per-occurrence candidates

  • MappingScanReviewModal: occurrence count column is now a clickable button showing N / total when some are ignored
  • OccurrencesContextModal: per-occurrence cards (✓ / ✗ / ⚠) with context, "Confirm selection" callback, no immediate application
  • "Save exceptions" button: persists ignored decisions in mapping.json without pseudonymizing
  • Pre-fills decisions from existing ignoredOccurrences on re-open
  • MappingRuleResult now carries occurrences: Occurrence[]

Exceptions

  • IgnoredOccurrence {text, contextBefore, contextAfter} on MappingRule.ignoredOccurrences
  • Persisted in mapping.json, loaded at startup — red highlighting without re-scanning
  • Red highlighting: context-aware, position-based via findByContext() — only the specific ignored occurrence is red, not all occurrences of the word
  • findSpansForRule() skips ignored occurrences — they are not pseudonymized on export
  • Right-click "Declare as exception here" on orange terms (captures 30-char context)
  • Exceptions section in Mappings tab with context cards and delete button

Exports

  • markdownToSrt() and markdownToCha() — re-export pseudonymized Markdown back to SRT/CHAT
  • resolveExportPath() — mirroring class structure from mapping folder when file is in exports
  • writeExport() — vault, next-to-source, or external (Node.js fs); ensures parent folder
  • Exports tab: button adapts based on whether active file is source or pseudonymized export; hides pseudonymize button for files already in exports folder

Filename warning

  • Banner above the tab bar when active file's name contains a pseudonymizable term
  • Two buttons: ✏ manual rename prompt · apply neutral suggestion (transcript_N)
  • suggestCorrectedFilename() — neutral naming, auto-incremented, no replacement leak
  • Status labels clarified: "Active / Partial / Ignored / Suggested"
  • getValidatedFor() includes partial as active

Rename cascade

  • vault.on('rename') listener — automatic cascade when user renames via Obsidian explorer
  • cascadeRelatedRename() — updates: frontmatter (app.fileManager.processFrontMatter), .mapping.json (store scope + rule scopes), .words.json, pseudonymized exports, audio (same basename + pseudobs-audio reference), source files (.srt/.vtt/.cha/.html/.yml)
  • Audio strategy: renames audio with same basename AND audio referenced by pseudobs-audio (noScribe, different basename)
  • Guard flag _renamingRelated prevents cascade loops
  • moveFileToClass() also moves audio and updates both store-level and rule-level scope paths

Fixes

  • renameFileAndRelated: capture oldFilePath before vault.rename() (TFile mutated in-place)
  • Audio rename: capture oldAudioName before rename (same mutation issue)
  • processFrontMatter for all frontmatter updates (regex was unreliable)
  • Both store-level scope.path and individual rule scope.path updated on move/rename
  • esbuild: copyStylesPlugin copies styles.css to test vault on each dev rebuild

[prod] v0.1.5 — 17 May 2026

New features

noScribe integration

  • VttParser — standard WebVTT with Whisper word-level timestamps (<00:00:01.240><c>word</c>), speaker tags <v Name>, round-trip guarantee
  • NoScribeHtmlParser — Qt Rich Text HTML produced by noScribe: ts_START_END_SXX anchors (ms), speaker labels (S00:, S01:), display timestamps filtered, HTML entities decoded; extractAudioSource() reads <meta name="audio_source">
  • NoScribeVttParser — noScribe VTT v0.7: split cues (label / display timestamp / text), speaker detection from SXX: prefix, HTML entity decoding, audio source from NOTE media:
  • noScribe Markdown format**S00** [HH:MM:SS] : text per turn; pseudobs-format: html|vtt and optional pseudobs-audio in frontmatter; word timestamps in <basename>.words.json
  • Audio import — automatic on HTML import (via audio_source meta) and on VTT import via file picker (single audio file in source folder)
  • Redaction.ts — syllable-count redaction with 🀫; generateRedaction() and isRedaction()
  • VTT re-export (Export as VTT command) — clean WebVTT from pseudonymized .md + .words.json

Scan modal — per-occurrence candidates

  • MappingScanReviewModal — occurrences column is a clickable button (count updated live to N / total when some are ignored)
  • OccurrencesContextModal — per-occurrence cards (✓ / ✗ / ⚠) with context, "Confirm selection" callback, no immediate application
  • "Save exceptions" button — saves ignored decisions to mapping.json without pseudonymizing
  • MappingRuleResult now carries occurrences: Occurrence[]

Exceptions

  • IgnoredOccurrence type ({text, contextBefore, contextAfter}) on MappingRule.ignoredOccurrences
  • Persisted in mapping.json, loaded at startup — red highlighting without re-scanning
  • Red highlighting (pseudobs-exception, case-sensitive, priority 0)
  • Exceptions section in Mappings tab — context cards with delete button

Changes

  • Status labels: validated → "Active", ignored → "Ignored", partial → "Partial", suggested → "Suggested"; column renamed "State"
  • getValidatedFor() now includes partial as active (alongside validated)
  • PseudonymizationView scan button fixed (missing occurrences in MappingRuleResult)

Tests

149 tests · 10 suites · VttParser, NoScribeHtmlParser, NoScribeVttParser, markdownToVtt, extractWordData covered; fixtures: fight_club.vtt, juste-leblanc.html


[prod] v0.1.4 — 16 May 2026

Branch: main | Tag: upcoming

New features

  • Internationalization (i18n) — all UI strings externalized into src/i18n/locales/en.json and fr.json; language switchable from wizard and settings without restart
  • Language step in wizard — first step after welcome; bilingual display before a language is chosen
  • Storage step in wizard — folder configuration + "one vault per corpus" recommendation
  • Settings reorganization — 6 sections in order of usage frequency: General · Text detection · Pseudonymization · NER · Storage · Security; language dropdown at the top
  • Corpus organization (Organize corpus command) — named classes (sub-folders) mirrored across transcriptions/, mappings/ and exports/; class selection on import
  • Broad-scope warning for name rules — dynamic callout in RuleModal and EditRuleModal when a first name/surname rule is set to folder or vault scope; green success callout for file scope
  • Mappings tab — grouped by scope — three sections (File / Folder / Vault) with "Active file only" checkbox (checked by default)

Changes

  • README, CHANGELOG, ROADMAP now in English; French versions archived as *.fr.md
  • EditRuleModal, QuickPseudonymizeModal fully migrated to t()

[prod] v0.1.3 — 14 mai 2026

Branche : main | Tag : 0.1.3

Nouvelles fonctionnalités

  • Système de dictionnaires structurés — format DictionaryFile v1.1 : champs roles (détection / remplacement / classes), configSchema (variables configurables avec valeurs possibles), config (valeurs actives), author, doi
  • DictionaryLoader — service de chargement, index de détection normalisé, résolution de classes par conditions/regex/word-to-word, calcul d'index incrémental par portée
  • Repo dédié pseudobsidian-dictionaries — catalogue de dictionnaires téléchargeables, premier dictionnaire : communes françaises GeoAPI INSEE (34 957 entrées, classes Village → Métropole)
  • Wizard — catalogue de dictionnaires : tableau scrollable avec bouton icône cloud-downloadrefresh-cw (spin) → cloud-check ; installation depuis le repo dédié sans quitter Obsidian
  • scripts/build-cities.mjs — script one-shot de génération du dictionnaire communes depuis GeoAPI INSEE
  • Scan par dictionnaire (Onglet Dictionnaires → Scanner) : fenêtre glissante de n-grammes, filtre par dictionnaires cochés, commande Ctrl+P disponible
  • DictScanReviewModal — modale de révision en cards : terme source, catégorie (tiny), extrait de contexte avec terme surligné, préfixe éditable + index calculé en lecture seule (recalcul dynamique si décoché), checkbox par card
  • MappingScanReviewModal — modale de révision pour le scan par règles : tableau source → remplacement · occurrences, application directe dans le fichier source
  • Onglet Mappings — bouton "Scanner le fichier" ouvre MappingScanReviewModal
  • Onglet NER — bouton "Identifier des candidats" en haut de l'onglet
  • RuleModal — suggestions de remplacement par classe (dictionnaire) séparées des suggestions Coulmont ; modal Coulmont n'affiche plus les suggestions dictionnaire (prénoms ≠ lieux)

Suppressions

  • Onglet "Candidats" supprimé — le scan par règles est maintenant dans Mappings, le scan NER dans NER

Corrections

  • DictScanReviewModal : l'index n'est plus modifiable manuellement — seul le préfixe l'est, l'index se recalcule quand on coche/décoche des items
  • CSS : animation spin sur l'icône de téléchargement en cours, mini cards dictionnaires dans le panneau

[prod] v0.1.2 — 13 mai 2026

Branche : main | Tag : 0.1.2

Corrections

  • setInterval/clearInterval remplacés par partage de Promise dans OnnxNerScanner — plus de polling, appels concurrents correctement gérés

[prod] v0.1.1 — 13 mai 2026

Branche : main | Tag : 0.1.1

Nouvelles fonctionnalités

  • Onglet Dictionnaires — liste les .dict.json du vault avec nombre d'entrées, import et suppression

Corrections portail communautaire Obsidian

  • onunload : suppression de detachLeavesOfType
  • eslint-disable et any : type TransformersModule explicite dans OnnxNerScanner
  • window.setInterval/clearInterval, window.setTimeout, activeDocument
  • FileManager.trashFile() à la place de Vault.delete()
  • activeLeaf déprécié → getActiveViewOfType(ItemView)
  • Imports inutilisés supprimés (Setting, RuleLocation, fs)
  • Promises dans les event listeners wrappées avec void (async () => {})()
  • CSS text-decoration-colorborder-bottom (support partiel)
  • Workflow .github/workflows/release.yml — attestations GitHub Actions
  • Régénération package-lock.json (erreur CI concat-map 404)

[prod] v0.1.0 — 13 mai 2026

Branche : main | Tag : 0.1.0

[dev] v0.1.0 — en cours

Branche : dev | Publié : non

Nouvelles fonctionnalités

  • Panneau latéral (PseudonymizationView) — 5 onglets : Candidats, Mappings, Dictionnaires, Exports, NER
  • Détection NER (OnnxNerScanner) — modèle BERT-NER multilingue via transformers.js (WASM, 100 % local)
    • Surlignage bleu des candidats dans l'éditeur
    • Filtrage des sous-termes de règles composées (Saint-Jean-de-Luz filtre Jean/Luz)
    • Paramètres ajustables : seuil de confiance, mots fonctionnels exclus (onglet NER)
  • Wizard onboarding — 3 étapes : bienvenue, setup NER (téléchargement WASM ~19 Mo), import dictionnaires
  • Marqueurs {{...}} activés par défaut dans les remplacements en direct et les exports
  • Clic droit → Annuler la pseudonymisation — restaure le terme original (sur termes verts)
  • Surlignage : vert + souligné pour les remplacements en direct ; fichiers *.pseudonymized.* surlignés avec les règles du fichier source
  • Import de dictionnaires .dict.json depuis le wizard
  • Paramètres NER : nerBackend, nerMinScore, nerFunctionWords dans les settings
  • eslint_violations.md — référence du lint Obsidian et commande de test local

Corrections

  • style.marginLeft → classe CSS (no-static-styles-assignment)
  • Icônes UI (✓ ✗ ← → +) déplacées en CSS ::before/::after
  • getActiveFile() polyfill pour le panneau latéral (garde le dernier fichier connu)
  • import.meta.url polyfill dans esbuild pour @xenova/transformers/src/env.js
  • Alias onnxruntime-node → ort-web.node.js pour éviter les binaires natifs non bundlables
  • env.cacheDir fixé avant pipeline() (évite path.join(null, ...))
  • Références institutionnelles incorrectes supprimées (ICAR, CNRS)

Technique

  • @xenova/transformers v2.17.2 ajouté comme dépendance
  • esbuild : target: es2020, platform: browser retiré, banner polyfill import.meta.url
  • tsconfig.json : target ES2020, lib ES2020

[prod] v0.0.4 — 12 mai 2026

Branche : main | Tag : 0.0.4 | Publié : GitLab + GitHub (core-hn/pseudobsidian-ization)

Corrections bot Obsidian

  • Suppression du heading "Pseudonymizer tool" en tête des settings (settings-tab/no-manual-html-headings)

[prod] v0.0.3 — mai 2026

Branche : main | Tag : 0.0.3

Corrections bot Obsidian (Required)

  • style.cssText et setAttribute('style') → classes CSS (no-static-styles-assignment)
  • Headings <h2>/<h3> dans les settings → new Setting().setHeading() (settings-tab/no-manual-html-headings)
  • Promesses flottantes → opérateur void (no-floating-promises)
  • Sentence case sur les labels UI

[prod] v0.0.2 — mai 2026

Branche : main | Tag : 0.0.2

Changements

  • Rename du plugin : pseudobsidianizationpseudonymizer-tool (exigence répertoire communautaire)
  • Description manifest.json en anglais

[prod] v0.0.1 — mai 2026

Branche : main | Tag : 0.0.1

Première release

  • Parsers SRT et CHAT/CHA avec round-trip garanti
  • Moteur de pseudonymisation (spans, priorité z-index, protection chevauchements)
  • Portées fichier / dossier / vault
  • Surlignage CM6 (orange = sources, vert = remplacements)
  • Validation sélective par occurrence (OccurrencesModal)
  • Import de transcriptions avec conversion automatique
  • Intégration Coulmont (suggestions de prénoms sociologiquement équivalents)
  • Soumission PR #12766 au répertoire communautaire Obsidian