ObjectStack 数据协议(Data Modeling — ObjectStack Data Protocol)技能,用于设计 ObjectStack 的数据模式。当用户创建或修改 ObjectStack 数据模型时使用本技能。
【技能边界】 不同需求应使用对应技能:查询、过滤或聚合记录请使用 objectstack-query;定义 REST API 端点或认证请使用 objectstack-api;构建视图、仪表盘或应用请使用 objectstack-ui;创建插件或注册服务请使用 objectstack-platform。
【核心概念:对象定义】 对象(Object)是 ObjectStack 中的基础数据实体,映射到数据库表并自动暴露 CRUD API。 必需属性:name(string,snake_case,不可变机器标识,匹配 /^[a-z_][a-z0-9_]*$/);fields(map,键为 snake_case 的字段定义);sharingModel(枚举,四选一,用于组织级默认记录可见性 OWD)。Zod 将其标记为可选,但未编写 sharingModel 的发布会以 422 lint 信封 security-owd-unset 被拒绝——缺失不等于决策。应在每个对象上编写它。 sharingModel 的四个标准值:private(仅所有者可读写,可通过共享规则、RLS 或 readScope/writeScope 扩大);public_read(所有人可读,所有者可写);public_read_write(所有人可读写);controlled_by_parent(从主记录继承,用于 master_detail 子对象)。省略该值的自定义对象在运行时解析为 private,但发布门会在那之前拒绝它。
【重要可选属性】 label(人类可读的单数标签,默认由 name 自动生成);pluralLabel(复数形式,如 "Accounts");icon(导航、列表标题和查找选择器使用的图标名);highlightFields(有序字段键,用作记录的紧凑展示面,应在子对象上声明);namespace(不是 schema 键,ObjectSchema.create() 会拒绝未知键,将前缀直接写入 name);datasource(虚拟化数据的目标数据源 ID,默认 'default');nameField(规范记录标题字段);displayNameField(nameField 的已弃用别名);titleFormat(已弃用但未移除,仅用于渲染);enable(能力标志);fieldGroups(表单/详情页的逻辑字段组有序列表);lifecycle(记录语义,永久,数据保留/轮转/归档契约,append-only 高频写入对象必需)。
【对象能力 enable】 trackHistory(默认 false,字段级审计轨迹);searchable(默认 true,为全局搜索索引记录);apiEnabled(默认 true,通过自动 REST + MCP API 暴露);apiMethods(默认 all,六个原语 get/list/create/update/delete/bulk 的白名单);files(默认 false,附件与文档管理);feeds(默认 true,社交动态、评论、提及,显式 false 可关闭);activities(默认 true,活动时间线);clone(默认 true,记录深度克隆)。
【搜索字段 searchableFields】 对象上的 searchableFields 是 $search 扫描的规范集合。未设置时自动默认为 nameField 加上对象的短文本和枚举列(text/email/phone/url/autonumber/textarea/markdown/select/status);显式声明可固定集合。视图可以缩小该集合,不能扩大。注意:通过关联记录标题搜索时,必须镜像该值——$search 扫描被查询对象自身的列,点号路径永远不是搜索目标,searchableFields 中不允许 project_id.name 这类路径。要按关联记录标题搜索,需将该标题复制到本对象的一个存储字段并声明该字段可搜索。切勿将镜像放在公式字段上,因为公式字段是虚拟的,没有驱动为其物化列。
【条件字段规则】 当规则属于数据模型且应在任何编辑该字段的地方生效时,将条件 UI/数据录入规则放在字段定义上。可使用 visibleWhen 在 ObjectUI 表单中隐藏无关字段;readonlyWhen 用于状态锁定字段,当谓词为 TRUE 时 ObjectQL 写入路径忽略传入更改;requiredWhen 用于条件必填,ObjectQL 校验器在提交时强制执行(conditionalRequired 别名已在协议 17 中移除)。
【常见模式】 命名规则:对象名与字段键用 snake_case(如 project_task、first_name);schema 属性用 camelCase(如 maxLength、lookupFilters);选项值用小写(如 in_progress)。 字段类型:共 49 种,涵盖文本、密钥、数字、日期时间、逻辑、选择、关系、媒体、计算、嵌入、增强等类别。 关系模式:一对多(独立)在子对象上用 lookup 字段;一对多(拥有)在子对象上用 master_detail;多对多(简单)用多值 lookup(multiple: true);多对多(含属性)用连接对象加两个 lookup 字段;层级用自引用 tree 字段。 校验模式:脚本校验逻辑反转——Validation 在 expression 为 true 时失败。完整校验类型包括 script、state_machine、format、cross_field、json_schema、conditional。没有 unique 校验类型,唯一性(包括复合唯一性)应通过唯一索引强制。