该技能为 Expo 应用提供一套统一的命名方案,核心目标是让每个名称可预测、每个事物可检索:代理和评审者能通过 grep 和路径找到代码,名称本身充当搜索索引。技能包含规则说明、仓库自有的命名契约以及两个零依赖检查器,用来验证仓库是否遵守这些规则。
用途:适用于为 Expo/React Native 项目新增或重命名文件、文件夹、路由文件、导出、Hook、组件、类型、testID、消息键、环境变量、应用 ID、npm 脚本等场景,也可在命名 lint 报错时按规范修正。
主要能力:规则覆盖范围较广。文件和文件夹使用 kebab-case;路由文件遵循 Expo Router 语法,src/app/ 中使用 kebab-case URL 段、(group) 文件夹、[camelCaseParam]、[...rest]、_layout、index、+not-found。主导出的名称与文件名对应,例如 task-row.tsx 导出 TaskRow,use-tasks-model.ts 导出 useTasksModel,路由文件默认导出 <Name>Route,layout.tsx 默认导出 <Name>Layout。禁止 utils.ts、helpers.ts、common.ts 等杂项文件和 barrel index 文件。每个 .ts/.tsx/.js/.mjs/.cjs 文件第 1 行写明其路径。按种类确定大小写:值与函数用 camelCase,组件与类型用 PascalCase,模块级固定数据用 UPPER_CASE,缩写按单词处理。布尔变量和参数以 is、has、can、should、did、will、was 开头。类型一律用 type,不用 interface 或 enum,闭合集合用 as const 数组加派生联合类型。React 相关命名遵循 handleX、onX、useX 等约定。kind 与 type 值使用 kebab-case,并按命令用祈使式、事件用过去式等语法命名。testID 形如 <screen>.<element>[.<key>],Maestro 流程只按 id 选择。消息键为语义化字面量并带类型化占位符。外部 id 使用反向 DNS 形式,环境变量用 UPPER_SNAKE_CASE,应用代码只读取 EXPO_PUBLIC* 与 Expo 自带变量。已发布 id 记录在契约中不得静默重命名。
使用方式:先决定要创建的命名种类,查阅对应参考章节。首次在仓库中使用时,将 templates/contracts/naming.json 复制为 contracts/naming.json,填入 locales、keyAreas、canonical 名称和 storeProductIds;产品 id 在两商店永久有效,新增前需询问开发者。闭合值集合可复制 templates/string-union.ts 及其测试。可参考 examples/ 中的组件、路由、reducer、类型和 Maestro 流程示例。重命名时在同一次提交中修改文件、路径头、主导出和所有导入;存储中的名称变更需要迁移;路由文件重命名会改变 URL,需保留深链重定向。校验时运行 npx eslint . --max-warnings 0、node ${CLAUDE_SKILL_DIR}/scripts/check-file-names.mjs . 和 node ${CLAUDE_SKILL_DIR}/scripts/check-code-names.mjs .,直到两个脚本输出 RESULT: PASS。
适用场景:Expo/React Native 项目的命名规范化、代码评审、lint 修复、CI 校验,以及需要代理按名称检索代码的仓库。
限制:主要针对 Expo 应用与 Maestro E2E 流程,规则细节以技能内参考文档为准;已发布的 bundle id、package、slug 或产品 id 不应重命名。具体脚本输出与示例需以仓库内文件为准,资料未提供更多实现细节。