[{"data":1,"prerenderedAt":1041},["ShallowReactive",2],{"docs-page-\u002Fdocs\u002Fdeploy":3,"docs-surround-\u002Fdocs\u002Fdeploy":1015,"docs-navigation":1023},{"id":4,"title":5,"body":6,"description":1006,"extension":1007,"meta":1008,"navigation":1009,"path":1011,"seo":1012,"stem":1013,"__hash__":1014},"docs\u002Fdocs\u002F4.deploy.md","Deploy y CI\u002FCD",{"type":7,"value":8,"toc":994},"minimark",[9,27,82,92,97,100,105,216,221,278,300,322,326,360,368,382,489,558,568,573,591,614,618,625,677,765,832,836,843,872,897,901,916,950,954,990],[10,11,12,13,17,18,22,23,26],"p",{},"El despliegue corre sobre ",[14,15,16],"strong",{},"Dokploy",", disparado por GitHub Actions después de un CI en verde. Hay dos entornos: producción (rama ",[19,20,21],"code",{},"main",") y dev (rama ",[19,24,25],{},"dev",", con su propio dominio y su propia base de datos).",[28,29,30,43],"table",{},[31,32,33],"thead",{},[34,35,36,40],"tr",{},[37,38,39],"th",{},"Momento",[37,41,42],{},"Qué corre",[44,45,46,63,73],"tbody",{},[34,47,48,52],{},[49,50,51],"td",{},"PR",[49,53,54,55,58,59,62],{},"CI: ",[19,56,57],{},"pnpm lint"," + ",[19,60,61],{},"pnpm build"," (bloqueantes) y typecheck informativo",[34,64,65,70],{},[49,66,67,68],{},"Push\u002Fmerge a ",[19,69,25],{},[49,71,72],{},"CI + despliegue del entorno dev",[34,74,75,79],{},[49,76,67,77],{},[19,78,21],{},[49,80,81],{},"CI + despliegue de producción con health check",[83,84,90],"pre",{"className":85,"code":87,"language":88,"meta":89},[86],"language-text","feature\u002F* · fix\u002F* ──push──▶ PR ──▶ merge a dev ──▶ CI ──▶ Deploy (dev) ──▶ https:\u002F\u002Fdev.tudominio.com\n                                                     │\n                                       (cuando dev está estable)\n                                                     ▼\n                                    PR release: dev ──▶ main ──▶ CI ──▶ Deploy (prod) ──▶ health check\n","text","",[19,91,87],{"__ignoreMap":89},[93,94,96],"h2",{"id":95},"activar-el-despliegue","Activar el despliegue",[10,98,99],{},"Los workflows vienen apagados; se encienden con variables y secretos del repositorio (Settings → Secrets and variables → Actions).",[10,101,102],{},[14,103,104],{},"Variables",[28,106,107,120],{},[31,108,109],{},[34,110,111,114,117],{},[37,112,113],{},"Variable",[37,115,116],{},"Ejemplo",[37,118,119],{},"Para qué",[44,121,122,137,155,170,184,201],{},[34,123,124,129,134],{},[49,125,126],{},[19,127,128],{},"DOKPLOY_DEPLOY_ENABLED",[49,130,131],{},[19,132,133],{},"true",[49,135,136],{},"Enciende el deploy de producción",[34,138,139,144,149],{},[49,140,141],{},[19,142,143],{},"NUXT_APP_URL",[49,145,146],{},[19,147,148],{},"https:\u002F\u002Ftudominio.com",[49,150,151,154],{},[19,152,153],{},"baseUrl"," de i18n (build-arg)",[34,156,157,162,167],{},[49,158,159],{},[19,160,161],{},"HEALTHCHECK_URL",[49,163,164],{},[19,165,166],{},"https:\u002F\u002Ftudominio.com\u002Fapi\u002Fhealth",[49,168,169],{},"Verifica el rollout",[34,171,172,177,181],{},[49,173,174],{},[19,175,176],{},"DOKPLOY_DEV_DEPLOY_ENABLED",[49,178,179],{},[19,180,133],{},[49,182,183],{},"Enciende el deploy del entorno dev",[34,185,186,191,196],{},[49,187,188],{},[19,189,190],{},"DEV_NUXT_APP_URL",[49,192,193],{},[19,194,195],{},"https:\u002F\u002Fdev.tudominio.com",[49,197,198,200],{},[19,199,153],{}," de i18n de dev (build-arg)",[34,202,203,208,213],{},[49,204,205],{},[19,206,207],{},"DEV_HEALTHCHECK_URL",[49,209,210],{},[19,211,212],{},"https:\u002F\u002Fdev.tudominio.com\u002Fapi\u002Fhealth",[49,214,215],{},"Verifica el rollout de dev",[10,217,218],{},[14,219,220],{},"Secretos",[28,222,223,232],{},[31,224,225],{},[34,226,227,230],{},[37,228,229],{},"Secret",[37,231,119],{},[44,233,234,244,258,268],{},[34,235,236,241],{},[49,237,238],{},[19,239,240],{},"DOKPLOY_WEBHOOK_URL",[49,242,243],{},"Webhook de la app de producción en Dokploy",[34,245,246,251],{},[49,247,248],{},[19,249,250],{},"PRODUCTION_DATABASE_URL",[49,252,253,254,257],{},"Postgres ",[14,255,256],{},"alcanzable desde GitHub"," para migrar (ver nota)",[34,259,260,265],{},[49,261,262],{},[19,263,264],{},"DOKPLOY_DEV_WEBHOOK_URL",[49,266,267],{},"Webhook de la app dev",[34,269,270,275],{},[49,271,272],{},[19,273,274],{},"DEV_DATABASE_URL",[49,276,277],{},"Migraciones de la base de dev",[279,280,281],"note",{},[10,282,283,286,287,290,291,295,296,299],{},[14,284,285],{},"Migraciones."," El paso de migraciones corre en el runner: con un Postgres interno de Dokploy hay que publicar su ",[14,288,289],{},"puerto externo"," (servicio de base de datos → ",[292,293,294],"em",{},"External Credentials",") y usar ",[19,297,298],{},"postgresql:\u002F\u002F\u003Cuser>:\u003Cpassword>@\u003Cip-del-servidor>:\u003Cpuerto>\u002F\u003Cbase>",". Esa base queda expuesta a internet: contraseña larga y, si puedes, filtra el puerto por firewall a las IPs de GitHub.",[301,302,303],"warning",{},[10,304,305,306,309,310,313,314,317,318,321],{},"Si la app usa un provider ",[292,307,308],{},"Git"," en Dokploy, elige ",[14,311,312],{},"un solo mecanismo",": o su auto-deploy (al hacer push) o el workflow — con los dos activos, cada merge despliega dos veces. Con provider ",[292,315,316],{},"Docker"," (imagen de GHCR) no hay conflicto, pero ",[14,319,320],{},"Autodeploy debe quedar activado",": es lo que habilita el webhook de despliegue.",[93,323,325],{"id":324},"imagen-ghcr","Imagen (GHCR)",[10,327,328,329,332,333,336,337,340,341,344,345,348,349,351,352,355,356,359],{},"El build corre en GitHub y publica una imagen en GitHub Container Registry\n(",[19,330,331],{},"ghcr.io\u002F\u003Cowner>\u002Ffoodstack","): tag ",[19,334,335],{},":main"," para producción, ",[19,338,339],{},":dev"," para dev y ",[19,342,343],{},":sha-\u003Ccommit>","\ninmutable para rollback. Dokploy deja de construir el repo: en cada aplicación, ",[292,346,347],{},"Source"," →\n",[14,350,316],{}," → la imagen del entorno (puerto ",[19,353,354],{},"3000","). Si el paquete es privado, agrega\ncredenciales de registro (PAT con ",[19,357,358],{},"read:packages",").",[93,361,363,364,367],{"id":362},"el-entorno-dev-devtudominiocom","El entorno dev (",[19,365,366],{},"dev.tudominio.com",")",[10,369,370,371,373,374,377,378,381],{},"Una segunda aplicación en Dokploy que sirve la rama ",[19,372,25],{},", con base de datos propia. Los pasos completos están en la sección ",[292,375,376],{},"Entorno dev"," de ",[19,379,380],{},"DEPLOYMENT.md","; en resumen:",[383,384,385,398,420,436,450,461],"ol",{},[386,387,388,391,392,394,395,397],"li",{},[14,389,390],{},"Base de datos",": una rama (branch) de Neon para ",[19,393,25],{},", creada desde la principal. Su connection string será ",[19,396,274],{},".",[386,399,400,403,404,406,407,409,410,413,414,416,417,397],{},[14,401,402],{},"Aplicación en Dokploy",": ",[292,405,347],{}," → ",[14,408,316],{}," con la imagen ",[19,411,412],{},"ghcr.io\u002F\u003Cowner>\u002Ffoodstack:dev",", puerto del contenedor ",[19,415,354],{},". Health check en ",[19,418,419],{},"\u002Fapi\u002Fhealth",[386,421,422,403,425,428,429,432,433,435],{},[14,423,424],{},"Variables de la app dev",[19,426,427],{},"NUXT_DATABASE_URL"," (rama dev), ",[19,430,431],{},"BETTER_AUTH_SECRET"," propio y ",[19,434,143],{}," apuntando al dominio de dev. Better Auth usa esa URL como baseURL: magic links, invitaciones y callbacks deben apuntar ahí.",[386,437,438,441,442,445,446,449],{},[14,439,440],{},"Dominio",": agrega el host en Dokploy (HTTPS con Let's Encrypt) y crea un registro DNS ",[19,443,444],{},"A"," apuntando a la IP del servidor (o ",[19,447,448],{},"CNAME"," al dominio raíz).",[386,451,452,455,456,458,459,397],{},[14,453,454],{},"Automatización",": pega el webhook en el secreto ",[19,457,264],{}," y enciende ",[19,460,176],{},[386,462,463,403,466,58,469,472,473,476,477,480,481,484,485,488],{},[14,464,465],{},"E2E remoto (opcional)",[19,467,468],{},"E2E_ENABLED=true",[19,470,471],{},"E2E_BASE_URL"," y los secretos ",[19,474,475],{},"E2E_EMAIL"," \u002F ",[19,478,479],{},"E2E_PASSWORD"," de una cuenta ",[19,482,483],{},"owner"," de dev. La suite ",[14,486,487],{},"escribe y borra datos",": apúntala solo a dev.",[83,490,494],{"className":491,"code":492,"language":493,"meta":89,"style":89},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Primera vez: crea la rama dev desde un main que ya tenga los workflows\ngit switch main && git pull\ngit switch -c dev\ngit push -u origin dev\n","bash",[19,495,496,505,529,542],{"__ignoreMap":89},[497,498,501],"span",{"class":499,"line":500},"line",1,[497,502,504],{"class":503},"sHwdD","# Primera vez: crea la rama dev desde un main que ya tenga los workflows\n",[497,506,508,512,516,519,523,526],{"class":499,"line":507},2,[497,509,511],{"class":510},"sBMFI","git",[497,513,515],{"class":514},"sfazB"," switch",[497,517,518],{"class":514}," main",[497,520,522],{"class":521},"sMK4o"," &&",[497,524,525],{"class":510}," git",[497,527,528],{"class":514}," pull\n",[497,530,532,534,536,539],{"class":499,"line":531},3,[497,533,511],{"class":510},[497,535,515],{"class":514},[497,537,538],{"class":514}," -c",[497,540,541],{"class":514}," dev\n",[497,543,545,547,550,553,556],{"class":499,"line":544},4,[497,546,511],{"class":510},[497,548,549],{"class":514}," push",[497,551,552],{"class":514}," -u",[497,554,555],{"class":514}," origin",[497,557,541],{"class":514},[559,560,561],"tip",{},[10,562,563,564,567],{},"Atajo interactivo: ",[19,565,566],{},".\u002Fscripts\u002Fsetup-dokploy-dev.sh"," (raíz del repo) recorre este montaje paso a paso — abre Neon y Dokploy, captura los valores, genera el secreto de auth, escribe los secrets\u002Fvariables en GitHub y compone el bloque de variables listo para pegar en Dokploy.",[569,570,572],"h3",{"id":571},"variables-por-entorno","Variables por entorno",[10,574,575,576,579,580,583,584,587,588,397],{},"Cada aplicación de Dokploy tiene su propio ",[14,577,578],{},"Environment",": la app de dev y la de producción no comparten variables aunque vivan en el mismo proyecto. Hay tres niveles — compartidas del proyecto (",[19,581,582],{},"${{project.VAR}}","), del entorno (",[19,585,586],{},"${{environment.VAR}}",", si tu versión los soporta) y del servicio (las de cada app, que pisan a las anteriores); lo que cambia por entorno va siempre a nivel de ",[14,589,590],{},"servicio",[10,592,593,594,596,597,600,601,603,604,606,607,476,609,611,612,359],{},"Guardar cambios en la pestaña ",[292,595,578],{}," no toca el contenedor en marcha: lanza un ",[14,598,599],{},"Deploy"," después de editar. ",[19,602,143],{}," además se lee al construir (i18n ",[19,605,153],{},"): va como build-arg desde las variables ",[19,608,143],{},[19,610,190],{}," de GitHub (ver ",[292,613,325],{},[93,615,617],{"id":616},"páginas-estáticas-prerender","Páginas estáticas (prerender)",[10,619,620,621,624],{},"Las páginas públicas se generan en el build y se sirven como archivos estáticos desde ",[19,622,623],{},".output\u002Fpublic","; el resto (dashboard, auth, API) sigue renderizándose en el servidor.",[28,626,627,637],{},[31,628,629],{},[34,630,631,634],{},[37,632,633],{},"Ruta",[37,635,636],{},"Cómo se sirve",[44,638,639,653,666],{},[34,640,641,646],{},[49,642,643],{},[19,644,645],{},"\u002F",[49,647,648,649,652],{},"Estática (HTML + ",[19,650,651],{},"_payload.json","), sin coste SSR",[34,654,655,663],{},[49,656,657,58,660],{},[19,658,659],{},"\u002Fdocs",[19,661,662],{},"\u002Fdocs\u002F**",[49,664,665],{},"Estática, una por archivo Markdown",[34,667,668,671],{},[49,669,670],{},"Todo lo demás",[49,672,673,674],{},"SSR en ",[19,675,676],{},"node .output\u002Fserver\u002Findex.mjs",[678,679,680,720,734,747,754],"ul",{},[386,681,682,683,686,687,690,691,694,695,694,698,701,702,705,706,709,710,713,714,701,717,397],{},"La lista vive en ",[19,684,685],{},"routeRules"," (",[19,688,689],{},"nuxt.config.ts","): ",[19,692,693],{},"'\u002F'",", ",[19,696,697],{},"'\u002F_payload.json'",[19,699,700],{},"'\u002Fdocs'"," y ",[19,703,704],{},"'\u002Fdocs\u002F**'"," con ",[19,707,708],{},"prerender: true",", y un catch-all ",[19,711,712],{},"'\u002F**': { prerender: false }"," que mantiene al crawler fuera de ",[19,715,716],{},"\u002Fapp",[19,718,719],{},"\u002Fauth",[386,721,722,725,726,729,730,733],{},[14,723,724],{},"Agregar una sección no requiere tocar la config",": el crawler (",[19,727,728],{},"crawlLinks",") descubre los archivos nuevos de ",[19,731,732],{},"content\u002Fdocs\u002F"," desde los enlaces del índice.",[386,735,736,742,743,746],{},[14,737,738,739],{},"El build pasa sin ",[19,740,741],{},".env"," (CI no tiene secretos): auth, colas y Resend se protegen con ",[19,744,745],{},"import.meta.prerender",". No hay nada que configurar.",[386,748,749,750,753],{},"El HTML se genera en inglés; el idioma del visitante (cookie ",[19,751,752],{},"i18n_locale",") se aplica en el cliente inmediatamente después de la hidratación, sin recargar.",[386,755,756,757,759,760,762,763,397],{},"Si en el futuro agregas otra página pública, dale su propia regla ",[19,758,708],{}," (el catch-all la bloquearía) y verificá que exista su ",[19,761,651],{}," en ",[19,764,623],{},[83,766,768],{"className":491,"code":767,"language":493,"meta":89,"style":89},"pnpm build                              # 13 rutas prerenderizadas\n(nohup node .output\u002Fserver\u002Findex.mjs &) # sirve .output: estáticas + SSR\nmv .env .env.ci-bak && pnpm build; mv .env.ci-bak .env   # la prueba de CI, sin secretos\n",[19,769,770,781,801],{"__ignoreMap":89},[497,771,772,775,778],{"class":499,"line":500},[497,773,774],{"class":510},"pnpm",[497,776,777],{"class":514}," build",[497,779,780],{"class":503},"                              # 13 rutas prerenderizadas\n",[497,782,783,786,789,792,795,798],{"class":499,"line":507},[497,784,785],{"class":521},"(",[497,787,788],{"class":510},"nohup",[497,790,791],{"class":514}," node",[497,793,794],{"class":514}," .output\u002Fserver\u002Findex.mjs",[497,796,797],{"class":521}," &)",[497,799,800],{"class":503}," # sirve .output: estáticas + SSR\n",[497,802,803,806,809,812,814,817,819,822,825,827,829],{"class":499,"line":531},[497,804,805],{"class":510},"mv",[497,807,808],{"class":514}," .env",[497,810,811],{"class":514}," .env.ci-bak",[497,813,522],{"class":521},[497,815,816],{"class":510}," pnpm",[497,818,777],{"class":514},[497,820,821],{"class":521},";",[497,823,824],{"class":510}," mv",[497,826,811],{"class":514},[497,828,808],{"class":514},[497,830,831],{"class":503},"   # la prueba de CI, sin secretos\n",[93,833,835],{"id":834},"migraciones-expandcontract","Migraciones (expand\u002Fcontract)",[10,837,838,839,842],{},"El paso de migraciones corre ",[14,840,841],{},"antes"," del rollout, así que durante unos minutos conviven dos versiones del código contra el mismo esquema. Toda migración sigue el patrón expand\u002Fcontract:",[383,844,845,854,860,866],{},[386,846,847,850,851,359],{},[14,848,849],{},"Expand",": agrega (columna nullable, tabla nueva, índice ",[19,852,853],{},"CONCURRENTLY",[386,855,856,859],{},[14,857,858],{},"Migrar código",": despliega la versión que escribe ambos formatos o que usa lo nuevo.",[386,861,862,865],{},[14,863,864],{},"Backfill",": rellena datos con un script o una tarea, fuera del deploy.",[386,867,868,871],{},[14,869,870],{},"Contract",": borra lo viejo (NOT NULL, drop) recién en un deploy posterior.",[83,873,875],{"className":491,"code":874,"language":493,"meta":89,"style":89},"pnpm db:generate   # después de cambiar el schema\npnpm db:migrate    # lo aplica también el workflow de deploy\n",[19,876,877,887],{"__ignoreMap":89},[497,878,879,881,884],{"class":499,"line":500},[497,880,774],{"class":510},[497,882,883],{"class":514}," db:generate",[497,885,886],{"class":503},"   # después de cambiar el schema\n",[497,888,889,891,894],{"class":499,"line":507},[497,890,774],{"class":510},[497,892,893],{"class":514}," db:migrate",[497,895,896],{"class":503},"    # lo aplica también el workflow de deploy\n",[93,898,900],{"id":899},"backups-de-la-base-de-datos","Backups de la base de datos",[10,902,903,904,907,908,911,912,915],{},"El dashboard admin (",[19,905,906],{},"\u002Fapp\u002Fadmin\u002Fdashboard",") genera backups manuales: un job de pg-boss corre ",[19,909,910],{},"pg_dump --format=custom"," y sube el dump al bucket dedicado (",[19,913,914],{},"NUXT_APP_S3_BACKUP_BUCKET_NAME","). Dos requisitos de despliegue:",[678,917,918,934],{},[386,919,920,926,927,686,930,933],{},[14,921,922,925],{},[19,923,924],{},"pg_dump"," en la imagen",": lo instala el ",[19,928,929],{},"Dockerfile",[19,931,932],{},"postgresql-client-17"," desde el repo PGDG); debe ser una versión ≥ a la del servidor PostgreSQL.",[386,935,936,939,940,942,943,946,947,397],{},[14,937,938],{},"Conexión directa",": si ",[19,941,427],{}," es la pooled de Neon (",[19,944,945],{},"-pooler","), el dump deriva la conexión directa automáticamente; también se puede fijar ",[19,948,949],{},"NUXT_BACKUP_DATABASE_URL",[93,951,953],{"id":952},"salud-y-rollback","Salud y rollback",[678,955,956,964,981],{},[386,957,958,686,961,963],{},[14,959,960],{},"Liveness",[19,962,419],{},"): público y barato, no toca la base de datos. Es el que usan Dokploy y el paso final del workflow.",[386,965,966,969,970,645,972,974,975,977,978,980],{},[14,967,968],{},"Rollback",": los tags ",[19,971,335],{},[19,973,339],{}," son móviles; para volver atrás apunta la app a un ",[19,976,343],{}," inmutable y lanza un ",[292,979,599],{},". Gracias a expand\u002Fcontract, la versión anterior del código sigue siendo compatible con el esquema.",[386,982,983,686,986,989],{},[14,984,985],{},"Salud profunda",[19,987,988],{},"\u002Fapi\u002Fadmin\u002Fsystem\u002Fhealth","): base de datos, Redis, colas y backups, solo para administradores.",[991,992,993],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":89,"searchDepth":507,"depth":507,"links":995},[996,997,998,1002,1003,1004,1005],{"id":95,"depth":507,"text":96},{"id":324,"depth":507,"text":325},{"id":362,"depth":507,"text":999,"children":1000},"El entorno dev (dev.tudominio.com)",[1001],{"id":571,"depth":531,"text":572},{"id":616,"depth":507,"text":617},{"id":834,"depth":507,"text":835},{"id":899,"depth":507,"text":900},{"id":952,"depth":507,"text":953},"El pipeline completo (hooks, CI, Dokploy), los dos entornos y las reglas de migración y rollback.","md",{},{"icon":1010},"i-lucide-cloud-upload","\u002Fdocs\u002Fdeploy",{"title":5,"description":1006},"docs\u002F4.deploy","1B0n4WH2-y05D43FJFGZqeHudP8yrbguJeYaBw-ZfD4",[1016,1022],{"title":1017,"path":1018,"stem":1019,"description":1020,"icon":1021,"children":-1},"Design system","\u002Fdocs\u002Fdesign-system","docs\u002F3.design-system","Los tres niveles del sistema (tokens, clases .ds-*, temas de componentes) y las reglas para no salirse de él.","i-lucide-swatch-book",null,[1024],{"title":1025,"path":659,"stem":1026,"children":1027,"page":1040},"Docs","docs",[1028,1033,1038,1039],{"title":1029,"path":1030,"stem":1031,"icon":1032},"Guía de setup","\u002Fdocs\u002Fsetup","docs\u002F1.setup","i-lucide-rocket",{"title":1034,"path":1035,"stem":1036,"icon":1037},"Ramas y flujo de trabajo","\u002Fdocs\u002Fbranching","docs\u002F2.branching","i-lucide-git-branch",{"title":1017,"path":1018,"stem":1019,"icon":1021},{"title":5,"path":1011,"stem":1013,"icon":1010},false,1791214063325]