[{"data":1,"prerenderedAt":958},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Fvibe-coding-con-ia-cursor-claude-code-saas":311},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11,152],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-layout-grid",{"title":12,"path":13,"stem":14,"children":15,"icon":151},"SaaS Starter Kit","\u002Fdocs\u002Fsaas-starter-kit","docs\u002F1.saas-starter-kit\u002F0.index",[16,19,63,129],{"title":17,"path":13,"stem":14,"icon":18},"What is the SaaS Starter Kit?","i-lucide-info",{"title":20,"icon":21,"hide":22,"path":23,"stem":24,"children":25,"page":62},"Getting Started","i-lucide-play",true,"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started","docs\u002F1.saas-starter-kit\u002F1.getting-started",[26,30,34,38,42,46,50,54,58],{"title":27,"path":28,"stem":29},"Quick Start","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fquick-start","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F0.quick-start",{"title":31,"path":32,"stem":33},"Installation","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Finstallation","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F1.installation",{"title":35,"path":36,"stem":37},"Cloudflare Access","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fcloudflare-access","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F2.cloudflare-access",{"title":39,"path":40,"stem":41},"Configuration","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fconfiguration","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F3.configuration",{"title":43,"path":44,"stem":45},"Secrets","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fsecrets","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F4.secrets",{"title":47,"path":48,"stem":49},"Environment Variables","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fenvironment-variables","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F5.environment-variables",{"title":51,"path":52,"stem":53},"Deploy","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fdeploy","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F6.deploy",{"title":55,"path":56,"stem":57},"Local Development","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Flocal-development","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F7.local-development",{"title":59,"path":60,"stem":61},"Project Structure","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fproject-structure","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F8.project-structure",false,{"title":64,"icon":65,"hide":22,"path":66,"stem":67,"children":68,"page":62},"Features","i-lucide-box","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures","docs\u002F1.saas-starter-kit\u002F2.features",[69,73,77,81,85,89,93,97,101,105,109,113,117,121,125],{"title":70,"path":71,"stem":72},"Authentication","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fauth","docs\u002F1.saas-starter-kit\u002F2.features\u002F1.auth",{"title":74,"path":75,"stem":76},"Rate Limiting","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frate-limiting","docs\u002F1.saas-starter-kit\u002F2.features\u002F10.rate-limiting",{"title":78,"path":79,"stem":80},"WebSockets","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fwebsockets","docs\u002F1.saas-starter-kit\u002F2.features\u002F11.websockets",{"title":82,"path":83,"stem":84},"Blog","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fblog","docs\u002F1.saas-starter-kit\u002F2.features\u002F14.blog",{"title":86,"path":87,"stem":88},"Documentation","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdocumentation","docs\u002F1.saas-starter-kit\u002F2.features\u002F15.documentation",{"title":90,"path":91,"stem":92},"Analytics","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fanalytics","docs\u002F1.saas-starter-kit\u002F2.features\u002F16.analytics",{"title":94,"path":95,"stem":96},"Platform Admin Console","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fplatform-admin","docs\u002F1.saas-starter-kit\u002F2.features\u002F17.platform-admin",{"title":98,"path":99,"stem":100},"Database","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdatabase","docs\u002F1.saas-starter-kit\u002F2.features\u002F2.database",{"title":102,"path":103,"stem":104},"Payments & Billing","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fpayments","docs\u002F1.saas-starter-kit\u002F2.features\u002F3.payments",{"title":106,"path":107,"stem":108},"Emails","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Femails","docs\u002F1.saas-starter-kit\u002F2.features\u002F4.emails",{"title":110,"path":111,"stem":112},"Notifications","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fnotifications","docs\u002F1.saas-starter-kit\u002F2.features\u002F5.notifications",{"title":114,"path":115,"stem":116},"Role-Based Access Control","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frbac","docs\u002F1.saas-starter-kit\u002F2.features\u002F6.rbac",{"title":118,"path":119,"stem":120},"Async Jobs","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fasync-jobs","docs\u002F1.saas-starter-kit\u002F2.features\u002F7.async-jobs",{"title":122,"path":123,"stem":124},"Storage","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fstorage","docs\u002F1.saas-starter-kit\u002F2.features\u002F8.storage",{"title":126,"path":127,"stem":128},"Internationalization","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Finternationalization","docs\u002F1.saas-starter-kit\u002F2.features\u002F9.internationalization",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Concepts","i-lucide-graduation-cap","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts","docs\u002F1.saas-starter-kit\u002F3.concepts",[135,139,143,147],{"title":136,"path":137,"stem":138},"Technology Stack","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Ftech-stack","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F0.tech-stack",{"title":140,"path":141,"stem":142},"SST.dev","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fsst","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F1.sst",{"title":144,"path":145,"stem":146},"NuxtHub","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fnuxt-hub","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F2.nuxt-hub",{"title":148,"path":149,"stem":150},"Design System & Branding","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fdesign-system","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F3.design-system","i-lucide-zap",{"title":153,"path":154,"stem":155,"children":156,"icon":159},"Fireskills","\u002Fdocs\u002Ffireskills","docs\u002F2.fireskills\u002F0.index",[157,160,219,249,275,293],{"title":158,"path":154,"stem":155,"icon":159},"What is Fireskills?","i-lucide-flame",{"title":20,"icon":21,"hide":22,"path":161,"stem":162,"children":163,"page":62},"\u002Fdocs\u002Ffireskills\u002Fgetting-started","docs\u002F2.fireskills\u002F1.getting-started",[164,167,171,175,179,183,187,191,195,199,203,207,211,215],{"title":27,"path":165,"stem":166},"\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fquick-start","docs\u002F2.fireskills\u002F1.getting-started\u002F00.quick-start",{"title":168,"path":169,"stem":170},"Workflow & Governance","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fworkflow","docs\u002F2.fireskills\u002F1.getting-started\u002F01.workflow",{"title":172,"path":173,"stem":174},"Project Context","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fproject-context","docs\u002F2.fireskills\u002F1.getting-started\u002F02.project-context",{"title":176,"path":177,"stem":178},"Step 0: Setup","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-setup","docs\u002F2.fireskills\u002F1.getting-started\u002F03.step-setup",{"title":180,"path":181,"stem":182},"Step 1: Inbox","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-inbox","docs\u002F2.fireskills\u002F1.getting-started\u002F04.step-inbox",{"title":184,"path":185,"stem":186},"Step 2: Backlog","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-backlog","docs\u002F2.fireskills\u002F1.getting-started\u002F05.step-backlog",{"title":188,"path":189,"stem":190},"Step 3: Specify","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-specify","docs\u002F2.fireskills\u002F1.getting-started\u002F06.step-specify",{"title":192,"path":193,"stem":194},"Step 4: Validate","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-validate","docs\u002F2.fireskills\u002F1.getting-started\u002F07.step-validate",{"title":196,"path":197,"stem":198},"Step 5: Tasks","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tasks","docs\u002F2.fireskills\u002F1.getting-started\u002F08.step-tasks",{"title":200,"path":201,"stem":202},"Step 6: TDD\u002FBDD","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tdd-bdd","docs\u002F2.fireskills\u002F1.getting-started\u002F09.step-tdd-bdd",{"title":204,"path":205,"stem":206},"Step 7: Implement","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-implement","docs\u002F2.fireskills\u002F1.getting-started\u002F10.step-implement",{"title":208,"path":209,"stem":210},"Step 8: Documentator","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-documentator","docs\u002F2.fireskills\u002F1.getting-started\u002F11.step-documentator",{"title":212,"path":213,"stem":214},"Late Changes","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Flate-changes","docs\u002F2.fireskills\u002F1.getting-started\u002F12.late-changes",{"title":216,"path":217,"stem":218},"Other Entry Points","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fother-entry-points","docs\u002F2.fireskills\u002F1.getting-started\u002F13.other-entry-points",{"title":220,"icon":221,"hide":22,"path":222,"stem":223,"children":224,"page":62},"Methodology","i-lucide-git-branch","\u002Fdocs\u002Ffireskills\u002Fmethodology","docs\u002F2.fireskills\u002F2.methodology",[225,229,233,237,241,245],{"title":226,"path":227,"stem":228},"The Three Acts","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-acts","docs\u002F2.fireskills\u002F2.methodology\u002F0.three-acts",{"title":230,"path":231,"stem":232},"The Three Gates","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-gates","docs\u002F2.fireskills\u002F2.methodology\u002F1.three-gates",{"title":234,"path":235,"stem":236},"The Canonical Spec","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fcanonical-spec","docs\u002F2.fireskills\u002F2.methodology\u002F2.canonical-spec",{"title":238,"path":239,"stem":240},"Lifecycle States","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Flifecycle-states","docs\u002F2.fireskills\u002F2.methodology\u002F3.lifecycle-states",{"title":242,"path":243,"stem":244},"Effort Scale","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Feffort-scale","docs\u002F2.fireskills\u002F2.methodology\u002F4.effort-scale",{"title":246,"path":247,"stem":248},"Milestones & Governance","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fgovernance-and-milestones","docs\u002F2.fireskills\u002F2.methodology\u002F5.governance-and-milestones",{"title":250,"icon":251,"hide":22,"path":252,"stem":253,"children":254,"page":62},"Skills","i-lucide-layers","\u002Fdocs\u002Ffireskills\u002Fskills","docs\u002F2.fireskills\u002F3.skills",[255,259,263,267,271],{"title":256,"path":257,"stem":258},"Catalog","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fcatalog","docs\u002F2.fireskills\u002F3.skills\u002F0.catalog",{"title":260,"path":261,"stem":262},"Act I: Define","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-1-define","docs\u002F2.fireskills\u002F3.skills\u002F1.act-1-define",{"title":264,"path":265,"stem":266},"Act II: Design & Prove","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-2-design-prove","docs\u002F2.fireskills\u002F3.skills\u002F2.act-2-design-prove",{"title":268,"path":269,"stem":270},"Act III: Deliver","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-3-deliver","docs\u002F2.fireskills\u002F3.skills\u002F3.act-3-deliver",{"title":272,"path":273,"stem":274},"Governance & Decisions","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fgovernance-and-decisions","docs\u002F2.fireskills\u002F3.skills\u002F4.governance-and-decisions",{"title":276,"icon":277,"hide":22,"path":278,"stem":279,"children":280,"page":62},"Specialists","i-lucide-sparkles","\u002Fdocs\u002Ffireskills\u002Fspecialists","docs\u002F2.fireskills\u002F4.specialists",[281,285,289],{"title":282,"path":283,"stem":284},"Overview","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Foverview","docs\u002F2.fireskills\u002F4.specialists\u002F0.overview",{"title":286,"path":287,"stem":288},"Nuxfire Stack","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fnuxfire-stack","docs\u002F2.fireskills\u002F4.specialists\u002F1.nuxfire-stack",{"title":290,"path":291,"stem":292},"Engineering Specialists","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fengineering-specialists","docs\u002F2.fireskills\u002F4.specialists\u002F2.engineering-specialists",{"title":294,"icon":295,"hide":22,"path":296,"stem":297,"children":298,"page":62},"CLI & Tooling","i-lucide-terminal","\u002Fdocs\u002Ffireskills\u002Fcli","docs\u002F2.fireskills\u002F5.cli",[299,303,307],{"title":300,"path":301,"stem":302},"CLI Overview","\u002Fdocs\u002Ffireskills\u002Fcli\u002Foverview","docs\u002F2.fireskills\u002F5.cli\u002F0.overview",{"title":304,"path":305,"stem":306},"Commands","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fcommands","docs\u002F2.fireskills\u002F5.cli\u002F1.commands",{"title":308,"path":309,"stem":310},"Safety Scripts","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fgovernance-scripts","docs\u002F2.fireskills\u002F5.cli\u002F2.governance-scripts",{"id":312,"title":313,"author":314,"authorType":315,"body":316,"category":938,"date":939,"description":940,"extension":941,"image":942,"lang":943,"meta":944,"navigation":22,"ogImage":945,"path":946,"readTime":947,"seo":948,"stem":949,"tags":950,"translations":953,"updated":315,"__hash__":957},"blog\u002Fblog\u002Fvibe-coding-con-ia-cursor-claude-code-saas.md","Vibe Coding con IA: Cómo el Tipado Estricto y las Nuxt Layers Potencian a Cursor y Claude Code","Equipo Nuxfire",null,{"type":317,"value":318,"toc":930},"minimark",[319,340,347,350,357,360,365,368,373,378,394,611,619,621,625,632,649,652,654,658,665,885,887,891,894,914,917,926],[320,321,322,323,327,328,331,332,335,336,339],"p",{},"El término ",[324,325,326],"strong",{},"\"Vibe Coding\""," se ha convertido en la mayor tendencia del desarrollo de software en 2026. Desarrolladores con experiencia y fundadores técnicos usan asistentes inteligentes como ",[324,329,330],{},"Cursor",", ",[324,333,334],{},"Claude Code"," y ",[324,337,338],{},"v0"," para escribir código a velocidades nunca antes imaginadas.",[320,341,342,343,346],{},"Sin embargo, casi todos los que intentan crear un SaaS complejo solo con prompts se topan con el mismo obstáculo: ",[324,344,345],{},"la entropía del código",".",[320,348,349],{},"Tras algunas iteraciones, la IA empieza a alucinar variables que no existen, recrea funciones ya implementadas en otros archivos, rompe pantallas enteras e introduce vulnerabilidades silenciosas en la base de datos.",[320,351,352,353,356],{},"¿Por qué ocurre esto? ¿Y cómo lo resuelve la arquitectura de ",[324,354,355],{},"Nuxfire","?",[358,359],"hr",{},[361,362,364],"h2",{"id":363},"el-secreto-no-es-el-prompt-es-el-contexto-estructural","El Secreto no es el Prompt, es el Contexto Estructural",[320,366,367],{},"Los grandes modelos de lenguaje (LLM) son tan buenos como el contexto que reciben en su ventana de atención. Si tu proyecto es un monolito confuso con cientos de archivos interdependientes sin tipado estricto, el modelo tiene que \"adivinar\" las relaciones entre las partes.",[320,369,370,372],{},[324,371,355],{}," fue diseñado específicamente para ser la base ideal para las herramientas de IA, combinando tres pilares arquitectónicos:",[374,375,377],"h3",{"id":376},"_1-tipado-estricto-de-extremo-a-extremo-con-typescript-y-trpc","1. Tipado Estricto de Extremo a Extremo con TypeScript y tRPC",[320,379,380,381,385,386,389,390,393],{},"En Nuxfire no existen objetos ",[382,383,384],"code",{},"any"," ni payloads sin tipar. Cada ruta de API define su input y su output con esquemas ",[324,387,388],{},"Zod"," a través de ",[324,391,392],{},"tRPC",":",[395,396,401],"pre",{"className":397,"code":398,"language":399,"meta":400,"style":400},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark monokai","export const billingRouter = router({\n  createCheckoutSession: protectedProcedure\n    .input(z.object({\n      priceId: z.string(),\n      teamId: z.string()\n    }))\n    .mutation(async ({ input, ctx }) => {\n      \u002F\u002F Cursor sabe exactamente qué propiedades existen en 'input' y 'ctx'\n      return createStripeSession(input.teamId, input.priceId);\n    })\n});\n","typescript","",[382,402,403,436,448,469,491,508,517,553,560,593,601],{"__ignoreMap":400},[404,405,408,412,416,420,424,428,432],"span",{"class":406,"line":407},"line",1,[404,409,411],{"class":410},"sRxSC","export",[404,413,415],{"class":414},"srJo8"," const",[404,417,419],{"class":418},"s91G_"," billingRouter",[404,421,423],{"class":422},"sGXK2"," =",[404,425,427],{"class":426},"sD0ED"," router",[404,429,431],{"class":430},"ss--_","(",[404,433,435],{"class":434},"swvn1","{\n",[404,437,439,443,445],{"class":406,"line":438},2,[404,440,442],{"class":441},"squCx","  createCheckoutSession",[404,444,393],{"class":434},[404,446,447],{"class":430}," protectedProcedure\n",[404,449,451,454,457,460,462,465,467],{"class":406,"line":450},3,[404,452,453],{"class":434},"    .",[404,455,456],{"class":426},"input",[404,458,459],{"class":430},"(z",[404,461,346],{"class":434},[404,463,464],{"class":426},"object",[404,466,431],{"class":430},[404,468,435],{"class":434},[404,470,472,475,477,480,482,485,488],{"class":406,"line":471},4,[404,473,474],{"class":441},"      priceId",[404,476,393],{"class":434},[404,478,479],{"class":430}," z",[404,481,346],{"class":434},[404,483,484],{"class":426},"string",[404,486,487],{"class":430},"()",[404,489,490],{"class":434},",\n",[404,492,494,497,499,501,503,505],{"class":406,"line":493},5,[404,495,496],{"class":441},"      teamId",[404,498,393],{"class":434},[404,500,479],{"class":430},[404,502,346],{"class":434},[404,504,484],{"class":426},[404,506,507],{"class":430},"()\n",[404,509,511,514],{"class":406,"line":510},6,[404,512,513],{"class":434},"    }",[404,515,516],{"class":430},"))\n",[404,518,520,522,525,527,531,534,538,541,544,547,550],{"class":406,"line":519},7,[404,521,453],{"class":434},[404,523,524],{"class":426},"mutation",[404,526,431],{"class":430},[404,528,530],{"class":529},"sTNss","async",[404,532,533],{"class":434}," ({",[404,535,537],{"class":536},"sQgqH"," input",[404,539,540],{"class":434},",",[404,542,543],{"class":536}," ctx",[404,545,546],{"class":434}," })",[404,548,549],{"class":414}," =>",[404,551,552],{"class":434}," {\n",[404,554,556],{"class":406,"line":555},8,[404,557,559],{"class":558},"ss7Ak","      \u002F\u002F Cursor sabe exactamente qué propiedades existen en 'input' y 'ctx'\n",[404,561,563,566,569,571,573,575,578,580,582,584,587,590],{"class":406,"line":562},9,[404,564,565],{"class":410},"      return",[404,567,568],{"class":426}," createStripeSession",[404,570,431],{"class":441},[404,572,456],{"class":430},[404,574,346],{"class":434},[404,576,577],{"class":430},"teamId",[404,579,540],{"class":434},[404,581,537],{"class":430},[404,583,346],{"class":434},[404,585,586],{"class":430},"priceId",[404,588,589],{"class":441},")",[404,591,592],{"class":434},";\n",[404,594,596,598],{"class":406,"line":595},10,[404,597,513],{"class":434},[404,599,600],{"class":430},")\n",[404,602,604,607,609],{"class":406,"line":603},11,[404,605,606],{"class":434},"}",[404,608,589],{"class":430},[404,610,592],{"class":434},[320,612,613,614,618],{},"Cuando le pides a Cursor o a Claude Code: ",[615,616,617],"em",{},"\"Crea un botón en el panel que llame a la procedure de checkout\"",", el modelo lee las definiciones de tipos de tRPC y autocompleta los parámetros correctos al primer intento, sin inventar propiedades falsas.",[358,620],{},[374,622,624],{"id":623},"_2-nuxt-layers-límites-claros-de-dominio","2. Nuxt Layers: Límites Claros de Dominio",[320,626,627,628,631],{},"Con las ",[324,629,630],{},"Nuxt Layers",", cada área funcional del producto queda confinada a su directorio correspondiente:",[633,634,635,642],"ul",{},[636,637,638,639,346],"li",{},"¿Cambiar el flujo de miembros del equipo? Solo se cargan los archivos de ",[382,640,641],{},"layers\u002Fteams\u002F",[636,643,644,645,648],{},"¿Modificar los estilos del tema? El archivo ",[382,646,647],{},"packages\u002Ftokens"," lo centraliza todo.",[320,650,651],{},"Esta compartimentación reduce el tamaño del contexto necesario e impide que la IA modifique por error archivos no relacionados.",[358,653],{},[374,655,657],{"id":656},"_3-schemas-estructurados-con-drizzle-orm","3. Schemas Estructurados con Drizzle ORM",[320,659,660,661,664],{},"Mapear relaciones de base de datos con ORMs heredados suele generar alucinaciones en las migraciones SQL. ",[324,662,663],{},"Drizzle ORM"," usa TypeScript declarativo puro, lo que facilita que la IA entienda con total precisión las foreign keys, los índices y las restricciones de integridad:",[395,666,668],{"className":397,"code":667,"language":399,"meta":400,"style":400},"export const subscriptions = pgTable(\"subscriptions\", {\n  id: text(\"id\").primaryKey(),\n  teamId: text(\"team_id\").notNull().references(() => teams.id),\n  status: text(\"status\", { enum: [\"ACTIVE\", \"PAST_DUE\", \"CANCELED\"] }).notNull(),\n  currentPeriodEnd: timestamp(\"current_period_end\").notNull()\n});\n",[382,669,670,700,730,778,850,877],{"__ignoreMap":400},[404,671,672,674,676,679,681,684,686,690,694,696,698],{"class":406,"line":407},[404,673,411],{"class":410},[404,675,415],{"class":414},[404,677,678],{"class":418}," subscriptions",[404,680,423],{"class":422},[404,682,683],{"class":426}," pgTable",[404,685,431],{"class":430},[404,687,689],{"class":688},"siCPE","\"",[404,691,693],{"class":692},"sLACW","subscriptions",[404,695,689],{"class":688},[404,697,540],{"class":434},[404,699,552],{"class":434},[404,701,702,705,707,710,712,714,717,719,721,723,726,728],{"class":406,"line":438},[404,703,704],{"class":441},"  id",[404,706,393],{"class":434},[404,708,709],{"class":426}," text",[404,711,431],{"class":430},[404,713,689],{"class":688},[404,715,716],{"class":692},"id",[404,718,689],{"class":688},[404,720,589],{"class":430},[404,722,346],{"class":434},[404,724,725],{"class":426},"primaryKey",[404,727,487],{"class":430},[404,729,490],{"class":434},[404,731,732,735,737,739,741,743,746,748,750,752,755,757,759,762,764,766,768,771,773,776],{"class":406,"line":450},[404,733,734],{"class":441},"  teamId",[404,736,393],{"class":434},[404,738,709],{"class":426},[404,740,431],{"class":430},[404,742,689],{"class":688},[404,744,745],{"class":692},"team_id",[404,747,689],{"class":688},[404,749,589],{"class":430},[404,751,346],{"class":434},[404,753,754],{"class":426},"notNull",[404,756,487],{"class":430},[404,758,346],{"class":434},[404,760,761],{"class":426},"references",[404,763,431],{"class":430},[404,765,487],{"class":434},[404,767,549],{"class":414},[404,769,770],{"class":430}," teams",[404,772,346],{"class":434},[404,774,775],{"class":430},"id)",[404,777,490],{"class":434},[404,779,780,783,785,787,789,791,794,796,798,801,804,806,809,811,814,816,818,821,824,826,828,830,833,835,838,840,842,844,846,848],{"class":406,"line":471},[404,781,782],{"class":441},"  status",[404,784,393],{"class":434},[404,786,709],{"class":426},[404,788,431],{"class":430},[404,790,689],{"class":688},[404,792,793],{"class":692},"status",[404,795,689],{"class":688},[404,797,540],{"class":434},[404,799,800],{"class":434}," {",[404,802,803],{"class":441}," enum",[404,805,393],{"class":434},[404,807,808],{"class":430}," [",[404,810,689],{"class":688},[404,812,813],{"class":692},"ACTIVE",[404,815,689],{"class":688},[404,817,540],{"class":434},[404,819,820],{"class":688}," \"",[404,822,823],{"class":692},"PAST_DUE",[404,825,689],{"class":688},[404,827,540],{"class":434},[404,829,820],{"class":688},[404,831,832],{"class":692},"CANCELED",[404,834,689],{"class":688},[404,836,837],{"class":430},"] ",[404,839,606],{"class":434},[404,841,589],{"class":430},[404,843,346],{"class":434},[404,845,754],{"class":426},[404,847,487],{"class":430},[404,849,490],{"class":434},[404,851,852,855,857,860,862,864,867,869,871,873,875],{"class":406,"line":493},[404,853,854],{"class":441},"  currentPeriodEnd",[404,856,393],{"class":434},[404,858,859],{"class":426}," timestamp",[404,861,431],{"class":430},[404,863,689],{"class":688},[404,865,866],{"class":692},"current_period_end",[404,868,689],{"class":688},[404,870,589],{"class":430},[404,872,346],{"class":434},[404,874,754],{"class":426},[404,876,507],{"class":430},[404,878,879,881,883],{"class":406,"line":510},[404,880,606],{"class":434},[404,882,589],{"class":430},[404,884,592],{"class":434},[358,886],{},[361,888,890],{"id":889},"de-la-idea-al-producto-en-días-no-en-meses","De la Idea al Producto en Días, no en Meses",[320,892,893],{},"Al combinar la velocidad de la IA generativa con una base arquitectónica sólida de nivel enterprise, obtienes lo mejor de ambos mundos:",[633,895,896,902,908],{},[636,897,898,901],{},[324,899,900],{},"10x más velocidad"," para crear nuevas funcionalidades.",[636,903,904,907],{},[324,905,906],{},"0 regresiones"," gracias a los contratos estrictos de tipos.",[636,909,910,913],{},[324,911,912],{},"Código limpio que es tuyo para siempre",", listo para recibir a miles de clientes que pagan.",[320,915,916],{},"Basta de luchar contra las alucinaciones de la IA. Empieza tu proyecto sobre una base profesional y probada.",[320,918,919],{},[920,921,923],"a",{"href":922},"\u002Fes#pricing",[324,924,925],{},"Asegura tu acceso inmediato al código fuente de Nuxfire y entra al Grupo VIP →",[927,928,929],"style",{},"html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .s91G_, html code.shiki .s91G_{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .squCx, html code.shiki .squCx{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sQgqH, html code.shiki .sQgqH{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}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);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}",{"title":400,"searchDepth":438,"depth":438,"links":931},[932,937],{"id":363,"depth":438,"text":364,"children":933},[934,935,936],{"id":376,"depth":450,"text":377},{"id":623,"depth":450,"text":624},{"id":656,"depth":450,"text":657},{"id":889,"depth":438,"text":890},"Desarrollo con IA","2026-09-15","Por qué el secreto de construir productos con IA no es el prompt, sino la arquitectura. Mira cómo los contratos de TypeScript y los schemas de tRPC eliminan las alucinaciones de los LLM.","md","\u002Fimages\u002Fblog\u002Fvibe-coding-ai-cursor-claude-es.svg","es",{},"\u002Fimages\u002Fblog\u002Fvibe-coding-ai-cursor-claude-es.png","\u002Fblog\u002Fvibe-coding-con-ia-cursor-claude-code-saas","8 min",{"title":313,"description":940},"blog\u002Fvibe-coding-con-ia-cursor-claude-code-saas",[330,334,338,951,952],"Vibe Coding","TypeScript",{"en":954,"pt-br":955,"es":956},"vibe-coding-ai-cursor-claude-code-saas","vibe-coding-ia-cursor-claude-code-saas","vibe-coding-con-ia-cursor-claude-code-saas","85KPVNw8E00kgEHVbLbLWex8HgsgOsFClIaxbJSloH4",1790707503602]