dkyazzentwatwa / flowchart-generator

Generate flowcharts from YAML/JSON definitions or Python DSL. Supports standard flowchart shapes, swimlanes, and PNG/SVG/PDF export.

1 views
0 installs

Skill Content

---
name: flowchart-generator
description: Generate flowcharts from YAML/JSON definitions or Python DSL. Supports standard flowchart shapes, swimlanes, and PNG/SVG/PDF export.
---

# Flowchart Generator

Create professional flowcharts from structured process definitions. Supports standard flowchart symbols (start/end, process, decision, I/O), swimlanes for multi-actor processes, and multiple export formats.

## Quick Start

```python
from scripts.flowchart_gen import FlowchartGenerator

# Using Python DSL
flow = FlowchartGenerator()
flow.start("Start")
flow.process("Step 1", id="s1")
flow.decision("Check?", id="d1")
flow.process("Yes Path", id="yes")
flow.process("No Path", id="no")
flow.end("End")

flow.connect("Start", "s1")
flow.connect("s1", "d1")
flow.connect("d1", "yes", label="Yes")
flow.connect("d1", "no", label="No")
flow.connect("yes", "End")
flow.connect("no", "End")

flow.generate().save("flowchart.png")

# From YAML file
flow = FlowchartGenerator()
flow.from_yaml("process.yaml")
flow.generate().save("process.png")
```

## Features

- **Multiple Input Sources**: Python DSL, YAML, or JSON
- **Standard Shapes**: Start/End, Process, Decision, Input/Output, Connector
- **Swimlanes**: Multi-actor/department process diagrams
- **Styling Presets**: Business, technical, minimal themes
- **Layout Options**: Top-bottom, left-right, and more
- **Export Formats**: PNG, SVG, PDF, DOT

## API Reference

### Initialization

```python
flow = FlowchartGenerator()
```

### Node Creation (DSL)

```python
# Start node (oval/ellipse)
flow.start("Start")
flow.start("Begin Process", id="start1")

# End node (oval/ellipse)
flow.end("End")
flow.end("Process Complete", id="end1")

# Process node (rectangle)
flow.process("Process Data")
flow.process("Calculate Total", id="calc")

# Decision node (diamond)
flow.decision("Valid?", id="check")
flow.decision("Amount > 100?", id="d1")

# Input/Output node (parallelogram)
flow.input_output("User Input", id="input1")
flow.input_output("Display Result", id="output1")

# Connector (circle) - for complex flows
flow.connector("A", id="conn_a")
```

### Connections

```python
# Basic connection
flow.connect("start", "process1")

# With label
flow.connect("decision1", "yes_path", label="Yes")
flow.connect("decision1", "no_path", label="No")

# Multiple connections from decision
flow.decision("Approved?", id="d1")
flow.connect("d1", "approve_path", label="Yes")
flow.connect("d1", "reject_path", label="No")
```

### Loading from Files

```python
# From YAML
flow.from_yaml("process.yaml")

# From JSON
flow.from_json("process.json")
```

### Swimlanes

```python
# Define swimlanes
flow.swimlanes([
    "Customer",
    "Sales Team",
    "Fulfillment"
])

# Add nodes to specific lanes
flow.process("Place Order", id="order", lane="Customer")
flow.process("Review Order", id="review", lane="Sales Team")
flow.process("Ship Order", id="ship", lane="Fulfillment")
```

### Styling

```python
# Style presets
flow.style("business")   # Professional blue theme
flow.style("technical")  # Gray technical theme
flow.style("minimal")    # Clean minimal theme
flow.style("colorful")   # Vibrant colors

# Layout direction
flow.layout("TB")  # Top to Bottom (default)
flow.layout("LR")  # Left to Right
flow.layout("BT")  # Bottom to Top
flow.layout("RL")  # Right to Left

# Custom colors
flow.node_colors({
    'start': '#2ecc71',
    'end': '#e74c3c',
    'process': '#3498db',
    'decision': '#f39c12',
    'io': '#9b59b6'
})
```

### Generation and Export

```python
# Generate
flow.generate()

# Save
flow.save("chart.png")
flow.save("chart.svg")
flow.save("chart.pdf")
flow.save("chart.dot")  # GraphViz source

# Get DOT source
dot_source = flow.to_dot()

# Show in viewer
flow.show()
```

## Data Formats

### YAML Format

```yaml
# process.yaml
title: Order Processing
layout: TB
style: business

nodes:
  - id: start
    type: start
    label: Start

  - id: receive
    type: process
    label: Receive Order

  - id: check_stock
    type: decision
    label: In Stock?

  - id: fulfill
    type: process
    label: Fulfill Order

  - id: backorder
    type: process
    label: Create Backorder

  - id: notify
    type: io
    label: Notify Customer

  - id: end
    type: end
    label: End

connections:
  - from: start
    to: receive

  - from: receive
    to: check_stock

  - from: check_stock
    to: fulfill
    label: "Yes"

  - from: check_stock
    to: backorder
    label: "No"

  - from: fulfill
    to: notify

  - from: backorder
    to: notify

  - from: notify
    to: end
```

### JSON Format

```json
{
  "title": "Order Processing",
  "layout": "TB",
  "style": "business",
  "nodes": [
    {"id": "start", "type": "start", "label": "Start"},
    {"id": "process1", "type": "process", "label": "Process Data"},
    {"id": "decision1", "type": "decision", "label": "Valid?"},
    {"id": "end", "type": "end", "label": "End"}
  ],
  "connections": [
    {"from": "start", "to": "process1"},
    {"from": "process1", "to": "decision1"},
    {"from": "decision1", "to": "end", "label": "Yes"}
  ]
}
```

