re:group
Extension Firefox (cible 151+) qui range automatiquement les onglets dans des
groupes prédéfinis selon des expressions régulières sur les URLs.
La spécification complète du comportement est dans SPEC.md.
Fonctionnement
- Tu définis des groupes (nom + couleur + liste de regexp) dans la page de
configuration. - Quand un onglet (http/https, non épinglé) charge une URL qui matche les regexp
d'un groupe, il est placé dans ce groupe. - En cas de match multiple, gagne la regexp dont la sous-chaîne matchée est la
plus longue. - Si tu déplaces un onglet à la main, l'extension respecte ton choix jusqu'à ce que
l'URL change vers un autre groupe.- Le bouton "réorganiser" ne respecte pas ton choix manuel, par contre. Ça remettra ton
onglet dans son groupe.
- Le bouton "réorganiser" ne respecte pas ton choix manuel, par contre. Ça remettra ton
- Les onglets qui ne matchent rien ne sont jamais retirés d'un groupe.
- Les groupes sont par fenêtre ; les groupes vides sont supprimés par Firefox.
Structure
manifest.json Manifest V3, perms : tabs / tabGroups / storage
background.js Point d'entrée (event page) → branche les listeners
src/matcher.js Logique pure URL → groupe (testable hors navigateur)
src/config.js Modèle + persistance (storage.local), validation
src/state.js État runtime (storage.session) : instances, override
src/grouper.js Moteur : placement, déplacement, ré-organisation
src/i18n.js Helper i18n + applicateur DOM (data-i18n)
options/ Page de configuration (HTML/CSS/JS vanilla)
_locales/ Traductions (fr par défaut, en)
test/ Tests unitaires du matcher (node --test)
Langues
L'interface est traduite via l'API i18n des WebExtensions (_locales/fr et
_locales/en). Firefox choisit la langue selon la langue de son interface, avec
fr comme langue par défaut (default_locale). Pour ajouter une langue, créer
_locales/<code>/messages.json en copiant les clés d'un fichier existant.
Développement
Lancer Firefox avec l'extension chargée (rechargement à chaud) :
npx web-ext run
Ou charger manuellement : about:debugging → Ce Firefox → Charger un module
complémentaire temporaire → choisir manifest.json.
Vérifier
node --test test/matcher.test.mjs # tests de la logique de matching
npx web-ext lint --self-hosted # validation du manifest / des APIs
Distribution
Signature privée (« unlisted ») via AMO :
npx web-ext sign --channel=unlisted --api-key=… --api-secret=…