No description
  • Rust 60.9%
  • TypeScript 19.8%
  • Svelte 8.8%
  • Shell 5.4%
  • JavaScript 3.3%
  • Other 1.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Chipster d8c7a5a3aa
Some checks failed
ci.yml / fix(tooling): la mesure de couverture du push n'exporte plus les binaires de test périmés (push) Failing after 0s
fix(tooling): la mesure de couverture du push n'exporte plus les binaires de test périmés
Verdict de couverture du push 7f52dea : rouge sur quatre fichiers, dont des lignes de
commentaire comptées « non couvertes » (cii_serialize.rs 6/10, xmp_facturx.rs 0/3,
pdf_recovery.rs 68/101).

Cause : le cache instrumenté (target/llvm-cov-target) persiste d'un push à l'autre. Une
dépendance ou une version qui monte change l'empreinte des binaires de test, et l'ancien
binaire reste à côté du nouveau. exporterLcov passait à llvm-cov tous les binaires qui
portent le nom d'une cible de la crate : 79 pour facturation dont 52 périmés, 82 pour
installation dont 40, 2 pour pdf-pipeline dont 1. llvm-cov rend alors à 0 les lignes de
l'ANCIENNE version des fichiers ; dès qu'un fichier a bougé, ces numéros tombent sur
des lignes neuves que le binaire courant n'instrumente pas.

Correctif : l'export ne prend que les binaires que cargo vient de lancer.
- lancer garde la sortie d'erreur de la mesure, toujours montrée au fil de l'eau ;
- binairesLances y lit les lignes « Running <cible> (<chemin>) » de cargo ;
- binairesDe croise cette liste avec les cibles de la crate ;
- sans aucune ligne « Running », la mesure ne conclut pas : jamais un export de tout le
  cache par défaut.

Test renommé, attente inversée (une ligne dans tests-retires.md, compte 41 → 42) :
« deux empreintes de la même cible (binaire périmé) : les deux sont gardées, comme
cargo-llvm-cov » fixait le défaut.

