{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://openclaw.local/skill-template/skill-policy-snapshot.schema.json", "title": "SkillDataPolicySnapshot", "description": "匠厂 Skill Data Policy Snapshot(schemaVersion 1)。由技能 policy CLI 输出到 stdout;宿主用于数据管理按钮/行列过滤。详见 references/POLICY.md。", "type": "object", "required": ["schemaVersion", "skill", "actor", "actions"], "additionalProperties": true, "properties": { "schemaVersion": { "type": "integer", "const": 1 }, "skill": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$", "minLength": 1 }, "actor": { "type": "object", "required": ["userId"], "additionalProperties": true, "properties": { "userId": { "type": "string", "minLength": 1 }, "displayName": { "type": "string" }, "roles": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "attributes": { "type": "object", "additionalProperties": { "type": ["string", "number", "boolean", "null"] } } } }, "actions": { "type": "object", "required": ["mode"], "additionalProperties": false, "properties": { "mode": { "type": "string", "enum": ["allowlist", "open"], "description": "v1 仅允许 allowlist/open;denylist 非法。" }, "ids": { "type": "array", "items": { "type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$" }, "description": "mode=allowlist 时必填;mode=open 时应省略或 []。" } }, "allOf": [ { "if": { "properties": { "mode": { "const": "allowlist" } }, "required": ["mode"] }, "then": { "required": ["ids"] } } ] }, "hostCapabilities": { "type": "array", "items": { "type": "string", "enum": ["refresh", "export", "view", "edit", "delete", "import"] }, "description": "省略=不限制宿主内置能力;写出则按 allowlist(含 []=全禁)。" }, "data": { "type": "object", "additionalProperties": false, "properties": { "tables": { "type": "object", "additionalProperties": { "$ref": "#/$defs/tablePolicy" } } } }, "extensions": { "type": "object", "description": "技能私有扩展;宿主必须忽略未知键。" } }, "$defs": { "predicate": { "type": "object", "required": ["field", "op"], "additionalProperties": false, "properties": { "field": { "type": "string", "minLength": 1, "pattern": "^[a-z][a-z0-9_]*$" }, "op": { "type": "string", "enum": [ "eq", "ne", "in", "not_in", "gt", "gte", "lt", "lte", "is_null", "is_not_null" ] }, "value": { "description": "与 valueFrom 互斥;in/not_in 时为非空数组。" }, "valueFrom": { "type": "string", "const": "actor.userId", "description": "v1 仅允许 actor.userId。" } } }, "scope": { "oneOf": [ { "$ref": "#/$defs/predicate" }, { "type": "object", "required": ["all"], "additionalProperties": false, "properties": { "all": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/predicate" } } } }, { "type": "object", "required": ["any"], "additionalProperties": false, "properties": { "any": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/predicate" } } } } ] }, "tablePolicy": { "type": "object", "additionalProperties": false, "properties": { "accessible": { "type": "boolean" }, "columns": { "type": "object", "additionalProperties": false, "properties": { "visible": { "type": "array", "items": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" } }, "writable": { "type": "array", "items": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" } } } }, "rows": { "type": "object", "additionalProperties": false, "properties": { "mode": { "type": "string", "enum": ["scope", "open", "delegate"] }, "scope": { "$ref": "#/$defs/scope" } } } } } } }