# scope-li/flow-bundle architecture

> Architecture diagram of the GitHub repository scope-li/flow-bundle, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/scope-li/flow-bundle
- Repository: https://github.com/scope-li/flow-bundle

## Overview

Flow is a Symfony BPMN 2.0 workflow engine. An application starts or advances a process through the runtime, which works with process definitions, instances, and execution tokens; BPMN elements describe the activities, events, and gateways available to that workflow. The engine also supports Camunda connector and input/output extensions, scripts and expressions, and serialization plus Doctrine lifecycle integration. The README documents supported BPMN stages; source excerpts are limited, so links between unsampled runtime components are not asserted.

Main entry points: [`src/Connector/ConnectorRunner.php`](https://github.com/scope-li/flow-bundle/blob/main/src/Connector/ConnectorRunner.php) (Connector runner), [`src/ElementCamunda/InputOutput.php`](https://github.com/scope-li/flow-bundle/blob/main/src/ElementCamunda/InputOutput.php) (Camunda extensions), [`src/Process/ProcessInstance.php`](https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessInstance.php) (Process instance), [`src/EventListener/DoctrineListener.php`](https://github.com/scope-li/flow-bundle/blob/main/src/EventListener/DoctrineListener.php) (Doctrine lifecycle)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_model["BPMN model"]
  node_model["BPMN definitions<br/>[Bpmn.php]"]
  node_flow["Flow elements<br/>[FlowElement.php]"]
  node_events_gateways["Events and gateways<br/>[FlowNode.php]"]
  node_tasks["BPMN tasks<br/>[Task.php]"]
end

subgraph group_runtime["Process runtime"]
  node_runner["Process runner<br/>[ProcessRunner.php]"]
  node_definition_repo["Definition repository"]
  node_instance["Process instance"]
  node_token["Execution token<br/>[Token.php]"]
end

subgraph group_execution["Activity execution"]
  node_camunda["Camunda extensions<br/>[InputOutput.php]"]
  node_script_runner["Script runner<br/>[ScriptRunner.php]"]
  node_twig_script["Twig scripts<br/>[ScriptTwig.php]"]
  node_connector_runner["Connector runner"]
  node_connector["Connector implementations"]
end

subgraph group_state["State and events"]
  node_instance_repo[("Instance repository")]
  node_serializer["Instance serializer"]
  node_doctrine["Doctrine lifecycle"]
  node_process_events["Process events"]
  node_listeners["Event listeners"]
end

node_application(("Symfony application"))
node_expression["Symfony expressions"]

node_application -->|"starts or advances"| node_runner
node_connector_runner -->|"evaluates parameters"| node_camunda
node_camunda -->|"runs scripts"| node_script_runner
node_script_runner -->|"dispatches scripts"| node_twig_script
node_connector_runner -->|"dispatches connector"| node_connector
node_connector_runner -->|"merges process data"| node_instance
node_camunda -.->|"evaluates expressions"| node_expression
node_instance_repo -->|"stores instances"| node_instance
node_doctrine -->|"serializes instances"| node_serializer
node_doctrine -->|"restores instances"| node_instance
node_listeners -->|"listens to events"| node_process_events

click node_runner "https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessRunner.php"
click node_definition_repo "https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessDefinitionRepository.php"
click node_instance "https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessInstance.php"
click node_token "https://github.com/scope-li/flow-bundle/blob/main/src/Process/Token.php"
click node_model "https://github.com/scope-li/flow-bundle/blob/main/src/Element/Bpmn.php"
click node_flow "https://github.com/scope-li/flow-bundle/blob/main/src/Element/FlowElement.php"
click node_events_gateways "https://github.com/scope-li/flow-bundle/blob/main/src/Element/FlowNode.php"
click node_tasks "https://github.com/scope-li/flow-bundle/blob/main/src/Element/Task.php"
click node_camunda "https://github.com/scope-li/flow-bundle/blob/main/src/ElementCamunda/InputOutput.php"
click node_script_runner "https://github.com/scope-li/flow-bundle/blob/main/src/Script/ScriptRunner.php"
click node_twig_script "https://github.com/scope-li/flow-bundle/blob/main/src/Script/ScriptTwig.php"
click node_connector_runner "https://github.com/scope-li/flow-bundle/blob/main/src/Connector/ConnectorRunner.php"
click node_connector "https://github.com/scope-li/flow-bundle/blob/main/src/Connector/ConnectorInterface.php"
click node_instance_repo "https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessInstanceRepository.php"
click node_serializer "https://github.com/scope-li/flow-bundle/blob/main/src/Serializer/SerializerInterface.php"
click node_doctrine "https://github.com/scope-li/flow-bundle/blob/main/src/EventListener/DoctrineListener.php"
click node_process_events "https://github.com/scope-li/flow-bundle/blob/main/src/Event/ProcessInstanceEvents.php"
click node_listeners "https://github.com/scope-li/flow-bundle/blob/main/src/EventListener/OperationListener.php"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_model,node_flow,node_events_gateways,node_tasks toneBlue
class node_runner,node_definition_repo,node_instance,node_token toneAmber
class node_camunda,node_script_runner,node_twig_script,node_connector_runner,node_connector toneMint
class node_instance_repo,node_serializer,node_doctrine,node_process_events,node_listeners toneRose
class node_application,node_expression toneIndigo
```

## Components

### BPMN model

- [BPMN definitions](https://github.com/scope-li/flow-bundle/blob/main/src/Element/Bpmn.php): `src/Element/Bpmn.php`
- [Flow elements](https://github.com/scope-li/flow-bundle/blob/main/src/Element/FlowElement.php): `src/Element/FlowElement.php`
- [Events and gateways](https://github.com/scope-li/flow-bundle/blob/main/src/Element/FlowNode.php): `src/Element/FlowNode.php`
- [BPMN tasks](https://github.com/scope-li/flow-bundle/blob/main/src/Element/Task.php): `src/Element/Task.php`

### Process runtime

- [Process runner](https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessRunner.php): `src/Process/ProcessRunner.php`
- [Definition repository](https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessDefinitionRepository.php): `src/Process/ProcessDefinitionRepository.php`
- [Process instance](https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessInstance.php): `src/Process/ProcessInstance.php`
- [Execution token](https://github.com/scope-li/flow-bundle/blob/main/src/Process/Token.php): `src/Process/Token.php`

### Activity execution

- [Camunda extensions](https://github.com/scope-li/flow-bundle/blob/main/src/ElementCamunda/InputOutput.php): `src/ElementCamunda/InputOutput.php`
- [Script runner](https://github.com/scope-li/flow-bundle/blob/main/src/Script/ScriptRunner.php): `src/Script/ScriptRunner.php`
- [Twig scripts](https://github.com/scope-li/flow-bundle/blob/main/src/Script/ScriptTwig.php): `src/Script/ScriptTwig.php`
- [Connector runner](https://github.com/scope-li/flow-bundle/blob/main/src/Connector/ConnectorRunner.php): `src/Connector/ConnectorRunner.php`
- [Connector implementations](https://github.com/scope-li/flow-bundle/blob/main/src/Connector/ConnectorInterface.php): `src/Connector/ConnectorInterface.php`

### State and events

- [Instance repository](https://github.com/scope-li/flow-bundle/blob/main/src/Process/ProcessInstanceRepository.php): `src/Process/ProcessInstanceRepository.php`
- [Instance serializer](https://github.com/scope-li/flow-bundle/blob/main/src/Serializer/SerializerInterface.php): `src/Serializer/SerializerInterface.php`
- [Doctrine lifecycle](https://github.com/scope-li/flow-bundle/blob/main/src/EventListener/DoctrineListener.php): `src/EventListener/DoctrineListener.php`
- [Process events](https://github.com/scope-li/flow-bundle/blob/main/src/Event/ProcessInstanceEvents.php): `src/Event/ProcessInstanceEvents.php`
- [Event listeners](https://github.com/scope-li/flow-bundle/blob/main/src/EventListener/OperationListener.php): `src/EventListener/OperationListener.php`

### Other components

- **Symfony application**
- **Symfony expressions**

## Connections

- Symfony application → Process runner: starts or advances
- Connector runner → Camunda extensions: evaluates parameters
- Camunda extensions → Script runner: runs scripts
- Script runner → Twig scripts: dispatches scripts
- Connector runner → Connector implementations: dispatches connector
- Connector runner → Process instance: merges process data
- Camunda extensions → Symfony expressions: evaluates expressions
- Instance repository → Process instance: stores instances
- Doctrine lifecycle → Instance serializer: serializes instances
- Doctrine lifecycle → Process instance: restores instances
- Event listeners → Process events: listens to events
