Repository navigation
Expand file tree
/
Copy pathprompts.jsonl
More file actions
76 lines (76 loc) · 40.8 KB
/
Copy pathprompts.jsonl
File metadata and controls
76 lines (76 loc) · 40.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
{"prompt": "现在我们处理$$$KEY$$$,最终目的是使check2.md中的check list通过。我会每次告诉你进行什么审查。如果不符合check要求,你应该修改内容来使其成功通过, 如果提到的项在check文档中已经勾选,可以跳过直接等我下一个指令。\n# 单组件 Check List(Hyper-Structure 完整版)\n> 术语统一:`status-primitives` 指状态原语层(当前 crate 名为 `ui-state-primitives`)。\n\n### 0. 适用范围与顺序纪律\n本清单仅评估“一个组件”的改动结果,不替代仓库级治理。\n不适用的条目必须明确标注 `N/A` 并说明理由,禁止机械打勾。\n组件目标、非目标、风险边界已写清楚;发现跨组件/跨层系统性问题时升级为仓库级任务。\n\n### 1. 架构边界与分层约束(Kernel/Shell 总线)\n- [ ] `status-primitives` 定义:纯状态原语层(受控/非受控、toggle、selection、list、overlay open state、expansion 等)。不依赖 Leptos/DOM/web-sys;只包含 Rust 数据结构和方法,不含视图与事件绑定。\n - 所有状态原语必须从 `status-primitives`(`ui-state-primitives`)获取,组件层只能消费,不得自造。\n - 下沉判定依据是“稳定状态不变量”;凡属于状态机、归一化、状态派生能力,默认先进入 `ui-state-primitives`。\n - 组件中可保留的仅是装配逻辑:props 归一、样式来源标记、slot 组织、对 `ui-state-primitives` 输出的映射。\n - 组件内若出现状态原语实现(受控/非受控状态机、single/multiple 展开规则、索引归一化、跨事件状态派生),该项直接判不通过。\n - 处理方式固定:先下沉到 `ui-state-primitives/src/<capability>.rs`(如 `expansion.rs`),在 `ui-state-primitives/src/lib.rs` 导出,再回到组件改调用。\n - 下沉后的原语必须有 `ui-state-primitives` 单元测试;组件侧只保留调用与语义挂载测试。\n - 桥接规范:`ui-state-primitives` 结构体必须是 POJO(Plain Old Rust Object),不持有 Leptos `Signal` 或框架绑定状态容器。\n - 消费规范:`ui-headless` 或组件 `logic.rs` 负责解包 `Signal` 当前值传入 primitive 方法,并将结果显式写回 `Signal`。\n - 设计理由:保持 primitives 纯粹可测、可迁移,不与特定响应式库绑定(便于未来替换响应式实现与做纯 Rust 测试)。"}
{"prompt": "- [ ] `ui-headless` 定义:交互与 A11y 原语层(press/focus/hover/roving/listbox/menu/tooltip 等),把输入设备事件与状态语义标准化为可复用契约;输出必须是类型化 `attrs + handlers + state`。不做样式、不写组件 CSS、不做组件级动效编排。\n **`ui-headless` 落位硬规则(必须执行)**:\n - 输入边界:消费 `status-primitives` 状态 + 用户输入事件(keyboard/pointer/focus)+ 环境能力(web/ssr)。\n - 输出边界:只输出语义契约(attrs/handlers/state);组件层只负责挂载与组合,不得把语义判断塞回 `view.rs`。\n - 下沉判定依据是“交互/A11y 语义契约”;凡属于键盘/焦点/指针归一、ARIA 映射、交互状态语义能力,默认先进入 `ui-headless`。\n - 必须下沉:键盘模型、焦点模型、跨设备输入归一、ARIA 状态映射、overlay/presence 等交互语义。\n - A11y 契约与共享工具落点固定在 `crates/ui-headless/src/a11y.rs`;组件只在 `view.rs` 挂载,不在组件层重写。\n - 语义契约必须提供 `lang` / `dir`(LTR/RTL)接入能力;headless 不硬编码用户可见文本,文案由 i18n/l10n 层提供。\n - 语义契约正确性必须有回归:`components/*/test/**` 断言语义标记,`e2e/tests/*` 覆盖关键交互流程。\n - 禁止放在 `ui-headless`:视觉 class 选择、CSS 规则、组件 slot 布局、组件专属动效编排、业务文案。\n - 允许留在组件层:纯视觉一次性交互且不形成可复用语义契约(例如单组件局部微交互)。"}
{"prompt": "- [ ] `ui-motion` 定义:动效能力与契约执行层(spring、keyframes、WAAPI/RAF backend),只负责时间函数、插值与运行时驱动,不承载组件业务语义与状态决策。\n - 放在 `crates/ui-motion`:通用动画数学与执行后端(spring solver、keyframe sampling、easing registry、driver adapters),以及 `wasm/non-wasm` 适配与 `reduced-motion` 执行策略。\n - 放在 `crates/ui/src/<component>/motion.rs`:把组件语义状态(open/closed、enter/exit、active/inactive)映射为 `ui-motion` contract,绑定目标节点并调用 attach。\n - 禁止放在 `crates/ui-motion`:组件 slot 结构、组件专属状态机、ARIA/keyboard 语义、业务文案与业务分支。\n - 禁止放在组件 `motion.rs`:自实现 spring/keyframe/driver 执行器;跨组件共享动效算法必须回迁 `ui-motion`。\n - 动效参数优先来自 token/theme;禁止在组件样式与逻辑中散落硬编码时长/曲线/位移常量。\n - 非 wasm 路径必须提供 no-op/stub,保证 SSR/tooling 可编译且行为可预测。"}
{"prompt": "- [ ] `ui-theme` 定义:唯一设计 token 与主题上下文层(system/color/scale + Light/Dark/OLED),负责 token 分类、主题映射与 CSS 变量生成。\n - Token 统一基线落点固定:`crates/ui-theme/src/tokens.rs` 定义,`crates/ui-theme/src/theme.rs` 映射,`crates/ui-theme/src/css.rs` 输出变量;组件只在 `crates/ui/src/<component>/styles.rs` 消费。\n - 三轴上下文(`system/color/scale`)在 `theme.rs` 定义;组件在 `logic.rs` 选择并在 `view.rs` 生效,`styles.rs` 只消费变量,不重建主题。\n - Token 分类必须可追溯:分类源在 `tokens.rs`,规范同步 `docs/spec/styling.md`;组件不得引入平行私有 token 命名体系。\n - 量化尺寸基准必须可回归:尺寸基准在 `tokens.rs` 与 `theme.rs` 定义,主题回归在 `crates/ui-theme/tests/token_scale_baseline.rs`,组件语义回归在 `components/*/test/*<component>_semantics.rs`。\n - 主题调色与语义色对比必须满足 `WCAG 2.1 AA` 基线,并覆盖 Light/Dark/OLED 主题变体。\n - 主题层只输出 `theme/tokens/base css` 与变量;不实现组件结构、交互逻辑、组件级动效编排。\n - 新增视觉语义先补 token,再由组件消费;禁止“组件临时值先落地、后补 token”的倒序流程。"}
{"prompt": "- [ ] `ui` 定义:最终 Leptos 组件装配层,组合 `status-primitives + ui-headless + ui-motion + ui-theme` 并暴露稳定公共 API。\n - `logic.rs` 负责 props 归一与状态派生;`view.rs` 负责结构渲染与 headless 语义挂载;`styles.rs` 负责 token-first 静态样式;`motion.rs` 负责动效 attach。\n - 组件层不得重写 `status-primitives` 状态机或 `ui-headless` 交互契约;发现即判不通过并回迁到对应层。\n - 对外 API 禁止暴露 `web-sys`/DOM 细节类型;平台差异封装在内部模块。\n - 还需要一个semantics.rs用于测试。可能存在类似rust-ui/components/accordion/test/accordion_semantics.rs的旧版实现,需要迁移到新目录。"}
{"prompt": "API 设计与状态内核(Logic/Kernel)\n- [ ] API 命名契约统一:公共 props/回调严格使用 `is_*`、`on_*`、`default_*` 前缀;同语义在全库同名,禁止别名漂移。\n - 布尔状态统一 `is_*`(如 `is_open`/`is_disabled`),事件统一 `on_*`,默认值统一 `default_*`。\n - 同一语义 across 组件必须同名(如都用 `on_open_change`,禁止同义别名并存)。\n - 公共 API 引入新命名时,需说明与现有命名体系的兼容策略与迁移路径。"}
{"prompt": "- [ ] 受控/非受控必须成对:每个可控状态轴都提供 `value + on_value_change + default_value`(如 `open/on_open_change/default_open`);缺一项即不通过。\n - 受控模式:外部值是单一事实来源,内部不得偷偷写回本地状态。\n - 非受控模式:仅由默认值初始化一次,后续状态由内部原语管理。\n - 受控/非受控切换语义需稳定可测,避免“半受控”隐式行为。"}
{"prompt": "- [ ] 默认值单一来源:默认值与优先级只在 `logic.rs` 归一化;`view.rs` 禁止二次兜底或隐式改写。\n - 默认值优先级必须可读且可测试(显式规则而非分散 `unwrap_or`)。\n - `view.rs` 不允许再做默认值分支;仅消费 `logic.rs` 的归一化输出。\n - 一旦发现多处默认值来源,直接判不通过并回收至 `logic.rs`。"}
{"prompt": "- [ ] 状态归一化集中:状态输入先类型化,再在 `logic.rs` 统一派生;禁止在 `view.rs`、事件回调、样式分支中分散拼状态机。\n - 输入边界统一进入 `logic.rs`,输出统一为可渲染语义状态与来源标记。\n - 事件处理器只触发状态变更,不重建状态机规则。\n - 样式层只消费状态标记,不承担状态判定职责。"}
{"prompt": "- [ ] 离散状态必须类型约束:`variant/size/mode/status` 等离散输入使用 `enum`;禁止用多个 `Option<bool>`/字符串自由组合表达互斥状态。\n - 互斥状态优先用 `enum` 建模,利用编译器封住无效组合。\n - 字符串输入若需兼容外部配置,必须先映射到类型化枚举再进入逻辑层。\n - 布尔爆炸(多个 bool 表达一个状态机)应在设计评审阶段直接拦截。"}
{"prompt": "- [ ] 状态原语来源正确:组件层只消费 `status-primitives`(当前 `ui-state-primitives`)能力,不直接绑定业务 store;应用级全局状态必须经桥接层适配后再接入组件。\n - 组件中出现可复用状态机实现(受控/非受控、展开规则、选择归一)即判应下沉。\n - 组件与业务全局状态之间必须有适配边界,禁止组件直接依赖业务 store 类型。\n - `logic.rs` 仅做装配与映射,不重新实现状态原语。"}
{"prompt": "- [ ] 如果无异步相关,直接打勾。异步交互语义统一:`is_loading`、error/retry、disabled、`aria-busy` 映射一致;优先复用统一 async action 原语(如 `use_async_action`),禁止每组件自定义一套加载/错误协议。\n - 无异步交互时需明确标注 N/A 理由(例如“组件无远程请求与异步状态”),不是机械打勾。\n - 有异步交互时,`is_loading`/disabled/`aria-busy`/retry 语义必须成套一致,且对键盘与读屏路径可用。\n - 异步失败态要有可恢复路径(重试或回退),并有语义测试覆盖。"}
{"prompt": "- [ ] API 易用性验收标准(DX Paradox):把复杂性留在内部,把简单留给用户。\n - 基础用法不得要求用户先理解或手动接线 `ui-state-primitives`/`ui-headless` 状态机。\n - 基础组件 Hello World 示例代码不得超过 5 行(导入与外层模板按仓库约定不计),并可直接运行。\n - 简单需求走简单 API,复杂需求再暴露高级入口:默认 props 覆盖高频场景,高级控制通过受控/扩展参数按需开启。\n - 禁止把内部状态对象作为基础必填参数暴露(例如强制 `state=...` 才能完成点击/展开等基本交互)。\n - docs-app 必须提供最小可用示例,优先展示一眼可懂的默认调用路径。"}
{"prompt": "- [ ] 组合型组件主 API 必须“显示优于约定”:优先使用显式组合 `<Parent><Item ... /></Parent>`。\n - 每个 item 的标题、语义与内容必须在同一 `Item` 结构维度绑定,避免索引配对式隐式约定。\n - `labels + children`、`titles + panels` 等并行数组/并行槽位写法不得作为默认或推荐 API。\n - 不引入这类语法糖:若为配置式输入,仅允许类型化 `ItemSpec`,并在内部映射为显式 `Item` 语义树。"}
{"prompt": "高级交互与物理机制(Shell/Physics)\n- [ ] 宏观/微观双状态机(Macro/Micro Duality):拖拽等高频交互在 `Dragging` 期间由 `view/motion` 本地循环执行;禁止每帧穿越回 `logic.rs`,必须在结束时通过 `Action::DragEnd` 回流收敛。"}
{"prompt": "- [ ] 几何两段式渲染(Two-Pass Rendering):`Tooltip/Popover/Menu` 等依赖 DOM 测量的组件必须走 `Intent -> Measure(view) -> Rectification(logic)`,并具备幂等收敛保护防死循环。\"}\n{\"prompts\": \"- [ ] 几何两段式渲染(Two-Pass Rendering):`Tooltip/Popover/Menu` 等依赖 DOM 测量的组件必须走 `Intent -> Measure(view) -> Rectification(logic)`,并具备幂等收敛保护防死循环。"}
{"prompt": "- [ ] 集合注册协议(Registration Protocol):`Accordion/Tabs/Menu` 动态子项必须通过 `RegistrationContext` 上报 `Register/Unregister`,逻辑层维护 `items_order`,禁止依赖 `HashSet` 迭代顺序做导航。\"}\n{\"prompts\": \"- [ ] 集合注册协议(Registration Protocol):`Accordion/Tabs/Menu` 动态子项必须通过 `RegistrationContext` 上报 `Register/Unregister`,逻辑层维护 `items_order`,禁止依赖 `HashSet` 迭代顺序做导航。"}
{"prompt": "- [ ] 插槽投影策略(Slot Projection):容器组件明确 `Lazy/KeepAlive/Eager`;`KeepAlive` 隐藏时必须通过生命周期通知(如 `NotifyHidden`)暂停轮询/动画等高耗能副作用。\"}\n{\"prompts\": \"- [ ] 插槽投影策略(Slot Projection):容器组件明确 `Lazy/KeepAlive/Eager`;`KeepAlive` 隐藏时必须通过生命周期通知(如 `NotifyHidden`)暂停轮询/动画等高耗能副作用。"}
{"prompt": "- [ ] 环境订阅流(Env Streams):`Resize/Theme/Intersection` 等环境变化在 `view.rs` 采样、防抖后转化为高层语义 `Action`(如 `BreakpointChanged`)推送到 `logic`;禁止原始事件洪泛。\"}\n{\"prompts\": \"- [ ] 环境订阅流(Env Streams):`Resize/Theme/Intersection` 等环境变化在 `view.rs` 采样、防抖后转化为高层语义 `Action`(如 `BreakpointChanged`)推送到 `logic`;禁止原始事件洪泛。"}
{"prompt": "- [ ] 事件光锥(Event Light Cone):`Table/Grid` 等大型集合批量操作必须走 `Context Bus + Selector` 与状态压缩表达(如 `SelectionState::All`),禁止 O(N) 级向下 prop drilling。\"}\n{\"prompts\": \"- [ ] 事件光锥(Event Light Cone):`Table/Grid` 等大型集合批量操作必须走 `Context Bus + Selector` 与状态压缩表达(如 `SelectionState::All`),禁止 O(N) 级向下 prop drilling。"}
{"prompt": "- [ ] 统一因果总线(Causality Bus):复杂派生总线操作必须支持透传 `TraceId`,确保“用户触发 -> 派生命令 -> 总线广播 -> 订阅者”因果链不断裂。\"}\n{\"prompts\": \"- [ ] 统一因果总线(Causality Bus):复杂派生总线操作必须支持透传 `TraceId`,确保“用户触发 -> 派生命令 -> 总线广播 -> 订阅者”因果链不断裂。"}
{"prompt": "- [ ] 存在 A11y 实现、国际化与本地化实现(至少具备接入点,不硬编码用户可见文本)。\n - 交互元素必须具备可验证语义:`role`/`aria-*`/键盘可达路径完整,且和 headless 契约一致。\n - 用户可见文本来源必须可覆盖:优先 props,其次应用注入(`UiRoot`/i18n bundle),最后组件兜底文案;禁止把业务可见文案硬编码在 `view.rs`。\n - 组件需透传或消费 `lang` / `dir`(LTR/RTL)上下文,不得假设单语言单方向。\n - 共享 A11y 工具优先来自 `crates/ui-headless/src/a11y.rs`,组件层不重复发明同名语义工具。"}
{"prompt": "- [ ] 状态可观测、可检索、可验证:使用稳定 `data-*` 与 `aria-*` 标记表达状态和来源。\n - 稳定语义标记必须覆盖关键状态轴(如 open/expanded/disabled/selected/focus-visible/loading)。\n - 状态来源必须可区分(受控/非受控、默认值/外部值、交互来源),通过稳定 marker 暴露而不是隐式推断。\n - 自动化选择器优先基于语义标记,不依赖 DOM 顺序、层级深度或临时 class 名。\n - 标记值应为封闭集合(可枚举),避免自由文本导致契约漂移。"}
{"prompt": "- [ ] 样式依赖显式状态(`data-*`/class),而非脆弱 DOM 结构猜测。\n - `styles.rs` 中状态分支选择器必须基于 `data-*`/`aria-*`/稳定 class,禁止用 `:nth-child`、深层级选择器猜测状态。\n - 运行时样式仅允许传递必要 CSS 变量(custom properties);禁止把业务样式逻辑塞进 inline style。\n - 视觉状态切换必须可由语义标记直接解释,不能依赖“某节点是否恰好存在”。"}
{"prompt": "- [ ] 测试验证“语义契约”而不只验证视觉快照。\n - 至少存在语义测试覆盖关键状态与交互路径(role/aria/data-state/source markers)。\n - 测试矩阵必须覆盖关键分支:受控/非受控、disabled、键盘路径、指针路径、SSR/wasm 差异(按适用范围)。\n - 视觉快照只能作为补充,不得替代语义契约断言。"}
{"prompt": "- [ ] 组件文件职责正确:`mod.rs`(导出边界)、`logic.rs`(归一/派生/来源标记)、`styles.rs`(静态 token-first CSS)、`view.rs`(Leptos 结构 + headless 挂载)、`motion.rs`(动效契约 + attach)。\n - `mod.rs` 只维护最小稳定导出面与 feature gate,不承载实现细节。\n - `logic.rs` 只做输入归一、状态派生、来源标记;禁止 DOM 操作和样式细节分支。\n - `styles.rs` 只包含 token-first 静态 CSS;禁止硬编码主题常量与业务语义文案。\n - `view.rs` 只做结构渲染与 headless 契约挂载;禁止隐藏关键状态决策。\n - `motion.rs` 只做组件语义到动效契约映射与 attach;禁止在组件内重写通用动效引擎。"}
{"prompt": "- [ ] `spec.rs` 只用于少数复杂组件(如 button),避免泛滥。\n - 仅当组件存在稳定外部规范/Schema 契约或复杂配置固化需求时才引入 `spec.rs`。\n - 简单组件不得为了“形式统一”新增 `spec.rs`;说明文档应留在 `check2.md`/组件文档。\n - 新增 `spec.rs` 必须同步给出契约测试与版本演进说明。"}
{"prompt": "- [ ] 组件层遵循 token-first 静态样式契约:样式通过 `styles.rs` 聚合注入;运行时仅传必要 CSS 变量;不把 Utility-First/CSS-in-Rust 当组件库默认范式。\n - 样式规则统一落在 `styles.rs`,由 `crates/ui/src/css.rs` 聚合并通过 `UiRoot` 注入。\n - 颜色/间距/圆角/阴影等视觉值必须来自 `var(--ui-*)`,禁止组件私有 token 体系。\n - Utility-First 仅作为 `apps/*` 应用层布局手段,不得反向污染组件库契约。\n - CSS-in-Rust 仅在有明确类型安全与构建成本净收益时作为例外采用。"}
{"prompt": "- [ ] 默认主题美学质量达标(Visual Desire):以 HeroUI 现代审美为学习对标,默认主题不仅“可用”,还必须“第一眼可信”。\n - 默认主题需通过基础美学清单:信息层级清晰(字重/字号/间距)、对比与层次自然、交互反馈明确(hover/active/focus)。\n - docs-app 必须提供默认主题基线页面与截图基线,关键组件(Button/Input/Overlay)纳入视觉回归对比。\n - 禁止“可访问但粗糙”的最低可用心态:视觉退化(类似旧式 Bootstrap 观感)视为质量回归。\n - HeroUI 对标以“视觉语言与体验质量”对齐为目标,不做无差别 API 表层复制。"}
{"prompt": "- [ ] Tree Shaking 是一等能力:package 模式支持组件级 feature;source 模式天然裁剪;样式层同步裁剪,禁止无条件聚合全部 CSS,禁止破坏 DCE/LTO 的全量中央注册表。\n - package 模式必须有组件级 feature(如 `component-accordion`);未启用组件不得进入编译与链接路径。\n - `lib.rs` 与 `css.rs` 必须按 feature 条件导出/聚合,禁止无条件引用所有组件模块和 CSS 常量。\n - source 模式下仅引入需要的组件源码,不通过中央注册表维持全组件可达。\n - 任意“全量组件映射表/注册表”若导致不可达代码变可达,直接判不通过。\n - 验证命令(特性树):`cargo tree -e features -p ui --no-default-features --features component-accordion,inject-css`,确认仅启用目标组件特性链。\n - 验证命令(反向依赖):`cargo tree -e features -i ui -p web-demo`,检查是否被 `all-components` 或隐式特性全量拉起。\n - CI 检查(最小特性编译):新增任务仅开启目标最小特性(示例:`cargo check -p ui --target wasm32-unknown-unknown --no-default-features --features component-accordion,inject-css`)。\n - CI 检查(体积预算):对“最小特性构建产物”设定预算并阻断回归(可用固定阈值,如 `< 50KB`,或基于仓库基线的相对阈值);不得只做编译通过而不做体积约束。"}
{"prompt": "- [ ] 类型系统 + 语义标记共同提供机器可读状态;关键输入空间受类型约束。\n - 离散输入与状态轴必须优先使用 `enum`/新类型建模,避免字符串协议与布尔爆炸。\n - 无效状态要么在类型层不可表达,要么在 `logic.rs` 被统一归一化并可测试。\n - 关键状态必须通过稳定语义标记对外可读,供测试与 Agent 自动化消费。\n - 编译器与测试反馈应能直接定位状态契约破坏点,形成可持续闭环。"}
{"prompt": "- [ ] 焦点全局栈(Focus Stack & GC):层叠 `Overlay` 禁止私存 `NodeRef` 作为恢复目标;必须依赖全局 Focus Manager(如 `FallbackTo/Selector`)防止焦点坠落到 `document.body`。\"}\n{\"prompts\": \"- [ ] 焦点全局栈(Focus Stack & GC):层叠 `Overlay` 禁止私存 `NodeRef` 作为恢复目标;必须依赖全局 Focus Manager(如 `FallbackTo/Selector`)防止焦点坠落到 `document.body`。"}
{"prompt": "- [ ] 受控外交特区(Escape Hatches):集成 ECharts/Map 等命令式第三方库时必须处于 `Foreign Zone`(`YieldControl/CleanupForeign`);第三方实例不得暴露为组件公共 API 或反向污染状态机。\"}\n{\"prompts\": \"- [ ] 受控外交特区(Escape Hatches):集成 ECharts/Map 等命令式第三方库时必须处于 `Foreign Zone`(`YieldControl/CleanupForeign`);第三方实例不得暴露为组件公共 API 或反向污染状态机。"}
{"prompt": "- [ ] SSR 时空断裂治理(Hydration Discontinuity):逻辑初始化禁止依赖 `now()` 或原生随机 UUID;必须通过 `IdProvider` 注入确定性种子,确保 SSR/Hydration 间 ID 稳定。\"}\n{\"prompts\": \"- [ ] SSR 时空断裂治理(Hydration Discontinuity):逻辑初始化禁止依赖 `now()` 或原生随机 UUID;必须通过 `IdProvider` 注入确定性种子,确保 SSR/Hydration 间 ID 稳定。"}
{"prompt": "- [ ] SSR 与跨平台检查:覆盖 web/ssr/wasm 分支,不破坏 non-wasm 编译路径。\n - 至少包含 compile-only 证据:web(wasm32)、ssr(native)、默认本地构建三条路径。\n - 平台分支差异必须显式 `cfg` 或 feature 管理,禁止依赖运行时偶然行为。\n - non-wasm 路径禁止引用 `web-sys`/浏览器对象。"}
{"prompt": "- [ ] `ui-headless` web/ssr feature 互斥受 `compile_error!` 保护(`crates/ui-headless/src/lib.rs`)。\n - 组件依赖 `ui-headless` 能力时,不得破坏其 web/ssr 互斥约束。\n - 组件若新增 headless 功能接入,需验证两条 feature 路径都可编译。\n - 发现“同时启用 web+ssr 仍可过编译”视为契约回归。"}
{"prompt": "- [ ] `ui-motion` 非 wasm 提供 no-op/stub(`crates/ui-motion/src/lib.rs`),保证 SSR/tooling 可编译。\n - `motion.rs` 调用必须可在 non-wasm 下安全降级,不触发 panic。\n - 组件不得假设动画句柄一定存在;no-op 分支行为需可预测。\n - toolchain 场景(测试/文档/静态分析)不得因 motion 依赖阻塞编译。"}
{"prompt": "- [ ] 组件实现覆盖 `reduced-motion` / SSR / wasm 分支。\n - `reduced-motion` 下动画应跳过或降级为最小必要反馈。\n - SSR 输出必须与客户端 hydration 兼容,避免首帧语义错位。\n - wasm 分支允许增强交互,但语义契约不得与 SSR 分支分裂。"}
{"prompt": "- [ ] 性能治理:关键路径有预算(首次渲染/更新耗时/内存),回归可检测、可归因、可阻断。\n - 关键交互组件需定义最小预算项(首渲染、关键更新、内存/分配趋势)。\n - 回归检测至少具备可重复基线与失败阈值,不靠主观“感觉变慢”。\n - 性能问题需可归因到状态、渲染、样式或动效路径之一。\n - 基础组件预算基线:`Button`、`Input` 在初始化后(无交互、无 props 变化)渲染次数预算为 `1`;出现额外渲染需给出合理解释或修复。\n - 测试要求:在 `components/*/test/**` 增加 `render_count` 类回归测试(测试框架支持时必须启用);至少覆盖基础组件与本次改动组件。\n - 若当前测试框架暂不支持精确渲染计数,需提供等价证据(可重复 profiling/trace 基线)并在后续任务中补齐自动化 `render_count` 测试。"}
{"prompt": "- [ ] `view!` 宏复杂度受控:单个 `view!` 块不得承载超长深嵌套结构;复杂布局按语义分块,避免一次性宏展开导致编译与 wasm 体积劣化。\n - 复杂结构按语义子块拆分(header/body/item 等),避免巨型单块 `view!`。\n - `view.rs` 中若出现多层嵌套重复片段,应优先提取局部渲染函数。\n - 编译时间/产物体积异常增长时,优先排查宏展开体量。"}
{"prompt": "- [ ] 函数式拆分优先:不涉及复杂状态与生命周期管理的 UI 片段,优先拆为普通 Rust 函数(返回 `impl IntoView`/`View`),而不是新增 `#[component]`。\n - 纯静态或轻逻辑片段优先函数化;仅在需要独立 props 语义时升级为组件。\n - 禁止把所有局部片段都升格为 `#[component]` 导致抽象噪音。\n - 拆分后语义标记与测试定位仍需稳定。"}
{"prompt": "- [ ] 静态片段常量化:复杂 SVG、页脚、长说明文本等纯静态内容优先常量化/模板化,减少重复 `view!` 渲染指令生成。\n - 可判定为纯静态的片段应避免重复动态构造。\n - 常量化后仍需维持可访问语义(title/aria-label/role 等)。\n - 静态资源变更路径要清晰,避免散落在多个 `view!` 片段中。"}
{"prompt": "- [ ] `inner_html` 使用约束:仅允许注入受信任静态常量,禁止拼接用户输入;使用处必须补充语义与安全回归测试。\n - 仅允许编译期常量或明确白名单内容进入 `inner_html`。\n - 严禁直接或间接注入用户输入、远端返回或未清洗模板字符串。\n - 使用 `inner_html` 的节点必须补语义测试与安全回归说明。"}
{"prompt": "- [ ] WASM 调试要求:关键状态可追踪(来源/时间/前后值),关键交互可回放,开发模式有可视化入口,调试能力通过 feature 隔离不污染产物。\n - 开发模式下至少能追踪关键状态变更来源与前后值。\n - 关键交互链路应支持最小可复现记录(事件顺序/状态转移)。\n - 调试开关默认不进入生产包体与公共 API。"}
{"prompt": "- [ ] DX 要求:样式热重载优先无需重编 wasm;组件热开发尽量保持上下文;提供可选状态保留;有 Workbench 隔离画布。\n - 常见样式调整应走快速反馈路径,不依赖完整 wasm 重编译。\n - 组件调试应尽量保持当前交互上下文,降低重复操作成本。\n - 复杂交互组件应有隔离演练入口(workbench/story/demo 之一)。"}
{"prompt": "- [ ] 工程能力统一:`serde` 负责 spec 序列化/版本迁移/错误结构化;`tracing` 统一 span/event 语义;async 不绑定单一运行时(tokio/async-std),runtime 细节不泄露到上层 API。\n - 若组件涉及 spec/config 输入,序列化与错误输出应走统一结构化路径。\n - 关键流程埋点语义应与全库 tracing 约定一致,避免组件各说各话。\n - 异步边界不得把具体 runtime 类型暴露到组件公共接口。"}
{"prompt": "- [ ] 样式孤岛防御(Defensive Variables):`styles.rs` 使用双层回退链 `var(--ui-*, var(--ui-fallback-*))`;禁止组件内硬编码 Hex 或裸尺寸终值,Fallback 终值由 `ui-theme` 统一输出(SSOT)。\"}\n{\"prompts\": \"- [ ] 样式孤岛防御(Defensive Variables):`styles.rs` 使用双层回退链 `var(--ui-*, var(--ui-fallback-*))`;禁止组件内硬编码 Hex 或裸尺寸终值,Fallback 终值由 `ui-theme` 统一输出(SSOT)。"}
{"prompt": "- [ ] 级联层覆盖(`@layer ui`):组件 CSS 默认聚合进 `@layer ui`;运行时数值调整仅通过 CSS Custom Properties(如 `style:--x=...`),禁止普通内联样式(如 `style=\\\"top: 10px\\\"`)。\"}\n{\"prompts\": \"- [ ] 级联层覆盖(`@layer ui`):组件 CSS 默认聚合进 `@layer ui`;运行时数值调整仅通过 CSS Custom Properties(如 `style:--x=...`),禁止普通内联样式(如 `style=\\\"top: 10px\\\"`)。"}
{"prompt": "- [ ] Motion 合同化:`stiffness`/`damping` 等参数在 `motion.rs` 内置为组件 Contract,并通过 `attach_motion` 挂载;必须尊重 `prefers-reduced-motion` 且在 non-wasm/SSR 安全降级(no-op)。\"}\n{\"prompts\": \"- [ ] Motion 合同化:`stiffness`/`damping` 等参数在 `motion.rs` 内置为组件 Contract,并通过 `attach_motion` 挂载;必须尊重 `prefers-reduced-motion` 且在 non-wasm/SSR 安全降级(no-op)。"}
{"prompt": "- [ ] `ui` 固定入口文件落点正确。\n - `crates/ui/src/lib.rs`:总模块入口 + 对外 `pub use`(公共 API 面);组件模块受 `component-*` feature gate 约束;不暴露内部平台细节类型。\n - `crates/ui/src/css.rs`:组件 CSS 聚合入口(`push_components_css`);按 feature 条件注入;禁止无条件聚合全部组件 CSS。\n - `crates/ui/src/root.rs`:`UiRoot` 统一注入 base css + theme vars +(可选)components css,并提供全局 i18n 上下文;主题与注入策略必须集中在此。\n - `crates/ui-visual-primitive/src/active_highlight.rs`:共享高亮条样式与 motion driver;只承载通用高亮动效能力,不承载具体组件业务语义。\n - `crates/ui/src/overlay_open.rs`:当前仓库中不应存在;open-state 原语固定在 `crates/ui-headless/src/controllable_state.rs`,组件通过 headless API 消费。\n - `crates/ui/src/presence.rs`:当前仓库中不应存在;presence 原语固定在 `crates/ui-headless/src/presence.rs`,组件通过 `ui_headless::use_presence` 消费。\n - `crates/ui/src/a11y.rs`:当前仓库中不应存在;共享 A11y 工具固定在 `crates/ui-headless/src/a11y.rs`(如 `aria_controls_when_open`),组件只负责挂载。"}
{"prompt": "- [ ] 组件目录标准文件落点正确。\n - `<component>/mod.rs`:最小稳定导出面,存在且无过度导出。\n - `<component>/logic.rs`:props 归一化、派生状态、来源标记;不得承载可下沉原语。\n - `<component>/styles.rs`:静态 CSS 契约,只用 `var(--ui-*)`,不写死主题常量。\n - `<component>/view.rs`:纯 Leptos 结构渲染 + headless 语义挂载;禁止 `render.rs` 漂移;不隐藏关键状态决策。\n - `<component>/motion.rs`:`XxxMotion + attach_motion`;交互组件必须有;只做语义到 motion contract 的映射与挂载。\n - `<component>/spec.rs`:仅极少数组件专用(当前主要 button),无必要不新增。\n"}
{"prompt": "- [ ] 文件落点纪律:组件目录严格由 `mod.rs`(导出)、`logic.rs`(归一派生)、`styles.rs`(Token 样式)、`view.rs`(渲染)、`motion.rs`(动效)组成;复杂组件可选 `spec.rs`;禁止 `render.rs`。\"}\n{\"prompts\": \"- [ ] 文件落点纪律:组件目录严格由 `mod.rs`(导出)、`logic.rs`(归一派生)、`styles.rs`(Token 样式)、`view.rs`(渲染)、`motion.rs`(动效)组成;复杂组件可选 `spec.rs`;禁止 `render.rs`。"}
{"prompt": "- [ ] Hyper-Structure Builder(`spec.rs`):复杂组件必须提供 AI 友好的 `*Spec::new()...render()` 建造者 API。\"}\n{\"prompts\": \"- [ ] Hyper-Structure Builder(`spec.rs`):复杂组件必须提供 AI 友好的 `*Spec::new()...render()` 建造者 API。"}
{"prompt": "- [ ] 上下文压缩协议(Manifest + RBI):新增/大改组件必须同步维护组件目录下 `Component.toml`(能力清单)和 `.rbi`(接口签名投影),避免 AI 检索工具箱过时。\"}\n{\"prompts\": \"- [ ] 上下文压缩协议(Manifest + RBI):新增/大改组件必须同步维护组件目录下 `Component.toml`(能力清单)和 `.rbi`(接口签名投影),避免 AI 检索工具箱过时。"}
{"prompt": "- [ ] 语义标记统一升级为 Agent Contract(Schema 化),让 Agent 不依赖 DOM 猜测理解组件状态与意图。\n - 关键交互组件必须输出稳定机器可读语义(至少 `data-*` + 状态来源标记;复杂组件建议补 `data-ui-schema`)。\n - Agent 消费字段应来自类型化 schema 生成,不允许散落字符串拼接。\n - 契约字段需可追溯到组件状态轴与动作语义(intent/action/state/source)。\n - 配置到组件的渲染链路必须走白名单能力边界,禁止任意脚本注入。"}
{"prompt": "- [ ] 流式在这里仅指 LLM 输出渲染(只看两种显示模式)。\n - `Streaming`:LLM 还在生成,界面边生成边显示。\n - `Snapshot`:LLM 全部生成完成后,一次性显示。"}
{"prompt": "- [ ] `Snapshot` 是所有组件的基础能力(默认必须支持)。\n - 所有组件都应能消费“完整生成结果”并稳定渲染。\n - 即使组件不直接展示正文,也应能在接收上层完整配置后正常渲染。"}
{"prompt": "- [ ] `Streaming` 是否强制,按组件职责判断(不能一刀切)。\n - `Streaming Required`:组件本体就是正文阅读面,用户需要边生成边看。\n - `Streaming Optional`:组件不是正文阅读面,可以只消费 `Snapshot`;若不支持流式,必须明确 `fallback=snapshot`。\n - 无论是否支持 `Streaming`,都要显式标识当前输出状态(草稿/已验证/可提交),并保持 `role`/`aria-*`/`data-*` 连续可读。\n - 数据校验、断线恢复、重试策略由上层负责,组件层只负责稳定渲染。"}
{"prompt": "- [ ] 代码卫生(Rust Hygiene):非测试代码中完全禁止 `unwrap/expect`,禁止无处理的 `let _ = ...`;字符串复制热点收敛为 `Cow<'static, str>`(执行 `./scripts/check-rust-hygiene.sh` 验证)。\"}\n{\"prompts\": \"- [ ] 代码卫生(Rust Hygiene):非测试代码中完全禁止 `unwrap/expect`,禁止无处理的 `let _ = ...`;字符串复制热点收敛为 `Cow<'static, str>`(执行 `./scripts/check-rust-hygiene.sh` 验证)。"}
{"prompt": "- [ ] Tree Shaking & 特性剪裁:组件必须注册到 `ui` 特性树(如 `component-accordion`);`css.rs` 和 `lib.rs` 聚合必须受 feature 门控,禁止无条件全局依赖。\"}\n{\"prompts\": \"- [ ] Tree Shaking & 特性剪裁:组件必须注册到 `ui` 特性树(如 `component-accordion`);`css.rs` 和 `lib.rs` 聚合必须受 feature 门控,禁止无条件全局依赖。"}
{"prompt": "- [ ] 语义测试与性能回归:断言必须覆盖 `aria-*`、`data-*` 与焦点流转,不能只看快照;高频/重型组件必须补齐 `render_count` 断言/测量(如初始化空闲预算为 1)。\"}\n{\"prompts\": \"- [ ] 语义测试与性能回归:断言必须覆盖 `aria-*`、`data-*` 与焦点流转,不能只看快照;高频/重型组件必须补齐 `render_count` 断言/测量(如初始化空闲预算为 1)。"}
{"prompt": "- [ ] 版本弃用迁移(Codemod/Registry):若提交包含跨大版本 API 破坏升级,必须在 Schema Registry 注册弃用窗口并提供纯函数迁移层(`migrate_v1_to_v2`)。\"}\n{\"prompts\": \"- [ ] 版本弃用迁移(Codemod/Registry):若提交包含跨大版本 API 破坏升级,必须在 Schema Registry 注册弃用窗口并提供纯函数迁移层(`migrate_v1_to_v2`)。"}
{"prompt": "- [ ] 文档即产品(Copy-Paste Ready):`apps/docs-app` 必须新增 Playground(Hello World、状态矩阵、受控/非受控对照),支持流式/快照展现,并提供 Source-first 一键复制且补全 imports。\"}\n{\"prompts\": \"- [ ] 文档即产品(Copy-Paste Ready):`apps/docs-app` 必须新增 Playground(Hello World、状态矩阵、受控/非受控对照),支持流式/快照展现,并提供 Source-first 一键复制且补全 imports。"}
{"prompt": "- [ ] 语义测试优先:验证 `data-*` / `aria-*` / role / 状态来源契约,不只视觉快照。\n - 每个交互组件至少有对应 `*_semantics.rs` 测试覆盖关键状态轴与动作语义。\n - 断言应聚焦语义契约(状态来源/可访问性/键盘路径),快照仅作补充。\n - 新增/变更语义字段必须同步补测试,否则不得打勾。"}
{"prompt": "- [ ] E2E 选择器稳定:使用语义标记,WASM 场景有稳定等待策略。\n - E2E 选择器优先 `data-*` 语义标记,禁止依赖脆弱 DOM 层级或文本定位。\n - WASM 场景必须使用稳定等待策略(语义状态就绪而非固定 sleep)。\n - 若组件涉及异步/动画,E2E 需显式覆盖 ready/settled 条件。"}
{"prompt": "- [ ] 关键流程纳入可重复回归集合(Playwright/Cypress)。\n - 至少定义一条可重复关键流程(打开/交互/关闭或提交)纳入 E2E 回归。\n - 回归失败需可定位到具体语义契约断点,而不是笼统“页面不一致”。\n - 高风险路径(overlay、focus、keyboard、async)优先进入回归集合。"}
{"prompt": "- [ ] docs-app 文档、示例、参数矩阵、状态矩阵同步更新。\n - 组件行为或参数变更必须同步更新 `apps/docs-app` 示例与说明。\n - 文档示例需覆盖至少一组状态矩阵(受控/非受控、disabled、size/variant 等)。\n - 文档中的 API 名称与默认值必须和 `logic.rs` 当前实现一致。"}
{"prompt": "- [ ] 组件文档必须对新手友好(Documentation as Product):组件 README 或等价文档入口必须存在。\n - 每个基础组件必须提供“零门槛”最小示例(Hello World)与常见用法,避免要求用户先理解底层分层架构。\n - 文档需明确“先用起来,再进阶”:默认 API 路径在前,高级控制参数在后。\n - “只有源码没有文档”或“只写给架构师/机器看的文档”视为不通过。"}
{"prompt": "- [ ] `apps/docs-app` 必须提供 Interactive Playground:用户可在线修改 props/状态并实时预览。\n - Playground 至少支持基础 props 调整、状态切换、交互反馈观察。\n - 对 AI Spec 相关组件,至少提供一组 Spec 输入与预览输出的联动示例。\n - Playground 作为验收面,需可重复复现关键交互路径。"}
{"prompt": "- [ ] Source-first 文档必须 Copy-Paste Ready:提供一键复制组件源码或最小可用片段能力。\n - docs-app 页面应提供复制按钮,输出代码默认可直接运行(含必要 imports/依赖提示)。\n - 若为 source-first 组件,文档需指向真实源码落点并说明依赖前提,避免“复制即报错”。\n - 文档代码与当前实现必须同步,防止示例漂移。"}
{"prompt": "- [ ] HeroUI 对标文档与组件文档同步:参数模型变更需同步 `docs/spec/heroui-parameter-design-strategy.md`(必要时补充 `docs/research/spectrum-heroui-style-interface-study.md`),并保证组件文档可访问。\n - 若参数语义发生变化,需同步更新对标策略文档,不允许实现先漂移文档后补。\n - 组件文档入口必须存在(docs-app 页面或等价文档),且可被索引定位。\n - “仅代码更新无文档更新”在接口变更场景下直接判不通过。"}
{"prompt": "再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进\"}\n{\"prompts\": \"再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进"}
{"prompt": "再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进\"}\n{\"prompts\": \"再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进"}
{"prompt": "再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进\"}\n{\"prompts\": \"再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进"}
{"prompt": "再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进\"}\n{\"prompts\": \"再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进"}
{"prompt": "再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进\"}\n{\"prompts\": \"再次检查组件的check2.md是否全部完成,完成的话回复1,没完成的话继续推进"}