diff --git a/CHANGELOG.md b/CHANGELOG.md index 635a4c6..cba64dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ - 小节正文写用户能看懂的变化(新能力、修复、注意事项),避免堆砌内部实现细节 - 打 tag 前**必须**为即将发布的版本新增一节;找不到匹配小节时,本次发布不会更新 changelog 字段 +## 1.0.68 + +- 明确数据管理技能按钮顺序契约:同一 placement(toolbar / row / batch)下按 `actions` 数组相对顺序展示;调整数组先后即可改序 +- 说明宿主内置刷新 / 导出 / 查看等不参与该顺序;无独立 `sortOrder` 字段 +- 更新 ACTIONS.md 与 skill-actions.schema.json + ## 1.0.67 - 移除模板内嵌的 `tools/ui_inspector`;UI 录制器产品迁至独立仓库 `jiangchang-ui-recorder` diff --git a/SKILL.md b/SKILL.md index 1e179cd..07a5fb7 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,7 +1,7 @@ --- name: 技能开发模板(通用业务版) description: "OpenClaw 通用业务技能开发模板,供复制后定制新业务 skill。定制步骤见 development/DEVELOPMENT.md。" -version: 1.0.67 +version: 1.0.68 author: 深圳匠厂科技有限公司 metadata: openclaw: @@ -32,7 +32,7 @@ allowed-tools: ### 架构铁律(先读) - **单业务内核、多入口**:数据管理 / 定时任务 / Agent / 技能详情 / 直接 CLI 必须复用同一 domain service;禁止按入口复制业务逻辑,禁止按 `source` 分叉业务行为。 -- **`placements`**:只决定 Action **出现在哪里**(toolbar / row / batch / cron / agent / skill-detail)。 +- **`placements`**:只决定 Action **出现在哪里**(toolbar / row / batch / cron / agent / skill-detail)。数据管理技能按钮顺序见 `actions` **数组相对顺序**(详见 `references/ACTIONS.md`),无独立 sortOrder。 - **`bind.tables`**:只决定数据管理出现在哪些表;含 `toolbar` 时**必须**显式非空绑定。 - **`executionProfile`**:只决定执行方式——`sync` 当场返回结果,`async` 进**任务中心**。与 placements / 入口**无关**。心智上多数为 sync,仅长任务 / RPA 标 async;宿主省略该字段时按 sync。每个 Action **仍必须**显式写 `sync` 或 `async`。 - **同步数据**写技能本地库、不生成导出文件;**导出当前表**由宿主数据管理负责;特殊业务报告才另做 `export-*`。 diff --git a/assets/schemas/skill-actions.schema.json b/assets/schemas/skill-actions.schema.json index f74a2d7..7c862e0 100644 --- a/assets/schemas/skill-actions.schema.json +++ b/assets/schemas/skill-actions.schema.json @@ -19,7 +19,8 @@ "actions": { "type": "array", "minItems": 1, - "items": { "$ref": "#/$defs/action" } + "items": { "$ref": "#/$defs/action" }, + "description": "Action 列表。同一 placement(toolbar/row/batch)下,宿主按本数组中匹配项的相对顺序渲染技能按钮;调整顺序即调整数组先后。无独立 sortOrder 字段。宿主内置刷新/导出/查看等不参与本顺序。" } }, "$defs": { @@ -166,7 +167,7 @@ "type": "array", "minItems": 0, "items": { "$ref": "#/$defs/placement" }, - "description": "决定 Action 出现在哪里;与 executionProfile 正交。仅 replaces 接管默认 CRUD 时可为空数组。" + "description": "决定 Action 出现在哪里;与 executionProfile 正交。仅 replaces 接管默认 CRUD 时可为空数组。数据管理 toolbar/row/batch 的按钮顺序由顶层 actions 数组相对顺序决定,不在本字段配置排序。" }, "replaces": { "$ref": "#/$defs/mutationKind" }, "entrypoint": { "$ref": "#/$defs/entrypoint" }, diff --git a/references/ACTIONS.md b/references/ACTIONS.md index ff672b7..a6f9d15 100644 --- a/references/ACTIONS.md +++ b/references/ACTIONS.md @@ -72,7 +72,7 @@ Action 是**可选能力**: |------|------|------| | `schemaVersion` | 是 | 当前固定为 `1` | | `skill` | 是 | 必须与 `SKILL.md` 的 `metadata.openclaw.slug` 一致 | -| `actions` | 是 | Action 数组,每项 `id` 唯一 | +| `actions` | 是 | Action 数组,每项 `id` 唯一;**数组相对顺序**决定数据管理 toolbar / row / batch 技能按钮的展示顺序(见下节) | 模板最小示例见 [`assets/actions.json`](../assets/actions.json);JSON Schema 见 [`assets/schemas/skill-actions.schema.json`](../assets/schemas/skill-actions.schema.json)。 @@ -358,6 +358,25 @@ HINT: | `agent` | Agent 可直接调用(`run_skill_action`) | | `cron` | 定时任务「技能直调」 | +### 数据管理技能按钮顺序(宿主正式契约) + +宿主**没有**单独的 `sortOrder` / `uiOrder` 字段。同一 `placement`(`toolbar` / `row` / `batch`)下,技能按钮的展示顺序 = `actions` 数组中**匹配该项 placement(且通过 `bind.tables` 过滤)的相对先后**。 + +规则: + +1. 想调整顺序 → **调整 `actions` 数组先后**(不必改 `id` / `label`)。 +2. 无关 placement 的 Action(如仅 `skill-detail` 的 `health`)夹在中间**不影响** toolbar/row 的相对顺序;宿主按匹配子集保序渲染。 +3. 同一 Action 可同时挂多个 placement;它在各入口的位置,分别是该入口匹配子集里的相对位置。 +4. **宿主内置按钮不参与本契约、位置固定**: + - 表顶栏右侧:删除(有勾选时)/ 刷新 / 新增 / 导入 / 导出 —— 技能 toolbar/batch 按钮在左侧(或「更多操作」溢出菜单中),不能与右侧内置按钮混排。 + - 行内「操作」列:技能 `row` 按钮在前;其后固定为宿主「查看」→(非只读)「编辑」→「删除」。 +5. 表顶栏技能按钮过多时,宿主可能只常驻前若干个,其余进「更多操作」;**溢出菜单仍遵循同一数组相对顺序**。 + +禁止: + +- 臆造 `sortOrder` / `order` / `priority` 等字段指望宿主排序(模板 Schema `additionalProperties: false` 会拒收)。 +- 把「表格行数据默认排序」与按钮顺序混淆——行排序见 [`SCHEMA.md`](SCHEMA.md) 的 `default_sort_json`。 + ### Action 类型 × placements(常见示例,不是限制) 下表只表示**常见用法示例**。实际 `placements` 以 manifest 配置为准;**`sync` / `async` 不影响展示入口**。已声明的入口都要在宿主自测,不要只测其中一条。 diff --git a/scripts/util/constants.py b/scripts/util/constants.py index 3a22d29..b5c910e 100644 --- a/scripts/util/constants.py +++ b/scripts/util/constants.py @@ -1,6 +1,6 @@ """技能标识、版本与平台公共库约束(复制后请修改 slug/version/logger)。""" SKILL_SLUG = "your-skill-slug" -SKILL_VERSION = "1.0.67" +SKILL_VERSION = "1.0.68" LOG_LOGGER_NAME = "openclaw.skill.your_skill_slug" PLATFORM_KIT_MIN_VERSION = "1.2.2" diff --git a/tests/test_actions_manifest.py b/tests/test_actions_manifest.py index 8f27770..5bff9e2 100644 --- a/tests/test_actions_manifest.py +++ b/tests/test_actions_manifest.py @@ -510,6 +510,8 @@ class TestActionsManifest(unittest.TestCase): "executionProfile", "interaction", "confirmation", + "数据管理技能按钮顺序", + "数组相对顺序", ): self.assertIn(marker, text, msg=f"ACTIONS.md missing {marker!r}") for forbidden in (