
Cursor plugin for Hono v4 (TypeScript edge web framework). 59 LLM regressions with BAD/CORRECT pairs. Pinned to hono ^4.12.19 (>= 4.9.7 for CVE-2025-59139). Covers Express middleware leakage, v3-era removed APIs, RPC inference traps, Cloudflare Workers gotchas, security defaults, JSX SSR hardening.
Plugin para Cursor de Hono v4 (framework web edge TypeScript) + TypeScript. Fijado en hono ^4.12.19, @hono/zod-validator ^0.8.0, @hono/zod-openapi ^1.4.0 (peer zod ^4.x), @hono/node-server ^2.0.3 (Node 20+). Enseña las APIs v4 que los LLMs entrenados con datos anteriores a 2024 no conocen (c.json() siempre tipado, el validador lanza HTTPException, getCookie/setCookie de hono/cookie, c.env como propiedad, streamText de hono/streaming, showRoutes de hono/dev, getRuntimeKey de hono/adapter, fire(app) de hono/service-worker, enlace de Static Assets de Workers en lugar del obsoleto serveStatic, JSR @hono/hono para Deno). Detecta más de 50 regresiones de LLM con pares MAL / CORRECTO en TypeScript.
No existe Hono v5. La última estable es v4.12.19. Cualquier "v5" en código generado es alucinación.
Los propios mantenedores de Hono presentaron el Issue #3906 ("archivo llm.txt") y el Issue #4812 ("Habilidad oficial de AI Agent para Hono") explícitamente porque "los LLMs básicamente no tienen conocimiento de cómo funciona el Hono más reciente." Los datos de entrenamiento anteriores a 2025 son de la era v3. Los LLMs emiten:
c.jsonT() en lugar de c.json() (siempre tipado desde v4.0.0)c.stream() / c.streamText() como métodos de Contexto (movidos a hono/streaming en v4)c.env() forma de función (ahora propiedad; detección de tiempo de ejecución mediante getRuntimeKey() de hono/adapter)c.req.cookie() (eliminado; use getCookie(c) de hono/cookie)app.showRoutes(), app.routerName (movidos a )return en c.json() (resuelve a undefined; v4 lanza "Context is not finalized")res.json() / res.send() en lugar de c.json() (no hay res en Hono)(req, res, next) (use (c, next))(err, req, res, next) (use app.onError + HTTPException)app.use(express.json()) analizador de cuerpo (Hono analiza bajo demanda mediante c.req.json())new Hono() sin genéricos Bindings / Variables (c.env es {})app.get(...) luego app.post(...)) - pierde tipos RPCapp.route() como sentencias - misma reglaContext (pierde inferencia de parámetros de ruta, según Mejores Prácticas de Hono)app.use('/path', zValidator(...)) en lugar de como argumento de ruta (error TS: 'json' no asignable a 'never')c.notFound() en rutas consumidas por RPC (no se puede tipar en el cliente)process.env.X en código de Workers (undefined; use c.env.X con Bindings tipados)fs / path en Workers (no hay sistema de archivos)compatibility_flags: ["node_compat"] (use nodejs_compat)serveStatic obsoleto de hono/cloudflare-workers (desde v4.3.0; use enlace de assets)c.executionCtx.waitUntil() para operaciones fire-and-forgetif (c.executionCtx) (getter lanza error en Bun y Next.js App Router).run() / / sin await (inserción cancelada cuando el worker termina)secureHeaders()csrf() en mutaciones autenticadas con cookiescors({ origin: '*', credentials: true }) (los navegadores lo ignoran silenciosamente; AJAX falla)bodyLimit() en rutas POST / PUT y fijar hono >= 4.9.7 por CVE-2025-59139httpOnly / secure / sameSite / pathsameSite: 'None' sin secure: true (ignorado silenciosamente)etag() / en GETs estáticosnotFound de sub-app (código muerto; solo se activa el de nivel superior)/users vs /users/ son rutas diferentes por defecto)await next() más de una vez (duplica el trabajo aguas abajo)app.use(prefix, mw) + app.route(prefix, subApp) (el middleware se ejecuta dos veces)app.basePath('/api') como sentencia (el prefijo se pierde del tipo)serve(app) en @hono/node-server (use serve({ fetch: app.fetch }))export default app en Workers (use export default { fetch: app.fetch })Bun.serve({ fetch: app }) (use app.fetch)c.req.query() sin argumento cuando se espera un solo valorc.req.param('id') en middleware global (indefinido donde :id no está en la ruta)@hono/zod-openapicors() montado DESPUÉS de las rutas (nunca coincide)Un puñado de reglas de Hono ya existen en cursor.directory y en awesome-cursorrules (PR #152): cubren los retornos de c.json(), zValidator + Zod, c.env para Workers, rutas encadenadas para RPC y exportación app.fetch de Workers. Tienen tres problemas estructurales que este plugin soluciona:
c.jsonT, c.stream, c.env(), c.req.cookie, app.showRoutes, el barrel hono/middleware y app.handleEvent - todos eliminados en v4.0.0 (febrero 2024). Las reglas existentes los permiten silenciosamente.(req, res, next), (err, req, res, next), cors de npm, app.use(express.json()), supertest, falta de return en c.json - todo ocurre constantemente en código Hono generado por LLM. Las reglas existentes los tratan como casos aislados.Este plugin incluye:
globs apropiados para que las comprobaciones de rutas / RPC se activen en src/routes/**, las comprobaciones de Workers en wrangler.{toml,jsonc} + entrada de Worker, las comprobaciones de seguridad en archivos de middleware, etc./hono-new-route, /hono-rpc-setup, /hono-cloudflare-workers-setup, /hono-migrate-to-v4, /hono-validatecorrect-sample (estándar de oro Hono 4.12.19 + Workers + D1 + Drizzle + Zod) y anti-pattern-sample (resaca de Hono v3 con más de 25 violaciones rastreadas)Copia las reglas, habilidades y agente en la configuración de Cursor de tu proyecto. Haz una copia de seguridad de tus archivos existentes primero; cp -r sobrescribirá las reglas con el mismo nombre.
git clone https://github.com/RoninForge/roninforge-hono.git
# Usa -n para evitar sobrescribir una regla personalizada existente con el mismo nombre.
cp -rn roninforge-hono/rules/* tu-proyecto/.cursor/rules/
cp -rn roninforge-hono/skills/* tu-proyecto/.cursor/skills/
cp -rn roninforge-hono/agents/* tu-proyecto/.cursor/agents/
O incluye todo el repositorio como un submódulo de git en tu-proyecto/.cursor/plugins/. Consulta la documentación de plugins de Cursor para la ruta de instalación global actual en tu versión de Cursor.
tests/fixtures/correct-sample/ es un proyecto slim Hono 4.12.19 + Cloudflare Workers + D1 + Drizzle + Zod que demuestra la forma estándar de oro: rutas encadenadas, RPC tipado, zValidator como argumento de ruta, c.json({ ... } as const, status) respuestas tipadas, pila secureHeaders + cors + csrf + bodyLimit, app.onError + app.notFound a nivel superior, export default { fetch: app.fetch } satisfies ExportedHandler<Env>.
tests/fixtures/anti-pattern-sample/ es el inverso. Cada archivo viola un antipatrón numerado. package.json fija hono ^3.12.0 + cors ^2.8.5 + supertest ^6.3.0 + @hono/sentry ^1.0.0 + lucia ^3.2.0 a propósito - la era v3 es la línea base de datos de entrenamiento de LLM para la mayoría de modelos anteriores a 2025, además de acompañantes obsoletos que los LLM aún recomiendan. Las violaciones rastreadas incluyen: falta return en c.json (#1), forma de manejador Express (req, res) (#2), middleware (req, res, next) (#3), (err, req, res, next) (#4), cors de npm (#6), supertest (#12), c.jsonT (#13), addEventListener('fetch') + app.handleEvent (#15), (#16), llamada de función (#17), barrel (#20), (#23), sin Bindings/Variables (#24), en ruta RPC (#29), en Workers (#34), indicador (#36), de (#37), D1 sin await (#40), cors + credenciales (#43), cookie sin (#45), sin (#46), clave JWT escrita en el código (#48), de sub-app (#50), como sentencia (#53), en Workers (#55), referencias a + obsoletos.
Las reglas apuntan a hono ^4.12.19 con Node 20+ (cuando se está en Node), Bun latest, Deno latest, Wrangler ^4.0.0. La mayoría de los patrones funcionan desde Hono 4.0.0 (febrero 2024) con los deltas indicados en línea. Pines mínimos:
hono >= 4.9.7 obligatorio - corrección de CVE-2025-59139 / GHSA-92vj-g62v-jqhh omisión de bodyLimithono >= 4.12.18 obligatorio si se renderiza JSX SSR - endurecimiento de nombres de etiquetas, nombres de atributos, inyección CSS@hono/node-server >= 2.0.0 requiere Node 20+@hono/zod-openapi >= 1.0.0 requiere zod ^4.0.0 (peer es SOLO ^4.0.0, no ^3.x)compatibility_date >= "2024-09-23" requerido para que nodejs_compat implique nodejs_compat_v2Donde la regla cita una versión (c.json() siempre tipado desde v4.0.0, c.text() tipado desde v4.3.0, JSR para Deno desde v4.4.0, secureHeaders Permissions-Policy desde v4.6.0, validador Standard Schema desde v4.7.0, fire(app) desde v4.8.0, JSR parseResponse desde v4.9.0, URL base tipada en hc desde v4.11.0, método $path() desde v4.12.0), verifica con el registro de cambios la versión que tienes instalada antes de adoptar.
MIT - ver LICENSE
RoninForge construye herramientas gratuitas para desarrolladores que trabajan con asistentes de codificación de IA:
hono/devaddEventListener('fetch') + app.handleEvent() (sintaxis de Service Worker; use export default { fetch: app.fetch })app.head(...) (HEAD derivado automáticamente de GET en v4)hono/nextjs (use hono/vercel)hono/middleware (use subruta por middleware)c.req.headers() / c.req.body() / c.req.signal() (use c.req.raw.*)FC con hijos implícitos (use PropsWithChildren<P>)app.fire() (obsoleto en v4.8.0; use fire(app) de hono/service-worker)import { Hono } from 'https://deno.land/x/hono/mod.ts' en Deno (obsoleto desde v4.4.0; use jsr:@hono/hono)import cors from 'cors' desde npm (use hono/cors)supertest para pruebas (use app.request() / testClient(app))c.req.body como ya analizado (es un ReadableStream)c.req.parseBody() para JSON (solo formulario / multipart)c.req.text() luego c.req.json() (cuerpo consumido dos veces)c.userId = ... (use c.set('userId', ...) con Variables tipadas)new Response(JSON.stringify(...)) en rutas RPC (el cliente ve unknown)hc<AppType>('/') (lanza error en $url())drizzle-orm, fs, dependencias nativas - el peligro #1 de hinchazón del bundle RPC)createMiddleware<Env> (los tipos de Variables no se propagan).first().all()cache()streamText (límite de 128MB en Workers)secureHeaders() / csrf(); ninguna menciona bodyLimit CVE-2025-59139 (corregido en v4.9.7); ninguna aborda las trampas del cliente RPC (URL relativa, fuga de importación por valor, tipado c.notFound).| Regla | Ámbito (globs) | Qué hace |
|---|
hono-anti-patterns | **/*.ts,**/*.js,**/*.tsx,**/*.jsx,wrangler.{toml,jsonc,json} | 59 regresiones de LLM con pares MAL / CORRECTO, organizadas A-H por categoría (filtración de Express, APIs de era v3, TypeScript / RPC, CF Workers, seguridad, enrutamiento, tiempo de ejecución, problemas más pequeños) |
hono-core | **/*.ts,**/*.tsx,**/*.js,**/*.jsx (alwaysApply) | Inicialización de app con Bindings + Variables tipados, API de Contexto, accesores de solicitud, firma de middleware, lista de middleware incorporado, ayudantes de cookies, detección de tiempo de ejecución |
hono-routing-and-rpc | src/**/*.ts,src/routes/**/*,src/api/**/*,src/server/**/*,src/client/**/*,routes/**/* | Rutas encadenadas, composición de sub-apps, inmutabilidad de basePath, corrección de superposición de doble ejecución, código muerto de sub-app notFound, configuración de hc<AppType>, regla import type, URL base tipada, $path(), integración con TanStack Query / SWR, factory.createHandlers, mitigación de RPC en más de 30 rutas |
hono-validators | src/**/*.ts,routes/**/*.ts,api/**/*.ts,handlers/**/*.ts | Colocación de @hono/zod-validator, acceso a c.req.valid(), validador lanza error en fallo, @hono/zod-openapi (trampa de peer zod ^4), @hono/standard-validator, @hono/valibot-validator, hono/validator incorporado, árbol de decisión |
hono-cloudflare-workers | src/**/*.ts,worker/**/*.ts,workers/**/*.ts,wrangler.{toml,jsonc,json},**/cloudflare-env.d.ts,**/worker-configuration.d.ts | Forma canónica de wrangler.jsonc, reglas de indicadores de compatibilidad, wrangler types, Bindings tipados, c.env vs process.env, c.executionCtx.waitUntil + portabilidad, enlace de Static Assets, awaits de D1, pila Drizzle + D1, trampa del adaptador Hyperdrive + Prisma, Durable Objects para WebSockets, regla de dominio personalizado hono/cache, exportación de Worker ES Module |
hono-security | src/**/*.ts,src/**/*.tsx,src/middleware/**/*.ts,src/auth/**/*.ts,src/index.ts,src/app.ts | secureHeaders(), csrf(), lista blanca de CORS, bodyLimit() + pin mínimo CVE-2025-59139 4.9.7, valores predeterminados de cookies, JWT secreto desde c.env, registro sin fugas de PII, etag() + cache(), restricción de IP, tiempos de espera, ID de solicitud, decisión de librería de autenticación (Lucia obsoleto; Better Auth / Clerk recomendado), @sentry/hono sobre @hono/sentry |
hono-error-handling | src/**/*.ts,routes/**/*.ts,api/**/*.ts,middleware/**/*.ts,src/index.ts,src/app.ts | Lanzamiento canónico de HTTPException, manejador global app.onError, app.notFound solo de nivel superior, errores RPC tipados mediante uniones discriminadas, lanzamientos del validador, Sentry mediante @sentry/hono, registro estructurado con redacción de pino, convención de forma de respuesta de error |
hono-jsx | **/*.tsx,**/*.jsx,**/jsx-runtime.ts,src/components/**/*,src/views/**/*,src/islands/**/*,app/islands/**/* | hono/jsx del lado del servidor, configuración de tsconfig, FC NO incluye children, middleware jsxRenderer para diseños, hono/jsx/streaming con Suspense, hono/jsx/dom componentes cliente, islas HonoX, integración con htmx, JSX SSR pin mínimo de seguridad 4.12.18 |
hono-testing | **/*.test.ts,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx,vitest.config.{ts,js},**/test/**/*.ts,**/tests/**/*.ts,**/__tests__/**/*.ts | Patrón universal app.request(), pruebas RPC tipadas con testClient(app), Vitest + @cloudflare/vitest-pool-workers para D1 en tiempo de ejecución real, fixture applyD1Migrations, Bun + bun:test, pruebas de instantáneas, pruebas de middleware / validador / waitUntil, NUNCA supertest |
hono-deployment | wrangler.{toml,jsonc,json},deno.json,deno.jsonc,package.json,Dockerfile,fly.toml,vercel.json,netlify.toml,**/serverless.yml,**/template.yaml | Cloudflare Workers (wrangler.jsonc + indicadores de compatibilidad), Bun.serve, Deno + JSR, @hono/node-server v2 (Node 20+), AWS Lambda + Lambda@Edge, Vercel Edge, Netlify, tuberías de construcción, pines mínimos, errores comunes de despliegue |
| Habilidad | Comando | Qué hace |
|---|
| Nueva ruta | /hono-new-route | Crear una sub-app encadenada con zValidator como argumento de ruta, acceso tipado c.req.valid(), c.json({ ... } as const, status) para respuestas RPC tipadas, genéricos Bindings + Variables, sub-app exportada como typeof users, conectada al padre con .route() encadenado. Rechaza controladores estilo Rails, c.notFound() en rutas RPC, new Response() sin formato. |
| Configuración RPC | /hono-rpc-setup | Crear el cliente hc<AppType> con import type (la regla crucial), URL base absoluta, módulo api compartido tipado, integración con TanStack Query / SWR mediante InferRequestType / InferResponseType, utilidad parseResponse, método $path(), mitigaciones de ralentización del IDE para más de 30 rutas. |
| Configuración Workers | /hono-cloudflare-workers-setup | Crear un proyecto nuevo Hono + Workers con wrangler.jsonc (NO .toml), nodejs_compat, Bindings tipados generados desde wrangler types, patrón de middleware D1 + Drizzle, pila secureHeaders + cors + csrf + bodyLimit, configuración de Vitest para @cloudflare/vitest-pool-workers. |
| Migrar a v4 | /hono-migrate-to-v4 | Migración paso a paso v3 -> v4: subir pines mínimos (CVE-2025-59139), reemplazar c.jsonT / c.stream / c.env() / c.req.cookie / app.showRoutes / app.handleEvent, eliminar barrel hono/middleware, cambiar Deno a JSR, @hono/node-server v2 + Node 20+, registrar app.onError para lanzamientos del validador. |
| Validar | /hono-validate | Ejecutar validate-plugin.sh + tsc --noEmit + pruebas + auditoría grep de antipatrones sintácticos que el verificador de tipos no detecta (c.jsonT, c.req.cookie, process.env, node_compat, serveStatic de hono/cloudflare-workers, clave JWT escrita en el código, sameSite:'None' sin secure, falta bodyLimit, importación por valor en cliente hc). |
| Agente | Qué hace |
|---|
hono-reviewer | Revisa código Hono v4 + TypeScript por severidad. CRÍTICO: hono < 4.9.7 (CVE), referencias a v5 (alucinación), comodín cors + credenciales, sameSite:'None' sin secure, clave JWT escrita en el código, process.env en Workers, falta bodyLimit, sin csrf en autenticación por cookie, serveStatic obsoleto, JSX SSR en < 4.12.18. ERROR: falta return en c.json, formas de middleware de Express, todas las APIs eliminadas de era v3, rutas / sub-apps no encadenadas, controladores Rails, colocación de zValidator, c.notFound/Response sin formato en RPC, URL relativa hc(), importación por valor de app del servidor, D1 sin await, formas de exportación en tiempo de ejecución. ADVERTENCIA: valores predeterminados de cookies, secureHeaders, registro de cuerpo sin redacción, app.onError, notFound de sub-app, comprobación de verdad c.executionCtx, sin genérico Bindings, cors después de rutas, superposición de middleware, basePath como sentencia, barras finales, barrel hono/middleware, wrangler.toml en nuevo proyecto, Lucia, @hono/sentry. NIT: falta satisfies ExportedHandler<Env>, OpenAPI hecho a mano, falta observability.enabled. |
c.req.cookiec.env()hono/middlewareapp.head()c.notFoundprocess.envnode_compatserveStatichono/cloudflare-workers*httpOnly/secure/sameSite/pathsameSite:'None'secure:truenotFoundbasePathexport default app@hono/sentrylucia