@ww-ai-lab/openclaw-office 2026.5.20 → 2026.6.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL-WORKBENCH.md +29 -1
- package/bin/skills/skill-workbench-mermaid-guard/SKILL.md +55 -193
- package/bin/skills/skill-workbench-mermaid-guard/evals/eval_queries.json +22 -0
- package/bin/skills/skill-workbench-mermaid-guard/evals/evals.json +47 -0
- package/bin/skills/skill-workbench-mermaid-guard/references/a2ui-input-spec.md +139 -0
- package/bin/skills/skill-workbench-mermaid-guard/references/flowchart-generation-guide.md +206 -0
- package/bin/skills/skill-workbench-mermaid-guard/references/mermaid-normalization-checklist.md +46 -45
- package/dist/assets/{ActivityHeatmap-4oWbgWaH.js → ActivityHeatmap-Dyo36cHr.js} +1 -1
- package/dist/assets/{CostPieChart-Dx8BEJon.js → CostPieChart-DK3HCpxu.js} +1 -1
- package/dist/assets/{MermaidPreview-jD0i69Fx.js → MermaidPreview-DzGiWrlu.js} +2 -2
- package/dist/assets/{NetworkGraph-BWUjFTxJ.js → NetworkGraph-70zlWpC4.js} +1 -1
- package/dist/assets/{TokenLineChart-DMn19IHo.js → TokenLineChart-DJ2MxJ2F.js} +1 -1
- package/dist/assets/{_baseUniq-MWZLnUt3.js → _baseUniq-DL7yYNy2.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-V2zcpnHi.js → architectureDiagram-Q4EWVU46-njDre1Ba.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-BHumVJuj.js → blockDiagram-DXYQGD6D-Dm_lAshB.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-B4hhgxQA.js → c4Diagram-AHTNJAMY-CT8HzN2g.js} +1 -1
- package/dist/assets/channel-D-LK3E9t.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-DrqKqdS5.js → chunk-4BX2VUAB-DtByYuXZ.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-CkSey-By.js → chunk-4TB4RGXK-BUK0fglj.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-Cr5negI0.js → chunk-55IACEB6-DVos4kNQ.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-CBGC3aKd.js → chunk-EDXVE4YY-DDrR2mbI.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-B1ef6G2i.js → chunk-FMBD7UC4-DCMthRd_.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-B0HXvZ0x.js → chunk-OYMX7WX6-BAnX32xA.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-uycTgJvr.js → chunk-QZHKN3VN-CsyE4hGP.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-M3IKxsBn.js → chunk-YZCP3GAM-DMUoL9ap.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-c3iBZq0d.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-c3iBZq0d.js +1 -0
- package/dist/assets/clone-D12O4dnH.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-BxfgnrXN.js → cose-bilkent-S5V4N54A-D_AAFd1T.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-BHNqSlbb.js → dagre-KV5264BT-Dc5FySyc.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-DHiJWHzv.js → diagram-5BDNPKRD-Drs0-dUa.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-CS1RL7mx.js → diagram-G4DWMVQ6-CuptW3vZ.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-Cn4Ps_RK.js → diagram-MMDJMWI5-SMBFNL_d.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-QYACuW54.js → diagram-TYMM5635-BOjlSS8u.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-Bh3xxqgr.js → erDiagram-SMLLAGMA-CY2M9aH3.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-C9Up4-jj.js → flowDiagram-DWJPFMVM-BhS8hoKW.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-5fTAlQSX.js → ganttDiagram-T4ZO3ILL-DFmApxWf.js} +1 -1
- package/dist/assets/{generateCategoricalChart-D9pCEXVG.js → generateCategoricalChart-B98FRgGC.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-C7nEpn7L.js → gitGraphDiagram-UUTBAWPF-zmYupAvb.js} +1 -1
- package/dist/assets/{graph-BZUOGnQ1.js → graph-DHym4dmn.js} +1 -1
- package/dist/assets/index-CBGZeKdy.css +1 -0
- package/dist/assets/index-DXz6hmM_.js +648 -0
- package/dist/assets/{infoDiagram-42DDH7IO-CwcahfA3.js → infoDiagram-42DDH7IO-DK8dXgoJ.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-Bm3MWIHk.js → ishikawaDiagram-UXIWVN3A-DxXmlW0r.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-B4jUf0Wx.js → journeyDiagram-VCZTEJTY-EAluGLi2.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-D9gx2sJq.js → kanban-definition-6JOO6SKY-BVG_ElGr.js} +1 -1
- package/dist/assets/{layout-Dt-5ZeOq.js → layout-B1soiSae.js} +1 -1
- package/dist/assets/{mermaid.core-CjgEmPNb.js → mermaid.core-qcqms9Xh.js} +4 -4
- package/dist/assets/{min-Bj7lHRRS.js → min-COx0nqjk.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-DpCNrMhx.js → mindmap-definition-QFDTVHPH-BHWO71rK.js} +1 -1
- package/dist/assets/{pieDiagram-DEJITSTG-pwQu25jh.js → pieDiagram-DEJITSTG-Db6QM6VL.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-DMAC-a9p.js → quadrantDiagram-34T5L4WZ-DWxpw-N3.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-DvA9ucnU.js → requirementDiagram-MS252O5E-Cl1TouIW.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-Bg_81aFl.js → sankeyDiagram-XADWPNL6-ClLqfZ-F.js} +1 -1
- package/dist/assets/{sequenceDiagram-FGHM5R23-DfY87xG8.js → sequenceDiagram-FGHM5R23-ezxaNizq.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-BdgiwBkM.js → stateDiagram-FHFEXIEX--JWbXPm4.js} +1 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-BXaEqY-q.js +1 -0
- package/dist/assets/{timeline-definition-GMOUNBTQ-CH7ILTtJ.js → timeline-definition-GMOUNBTQ-Ci9hpSSz.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-CDrNMVaz.js → vennDiagram-DHZGUBPP-DtstmOsT.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-UaubHZFW.js → wardley-RL74JXVD-CEVGBPiF.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-Dxe-intj.js → wardleyDiagram-NUSXRM2D-YuMG-gVY.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-0peV596l.js → xychartDiagram-5P7HB3ND-jhGi5p5d.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/assets/channel-LsjEulDM.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-DMGwXxmq.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-DMGwXxmq.js +0 -1
- package/dist/assets/clone-CezNyyOo.js +0 -1
- package/dist/assets/index-B2buQJXY.css +0 -1
- package/dist/assets/index-D1qjyBSQ.js +0 -636
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-CocBd3vG.js +0 -1
package/SKILL-WORKBENCH.md
CHANGED
|
@@ -97,6 +97,34 @@
|
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
100
|
+
## 5b. A2UI 输入表单:ui.json 与「A2UI 调试」选项卡
|
|
101
|
+
|
|
102
|
+
A2UI 让 Skill 的"首次交互输入"从一段自由文本,升级为**结构化的可视表单**。它有两个载体:
|
|
103
|
+
|
|
104
|
+
- **`ui.json`(稳定首次交互)** — 与 `FLOWCHART.md` 一样直接落盘在 Skill 目录下,存放一份**纯 A2UI Schema JSON**(不带 ```a2ui 围栏),用于稳定的首次交互输入界面
|
|
105
|
+
- **运行期 HITL(按需动态)** — Skill 执行过程中若需要补充输入,模型在对话里输出一个 ` ```a2ui ` 代码块,Chat 会动态渲染为表单;提交后以结构化消息回发,不写盘
|
|
106
|
+
|
|
107
|
+
### 「A2UI 调试」选项卡
|
|
108
|
+
|
|
109
|
+
在 `/skill-workbench/:slug` 详情页左侧,`流程图` 下方新增 **「A2UI 调试」** 选项卡:
|
|
110
|
+
|
|
111
|
+
- 若该 Skill 尚无 `ui.json`,面板显示 **「一键生成输入表单」** 按钮:
|
|
112
|
+
1. 自动发送 `buildInputUiTaskPrompt` 指令(遵循 `skill-workbench-mermaid-guard` 的 A2UI 规范)
|
|
113
|
+
2. AI 基于 `SKILL.md` 产出纯 A2UI Schema JSON,写入 `ui.json`
|
|
114
|
+
3. 幂等地向目标 `SKILL.md` 注入 A2UI 使用提示(带 `<!-- a2ui:input-hint -->` 标记,已存在则跳过)
|
|
115
|
+
4. 流式结束后自动从磁盘重新加载 `ui.json` 并刷新预览
|
|
116
|
+
- 若已有 `ui.json`:
|
|
117
|
+
- **上半部** 渲染 `A2uiForm` 实时预览,可直接填写
|
|
118
|
+
- **下半部** 内嵌 `WorkbenchChat` 调试对话
|
|
119
|
+
- 表单提交后,会以**结构化首条消息**(含字段摘要 + `[a2ui-data]` 机器可读载荷)发起对话,直接调试该 Skill 的完整链路
|
|
120
|
+
- 顶部提供 **「重新生成」** 与 **「重新加载」** 按钮
|
|
121
|
+
|
|
122
|
+
### Chat 动态渲染
|
|
123
|
+
|
|
124
|
+
本项目的 Chat 已支持 A2UI 协议:助手消息中的 ` ```a2ui ` 代码块会被渲染成可交互表单。校验通过后提交,按字段拼装成结构化消息回发给 Agent;提交后表单进入只读态,避免重复提交。
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
100
128
|
## 6. 默认技能的自动安装
|
|
101
129
|
|
|
102
130
|
工作台依赖两个"默认技能"注入到 AI 的 system 上下文:
|
|
@@ -104,7 +132,7 @@
|
|
|
104
132
|
| Skill slug | 作用 |
|
|
105
133
|
| ------------------------------------ | ----------------------------------------------------- |
|
|
106
134
|
| `skill-workbench-creator` | 引导 AI 生成规范的 `SKILL.md` 骨架 |
|
|
107
|
-
| `skill-workbench-mermaid-guard` ✨ | 保障 `FLOWCHART.md` 输出的格式 / 颜色 /
|
|
135
|
+
| `skill-workbench-mermaid-guard` ✨ | 保障 `FLOWCHART.md` 输出的格式 / 颜色 / 规范,并守护 `ui.json` / 运行期 A2UI 表单的生成规范(详见其 `references/a2ui-input-spec.md`) |
|
|
108
136
|
|
|
109
137
|
从 `2026.5.20` 起:
|
|
110
138
|
|
|
@@ -1,204 +1,66 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: skill-workbench-mermaid-guard
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
Skills 工作台的默认技能:当用户想为某个目标 Skill 生成、回显、修复或重写「工作流程图」或「输入交互表单」时使用——即使没有直接说出 "Mermaid"、"流程图"、"FLOWCHART"、"A2UI"、"表单" 等词。覆盖两类产物:(1) 把 SKILL.md 的工作流整理成符合 FLOWCHART.md 规范、可直接渲染的彩色 Mermaid 流程图(语义化配色 + classDef,支持单图总览与多子图拆分,并在写入前做语法归一化与自检);(2) 生成目标 Skill 的首次交互表单 ui.json,以及运行期 a2ui HITL 表单。典型请求如"画出这个 Skill 的流程""整理成流程图""修一下 FLOWCHART""给这个 Skill 做个输入表单""第一次运行要问哪些参数"。不负责与 Skill 工作台无关的业务流程图、通用绘图或产品 UI 设计。
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Skill Workbench Mermaid Guard
|
|
7
8
|
|
|
8
|
-
你是 Skills
|
|
9
|
+
你是 Skills 工作台的默认质量守卫,负责两类产物,且**两类产物的详细规程都在 `references/`,必须先加载对应文件再动手**:
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
1. **Mermaid 工作流程图** → 写入目标 Skill 的 `FLOWCHART.md`(彩色、可直接渲染、语法稳定)。
|
|
12
|
+
2. **A2UI 输入表单** → `ui.json` 首次交互 + 运行期 ` ```a2ui ` HITL 块(把缺失的关键输入结构化采集)。
|
|
11
13
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
你的价值不是解释 Mermaid / 表单是什么,而是稳定产出**符合工作台规范、能一次渲染成功**的结果。
|
|
15
|
+
本 SKILL.md 只做**任务路由**与**加载校验**;具体规则、模板、自检清单一律在 references 中按需读取,
|
|
16
|
+
**不要凭记忆生成**。
|
|
15
17
|
|
|
16
18
|
## 触发场景
|
|
17
19
|
|
|
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
|
-
2
|
|
64
|
-
|
|
65
|
-
禁止输出:
|
|
66
|
-
|
|
67
|
-
- 在 `##` 小节之外夹带的自然语言摘要或条目列表
|
|
68
|
-
- 分析过程、自检过程、草稿、中间版本
|
|
69
|
-
- 只有子图而缺失总览图
|
|
70
|
-
- 子图与子图之间通过 Mermaid 代码引用对方的节点 ID(每个图必须各自完整、独立渲染)
|
|
71
|
-
- 缺少 `classDef` 声明的单色流程图
|
|
72
|
-
|
|
73
|
-
## 何时使用单图 vs 多图
|
|
74
|
-
|
|
75
|
-
- **单图(默认)**:Skill 逻辑线性、分支不多、一个 flowchart TD 即可清晰表达时,只输出 1 个 Mermaid 块 + 1 个 `##` 总览标题。
|
|
76
|
-
- **多图(复杂 Skill)**:当 SKILL.md 含有明显的阶段划分(Phase A / B / C)、并行分支、降级策略、独立子流程等,总览图之后再用若干 `##` 小节分别描述每个阶段 / 子流程。子图建议 ≤ 6 个。
|
|
77
|
-
|
|
78
|
-
## 标准输出模板(单图模式)
|
|
79
|
-
|
|
80
|
-
## 总览流程
|
|
81
|
-
|
|
82
|
-
```mermaid
|
|
83
|
-
flowchart TD
|
|
84
|
-
classDef startNode fill:#22c55e,stroke:#16a34a,color:#fff,font-weight:bold
|
|
85
|
-
classDef endOk fill:#3b82f6,stroke:#1d4ed8,color:#fff,font-weight:bold
|
|
86
|
-
classDef endErr fill:#ef4444,stroke:#b91c1c,color:#fff,font-weight:bold
|
|
87
|
-
classDef decision fill:#f59e0b,stroke:#d97706,color:#fff,font-weight:bold
|
|
88
|
-
classDef process fill:#dbeafe,stroke:#3b82f6,color:#1e40af
|
|
89
|
-
classDef phase fill:#ede9fe,stroke:#7c3aed,color:#4c1d95,font-weight:bold
|
|
90
|
-
|
|
91
|
-
START["开始:接收请求"]:::startNode --> STEP_1["步骤 1:读取关键输入"]:::process
|
|
92
|
-
STEP_1 --> DECIDE_1{"是否满足执行条件?"}:::decision
|
|
93
|
-
DECIDE_1 -->|是| STEP_2["步骤 2:执行主流程"]:::process
|
|
94
|
-
DECIDE_1 -->|否| END_ERR["结束:返回限制说明"]:::endErr
|
|
95
|
-
STEP_2 --> STEP_3["步骤 3:生成结果"]:::process
|
|
96
|
-
STEP_3 --> END_OK["结束:输出结果"]:::endOk
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## 标准输出模板(多图模式,示例骨架)
|
|
100
|
-
|
|
101
|
-
## 总览流程
|
|
102
|
-
|
|
103
|
-
```mermaid
|
|
104
|
-
flowchart TD
|
|
105
|
-
classDef startNode fill:#22c55e,stroke:#16a34a,color:#fff,font-weight:bold
|
|
106
|
-
classDef endOk fill:#3b82f6,stroke:#1d4ed8,color:#fff,font-weight:bold
|
|
107
|
-
classDef endErr fill:#ef4444,stroke:#b91c1c,color:#fff,font-weight:bold
|
|
108
|
-
classDef decision fill:#f59e0b,stroke:#d97706,color:#fff,font-weight:bold
|
|
109
|
-
classDef process fill:#dbeafe,stroke:#3b82f6,color:#1e40af
|
|
110
|
-
classDef phase fill:#ede9fe,stroke:#7c3aed,color:#4c1d95,font-weight:bold
|
|
111
|
-
|
|
112
|
-
START["开始"]:::startNode --> PHASE_A["阶段 A"]:::phase
|
|
113
|
-
PHASE_A --> PHASE_B["阶段 B"]:::phase
|
|
114
|
-
PHASE_B --> PHASE_C["阶段 C"]:::phase
|
|
115
|
-
PHASE_C --> END_OK["结束"]:::endOk
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## 阶段 A:数据采集
|
|
119
|
-
|
|
120
|
-
```mermaid
|
|
121
|
-
flowchart TD
|
|
122
|
-
classDef startNode fill:#22c55e,stroke:#16a34a,color:#fff,font-weight:bold
|
|
123
|
-
classDef endOk fill:#3b82f6,stroke:#1d4ed8,color:#fff,font-weight:bold
|
|
124
|
-
classDef endErr fill:#ef4444,stroke:#b91c1c,color:#fff,font-weight:bold
|
|
125
|
-
classDef decision fill:#f59e0b,stroke:#d97706,color:#fff,font-weight:bold
|
|
126
|
-
classDef process fill:#dbeafe,stroke:#3b82f6,color:#1e40af
|
|
127
|
-
classDef phase fill:#ede9fe,stroke:#7c3aed,color:#4c1d95,font-weight:bold
|
|
128
|
-
|
|
129
|
-
A_START["阶段 A 开始"]:::startNode --> A_1["读取输入"]:::process
|
|
130
|
-
A_1 --> A_2["清洗数据"]:::process
|
|
131
|
-
A_2 --> A_END["阶段 A 结束"]:::endOk
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
## 阶段 B:并行处理
|
|
135
|
-
|
|
136
|
-
```mermaid
|
|
137
|
-
flowchart LR
|
|
138
|
-
classDef startNode fill:#22c55e,stroke:#16a34a,color:#fff,font-weight:bold
|
|
139
|
-
classDef endOk fill:#3b82f6,stroke:#1d4ed8,color:#fff,font-weight:bold
|
|
140
|
-
classDef endErr fill:#ef4444,stroke:#b91c1c,color:#fff,font-weight:bold
|
|
141
|
-
classDef decision fill:#f59e0b,stroke:#d97706,color:#fff,font-weight:bold
|
|
142
|
-
classDef process fill:#dbeafe,stroke:#3b82f6,color:#1e40af
|
|
143
|
-
classDef phase fill:#ede9fe,stroke:#7c3aed,color:#4c1d95,font-weight:bold
|
|
144
|
-
|
|
145
|
-
B_START["阶段 B 开始"]:::startNode --> B_1["分支 1"]:::process
|
|
146
|
-
B_START --> B_2["分支 2"]:::process
|
|
147
|
-
B_1 --> B_MERGE["合并结果"]:::process
|
|
148
|
-
B_2 --> B_MERGE
|
|
149
|
-
B_MERGE --> B_END["阶段 B 结束"]:::endOk
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## 降级策略
|
|
153
|
-
|
|
154
|
-
```mermaid
|
|
155
|
-
flowchart TD
|
|
156
|
-
classDef startNode fill:#22c55e,stroke:#16a34a,color:#fff,font-weight:bold
|
|
157
|
-
classDef endOk fill:#3b82f6,stroke:#1d4ed8,color:#fff,font-weight:bold
|
|
158
|
-
classDef endErr fill:#ef4444,stroke:#b91c1c,color:#fff,font-weight:bold
|
|
159
|
-
classDef decision fill:#f59e0b,stroke:#d97706,color:#fff,font-weight:bold
|
|
160
|
-
classDef process fill:#dbeafe,stroke:#3b82f6,color:#1e40af
|
|
161
|
-
classDef phase fill:#ede9fe,stroke:#7c3aed,color:#4c1d95,font-weight:bold
|
|
162
|
-
|
|
163
|
-
FAIL{"执行失败?"}:::decision -->|是| DEG["降级路径"]:::process
|
|
164
|
-
FAIL -->|否| NORMAL["正常继续"]:::process
|
|
165
|
-
DEG --> RESUME["继续执行"]:::endOk
|
|
166
|
-
NORMAL --> RESUME
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
## 语法归一化规则
|
|
170
|
-
|
|
171
|
-
1. 总览流程图必须放在第一个 Mermaid 代码块,布局固定使用 `flowchart TD`;后续子图允许使用 `flowchart TD` 或 `flowchart LR`(其他语法如 `sequenceDiagram`、`stateDiagram-v2` 仅在 SKILL.md 本身明显描述该类图时才使用)。
|
|
172
|
-
2. 节点 ID 只能使用 ASCII 字母、数字、下划线,例如 `START`、`STEP_1`、`DECIDE_1`。不同 Mermaid 块之间的节点 ID 允许同名,但不得跨块引用。
|
|
173
|
-
3. 任何包含中文、空格、斜杠、括号、问号、冒号、箭头、emoji、尖括号的节点文本,都必须放进双引号。
|
|
174
|
-
4. 子图标题如果包含中文或特殊符号,也必须写成 `subgraph PHASE_A["阶段 1:结构感知"]`。
|
|
175
|
-
5. 节点内换行只能使用 `<br/>`,不要直接换行。
|
|
176
|
-
6. 分支边标签只允许短标签:是、否、成功、失败、存在、不存在、通过、不通过。较长说明改写为节点,不要塞进边标签。
|
|
177
|
-
7. 如果一个标签的写法可能触发语法问题,优先简化标签文本,不要为了保留冗长文案牺牲 Mermaid 稳定性。
|
|
178
|
-
8. 每个 Mermaid 代码块必须以 ```mermaid 开头、``` 结尾,严格闭合;禁止在同一围栏内混写多种 diagram type。
|
|
179
|
-
9. 每个 Mermaid 代码块前都必须有一个且仅一个 `##` 二级标题。不要使用 `#` 一级标题或 `###` 三级标题作为图的标题。
|
|
180
|
-
10. **颜色规则**:每个 Mermaid 代码块内,`flowchart` 声明行之后、第一条连线或节点定义之前,必须完整声明上方「颜色规范」中全部 6 个 `classDef`。所有节点(除纯中转/合并节点外)都必须通过 `:::className` 语法应用对应颜色类。
|
|
181
|
-
11. **颜色语义一致性**:同一语义的节点类型在所有图中保持相同颜色类;不得随意给无语义区分的节点混用颜色类。
|
|
182
|
-
|
|
183
|
-
## 自检清单
|
|
184
|
-
|
|
185
|
-
在输出前,逐项确认:
|
|
186
|
-
|
|
187
|
-
1. 每个 Mermaid 围栏代码块的 ```mermaid 与 ``` 都闭合。
|
|
188
|
-
2. 第一个 Mermaid 块首行是 `flowchart TD`。
|
|
189
|
-
3. 同一 Mermaid 块内所有节点 ID 唯一。
|
|
190
|
-
4. 所有带中文或特殊符号的节点标签都使用双引号。
|
|
191
|
-
5. 节点标签中没有原生换行,只有 `<br/>`。
|
|
192
|
-
6. 每个 Mermaid 块前面都有一个 `##` 标题;没有图之外的自然语言摘要段落。
|
|
193
|
-
7. 子图数量 ≤ 6;如果超过,考虑合并或简化。
|
|
194
|
-
8. 没有跨 Mermaid 块引用节点 ID 的情况。
|
|
195
|
-
9. **每个 Mermaid 块都包含完整的 6 个 `classDef` 声明**(startNode / endOk / endErr / decision / process / phase)。
|
|
196
|
-
10. **所有节点都正确应用了 `:::className` 颜色标注**,没有遗漏的无色节点(纯合并节点除外)。
|
|
197
|
-
|
|
198
|
-
## 执行策略
|
|
199
|
-
|
|
200
|
-
1. 如果现有 FLOWCHART.md 已经可用,优先做最小修订,尽量保留已有结构(包括已有的多图分块);同时补齐缺失的 `classDef` 和 `:::className` 颜色标注。
|
|
201
|
-
2. 如果现有 FLOWCHART.md 结构混乱或仅含片段 Mermaid,先在脑内整理章节划分,再按"总览 + 若干子图"的顺序写出来,所有图均附带完整颜色。
|
|
202
|
-
3. 如果 SKILL.md 表达的工作流非常简单,直接输出单图即可;不要为了"凑多图"而硬拆。
|
|
203
|
-
4. 如果 SKILL.md 含有复杂阶段 / 分支 / 降级策略等,主动拆成多图并在每个 `##` 标题里点明主题,每张子图均包含完整 `classDef`。
|
|
204
|
-
5. 最终回复时直接回显将要写入或已经写入 FLOWCHART.md 的全部内容(标题 + Mermaid 代码块);末尾追加一句中文状态说明。
|
|
20
|
+
- 用户要求生成、回显、修复或重写某个 Skill 的工作流程图 / FLOWCHART.md。
|
|
21
|
+
- 现有 FLOWCHART.md 语法不稳定、结构混乱、无颜色或不符合工作台输出格式。
|
|
22
|
+
- 用户要求把一个大流程拆成多个子流程图以提升可读性。
|
|
23
|
+
- 用户要求为目标 Skill 生成 / 修复首次交互表单(`ui.json`),或运行期需要 HITL 补全输入。
|
|
24
|
+
|
|
25
|
+
## 任务路由:先判断任务类型,再加载对应 references
|
|
26
|
+
|
|
27
|
+
参考文件位于本技能 `references/` 目录(运行时通常为
|
|
28
|
+
`~/.openclaw/workspace/skills/skill-workbench-mermaid-guard/references/`)。
|
|
29
|
+
|
|
30
|
+
| 任务类型 | 必读 references(动手前加载) | 同时读取的目标文件 |
|
|
31
|
+
|----------|------------------------------|--------------------|
|
|
32
|
+
| 生成 / 修复流程图 | `flowchart-generation-guide.md`(完整规程:配色、输出格式、单/多图模板、归一化规则、Gotchas、自检清单) | 目标 Skill 的 `SKILL.md`;已存在的 `FLOWCHART.md` |
|
|
33
|
+
| 流程图语法把握不准 / 渲染报错 | 追加 `mermaid-normalization-checklist.md`(危险写法 → 修正速查) | — |
|
|
34
|
+
| 生成 / 修复输入表单(ui.json、a2ui HITL) | `a2ui-input-spec.md`(Schema、字段类型、生成规则、SKILL.md 注入片段) | 目标 Skill 的 `SKILL.md` |
|
|
35
|
+
|
|
36
|
+
> 单次请求可能同时涉及两类任务(既要流程图又要表单),则分别加载对应 references,各自独立产出。
|
|
37
|
+
|
|
38
|
+
## 强制工作流(每次任务都执行)
|
|
39
|
+
|
|
40
|
+
1. **判定任务类型**:流程图 / 输入表单 / 二者皆有。
|
|
41
|
+
2. **加载 references**:按上表读取对应规程文件;**未加载完成不得直接输出产物**。
|
|
42
|
+
3. **读取目标文件**:流程图任务读目标 `SKILL.md`(及现有 `FLOWCHART.md`);表单任务读目标 `SKILL.md`。
|
|
43
|
+
4. **按 references 规程生成**:严格遵循所加载文件中的输出格式、模板与约束。
|
|
44
|
+
5. **对照 references 自检**:逐条核对该文件中的「自检清单」;任一条不过就修正后重检。
|
|
45
|
+
6. **输出**:仅输出规程要求的产物 + 一句中文状态说明,不夹带分析、草稿或中间过程。
|
|
46
|
+
|
|
47
|
+
## 加载校验门(输出前必须确认)
|
|
48
|
+
|
|
49
|
+
输出任何产物前,先确认以下三点,缺一不可:
|
|
50
|
+
|
|
51
|
+
- [ ] 已加载本次任务类型对应的 references 文件(流程图 → `flowchart-generation-guide.md`;
|
|
52
|
+
表单 → `a2ui-input-spec.md`),而非凭记忆套模板。
|
|
53
|
+
- [ ] 产物已逐条通过该 references 文件中的「自检清单」。
|
|
54
|
+
- [ ] 最终回复只含「规程要求的产物 + 一句中文状态说明」,没有规程之外的自然语言摘要 / 条目列表 /
|
|
55
|
+
草稿。
|
|
56
|
+
|
|
57
|
+
> 如果你发现自己在没有读取 references 的情况下准备直接拼装 Mermaid 或 ui.json,**停下,先加载文件**。
|
|
58
|
+
> references 是本技能正确性的唯一来源;SKILL.md 故意不复制其细节,以避免两处规则漂移。
|
|
59
|
+
|
|
60
|
+
## 关键边界(速记,细节以 references 为准)
|
|
61
|
+
|
|
62
|
+
- 流程图:第一个 Mermaid 块必须是 `flowchart TD` 总览图;每个块都要带完整 6 个 `classDef` 配色,
|
|
63
|
+
禁止纯灰白单色;子图各自独立、不跨块引用节点 ID;子图 ≤ 6。
|
|
64
|
+
- 表单:`ui.json` 是**纯 A2UI Schema JSON**(无 ` ```a2ui ` 围栏、无 Markdown 包裹),字段精简
|
|
65
|
+
(2~6 个);运行期 HITL 用 ` ```a2ui ` 围栏、按需生成、不写文件;向目标 SKILL.md 注入提示需
|
|
66
|
+
幂等(检测 `<!-- a2ui:input-hint -->` 标记)。
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[
|
|
2
|
+
{ "query": "帮我把这个 Skill 的工作流程画成流程图", "should_trigger": true },
|
|
3
|
+
{ "query": "给 ~/.openclaw/workspace/skills/daily-report 整理一份 FLOWCHART.md", "should_trigger": true },
|
|
4
|
+
{ "query": "这个 skill 的 FLOWCHART 渲染失败了,节点全是灰的,帮我修一下", "should_trigger": true },
|
|
5
|
+
{ "query": "现在的流程图太长了,能不能拆成几张子图分阶段看", "should_trigger": true },
|
|
6
|
+
{ "query": "把 SKILL.md 里描述的步骤可视化出来", "should_trigger": true },
|
|
7
|
+
{ "query": "mermaid 报语法错误,菱形判断节点那里挂了", "should_trigger": true },
|
|
8
|
+
{ "query": "给这个 skill 做一个第一次运行的输入表单", "should_trigger": true },
|
|
9
|
+
{ "query": "我想让这个 skill 启动时先问用户几个参数,做成 ui.json", "should_trigger": true },
|
|
10
|
+
{ "query": "执行到一半需要用户确认一下选项,弹个表单让他选", "should_trigger": true },
|
|
11
|
+
{ "query": "这个工作台 skill 第一次交互要采集哪些字段,帮我配一下", "should_trigger": true },
|
|
12
|
+
{ "query": "把我们团队的请假审批业务流程画成一张架构图放进 PPT", "should_trigger": false },
|
|
13
|
+
{ "query": "用 mermaid 给我画一个 React 组件渲染生命周期的时序图讲课用", "should_trigger": false },
|
|
14
|
+
{ "query": "帮我给落地页设计一个漂亮的注册表单 UI,要 Tailwind 样式", "should_trigger": false },
|
|
15
|
+
{ "query": "解释一下 mermaid 的 classDef 语法是干嘛的", "should_trigger": false },
|
|
16
|
+
{ "query": "帮我把这段 markdown 转成 PDF", "should_trigger": false },
|
|
17
|
+
{ "query": "读一下这个 SKILL.md 然后总结它支持哪些功能", "should_trigger": false },
|
|
18
|
+
{ "query": "给数据库设计一个 ER 图", "should_trigger": false },
|
|
19
|
+
{ "query": "我的 Excel 预算表里公式算错了,帮我修", "should_trigger": false },
|
|
20
|
+
{ "query": "skill 跑出来的结果不对,逻辑有 bug 帮我 debug 代码", "should_trigger": false },
|
|
21
|
+
{ "query": "把这个流程图导出成 PNG 图片发给我", "should_trigger": false }
|
|
22
|
+
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "skill-workbench-mermaid-guard",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "帮我把这个 skill 的工作流程画成流程图,写进它的 FLOWCHART.md。它的 SKILL.md 里写了:先读输入,判断是否满足条件,满足就执行主流程并输出结果,不满足就返回限制说明。",
|
|
7
|
+
"expected_output": "一张 flowchart TD 总览图,包含开始/判断/主流程/成功结束/失败结束节点,全部节点带语义化颜色(classDef + :::className),可直接渲染;结尾一句中文状态说明。",
|
|
8
|
+
"files": [],
|
|
9
|
+
"assertions": [
|
|
10
|
+
"回复仅包含一个 `##` 标题 + 一个 ```mermaid 代码块 + 结尾一句状态说明,没有额外的分析或条目列表",
|
|
11
|
+
"Mermaid 块首行是 flowchart TD",
|
|
12
|
+
"Mermaid 块内完整声明了 6 个 classDef(startNode/endOk/endErr/decision/process/phase)",
|
|
13
|
+
"开始节点用 :::startNode、判断节点用 :::decision、成功结束用 :::endOk、失败结束用 :::endErr",
|
|
14
|
+
"所有含中文的节点标签都用双引号包裹",
|
|
15
|
+
"判断节点为菱形 {\"...\"} 且带 :::decision",
|
|
16
|
+
"代码块以 ```mermaid 开头并正确闭合"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": 2,
|
|
21
|
+
"prompt": "这是现有的 FLOWCHART.md,渲染出来全是灰白没颜色,而且我看判断节点写成了 B{是否继续?}。帮我修好。\n```mermaid\nflowchart TD\n A[开始] --> B{是否继续?}\n B -->|yes| C[执行]\n B -->|no| D[结束]\n```",
|
|
22
|
+
"expected_output": "修复后的 Mermaid:补齐 6 个 classDef 与每个节点的颜色类,中文标签加双引号,菱形问号改全角并双引号,边标签短化;保留原结构。",
|
|
23
|
+
"files": [],
|
|
24
|
+
"assertions": [
|
|
25
|
+
"输出补齐了完整的 6 个 classDef 声明",
|
|
26
|
+
"每个节点都加上了正确语义的 :::className",
|
|
27
|
+
"判断节点写成 {\"是否继续?\"} 形式并带 :::decision",
|
|
28
|
+
"边标签使用「是/否」等短标签而非 yes/no 长串",
|
|
29
|
+
"保留了原有的开始→判断→执行/结束结构,未无故新增图"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 3,
|
|
34
|
+
"prompt": "给这个目标 skill 做一个第一次运行的输入表单 ui.json。它需要用户提供:主题(必填,单行文本)、输出语言(中文/英文,单选,默认中文)、条数(数字,默认 3)。",
|
|
35
|
+
"expected_output": "一个纯 A2UI Schema JSON(无 ```a2ui 围栏、无 Markdown 包裹),含 version/skill/fields,字段类型与预填值正确;并向目标 SKILL.md 幂等注入 a2ui 提示片段。",
|
|
36
|
+
"files": [],
|
|
37
|
+
"assertions": [
|
|
38
|
+
"产出的是纯 JSON 对象,没有被 ```a2ui 或其它 Markdown 围栏包裹",
|
|
39
|
+
"顶层含非空 fields 数组,每个字段有唯一 key",
|
|
40
|
+
"语言字段为 select 或 radio 且带 options,预填 value 为「中文」",
|
|
41
|
+
"条数字段 type 为 number 且预填 value 为 3",
|
|
42
|
+
"主题字段 required 为 true",
|
|
43
|
+
"提到向目标 SKILL.md 注入 a2ui:input-hint 提示且检测标记避免重复"
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# A2UI 输入表单规范(ui.json 与运行期 a2ui 块)
|
|
2
|
+
|
|
3
|
+
本文件定义 Skills 工作台中 A2UI(Agent-to-UI)输入表单的 Schema、字段约定、生成规则与目标
|
|
4
|
+
Skill 提示注入方式。A2UI 用于把"首次触发 Skill 时缺失的关键信息"或"Skill 执行过程中的 HITL
|
|
5
|
+
确认/补充"以结构化表单形式呈现给用户,替代纯自然语言追问。
|
|
6
|
+
|
|
7
|
+
A2UI 有两种载体,二者使用同一套 Schema 与同一个解析器:
|
|
8
|
+
|
|
9
|
+
1. **`ui.json`(稳定首次交互)**:作为目标 Skill 目录下的产物文件(与 `FLOWCHART.md` 同级),
|
|
10
|
+
保存该 Skill 第一次交互需要采集的输入表单。由工作台「A2UI 调试」选项卡读取并渲染。
|
|
11
|
+
2. **运行期 ` ```a2ui ` 代码块(按需 HITL)**:当 Skill 执行过程中确实需要用户补充信息或确认时,
|
|
12
|
+
助手直接在回复里输出一个 ` ```a2ui ` 围栏 JSON 代码块,chat 会动态渲染为可交互表单。
|
|
13
|
+
运行期表单**按需动态生成,不预先写入文件**。
|
|
14
|
+
|
|
15
|
+
## A2UI Schema
|
|
16
|
+
|
|
17
|
+
A2UI 表单是一段 JSON 对象,顶层字段:
|
|
18
|
+
|
|
19
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
20
|
+
|------|------|------|------|
|
|
21
|
+
| `version` | number | 否 | Schema 版本,固定为 `1`(缺省按 1 处理)|
|
|
22
|
+
| `skill` | string | 否 | 目标 Skill 标识(slug)|
|
|
23
|
+
| `title` | string | 否 | 表单标题 |
|
|
24
|
+
| `description` | string | 否 | 表单说明 |
|
|
25
|
+
| `fields` | array | **是** | 字段列表,至少 1 项;为空则整张表单降级为代码块 |
|
|
26
|
+
| `submit` | object | 否 | `{ "label": "提交按钮文案" }` |
|
|
27
|
+
|
|
28
|
+
每个 `fields` 元素:
|
|
29
|
+
|
|
30
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
31
|
+
|------|------|------|------|
|
|
32
|
+
| `key` | string | **是** | 字段名,提交时作为键;缺失该字段会被丢弃 |
|
|
33
|
+
| `label` | string | 否 | 显示标签(缺省回退为 `key`)|
|
|
34
|
+
| `type` | string | 否 | 控件类型,见下表;未知类型降级为 `text` |
|
|
35
|
+
| `required` | boolean | 否 | 是否必填 |
|
|
36
|
+
| `value` | string \| string[] \| boolean \| object \| object[] | 否 | 预填值(见「预填 value 来源」)|
|
|
37
|
+
| `placeholder` | string | 否 | 占位提示 |
|
|
38
|
+
| `options` | array | 选项类必填 | `[{ "label": "...", "value": "..." }]` 或字符串数组 |
|
|
39
|
+
| `accept` | string | 否 | 仅 `file` 类型;MIME 过滤,如 `".pdf,.docx"` 或 `"image/*"` |
|
|
40
|
+
| `multiple` | boolean | 否 | 仅 `file` 类型;为 `true` 时允许选择多个文件 |
|
|
41
|
+
|
|
42
|
+
### 支持的字段类型
|
|
43
|
+
|
|
44
|
+
| type | 控件 | value 形态 |
|
|
45
|
+
|------|------|-----------|
|
|
46
|
+
| `text` | 单行文本 | string |
|
|
47
|
+
| `textarea` | 多行文本 | string |
|
|
48
|
+
| `number` | 数字输入 | string |
|
|
49
|
+
| `select` | 下拉单选 | string(option.value)|
|
|
50
|
+
| `radio` | 单选按钮组 | string(option.value)|
|
|
51
|
+
| `checkbox` | 单个勾选 | boolean |
|
|
52
|
+
| `multiselect` | 多选框组 | string[](多个 option.value)|
|
|
53
|
+
| `file` | 文件上传 | `{ name, mimeType, dataUrl }` 或其数组(`multiple` 为 true 时)|
|
|
54
|
+
|
|
55
|
+
`select` / `radio` / `multiselect` 必须提供 `options`;缺失时该字段降级为 `text`。
|
|
56
|
+
|
|
57
|
+
`file` 类型字段提交时,文件数据会作为聊天附件一并发送给 Agent;文本消息中仅包含文件名摘要。
|
|
58
|
+
可通过 `accept` 限制可选文件类型(如 `".pdf,.docx"`、`"image/*"`),通过 `multiple: true` 启用多文件选择。
|
|
59
|
+
|
|
60
|
+
### 何时优先使用 `file` 类型(强制语义识别)
|
|
61
|
+
|
|
62
|
+
以下任意一种字段语义出现时,**必须**使用 `type: "file"`,不要使用 `text` 或 `textarea` 让用户手填路径或粘贴内容:
|
|
63
|
+
|
|
64
|
+
- 字段标签或说明含「数据来源 / 数据文件 / 数据集 / 上传 / 附件 / 导入」等关键词。
|
|
65
|
+
- 字段需要 CSV / Excel(xlsx, xls) / JSON / TSV / Parquet / PDF / Word / PPT / 图片 / 音视频 等二进制或半结构化文件。
|
|
66
|
+
- 占位符示例提到「文件路径」「文件 URL」「上传 ...」「拖入 ...」。
|
|
67
|
+
- Skill 的 SKILL.md 描述要求用户提供本地文件、附件、原始素材等。
|
|
68
|
+
|
|
69
|
+
配套要求:
|
|
70
|
+
|
|
71
|
+
- 必须设置 `accept`,准确列出该 Skill 支持的扩展名或 MIME(例如数据分析类设为 `".csv,.xlsx,.xls,.json,.tsv,.parquet"`)。
|
|
72
|
+
- 当业务确实可能需要多个文件(多份数据集、批量素材)时设置 `multiple: true`,否则保持单文件。
|
|
73
|
+
- 反例:`{"key":"data_source","type":"text","placeholder":"CSV 文件路径"}` ❌——必须改为 `type: "file"` + `accept`。
|
|
74
|
+
|
|
75
|
+
如果同一字段同时可能是文件**或**字符串(如「数据库连接串 OR CSV 文件」),请拆成两个字段:一个 `file`、一个 `text`,并通过 `placeholder`/`label` 区分;不要混在一个 `text` 里。
|
|
76
|
+
|
|
77
|
+
## 预填 value 来源
|
|
78
|
+
|
|
79
|
+
生成表单前,先从上下文中尽可能识别已知信息并写入 `value`,减少用户输入成本:
|
|
80
|
+
|
|
81
|
+
- 用户已经在对话里提供的内容(如已粘贴的正文、已说明的目标)。
|
|
82
|
+
- 目标 Skill 的 SKILL.md 中的默认值或推荐选项。
|
|
83
|
+
- 合理的常用默认(如条数默认 3、语言默认"中文")。
|
|
84
|
+
|
|
85
|
+
只把**确有依据**的值写入 `value`;不要臆造。`required` 字段即使已预填也保留必填校验。
|
|
86
|
+
|
|
87
|
+
## 生成期规则:写入 `ui.json`
|
|
88
|
+
|
|
89
|
+
当任务是"为目标 Skill 生成首次交互表单"时:
|
|
90
|
+
|
|
91
|
+
1. 通读目标 Skill 的 SKILL.md,识别其第一次运行真正需要用户提供的关键输入(通常 2~6 个字段)。
|
|
92
|
+
2. 产出**纯 A2UI Schema JSON**(不要包裹 ` ```a2ui ` 围栏,不要附加 Markdown),写入目标 Skill
|
|
93
|
+
目录下的 `ui.json`。
|
|
94
|
+
3. `skill` 字段填目标 Skill 的 slug;为每个字段设置合理的 `type`、`required`、`label` 与可用的
|
|
95
|
+
`value` 预填。
|
|
96
|
+
4. 保持字段精简:只采集"不问就无法开始"的信息,过程性细节留给运行期 HITL。
|
|
97
|
+
5. 同时向目标 SKILL.md 幂等注入 A2UI 使用提示(见下方「目标 Skill 提示注入片段」)。
|
|
98
|
+
6. **最终回复格式**:先用一个 ` ```a2ui ` 代码块回显写入 ui.json 的表单内容(便于预览),
|
|
99
|
+
再追加一句中文状态说明,明确说明已写入 ui.json 与是否注入 SKILL.md 提示。
|
|
100
|
+
不要输出分析过程,不要停留在中间状态。
|
|
101
|
+
|
|
102
|
+
## 运行期规则:输出 ` ```a2ui ` 块
|
|
103
|
+
|
|
104
|
+
当 Skill 执行过程中需要 HITL(用户补充/确认)时:
|
|
105
|
+
|
|
106
|
+
1. 在助手回复中直接输出一个 ` ```a2ui ` 围栏代码块,块内为符合上述 Schema 的 JSON。
|
|
107
|
+
2. 只在**真正需要用户输入**时输出表单;不要为纯通知性内容生成表单。
|
|
108
|
+
3. 表单提交后用户会收到一条结构化文字消息(人类可读摘要 + 一段 `[a2ui-data] {json}` 机器可读
|
|
109
|
+
键值),据此继续执行即可。
|
|
110
|
+
4. 运行期表单**不写入文件**,随用随生成。
|
|
111
|
+
|
|
112
|
+
## 目标 Skill 提示注入片段(幂等)
|
|
113
|
+
|
|
114
|
+
为让目标 Skill 在合适位置主动使用 A2UI,向其 SKILL.md 注入下述片段。注入需**幂等**:若已存在
|
|
115
|
+
`<!-- a2ui:input-hint -->` 标记则跳过,不重复追加。
|
|
116
|
+
|
|
117
|
+
```markdown
|
|
118
|
+
<!-- a2ui:input-hint -->
|
|
119
|
+
## 输入交互(A2UI)
|
|
120
|
+
|
|
121
|
+
- 本 Skill 已有 `ui.json` 首次交互表单。**首次被用户触发时,必须先读取 ui.json 并将其内容原样输出为一个 ```a2ui 代码块**,等待用户填写提交后再继续执行。这是强制性要求,不要跳过表单直接开始任务。
|
|
122
|
+
- 执行过程中如需用户补充或确认信息(HITL),也输出一个 ```a2ui 代码块(字段含
|
|
123
|
+
key/label/type/required/value/options),用户提交后据其结构化回复继续执行。
|
|
124
|
+
- 禁止用纯文字追问替代表单;禁止将表单改写为其他格式(Markdown 卡片、HTML 等)。
|
|
125
|
+
- A2UI Schema 与字段约定见 references/a2ui-input-spec.md。
|
|
126
|
+
<!-- /a2ui:input-hint -->
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## 自检清单
|
|
130
|
+
|
|
131
|
+
写入 `ui.json` 或输出 ` ```a2ui ` 块前逐项确认:
|
|
132
|
+
|
|
133
|
+
1. 顶层是合法 JSON 对象,含非空 `fields` 数组。
|
|
134
|
+
2. 每个字段都有唯一 `key`;选项类字段都带 `options`。
|
|
135
|
+
3. `type` 均为受支持类型;预填 `value` 形态与 `type` 匹配(checkbox→boolean,multiselect→string[],file→object)。
|
|
136
|
+
4. 仅采集首次/HITL 真正必需的信息,字段数量克制。
|
|
137
|
+
5. `file` 类型字段设置了合理的 `accept` 限制;不需要多文件时不设置 `multiple`。
|
|
138
|
+
6. `ui.json` 为纯 JSON,无 Markdown / 围栏包裹;运行期表单使用 ` ```a2ui ` 围栏。
|
|
139
|
+
7. 向目标 SKILL.md 注入提示时检测 `<!-- a2ui:input-hint -->` 标记,避免重复注入。
|