SuperAPI AI 工具集

screen-contracts

编程与开发

查看项目

更新于 10-18 18:02

技能介绍

用途

screen-contracts 是一个面向 Expo 应用的开发技能,核心做法是“契约先行”:每个屏幕、对话框和浮层都由仓库内的 contracts/screens.json 定义,包含其路由、模型钩子、视图与测试文件的位置,每个状态(包括设计稿未绘制的状态),以及每个元素的 testID、角色、组件和文案键。代码、视图测试、E2E 流程与截图检查均使用同一套 id,在 iOS 和 Android 上一致。

主要能力与规则

  • 契约覆盖:每个路由文件必须有对应条目,新增屏幕、状态或 testID 必须先作为独立的契约变更提交,再改代码。
  • testID 严格一致:不缺失、不臆造、不跨屏复用;重复项使用数据键(如 lists.list-row.${list.id}),不得使用索引;部件从父 id 派生。
  • 文案:所有文本通过 t() 和契约中的文案键获取,键必须存在于源语言目录,废弃键必须移除;模型钩子负责翻译,视图不调用 t()、不渲染 <T>。
  • 状态:构建契约列出的全部状态,包括设计未绘制的状态(以 drawn: false 加 why 标注,如空态、错误、离线、付费用户),并由纯函数、可测试地决定显示哪个状态。
  • 结构:屏幕由薄路由、纯视图和单一模型钩子(含测试)组成;路由调用 use<Feature>Model() 并渲染视图,钩子独占对 store、仓库、服务与导航的访问。
  • 视图测试:每个状态一个测试块,按状态命名,测试 testID 与处理函数,并在每个渲染块末尾执行可访问性审计:expect(findInaccessiblePressables(screen.container)).toStrictEqual([])。
  • 对话框与浮层:使用 React Native 的 Modal(或库的 Scrim)并提供真实的 onRequestClose,或采用 Expo Router 模态路由,保证 VoiceOver 与 TalkBack 不穿透、Android 返回键可关闭。
  • 每屏一个主操作;广告位仅出现在策略允许的屏幕,且不对付费用户展示。
  • testID 放在可访问元素上;卡片不得是可点击面板内嵌按钮,按钮与可点击面应为兄弟节点。
  • 状态隐藏的功能直接不渲染,而非置灰禁用。
  • 截图状态通过所属模型的真实处理函数打开,动效用 reduce-motion 钩子静止,视图或模型中不得有仅截图分支。
  • 未构建的屏幕不进入路由,也不得用空处理函数或占位 Provider 顶替。

使用方式

  1. 在仓库根目录运行 node ${CLAUDE_SKILL_DIR}/scripts/check-screens.mjs ..,输出 NOT APPLICABLE 表示尚未建立契约,否则逐条处理 FAIL。
  2. 契约先行:无契约时复制 templates/contracts/screens.json 与 screens.schema.json 到 contracts/,保留应用需要的策略,描述每个现有屏幕;为当前屏幕补充或修改条目;用 node ${CLAUDE_SKILL_DIR}/scripts/list-screen.mjs . --screen <id> 打印契约。
  3. 测试先行:复制并调整视图测试、模型钩子测试和状态函数测试模板,确认其失败。
  4. 构建:参考 references/screen-building.md(对话类参考 references/overlays-and-dialogs.md),从 templates/ 复制所需文件,以 Lists 特性为范本改名并保持结构。
  5. 门禁:npm run typecheck、npx eslint . --max-warnings 0、npx jest src/features/<feature> --ci --maxWorkers=2。
  6. 校验:node ${CLAUDE_SKILL_DIR}/scripts/check-screens.mjs . --screen <id>,修复每个 FAIL 直到 RESULT: PASS;屏幕工作结束时用 --all 运行。
  7. 比对与报告:在 iOS 模拟器与 Android 模拟器上,以浅色、深色及应用的 RTL 语言打开参考图与运行中的屏幕,再交给 design-visual-parity 做测量比对;报告通过的屏幕、新增的 Chosen 状态及原因和待决问题。

完成标准(摘要)

屏幕、其对话框与浮层、每个路由文件均有契约条目并通过模式校验;每个契约状态都有布局和同名测试块,由纯函数选定;视图只设置契约 testID、只显示来自模型的翻译文本、不读取 store、服务或导航;视图位于 ScreenFrame 中并按周边设置边缘;路由调用模型钩子,钩子有覆盖各状态、处理函数和失败的测试;每个渲染块以 findInaccessiblePressables 审计结束;浮层在 Modal 中渲染且 Android 返回可关闭;typecheck、eslint 和该屏幕 Jest 测试通过;在 iOS 与 Android 的浅色、深色、RTL 下完成与参考的比对并交给 design-visual-parity;list-screen.mjs --all 与 check-screens.mjs --all 均输出 RESULT: PASS。唯一允许的 SKIP 为应用尚无目录时的 SKIP src/i18n/catalogs/en.json [unknown-copy-key] not yet created。

适用场景

新建或修改 Expo 屏幕、对话框、浮层;需要统一可访问性、文案键、测试覆盖和多平台一致性;已有 React Native 项目希望以契约驱动屏幕开发与验证。

限制

该技能面向 Expo/React Native 项目,并依赖主题、AppText、PressableSurface、测试渲染辅助、可访问性审计工具、i18n 目录与数据层等前置设施;技能本身不提供收费、价格或平台支持范围信息。