RoninForge/roninforge-hono

GitHub: RoninForge/roninforge-hono

这是一个Cursor插件,为Hono v4框架提供防退化规则,以纠正LLM生成的代码中的常见错误。

Stars: 0 | Forks: 0

# roninforge-hono [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) Hono v4 (TypeScript 边缘 Web 框架) + TypeScript 的 Cursor 插件。固定依赖为 `hono ^4.12.19`、`@hono/zod-validator ^0.8.0`、`@hono/zod-openapi ^1.4.0` (需 `zod ^4.x` 作为对等依赖)、`@hono/node-server ^2.0.3` (Node 20+)。教授那些基于 2024 年前数据训练的 LLM 所不了解的 v4 API (`c.json()` 始终类型化,验证器抛出 `HTTPException`,`getCookie`/`setCookie` 来自 `hono/cookie`,`c.env` 作为属性,`streamText` 来自 `hono/streaming`,`showRoutes` 来自 `hono/dev`,`getRuntimeKey` 来自 `hono/adapter`,`fire(app)` 来自 `hono/service-worker`,Workers 静态资源绑定取代已弃用的 `serveStatic`,用于 Deno 的 JSR `@hono/hono`)。通过 BAD / CORRECT TypeScript 对,捕获 50 多个 LLM 回退问题。 **不存在 Hono v5。** 最新稳定版是 `v4.12.19`。生成的代码中出现的任何 "v5" 都是幻觉。 ## 问题所在 Hono 的维护者自己提交了 Issue #3906 ("llm.txt file") 和 Issue #4812 ("Official AI Agent Skill for Hono"),明确指出 **"LLM 基本不了解最新 Hono 的工作原理。"** 2025 年前的训练数据是 v3 时代的。LLM 会产生: ### v3 -> v4 移除的 API - **`c.jsonT()`** 而不是 `c.json()`(自 v4.0.0 起始终类型化) - **`c.stream()` / `c.streamText()`** 作为 Context 方法(在 v4 中移至 `hono/streaming`) - **`c.env()`** 函数形式(现在是属性;运行时检测通过 `hono/adapter` 中的 `getRuntimeKey()`) - **`c.req.cookie()`**(已移除;使用 `hono/cookie` 中的 `getCookie(c)`) - **`app.showRoutes()`、`app.routerName`**(移至 `hono/dev`) - **`addEventListener('fetch')` + `app.handleEvent()`**(Service Worker 语法;使用 `export default { fetch: app.fetch }`) - **`app.head(...)`** 路由(v4 中 HEAD 从 GET 自动派生) - **`hono/nextjs`** 导入(使用 `hono/vercel`) - **`hono/middleware`** 整体导入(使用每个中间件的子路径) - **`c.req.headers()` / `c.req.body()` / `c.req.signal()`** 访问器方法(使用 `c.req.raw.*`) - **`FC`** 带有隐式 children(使用 `PropsWithChildren

