Imported from meteored-status/svc-logs (
@mr/core/dev/AGENTS.md). Install upstream withnpx skills add meteored-status/svc-logs --skill dev. Copyright stays with the author.
AGENTS.md
Nota sobre este archivo: la copia canónica vive en
@mr/core/dev/AGENTS.mdy en la raíz del proyecto se expone mediante el enlace simbólicoAGENTS.md.
Contexto rapido del monorepo
web-wwwes un monorepo Yarn 4 (packageManager: yarn@4.16.0) con workspaces en@mr/*,framework/*,packages/*,services/*,jobs/*,cronjobs/*.- La orquestacion de desarrollo/build no se hace con scripts ad-hoc por servicio: se centraliza en
mrpack(@mr/cli/bin/mrpack.js). - Capas principales:
@mr/core/*(infra compartida),framework/services-comun(runtime legacy comun),services/*(apps desplegables),packages/*(librerias funcionales).
Arquitectura y limites entre componentes
- Los servicios Node arrancan con el patron
Main.ejecutar(Engine, Configuracion)(ejemplo:services/www-frontend/main.ts,services/www-estaticos/main.ts). - El ciclo de vida real (carga config, sidecar Istio, master/worker, shutdown cronjob) vive en
framework/services-comun/main.ts. - HTTP/WebSocket compartido vive en
@mr/core/network:- HTTP: router declarativo por
Routes+RouteGroup(@mr/core/network/server/http/README.md). - WebSocket:
createWSServer()singleton +IWSHandlertipado + streaming (@mr/core/network/server/websocket/README.md).
- HTTP: router declarativo por
- Integracion entre ambos: si un
RouteGroupdevuelve handlers WS engetWSHandlers(), el servidor WebSocket se inicia/expande automaticamente.
Flujos de trabajo criticos
- Desarrollo (ejecutar habilitados en
config.workspaces.json):yarn run devel - Compilar TODOS los workspaces habilitados (una sola vez, sin watch; termina al acabar):
yarn run packd(equivale ayarn mrpack devel -c). Solo compila los marcados como habilitados enconfig.workspaces.json(propiedadpackd.available/packd.disabled). - Un agente de IA que necesite compilar todo el proyecto debe usar SIEMPRE
-f/--forzarademás de-c:yarn mrpack devel -c -f(equivale ayarn run packd-f). Así se compilan también los workspaces deshabilitados enconfig.workspaces.json, sin que el resultado dependa de esa configuración local/por-desarrollador.yarn run packd(sin-f) puede dar una compilación incompleta si algún workspace está deshabilitado. - Compilar SOLO un workspace concreto (una sola vez, sin watch):
yarn run <workspace> run packd. - Ejecutar/depurar SOLO un workspace concreto (requiere que ya tenga
output/compilado):yarn run <workspace> run devel(run deven vez derun develsi su framework es Next.js). Ojo: esto ejecuta, no compila — para compilar ese workspace usarun packd(ver arriba). - Forzar todos los workspaces también en modo ejecución (incluye deshabilitados):
yarn run devel-f - Actualizacion de stack del monorepo:
yarn run update - Tras update, aplicar migraciones automatizadas SIEMPRE:
yarn run patch:apply. - Ejecutar scripts de un workspace desde raiz:
yarn run www-frontend <script>(atajo deyarn workspace www-frontend <script>). - No hay script raiz
test: las pruebas se lanzan por workspace,yarn run <workspace> test. De momento solo las tieneservices-comun(yarn run services-comun test); para el resto, valida con compilacion/watch del workspace afectado y comandosmrpack. - Se pueden y conviene escribir pruebas cuando la tarea lo permita — ver la seccion «Preferencias de flujo
de trabajo» de
.github/copilot-instructions.mdpara el criterio y las reglas del arnes (node:test, sin runners nuevos,*.spec.tsenspec/y nunca dentro demodules/).
Convenciones no obvias (importantes para agentes)
- Fuente canonica de convenciones AI:
.github/copilot-instructions.md(ojo:.github/es symlink a@mr/core/dev/.github/yAGENTS.mden raíz es symlink a@mr/core/dev/AGENTS.md). - Claude Code no lee
AGENTS.mdni.github/copilot-instructions.mdautomaticamente:CLAUDE.mden raíz (symlink a@mr/core/dev/CLAUDE.md) importa explícitamente ambos (@AGENTS.mdy@.github/copilot-instructions.md) para que reciba las mismas instrucciones sin duplicar contenido. Ojo: una mención a un fichero entre backticks (como la de la línea de arriba) es solo texto — no es un import; el import real requiere la sintaxis@rutasin backticks. - Mantener
CODEMAP.mden la misma tarea cuando haya cambios significativos (modulos, API publica, rutas, flujos o reorganizacion). Si no existe, crearlo y enlazarlo desde elREADME.mdmas cercano. - Esta regla se hace cumplir tambien mediante un hook
Stopde Claude Code (.claude/hooks/check-codemap.mjs, declarado en.claude/settings.json). Todo.claude/es symlink a@mr/core/dev/.claude/(igual que.github/), expuesto porinitClaudeDir()en@mr/cli/src/clases/init/symlinks.ts;.claude/settings.local.json(local) queda excluido tanto del envio del framework (@mr/core/dev/.claude/.mr-ignore) como del.gitignoreraiz de cada monorepo consumidor (**/.claude/settings.local.jsonen la plantillaIGNOREde@mr/cli/src/clases/init/ignore.ts), asi que nunca se versiona ni se propaga. Al terminar un turno con cambios sin comitear, agrupa los ficheros de codigo modificados por workspace (directorio conpackage.jsonmas cercano, excluyendo la raiz del monorepo) y bloquea una vez si algun workspace con cambios significativos (fichero nuevo, o >=15 lineas modificadas) no toco suCODEMAP.md, o suCHANGELOG.mdsi ya existia. Solo analiza working tree (no commits), y por el guardrailstop_hook_activede Claude Code el bloqueo ocurre como maximo una vez por intento de parada (evita bucles infinitos). Ver@mr/core/dev/README.mdy@mr/core/dev/.claude/CODEMAP.mdpara el detalle de la heuristica. - TypeScript estricto; evitar
anyexplicito salvo necesidad real. - Imports en 3 bloques con una linea en blanco: (1) node/publico, (2) otros workspaces, (3) local relativo; usar
typeen imports solo-tipo. - Entre workspaces usa imports por nombre de paquete (
@mr/core-network/...,services-comun/...), no rutas relativas cruzadas. - Logging: usar
info/errordeservices-comun/modules/utiles/log; evitarconsole.log. - Promesas diferidas: usar
Deferred<T>deservices-comun/modules/utiles/promise. - Propiedades de instancia se inicializan en constructor (no en declaracion),
if/else/for/whilesiempre con llaves, y sin dobles lineas en blanco en.ts/.js.
Integraciones externas y operacion
- Datadog esta integrado desde bootstrap (
services/*/app.js) y en WebSocket se propaga traza cliente-servidor via_datadog. - TLS/SNI HTTP espera certificados en
files/ssl/<dominio>/+ fallback enfiles/ssl/(ver@mr/core/network/server/http/README.md). framework/services-comun/main.tscomprueba sidecar enhttp://localhost:15020/healthz/readyy usa/quitquitquital cerrar cronjobs.mrpack frameworkopera paquetes compartidos contra GCS (updates/reset/send) y guarda logs entmp/log/*.pull.md.
Archivos que un agente debe leer primero
README.md(scripts raiz y flujo update+patch).github/copilot-instructions.md(reglas de estilo obligatorias)@mr/cli/README.md(modulosmrpack, especialmentedevel,update,framework)@mr/core/dev/README.md(tsconfig base, manifest, patches)@mr/core/network/server/http/README.mdy@mr/core/network/server/websocket/README.md(patrones de red y contrato runtime)