Run software from a functional diagram.
codengine executes a graph of tasks — each task is a function with an input
and an output — described by a diagram (authored in yUML).
Connected tasks form fanIn/fanOut relationships; the whole diagram is a
workflow.
The diagram isn't documentation about the code. It is the orchestration: it says how, and in what order, your functions run. Living, functional documentation.
codengine is a from-scratch consolidation of earlier experiments (
pypeyuml,yumlabs,yuml-parser,yuml-runner-js, and the matching VS Code extensions), rebuilt under the Codenergy name. The story of the original pipeline: As aventuras das Aventuras de Mumbuquinha.
workflow.yuml ──► codengine-parser ──► IR (JSON) ──► codengine-runner ──► output
A parser turns the diagram into a language-neutral IR (Intermediate Representation) — the workflow graph as JSON. Language-specific runners execute that IR. The IR is the contract between them, which is what makes multiple languages possible. You write plain functions in your language and never adapt them for codengine — the tooling binds them to the diagram for you.
The same workflow semantics run in TypeScript/JavaScript, Python, Dart, and C# — every runner passes the same conformance suite, so a diagram behaves identically whichever language its functions are in.
# tasks.py
def greet(name):
return {"message": f"Hello, {name}!"}
def output(message):
return {"message": message}
# greeting.yuml
[greet]->[output]
codengine.json){
"version": "1",
"workflows": ["*.yuml"],
"modules": { "": { "language": "py", "functions": ["tasks.py"] } }
}
The manifest maps each module (namespace) to a language and its function files, and finds each module's project root (its dependency environment) automatically.
codengine run --entry greet --input '{"name":"world"}'
# → [ { "message": "Hello, world!" } ]
codengine run finds the nearest codengine.json, parses the workflows, and
executes them through the runner for that language. You can also point at files
directly, without a manifest:
codengine run greeting.yuml --functions tasks.py --language py --entry greet --input '{"name":"world"}'
Each language's runner is also an ordinary library you can embed in your own project to execute an IR in-process — the CLI is just one orchestrator over it.
For source-free distribution (consuming a module without its source, across projects or environments), see the module package format.
Done so far:
codengine-spec).codengine-parser).core / analyzer / loader / runner
(+ generator for Dart) in TS/JS, Python, Dart, and C#, all passing the same
conformance.codengine-manifest).codengine-cli).core contract packages — each language's code-level mirror of the spec.packaging.md).transport: "remote" + a url, and the
orchestrator calls it over the network (plan 0020).
All four workers (Python, TS, C#, Dart) serve HTTP.Next / planned:
See plans/ for the reasoning behind each step.
This is a monorepo. Each module is a directory prefixed codengine-; each language's
family lives under codengine-<lang>/. See AGENTS.md for the full module
list and development conventions.
See the LICENSE file in each module.
25 commits
TypeScript
39.2%
Python
33.9%
C#
14.3%
Dart
9.0%
JavaScript
3.5%
Run software from a functional diagram.
codengine executes a graph of tasks — each task is a function with an input
and an output — described by a diagram (authored in yUML).
Connected tasks form fanIn/fanOut relationships; the whole diagram is a
workflow.
The diagram isn't documentation about the code. It is the orchestration: it says how, and in what order, your functions run. Living, functional documentation.
codengine is a from-scratch consolidation of earlier experiments (
pypeyuml,yumlabs,yuml-parser,yuml-runner-js, and the matching VS Code extensions), rebuilt under the Codenergy name. The story of the original pipeline: As aventuras das Aventuras de Mumbuquinha.
workflow.yuml ──► codengine-parser ──► IR (JSON) ──► codengine-runner ──► output
A parser turns the diagram into a language-neutral IR (Intermediate Representation) — the workflow graph as JSON. Language-specific runners execute that IR. The IR is the contract between them, which is what makes multiple languages possible. You write plain functions in your language and never adapt them for codengine — the tooling binds them to the diagram for you.
The same workflow semantics run in TypeScript/JavaScript, Python, Dart, and C# — every runner passes the same conformance suite, so a diagram behaves identically whichever language its functions are in.
# tasks.py
def greet(name):
return {"message": f"Hello, {name}!"}
def output(message):
return {"message": message}
# greeting.yuml
[greet]->[output]
codengine.json){
"version": "1",
"workflows": ["*.yuml"],
"modules": { "": { "language": "py", "functions": ["tasks.py"] } }
}
The manifest maps each module (namespace) to a language and its function files, and finds each module's project root (its dependency environment) automatically.
codengine run --entry greet --input '{"name":"world"}'
# → [ { "message": "Hello, world!" } ]
codengine run finds the nearest codengine.json, parses the workflows, and
executes them through the runner for that language. You can also point at files
directly, without a manifest:
codengine run greeting.yuml --functions tasks.py --language py --entry greet --input '{"name":"world"}'
Each language's runner is also an ordinary library you can embed in your own project to execute an IR in-process — the CLI is just one orchestrator over it.
For source-free distribution (consuming a module without its source, across projects or environments), see the module package format.
Done so far:
codengine-spec).codengine-parser).core / analyzer / loader / runner
(+ generator for Dart) in TS/JS, Python, Dart, and C#, all passing the same
conformance.codengine-manifest).codengine-cli).core contract packages — each language's code-level mirror of the spec.packaging.md).transport: "remote" + a url, and the
orchestrator calls it over the network (plan 0020).
All four workers (Python, TS, C#, Dart) serve HTTP.Next / planned:
See plans/ for the reasoning behind each step.
This is a monorepo. Each module is a directory prefixed codengine-; each language's
family lives under codengine-<lang>/. See AGENTS.md for the full module
list and development conventions.
See the LICENSE file in each module.
25 commits
TypeScript
39.2%
Python
33.9%
C#
14.3%
Dart
9.0%
JavaScript
3.5%