Por qué esta estructura
Ocho archivos, a propósito.
LocalLens vive en ocho archivos TypeScript bajo src/. Ocho no es
un número mágico — es la división más chica que le da a cada capa
una frontera clara sin dejar a ninguna apretujada.
Esta página explica por qué no es un archivo y por qué no son treinta.
Por qué no un solo archivo
Una versión de un solo archivo de LocalLens es tentadora a este tamaño. También está mal, por tres razones:
- La integración con QVAC no debería compartir archivo con código de UI. El lifecycle del modelo tiene sus propias preocupaciones — carga lazy, selección de fallback, limpieza de workspace. Enhebrar eso a través de un handler de UI lo enterraría o lo duplicaría.
- Los adaptadores de archivos no deberían compartir archivo con inferencia del modelo. El walk de carpeta y la normalización del file picker del navegador son independientes del paso de embedding. Mantenerlos separados te permite cambiar uno sin tocar el otro.
- Las fronteras visibles ayudan a los lectores. Alguien que
evalúa el codebase o considera una extensión puede leer solo
src/qvac.tspara aprender la superficie de QVAC, solosrc/files.tspara input, solosrc/locallens.tspara workflow. Un monolito los obliga a tener toda la cosa en su cabeza.
Por qué no sobre-arquitecturado
LocalLens deliberadamente no tiene:
- una jerarquía profunda de carpetas (
src/services/rag/qvac/embeddings/…); - interfaces abstractas de repositorio o "store";
- un framework de inyección de dependencias;
- una abstracción prematura de base de datos vectorial;
- un sistema de plugins;
- un pipeline de build a medida más allá de
bun build.
Cualquiera de esos sería razonable en una app más grande. Ninguno es un cuello de botella a este tamaño. Solo serían ceremonia que tendrías que leer antes de llegar al código real.
La forma que tiene
| Archivo | Posee |
|---|---|
domain.ts | Tipos y AppError. |
files.ts | Descubrimiento y adaptación de archivos. |
rag.ts | Chunking y el prompt fundamentado. |
qvac.ts | Integración con el SDK de QVAC. |
store.ts | Persistencia local en JSON. |
locallens.ts | El workflow del producto (LocalLensApp). |
cli.ts | Interfaz de terminal. |
server.ts | Interfaz HTTP. |
ui/ | Interacción del navegador. |
La siguiente página expande esto con lo que cada archivo no debería poseer. Las fronteras son más fáciles de defender cuando sabes qué hay del otro lado.
Cuándo agregar un archivo
Agrega un archivo nuevo cuando una pieza de código empieza a tener dos razones para cambiar. Si te encuentras metiendo mano en un módulo para tocar algo no relacionado a su nombre, esa es la señal — separa la cosa no relacionada, y deja que ambos tengan un solo trabajo.