| Crates.io | greentic-flow |
| lib.rs | greentic-flow |
| version | 0.4.34 |
| created_at | 2025-10-29 12:32:58.900738+00 |
| updated_at | 2026-01-25 11:16:44.121282+00 |
| description | Generic YGTC flow schema/loader/IR for self-describing component nodes. |
| homepage | |
| repository | https://github.com/greentic-ai/greentic-flow |
| max_upload_size | |
| id | 1906548 |
| size | 573,327 |
Human-friendly YGTc v2 flow authoring: create flows, add component steps, keep routing safe, and validate everything with one CLI.
out|reply|[...]).doctor) and binstall-friendly releases.cargo binstall greentic-flowcargo install --locked greentic-flow.tgz for your target from the latest release and put greentic-flow on your PATH.greentic-flow new --flow ./hello.ygtc --id hello-flow --type messaging \
--name "Hello Flow"
new writes an empty v2 skeleton (nodes: {}) so you can start from a clean slate. If you want a ready-to-run “hello” flow, copy the example file we keep in the repo:
cp docs/examples/hello.ygtc /tmp/hello.ygtc
That example (also covered by tests) is small and readable:
id: hello-flow
type: messaging
schema_version: 2
start: start
nodes:
start:
templating.handlebars:
text: "Hello from greentic-flow!"
routing: out
First scaffold the component with greentic-component new --name hello-world --non-interactive (run it in your desired components directory; it creates hello-world/ with a manifest), then build it:
greentic-component new --name hello-world --non-interactive
greentic-component build --manifest hello-world/component.manifest.json
This produces hello-world/target/wasm32-wasip2/release/hello_world.wasm and dev_flows with defaults. Then add it to a flow:
greentic-flow add-step --flow hello.ygtc \
--node-id hello-world \
--operation handle_message \
--payload '{"input":"Hello from hello-world!"}' \
--routing-out \
--local-wasm components/hello-world/target/wasm32-wasip2/release/hello_world.wasm
This inserts a hello-world node (ordering preserved) and writes a sidecar docs/examples/hello_with_component.ygtc.resolve.json that binds the node to your local wasm (add --pin to hash it). The resulting flow looks like:
Local wasm bindings are stored in the sidecar as file://<relative/path> from the flow directory. Relative --local-wasm inputs are resolved from your current working directory first.
id: hello-component
type: messaging
schema_version: 2
start: hello-world
nodes:
hello-world:
handle_message:
input:
input: "Hello from hello-world!"
routing: out
greentic-flow add-step --flow flows/main.ygtc \
--node-id templates \
--operation run --payload '{}' \
--routing-out \
--component oci://ghcr.io/greentic-ai/components/templates:0.1.2 \
--pin
The sidecar records the remote reference and resolved digest (--pin). Perfect for CI where you want reproducible pulls.
greentic-flow update-step --flow flows/main.ygtc --step hello --answers '{"input":"hi again"}' --routing-reply
reply.greentic-flow delete-step --flow flows/main.ygtc --step mid --strategy splice
mid and splices predecessors to the deleted node’s targets; removes the sidecar entry too.greentic-flow doctor flows/ # recursive over .ygtc
greentic-flow doctor --json flows/main.ygtc # machine-readable
Uses the embedded schemas/ygtc.flow.schema.json by default; add --registry <adapter_catalog.json> for adapter linting.
docs/cli.mddocs/add_step_design.mddocs/deployment-flows.mddocs/add_step_design.mdcargo fmt --checkcargo clippy --all-targets -- -D warningscargo testOr run everything: LOCAL_CHECK_ONLINE=1 ci/local_check.sh
OTEL_EXPORTER_OTLP_ENDPOINT (default http://localhost:4317) targets your collector.RUST_LOG controls log verbosity; e.g. greentic_flow=info.OTEL_RESOURCE_ATTRIBUTES=deployment.environment=dev tags spans with the active environment.greentic-types and greentic-interfaces.#![forbid(unsafe_code)] is enabled).tests/data/ when new adapters or operations are introduced.Cargo.toml.master compares the previous commit; if a crate version changed, a tag <crate-name>-v<semver> is created and pushed automatically.katyo/publish-crates@v2.