--- name: oil-frontend description: 用于实现、修改、重构或评审产品前端。当前任务涉及页面、组件、交互、表单、状态、数据流、Hook、类型、CSS、前端代码组织或共享实现时自动触发。触发后先阅读 SKILL.md 判断相关范围,只读取与当前任务直接相关的参考文件;如果改动与产品前端无关则停止使用。纯构建、部署、依赖升级、安全、后端任务,以及只解释前端概念而不处理项目实现的请求,不触发。 --- # Oil Frontend 先识别用户任务、业务对象和数据来源,再删除无效内容,建立正确的信息、状态、代码归属和共享实现。 ## 始终遵守 - 从真实用户任务、业务对象和完成结果出发;可见内容只保留能够帮助识别、比较、判断、操作或理解结果的信息。 - 一个用户意图只执行一次,动作必须产生真实结果;数据、操作、忙碌和提交边界保持一致,失败时保留当前对象、位置和已输入内容。 - 常见任务沿用用户已有认知;资源浏览默认展示,编辑必须明确触发,表单只收集当前任务必需且归当前对象所有的数据。 - 图标、强调方式和固定尺寸都必须表达稳定含义;不使用通用 AI 装饰、无意义强调边或只适配当前实例的尺寸制造层级。 - 同一业务数据和同一含义只保留一个权威来源;优先修复数据流、父布局和共享实现,不在页面使用位置反复打补丁。 - 按业务归属组织组件、Hook、函数、类型、样式和测试;单模块代码就近放置,只有稳定跨模块复用时才进入共享层。 - 遇到复杂逻辑,先检查项目已有能力和成熟库;已有依赖不合适时,可以引入维护良好、与项目兼容的新库,不手写已有成熟方案覆盖的核心能力。简单逻辑直接实现,不为少量代码引入新依赖。 - 项目历史不是正确性的证明;错误模式应被替换,相关使用位置完成迁移后删除旧代码、fallback、legacy 逻辑和失效状态。 ## 参考文件读取顺序 1. 触发后先只阅读本文件,明确任务、对象和改动范围,不预先读取参考文件。 2. 如果任务不涉及用户可见界面、前端状态与数据流、组件实现或前端代码组织,停止使用本 Skill。 3. 简单局部改动默认只读取一个主要规则;只有任务还需要另一个独立判断时,才读取第二个规则。 4. 不因关键词出现、文件内链接或“保险起见”继续读取规则。一个任务看似命中多行时,先选择真正负责当前决定的那一行。 | 当前任务 | 主要规则 | 仅在这些情况补充 | | --- | --- | --- | | 模块边界、组件、Hook、函数、类型、CSS 或共享实现 | [组件与代码组织](references/component-contract.md) | 需要新增检查时读 [自动化](references/automation-contract.md) | | 新增或改变文案、动作含义、图标、点击反馈或视觉强调 | [信息与动作](references/information-and-action-contract.md) | 涉及对象身份、图片或选择器时读 [资源识别](references/resource-recognition-contract.md) | | 列表、卡片、详情、表格或批量操作 | [集合与详情](references/collection-and-detail-contract.md) | 涉及资源身份时读 [资源识别](references/resource-recognition-contract.md);涉及编辑时读 [交互与编辑](references/interaction-and-editing-contract.md) | | 表单、选择、编辑或多步工作流 | [交互与编辑](references/interaction-and-editing-contract.md) | 涉及保存范围和流程连续性时读 [数据与操作范围](references/scope-and-state-integrity-contract.md) | | 查询、请求、保存、数据范围或异步状态 | [数据与操作范围](references/scope-and-state-integrity-contract.md)、[状态与加载](references/state-and-loading-contract.md) | 涉及共享数据源或 Hook 时读 [组件与代码组织](references/component-contract.md) | | 改变页面尺寸、分栏、滚动、弹窗结构或响应式行为 | [视口与弹窗](references/viewport-and-dialog-contract.md) | 涉及下拉、菜单、提示等依附触发器的浮层时读 [弹层](references/overlay-contract.md) | 以下情况不触发额外读取: - 只移动现有控件,且不改变文案、动作含义或反馈时,不读取信息与动作规则。 - 只调整普通父子容器归属,且不改变尺寸、滚动、弹窗或响应式行为时,不读取视口与弹窗规则。 - 参考文件中的链接只说明相关规则的位置,不表示必须继续读取。 ## 术语速查 本文件和参考规则中的核心词汇,按这里的定义理解: - **资源身份**:让用户认出"这是哪个对象"的最小信息组合——图片 + 名称 + 一个区分字段。例:成员列表显示"头像 + 姓名 + 部门",而不是"uuid + 类型标签"。 - **伪操作**:看似可用、实际不产生真实结果的控件。例:点"保存"只改了本地 state、刷新即丢失;删除按钮永久 disabled 占位。 - **单个组件的视觉补丁**:在页面使用共享组件的位置,只给这一个组件补样式。例:``、`!important` 覆盖、页面专属选择器改组件内部。正确做法是修共享组件本身,或新增按用途命名的组件变体。 - **按用途命名的组件变体(variant)**:用“为什么不同”命名。例:`variant="destructive"`、`size="compact"` 合格;`variant="blue"`、`variant="userListPage"` 不合格。 - **主导动作**:当前页面、弹窗或操作区域中完成主要任务的那一个操作。同一区域最多一个高强调按钮。 - **提交边界**:一次修改何时真正生效——即时生效、自动保存、显式统一提交,或仅临时预览。 - **忙碌范围**:请求进行中需要防止重复操作的最小区域。单项请求只锁定该项,不用全页遮罩。 - **已提交查询快照**:由同一次响应共同确定的查询条件、列表、结果总数和分页信息。新查询完成前,旧快照仍属于旧条件。 - **同类批量任务**:对一批同类对象重复填写相同字段的任务,如批量排期、批量改价。 - **可编辑工作表**:为同类批量任务让多行持续处于编辑态的表格。与之相对的是资源列表:默认展示,编辑必须明确触发。 ## 决策顺序 改动前依次回答。 任务与对象: 1. 用户当前要完成什么任务,什么结果表示完成? 2. 页面管理哪个核心对象,字段分别归谁所有? 3. 当前是浏览、比较、选择还是编辑,是否沿用用户熟悉的结构和术语? 数据与范围: 4. 数据来自完整集合、当前可见集合还是搜索结果? 5. 操作、忙碌状态和提交边界分别影响什么范围;远程查询条件与当前列表是否已经属于同一次已提交结果? 6. 用户靠哪些信息区分相邻对象? 7. 能否删除文字、步骤、确认、重复输入或系统已经知道的字段? 8. 哪些信息属于集合,哪些只属于详情? 结构与状态: 9. 当前页面、弹窗或操作区域的主导动作是什么? 10. 首屏、滚动容器和弹层边界分别由谁负责? 11. loading、empty、filtered-empty、queued、processing、error、ready 如何互斥? 落点: 12. 是否已有正确归属的模块、组件、Hook、函数、类型、统一设计变量或样式,最终应修改哪个数据源、父布局或共享实现? 无法明确回答时,先停止添加界面元素:向用户提出最关键的 1–2 个问题;无法提问时按最小可验证范围实施,并在输出中声明所做的假设。 ## 执行流程 ### 1. 还原事实 - 搜索项目已有的模块、组件、Hook、函数、类型、统一设计变量和样式,确认相同含义是否已经存在正确实现。 - 找出所有使用共享组件的页面和组件,以及相同数据的其他入口。 - 评审请求只给证据与建议;用户要求修改时才实施。 ### 2. 明确范围 - 明确核心对象、字段所有者、数据集合、操作范围、忙碌范围和提交边界。 - 区分页面结构问题、组件默认行为、页面使用方式错误和数据流错误。 ### 3. 先删除 - 删除不影响判断的内容、重复状态、重复入口、重复确认和只针对单个组件的视觉补丁。 - 删除没有真实状态变化或不能真正保存数据的伪操作。 - 删除已经被新实现替代的旧组件、旧函数、旧类型、旧状态、fallback、legacy 逻辑、旧样式和失效引用。 ### 4. 选择结构 - 先检查项目中同类任务页面和共享容器组件的既定用法;只有既有模式符合本规范时才沿用,否则按真实任务重新选择结构。 - 根据浏览、比较、选择、批量配置或深度编辑任务,选择列表、表格、工作表、选择器、弹窗或完整工作区。 - 让列表负责识别和比较,让详情负责完整内容,让编辑器负责修改。 ### 5. 修复真正出错的位置 - 优先修复数据范围、操作范围、父布局、共享组件默认行为和含义稳定的组件变体。 - 重复出现的资源身份、菜单、弹层、加载、弹窗和操作栏使用共享组件。 - 只有职责、输入输出和行为稳定重复时才抽象;不要因为局部结构相似就复制组件,也不要用大量页面开关制造万能组件。 - 既有共享组件、函数、样式或数据流本身错误时,在授权范围内直接修复或替换真正出错的共享实现,并处理所有受影响的使用位置;不要为了兼容历史继续新增错误实现。 - 无法在当前范围内全部改完时,停止扩大旧模式,明确报告还剩哪些旧使用位置以及这次改到哪里,不得声称已经统一。 - 修复可重复检测的问题时,同步补齐或优化项目内的 lint、测试或检查规则(见 [automation-contract.md](references/automation-contract.md));小改动不为此前置搭建自动化。 - 不修改无关区域。 ### 6. 验证 - 运行项目现有且与改动相关的类型检查、Lint、测试或构建。 - 简单局部改动只检查修改位置、直接行为和最近的使用位置,不展开完整状态矩阵。 - 改动涉及共享组件、数据范围、异步状态、表单流程、滚动、响应式或多个页面时,再检查受影响的状态、数据范围、代表性视口和全部使用位置。 - 只报告已验证项、未验证项和阻断原因。 ## 独立自检 仅当前端评审涉及多个页面、所有使用共享组件的位置、多种视口或状态,或大范围规则调整时,才派发无历史上下文的独立自检。单页面、单组件、单截图和局部差异由主 Agent 直接检查。 独立自检只接收检查对象、范围和 `oil-frontend`,不接收对话历史、既有结论、问题猜测、预期答案或修复方案。 ## 输出要求 先给结论,再给证据。只输出: 1. 具体问题; 2. 应删除的内容; 3. 正确的信息、动作和空间结构; 4. 应修改的模块、共享组件或数据流; 5. 已验证和未验证项。 禁止使用"提升体验""更现代""更直观"等不能指导实现的描述。 除非用户明确要求,或问题直接阻断可见的主要流程,否则不主动输出键盘操作或无障碍检查清单。