[{"data":1,"prerenderedAt":568},["ShallowReactive",2],{"blog-23x-mas-rapido-toolchain-monorepo-con-ia-es-with-drafts":3,"blog-translated-23x-mas-rapido-toolchain-monorepo-con-ia-with-drafts":559},{"id":4,"title":5,"author":6,"body":7,"coverBackground":555,"date":556,"dateModified":556,"description":557,"extension":558,"image":559,"locale":560,"meta":561,"navigation":562,"path":563,"readingTime":559,"seo":564,"status":565,"stem":566,"tags":559,"union":559,"__hash__":567},"blog_es\u002Fes\u002Fblog\u002F23x-mas-rapido-toolchain-monorepo-con-ia.md","23x más rápido: cómo migramos el toolchain de nuestro monorepo con IA","Sergio Azócar",{"type":8,"value":9,"toc":537},"minimark",[10,15,19,22,30,34,45,48,51,55,60,63,136,139,143,197,200,204,207,210,264,270,273,336,339,343,346,409,414,417,421,424,431,452,455,458,462,467,487,492,515,520,528,531,534],[11,12,14],"h2",{"id":13},"el-contexto","El contexto",[16,17,18],"p",{},"Tenemos un monorepo en producción con 9 apps desplegadas en Cloudflare Workers. Todo TypeScript, ~1.670 archivos, gestionado con pnpm workspaces.",[16,20,21],{},"Nuestro toolchain de calidad de código era Biome para lint y formato, y tsc para type checking. Funcionaba. Pero había fricciones.",[16,23,24,25,29],{},"Tanto Biome como tsc necesitaban ",[26,27,28],"code",{},"NODE_OPTIONS='--max-old-space-size=8192'"," para no quedarse sin memoria — 8 GB de heap para lintear y tipar un monorepo. Y tsc, siendo single-threaded, tardaba 25 segundos en hacer typecheck del monorepo completo. No es eterno, pero cuando estás iterando rápido, cada ciclo de feedback cuenta.",[11,31,33],{"id":32},"por-qué-migrar","Por qué migrar",[16,35,36,37,44],{},"Llevábamos tiempo siguiendo el ecosistema de ",[38,39,43],"a",{"href":40,"rel":41},"https:\u002F\u002Foxc.rs\u002F",[42],"nofollow","oxc"," — oxlint, oxfmt, y todo lo que están construyendo en Rust. La promesa era simple: herramientas que hacen lo mismo pero significativamente más rápido, con mejor uso de los núcleos de cpu disponibles.",[16,46,47],{},"Por el lado del type checking, TypeScript 7 (tsgo) es básicamente tsc reescrito en Go. Microsoft reportaba mejoras de 7-10x. Queríamos ver si esos números se sostenían en un proyecto real.",[16,49,50],{},"La pregunta no era si valía la pena, sino cuánto iba a costar en tiempo. Las migraciones de toolchain son ese tipo de tarea que todos saben que debería hacerse, pero que nadie quiere tomar porque es tedioso, toca muchos archivos, y el riesgo de romper algo en CI siempre está ahí.",[11,52,54],{"id":53},"la-migración-a-oxlint-oxfmt","La migración a oxlint + oxfmt",[56,57,59],"h3",{"id":58},"lo-que-cambió","Lo que cambió",[16,61,62],{},"El cambio fue más directo de lo que esperábamos. En esencia:",[64,65,66,85,94,102,124,130],"ol",{},[67,68,69,73,74,77,78,81,82],"li",{},[70,71,72],"strong",{},"Reemplazar Biome por oxlint y oxfmt"," — desinstalar ",[26,75,76],{},"@biomejs\u002Fbiome",", instalar ",[26,79,80],{},"oxlint"," y ",[26,83,84],{},"oxfmt",[67,86,87,93],{},[70,88,89,90],{},"Configurar ",[26,91,92],{},".oxlintrc.json"," — 129 reglas activas",[67,95,96,101],{},[70,97,89,98],{},[26,99,100],{},".oxfmtrc.json"," — opciones de formato equivalentes a lo que teníamos en Biome",[67,103,104,110,111,114,115,118,119,114,122],{},[70,105,106,107],{},"Actualizar scripts en ",[26,108,109],{},"package.json"," — de ",[26,112,113],{},"biome check"," a ",[26,116,117],{},"oxlint .",", de ",[26,120,121],{},"biome format",[26,123,84],{},[67,125,126,129],{},[70,127,128],{},"Actualizar CI"," — cambiar el paso de lint en GitHub Actions",[67,131,132,135],{},[70,133,134],{},"Actualizar config del editor"," — VS Code apuntando a las nuevas herramientas",[16,137,138],{},"El cambio más grande en volumen fue ajustar código que no pasaba las nuevas reglas de oxlint. No porque Biome fuera más permisivo, sino porque oxlint tiene reglas distintas con criterios distintos. Nada grave — mayormente imports, ordenamiento y patrones que oxlint prefiere de otra forma.",[56,140,142],{"id":141},"el-resultado","El resultado",[144,145,146,165],"table",{},[147,148,149],"thead",{},[150,151,152,156,159,162],"tr",{},[153,154,155],"th",{},"Métrica",[153,157,158],{},"Biome",[153,160,161],{},"oxlint (ene 2026)",[153,163,164],{},"oxlint (mar 2026)",[166,167,168,183],"tbody",{},[150,169,170,174,177,180],{},[171,172,173],"td",{},"Tiempo promedio (wall)",[171,175,176],{},"3.70s",[171,178,179],{},"1.04s",[171,181,182],{},"0.49s",[150,184,185,188,191,194],{},[171,186,187],{},"Archivos analizados",[171,189,190],{},"1.227",[171,192,193],{},"1.262",[171,195,196],{},"~1.670",[16,198,199],{},"oxlint lintea más archivos, con más reglas, en una fracción del tiempo. Y sigue mejorando — dos meses después, con un 32% más de archivos, es el doble de rápido que el día de la migración.",[11,201,203],{"id":202},"la-migración-a-tsgo","La migración a tsgo",[56,205,59],{"id":206},"lo-que-cambió-1",[16,208,209],{},"Esta migración fue más quirúrgica:",[64,211,212,221,233,250,258],{},[67,213,214,220],{},[70,215,216,217],{},"Instalar ",[26,218,219],{},"@typescript\u002Fnative-preview"," — el binario de tsgo",[67,222,223,110,226,229,230],{},[70,224,225],{},"Cambiar el script",[26,227,228],{},"NODE_OPTIONS='--max-old-space-size=8192' tsc"," a simplemente ",[26,231,232],{},"tsgo",[67,234,235,241,242,245,246,249],{},[70,236,237,238],{},"Ajustar ",[26,239,240],{},"tsconfig.json"," — quitar ",[26,243,244],{},"baseUrl"," (tsgo no lo soporta igual), agregar ",[26,247,248],{},".\u002F"," como prefijo a los paths",[67,251,252,254,255],{},[70,253,128],{}," — nuevas rutas de cache para ",[26,256,257],{},".tsgo-cache",[67,259,260,263],{},[70,261,262],{},"Fixes de tipos"," — tsgo es más estricto en algunos \"edge cases\" que tsc dejaba pasar",[16,265,266,267,269],{},"Lo más notable es que ya no necesitamos ",[26,268,28],{},". tsgo está escrito en Go — no corre en Node, no tiene ese problema.",[56,271,142],{"id":272},"el-resultado-1",[144,274,275,290],{},[147,276,277],{},[150,278,279,281,284,287],{},[153,280,155],{},[153,282,283],{},"tsc",[153,285,286],{},"tsgo (ene 2026)",[153,288,289],{},"tsgo (mar 2026)",[166,291,292,306,319],{},[150,293,294,297,300,303],{},[171,295,296],{},"Tiempo promedio (cold, wall)",[171,298,299],{},"25.34s",[171,301,302],{},"5.32s",[171,304,305],{},"0.76s",[150,307,308,311,314,317],{},[171,309,310],{},"Uso de CPU",[171,312,313],{},"~132%",[171,315,316],{},"~430%",[171,318,316],{},[150,320,321,328,331,334],{},[171,322,323,324,327],{},"Necesita ",[26,325,326],{},"--max-old-space-size","?",[171,329,330],{},"Sí (8 GB)",[171,332,333],{},"No",[171,335,333],{},[16,337,338],{},"tsc es single-threaded — usa ~132% de CPU (un core y algo de overhead). tsgo aprovecha todos los cores disponibles. El resultado es un typecheck 33 veces más rápido que el original, sin ningún cambio en el código TypeScript en sí.",[11,340,342],{"id":341},"los-números-finales","Los números finales",[16,344,345],{},"El pipeline completo de calidad de código (lint + typecheck), en tres momentos:",[144,347,348,363],{},[147,349,350],{},[150,351,352,354,357,360],{},[153,353],{},[153,355,356],{},"Antes (Biome + tsc)",[153,358,359],{},"Migración (oxlint + tsgo)",[153,361,362],{},"Hoy (mar 2026)",[166,364,365,376,387],{},[150,366,367,370,372,374],{},[171,368,369],{},"Lint",[171,371,176],{},[171,373,179],{},[171,375,182],{},[150,377,378,381,383,385],{},[171,379,380],{},"Typecheck",[171,382,299],{},[171,384,302],{},[171,386,305],{},[150,388,389,394,399,404],{},[171,390,391],{},[70,392,393],{},"Total",[171,395,396],{},[70,397,398],{},"29.04s",[171,400,401],{},[70,402,403],{},"6.36s",[171,405,406],{},[70,407,408],{},"1.25s",[16,410,411],{},[70,412,413],{},"De 29 a 1.25 segundos. 23 veces más rápido.",[16,415,416],{},"Todos los benchmarks fueron medidos 3 veces con cache de herramienta limpio, en la misma máquina. Los números de la migración (enero 2026) reflejan ~1.260 archivos; los de hoy (marzo 2026), ~1.670 — un 32% más de código y aún así, significativamente más rápido. oxlint y tsgo siguen recibiendo actualizaciones agresivas de performance, y se nota.",[11,418,420],{"id":419},"el-rol-de-claude-code","El rol de Claude Code",[16,422,423],{},"Ambas migraciones fueron asistidas por Claude Code. No fue un \"le pedí que lo hiciera y salió andando\" — fue un proceso iterativo donde Claude Code hacía los cambios, corríamos las validaciones, ajustábamos y repetíamos.",[16,425,426,427,430],{},"Lo interesante de usar Claude Code para este tipo de tareas es que las migraciones de toolchain son ",[70,428,429],{},"exactamente"," el tipo de trabajo donde un agente de código brilla:",[432,433,434,440,446],"ul",{},[67,435,436,439],{},[70,437,438],{},"Alto volumen, bajo riesgo creativo"," — hay que tocar muchos archivos pero los cambios son mecánicos",[67,441,442,445],{},[70,443,444],{},"Feedback loop claro"," — el lint pasa o no pasa, el typecheck pasa o no pasa",[67,447,448,451],{},[70,449,450],{},"Documentación disponible"," — las herramientas nuevas tienen docs públicas que el agente puede consultar",[16,453,454],{},"El PR de oxlint tocó más de 700 archivos entre configs, CI, ajustes de código, reformateo y documentación. El de tsgo fue más contenido — 9 archivos, pero con cambios delicados en tsconfig que requieren entender cómo resuelve paths el nuevo compilador.",[16,456,457],{},"¿Lo habría hecho sin IA? Sí, eventualmente. Pero la realidad es que este tipo de migraciones se postergan indefinidamente porque el costo percibido es alto y el beneficio, aunque real, no es un feature nuevo. Claude Code bajó esa barrera lo suficiente como para que lo hiciéramos en una tarde en lugar de dejarlo para \"después\".",[11,459,461],{"id":460},"recomendaciones-si-estás-considerando-migrar","Recomendaciones si estás considerando migrar",[16,463,464],{},[70,465,466],{},"oxlint + oxfmt:",[432,468,469,472,478],{},[67,470,471],{},"Si ya usas Biome, la migración es directa. Las reglas no son 1:1 pero la cobertura es comparable",[67,473,474,475,477],{},"Configura ",[26,476,92],{}," desde el inicio — el default es conservador y probablemente quieras activar más reglas",[67,479,480,481,486],{},"Si usas Tailwind CSS v4, mira ",[38,482,485],{"href":483,"rel":484},"https:\u002F\u002Fgithub.com\u002Fsergioazoc\u002Foxlint-tailwindcss",[42],"oxlint-tailwindcss"," para reglas específicas",[16,488,489],{},[70,490,491],{},"tsgo:",[432,493,494,497,503,512],{},[67,495,496],{},"Está en preview, pero para monorepos el salto es dramático",[67,498,499,500,502],{},"El cambio más común es ajustar paths en tsconfig — tsgo no soporta ",[26,501,244],{}," de la misma forma",[67,504,505,506,509,510],{},"Si tu CI cachea ",[26,507,508],{},".tsbuildinfo",", cambia a ",[26,511,257],{},[67,513,514],{},"Algunos tipos edge que tsc dejaba pasar, tsgo los marca como error. Es más estricto, y eso es bueno",[16,516,517],{},[70,518,519],{},"En general:",[432,521,522,525],{},[67,523,524],{},"Mide antes y después. Los números concretos hacen que el equipo entienda por qué valió la pena",[67,526,527],{},"Haz ambas migraciones por separado (PRs distintos). Si algo se rompe, quieres saber cuál fue",[529,530],"hr",{},[16,532,533],{},"Las herramientas que usamos para escribir código mejoran a un ritmo que ya no se puede ignorar. oxlint y tsgo son más rápidos porque están escritos en lenguajes que aprovechan mejor el hardware. Claude Code hace viable migraciones que antes se postergaban por tediosas. El resultado es un ciclo de feedback más corto, un CI más rápido, y desarrolladores que pierden menos tiempo esperando.",[16,535,536],{},"De 29 segundos a 1. A veces el mejor feature que puedes entregar es menos tiempo esperando.",{"title":538,"searchDepth":539,"depth":539,"links":540},"",2,[541,542,543,548,552,553,554],{"id":13,"depth":539,"text":14},{"id":32,"depth":539,"text":33},{"id":53,"depth":539,"text":54,"children":544},[545,547],{"id":58,"depth":546,"text":59},3,{"id":141,"depth":546,"text":142},{"id":202,"depth":539,"text":203,"children":549},[550,551],{"id":206,"depth":546,"text":59},{"id":272,"depth":546,"text":142},{"id":341,"depth":539,"text":342},{"id":419,"depth":539,"text":420},{"id":460,"depth":539,"text":461},"primary","2026-03-31","Lint + typecheck en 1.25 segundos. De Biome + tsc a oxlint + tsgo en un monorepo en producción con ~1.670 archivos TypeScript. Benchmarks reales incluidos.","md",null,"es",{},true,"\u002Fes\u002Fblog\u002F23x-mas-rapido-toolchain-monorepo-con-ia",{"title":5,"description":557},"draft","es\u002Fblog\u002F23x-mas-rapido-toolchain-monorepo-con-ia","kynTtgC4udTGcfOkMSDZ6eqth2dtJ_CSW0rKyogTPCg",1782287026384]