fabro-workflow-factory by aradotso/trending-skills
npx skills add https://github.com/aradotso/trending-skills --skill fabro-workflow-factory技能来自 ara.so — Daily 2026 Skills 集合。
Fabro 是一个用 Rust 编写的开源 AI 编码工作流编排器。它允许您将智能体流水线定义为 Graphviz DOT 图——包含分支、循环、人工审批关卡、多模型路由和云沙箱执行——然后将其作为持久服务运行。您定义流程;智能体执行它;您只在关键环节进行干预。
# 通过 Claude Code(推荐)
curl -fsSL https://fabro.sh/install.md | claude
# 通过 Codex
codex "$(curl -fsSL https://fabro.sh/install.md)"
# 通过 Bash
curl -fsSL https://fabro.sh/install.sh | bash
安装后,运行一次性设置和每个项目的初始化:
fabro install # 全局一次性设置
cd my-project
fabro init # 每个项目的设置(创建 .fabro/ 配置)
# 工作流管理
fabro run <workflow.dot> # 执行工作流
fabro run <workflow.dot> --watch # 流式传输实时输出
fabro runs # 列出所有运行
fabro runs show <run-id> # 检查特定运行
# 人工介入
fabro approve <run-id> # 批准一个待处理的关卡
fabro reject <run-id> # 拒绝 / 修订一个待处理的关卡
# 沙箱访问
fabro ssh <run-id> # 进入正在运行的沙箱的 shell
fabro preview <run-id> <port> # 在本地暴露一个沙箱端口
# 回顾
fabro retro <run-id> # 查看运行回顾(成本、持续时间、叙述)
# 配置
fabro config # 查看当前配置
fabro config set <key> <value> # 设置配置值
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
工作流是使用 Graphviz DOT 语言并带有 Fabro 特定属性的 .dot 文件。
| 形状 | 含义 |
|---|---|
Mdiamond | 开始节点 |
Msquare | 退出节点 |
rectangle (默认) | 智能体节点 (LLM 轮次) |
hexagon | 人工关卡 (暂停等待批准) |
// hello.dot
digraph HelloWorld {
graph [
goal="Say hello and write a greeting file"
model_stylesheet="
* { model: claude-haiku-4-5; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
greet [label="Greet", prompt="Write a friendly greeting to hello.txt"]
start -> greet -> exit
}
fabro run hello.dot
Fabro 在图上使用类似 CSS 的 model_stylesheet 声明来将节点路由到模型。使用类来定位节点组。
digraph PlanImplementReview {
graph [
goal="Plan, implement, and review a feature"
model_stylesheet="
* { model: claude-haiku-4-5; reasoning_effort: low; }
.planning { model: claude-opus-4-5; reasoning_effort: high; }
.coding { model: claude-sonnet-4-5; reasoning_effort: high; }
.review { model: gpt-4o; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
plan [label="Plan", class="planning", prompt="Analyze the codebase and write plan.md"]
implement [label="Implement", class="coding", prompt="Read plan.md and implement every step"]
review [label="Review", class="review", prompt="Cross-review the implementation for bugs and clarity"]
start -> plan -> implement -> review -> exit
}
model: <model-id> # 例如 claude-sonnet-4-5, gpt-4o, gemini-2-flash
reasoning_effort: low|medium|high
provider: anthropic|openai|google
使用 shape=hexagon 来暂停执行以等待人工批准。转换边用 [A] (批准) 和 [R] (修订/拒绝) 标记。
digraph PlanApproveImplement {
graph [
goal="Plan and implement with human approval"
model_stylesheet="
* { model: claude-sonnet-4-5; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
plan [label="Plan", prompt="Write a detailed implementation plan to plan.md"]
approve [shape=hexagon, label="Approve Plan"]
implement [label="Implement", prompt="Read plan.md and implement every step exactly"]
start -> plan -> approve
approve -> implement [label="[A] Approve"]
approve -> plan [label="[R] Revise"]
implement -> exit
}
通过 CLI 批准或拒绝:
fabro runs # 找到暂停的 run-id
fabro approve <run-id> # 继续执行实现
fabro reject <run-id> --note "Add error handling to the plan"
使用带标签的转换边来构建自动重试/修复循环:
digraph ImplementAndTest {
graph [
goal="Implement a feature and fix failing tests automatically"
model_stylesheet="
* { model: claude-haiku-4-5; }
.coding { model: claude-sonnet-4-5; reasoning_effort: high; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement", class="coding",
prompt="Implement the feature described in TASK.md"]
test [label="Run Tests",
prompt="Run the test suite with `cargo test`. Report pass/fail."]
fix [label="Fix", class="coding",
prompt="Read the test failures and fix the code. Do not change tests."]
start -> implement -> test
test -> exit [label="[P] Pass"]
test -> fix [label="[F] Fail"]
fix -> test
}
通过从单个源节点分出多条边来并发运行多个智能体节点:
digraph ParallelReview {
graph [
goal="Implement then review from multiple perspectives in parallel"
model_stylesheet="
* { model: claude-haiku-4-5; }
.coding { model: claude-sonnet-4-5; }
.critique { model: gpt-4o; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement", class="coding",
prompt="Implement the task in TASK.md"]
sec_review [label="Security Review", class="critique",
prompt="Review the implementation for security issues"]
perf_review [label="Perf Review", class="critique",
prompt="Review the implementation for performance issues"]
summarize [label="Summarize",
prompt="Combine the security and performance reviews into REVIEW.md"]
start -> implement
implement -> sec_review
implement -> perf_review
sec_review -> summarize
perf_review -> summarize
summarize -> exit
}
在提示中使用 {variable} 插值。在运行时传递变量:
digraph FeatureWorkflow {
graph [
goal="Implement {feature_name} from the spec"
model_stylesheet="* { model: claude-sonnet-4-5; }"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement {feature_name}",
prompt="Read specs/{feature_name}.md and implement the feature completely."]
start -> implement -> exit
}
fabro run feature.dot --var feature_name=oauth-login
要在隔离的云虚拟机中运行智能体,而不是在本地,请配置 Daytona 沙箱:
fabro config set sandbox.provider daytona
fabro config set sandbox.api_key $DAYTONA_API_KEY
fabro config set sandbox.region us-east-1
然后将沙箱配置添加到您的工作流图中:
digraph SandboxedWorkflow {
graph [
goal="Implement and test in an isolated environment"
sandbox="daytona"
model_stylesheet="* { model: claude-sonnet-4-5; }"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement", prompt="Implement the feature in TASK.md"]
test [label="Test", prompt="Run the full test suite and report results"]
start -> implement -> test -> exit
}
fabro run sandboxed.dot # 启动云虚拟机,运行工作流,然后销毁
fabro ssh <run-id> # 进入正在运行的沙箱 shell 进行调试
fabro preview <run-id> 3000 # 将沙箱端口 3000 转发到本地
Fabro 在每个阶段自动将代码更改和执行元数据提交到 Git 分支。要检查或恢复:
fabro runs show <run-id> # 查看每个阶段的分支名称
git checkout fabro/<run-id>/implement # 检查特定阶段的代码
git diff fabro/<run-id>/plan fabro/<run-id>/implement # 比较阶段间的差异
每次运行后,Fabro 会生成一份回顾,包含成本、持续时间、更改的文件以及由 LLM 撰写的叙述:
fabro retro <run-id>
示例输出:
Run: implement-oauth-2024
Duration: 4m 32s
Cost: $0.043
Files: src/auth.rs (+142), src/lib.rs (+8), tests/auth_test.rs (+67)
Narrative:
The agent successfully implemented OAuth2 PKCE flow. It created the auth
module, integrated with the existing middleware, and added integration tests.
One fix loop was needed after the token refresh test failed.
Fabro 运行一个 API 服务器供编程使用:
fabro serve --port 8080
curl -X POST http://localhost:8080/api/runs \
-H "Content-Type: application/json" \
-d '{
"workflow": "workflows/plan-implement.dot",
"variables": { "feature_name": "dark-mode" }
}'
curl -N http://localhost:8080/api/runs/<run-id>/events
curl -X POST http://localhost:8080/api/runs/<run-id>/approve \
-H "Content-Type: application/json" \
-d '{ "decision": "approve" }'
# 必需 — 至少一个 LLM 提供商密钥
export ANTHROPIC_API_KEY=...
export OPENAI_API_KEY=...
export GOOGLE_API_KEY=...
# 可选 — 云沙箱
export DAYTONA_API_KEY=...
# 可选 — Fabro API 服务器认证
export FABRO_API_TOKEN=...
my-project/
├── .fabro/ # Fabro 配置(由 `fabro init` 创建)
│ └── config.toml
├── workflows/ # 您的 DOT 工作流定义
│ ├── plan-implement.dot
│ ├── fix-loop.dot
│ └── ensemble-review.dot
├── specs/ # 提示中引用的自然语言规范
│ └── feature-name.md
└── src/ # 您的实际源代码
digraph SpecDriven {
graph [
goal="Implement from spec with LLM-as-judge verification"
model_stylesheet="
* { model: claude-sonnet-4-5; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement",
prompt="Read specs/feature.md and implement it completely"]
judge [label="Judge",
prompt="Compare the implementation against specs/feature.md. Does it conform? Reply PASS or FAIL with reasons."]
fix [label="Fix",
prompt="Read the judge feedback and fix the implementation"]
start -> implement -> judge
judge -> exit [label="[P] PASS"]
judge -> fix [label="[F] FAIL"]
fix -> judge
}
digraph CheapThenExpensive {
graph [
goal="Draft cheaply, refine with a frontier model"
model_stylesheet="
* { model: claude-haiku-4-5; }
.premium { model: claude-opus-4-5; reasoning_effort: high; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
draft [label="Draft", prompt="Write a first draft implementation of the task"]
refine [label="Refine", class="premium",
prompt="Review and substantially improve the draft for correctness and clarity"]
start -> draft -> refine -> exit
}
fabro: command not found
~/.local/bin(或安装前缀)在您的 $PATH 中。source ~/.bashrc 或 source ~/.zshrc。智能体陷入循环
人工关卡从未暂停
shape=hexagon,而不仅仅是标签包含 "approve"。fabro runs show <run-id> 以确认运行已到达该节点。沙箱启动失败
DAYTONA_API_KEY 已设置且有效。fabro config 以确认 sandbox.provider 设置为 daytona。fabro runs show <run-id> 以获取沙箱错误详情。模型未找到 / API 错误
ANTHROPIC_API_KEY、OPENAI_API_KEY 等)。model: 值是否与提供商的确切模型 ID 匹配。运行立即退出,未执行任何工作
start (shape=Mdiamond) 到 exit (shape=Msquare) 的有效路径。dot -Tsvg workflow.dot -o workflow.svg 以可视化检查图中是否有断开的节点。每周安装数
206
仓库
GitHub Stars
8
首次出现
4 天前
安全审计
安装于
gemini-cli205
github-copilot205
codex205
amp205
cline205
warp205
Skill by ara.so — Daily 2026 Skills collection.
Fabro is an open source AI coding workflow orchestrator written in Rust. It lets you define agent pipelines as Graphviz DOT graphs — with branching, loops, human approval gates, multi-model routing, and cloud sandbox execution — then run them as a persistent service. You define the process; agents execute it; you intervene only where it matters.
# Via Claude Code (recommended)
curl -fsSL https://fabro.sh/install.md | claude
# Via Codex
codex "$(curl -fsSL https://fabro.sh/install.md)"
# Via Bash
curl -fsSL https://fabro.sh/install.sh | bash
After installation, run one-time setup and per-project initialization:
fabro install # global one-time setup
cd my-project
fabro init # per-project setup (creates .fabro/ config)
# Workflow management
fabro run <workflow.dot> # execute a workflow
fabro run <workflow.dot> --watch # stream live output
fabro runs # list all runs
fabro runs show <run-id> # inspect a specific run
# Human-in-the-loop
fabro approve <run-id> # approve a pending gate
fabro reject <run-id> # reject / revise a pending gate
# Sandbox access
fabro ssh <run-id> # shell into a running sandbox
fabro preview <run-id> <port> # expose a sandbox port locally
# Retrospectives
fabro retro <run-id> # view run retrospective (cost, duration, narrative)
# Config
fabro config # view current configuration
fabro config set <key> <value> # set a config value
Workflows are .dot files using the Graphviz DOT language with Fabro-specific attributes.
| Shape | Meaning |
|---|---|
Mdiamond | Start node |
Msquare | Exit node |
rectangle (default) | Agent node (LLM turn) |
hexagon | Human gate (pauses for approval) |
// hello.dot
digraph HelloWorld {
graph [
goal="Say hello and write a greeting file"
model_stylesheet="
* { model: claude-haiku-4-5; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
greet [label="Greet", prompt="Write a friendly greeting to hello.txt"]
start -> greet -> exit
}
fabro run hello.dot
Fabro uses CSS-like model_stylesheet declarations on the graph to route nodes to models. Use classes to target groups of nodes.
digraph PlanImplementReview {
graph [
goal="Plan, implement, and review a feature"
model_stylesheet="
* { model: claude-haiku-4-5; reasoning_effort: low; }
.planning { model: claude-opus-4-5; reasoning_effort: high; }
.coding { model: claude-sonnet-4-5; reasoning_effort: high; }
.review { model: gpt-4o; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
plan [label="Plan", class="planning", prompt="Analyze the codebase and write plan.md"]
implement [label="Implement", class="coding", prompt="Read plan.md and implement every step"]
review [label="Review", class="review", prompt="Cross-review the implementation for bugs and clarity"]
start -> plan -> implement -> review -> exit
}
model: <model-id> # e.g. claude-sonnet-4-5, gpt-4o, gemini-2-flash
reasoning_effort: low|medium|high
provider: anthropic|openai|google
Use shape=hexagon to pause execution for human approval. Transitions are labeled with [A] (approve) and [R] (revise/reject).
digraph PlanApproveImplement {
graph [
goal="Plan and implement with human approval"
model_stylesheet="
* { model: claude-sonnet-4-5; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
plan [label="Plan", prompt="Write a detailed implementation plan to plan.md"]
approve [shape=hexagon, label="Approve Plan"]
implement [label="Implement", prompt="Read plan.md and implement every step exactly"]
start -> plan -> approve
approve -> implement [label="[A] Approve"]
approve -> plan [label="[R] Revise"]
implement -> exit
}
Approve or reject from the CLI:
fabro runs # find the paused run-id
fabro approve <run-id> # continue with implementation
fabro reject <run-id> --note "Add error handling to the plan"
Use labeled transitions to build automatic retry/fix loops:
digraph ImplementAndTest {
graph [
goal="Implement a feature and fix failing tests automatically"
model_stylesheet="
* { model: claude-haiku-4-5; }
.coding { model: claude-sonnet-4-5; reasoning_effort: high; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement", class="coding",
prompt="Implement the feature described in TASK.md"]
test [label="Run Tests",
prompt="Run the test suite with `cargo test`. Report pass/fail."]
fix [label="Fix", class="coding",
prompt="Read the test failures and fix the code. Do not change tests."]
start -> implement -> test
test -> exit [label="[P] Pass"]
test -> fix [label="[F] Fail"]
fix -> test
}
Run multiple agent nodes concurrently by forking edges from a single source:
digraph ParallelReview {
graph [
goal="Implement then review from multiple perspectives in parallel"
model_stylesheet="
* { model: claude-haiku-4-5; }
.coding { model: claude-sonnet-4-5; }
.critique { model: gpt-4o; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement", class="coding",
prompt="Implement the task in TASK.md"]
sec_review [label="Security Review", class="critique",
prompt="Review the implementation for security issues"]
perf_review [label="Perf Review", class="critique",
prompt="Review the implementation for performance issues"]
summarize [label="Summarize",
prompt="Combine the security and performance reviews into REVIEW.md"]
start -> implement
implement -> sec_review
implement -> perf_review
sec_review -> summarize
perf_review -> summarize
summarize -> exit
}
Use {variable} interpolation in prompts. Pass variables at run time:
digraph FeatureWorkflow {
graph [
goal="Implement {feature_name} from the spec"
model_stylesheet="* { model: claude-sonnet-4-5; }"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement {feature_name}",
prompt="Read specs/{feature_name}.md and implement the feature completely."]
start -> implement -> exit
}
fabro run feature.dot --var feature_name=oauth-login
To run agents in isolated cloud VMs instead of locally, configure a Daytona sandbox:
fabro config set sandbox.provider daytona
fabro config set sandbox.api_key $DAYTONA_API_KEY
fabro config set sandbox.region us-east-1
Then add sandbox config to your workflow graph:
digraph SandboxedWorkflow {
graph [
goal="Implement and test in an isolated environment"
sandbox="daytona"
model_stylesheet="* { model: claude-sonnet-4-5; }"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement", prompt="Implement the feature in TASK.md"]
test [label="Test", prompt="Run the full test suite and report results"]
start -> implement -> test -> exit
}
fabro run sandboxed.dot # spins up cloud VM, runs workflow, tears it down
fabro ssh <run-id> # shell into the running sandbox for debugging
fabro preview <run-id> 3000 # forward sandbox port 3000 locally
Fabro automatically commits code changes and execution metadata to Git branches at each stage. To inspect or resume:
fabro runs show <run-id> # see branch names per stage
git checkout fabro/<run-id>/implement # inspect the code at a specific stage
git diff fabro/<run-id>/plan fabro/<run-id>/implement # diff between stages
After every run, Fabro generates a retrospective with cost, duration, files changed, and an LLM-written narrative:
fabro retro <run-id>
Example output:
Run: implement-oauth-2024
Duration: 4m 32s
Cost: $0.043
Files: src/auth.rs (+142), src/lib.rs (+8), tests/auth_test.rs (+67)
Narrative:
The agent successfully implemented OAuth2 PKCE flow. It created the auth
module, integrated with the existing middleware, and added integration tests.
One fix loop was needed after the token refresh test failed.
Fabro runs an API server for programmatic use:
fabro serve --port 8080
curl -X POST http://localhost:8080/api/runs \
-H "Content-Type: application/json" \
-d '{
"workflow": "workflows/plan-implement.dot",
"variables": { "feature_name": "dark-mode" }
}'
curl -N http://localhost:8080/api/runs/<run-id>/events
curl -X POST http://localhost:8080/api/runs/<run-id>/approve \
-H "Content-Type: application/json" \
-d '{ "decision": "approve" }'
# Required — at least one LLM provider key
export ANTHROPIC_API_KEY=...
export OPENAI_API_KEY=...
export GOOGLE_API_KEY=...
# Optional — cloud sandboxes
export DAYTONA_API_KEY=...
# Optional — Fabro API server auth
export FABRO_API_TOKEN=...
my-project/
├── .fabro/ # Fabro config (created by `fabro init`)
│ └── config.toml
├── workflows/ # Your DOT workflow definitions
│ ├── plan-implement.dot
│ ├── fix-loop.dot
│ └── ensemble-review.dot
├── specs/ # Natural language specs referenced by prompts
│ └── feature-name.md
└── src/ # Your actual source code
digraph SpecDriven {
graph [
goal="Implement from spec with LLM-as-judge verification"
model_stylesheet="
* { model: claude-sonnet-4-5; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
implement [label="Implement",
prompt="Read specs/feature.md and implement it completely"]
judge [label="Judge",
prompt="Compare the implementation against specs/feature.md. Does it conform? Reply PASS or FAIL with reasons."]
fix [label="Fix",
prompt="Read the judge feedback and fix the implementation"]
start -> implement -> judge
judge -> exit [label="[P] PASS"]
judge -> fix [label="[F] FAIL"]
fix -> judge
}
digraph CheapThenExpensive {
graph [
goal="Draft cheaply, refine with a frontier model"
model_stylesheet="
* { model: claude-haiku-4-5; }
.premium { model: claude-opus-4-5; reasoning_effort: high; }
"
]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
draft [label="Draft", prompt="Write a first draft implementation of the task"]
refine [label="Refine", class="premium",
prompt="Review and substantially improve the draft for correctness and clarity"]
start -> draft -> refine -> exit
}
fabro: command not found
~/.local/bin (or the install prefix) is on your $PATH.source ~/.bashrc or source ~/.zshrc after installation.Agent gets stuck in a loop
Human gate never pauses
shape=hexagon, not just a label containing "approve".fabro runs show <run-id> to confirm the run reached that node.Sandbox fails to start
DAYTONA_API_KEY is set and valid.fabro config to confirm sandbox.provider is set to daytona.fabro runs show <run-id> for sandbox error details.Model not found / API error
ANTHROPIC_API_KEY, OPENAI_API_KEY, etc.).model: value in your stylesheet matches the provider's exact model ID.Run exits immediately without doing work
start (shape=Mdiamond) to exit (shape=Msquare).dot -Tsvg workflow.dot -o workflow.svg to visually inspect the graph for disconnected nodes.Weekly Installs
206
Repository
GitHub Stars
8
First Seen
4 days ago
Security Audits
Gen Agent Trust HubFailSocketWarnSnykFail
Installed on
gemini-cli205
github-copilot205
codex205
amp205
cline205
warp205
AI Elements:基于shadcn/ui的AI原生应用组件库,快速构建对话界面
62,200 周安装
基础设施完成检查工具 - 验证代码接入与系统连接,避免死代码浪费
203 周安装
微信公众号文章格式转换工具 - 一键优化内容排版与风格,提升公众号阅读体验
203 周安装
Supabase Postgres 最佳实践 - 8大类别性能优化指南与SQL示例
203 周安装
微信自动化监控与消息处理指南:Windows wxauto 与 macOS Accessibility API 实战
204 周安装
剪映AI视频生成自动化脚本 - 基于Playwright的Seedance 2.0模型文生图/图生视频工具
204 周安装
社交媒体内容策略指南:LinkedIn、Twitter、Instagram、TikTok、Facebook平台优化与模板
204 周安装