`) - **`app.fire()`**(v4.8.0 弃用;使用 `hono/service-worker` 中的 `fire(app)`) - **`import { Hono } from 'https://deno.land/x/hono/mod.ts'`** 在 Deno 上(自 v4.4.0 起已过时;使用 `jsr:@hono/hono`) ### Express / Koa / Fastify 泄漏(最大的一类) - **缺少 `return`** 在 `c.json()` 上(解析为 undefined;v4 抛出 "Context is not finalized") - **`res.json()` / `res.send()`** 而不是 `c.json()`(Hono 中没有 `res`) - **`(req, res, next)`** 中间件签名(使用 `(c, next)`) - **`(err, req, res, next)`** 错误中间件(使用 `app.onError` + `HTTPException`) - **`app.use(express.json())`** body 解析器(Hono 按需通过 `c.req.json()` 解析) - **`import cors from 'cors'`** 从 npm(使用 `hono/cors`) - **`supertest`** 用于测试(使用 `app.request()` / `testClient(app)`) - **`c.req.body`** 作为已解析的(它是 `ReadableStream`) - **`c.req.parseBody()`** 用于 JSON(仅适用于 form / multipart) - **`c.req.text()` 然后 `c.req.json()`**(body 被消费两次) - **`c.userId = ...`** 内联赋值(使用带类型化 Variables 的 `c.set('userId', ...)`) ### TypeScript / RPC 推断错误 - **`new Hono()`** 没有 `Bindings` / `Variables` 泛型(`c.env` 是 `{}`) - **路由定义为语句**(`app.get(...)` 然后 `app.post(...)`) - 丢弃 RPC 类型 - **子应用 `app.route()` 调用作为语句** - 同样规则 - **Rails 风格控制器** 传递 `Context`(丢失路径参数推断,根据 Hono 最佳实践) - **`app.use('/path', zValidator(...))`** 而不是作为路由参数(TS 错误:`'json' not assignable to 'never'`) - **`c.notFound()`** 在 RPC 消费的路由中(无法在客户端类型化) - **`new Response(JSON.stringify(...))`** 在 RPC 路由中(客户端看到 `unknown`) - **`hc('/')`** 相对 URL(在 `$url()` 时抛出错误) - **将服务器应用的值导入** 到客户端 bundle 中(拖入 `drizzle-orm`、`fs`、原生依赖 - **头号 RPC bundle 膨胀陷阱**) - **中间件没有 `createMiddleware`**(Variables 类型不传播) ### Cloudflare Workers 陷阱 - **`process.env.X`** 在 Workers 代码中(undefined;使用带类型化 `Bindings` 的 `c.env.X`) - **`fs` / `path`** 导入在 Workers 中(没有文件系统) - **`compatibility_flags: ["node_compat"]`** 旧标志(使用 `nodejs_compat`) - **已弃用的 `serveStatic` 来自 `hono/cloudflare-workers`**(自 v4.3.0 起;使用资源绑定) - **缺少 `c.executionCtx.waitUntil()`** 用于 fire-and-forget - **真实值检查 `if (c.executionCtx)`**(getter 在 Bun 和 Next.js App Router 上抛出错误) - **未等待的 D1 `.run()` / `.first()` / `.all()`**(当 worker 终止时插入被取消) - **WebSocket 升级没有 Durable Object** 转发(状态消失) ### 安全 / 生产缺口 - **没有 `secureHeaders()`** 中间件 - **没有 `csrf()`** 在 cookie 认证的变更上 - **`cors({ origin: '*', credentials: true })`**(浏览器静默丢弃;AJAX 失败) - **缺少 `bodyLimit()`** 在 POST / PUT 路由上 **并且固定 `hono >= 4.9.7` 用于 CVE-2025-59139** - **Cookies 没有 `httpOnly` / `secure` / `sameSite` / `path`** - **`sameSite: 'None'` 没有 `secure: true`**(静默丢弃) - **Body 日志中间件** 没有脱敏(密码/令牌/PII 泄漏) - **没有 `etag()` / `cache()`** 在静态 GET 上 - **硬编码的 JWT 密钥** 字符串(通过 bundle 泄漏) - **在内存中构建大型 JSON** 而不是使用 `streamText`(Workers 128MB 上限) ### 路由 / 结构性错误 - **子应用 `notFound`** 处理器(死代码;只有顶层触发) - **尾部斜杠不一致**(`/users` vs `/users/` 默认是不同路由) - **`await next()`** 多于一次(下游工作加倍) - **`app.use(prefix, mw)` + `app.route(prefix, subApp)` 重叠**(中间件触发两次) - **`app.basePath('/api')`** 作为语句(前缀从类型中丢弃) ### 运行时静默错误 - **`serve(app)`** 在 `@hono/node-server` 上(使用 `serve({ fetch: app.fetch })`) - **`export default app`** 在 Workers 上(使用 `export default { fetch: app.fetch }`) - **`Bun.serve({ fetch: app })`**(使用 `app.fetch`) ### 较小的实际问题 - **`c.req.query()`** 无参数时期望单个值 - **`c.req.param('id')`** 在全局中间件中(当路径中没有 `:id` 时是 undefined) - **手动编写的 OpenAPI** 没有使用 `@hono/zod-openapi` - **`cors()`** 安装在路由之后(永远不匹配) ## 安装 将规则、技能和智能体复制到你项目的 Cursor 配置中。先备份你现有的文件;`cp -r` 会覆盖同名规则。 ``` git clone https://github.com/RoninForge/roninforge-hono.git # 使用 -n 以避免覆盖同名的自定义规则。 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/ ``` 或者将整个仓库作为 git 子模块放在 `your-project/.cursor/plugins/` 下。请参考 [Cursor 插件文档](https://docs.cursor.com/plugins) 了解适用于你 Cursor 版本的当前全局安装路径。 ## 包含内容 ### 规则(10 个文件) | 规则 | 作用域 (globs) | 功能描述 | |---|---|---| | `hono-anti-patterns` | `**/*.ts,**/*.js,**/*.tsx,**/*.jsx,wrangler.{toml,jsonc,json}` | 59 个 LLM 回退问题,配有 BAD / CORRECT 对,按类别 A-H 组织(Express 泄漏、v3 时代 API、TypeScript / RPC、CF Workers、安全、路由、运行时、较小问题) | | `hono-core` | `**/*.ts,**/*.tsx,**/*.js,**/*.jsx` (alwaysApply) | 应用初始化,带类型化 Bindings + Variables、Context API、请求访问器、中间件签名、内置中间件列表、cookie 助手、运行时检测 | | `hono-routing-and-rpc` | `src/**/*.ts,src/routes/**/*,src/api/**/*,src/server/**/*,src/client/**/*,routes/**/*` | 链式路由、子应用组合、basePath 不可变性、双重执行重叠修复、子应用 notFound 死代码、`hc` 设置、`import type` 规则、类型化基础 URL、`$path()`、TanStack Query / SWR 集成、factory.createHandlers、30+ 路由的 RPC 缓解 | | `hono-validators` | `src/**/*.ts,routes/**/*.ts,api/**/*.ts,handlers/**/*.ts` | `@hono/zod-validator` 放置、`c.req.valid()` 访问器、验证失败抛出异常、`@hono/zod-openapi` (zod ^4 对等依赖陷阱)、`@hono/standard-validator`、`@hono/valibot-validator`、内置 `hono/validator`、决策树 | | `hono-cloudflare-workers` | `src/**/*.ts,worker/**/*.ts,workers/**/*.ts,wrangler.{toml,jsonc,json},**/cloudflare-env.d.ts,**/worker-configuration.d.ts` | `wrangler.jsonc` 规范形状、兼容性标志规则、`wrangler types`、类型化 Bindings、`c.env` vs `process.env`、`c.executionCtx.waitUntil` + 可移植性、静态资源绑定、D1 等待、Drizzle + D1 技术栈、Hyperdrive + Prisma 适配器陷阱、Durable Objects 用于 WebSockets、`hono/cache` 自定义域规则、ES Module Worker 导出 | | `hono-security` | `src/**/*.ts,src/**/*.tsx,src/middleware/**/*.ts,src/auth/**/*.ts,src/index.ts,src/app.ts` | `secureHeaders()`、`csrf()`、CORS 允许列表、`bodyLimit()` + CVE-2025-59139 最低固定版本 4.9.7、cookie 默认值、来自 c.env 的 JWT 密钥、无 PII 泄漏的日志记录、`etag()` + `cache()`、IP 限制、超时、请求 ID、认证库选择(Lucia 已弃用;推荐 Better Auth / Clerk)、`@sentry/hono` 优先于 `@hono/sentry` | | `hono-error-handling` | `src/**/*.ts,routes/**/*.ts,api/**/*.ts,middleware/**/*.ts,src/index.ts,src/app.ts` | `HTTPException` 规范抛出、`app.onError` 全局处理器、`app.notFound` 仅顶层、通过判别联合的类型化 RPC 错误、验证器抛出异常、通过 `@sentry/hono` 的 Sentry、带 pino 脱敏的结构化日志记录、错误响应形状约定 | | `hono-jsx` | `**/*.tsx,**/*.jsx,**/jsx-runtime.ts,src/components/**/*,src/views/**/*,src/islands/**/*,app/islands/**/*` | `hono/jsx` 服务端、tsconfig 设置、`FC` 不包括 children、`jsxRenderer` 中间件用于布局、带 Suspense 的 `hono/jsx/streaming`、`hono/jsx/dom` 客户端组件、HonoX islands、htmx 集成、JSX SSR 安全最低固定版本 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()` 通用模式、`testClient(app)` 类型化 RPC 测试、Vitest + `@cloudflare/vitest-pool-workers` 用于真实运行时 D1、`applyD1Migrations` fixture、Bun + `bun:test`、快照测试、中间件/验证器/waitUntil 测试、永不使用 `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 + 兼容性标志)、Bun.serve、Deno + JSR、@hono/node-server v2 (Node 20+)、AWS Lambda + Lambda@Edge、Vercel Edge、Netlify、构建管道、最低固定版本、常见部署错误 | ### 技能(5 个命令) | 技能 | 命令 | 功能描述 | |---|---|---| | 新路由 | `/hono-new-route` | 使用 `zValidator` 作为路由参数、`c.req.valid()` 类型化访问、`c.json({ ... } as const, status)` 用于类型化 RPC 响应、`Bindings` + `Variables` 泛型,搭建链式子应用骨架。子应用导出为 `typeof users`,通过链式 `.route()` 连接到父应用。拒绝 Rails 风格控制器、在 RPC 路由中使用 `c.notFound()`、原始 `new Response()`。 | | RPC 设置 | `/hono-rpc-setup` | 使用 `import type`(承载规则)搭建 `hc` 客户端骨架、绝对基础 URL、类型化共享 `api` 模块、通过 `InferRequestType` / `InferResponseType` 的 TanStack Query / SWR 集成、`parseResponse` 实用程序、`$path()` 方法、30+ 路由的 IDE 减速缓解。 | | Workers 设置 | `/hono-cloudflare-workers-setup` | 搭建全新的 Hono + Workers 项目骨架,使用 `wrangler.jsonc` (非 `.toml`)、`nodejs_compat`、由 `wrangler types` 生成的类型化 `Bindings`、D1 + Drizzle 中间件模式、`secureHeaders` + `cors` + `csrf` + `bodyLimit` 技术栈、用于 `@cloudflare/vitest-pool-workers` 的 Vitest 配置。 | | 迁移到 v4 | `/hono-migrate-to-v4` | 分阶段 v3 -> v4 迁移:提升固定版本(CVE-2025-59139 最低版本)、替换 `c.jsonT` / `c.stream` / `c.env()` / `c.req.cookie` / `app.showRoutes` / `app.handleEvent`、丢弃 `hono/middleware` 整体导入、Deno 切换到 JSR、`@hono/node-server` v2 + Node 20+、为验证器抛出异常注册 `app.onError`。 | | 验证 | `/hono-validate` | 运行 `validate-plugin.sh` + `tsc --noEmit` + 测试 + grep 审计,以查找类型检查器无法捕获的语法反模式(`c.jsonT`、`c.req.cookie`、`process.env`、`node_compat`、来自 `hono/cloudflare-workers` 的 `serveStatic`、硬编码 JWT 密钥、`sameSite:'None'` 无 `secure`、缺少 `bodyLimit`、在 `hc` 客户端上的值导入)。 | ### 智能体(1 个子智能体) | 智能体 | 功能描述 | |---|---| | `hono-reviewer` | 按严重性审查 Hono v4 + TypeScript 代码。严重:`hono < 4.9.7`(CVE)、v5 引用(幻觉)、`cors` 通配符 + 凭据、`sameSite:'None'` 无 `secure`、硬编码 JWT 密钥、Workers 中的 `process.env`、缺少 `bodyLimit`、cookie 认证无 `csrf`、已弃用的 `serveStatic`、JSX SSR 在 `< 4.12.18` 上。错误:`c.json` 缺少 return、Express 中间件形状、所有 v3 时代移除的 API、未链式路由/子应用、Rails 控制器、`zValidator` 放置、RPC 中的 `c.notFound`/原始 Response、相对 URL `hc()`、值导入服务器应用、未等待的 D1、运行时导出形状。警告:cookie 默认值、`secureHeaders`、body 日志记录无脱敏、`app.onError`、子应用 `notFound`、`c.executionCtx` 真实值检查、无 Bindings 泛型、`cors` 在路由之后、中间件重叠、`basePath` 语句、尾部斜杠、`hono/middleware` 整体导入、新项目使用 `wrangler.toml`、Lucia、`@hono/sentry`。瑕疵:缺少 `satisfies ExportedHandler`、手动编写的 OpenAPI、缺少 `observability.enabled`。 | ## 测试夹具 `tests/fixtures/correct-sample/` 是一个精简的 Hono 4.12.19 + Cloudflare Workers + D1 + Drizzle + Zod 项目,展示了黄金标准形状:链式路由、类型化 RPC、`zValidator` 作为路由参数、`c.json({ ... } as const, status)` 类型化响应、`secureHeaders` + `cors` + `csrf` + `bodyLimit` 技术栈、`app.onError` + `app.notFound` 在顶层、`export default { fetch: app.fetch } satisfies ExportedHandler`。 `tests/fixtures/anti-pattern-sample/` 是其反面。每个文件都违反了一个编号的反模式。`package.json` 故意固定 `hono ^3.12.0` + `cors ^2.8.5` + `supertest ^6.3.0` + `@hono/sentry ^1.0.0` + `lucia ^3.2.0` - v3 时代是大多数 2025 年前模型的 LLM 训练数据基线,加上 LLM 仍然推荐的已弃用伴侣。跟踪的违规包括:`c.json` 缺少 return (#1)、`(req, res)` Express 处理器形状 (#2)、`(req, res, next)` 中间件 (#3)、`(err, req, res, next)` (#4)、npm cors (#6)、supertest (#12)、`c.jsonT` (#13)、`addEventListener('fetch') + app.handleEvent` (#15)、`c.req.cookie` (#16)、`c.env()` 函数调用 (#17)、`hono/middleware` 整体导入 (#20)、`app.head()` (#23)、无 Bindings/Variables (#24)、RPC 路由中的 `c.notFound` (#29)、Workers 中的 `process.env` (#34)、`node_compat` 标志 (#36)、来自 `hono/cloudflare-workers` 的 `serveStatic` (#37)、未等待的 D1 (#40)、cors `*` + 凭据 (#43)、无 `httpOnly/secure/sameSite/path` 的 cookie (#45)、`sameSite:'None'` 无 `secure:true` (#46)、硬编码 JWT 密钥 (#48)、子应用 `notFound` (#50)、`basePath` 作为语句 (#53)、Workers 上的 `export default app` (#55)、已弃用的 `@hono/sentry` + `lucia` 引用。 ## 版本控制 规则针对 `hono ^4.12.19`,适用于 Node 20+(当在 Node 上时)、最新 Bun、最新 Deno、Wrangler ^4.0.0。大多数模式可回溯至 Hono 4.0.0(2024 年 2 月),具体差异已内联说明。最低固定版本: - **`hono >= 4.9.7`** 强制要求 - CVE-2025-59139 / GHSA-92vj-g62v-jqhh `bodyLimit` 绕过修复 - **`hono >= 4.12.18`** 如果渲染 JSX SSR 则强制要求 - 标签名、属性名、CSS 注入加固 - **`@hono/node-server >= 2.0.0`** 需要 Node 20+ - **`@hono/zod-openapi >= 1.0.0`** 需要 `zod ^4.0.0`(对等依赖仅为 `^4.0.0`,非 `^3.x`) - **`compatibility_date >= "2024-09-23"`** 要求 `nodejs_compat` 意味着 `nodejs_compat_v2` 规则引用了版本(`c.json()` 自 v4.0.0 起始终类型化、`c.text()` 自 v4.3.0 起类型化、Deno 使用 JSR 自 v4.4.0 起、`secureHeaders Permissions-Policy` 自 v4.6.0 起、标准 Schema 验证器自 v4.7.0 起、`fire(app)` 自 v4.8.0 起、JSR `parseResponse` 自 v4.9.0 起、`hc` 的类型化基础 URL 自 v4.11.0 起、`$path()` 方法自 v4.12.0 起),在采用前请对照你已安装版本的更新日志进行验证。 ## 许可证 MIT - 详见 [LICENSE](LICENSE) ## 链接 - [Hono 官方文档](https://hono.dev) - [Hono GitHub](https://github.com/honojs/hono) - [Hono 迁移指南 (v3 -> v4)](https://github.com/honojs/hono/blob/main/docs/MIGRATION.md) - [Hono 最佳实践](https://hono.dev/docs/guides/best-practices) - [Hono RPC](https://hono.dev/docs/guides/rpc) - [Cloudflare Workers Hono 框架指南](https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/hono/) - [Cursor 插件文档](https://docs.cursor.com/plugins) - [RoninForge](https://roninforge.org)

标签:API兼容性, Cursor插件, Deno, GitHub Advanced Security, GNU通用公共许可证, Hono框架, LLM回归测试, MITM代理, Node.js, SEO优化, SOC Prime, Syscall, TypeScript, Web开发, Zod验证, 中间件, 代码迁移, 前端技术, 后端框架, 安全加固, 安全插件, 开发工具, 开发调试, 服务端渲染, 框架升级, 程序员工具, 类型安全, 路由管理, 边缘计算, 运行时检测, 部署环境