### Swimlane YAML Format

```yaml
title: Customer Service Process
layout: LR
swimlanes:
  - Customer
  - Support Agent
  - Technical Team

nodes:
  - id: submit
    type: start
    label: Submit Ticket
    lane: Customer

  - id: review
    type: process
    label: Review Ticket
    lane: Support Agent

  - id: technical
    type: decision
    label: Technical Issue?
    lane: Support Agent

  - id: escalate
    type: process
    label: Escalate
    lane: Technical Team

  - id: resolve
    type: process
    label: Resolve
    lane: Support Agent

  - id: close
    type: end
    label: Close Ticket
    lane: Customer

connections:
  - from: submit
    to: review
  - from: review
    to: technical
  - from: technical
    to: escalate
    label: "Yes"
  - from: technical
    to: resolve
    label: "No"
  - from: escalate
    to: resolve
  - from: resolve
    to: close
```

## CLI Usage

```bash
# From YAML
python flowchart_gen.py --input process.yaml --output flowchart.png

# From JSON with custom layout
python flowchart_gen.py --input process.json --layout LR --output flow.png

# With style preset
python flowchart_gen.py --input workflow.yaml --style business --output workflow.svg

# High resolution
python flowchart_gen.py --input process.yaml --output chart.png --dpi 300
```

### CLI Arguments

| Argument | Description | Default |
|----------|-------------|---------|
| `--input` | Input YAML or JSON file | Required |
| `--output` | Output file path | `flowchart.png` |
| `--layout` | Layout direction (TB, LR, BT, RL) | `TB` |
| `--style` | Style preset | `business` |
| `--dpi` | Image resolution | 96 |

## Examples

### Simple Linear Flow

```python
flow = FlowchartGenerator()
flow.start("Start")
flow.process("Step 1", id="s1")
flow.process("Step 2", id="s2")
flow.process("Step 3", id="s3")
flow.end("End")

flow.connect("Start", "s1")
flow.connect("s1", "s2")
flow.connect("s2", "s3")
flow.connect("s3", "End")

flow.generate().save("linear.png")
```

### Decision Flow

```python
flow = FlowchartGenerator()

flow.start("Start")
flow.input_output("Get Input", id="input")
flow.decision("Valid?", id="check")
flow.process("Process", id="proc")
flow.input_output("Show Error", id="error")
flow.end("End")

flow.connect("Start", "input")
flow.connect("input", "check")
flow.connect("check", "proc", label="Yes")
flow.connect("check", "error", label="No")
flow.connect("proc", "End")
flow.connect("error", "input")  # Loop back

flow.style("business")
flow.generate().save("decision_flow.png")
```

### Login Process

```python
flow = FlowchartGenerator()

flow.start("Start")
flow.input_output("Enter Credentials", id="creds")
flow.process("Validate", id="validate")
flow.decision("Valid?", id="check")
flow.decision("Attempts < 3?", id="attempts")
flow.process("Login Success", id="success")
flow.input_output("Show Error", id="error")
flow.process("Lock Account", id="lock")
flow.end("End")

flow.connect("Start", "creds")
flow.connect("creds", "validate")
flow.connect("validate", "check")
flow.connect("check", "success", label="Yes")
flow.connect("check", "attempts", label="No")
flow.connect("attempts", "creds", label="Yes")
flow.connect("attempts", "lock", label="No")
flow.connect("success", "End")
flow.connect("lock", "End")

flow.layout("TB")
flow.style("technical")
flow.generate().save("login_flow.png")
```

### Order Processing with Swimlanes

```python
flow = FlowchartGenerator()

flow.swimlanes(["Customer", "System", "Warehouse"])

flow.start("Order Placed", id="start", lane="Customer")
flow.process("Validate Order", id="validate", lane="System")
flow.decision("In Stock?", id="stock", lane="System")
flow.process("Reserve Items", id="reserve", lane="Warehouse")
flow.process("Backorder", id="backorder", lane="Warehouse")
flow.process("Process Payment", id="payment", lane="System")
flow.process("Ship Order", id="ship", lane="Warehouse")
flow.end("Complete", id="end", lane="Customer")

flow.connect("start", "validate")
flow.connect("validate", "stock")
flow.connect("stock", "reserve", label="Yes")
flow.connect("stock", "backorder", label="No")
flow.connect("reserve", "payment")
flow.connect("backorder", "payment")
flow.connect("payment", "ship")
flow.connect("ship", "end")

flow.layout("TB")
flow.generate().save("order_swimlane.png")
```

## Node Shapes

| Type | Shape | Usage |
|------|-------|-------|
| `start` | Oval/Ellipse | Beginning of flow |
| `end` | Oval/Ellipse | End of flow |
| `process` | Rectangle | Action or step |
| `decision` | Diamond | Yes/No branch |
| `io` | Parallelogram | Input/Output |
| `connector` | Circle | Page/flow connector |

## Style Presets

| Preset | Description |
|--------|-------------|
| `business` | Professional blue tones |
| `technical` | Gray/silver technical look |
| `minimal` | Black and white, clean |
| `colorful` | Vibrant multi-color |

## Dependencies

```
graphviz>=0.20.0
PyYAML>=6.0
```

**System Requirement**: Graphviz must be installed on the system.
- macOS: `brew install graphviz`
- Ubuntu: `apt-get install graphviz`
- Windows: Download from graphviz.org

## Limitations

- Complex nested decisions may require manual layout adjustments
- Swimlane rendering depends on graphviz subgraph support
- Very large flowcharts (50+ nodes) may be hard to read
- Limited control over exact node positioning