Package
A .cloacina package is the distributable unit: a package.toml manifest
plus source. Once built, the same package runs under the embedded library, the
daemon, or the server unchanged — it is the seam that lets you move a
Workflow or
Computation Graph
between the two doors.
- A package wraps your code with a
package.tomland a conventional source layout. - The loop is new → validate → pack → upload, via
cloacinactl package. - The server loads it (the reconciler registers its workflows, triggers, graphs).
The two languages package differently:
A Python package is a module tree under workflow/, declaring tasks with bare
@cloaca.task decorators (no WorkflowBuilder — the loader supplies the
workflow context):
my-pipeline/
├── package.toml
└── workflow/
└── my_pipeline/
├── __init__.py
└── tasks.py # bare @cloaca.task decorators
A Rust package ships source with a
Cargo.toml + src/lib.rs; the server
compiles it on load. Build/check locally with cloacinactl package build.
cloacinactl package new my-pipeline --lang python # scaffold
cloacinactl package validate my-pipeline # check format
cloacinactl package pack my-pipeline # build the .cloacina archive
cloacinactl --tenant acme package upload my-pipeline-0.1.0.cloacina
- Portable: one artifact runs embedded / daemon / server.
- Python: bare decorators only; a
WorkflowBuilderinside a package fails to load. - Rust: compiled on the server at load time.
- Creating Your First Package · Packaging Python Workflows
- Run the Service — where packages are deployed.