원클릭으로
workflow-builder
根据自然语言描述生成 flocks 内置工作流(workflow.md, workflow.json)。当用户提出创建/设计/生成/搭建工作流或任何多步骤流程(如告警调查、事件响应、SOP/Runbook 自动化)时使用本 skill。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
根据自然语言描述生成 flocks 内置工作流(workflow.md, workflow.json)。当用户提出创建/设计/生成/搭建工作流或任何多步骤流程(如告警调查、事件响应、SOP/Runbook 自动化)时使用本 skill。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
使用统一的 Web2CLI 流程捕获网站的 XHR/Fetch 请求,并生成可复用的 CLI、Markdown 文档。通过浏览器的 `cdp-direct` 模式复用用户 Chromium 系浏览器登录态与 CDP 能力。适用于复现登录后操作、沉淀接口调用样例,或基于页面操作生成自动化工具时。
配置现有 Flocks 工作流的发布、集成、触发器和发布配置模板;本 skill 只定义交互协议,具体配置问题必须来自工作流目录内的 guide.md
统一处理浏览器使用任务,支持可见浏览器 CDP 直连、专用 headless CDP、agent-browser。Use when the user asks to browse websites, interact with pages, fill forms, capture screenshots, reuse an existing Chrome/Chromium/Edge login session, work with an already-open browser/sidebar browser, access login-only/internal/dynamic pages, or automate browser actions.
Guide users to create, develop, hide, or delete user-defined custom pages that appear in the WebUI left navigation under Home, with live preview and no restart required. Also guide development of page-scoped backend APIs through the User Defined Page Backend API Runtime when built-in APIs are insufficient. Trigger when the user asks to create, remove, or delete a custom page, user-defined page, dashboard, navigation tab, integrate custom APIs for a page, or sends messages such as "create a custom page", "delete custom page", "remove user-defined page", "创建自定义页面", "删除自定义页面", "用户自定义页面", "自定义页面", "左侧导航页面", "首页下面的页面", "页面数据来源", "自定义 API", or wants help understanding how custom pages work in Flocks.
Create new sub-agents (subagents) by generating YAML config and prompt files in ~/.flocks/plugins/agents/. The created agent can be delegated to by Rex via delegate_task. Use when the user asks to create, add, or generate a new agent.
用于处理 OneSEC/OneDNS 终端安全平台相关任务,适合通过API或者结合浏览器进行以下任务: 终端安全调查、威胁事件分析、终端告警检索、行为日志排查、IOC 查询、恶意文件分析、DNS 威胁排查、软件与终端资产查询、任务进度查看、审计日志分析、病毒扫描和常见终端处置场景。只要用户提到 OneSEC、微步 EDR等相关操纵需求时,必须先加载本 skill。本 skill 是 OneSEC 平台操作的唯一决策入口:在未阅读本 skill 并完成模式判断前,不要直接调用任何 `onesec_*` tool。
| name | workflow-builder |
| category | system |
| description | 根据自然语言描述生成 flocks 内置工作流(workflow.md, workflow.json)。当用户提出创建/设计/生成/搭建工作流或任何多步骤流程(如告警调查、事件响应、SOP/Runbook 自动化)时使用本 skill。 |
创建模式按以下顺序构建工作流:场景确认与流程设计 → 确认 workflow.md 文档语言 → workflow.md 草稿与确认循环 → workflow.json 生成与验证 → 逐节点测试 → 集成测试 → 性能评估与优化。
产物:
workflow.json中所有可执行节点均为type="python"并自带code。最终交付物固定为:workflow.md、workflow.json。顺序强制:创建工作流时,
workflow.md是唯一的人类意图源。必须先询问用户需要中文还是英文流程说明文档,再按所选语言创建并确认workflow.md,最后基于已确认的workflow.md生成workflow.json。在workflow.md写入并确认前,严禁写入或覆盖workflow.json。
| 文件 | 内容 | 何时读取 |
|---|---|---|
| references/reference.md | 节点类型详解、出边选择行为、分支/循环/Join 规则、Edge Mapping 指南、Tool vs LLM 决策、文件输出规则、报告生成模板、workflow.json 骨架模板 | 生成 workflow.json 前建议读取 |
| references/composition.md | 嵌套工作流(subworkflow)组合格式与展开规则 | 仅在用户需要嵌套工作流时读取 |
| references/workflow_zh.md | 中文 workflow.md 结构模板 | 用户选择中文流程说明文档时读取 |
| references/workflow_en.md | English workflow.md structure template | 用户选择英文流程说明文档时读取 |
| references/workflow_template/ | 工作流创建参考包,包含标准 workflow.md、workflow.json、config.json、guide.md 和 meta.json 模板 | 创建工作流、生成配置模板或补齐 guide.md 前按需读取 |
~/.flocks/plugins/workflows/stream_alert_denoise/workflow.md | 已成型业务工作流示例,展示“功能、流程、输入输出、模块逻辑、发布配置、编辑指南”的写法 | 文件存在且需要参考真实工作流表达时读取 |
在开始任何工作前,必须先用 Todo 工具列出完整任务清单,并在整个过程中实时更新状态(pending → in_progress → completed)。标准 Todo 清单如下,根据实际工作流复杂度增减:
[ ] 0. 核验可用工具列表(读取 registry.py)
[ ] 1. 场景深度确认:与用户对话,明确业务场景与核心目标
[ ] 1. 输出思考维度分析 + Mermaid 流程简图,与用户沟通对齐
[ ] 1. 获取样例数据(用户上传或自动构造后确认)
[ ] 2. 用 Question 工具确认 workflow.md 使用中文还是英文
[ ] 2. 读取对应语言模板 workflow_zh.md 或 workflow_en.md,以及可用业务示例
[ ] 2. 生成单份 workflow.md 草稿(人读描述,包含功能、流程、节点、输入输出、处理逻辑)
[ ] 2. 写入 workflow.md 文件,供页面编辑器展示
[ ] 2. 向用户展示流程摘要并收集修改建议(循环直至满意)
[ ] 2. 确认 workflow.md 已是最新意图源
[ ] 3. 读取 reference.md
[ ] 3. 基于已确认 workflow.md 生成完整 workflow.json(含代码)
[ ] 3. 写入 workflow.json 文件
[ ] 4. 验证 JSON 格式 + Python 语法
[ ] 4. 保存样例数据到 /api/workflow/{id}/sample-inputs
[ ] 5. 逐节点测试:节点 1 - <node_id>
[ ] 5. 逐节点测试:节点 2 - <node_id>
[ ] 5. 逐节点测试:节点 N - <node_id>(按拓扑顺序补充)
[ ] 6. 集成测试:全量运行验证
[ ] 6. 记录各节点及总运行时间
[ ] 7. 性能评估:识别瓶颈节点
[ ] 7. 优化慢节点(并发/缓存/精简 prompt 等)
[ ] 7. 通知用户工作流已就绪
每完成一项立即标记为 completed;每进入一项立即标记为 in_progress。严禁在 Todo 全部完成前宣布任务结束。
生成 workflow 前必须核验可用工具列表与参数签名:
flocks/flocks/tool/registry.py(ToolInfo.parameters 是参数 schema 的权威来源)。run_workflow(在 WORKFLOW_TOOL_BLOCKLIST 中)。目标:通过对话真正理解用户需求,输出完整的思考维度与流程简图,让用户在花时间构建工作流之前就能确认方向。
使用 Question 工具与用户确认以下维度(根据场景选取相关项,不必逐条询问,尽量合并为 1-2 轮对话):
业务背景
数据与工具
流程要求
对话完成后,在消息中输出以下内容供用户确认:
思考维度总结(结构化列举,涵盖:数据流、工具调用链、分支逻辑、异常处理、性能关键点、可扩展性)
流程简图(使用 Mermaid flowchart 语法,清晰展示节点与边关系)
示例格式:
## 思考维度
**数据流**:输入告警 → 资产丰富 → 情报查询 → LLM 分析 → 报告输出
**分支逻辑**:IP 类型判断(内网 / 外网)→ 不同查询策略
**性能关键点**:情报查询可并发;LLM 调用是主要耗时节点
**异常处理**:工具调用失败时降级到日志记录,不中断流程
**可扩展性**:后续可插入 SOAR 工单节点
## 流程简图
\`\`\`mermaid
flowchart TD
A[接收告警] --> B[提取 IP/域名]
B --> C{IP 类型?}
C -->|内网| D[查询资产库]
C -->|外网| E[查询威胁情报]
D --> F[汇总上下文]
E --> F
F --> G[LLM 分析]
G --> H[生成报告]
\`\`\`
在流程简图得到用户认可后,请用户上传一条完整的样例输入数据(JSON 格式):
样例数据将用于后续每个节点的逐步测试,是测试阶段的核心依据。获得样例后,待工作流 ID 确定时调用
POST /api/workflow/{id}/sample-inputs保存(body:{ "sampleInputs": <样例 JSON 对象> })。
目标:先把工作流的业务意图、节点结构、输入输出和处理逻辑写成可读、可编辑的
workflow.md。页面左侧编辑器以workflow.md表达工作流,用户应先在这里确认意图;只有确认后才能生成workflow.json。
创建 workflow.md 前,必须用 Question 工具询问用户需要哪种流程说明文档:
workflow.md。workflow.md。规则:
workflow.md。workflow_zh.md、workflow_en.md、workflow.en.md 或其它语言副本。workflow_zh.md / workflow_en.md 只是本 skill 内部的结构模板。references/workflow_template/ 只是本 skill 内部的创建参考包,严禁复制成可扫描的 workflow_template 工作流目录;需要模板内容时,只读取其中的文件并改造成当前真实工作流。workflow.md 前必须明确询问并得到选择。workflow.md 必须让人读得懂,也必须足够结构化,便于后续稳定生成 workflow.json。每个步骤必须包含:
tool.run_safe(...) 获取数据 → llm.ask(...) 分析 → tool.run('write', ...) 落盘。tool.run_safe(),返回 {"success", "text", "obj", "error"} 统一包络。~/.flocks/workspace/outputs/<YYYY-MM-DD>/ 目录下,详见 reference.md § 文件输出规则。config.json 模板和 Storage/SQL 管理。write 工具将单份 workflow.md 写入文件(路径与第 9 节一致,例如 .../plugins/workflows/<id>/workflow.md)。
python3 -c "import os; print(os.path.expanduser('~/.flocks/plugins/workflows/<id>'))";项目目录可先解析 workspace(从 cwd 向上第一个含 .flocks 的目录)再拼接 /.flocks/plugins/workflows/<id>。.flocks/plugins/workflows/<id>/ 相对仓库根随手写入错误位置),否则 WebUI 可能无法从实际扫描目录读到文件。workflow.en.md 或语言副本;UI 和生成流程只认当前工作流目录下的 workflow.md。workflow.md,请在左侧编辑器查看并确认。需要调整节点、输入输出或处理逻辑时,请先改 workflow.md。」workflow.json 生成时,必须使用 Question 工具或等待页面 diff 的接受/拒绝结果;不要用普通文本提问替代确认。收集用户对 workflow.md 的修改建议,按照以下循环执行,直到用户确认满意:
接收用户反馈
↓
分析修改需求(功能描述、节点职责、输入输出、处理逻辑、分支关系)
↓
更新 workflow.md
↓
重新写入文件
↓
向用户展示更新摘要,并用 Question 工具或页面 diff 请用户确认
↓
[满意] → 进入第三阶段,基于已确认 workflow.md 生成 workflow.json
[还有修改] → 继续循环
禁止事项:不要为了提前展示流程图而先写一个简化
workflow.json。当前创建流程必须让workflow.md先落盘并完成确认,workflow.json只能作为已确认workflow.md的机器执行产物。
根据已确认的 workflow.md 生成严格可执行的 workflow.json。生成前必须读取最新磁盘上的 workflow.md,并建议读取 references/reference.md。
type="python" 节点,必须同时包含 code(执行逻辑)+ description(文档说明)。logic 节点仅在用户明确要求"不写代码"或快速原型时使用,运行时由 codegen 兜底。顶层字段:
start 必须等于某个 nodes[i].idnodes[].id 必须唯一name/description(可选)用于工作流级别说明version 会被运行时忽略,不需要生成Node 约束(对应 flocks/workflow/models.py):
python:code 必须非空logic:description 必须非空python → 所有出边触发;logic/branch/loop → 通过 select_key 取值做 label 匹配选边join=true:等待所有入边到齐再执行一次代码约束:
exec() 模型,严禁 await/async def/async for/async with。确保节点的代码要可以独立运行。Edge 约束:
"from" 而非 "from_";from/to 引用存在的 node id;order ≥ 0。workflow.md 每步对应一个节点,id 用 snake_case。outputs[...] 中体现。Tool: xxx 标记 → 对应节点 description 保留。tool.run(..., **inputs),用 edge.mapping/edge.const 规整输入到匹配工具参数形状。bool 值 label 用 "true"/"false";str 值精确匹配;无命中回退到空 label 默认边。上游必须把 select_key 所需字段写入 payload。join=truellm.ask() 或 tool.run('write', ...) 的节点,禁止被两条非互斥路径直达,必须先经 join 节点join=true)归一化多分支输出 → 再传给后续步骤辅助函数:
| 函数 | 说明 |
|---|---|
tool.run(name, **inputs) | 返回 ToolResult.output(类型 Any,通常是字符串),失败抛异常 |
tool.run_safe(name, **inputs) | 推荐,返回 {"success": bool, "text": str, "obj": Any, "error": str|None},永不抛异常 |
llm.ask(prompt) | 调用 LLM,返回字符串 |
get_path(path) | payload 深层取值 |
⚠️ 返回值类型警告(常见 Bug 源):
tool.run() 返回的是 Any 类型,大多数工具返回的是字符串(格式化文本),不是字典。严禁直接对返回值调用 .get() 等字典方法。tool.run_safe()["obj"] 也是 Any 类型,可能是 str、dict、list 或 None。使用前必须检查类型。json.loads() 解析后再作为字典操作。# ❌ 错误:直接在 tool.run() 返回值上调用 .get()
result = tool.run('some_tool', ip=ip)
value = result.get("key") # AttributeError: 'str' object has no attribute 'get'
# ❌ 错误:假设 obj 一定是 dict
result = tool.run_safe('some_tool', ip=ip)
value = result["obj"].get("key") # obj 可能是 str,同样报错
# ✅ 正确:使用 text 做字符串操作
result = tool.run_safe('some_tool', ip=ip)
outputs["text"] = result["text"] # text 永远是 str,安全
# ✅ 正确:需要结构化数据时,先检查 obj 类型
result = tool.run_safe('some_tool', ip=ip)
obj = result["obj"]
if isinstance(obj, dict):
value = obj.get("key")
elif isinstance(obj, str):
import json
try:
parsed = json.loads(obj)
value = parsed.get("key") if isinstance(parsed, dict) else None
except json.JSONDecodeError:
value = None
tool.run_safe() 使用指南:
result["text"](永远是 str,最安全)result["obj"] + isinstance 类型检查 + result["success"] 判断tool.run_safe(),且优先使用 result["text"]tool.run()(仍需注意返回值可能是字符串)数据落盘与传递:
~/.flocks/workspace/outputs/<YYYY-MM-DD>/(详见全局文件输出约定)inputs 和 outputs 字典,运行时浅合并 payload = {**inputs, **outputs}⚠️ 生成后必须使用
write写入到文件。写入完成后进入第四阶段验证,验证通过前不得进入逐节点测试。
workflow.json 写入后必须完成以下验证与准备工作:
json.load 确认 JSON 格式正确。type="python" 节点的 code 执行 compile(code, "<node_id>", "exec") 确认 Python 语法正确。workflow.json 并再次验证。POST /api/workflow/{id}/sample-inputs,body 为 { "sampleInputs": <样例 JSON 对象> }。只有以上步骤全部通过后,才能进入第五阶段逐节点测试。
⚠️ 核心原则:绝不轻易停止。 无论遇到什么错误,都必须持续分析、修复、重试,直到每个节点都运行正常为止。
workflow.json 生成并通过语法验证后,必须执行本阶段,确保每个节点可以真实运行。
使用阶段 1 收集并保存的样例输入(可通过 GET /api/workflow/{id}/sample-inputs 获取)。若样例数据不存在,用 Question 工具向用户索取后保存。
必须严格按照拓扑顺序(从 start 开始,沿出边逐步推进),一次只测试一个节点,当前节点完全通过后才能测试下一个。
使用 run_workflow_node 工具(内置工具,直接可用)执行每个节点:
run_workflow_node(
workflow = "/absolute/path/to/workflow.json", # 或直接传 workflow dict
node_id = "<node_id>",
inputs = <inputs_dict>
)
返回结构:{ node_id, outputs, stdout, error, traceback, duration_ms, success }
⚠️ 注意:使用
run_workflow_node工具,不要用run_workflow(那是全量运行)。
执行规则(逐节点):
第一个节点的 inputs = 用户样例数据(阶段 1 收集的样例 JSON)
后续节点的 inputs = 前一个成功节点返回的 outputs(若节点有多个前驱,合并所有前驱的 outputs)
当前节点 success=false 或 error 不为 null 时,必须原地 Debug,循环直到通过,才能进入下一节点:
error、traceback、stdout 字段,定位根本原因code(或 edge mapping、输入字段名等)workflow.json(保存到磁盘)run_workflow_node 测试同一节点(inputs 不变)success=true,才能推进到下一节点success=true 不等于节点真正通过,还必须检查输出数据是否有实际内容:
outputs 中的关键字段:若关键字段为空字符串、null、空列表 []、空字典 {} 或全为默认占位值,必须调查原因每个节点真正通过后(success=true 且关键输出非空),记录 duration_ms:
✅ 节点 <node_id>:success=true,关键输出非空,耗时 <duration_ms> ms
所有节点逐一通过后,执行一次完整的工作流运行:
POST /api/workflow/{id}/run
Body: { "inputs": <样例数据> }
若全量运行失败,继续按第五阶段的方式定位失败节点并修复,直到全量运行成功。全量运行失败不是停止的理由,必须继续 Debug 直到通过。
全量运行成功后,汇总并输出完整的节点耗时报告:
📊 运行时间汇总
─────────────────────────────────
节点 <node_id_1>:<duration_ms> ms
节点 <node_id_2>:<duration_ms> ms
节点 <node_id_N>:<duration_ms> ms
─────────────────────────────────
总计(逐节点累计):<sum> ms
全量运行总耗时:<total_ms> ms(来自 POST /run 响应)
目标:识别耗时瓶颈节点,在不影响正确性的前提下尽可能优化。
基于第六阶段的耗时报告,识别以下类型的慢节点(按优先级排序):
| 类型 | 判断标准 | 常见原因 |
|---|---|---|
| 超慢节点 | duration_ms > 10000(10s) | LLM prompt 过长、串行工具调用、无效重试 |
| 慢节点 | duration_ms > 3000(3s) | 单次工具调用本身耗时、数据处理低效 |
| 占比失衡 | 单节点 > 总时间 50% | 该节点是整体瓶颈,优先优化 |
LLM 节点优化
工具调用优化
concurrent.futures.ThreadPoolExecutor)outputs 中缓存结果避免重复调用数据传递优化
对每个识别出的瓶颈节点:
code 实现优化success=true 且关键输出不变duration_ms 有明显下降(> 20% 提升才视为有效优化)优化完成后输出对比报告:
⚡ 性能优化报告
─────────────────────────────────────────────
节点 优化前(ms) 优化后(ms) 提升
<node_id_1> 3200 800 75% ← 并发查询
<node_id_2> 8500 4200 51% ← 精简 prompt
─────────────────────────────────────────────
全量运行总耗时:<before> ms → <after> ms
当用户表达的是修改/调整/优化已有工作流(而非从零创建)时,进入本模式。
满足以下任一条件即为修改请求:
workflow.jsonread 工具读取 workflow.json 和 workflow.md。Question 工具确认:
修改模式下,必须先更新 MD 文档,经用户确认后再修改 JSON。严禁直接跳到 JSON 修改。
workflow.md(保留原有结构,仅修改受影响的步骤描述)。write 工具将更新后的 workflow.md 写入文件(路径:与同 ID 的 workflow.json 所在目录一致,见第 9 节)。Question 工具向用户展示变更摘要,询问确认。优先最小化变更原则:
edit 工具精准替换目标字段遵守所有 workflow.json 约束(见第 3 节规范)。
修改完成后:
json.load 确认 JSON 格式正确type="python" 节点的 code 执行 compile 验证语法写回成功后,向用户简述做了哪些改动(diff 式自然语言说明)。
新建工作流时,写入路径必须在 用户级(全局)目录下:
~/.flocks/plugins/workflows/<slug-or-folder>/(workflow.json、workflow.md、meta.json 由 API 写入时可能同目录)
~/.flocks/workspace/outputs/<YYYY-MM-DD>/(见全局文件输出约定)系统会按从低到高优先级扫描下列目录(同一逻辑 ID 冲突时后扫描的覆盖先扫描的)。写文件时应优先落在列表中最后的「规范」目录,避免被后续扫描覆盖或混淆。
全局(用户目录下)
| 优先级(低→高) | 路径 | 说明 |
|---|---|---|
| 1 | ~/.flocks/plugins/workflow/ | 全局 legacy |
| 2 | ~/.flocks/plugins/workflows/ | 全局规范路径(推荐新工作流露地) |
项目(workspace 下)
| 优先级(低→高) | 路径 | 说明 |
|---|---|---|
| 1 | <workspace>/.flocks/plugins/workflow/ | 项目 legacy |
| 2 | <workspace>/.flocks/plugins/workflows/ | 项目规范路径(推荐新工作流露地) |
必须使用绝对路径写入文件。
全局目录示例:
python3 -c "import os; print(os.path.expanduser('~/.flocks/plugins/workflows/<folder>'))"
解析项目 workspace 并拼接规范目录示例:
python3 -c "from pathlib import Path; p=Path.cwd(); ws=next((x for x in [p,*p.parents] if (x/'.flocks').is_dir()), p); print(ws/'.flocks/plugins/workflows/<folder>')"
正确示例:
<HOME_DIR>/.flocks/plugins/workflows/alert_triage/workflow.json ✅(用户级)错误示例:
.flocks/plugins/workflows/alert_triage/workflow.json ❌(未展开相对路径,易写错磁盘位置)~/.flocks/workflow/... 作为新工作流首选 ❌(仍可被扫描,但与当前规范及 API 默认落盘不一致)在整个 Workflow 创建流程中,以下原则不可违反:
本 skill 内置两份流程说明文档模板:
创建工作流时,先用 Question 工具确认用户需要哪种语言,然后读取对应模板,把真实内容写入工作流目录下唯一的 workflow.md。