El pipeline de build
La secuencia fija de fases que convierte un proyecto en una aplicación ColdBox.
On this page
El pipeline de build
bxAgents build ejecuta una secuencia fija de fases, una vez, produciendo una aplicación ColdBox normal. Nada de esto se vuelve a ejecutar en tiempo de request - ese es todo el sentido del ensamblaje en tiempo de build. Esta página recorre las fases en el orden exacto en que BuildPipeline.bx las ejecuta.
flowchart TD
A["1 · Resolver config<br/><small>AgentConfigResolver</small>"] --> B["2 · Descubrir<br/><small>ProjectDiscoverer</small>"]
B --> C{"3 · Validar<br/><small>ProjectValidator</small>"}
C -->|"cualquier error"| X["El build lanza una excepción.<br/>.build/app nunca se escribe ni se toca"]
C -->|"limpio<br/><small>las advertencias nunca bloquean</small>"| D["4 · Generar"]
D --> D1["1 Interceptores"] --> D2["2 Gateways"] --> D3["3 MCP"] --> D4["4 Router"]
D4 --> D5["5 Interfaz web"] --> D6["6 Esqueleto de app principal"] --> D7["7 Copia de tools/skills"] --> D8["8 Scheduler"]
D8 --> E["5 · Normalizar + escribir<br/><small>ManifestNormalizer</small>"]
E --> F[".build/manifest.json<br/>+ .build/app - una aplicación ColdBox normal"]
style C fill:#fff3cd,stroke:#856404
style X fill:#f8d7da,stroke:#721c24
style F fill:#d4edda,stroke:#155724
La validación es la puerta: recopila todos los errores en lugar de fallar rápido, y nada se genera hasta que vuelve limpia.
(El empaquetado en un .bxa es un paso deliberadamente separado - ver Despliegue y secretos - para que un ciclo rápido de build → inspeccionar → build de nuevo nunca pague un costo de empaquetado que no necesita.)
1. Resolver config
AgentConfigResolver carga Agent.bx, invoca configure() y el método de override del entorno activo, luego fusiona en profundidad boxlang.json/boxlang-{env}.json/miniserver.json/miniserver-{env}.json si están presentes. Produce el único struct de configuración resuelto del que lee cada fase posterior.
2. Descubrir
ProjectDiscoverer recorre la raÃz del proyecto y enumera cada carpeta de convención (models/, tools/, skills/, subagents/, gateways/, mcp/, interceptors/, modules/) en entradas crudas { name, path, type }. schedules/ es la única excepción - no es una lista de entradas, solo un único par hasScheduler/schedulerPath, ya que contiene un archivo real de scheduler de ColdBox en lugar de un conjunto de entradas de configuración definidas por BX Agents. Descubrimiento puro - todavÃa no ocurre ninguna interpretación del contenido de los archivos.
3. Validar
ProjectValidator ejecuta cada validador y recopila todos los errores (nunca falla rápido) más cualquier advertencia: nombres duplicados de tool/skill/model/subagent, names de agente duplicados a través de todo el árbol de subagentes (ver subagents/), referencias circulares de subagente/módulo, las dos formas de entrada de gateway, la completitud de configuración de MCP remoto, y la validez de modelo/proveedor. Si se recopiló algún error, el build lanza una excepción inmediatamente aquà - no se escribe ni se toca .build/app. Las advertencias (por ejemplo, una carpeta schedules/ sin Scheduler.bx dentro) nunca bloquean el build.
4. Generar
Solo se alcanza una vez que la validación está limpia. En orden:
- Interceptores -
InterceptorSplittercopia los interceptores de scopeagenta.build/app/interceptors, los de scoperuntimea un directorio separado.build/runtime-interceptors. - Gateways -
GatewayGeneratoremite sentenciasaiGatewayRegistry().register(...)para las entradas de tipo channel-adapter, y (si alguna estype: "http") escribe.build/app/handlers/Gateway.bx. Si alguna entrada es un gateway de estilo push (por ejemplo,type: "telegram"), también escribe.build/app/interceptors/GatewaySessionBootstrap.bx, conectando un únicoGatewaySessionde bx-ai (agrupando cada gateway de estilo push) al agente raÃz del proyecto. - MCP -
McpGeneratorcopia los servidores localesmcp/*a.build/app/mcpy emite sus sentencias de registromcpServer(...).registerTool(...). - Router -
RouterGeneratorescribe.build/app/config/Router.bx: unroute(path).toAi(...)/toMCP(...)por entrada de exposición, más las 3 rutas fijas de webhook de gateway si existe un channel gateway de tipohttp. - Interfaz web -
WebUiGeneratorse ejecuta para cualquier entradaexposes: "webui", escribiendo el<path>/index.htmlestático,handlers/ChatUi.bx(la API de veinte acciones),models/ChatDb.bx(el almacén SQLite y sus migraciones exclusivamente hacia adelante),interceptors/WebUiSchema.bx(migra en el arranque en lugar de en cualquier request que toque primero la base de datos), y - solo cuandoapiKeyEnvVarestá configurado -interceptors/WebUiAuthGate.bx. Devuelve la configuración de base de datos resuelta, que el siguiente paso necesita. - Esqueleto de app principal -
ColdBoxAppGeneratorescribeApplication.bx,config/ColdBox.bx,config/WireBox.bx,agent/GeneratedAgentFactory.bx, eindex.bxm, incorporando cada sentencia recopilada arriba (registros de gateway, registros MCP, y - sitools/tiene algún archivo - una llamada simpleaiToolRegistry().scan("tools")) en elonApplicationStart()deApplication.bx, y (elGatewaySessionBootstrap.bxde la Fase 1, si se generó) en la listainterceptorsque referenciaconfig/ColdBox.bx. Cada agente generado también recibe ahora siempre un checkpointer (withCheckpointer(...), por defecto unaiMemory()respaldado porcachesi el proyecto no declara configuracióncheckpointery la clase no configuró ninguna propia) - sin uno, los flujos de aprobación human-in-the-loop a través de cualquier gateway que no seaclifallan por completo.config/WireBox.bxmapea cada agente en el árbol (raÃz + cada subagente) bajo su propionamedeclarado, no solo el alias fijo"GeneratedAgent"de la raÃz - ver schedules/. Para un proyecto con una exposiciónwebuitambién activa la gestión de sesiones, registra el datasource SQLite (nombrándolo como el datasource por defecto de la app vÃathis.datasource), crea el directorio padre de la base de datos enonApplicationStart()- SQLite crea el archivo pero nunca la carpeta que lo contiene - y fija la gramática de qb enconfig/ColdBox.bx. - Copia de tools/skills -
ToolsSkillsCopierborra y reescribe.build/app/toolsy.build/app/skillstextualmente a partir de las propias carpetas de tu proyecto. - Scheduler -
SchedulerGeneratorcopiaschedules/Scheduler.bxhacia.build/app/config/Scheduler.bxsin tocarlo, si está presente - sin generación, es código ColdBox real que tú mismo escribiste.
5. Normalizar + escribir el manifest
ManifestNormalizer produce el manifest interno canónico, con hash estampado, a partir de los datos de descubrimiento + configuración resuelta, y el pipeline lo escribe en .build/manifest.json.
Idempotencia
Reconstruir un proyecto sin cambios produce una salida idéntica byte a byte, hasta los hashes de contenido por archivo del manifest - todo el sentido de pagar el costo de ensamblaje una sola vez, en tiempo de build, en lugar de diferir cualquiera de este trabajo al manejo de requests.