Ir al contenido

Arquitectura

Esta página ofrece una visión general del código para orientarse antes de contribuir. La referencia detallada (convenciones, agentes de Claude, convenciones de tests E2E) vive en el archivo CLAUDE.md del repositorio.

ArchivoFunción
src/entrypoints/background.tsService worker (MV3) o background script (MV2). Delega en src/background/.
src/entrypoints/content.content.tsContent script inyectado en todas las páginas. Captura los clics centrales y los clics derechos sobre los enlaces.
src/entrypoints/popup.htmlCáscara HTML del popup. La lógica vive en src/popup.tsx.
src/entrypoints/options.htmlCáscara HTML de la página Opciones. La lógica vive en src/options.tsx.

En src/background/:

MóduloFunción
index.tsArranque del background: registra los listeners, conecta el distintivo del icono e inicializa los espacios de trabajo.
grouping.tsCreación de grupos de Chrome a partir de las reglas. Extracción de nombre con regex sobre título / URL.
deduplication.tsDetección y cierre de duplicados. Gestión del Deshacer mediante deduplicationSkip.
organize.tsAcción Organizar pestañas: aplica las reglas a las pestañas ya abiertas.
event-handlers.tsVincula los listeners tabs.onCreated, tabs.onUpdated, tabs.onRemoved, etc.
messaging.tsMensajes background y popup (aviso del nombre de grupo, notificaciones).
migration.tsMigraciones one-shot: sync a local, alta del campo fallbackLabel, archivo de sesiones.
settings.tsLectura de los ajustes con fallback sobre los valores por defecto.
actionBadge.tsDistintivo G / D / X en el icono, sigue los interruptores globales del espacio activo.

En src/hooks/:

HookFunción
useSettingsLectura y escritura de los ajustes globales. Usa refs para prevenir condiciones de carrera.
useStorageStateFachada unificada para browser.storage.local y browser.storage.session.
useSessionsFachada para los tres compartimentos (pinned, active, archived) con hooks por bucket.
useSessionEditorEdición de una sesión: drag-and-drop, renombrado, eliminación de pestañas, anti-reentrada.
useStatisticsContadores aislados por espacio de trabajo.
useDeepLinkingSincronización del hash de la URL con el estado de UI (por ejemplo #sessions/archived).

En src/schemas/:

EsquemaCubre
common.tsTipos primitivos compartidos.
domainRule.tsUna regla de dominio.
enums.tsEnumeraciones (modos de nombrado, estrategias de dedup, acciones de restauración, distintivos).
importExport.tsFormato de los archivos de import-export, versión relajada para tolerar archivos antiguos.
session.tsUna sesión con sus pestañas y sus grupos internos.
workspace.tsMetadatos de un espacio de trabajo.
pack.tsManifiesto de un pack (packFileSchema).
category.tsUna categoría (emoji, etiqueta, builtIn).

En src/components/:

  • Core/: componentes ligados a un concepto de negocio. DomainRule/, Session/, Statistics/, TabTree/.
  • UI/: componentes de interfaz transversales. Header/, PopupHeader/, PopupToolbar/, Sidebar/, WizardStepper/, ImportExportWizards/, SessionWizards/, SettingsPage/, etc.
  • Form/: campos de formulario reutilizables (FormFields/).

El reparto se documenta en CLAUDE.md.

getMessage() en src/utils/i18n.ts es el único punto de acceso a las cadenas. Los mensajes viven en public/_locales/{en,fr,es}/messages.json. Cualquier cadena de UI (label, aria-label, title, placeholder) pasa por getMessage(). Sin strings codificados a mano.

Tres pipelines:

  • Vitest (tests/): tests unitarios de utils, hooks y módulos background.
  • Playwright E2E (tests/e2e/): recorridos funcionales sobre Chrome MV3.
  • Playwright doc-scenarios (e2e-doc-scenarios/): capturas narrativas para la documentación. No se ejecuta sobre las PR.

La arquitectura compartida de los tres pipelines (Page Objects, Domain Actions, fixtures-base) vive en e2e-shared/ y se documenta en su README.