
Plugin per Cursor per Hono v4 (framework web edge TypeScript). 59 regressioni LLM con coppie BAD/CORRECT. Ancorato a hono ^4.12.19 (>= 4.9.7 per CVE-2025-59139). Copre la perdita di middleware Express, API rimosse dell'era v3, insidie di inferenza RPC, insidie di Cloudflare Workers, impostazioni di sicurezza predefinite, rafforzamento JSX SSR.
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