
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 per Cursor per Hono v4 (framework web TypeScript edge) + TypeScript. Bloccato su 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+). Insegna le API v4 che gli LLM addestrati su dati pre-2024 non conoscono (c.json() sempre tipizzato, il validatore lancia HTTPException, getCookie/setCookie da hono/cookie, c.env come proprietà, streamText da hono/streaming, showRoutes da hono/dev, getRuntimeKey da hono/adapter, fire(app) da hono/service-worker, associazione Static Assets di Workers invece della deprecata serveStatic, JSR @hono/hono per Deno). Individua oltre 50 regressioni degli LLM con coppie ERRATO / CORRETTO in TypeScript.
Non esiste Hono v5. L'ultima stabile è v4.12.19. Qualsiasi "v5" nel codice generato è un'allucinazione.
Gli stessi manutentori di Hono hanno aperto Issue #3906 ("file llm.txt") e Issue #4812 ("Abilità ufficiale AI Agent per Hono") proprio perché "gli LLM non hanno praticamente conoscenza di come funziona l'ultimo Hono." I dati di addestramento pre-2025 sono dell'era v3. Gli LLM emettono:
c.jsonT() invece di c.json() (sempre tipizzato dalla v4.0.0)c.stream() / c.streamText() come metodi di Context (spostati in hono/streaming nella v4)c.env() forma funzionale (ora proprietà; rilevamento runtime tramite getRuntimeKey() da hono/adapter)c.req.cookie() (rimosso; usa getCookie(c) da hono/cookie)app.showRoutes(), app.routerName (spostati in hono/dev)return mancante su c.json() (risolve a undefined; v4 lancia "Context is not finalized")res.json() / res.send() invece di c.json() (non esiste res in Hono)(req, res, next) (usa (c, next))(err, req, res, next) (usa app.onError + HTTPException)app.use(express.json()) parser body (Hono analizza su richiesta tramite c.req.json())new Hono() senza generici Bindings / Variables (c.env è {})app.get(...) poi app.post(...)) - perde tipi RPCapp.route() per sotto-app come istruzioni - stessa regolaContext (perde inferenza dei parametri di percorso, secondo le Best Practices di Hono)app.use('/path', zValidator(...)) invece che come argomento di route (errore TS: 'json' non assegnabile a 'never')c.notFound() in route consumate da RPC (non può essere tipizzato sul client)process.env.X nel codice Workers (undefined; usa c.env.X con Bindings tipizzate)fs / path nei Workers (nessun filesystem)compatibility_flags: ["node_compat"] (usa nodejs_compat)serveStatic deprecato da hono/cloudflare-workers (dalla v4.3.0; usa asset binding)c.executionCtx.waitUntil() mancante per fire-and-forgetif (c.executionCtx) (getter lancia su Bun e Next.js App Router)D1 .run() / / non await (insert annullato quando il worker termina)secureHeaders()csrf() su mutazioni autenticate da cookiecors({ origin: '*', credentials: true }) (i browser lo scartano silenziosamente; AJAX fallisce)bodyLimit() mancante su route POST / PUT e blocca hono >= 4.9.7 per CVE-2025-59139httpOnly / secure / sameSite / pathsameSite: 'None' senza secure: true (scartato silenziosamente)etag() / su GET staticinotFound di sotto-app (codice morto; solo il livello principale si attiva)/users vs /users/ sono route diverse per default)await next() più di una volta (raddoppia il lavoro a valle)app.use(prefix, mw) + app.route(prefix, subApp) sovrapposizione (il middleware si attiva due volte)app.basePath('/api') come istruzione (il prefisso viene scartato dal tipo)serve(app) su @hono/node-server (usa serve({ fetch: app.fetch }))export default app su Workers (usa export default { fetch: app.fetch })Bun.serve({ fetch: app }) (usa app.fetch)c.req.query() senza argomento quando si aspetta un singolo valorec.req.param('id') in middleware globale (undefined dove :id non è nel percorso)@hono/zod-openapicors() montato DOPO le route (non corrisponde mai)Alcune regole Hono esistono già su cursor.directory e in awesome-cursorrules (PR #152): coprono c.json() returns, zValidator + Zod, c.env per Workers, route concatenate per RPC, e app.fetch Workers export. Hanno tre problemi strutturali che questo plugin risolve:
c.jsonT, c.stream, c.env(), c.req.cookie, app.showRoutes, il barrel hono/middleware, e app.handleEvent - tutti rimossi nella v4.0.0 (febbraio 2024). Le regole esistenti li permettono silenziosamente.(req, res, next), (err, req, res, next), npm cors, app.use(express.json()), supertest, return mancante su c.json - tutto accade costantemente nel codice Hono generato dagli LLM. Le regole esistenti li trattano come casi isolati.Questo plugin include:
globs appropriati in modo che i controlli su route / RPC si attivino su src/routes/**, quelli Workers su wrangler.{toml,jsonc} + entry Workers, quelli di sicurezza su file middleware, ecc./hono-new-route, /hono-rpc-setup, /hono-cloudflare-workers-setup, /hono-migrate-to-v4, /hono-validatecorrect-sample (gold standard Hono 4.12.19 + Workers + D1 + Drizzle + Zod) e anti-pattern-sample (retaggio Hono v3 con oltre 25 violazioni tracciate)Copia le regole, le skill e l'agente nella configurazione Cursor del tuo progetto. Prima esegui un backup dei file esistenti; cp -r sovrascriverà le regole con lo stesso nome.
git clone https://github.com/RoninForge/roninforge-hono.git
# Usa -n per evitare di sovrascrivere una regola personalizzata esistente con lo stesso nome.
cp -rn roninforge-hono/rules/* your-project/.cursor/rules/
cp -rn roninforge-hono/skills/* your-project/.cursor/skills/
cp -rn roninforge-hono/agents/* your-project/.cursor/agents/
Oppure vendi l'intero repository come sottomodulo git sotto your-project/.cursor/plugins/. Consulta la documentazione dei plugin Cursor per il percorso di installazione globale corrente sulla tua versione di Cursor.
tests/fixtures/correct-sample/ è un progetto Hono 4.12.19 + Cloudflare Workers + D1 + Drizzle + Zod snello che dimostra la forma gold standard: route concatenate, RPC tipizzato, zValidator come argomento route, risposte tipizzate c.json({ ... } as const, status), stack secureHeaders + cors + csrf + bodyLimit, app.onError + app.notFound a livello principale, export default { fetch: app.fetch } satisfies ExportedHandler<Env>.
tests/fixtures/anti-pattern-sample/ è l'inverso. Ogni file viola un anti-pattern numerato. package.json blocca hono ^3.12.0 + cors ^2.8.5 + supertest ^6.3.0 + @hono/sentry ^1.0.0 + lucia ^3.2.0 apposta - l'era v3 è la base dei dati di addestramento LLM per la maggior parte dei modelli pre-2025, oltre a companion deprecati che gli LLM raccomandano ancora. Le violazioni tracciate includono: return mancante su c.json (#1), forma handler Express (req, res) (#2), middleware (req, res, next) (#3), (err, req, res, next) (#4), npm cors (#6), supertest (#12), c.jsonT (#13), addEventListener('fetch') + app.handleEvent (#15), (#16), chiamata funzionale (#17), barrel (#20), (#23), nessun Bindings/Variables (#24), in route RPC (#29), in Workers (#34), flag (#36), da (#37), D1 non await (#40), cors + credentials (#43), cookie senza (#45), senza (#46), segreto JWT hard-coded (#48), sotto-app (#50), come istruzione (#53), su Workers (#55), riferimenti deprecati + .
Le regole targettano hono ^4.12.19 con Node 20+ (quando su Node), Bun latest, Deno latest, Wrangler ^4.0.0. La maggior parte dei pattern funziona fino a Hono 4.0.0 (febbraio 2024) con le differenze indicate inline. Pin floor:
hono >= 4.9.7 obbligatorio - fix bypass bodyLimit CVE-2025-59139 / GHSA-92vj-g62v-jqhhhono >= 4.12.18 obbligatorio se si utilizza JSX SSR - rafforzamento di nomi tag, nomi attributo, iniezione CSS@hono/node-server >= 2.0.0 richiede Node 20+@hono/zod-openapi >= 1.0.0 richiede zod ^4.0.0 (il peer è SOLO ^4.0.0, non ^3.x)compatibility_date >= "2024-09-23" richiesto affinché nodejs_compat implichi nodejs_compat_v2Dove la regola cita una versione (c.json() sempre tipizzato dalla v4.0.0, c.text() tipizzato dalla v4.3.0, JSR per Deno dalla v4.4.0, secureHeaders Permissions-Policy dalla v4.6.0, validatore Standard Schema dalla v4.7.0, fire(app) dalla v4.8.0, JSR parseResponse dalla v4.9.0, URL base tipizzato su hc dalla v4.11.0, metodo $path() dalla v4.12.0), verifica rispetto al changelog della versione che hai installato prima di adottare.
MIT - vedi LICENSE
RoninForge costruisce strumenti gratuiti per sviluppatori che lavorano con assistenti di codifica AI:
addEventListener('fetch') + app.handleEvent() (sintassi Service Worker; usa export default { fetch: app.fetch })app.head(...) (HEAD derivato automaticamente da GET nella v4)hono/nextjs import (usa hono/vercel)hono/middleware barrel import (usa sotto-percorso per middleware)c.req.headers() / c.req.body() / c.req.signal() metodi accessor (usa c.req.raw.*)FC con figli impliciti (usa PropsWithChildren<P>)app.fire() (deprecato dalla v4.8.0; usa fire(app) da hono/service-worker)import { Hono } from 'https://deno.land/x/hono/mod.ts' su Deno (obsoleto dalla v4.4.0; usa jsr:@hono/hono)import cors from 'cors' da npm (usa hono/cors)supertest per test (usa app.request() / testClient(app))c.req.body già parsato (è un ReadableStream)c.req.parseBody() per JSON (solo form / multipart)c.req.text() poi c.req.json() (body consumato due volte)c.userId = ... assegnazione inline (usa c.set('userId', ...) con Variables tipizzate)new Response(JSON.stringify(...)) in route RPC (il client vede unknown)hc<AppType>('/') URL relativo (lancia su $url())drizzle-orm, fs, dipendenze native - la trappola #1 del bundle RPC)createMiddleware<Env> (i tipi di Variables non si propagano).first().all()cache()streamText (limite 128MB di Workers)secureHeaders() / csrf(); nessuna menziona bodyLimit CVE-2025-59139 (fix in v4.9.7); nessuna affronta le insidie del client RPC (URL relativo, perdita di import per valore, tipizzazione c.notFound).| Regola | Ambito (globs) | Cosa fa |
|---|
hono-anti-patterns | **/*.ts,**/*.js,**/*.tsx,**/*.jsx,wrangler.{toml,jsonc,json} | 59 regressioni LLM con coppie ERRATO / CORRETTO, organizzate A-H per categoria (perdita Express, API era v3, TypeScript / RPC, CF Workers, sicurezza, routing, runtime, problemi minori) |
hono-core | **/*.ts,**/*.tsx,**/*.js,**/*.jsx (alwaysApply) | Inizializzazione app con Bindings + Variables tipizzate, API Context, accessor richiesta, firma middleware, elenco middleware integrato, helper cookie, rilevamento runtime |
hono-routing-and-rpc | src/**/*.ts,src/routes/**/*,src/api/**/*,src/server/**/*,src/client/**/*,routes/**/* | Route concatenate, composizione sotto-app, immutabilità basePath, fix sovrapposizione doppia esecuzione, codice morto notFound sotto-app, configurazione hc<AppType>, regola import type, URL base tipizzato, metodo $path(), integrazione TanStack Query / SWR, factory.createHandlers, mitigazione RPC per 30+ route |
hono-validators | src/**/*.ts,routes/**/*.ts,api/**/*.ts,handlers/**/*.ts | Posizionamento @hono/zod-validator, accessor c.req.valid(), validator-lancia-su-fallimento, @hono/zod-openapi (insidia peer zod ^4), @hono/standard-validator, @hono/valibot-validator, hono/validator integrato, albero decisionale |
hono-cloudflare-workers | src/**/*.ts,worker/**/*.ts,workers/**/*.ts,wrangler.{toml,jsonc,json},**/cloudflare-env.d.ts,**/worker-configuration.d.ts | Forma canonica di wrangler.jsonc, regole flag compatibilità, wrangler types, Bindings tipizzate, c.env vs process.env, c.executionCtx.waitUntil + portabilità, associazione Static Assets, await D1, stack Drizzle + D1, insidia adattatore Hyperdrive + Prisma, Durable Objects per WebSocket, regola dominio personalizzato hono/cache, export ES Module Worker |
hono-security | src/**/*.ts,src/**/*.tsx,src/middleware/**/*.ts,src/auth/**/*.ts,src/index.ts,src/app.ts | secureHeaders(), csrf(), lista consentita CORS, bodyLimit() + pin CVE-2025-59139 floor 4.9.7, default cookie, segreto JWT da c.env, logging senza perdite PII, etag() + cache(), restrizione IP, timeout, ID richiesta, decisione libreria auth (Lucia deprecato; Better Auth / Clerk consigliati), @sentry/hono invece di @hono/sentry |
hono-error-handling | src/**/*.ts,routes/**/*.ts,api/**/*.ts,middleware/**/*.ts,src/index.ts,src/app.ts | Lancio canonico HTTPException, gestore globale app.onError, solo app.notFound a livello principale, errori RPC tipizzati tramite unioni discriminate, validator lancia, Sentry tramite @sentry/hono, logging strutturato con redazione pino, convenzione forma risposta errore |
hono-jsx | **/*.tsx,**/*.jsx,**/jsx-runtime.ts,src/components/**/*,src/views/**/*,src/islands/**/*,app/islands/**/* | hono/jsx lato server, configurazione tsconfig, FC NON include children, middleware jsxRenderer per layout, hono/jsx/streaming con Suspense, componenti client hono/jsx/dom, isole HonoX, integrazione htmx, pin sicurezza SSR JSX floor 4.12.18 |
hono-testing | **/*.test.ts,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx,vitest.config.{ts,js},**/test/**/*.ts,**/tests/**/*.ts,**/__tests__/**/*.ts | Pattern universale app.request(), test RPC tipizzati con testClient(app), Vitest + @cloudflare/vitest-pool-workers per D1 runtime reale, fixture applyD1Migrations, Bun + bun:test, test snapshot, test middleware / validator / waitUntil, MAI 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 + flag compatibilità), Bun.serve, Deno + JSR, @hono/node-server v2 (Node 20+), AWS Lambda + Lambda@Edge, Vercel Edge, Netlify, pipeline build, pin floor, errori comuni di deploy |
| Skill | Comando | Cosa fa |
|---|
| Nuova route | /hono-new-route | Scaffolding di una sotto-app concatenata con zValidator come argomento di route, accesso tipizzato c.req.valid(), c.json({ ... } as const, status) per risposte RPC tipizzate, generici Bindings + Variables, sotto-app esportata come typeof users, collegata al genitore con .route() concatenato. Rifiuta controller stile Rails, c.notFound() in route RPC, new Response() grezzo. |
| Configurazione RPC | /hono-rpc-setup | Scaffolding del client hc<AppType> con import type (la regola portante), URL base assoluto, modulo api condiviso tipizzato, integrazione TanStack Query / SWR tramite InferRequestType / InferResponseType, utility parseResponse, metodo $path(), mitigazioni rallentamento IDE per 30+ route. |
| Configurazione Workers | /hono-cloudflare-workers-setup | Scaffolding di un progetto Hono + Workers pulito con wrangler.jsonc (NON .toml), nodejs_compat, Bindings tipizzate generate da wrangler types, pattern middleware D1 + Drizzle, stack secureHeaders + cors + csrf + bodyLimit, configurazione Vitest per @cloudflare/vitest-pool-workers. |
| Migra a v4 | /hono-migrate-to-v4 | Migrazione v3 -> v4 per fasi: aggiorna pin (floor CVE-2025-59139), sostituisci c.jsonT / c.stream / c.env() / c.req.cookie / app.showRoutes / app.handleEvent, elimina barrel hono/middleware, passa Deno a JSR, @hono/node-server v2 + Node 20+, registra app.onError per lanci validator. |
| Valida | /hono-validate | Esegue validate-plugin.sh + tsc --noEmit + test + audit grep per anti-pattern sintattici che il type checker non rileva (c.jsonT, c.req.cookie, process.env, node_compat, serveStatic da hono/cloudflare-workers, segreto JWT hard-coded, sameSite:'None' senza secure, bodyLimit mancante, import per valore su client hc). |
| Agente | Cosa fa |
|---|
hono-reviewer | Rivede il codice Hono v4 + TypeScript per gravità. CRITICO: hono < 4.9.7 (CVE), riferimenti v5 (allucinazione), cors wildcard + credentials, sameSite:'None' senza secure, segreto JWT hard-coded, process.env in Workers, bodyLimit mancante, nessun csrf su cookie-auth, serveStatic deprecato, JSX SSR su < 4.12.18. ERRORE: return mancante su c.json, forme middleware Express, tutte le API rimosse dell'era v3, route / sotto-app non concatenate, controller Rails, posizionamento zValidator, c.notFound/risposta raw in RPC, URL relativo hc(), import per valore app server, D1 non await, forme export runtime. AVVISO: default cookie, secureHeaders, logging body senza redazione, app.onError, notFound sotto-app, controllo truthy c.executionCtx, nessun generico Bindings, cors dopo route, sovrapposizione middleware, istruzione basePath, slash finali, barrel hono/middleware, wrangler.toml su greenfield, Lucia, @hono/sentry. NIT: satisfies ExportedHandler<Env> mancante, OpenAPI scritto a mano, observability.enabled mancante. |
c.req.cookiec.env()hono/middlewareapp.head()c.notFoundprocess.envnode_compatserveStatichono/cloudflare-workers*httpOnly/secure/sameSite/pathsameSite:'None'secure:truenotFoundbasePathexport default app@hono/sentrylucia