Aller au contenu

Architecture

Cette page donne une vue d’ensemble du code pour s’orienter avant une contribution. La référence détaillée (conventions, agents Claude, conventions de tests E2E) vit dans le fichier CLAUDE.md du dépôt.

FichierRôle
src/entrypoints/background.tsService worker (MV3) ou background script (MV2). Délègue à src/background/.
src/entrypoints/content.content.tsContent script injecté dans toutes les pages. Capture les clics milieu et clics droits sur les liens.
src/entrypoints/popup.htmlCoquille HTML de la popup. La logique vit dans src/popup.tsx.
src/entrypoints/options.htmlCoquille HTML de la page Options. La logique vit dans src/options.tsx.

Dans src/background/ :

ModuleRôle
index.tsDémarrage du background : enregistre les listeners, branche le badge, initialise les workspaces.
grouping.tsCréation de groupes Chrome à partir des règles. Extraction de nom via regex sur titre / URL.
deduplication.tsDétection et fermeture des doublons. Gestion de l’annulation via deduplicationSkip.
organize.tsAction Organiser tous les onglets : applique les règles aux onglets déjà ouverts.
event-handlers.tsBind des listeners tabs.onCreated, tabs.onUpdated, tabs.onRemoved, etc.
messaging.tsMessages background ↔ popup (invite de nom de groupe, notifications).
migration.tsMigrations one-shot : sync→local, ajout du champ fallbackLabel, archive sessions.
settings.tsLecture des paramètres avec fallback sur les valeurs par défaut.
actionBadge.tsPastille G / D / X sur l’icône, suit les toggles globaux du workspace actif.

Dans src/hooks/ :

HookRôle
useSettingsLecture-écriture des paramètres globaux. Utilise des refs pour prévenir les races.
useStorageStateFaçade unifiée pour browser.storage.local et browser.storage.session.
useSessionsFaçade pour les trois compartiments (pinned, active, archived) avec hooks par bucket.
useSessionEditorÉdition d’une session : drag-drop, rename, suppression d’onglets, anti-réentrance.
useStatisticsCompteurs cloisonnés par workspace.
useDeepLinkingSynchronisation du hash de l’URL avec l’état UI (par exemple #sessions/archived).

Dans src/schemas/ :

SchémaCouvre
common.tsTypes primitifs partagés.
domainRule.tsUne règle de domaine.
enums.tsÉnumérations (modes de nommage, stratégies de dédup, actions de restauration, badges).
importExport.tsFormat des archives d’import-export, version relaxée pour tolérer les anciens fichiers.
session.tsUne session avec ses onglets et ses groupes internes.
workspace.tsMétadonnées d’un workspace.
pack.tsManifeste d’un pack (packFileSchema).
category.tsUne catégorie (emoji, label, builtIn).

Dans src/components/ :

  • Core/ : composants liés à un domaine métier. DomainRule/, Session/, Statistics/, TabTree/.
  • UI/ : composants d’interface transverses. Header/, PopupHeader/, PopupToolbar/, Sidebar/, WizardStepper/, ImportExportWizards/, SessionWizards/, SettingsPage/, etc.
  • Form/ : champs de formulaire réutilisables (FormFields/).

Le découpage est documenté dans CLAUDE.md.

getMessage() dans src/utils/i18n.ts est l’unique point d’accès aux libellés. Les messages vivent dans public/_locales/{en,fr,es}/messages.json. Toute chaîne UI (label, aria-label, title, placeholder) passe par getMessage(). Pas de string codée en dur.

Trois pipelines :

  • Vitest (tests/) : tests unitaires des utils, hooks, modules background.
  • Playwright E2E (tests/e2e/) : parcours fonctionnels sur Chrome MV3.
  • Playwright doc-scenarios (e2e-doc-scenarios/) : captures narratives pour la documentation. Pas exécuté sur les PRs.

L’architecture partagée des trois pipelines (Page Objects, Domain Actions, fixtures-base) vit dans e2e-shared/ et est documentée dans son README.