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.
Mental model
Section titled “Mental model”- 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).
Interfaces
Section titled “Interfaces”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 decoratorsA 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 # scaffoldcloacinactl package validate my-pipeline # check formatcloacinactl package pack my-pipeline # build the .cloacina archivecloacinactl --tenant acme package upload my-pipeline-0.1.0.cloacinaKey facts
Section titled “Key facts”- 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.
See also
Section titled “See also”- Creating Your First Package · Packaging Python Workflows
- Run the Service — where packages are deployed.