Mesure refaite sur les trois crates avec l'outil corrigé : 27, 42 et 1 binaires exportés
au lieu de 79, 82 et 2 ; verdict vert sur la plage 590da40..4ec33b4 (cii_serialize.rs
6/6, pdf_recovery.rs 70/70, hors zone critique 9/9). Le seul vrai manque du verdict
(merge.rs, refus d'un PDF sans page) a reçu son test unitaire dans 4ec33b4a. Le verdict
rouge et sa suite sont classés au journal du rodage.

Vérifié : node --test scripts/tests/qualite-mesure-rust.test.mjs
scripts/tests/tests-retires.test.mjs, aussi sous LC_CTYPE=C.UTF-8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MVe6iK17eLgN88MwgixNS
2026-10-03 00:35:31 +02:00
.agents/skills refactor(tooling): le pied Tests-Added est retiré, la mesure le remplace (D21) 2026-10-01 18:29:33 +02:00
.cargo feat(tooling): les fichiers de test voisins sortent du plafond de lignes et de la mutation (D36) 2026-10-01 19:57:24 +02:00
.claude fix(tooling): la preuve rouge ne conclut que si chaque test demandé a tourné 2026-10-02 08:23:21 +02:00
.forgejo/workflows ci(tooling): la copie des scripts de release ne relance plus le déploiement Ansible 2026-09-30 09:01:23 +02:00
.husky feat(tooling): le pre-push mesure la couverture du diff et tient le registre des pushes 2026-10-02 00:43:30 +02:00
.vscode feat: wp1 v1 alpha foundations + fortification (squash merge) 2026-05-18 03:05:43 +02:00
benches feat: wp1 v1 alpha foundations + fortification (squash merge) 2026-05-18 03:05:43 +02:00
crates test(ged): le refus d'un PDF sans page par le probe a son test unitaire 2026-10-03 00:24:37 +02:00
docs fix(tooling): la mesure de couverture du push n'exporte plus les binaires de test périmés 2026-10-03 00:35:31 +02:00
frontend test(ui): seuils de couverture front recalés sur la mesure du lot 1 (D38) 2026-10-02 18:43:35 +02:00
infra ci(tooling): la copie des scripts de release ne relance plus le déploiement Ansible 2026-09-30 09:01:23 +02:00
packages fix(design-system): pile de modales centralisée, avertissement au 3e niveau 2026-09-30 21:57:20 +02:00
scripts fix(tooling): la mesure de couverture du push n'exporte plus les binaires de test périmés 2026-10-03 00:35:31 +02:00
src-tauri fix(install): licence bêta d'une page, affichée par l'installeur (R7-5) 2026-09-30 17:04:18 +02:00
tests feat(ged): une seule taille maximale de pièce, le Word aller-retour compris 2026-09-30 03:33:23 +02:00
.editorconfig chore: cleanup repo avant writing-plans final 2026-05-16 02:10:03 +02:00
.gitattributes chore: cleanup repo avant writing-plans final 2026-05-16 02:10:03 +02:00
.gitignore test(facturation): validation Factur-X bout-en-bout via le chemin d'emission (J7.1) 2026-05-30 14:57:00 +02:00
.npmrc feat: wp1 v1 alpha foundations + fortification (squash merge) 2026-05-18 03:05:43 +02:00
.nvmrc chore(deps): dep-log backfill 5 dev-deps + lopdf re-vet + .nvmrc (b48) 2026-05-22 21:22:28 +02:00
AGENTS.md docs(process): l'état courant annonce la bêta 0.1.0 taguée, plus B1 à venir 2026-10-01 23:43:51 +02:00
ARCHITECTURE.md docs(transverse): README, ARCHITECTURE et CONTRIBUTING recollés à l'état réel 2026-09-30 09:01:27 +02:00
bench-config.toml feat: wp1 v1 alpha foundations + fortification (squash merge) 2026-05-18 03:05:43 +02:00
Cargo.lock fix(deps): lopdf 0.44 et quick-xml 0.42, un PDF piégé ne fait plus tomber l'impression 2026-10-02 23:15:23 +02:00
Cargo.toml chore(deps): la crate mutants rejoint les six crates critiques 2026-10-01 20:33:54 +02:00
CHANGELOG.md feat(ged): une seule taille maximale de pièce, le Word aller-retour compris 2026-09-30 03:33:23 +02:00
CLAUDE.md docs(process): l'état courant annonce la bêta 0.1.0 taguée, plus B1 à venir 2026-10-01 23:43:51 +02:00
clippy.toml feat: wp1 v1 alpha foundations + fortification (squash merge) 2026-05-18 03:05:43 +02:00
commitlint.config.cjs chore(ci): autoriser le scope commit 'agenda' (module Agenda alpha-1.10ter) 2026-05-31 01:36:12 +02:00
CONTRIBUTING.md refactor(tooling): le pied Tests-Added est retiré, la mesure le remplace (D21) 2026-10-01 18:29:33 +02:00
deny.toml chore(deps): autoriser la licence 0BSD (permissive) dans deny.toml 2026-06-03 08:16:58 +02:00
docker-compose.test.yml fix(mail): un dossier IMAP absent n'avorte plus le cycle de sync 2026-09-09 13:09:42 +02:00
knip.config.ts chore(deps): Stryker pour la mutation nocturne des fichiers front critiques 2026-10-02 03:33:22 +02:00
LICENSE fix(install): licence bêta d'une page, affichée par l'installeur (R7-5) 2026-09-30 17:04:18 +02:00
package.json chore(tooling): knip frontend bloquant en husky et agent-check (V1-52) 2026-10-01 00:52:33 +02:00
pnpm-lock.yaml chore(deps): Stryker pour la mutation nocturne des fichiers front critiques 2026-10-02 03:33:22 +02:00
pnpm-workspace.yaml chore(tooling): retirer le script de l'add-in et l'espace apps/ 2026-09-26 11:05:42 +02:00
README.md fix(install): licence bêta d'une page, affichée par l'installeur (R7-5) 2026-09-30 17:04:18 +02:00
rust-toolchain.toml spike(facturation): tranche lib PDF/A-3 = krilla 0.8 + bump MSRV 1.88→1.92 (toolchain 1.96) 2026-05-30 01:36:55 +02:00

Scribe

Logiciel de gestion de cabinet d'avocat moderne, cross-platform et IA-augmenté.

Statut : bêta Windows livrée (première bêta : v0.1.0-beta, notes complètes → docs/release-notes/v0.1.0-beta.md). Cœur métier complet livré : Annuaire, Dossiers, GED, Mail, Temps, Facturation, Templates, Agenda, Dashboard, Installation/MAJ, Configuration, Recherche globale — utilisé en remplacement d'Audience par l'alpha-testeuse. Agents IA (WP5) en stand-by jusqu'au déploiement d'Ollama en local (visé V1.5). Version exacte : Cargo.toml (workspace) ou git tag --sort=-v:refname | head -1 — elle dérive, ne pas la recopier ailleurs.

Statut détaillé → CLAUDE.md ; historique des jalons → docs/process/historique-jalons.md.


Installation

Voir docs/release-notes/ (notes par version) et docs/process/historique-jalons.md (jalons) pour les détails des releases (features livrées + known issues).

Téléchargement

Windows uniquement pour l'instant (le Mac viendra après la bêta). Bundle non signé : au premier lancement, Windows Defender SmartScreen affiche un avertissement — c'est attendu (le certificat de signature n'est pas encore posé), confirmer manuellement (« Informations complémentaires » → « Exécuter quand même »).

Plateforme Architecture Fichier Où
Windows 11 x86_64 (MSVC) scribe-<version>.msi Forgejo Releases

Premier lancement

Assistant d'installation guidé (compte → recovery → apparence → diagnostics). Imprimer la recovery card PDF générée à l'étape recovery — sans elle, pas de récupération possible en cas de mot de passe oublié. Procédure détaillée pas à pas (poste vierge, SmartScreen, premier lancement) → docs/process/beta-checklist-poste-windows-vierge.md. Mises à jour automatiques (vérif. toutes les 24 h) → docs/user/13-installation/01-mises-a-jour.md.

Désinstallation

Windows : Paramètres → Applications → Scribe → Désinstaller. La base et les sauvegardes dans %APPDATA%\Scribe\ sont conservées (suppression manuelle si voulu).


Vision

Scribe est conçu pour remplacer (puis concurrencer) le logiciel Audience de FBI Services en apportant :

  • Une UI moderne et sobre : design system natif premium (Things 3 / Bear-like), 6 palettes accent, densité confortable/dense
  • Cross-platform natif : Windows, macOS, Linux desktop (mobile éventuel en V2)
  • Trois agents IA intégrés progressivement :
    • α-2 Automatisation proactive (41 cas, rule engine + LLM classifier + apprentissage par observation)
    • α-3 Rédacteur à la voix de l'avocat (16 toggles, RAG sur archives, 3 modes)
    • α-4 Conversationnel (15 toggles, function calling, UI tools)
  • Rattachement des mails depuis n'importe quelle messagerie : l'avocat glisse le mail dans un dossier IMAP « Scribe », Scribe propose le dossier ; factures et relances partent en brouillon déposé dans la boîte (décision 2026-09-24, spec ; le pont add-in Office.js est abandonné, ADR-0139)
  • Contrôle utilisateur granulaire : toggles hiérarchiques (master switch global → par agent → par sous-fonction), master kill switch en 2 clics, chaque cas IA activable/désactivable individuellement
  • Conformité RGPD + déontologie barreau : embeddings 100% locaux dès V1 alpha, données chiffrées SQLCipher, recovery passphrase, option LLM 100% local en V2
  • Observabilité opt-in : Sentry self-hosted (greil.fr) avec PII scrub aggressive — aucune donnée client transmise

Stack technique

Couche Choix Note
Client desktop Tauri 2.11.x Shell natif Windows (WebView2) / macOS (WebKit) / Linux (WebKitGTK)
Backend client Rust 1.96 (MSVC sur Windows) MSRV 1.96 (krilla, lib PDF/A-3 Factur-X — cf ADR-0109) ; antérieurement 1.88 pour Tauri 2.11. See rust-toolchain.toml
Node ≥20 (testé 24) Frontend toolchain via pnpm
pnpm ≥9 Package manager via corepack
UI frontend Svelte 5 (runes) + SvelteKit 2 + CSS vanilla adapter-static pour Tauri
Logique métier partagée Crate Rust domain —
DB locale SQLCipher 4.x (rusqlite + bundled-sqlcipher) Chiffré AES-256, prévu α-0.4+
Mode cabinet (0.2.0, post-bêta) Binaire unique, dispatch CQRS local/distant, Axum embarqué (ADR-0131) Doc + ADR-0131/0132/0133 seuls — rien n'est codé, pas de plan d'implémentation ; la base reste SQLite/SQLCipher (pas de Postgres)
LLM provider Trait LLMProvider + mock (crate llm-provider) Impl V1 visée : Ollama local (ADR-0112), pas encore câblée (WP5 en stand-by). L'ancienne piste « Claude Agent SDK + abonnement OAuth » est abandonnée, code retiré le 2026-09-12
Embeddings bge-m3 local (LocalEmbedder tokio actor) —
Store vectoriel sqlite-vec Solo et mode cabinet (ADR-0131 abandonne Postgres, donc pas de pgvector)
Tests proptest, insta, wiremock, greenmail, criterion, vitest, MSW, Playwright + CDP, cargo-llvm-cov —
CI Désactivée en V1α (workflows Forgejo if: false) Gates locaux via .husky/ (pre-commit, commit-msg, pre-push → agent-check scope) ; seuls deploy-infra.yml et sync-release-scripts.yml tournent sur push main (infra serveur, pas le code applicatif)
Observabilité Sentry self-hosted (opt-in, anonymisé) Diagnostics (erreurs + usage) activés par défaut pendant la bêta (ADR-0134)

Roadmap

Livré

α-0 Fondations et α-1 Cœur métier (Annuaire → Dossiers → GED → Mail → Temps → Facturation → Templates → Dashboard → Install/MAJ → Rendez-vous → Configuration → Recherche globale — Clients fusionné dans Annuaire, ADR-0080) sont livrés, ainsi que la bêta Windows 0.1.0. Détail par sub-jalon → docs/process/historique-jalons.md.

À venir

Étape Contenu
0.2.0 — mode cabinet Multi-comptes + multi-postes, RBAC 4 rôles + ACL par dossier, MFA TOTP. Doc + ADR-0131/0132/0133 écrits, rien n'est codé (décision Tim : « on s'arrête à la doc » pour l'instant).
V1.0 Première version commercialisable (suit la bêta). RPVA/e-Barreau, facturation complète (volet comptable compris), mode cabinet et licensing sont bloquants pour la mise en vente (décision Tim 2026-09-13, révisée 2026-09-27).
V1.5 Agents IA — α-2 Automatisation (41 cas), α-3 Rédacteur (16 toggles), α-4 Conversationnel (15 toggles) — sur Ollama local, étape dédiée après la V1.0.
V2 Mobile, fine-tuning LoRA, agent debug in-app, Tailscale, migration depuis Audience, MCP server scribe-context.

Politique qualité (vibe code solo → maintenabilité long terme)

Scribe est développé en solo (Timothy) avec assistance IA (agents Claude/Codex). Pas de reviewer humain régulier ; les filets en place :

  • TDD strict : tests d'abord, seuils coverage différenciés par crate (gate local-first ; seuils canoniques → scripts/coverage-gate.sh + ADR-0099)
  • Linting strict local : clippy pedantic + nursery + cargo en deny (Cargo.toml [workspace.lints]), cargo-machete (dépendances Rust mortes, câblé en pre-commit). cargo-deny et Knip existent (deny.toml, pnpm lint:unused) mais ne sont câblés dans aucun gate actif — CI désactivée, personne ne les lance systématiquement
  • Hard limits complexité : 400 LOC/fichier .rs, 250 LOC/composant .svelte, 80 LOC/fonction, cognitive_complexity ≤ 15
  • Discipline commit : diff ≤ 400 LOC hors main (.husky/pre-push → pr-size-check.sh, whitelist footer Skip-PR-Size-Check:), Conventional Commits + commitlint, trunk-based — commits directs sur main (décision Tim 2026-09-28), pas de branche longue ni de revue Forgejo obligatoire
  • Ultrareview obligatoire avant merge (findings CRIT/HIGH bloquants) — le filet principal en l'absence de reviewer humain
  • ADRs MADR 4.0 light pour toute décision structurante (techno, migration BDD, flux IA, contrat API, renoncement)
  • Performance budgets : pas gardés automatiquement (CI désactivée) ; criterion tourne en local (crates/benches)
  • Évolution post-V1 alpha : mini-cycle brainstorm → spec → ADR → plan → impl TDD

Détail dans docs/superpowers/audits/2026-05-16-decisions-maintenabilite.md et spec transverse §9.6.

Documentation

Specs

Fichier Description
docs/superpowers/specs/2026-05-13-scribe-vision.md Doc de vision — référence permanente, toutes les décisions transverses
docs/superpowers/specs/2026-05-13-scribe-fondations-coeur-metier-design.md Spec transverse V1 alpha — DDL, commands, logging, §9.5 tests, §9.6 maintenabilité, plan sub-jalons
docs/superpowers/specs/2026-05-15-scribe-design-system-design.md Design system Native premium, palettes, tokens, ui-kit catalog
docs/superpowers/specs/2026-05-15-scribe-spec-utilisateur.md Spec utilisateur Marie — plain French, sans jargon
docs/superpowers/specs/modules/ Specs modules métier : Dossiers, Annuaire, GED/Documents, Mail, Temps passés, Facturation, Templates Word, Dashboard, Installation/MAJ, Configuration, Rendez-vous, Recherche globale (le module Clients est fusionné dans Annuaire via ADR-0080 — spec clients archivée, superseded)
docs/superpowers/specs/agents/ 3 specs agents IA (α-2, α-3, α-4)

Audits & décisions

Fichier Description
docs/superpowers/audits/2026-05-15-decisions-metier.md 16 décisions métier M1-M16
docs/superpowers/audits/2026-05-15-decisions-stack.md 15 décisions stack S1-S15
docs/superpowers/audits/2026-05-16-decisions-tests.md Politique tests TDD strict
docs/superpowers/audits/2026-05-16-decisions-maintenabilite.md Politique maintenabilité (linting, ADR, PR, Sentry, évolution)

Plans d'implémentation (5 WPs, 167 steps + 4 spikes)

Voir docs/superpowers/plans/ — historique par sub-jalon, quasi tous livrés (WP5 agents IA excepté, en stand-by).

Architecture Decision Records

Voir docs/adr/README.md — index complet, auto-régénéré par hook (le nombre d'ADR n'est pas recopié ici, il dérive à chaque décision).

Setup développement

Prérequis :

  • Rust (toolchain auto via rust-toolchain.toml) + components clippy rustfmt llvm-tools
  • Node.js LTS + pnpm (via corepack)
  • Tauri 2 CLI
  • Docker (pour greenmail IMAP/SMTP en tests E2E)
  • cargo-llvm-cov, cargo-deny, cargo-machete, cargo-criterion

Setup local

# 1. Activate pnpm via corepack (no global install needed)
corepack enable && corepack prepare pnpm@9 --activate

# 2. Install Node deps (auto-builds @scribe/ui-tokens via prepare hook)
pnpm install

# 3. Install Rust toolchain (auto-installed by rustup via rust-toolchain.toml)
rustup show

# 4. Verify
cargo check --workspace
cargo test --workspace
pnpm --filter @scribe/frontend run build

# 5. Run desktop dev shell (opens native window)
cargo install tauri-cli --version "^2.0" --locked  # one-time
cargo tauri dev

Branding

Le nom Scribe est un nom de travail (trademark + domaine non vérifiés). Le code applicatif est conçu pour rendre le rename trivial (1 module app-info central + i18n + crates Cargo aux noms techniques neutres). Voir doc vision §7. Coût attendu d'un rename : 30 minutes.

Licence

Logiciel propriétaire. Pendant la bêta, son usage est régi par la licence d'utilisation de LICENSE : usage gratuit au cabinet, ni revente ni redistribution. L'installeur Windows l'affiche (src-tauri/licence-beta.rtf, généré par node scripts/licence-rtf.mjs). Les composants tiers restent sous leurs propres licences.


Co-conçu avec Claude (Anthropic) — voir l'historique des commits.