深度解析)
ECC 的 Cursor 规则体系TypeScript/JavaScript 模式规则.cursor/rules/typescript-patterns.md深度解析【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC本文以 ECC 仓库中的 Cursor 规则文件 .cursor/rules/typescript-patterns.md 为主体完整剖析这份规则的加载机制frontmatter 元数据及其携带的三大 TypeScript/JavaScript 核心模式统一 API 响应信封ApiResponseT、自定义 Hook 模式以useDebounce为例与 Repository 数据访问模式。读完后你将理解 ECC 如何为 AI 编码助手注入项目级编码约束并能在自己的 Cursor 项目中复制这套规则落地方式。规则文件定位ECC 为 Cursor 注入的 TS/JS 编码约束.cursor/rules/typescript-patterns.md是 ECC 面向 Cursor 客户端提供的规则Rules文件。规则文件的头部 frontmatter 决定了 Cursor 在何时加载它--- description: TypeScript patterns extending common rules globs: [**/*.ts, **/*.tsx, **/*.js, **/*.jsx] alwaysApply: false ---三个元数据字段的含义description规则的简短说明供 Cursor 在规则列表与上下文匹配时参考globs文件匹配模式。只有当会话涉及**/*.ts、**/*.tsx、**/*.js、**/*.jsx中的文件时该规则才会被注入上下文。这是典型的按需加载设计避免在所有对话中消耗 tokenalwaysApply: false明确声明该规则不是全局常驻规则必须由 glob 命中后触发。与之对应ECC 在 Cursor 目录下为每种语言维护了同构的 5 个文件以 TypeScript 为例见 .cursor/rules/ 目录typescript-coding-style.md、typescript-patterns.md、typescript-hooks.md、typescript-security.md、typescript-testing.md全部采用相同的 glob 作用域策略。文件正文的开头声明This file extends the common patterns rule with TypeScript/JavaScript specific content.即该文件是通用模式规则 语言特化扩展结构中的一层。对应的通用层在仓库根目录的 rules/common/patterns.md 中语言特化层则同时存在两份镜像文件frontmatter 格式服务的客户端.cursor/rules/typescript-patterns.mdglobsalwaysApplyCursorrules/typescript/patterns.mdpathsClaude Code / AGENTS 风格的规则加载器两份文件正文内容完全一致三个模式、三段代码差异仅在 frontmatter 的键名——Cursor 使用globs/alwaysApply而 Claude 侧使用paths。这说明 ECC 的规则体系是内容一份、方言多份同一套模式约束被翻译成不同 AI 客户端的规则语法后分别投放。模式一统一 API 响应格式ApiResponseT原文档给出的核心类型定义interface ApiResponseT { success: boolean data?: T error?: string meta?: { total: number page: number limit: number } }这是一个泛型响应信封envelope所有 API 端点共用同一结构。逐字段拆解success: boolean必填成功/失败指示位。客户端先判断它再决定走data还是error分支无需依赖 HTTP 状态码做业务级判断data?: T可选业务负载。错误路径下可以为null/缺省泛型参数T让每个端点拥有独立的负载类型推断error?: string可选错误信息。成功路径下缺省。字符串形式意味着面向客户端的友好文案而非原始堆栈meta?可选分页元信息三元组——total总条数、page当前页码、limit每页条数。只有列表类接口需要携带因此整体标记为可选。这套约定与 ECC 通用层规则严格对齐。rules/common/patterns.md 中 API Response Format 一节给出四条设计原则TypeScript 版本正是其落地包含成功/状态指示符对应success数据负载在错误时可空对应data?错误信息字段在成功时可空对应error?分页响应携带total、page、limit元数据对应meta。从仓库的其他规则文件看同一信封概念在 Java、Rust、C# 的 patterns 规则如 rules/java/patterns.md、rules/rust/patterns.md、rules/csharp/patterns.md中都有对应表述说明ApiResponse是 ECC 跨语言 API 设计规范的公共底座。更完整的 REST 设计规范资源命名、状态码、分页、版本化则可参见 skills/api-design/SKILL.md该技能定义了200/201/204状态码语义、/api/v1/resources的 URL 结构与分页查询参数约定与meta字段的page/limit直接呼应。实战写法实现端在控制器/路由层统一包装返回值例如列表端点export function listUsers(page: number, limit: number) { return { success: true, data: users, meta: { total, page, limit } } }失败路径则返回{ success: false, error: Detailed user-friendly message }——这里的错误文案风格与同目录的 typescript-coding-style.md 中 Error Handling 一节的要求throw new Error(Detailed user-friendly message)保持一致。模式二自定义 Hooks 模式useDebounce 示例原文档给出的通用 Hook 实现export function useDebounceT(value: T, delay: number): T { const [debouncedValue, setDebouncedValue] useStateT(value) useEffect(() { const handler setTimeout(() setDebouncedValue(value), delay) return () clearTimeout(handler) }, [value, delay]) return debouncedValue }这是 React 函数组件中把一段可复用的有状态逻辑从组件中抽出的标准范式。要点逐条说明泛型签名useDebounceT(value: T, delay: number): T返回值类型与入参value一致保证useDebounce(input, 300)后仍能得到与原输入相同类型的值类型信息无损useStateT(value)初始化防抖值初始等于原值避免首帧空值useEffect内的定时器 清理函数每次value或delay变化都会先执行上次 effect 的清理clearTimeout再启动新的setTimeout。这保证了快速连续输入时只有最后一次值会在delay毫秒后生效——这正是防抖语义的实现核心依赖数组[value, delay]只跟踪这两个输入setDebouncedValue由 React 保证稳定无需列入。使用方式以搜索框输入为例const query useDebounce(rawInput, 300) useEffect(() { if (query) search(query) }, [query])同一模式在仓库中被反复引用和扩展skills/frontend-patterns/SKILL.md、skills/react-patterns/SKILL.md、rules/react/hooks.md 等文件均包含useDebounce相关约定。可以推断.cursor/rules/typescript-patterns.md中的这一节是前端模式技能包在 Cursor 规则侧的最小化投影——只保留一个足够典型、类型标注完整的范例供 AI 助手在生成新 Hook 时模仿其结构泛型参数、state effect 组合、清理函数、依赖数组。模式三Repository 数据访问模式原文档给出的接口定义interface RepositoryT { findAll(filters?: Filters): PromiseT[] findById(id: string): PromiseT | null create(data: CreateDto): PromiseT update(id: string, data: UpdateDto): PromiseT delete(id: string): Promisevoid }这是一组以实体类型T为泛型参数的标准 CRUD 契约。各方法的返回类型设计值得注意findAll(filters?)过滤条件可选省略时返回全量始终返回数组而非nullfindById返回PromiseT | null显式把查不到建模进类型调用方必须处理null分支而不是依赖抛异常create/update返回创建/更新后的实体PromiseT调用方无需二次查询即可拿到最新状态update(id, data: UpdateDto)与create(data: CreateDto)使用不同的 DTO从参数命名看创建与更新走两套载荷定义避免更新接口误收创建字段这类契约错误delete返回Promisevoid删除成功即确认无需返回负载。通用层 rules/common/patterns.md 对该模式的定位是Encapsulate data access behind a consistent interface并给出四条原则定义标准操作集findAll、findById、create、update、delete——与上面的接口签名一一对应具体实现处理存储细节数据库、API、文件等业务逻辑只依赖抽象接口不依赖存储机制便于替换数据源并简化测试中的 mock 构造。第 4 条是 Repository 模式在 AI 辅助开发中的关键收益当业务函数依赖的是RepositoryT接口而非具体 ORM 时测试中注入内存实现或 stub 即可不需要真实数据库。例如一个依赖接口的服务函数可以写成export async function getUserName(repo: RepositoryUser, id: string) { const user await repo.findById(id) if (!user) throw new Error(User not found) return user.name }测试只需提供一个findById返回预设对象的假实现无需触碰真实存储——这正是接口PromiseT | null返回类型让未找到分支可测试的原因。三层扩展关系与规则体系中的位置把这份规则放回 ECC 整体结构中可以看到清晰的通用 → 语言 → 客户端三层投放关系通用层rules/common/patterns.md 定义 Repository 模式与 API 响应信封的语言无关原则同时包含 Skeleton Projects 等通用工程策略语言层rules/typescript/patterns.md 将上述原则翻译为 TypeScript 代码形态ApiResponseT、useDebounce、RepositoryTfrontmatter 使用paths键匹配**/*.{ts,tsx,js,jsx}客户端层.cursor/rules/typescript-patterns.md 内容与语言层逐字一致frontmatter 换成 Cursor 的globsalwaysApply方言。配套的部署脚手架位于 scaffolds/cursor/ 目录含hooks.json与ecc-agent-data.json。其中 scaffolds/cursor/ecc-agent-data.json 声明agentDataHome: ~/.cursor/ecc并说明 ECC agent data root for this project when using Cursor. Memory hooks read session summaries and learned skills from here instead of ~/.claude.——即规则文件负责约束代码生成而 Cursor 侧的 hooks 与记忆数据则路由到独立的~/.cursor/ecc目录二者分工明确。此外.cursor/rules/目录中的typescript-coding-style.md与本文件互补coding-style 管怎么写不可变更新用 spread、async/awaittry-catch、Zod 校验、禁用console.logpatterns 管怎么组织响应信封、Hook、Repository。两者共享同一 glob 作用域会在处理 TS/JS 文件时同时生效。如何在自己的项目中复用由于该规则文件是自包含的 Markdown无外部依赖在任意 Cursor 项目中复用只需在仓库根目录创建.cursor/rules/目录放入本文件或改写 frontmatter 中的globs以匹配项目实际使用的文件扩展名确保alwaysApply: false保持按需加载若希望所有对话都遵守这三个模式可改为true但会持续占用上下文。三个模式之间也存在协作关系控制器按ApiResponseT返回数据、业务层通过RepositoryT取数、前端用useDebounce控制请求频率恰好构成一个完整的前后端数据流闭环。这份规则文件的价值不在于三段代码本身而在于它展示了 ECC 的通用做法——用一小段类型完整、可直接复制的类型定义或实现作为 AI 助手的模式模板配合 glob 作用域实现低 token 成本的按需约束注入。【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考