
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.
Cursor-Plugin für Hono v4 (TypeScript Edge Web Framework) + TypeScript. Fixiert auf 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+). Lehrt die v4-APIs, die LLMs, die auf Daten vor 2024 trainiert wurden, nicht kennen (c.json() immer typisiert, Validator wirft HTTPException, getCookie/setCookie aus hono/cookie, c.env als Eigenschaft, streamText aus hono/streaming, showRoutes aus hono/dev, getRuntimeKey aus hono/adapter, fire(app) aus hono/service-worker, Workers Static Assets Binding statt des veralteten serveStatic, JSR @hono/hono für Deno). Fängt über 50 LLM-Regressionen mit BAD/CORRECT TypeScript-Paaren.
Es existiert kein Hono v5. Die aktuellste stabile Version ist v4.12.19. Jedes „v5“ im generierten Code ist eine Halluzination.
Die Maintainer von Hono selbst haben die Issues #3906 („llm.txt file“) und #4812 („Official AI Agent Skill for Hono“) eröffnet, explizit weil „LLMs praktisch kein Wissen darüber haben, wie das neueste Hono funktioniert.“ Trainingsdaten von vor 2025 sind aus der v3-Ära. LLMs generieren:
c.jsonT() statt c.json() (seit v4.0.0 immer typisiert)c.stream() / c.streamText() als Context-Methoden (in v4 nach hono/streaming verschoben)c.env() Funktionsform (jetzt Eigenschaft; Laufzeiterkennung via getRuntimeKey() aus hono/adapter)c.req.cookie() (entfernt; verwende getCookie(c) aus hono/cookie)app.showRoutes(), app.routerName (verschoben nach hono/dev)return bei c.json() (löst zu undefined auf; v4 wirft „Context is not finalized“)res.json() / res.send() statt c.json() (kein res in Hono)(req, res, next) Middleware-Signatur (verwende (c, next))(err, req, res, next) Error-Middleware (verwende app.onError + HTTPException)app.use(express.json()) Body-Parser (Hono parst bedarfsgesteuert via c.req.json())new Hono() ohne Bindings/Variables Generics (c.env ist {})app.get(...) dann app.post(...)) – wirft RPC-Typen wegapp.route()-Aufrufe als Anweisungen – gleiche RegelContext herumreichen (verliert Pfadparam-Inferenz, gemäß Hono Best Practices)app.use('/path', zValidator(...)) statt als Routenargument (TS-Fehler: 'json' not assignable to 'never')c.notFound() in RPC-konsumierten Routen (kann nicht auf Client getypt werden)process.env.X in Workers-Code (undefined; verwende c.env.X mit typisierten Bindings)fs-/path-Imports in Workers (kein Dateisystem)compatibility_flags: ["node_compat"] veraltetes Flag (verwende nodejs_compat)serveStatic von hono/cloudflare-workers (seit v4.3.0; verwende Asset-Binding)c.executionCtx.waitUntil() für Fire-and-Forgetif (c.executionCtx) (Getter wirft Fehler auf Bun und Next.js App Router).run() / / (Einfügen wird abgebrochen, wenn Worker terminiert)secureHeaders() Middlewarecsrf() bei cookie-authentifizierten Mutationencors({ origin: '*', credentials: true }) (Browser lassen es stillschweigend fallen; AJAX schlägt fehl)bodyLimit() bei POST/PUT-Routen und Pin auf hono >= 4.9.7 für CVE-2025-59139httpOnly/secure/sameSite/pathsameSite: 'None' ohne secure: true (stillschweigend entfernt)etag()/ bei statischen GETsnotFound Handler (toter Code; nur die oberste Ebene feuert)/users vs /users/ sind standardmäßig unterschiedliche Routen)await next() mehr als einmal (verdoppelt nachgelagerte Arbeit)app.use(prefix, mw) + app.route(prefix, subApp) Überlappung (Middleware feuert zweimal)app.basePath('/api') als Anweisung (Präfix wird aus dem Typ entfernt)serve(app) auf @hono/node-server (verwende serve({ fetch: app.fetch }))export default app auf Workers (verwende export default { fetch: app.fetch })Bun.serve({ fetch: app }) (verwende app.fetch)c.req.query() ohne Argument bei Erwartung eines einzelnen Wertsc.req.param('id') in globaler Middleware (undefined, wo :id nicht im Pfad ist)@hono/zod-openapicors() NACH Routen eingebunden (trifft nie zu)Es gibt bereits einige Hono-Regeln auf cursor.directory und in awesome-cursorrules (PR #152): Sie decken c.json() Returns, zValidator + Zod, c.env für Workers, verkettete Routen für RPC und den app.fetch Workers-Export ab. Sie haben drei strukturelle Probleme, die dieses Plugin behebt:
c.jsonT, c.stream, c.env(), c.req.cookie, app.showRoutes, den hono/middleware-Barrel und app.handleEvent – alle in v4.0.0 (Februar 2024) entfernt. Bestehende Regeln erlauben sie stillschweigend.(req, res, next), (err, req, res, next), npm cors, app.use(express.json()), supertest, fehlendes return bei c.json – all das passiert ständig in LLM-generiertem Hono-Code. Bestehende Regeln behandeln sie als Einzelfälle.Dieses Plugin liefert:
globs, sodass die Routen-/RPC-Prüfungen auf src/routes/** feuern, Workers-Prüfungen auf wrangler.{toml,jsonc} + Worker-Einstieg, Sicherheitsprüfungen auf Middleware-Dateien usw./hono-new-route, /hono-rpc-setup, /hono-cloudflare-workers-setup, /hono-migrate-to-v4, /hono-validatecorrect-sample (Goldstandard Hono 4.12.19 + Workers + D1 + Drizzle + Zod) und anti-pattern-sample (Hono v3-Nachwehen mit über 25 verfolgten Verstößen)Kopieren Sie die Regeln, Skills und den Agenten in die Cursor-Konfiguration Ihres Projekts. Sichern Sie zuerst Ihre vorhandenen Dateien; cp -r überschreibt gleichnamige Regeln.
git clone https://github.com/RoninForge/roninforge-hono.git
# Verwenden Sie -n, um das Überschreiben einer vorhandenen angepassten Regel mit demselben Namen zu vermeiden.
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/
Oder binden Sie das gesamte Repository als Git-Submodul unter your-project/.cursor/plugins/ ein. Siehe die Cursor-Plugin-Dokumentation für den aktuellen globalen Installationspfad Ihrer Cursor-Version.
tests/fixtures/correct-sample/ ist ein schlankes Hono 4.12.19 + Cloudflare Workers + D1 + Drizzle + Zod-Projekt, das die Goldstandard-Form demonstriert: verkettete Routen, typisierte RPC, zValidator als Routenargument, c.json({ ... } as const, status) typisierte Antworten, secureHeaders + cors + csrf + bodyLimit-Stack, app.onError + app.notFound auf oberster Ebene, export default { fetch: app.fetch } satisfies ExportedHandler<Env>.
tests/fixtures/anti-pattern-sample/ ist das Gegenteil. Jede Datei verletzt einen nummerierten Anti-Pattern. package.json pinnt absichtlich hono ^3.12.0 + cors ^2.8.5 + supertest ^6.3.0 + @hono/sentry ^1.0.0 + lucia ^3.2.0 – die v3-Ära ist die LLM-Trainingsdaten-Basislinie für die meisten Modelle vor 2025, plus veraltete Begleiter, die LLMs immer noch empfehlen. Verfolgte Verstöße umfassen: fehlendes return bei c.json (#1), (req, res) Express-Handler-Form (#2), (req, res, next) Middleware (#3), (err, req, res, next) (#4), npm cors (#6), supertest (#12), c.jsonT (#13), addEventListener('fetch') + app.handleEvent (#15), (#16), Funktionsaufruf (#17), Barrel (#20), (#23), keine Bindings/Variables (#24), in RPC-Route (#29), in Workers (#34), Flag (#36), von (#37), nicht abgewartete D1 (#40), cors + credentials (#43), Cookie ohne (#45), ohne (#46), hardcodiertes JWT-Secret (#48), Sub-App (#50), als Anweisung (#53), auf Workers (#55), veraltete + -Referenzen.
Regeln zielen auf hono ^4.12.19 mit Node 20+ (wenn auf Node), Bun aktuell, Deno aktuell, Wrangler ^4.0.0. Die meisten Muster funktionieren zurück bis Hono 4.0.0 (Feb. 2024) mit den inline genannten Abweichungen. Pin-Untergrenzen:
hono >= 4.9.7 obligatorisch – CVE-2025-59139 / GHSA-92vj-g62v-jqhh bodyLimit-Bypass-Fixhono >= 4.12.18 obligatorisch, wenn JSX SSR gerendert wird – Härtung von Tag-Namen, Attribut-Namen, CSS-Injection@hono/node-server >= 2.0.0 erfordert Node 20+@hono/zod-openapi >= 1.0.0 erfordert zod ^4.0.0 (Peer ist NUR ^4.0.0, nicht ^3.x)compatibility_date >= "2024-09-23" erforderlich, damit nodejs_compat nodejs_compat_v2 impliziertWo die Regel eine Version zitiert (c.json() immer typisiert seit v4.0.0, c.text() typisiert seit v4.3.0, JSR für Deno seit v4.4.0, secureHeaders Permissions-Policy seit v4.6.0, Standard-Schema-Validator seit v4.7.0, fire(app) seit v4.8.0, JSR parseResponse seit v4.9.0, typisierte Basis-URL auf hc seit v4.11.0, $path()-Methode seit v4.12.0), überprüfen Sie gegen das Changelog der installierten Version, bevor Sie übernehmen.
MIT – siehe LICENSE
RoninForge baut kostenlose Werkzeuge für Entwickler, die mit KI-Code-Assistenten arbeiten:
addEventListener('fetch') + app.handleEvent() (Service-Worker-Syntax; verwende export default { fetch: app.fetch })app.head(...) Routen (HEAD wird in v4 automatisch von GET abgeleitet)hono/nextjs Import (verwende hono/vercel)hono/middleware Barrel-Import (verwende pro Middleware-Unterpfad)c.req.headers() / c.req.body() / c.req.signal() Accessor-Methoden (verwende c.req.raw.*)FC mit impliziten children (verwende PropsWithChildren<P>)app.fire() (veraltet seit v4.8.0; verwende fire(app) aus hono/service-worker)import { Hono } from 'https://deno.land/x/hono/mod.ts' auf Deno (veraltet seit v4.4.0; verwende jsr:@hono/hono)import cors from 'cors' von npm (verwende hono/cors)supertest für Tests (verwende app.request() / testClient(app))c.req.body als bereits geparst (es ist ein ReadableStream)c.req.parseBody() für JSON (nur Form/Multipart)c.req.text() gefolgt von c.req.json() (Body wird zweimal konsumiert)c.userId = ... Inline-Zuweisung (verwende c.set('userId', ...) mit typisierten Variables)new Response(JSON.stringify(...)) in RPC-Routen (Client sieht unknown)hc<AppType>('/') relative URL (wirft Fehler bei $url())drizzle-orm, fs, native Abhängigkeiten – das #1 RPC-Bundle-Bloat-Problem)createMiddleware<Env> (Variables-Typen propagieren nicht).first().all()cache()streamText (Workers 128 MB Grenze)secureHeaders() / csrf(); keine erwähnen bodyLimit CVE-2025-59139 (Fix in v4.9.7); keine adressieren RPC-Client-Fallstricke (relative URL, Wert-Import-Leak, c.notFound-Typisierung).| Regel | Bereich (globs) | Was sie tut |
|---|
hono-anti-patterns | **/*.ts,**/*.js,**/*.tsx,**/*.jsx,wrangler.{toml,jsonc,json} | 59 LLM-Regressionen mit BAD/CORRECT-Paaren, organisiert A-H nach Kategorie (Express-Verlagerung, v3-APIs, TypeScript/RPC, CF Workers, Sicherheit, Routing, Laufzeit, kleinere Probleme) |
hono-core | **/*.ts,**/*.tsx,**/*.js,**/*.jsx (alwaysApply) | App-Initialisierung mit typisierten Bindings + Variables, Context-API, Request-Accessoren, Middleware-Signatur, Liste eingebauter Middleware, Cookie-Helfer, Laufzeiterkennung |
hono-routing-and-rpc | src/**/*.ts,src/routes/**/*,src/api/**/*,src/server/**/*,src/client/**/*,routes/**/* | Verkettete Routen, Sub-App-Komposition, basePath-Unveränderlichkeit, Fix für Doppelausführungsüberlappung, toter Sub-App-notFound-Code, hc<AppType>-Setup, import type-Regel, typisierte Basis-URL, $path(), TanStack Query / SWR-Integration, factory.createHandlers, RPC bei 30+ Routen-Mitigation |
hono-validators | src/**/*.ts,routes/**/*.ts,api/**/*.ts,handlers/**/*.ts | @hono/zod-validator-Platzierung, c.req.valid()-Accessor, Validator-wirft-bei-Fehler, @hono/zod-openapi (zod ^4 Peer-Falle), @hono/standard-validator, @hono/valibot-validator, eingebauter hono/validator, Entscheidungsbaum |
hono-cloudflare-workers | src/**/*.ts,worker/**/*.ts,workers/**/*.ts,wrangler.{toml,jsonc,json},**/cloudflare-env.d.ts,**/worker-configuration.d.ts | Kanonische wrangler.jsonc-Form, Kompatibilitäts-Flag-Regeln, wrangler types, typisierte Bindings, c.env vs process.env, c.executionCtx.waitUntil + Portabilität, Static Assets Binding, D1-Awaits, Drizzle + D1-Stack, Hyperdrive + Prisma-Adapter-Falle, Durable Objects für WebSockets, hono/cache Custom-Domain-Regel, ES-Module-Worker-Export |
hono-security | src/**/*.ts,src/**/*.tsx,src/middleware/**/*.ts,src/auth/**/*.ts,src/index.ts,src/app.ts | secureHeaders(), csrf(), CORS-Allow-Liste, bodyLimit() + CVE-2025-59139 Pin-Untergrenze 4.9.7, Cookie-Standards, JWT-Secret aus c.env, Logging ohne PII-Leaks, etag() + cache(), IP-Einschränkung, Timeouts, Request-ID, Auth-Bibliotheksentscheidung (Lucia veraltet; Better Auth / Clerk empfohlen), @sentry/hono statt @hono/sentry |
hono-error-handling | src/**/*.ts,routes/**/*.ts,api/**/*.ts,middleware/**/*.ts,src/index.ts,src/app.ts | HTTPException kanonischer Throw, app.onError globaler Handler, app.notFound nur oberste Ebene, typisierte RPC-Fehler via diskriminierte Unions, Validator wirft, Sentry via @sentry/hono, strukturiertes Logging mit pino-Redaktion, Fehlerantwort-Format-Konvention |
hono-jsx | **/*.tsx,**/*.jsx,**/jsx-runtime.ts,src/components/**/*,src/views/**/*,src/islands/**/*,app/islands/**/* | hono/jsx serverseitig, tsconfig-Setup, FC enthält KEINE children, jsxRenderer-Middleware für Layouts, hono/jsx/streaming mit Suspense, hono/jsx/dom Client-Komponenten, HonoX Islands, htmx-Integration, JSX SSR Sicherheits-Pin-Untergrenze 4.12.18 |
hono-testing | **/*.test.ts,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx,vitest.config.{ts,js},**/test/**/*.ts,**/tests/**/*.ts,**/__tests__/**/*.ts | app.request() universelles Muster, testClient(app) typisierte RPC-Tests, Vitest + @cloudflare/vitest-pool-workers für echte Laufzeit-D1, applyD1Migrations-Fixture, Bun + bun:test, Snapshot-Tests, Middleware-/Validator-/waitUntil-Tests, NIEMALS 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 + Kompatibilitäts-Flags), Bun.serve, Deno + JSR, @hono/node-server v2 (Node 20+), AWS Lambda + Lambda@Edge, Vercel Edge, Netlify, Build-Pipelines, Pin-Untergrenzen, häufige Deployment-Fehler |
| Skill | Befehl | Was er tut |
|---|
| Neue Route | /hono-new-route | Erstellt eine verkettete Sub-App mit zValidator als Routenargument, c.req.valid() typisiertem Zugriff, c.json({ ... } as const, status) für typisierte RPC-Antworten, Bindings + Variables Generics, Sub-App exportiert als typeof users, verbunden mit der übergeordneten App via verkettetem .route(). Lehnt Rails-artige Controller, c.notFound() in RPC-Routen und rohes new Response() ab. |
| RPC-Setup | /hono-rpc-setup | Erstellt den hc<AppType>-Client mit import type (die tragende Regel), absoluter Basis-URL, typisiertem gemeinsam genutztem api-Modul, TanStack Query / SWR-Integration via InferRequestType / InferResponseType, parseResponse-Hilfsfunktion, $path()-Methode, Mitigationen für IDE-Verlangsamung bei 30+ Routen. |
| Workers-Setup | /hono-cloudflare-workers-setup | Erstellt ein neues Hono + Workers-Projekt mit wrangler.jsonc (NICHT .toml), nodejs_compat, typisierten Bindings generiert aus wrangler types, D1 + Drizzle-Middleware-Muster, secureHeaders + cors + csrf + bodyLimit-Stack, Vitest-Konfiguration für @cloudflare/vitest-pool-workers. |
| Migration zu v4 | /hono-migrate-to-v4 | Schrittweise v3 -> v4 Migration: Pins erhöhen (CVE-2025-59139 Untergrenze), c.jsonT / c.stream / c.env() / c.req.cookie / app.showRoutes / app.handleEvent ersetzen, hono/middleware-Barrel entfernen, Deno auf JSR umstellen, @hono/node-server v2 + Node 20+, app.onError für Validator-Würfe registrieren. |
| Validieren | /hono-validate | Führt validate-plugin.sh + tsc --noEmit + Tests + grep-Audit für syntaktische Anti-Patterns aus, die der Typprüfer nicht erfasst (c.jsonT, c.req.cookie, process.env, node_compat, serveStatic von hono/cloudflare-workers, hardcodiertes JWT-Secret, sameSite:'None' ohne secure, fehlendes bodyLimit, Wert-Import auf hc-Client). |
| Agent | Was er tut |
|---|
hono-reviewer | Überprüft Hono v4 + TypeScript-Code nach Schweregrad. CRITICAL: hono < 4.9.7 (CVE), v5-Referenzen (Halluzination), cors Wildcard + credentials, sameSite:'None' ohne secure, hardcodiertes JWT-Secret, process.env in Workers, fehlendes bodyLimit, kein csrf bei Cookie-Auth, veraltetes serveStatic, JSX SSR auf < 4.12.18. ERROR: fehlendes return bei c.json, Express-Middleware-Formen, alle v3-Ära entfernten APIs, nicht verkettete Routen/Sub-Apps, Rails-Controller, zValidator-Platzierung, c.notFound/rohes Response in RPC, relative URL hc(), Wert-Import Server-App, nicht abgewartete D1, Laufzeit-Export-Formen. WARN: Cookie-Standards, secureHeaders, Body-Logging ohne Redaktion, app.onError, Sub-App notFound, c.executionCtx Wahrheits-Check, kein Bindings-Generic, cors nach Routen, Middleware-Überlappung, basePath-Anweisung, abschließende Schrägstriche, hono/middleware-Barrel, wrangler.toml bei Neuanlage, Lucia, @hono/sentry. NIT: fehlendes satisfies ExportedHandler<Env>, handgemachtes OpenAPI, fehlendes 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