data-design
Use when designing data structures, database schemas, state management, or data relationships - covers single source of truth, complete data flow thinking
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when designing data structures, database schemas, state management, or data relationships - covers single source of truth, complete data flow thinking
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
通用代码质量检查,包括语法错误、TypeScript 类型检查和 Prettier 代码美化。在提交代码前、完成功能开发后、或用户要求检查代码质量时使用。
开发环境部署到生产环境前的验证清单与最佳实践,重点关注 Monorepo 依赖管理与环境一致性。
Use when integrating with external APIs, third-party SDKs, or libraries - covers verification workflow before writing any integration code
Implements filterable, paginated list pages with URL as single source of truth (nuqs) and TanStack Query to avoid duplicate requests and support shareable links. Use when building list pages with filters, pagination, URL-synced state, or when fixing multiple requests on page change.
Use when working with Polymarket API - profiles, activities, events, markets endpoints
规范 Polymarket 的 Privy + Safe + Builder + CLOB 集成流程,覆盖新老用户分支、三次签名、授权批处理、安全边界与排障步骤。Use when implementing or debugging Privy embedded wallet, Safe deployment, builder relayer, remote signing, CLOB api credentials, token approvals, or builder attribution order flow.
| name | data-design |
| description | Use when designing data structures, database schemas, state management, or data relationships - covers single source of truth, complete data flow thinking |
设计数据结构、数据库 schema、状态管理时必须遵循的原则。
核心原则: 先设计再编码,完整思考数据流,保持单一数据源。
触发场景:
流程:
示例:
Event (父级)
├── id
├── slug
├── title
└── markets[] (嵌套)
├── id
├── eventId ← 可能缺失!需要从父级传入
└── question
代码体现:
// 映射函数接收父级上下文
function mapToMarket(raw: MarketRaw, parentEventId?: string): Market {
return {
eventId: raw.eventId || parentEventId, // 处理缺失
// ...
}
}
不只考虑「获取端」,还要考虑「使用端」的真实场景。
思考框架:
数据从哪来 → 存到哪 → 在哪展示 → 用户如何交互
示例:Activity 页面的 Event 筛选
event_slug 字段解决:设计降级策略
// 已关联的 events
const existingEvents = await db.from('events').select('*').in('slug', slugs)
// 未关联的 slugs,创建占位对象
const missingSlugs = slugs.filter(s => !existingEvents.has(s))
const placeholders = missingSlugs.map(slug => ({
slug,
title: null, // 降级显示 slug
icon: null,
}))
return [...existingEvents, ...placeholders]
复杂状态变更应有唯一的控制点,避免多处同时修改导致竞态。
反模式:
// ❌ 子组件内协调多个状态变更
onSelect={() => {
onLeaderChange(value) // 触发状态变更 A
onEventChange(null) // 触发状态变更 B(可能竞态!)
}}
正确模式:
// ✅ Container 统一管理,子组件只触发单一回调
// Container
const handleLeaderChange = useCallback((address) => {
setUrlState({ page: 1, leader: address, event: null }) // 一次性更新
}, [setUrlState])
// Filter 组件
onSelect={() => onLeaderChange(value)} // 只触发一个回调