
Plugin do Cursor para Hono v4 (framework web edge em TypeScript). 59 regressões de LLM com pares RUIM/CORRETO. Fixado em hono ^4.12.19 (>= 4.9.7 para CVE-2025-59139). Abrange vazamento de middleware do Express, APIs removidas da era v3, armadilhas de inferência RPC, pegadinhas do Cloudflare Workers, padrões de segurança e endurecimento de SSR com JSX.
Plugin para o Cursor do Hono v4 (framework web TypeScript edge) + TypeScript. Fixado em 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+). Ensina as APIs v4 que LLMs treinados em dados anteriores a 2024 não conhecem (c.json() sempre tipado, validador lança HTTPException, getCookie/setCookie de hono/cookie, c.env como propriedade, streamText de hono/streaming, showRoutes de hono/dev, getRuntimeKey de hono/adapter, fire(app) de hono/service-worker, binding de Static Assets do Workers em vez do obsoleto serveStatic, JSR @hono/hono para Deno). Captura 50+ regressões de LLM com pares RUIM / CORRETO em TypeScript.
Não existe Hono v5. A estável mais recente é v4.12.19. Qualquer "v5" no código gerado é alucinação.
Os próprios mantenedores do Hono abriram a Issue #3906 ("llm.txt file") e a Issue #4812 ("Official AI Agent Skill for Hono") explicitamente porque "LLMs praticamente não têm conhecimento de como o Hono mais recente funciona." Dados de treinamento anteriores a 2025 são da era v3. LLMs emitem:
c.jsonT() em vez de c.json() (sempre tipado desde v4.0.0)c.stream() / c.streamText() como métodos de Context (movido para hono/streaming no v4)c.env() forma de função (agora propriedade; detecção de runtime via getRuntimeKey() de hono/adapter)c.req.cookie() (removido; use getCookie(c) de hono/cookie)app.showRoutes(), app.routerName (movido para hono/dev)return ausente em c.json() (resolve para undefined; v4 lança "Context is not finalized")res.json() / res.send() em vez de c.json() (não existe res no Hono)(req, res, next) (use (c, next))(err, req, res, next) (use app.onError + HTTPException)app.use(express.json()) parser de body (Hono faz parsing sob demanda via c.req.json())new Hono() sem genéricos Bindings / Variables (c.env é {})app.get(...) depois app.post(...)) - perde tipos RPCapp.route() como declarações - mesma regraContext por aí (perde inferência de parâmetros de caminho, conforme Best Practices do Hono)app.use('/path', zValidator(...)) em vez de como argumento de rota (Erro TS: 'json' not assignable to 'never')c.notFound() em rotas consumidas por RPC (não pode tipar no cliente)process.env.X em código Workers (undefined; use c.env.X com Bindings tipado)fs / path no Workers (não há sistema de arquivos)compatibility_flags: ["node_compat"] (use nodejs_compat)serveStatic obsoleto de hono/cloudflare-workers (desde v4.3.0; use asset binding)c.executionCtx.waitUntil() ausente para fire-and-forgetif (c.executionCtx) (getter lança erro no Bun e no Next.js App Router).run() / / (insert cancelado quando worker termina)secureHeaders()csrf() em mutações autenticadas por cookiecors({ origin: '*', credentials: true }) (navegadores silenciosamente descartam; AJAX falha)bodyLimit() ausente em rotas POST / PUT e fixar hono >= 4.9.7 para CVE-2025-59139httpOnly / secure / sameSite / pathsameSite: 'None' sem secure: true (silenciosamente descartado)etag() / em GETs estáticosnotFound de sub-app (código morto; apenas o nível superior dispara)/users vs /users/ são rotas diferentes por padrão)await next() mais de uma vez (duplica trabalho a jusante)app.use(prefix, mw) + app.route(prefix, subApp) sobreposição (middleware dispara duas vezes)app.basePath('/api') como declaração (prefixo é descartado do tipo)serve(app) em @hono/node-server (use serve({ fetch: app.fetch }))export default app no Workers (use export default { fetch: app.fetch })Bun.serve({ fetch: app }) (use app.fetch)c.req.query() sem argumento quando espera valor únicoc.req.param('id') em middleware global (undefined onde :id não está no caminho)@hono/zod-openapicors() montado APÓS as rotas (nunca corresponde)Algumas regras Hono já existem em cursor.directory e em awesome-cursorrules (PR #152): cobrem retornos de c.json(), zValidator + Zod, c.env para Workers, rotas encadeadas para RPC e export Workers app.fetch. Elas têm três problemas estruturais que este plugin resolve:
c.jsonT, c.stream, c.env(), c.req.cookie, app.showRoutes, o barril hono/middleware e app.handleEvent - todos removidos no v4.0.0 (fev/2024). Regras existentes permitem silenciosamente.(req, res, next), (err, req, res, next), cors do npm, app.use(express.json()), supertest, falta de return em c.json - tudo acontece constantemente em código Hono gerado por LLM. Regras existentes tratam como casos isolados.Este plugin fornece:
globs apropriadas para que as verificações de rotas / RPC disparem em src/routes/**, verificações Workers em wrangler.{toml,jsonc} + entrada Worker, verificações de segurança em arquivos de middleware, etc./hono-new-route, /hono-rpc-setup, /hono-cloudflare-workers-setup, /hono-migrate-to-v4, /hono-validatecorrect-sample (padrão ouro Hono 4.12.19 + Workers + D1 + Drizzle + Zod) e anti-pattern-sample (herança Hono v3 com 25+ violações rastreadas)Copie as regras, habilidades e agente para a configuração do Cursor do seu projeto. Faça backup dos arquivos existentes primeiro; cp -r sobrescreverá regras de mesmo nome.
git clone https://github.com/RoninForge/roninforge-hono.git
# Use -n para evitar sobrescrever uma regra personalizada existente de mesmo nome.
cp -rn roninforge-hono/rules/* seu-projeto/.cursor/rules/
cp -rn roninforge-hono/skills/* seu-projeto/.cursor/skills/
cp -rn roninforge-hono/agents/* seu-projeto/.cursor/agents/
Ou forneça o repositório inteiro como um submódulo git em seu-projeto/.cursor/plugins/. Consulte a documentação de plugins do Cursor para o caminho atual de instalação global na sua versão do Cursor.
tests/fixtures/correct-sample/ é um projeto enxuto Hono 4.12.19 + Cloudflare Workers + D1 + Drizzle + Zod demonstrando a forma padrão ouro: rotas encadeadas, RPC tipado, zValidator como argumento de rota, c.json({ ... } as const, status) respostas tipadas, pilha secureHeaders + cors + csrf + bodyLimit, app.onError + app.notFound no nível superior, export default { fetch: app.fetch } satisfies ExportedHandler<Env>.
tests/fixtures/anti-pattern-sample/ é o inverso. Cada arquivo viola um antipadrão numerado. package.json fixa hono ^3.12.0 + cors ^2.8.5 + supertest ^6.3.0 + @hono/sentry ^1.0.0 + lucia ^3.2.0 de propósito - a era v3 é a linha de base dos dados de treinamento de LLM para a maioria dos modelos pré-2025, além de dependências obsoletas que LLMs ainda recomendam. Violações rastreadas incluem: falta de return em c.json (#1), forma de handler Express (req, res) (#2), middleware (req, res, next) (#3), (err, req, res, next) (#4), cors npm (#6), supertest (#12), c.jsonT (#13), addEventListener('fetch') + app.handleEvent (#15), (#16), chamada de função (#17), barril (#20), (#23), sem Bindings/Variables (#24), em rota RPC (#29), no Workers (#34), flag (#36), de (#37), D1 não aguardado (#40), cors + credentials (#43), cookie sem (#45), sem (#46), segredo JWT codificado (#48), de sub-app (#50), como declaração (#53), no Workers (#55), referências a + obsoletos.
Regras visam hono ^4.12.19 com Node 20+ (quando no Node), Bun mais recente, Deno mais recente, Wrangler ^4.0.0. A maioria dos padrões funciona desde Hono 4.0.0 (fev/2024) com as diferenças indicadas inline. Pisos de versão:
hono >= 4.9.7 obrigatório - CVE-2025-59139 / GHSA-92vj-g62v-jqhh correção de bypass de bodyLimithono >= 4.12.18 obrigatório se renderizando JSX SSR - endurecimento de nome de tag, nome de atributo, injeção CSS@hono/node-server >= 2.0.0 requer Node 20+@hono/zod-openapi >= 1.0.0 requer zod ^4.0.0 (peer é APENAS ^4.0.0, não ^3.x)compatibility_date >= "2024-09-23" necessário para nodejs_compat implicar nodejs_compat_v2Onde a regra cita uma versão (c.json() sempre 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 em hc desde v4.11.0, método $path() desde v4.12.0), verifique no changelog a versão que você tem instalada antes de adotar.
MIT - veja LICENSE
RoninForge constrói ferramentas gratuitas para desenvolvedores que trabalham com assistentes de codificação IA:
addEventListener('fetch') + app.handleEvent() (sintaxe Service Worker; use export default { fetch: app.fetch })app.head(...) (HEAD derivado automaticamente de GET no v4)hono/nextjs (use hono/vercel)hono/middleware (use subcaminho por middleware)c.req.headers() / c.req.body() / c.req.signal() (use c.req.raw.*)FC com children implícito (use PropsWithChildren<P>)app.fire() (obsoleto desde v4.8.0; use fire(app) de hono/service-worker)import { Hono } from 'https://deno.land/x/hono/mod.ts' no Deno (desatualizado desde v4.4.0; use jsr:@hono/hono)import cors from 'cors' do npm (use hono/cors)supertest para testes (use app.request() / testClient(app))c.req.body como já parseado (é um ReadableStream)c.req.parseBody() para JSON (apenas formulário / multipart)c.req.text() seguido de c.req.json() (body consumido duas vezes)c.userId = ... (use c.set('userId', ...) com Variables tipadas)new Response(JSON.stringify(...)) em rotas RPC (cliente vê unknown)hc<AppType>('/') (lança erro em $url())drizzle-orm, fs, dependências nativas - a armadilha #1 de inchaço de bundle RPC)createMiddleware<Env> (tipos de Variables não propagam).first().all()cache()streamText (limite de 128MB do Workers)secureHeaders() / csrf(); nenhuma menciona bodyLimit CVE-2025-59139 (correção no v4.9.7); nenhuma aborda as armadilhas do cliente RPC (URL relativa, vazamento de import de valor, tipagem c.notFound).| Regra | Escopo (globs) | O que faz |
|---|
hono-anti-patterns | **/*.ts,**/*.js,**/*.tsx,**/*.jsx,wrangler.{toml,jsonc,json} | 59 regressões de LLM com pares RUIM / CORRETO, organizados A-H por categoria (vazamento Express, APIs da era v3, TypeScript / RPC, CF Workers, segurança, roteamento, runtime, problemas menores) |
hono-core | **/*.ts,**/*.tsx,**/*.js,**/*.jsx (alwaysApply) | Inicialização do App com Bindings + Variables tipados, API de Context, acessadores de request, assinatura de middleware, lista de middlewares embutidos, helpers de cookie, detecção de runtime |
hono-routing-and-rpc | src/**/*.ts,src/routes/**/*,src/api/**/*,src/server/**/*,src/client/**/*,routes/**/* | Rotas encadeadas, composição de sub-app, imutabilidade do basePath, correção de sobreposição de dupla execução, código morto de notFound em sub-app, configuração hc<AppType>, regra import type, URL base tipada, $path(), integração TanStack Query / SWR, factory.createHandlers, mitigação de lentidão do IDE para 30+ rotas |
hono-validators | src/**/*.ts,routes/**/*.ts,api/**/*.ts,handlers/**/*.ts | Posicionamento de @hono/zod-validator, acessador c.req.valid(), validador lança erro na falha, @hono/zod-openapi (pegadinha peer zod ^4), @hono/standard-validator, @hono/valibot-validator, hono/validator embutido, árvore de decisão |
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, regras de compatibilidade flag, wrangler types, Bindings tipados, c.env vs process.env, c.executionCtx.waitUntil + portabilidade, binding de Static Assets, aguardar D1, pilha Drizzle + D1, pegadinha adaptador Hyperdrive + Prisma, Durable Objects para WebSockets, regra de domínio personalizado 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 de permissões CORS, bodyLimit() + fixação piso CVE-2025-59139 4.9.7, padrões de cookie, segredo JWT de c.env, registro sem vazamento de PII, etag() + cache(), restrição de IP, timeouts, ID de request, decisão de biblioteca de auth (Lucia obsoleto; Better Auth / Clerk recomendados), @sentry/hono em vez de @hono/sentry |
hono-error-handling | src/**/*.ts,routes/**/*.ts,api/**/*.ts,middleware/**/*.ts,src/index.ts,src/app.ts | Lançamento canônico de HTTPException, handler global app.onError, app.notFound apenas no nível superior, erros RPC tipados via uniões discriminadas, validador lança erro, Sentry via @sentry/hono, registro estruturado com redação pino, convenção de formato de resposta de erro |
hono-jsx | **/*.tsx,**/*.jsx,**/jsx-runtime.ts,src/components/**/*,src/views/**/*,src/islands/**/*,app/islands/**/* | hono/jsx server-side, configuração tsconfig, FC NÃO inclui children, middleware jsxRenderer para layouts, hono/jsx/streaming com Suspense, hono/jsx/dom componentes cliente, ilhas HonoX, integração htmx, fixação de segurança SSR JSX piso 4.12.18 |
hono-testing | **/*.test.ts,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx,vitest.config.{ts,js},**/test/**/*.ts,**/tests/**/*.ts,**/__tests__/**/*.ts | Padrão universal app.request(), testClient(app) testes RPC tipados, Vitest + @cloudflare/vitest-pool-workers para D1 runtime real, fixture applyD1Migrations, Bun + bun:test, testes de snapshot, testes 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 + flags de compatibilidade), Bun.serve, Deno + JSR, @hono/node-server v2 (Node 20+), AWS Lambda + Lambda@Edge, Vercel Edge, Netlify, pipelines de build, pisos de versão, erros comuns de deploy |
| Habilidade | Comando | O que faz |
|---|
| Nova rota | /hono-new-route | Esboça um sub-app encadeado com zValidator como argumento de rota, acesso tipado c.req.valid(), c.json({ ... } as const, status) para respostas RPC tipadas, genéricos Bindings + Variables, sub-app exportado como typeof users, conectado ao pai com .route() encadeado. Recusa controladores estilo Rails, c.notFound() em rotas RPC, new Response() bruto. |
| Configuração RPC | /hono-rpc-setup | Esboça o cliente hc<AppType> com import type (a regra crítica), URL base absoluta, módulo api compartilhado tipado, integração TanStack Query / SWR via InferRequestType / InferResponseType, utilitário parseResponse, método $path(), mitigação de lentidão do IDE para 30+ rotas. |
| Configuração Workers | /hono-cloudflare-workers-setup | Esboça um projeto Hono + Workers novo com wrangler.jsonc (NÃO .toml), nodejs_compat, Bindings tipados gerados de wrangler types, padrão de middleware D1 + Drizzle, pilha secureHeaders + cors + csrf + bodyLimit, configuração Vitest para @cloudflare/vitest-pool-workers. |
| Migrar para v4 | /hono-migrate-to-v4 | Migração v3 -> v4 em etapas: atualizar pisos (CVE-2025-59139), substituir c.jsonT / c.stream / c.env() / c.req.cookie / app.showRoutes / app.handleEvent, remover barril hono/middleware, trocar Deno para JSR, @hono/node-server v2 + Node 20+, registrar app.onError para lançamentos de validador. |
| Validar | /hono-validate | Executa validate-plugin.sh + tsc --noEmit + testes + auditoria grep para antipadrões sintáticos que o verificador de tipos não captura (c.jsonT, c.req.cookie, process.env, node_compat, serveStatic de hono/cloudflare-workers, segredo JWT codificado, sameSite:'None' sem secure, bodyLimit ausente, import de valor no cliente hc). |
| Agente | O que faz |
|---|
hono-reviewer | Revisa código Hono v4 + TypeScript por severidade. CRITICAL: hono < 4.9.7 (CVE), referências a v5 (alucinação), cors curinga + credentials, sameSite:'None' sem secure, segredo JWT codificado, process.env no Workers, bodyLimit ausente, sem csrf em auth por cookie, serveStatic obsoleto, JSX SSR em < 4.12.18. ERROR: falta de return em c.json, formas de middleware Express, todas as APIs removidas da era v3, rotas / sub-apps não encadeados, controladores Rails, posicionamento zValidator, c.notFound/Response bruto em RPC, URL relativa hc(), import de valor do app servidor, D1 não aguardado, formas de export runtime. WARN: padrões de cookie, secureHeaders, registro de body sem redação, app.onError, notFound de sub-app, verificação de verdade em c.executionCtx, sem genérico Bindings, cors após rotas, sobreposição de middleware, declaração basePath, barras finais, barril hono/middleware, wrangler.toml em projeto novo, Lucia, @hono/sentry. NIT: satisfies ExportedHandler<Env> ausente, OpenAPI feito à mão, observability.enabled ausente. |
c.req.cookiec.env()hono/middlewareapp.head()c.notFoundprocess.envnode_compatserveStatichono/cloudflare-workers*httpOnly/secure/sameSite/pathsameSite:'None'secure:truenotFoundbasePathexport default app@hono/sentrylucia