Add workflow diagram and update doc URLs in README

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-03-14 12:08:10 -04:00
parent 829a2b0c13
commit 619ec176df
2 changed files with 107 additions and 10 deletions

View file

@ -1,13 +1,13 @@
<div align="left" id="top">
<a href="https://fabro.dev"><img alt="Fabro" src="docs/logo/dark.svg" height="75"></a>
<a href="https://docs.fabro.sh"><img alt="Fabro" src="docs/logo/dark.svg" height="75"></a>
</div>
## The open source dark software factory for expert engineers
AI coding agents are powerful but unpredictable. You either babysit every step or review a 50-file diff you don't trust. Fabro gives you a middle path: define the process as a graph, let agents execute it, and intervene only where it matters. [Why Fabro?](https://fabro.dev/getting-started/why-arc)
AI coding agents are powerful but unpredictable. You either babysit every step or review a 50-file diff you don't trust. Fabro gives you a middle path: define the process as a graph, let agents execute it, and intervene only where it matters. [Why Fabro?](https://docs.fabro.sh/getting-started/why-arc)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE.md)
[![docs](https://img.shields.io/badge/docs-fabro.dev-357F9E)](https://fabro.dev)
[![docs](https://img.shields.io/badge/docs-fabro.dev-357F9E)](https://docs.fabro.sh)
```bash
curl -fsSL https://fabro.sh/install.sh | bash
@ -53,6 +53,8 @@ curl -fsSL https://fabro.sh/install.sh | bash
A plan-approve-implement workflow where a human reviews the plan before the agent writes code:
<img src="docs/images/plan-implement-readme.svg" alt="Plan-Implement workflow graph showing Start → Plan → Approve Plan → Implement → Simplify → Exit with a Revise loop" />
```dot
digraph PlanImplement {
graph [
@ -78,19 +80,19 @@ digraph PlanImplement {
}
```
Agents run as multi-turn LLM sessions with tool access. Human gates (`hexagon`) pause for approval. The stylesheet routes planning to a cheap model and coding to a frontier model. See the [DOT language reference](https://fabro.dev/reference/dot-language) for the full syntax.
Agents run as multi-turn LLM sessions with tool access. Human gates (`hexagon`) pause for approval. The stylesheet routes planning to a cheap model and coding to a frontier model. See the [DOT language reference](https://docs.fabro.sh/reference/dot-language) for the full syntax.
---
## 📖 Documentation
Fabro ships with [comprehensive documentation](https://fabro.dev) covering every feature in depth:
Fabro ships with [comprehensive documentation](https://docs.fabro.sh) covering every feature in depth:
- [**Getting Started**](https://fabro.dev/getting-started/introduction) -- Installation, first workflow, and why Fabro exists
- [**Defining Workflows**](https://fabro.dev/workflows/stages-and-nodes) -- Node types, transitions, variables, stylesheets, and human gates
- [**Executing Workflows**](https://fabro.dev/execution/run-configuration) -- Run configuration, sandboxes, checkpoints, retros, and failure handling
- [**Tutorials**](https://fabro.dev/tutorials/hello-world) -- Step-by-step guides from hello world to parallel multi-model ensembles
- [**API Reference**](https://fabro.dev/api-reference/overview) -- Full OpenAPI spec with authentication, SSE events, and client SDKs
- [**Getting Started**](https://docs.fabro.sh/getting-started/introduction) -- Installation, first workflow, and why Fabro exists
- [**Defining Workflows**](https://docs.fabro.sh/workflows/stages-and-nodes) -- Node types, transitions, variables, stylesheets, and human gates
- [**Executing Workflows**](https://docs.fabro.sh/execution/run-configuration) -- Run configuration, sandboxes, checkpoints, retros, and failure handling
- [**Tutorials**](https://docs.fabro.sh/tutorials/hello-world) -- Step-by-step guides from hello world to parallel multi-model ensembles
- [**API Reference**](https://docs.fabro.sh/api-reference/overview) -- Full OpenAPI spec with authentication, SSE events, and client SDKs
---

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.3 (20260303.0454)
-->
<!-- Title: PlanImplement Pages: 1 -->
<svg width="151pt" height="443pt"
viewBox="0.00 0.00 151.00 443.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 438.5)">
<title>PlanImplement</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-438.5 147.41,-438.5 147.41,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="71.71,-434.5 31.66,-416.5 71.71,-398.5 111.76,-416.5 71.71,-434.5"/>
<polyline fill="none" stroke="black" points="42.6,-421.42 42.6,-411.58"/>
<polyline fill="none" stroke="black" points="60.76,-403.42 82.65,-403.42"/>
<polyline fill="none" stroke="black" points="100.81,-411.58 100.81,-421.42"/>
<polyline fill="none" stroke="black" points="82.65,-429.58 60.76,-429.58"/>
<text xml:space="preserve" text-anchor="middle" x="71.71" y="-411.45" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- plan -->
<g id="node3" class="node">
<title>plan</title>
<ellipse fill="none" stroke="black" cx="71.71" cy="-343.5" rx="27.3" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="71.71" y="-338.45" font-family="Times,serif" font-size="14.00">Plan</text>
</g>
<!-- start&#45;&gt;plan -->
<g id="edge1" class="edge">
<title>start&#45;&gt;plan</title>
<path fill="none" stroke="black" d="M71.71,-398.31C71.71,-390.73 71.71,-381.6 71.71,-373.04"/>
<polygon fill="black" stroke="black" points="75.21,-373.04 71.71,-363.04 68.21,-373.04 75.21,-373.04"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="90.96,-38.5 52.46,-38.5 52.46,0 90.96,0 90.96,-38.5"/>
<polyline fill="none" stroke="black" points="64.46,-38.5 52.46,-26.5"/>
<polyline fill="none" stroke="black" points="52.46,-12 64.46,0"/>
<polyline fill="none" stroke="black" points="78.96,0 90.96,-12"/>
<polyline fill="none" stroke="black" points="90.96,-26.5 78.96,-38.5"/>
<text xml:space="preserve" text-anchor="middle" x="71.71" y="-14.2" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- approve -->
<g id="node4" class="node">
<title>approve</title>
<polygon fill="none" stroke="black" points="143.41,-255 107.56,-273 35.85,-273 0,-255 35.85,-237 107.56,-237 143.41,-255"/>
<text xml:space="preserve" text-anchor="middle" x="71.71" y="-249.95" font-family="Times,serif" font-size="14.00">Approve Plan</text>
</g>
<!-- plan&#45;&gt;approve -->
<g id="edge2" class="edge">
<title>plan&#45;&gt;approve</title>
<path fill="none" stroke="black" d="M70.51,-325.06C70.18,-319.46 69.87,-313.22 69.71,-307.5 69.5,-300.17 69.5,-298.33 69.71,-291 69.76,-288.94 69.84,-286.82 69.93,-284.69"/>
<polygon fill="black" stroke="black" points="73.42,-285.12 70.44,-274.95 66.43,-284.76 73.42,-285.12"/>
</g>
<!-- approve&#45;&gt;plan -->
<g id="edge4" class="edge">
<title>approve&#45;&gt;plan</title>
<path fill="none" stroke="black" d="M71.71,-273.35C71.71,-285.06 71.71,-300.79 71.71,-314.28"/>
<polygon fill="black" stroke="black" points="68.21,-313.9 71.71,-323.9 75.21,-313.9 68.21,-313.9"/>
<text xml:space="preserve" text-anchor="middle" x="100.96" y="-294.2" font-family="Times,serif" font-size="14.00">[R] Revise</text>
</g>
<!-- implement -->
<g id="node5" class="node coding">
<title>implement</title>
<ellipse fill="none" stroke="black" cx="71.71" cy="-166.5" rx="51.86" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="71.71" y="-161.45" font-family="Times,serif" font-size="14.00">Implement</text>
</g>
<!-- approve&#45;&gt;implement -->
<g id="edge3" class="edge">
<title>approve&#45;&gt;implement</title>
<path fill="none" stroke="black" d="M71.71,-236.91C71.71,-225.26 71.71,-209.55 71.71,-196.02"/>
<polygon fill="black" stroke="black" points="75.21,-196.36 71.71,-186.36 68.21,-196.36 75.21,-196.36"/>
<text xml:space="preserve" text-anchor="middle" x="106.21" y="-205.7" font-family="Times,serif" font-size="14.00">[A] Approve</text>
</g>
<!-- simplify -->
<g id="node6" class="node coding">
<title>simplify</title>
<ellipse fill="none" stroke="black" cx="71.71" cy="-93.5" rx="43.67" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="71.71" y="-88.45" font-family="Times,serif" font-size="14.00">Simplify</text>
</g>
<!-- implement&#45;&gt;simplify -->
<g id="edge5" class="edge">
<title>implement&#45;&gt;simplify</title>
<path fill="none" stroke="black" d="M71.71,-148.31C71.71,-140.73 71.71,-131.6 71.71,-123.04"/>
<polygon fill="black" stroke="black" points="75.21,-123.04 71.71,-113.04 68.21,-123.04 75.21,-123.04"/>
</g>
<!-- simplify&#45;&gt;exit -->
<g id="edge6" class="edge">
<title>simplify&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M71.71,-75.01C71.71,-67.57 71.71,-58.69 71.71,-50.25"/>
<polygon fill="black" stroke="black" points="75.21,-50.36 71.71,-40.36 68.21,-50.36 75.21,-50.36"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5 KiB