crates/hosts the workspace crates; CLI behaviour lives incrates/fluent-cli/src/alongside shared engine, storage, and SDK layers.src/main.rsonly bootstraps the CLI; keep new logic inside the relevant crate.tests/carries integration and E2E coverage, includinge2e_cli_tests.rsand fixtures undertests/data/.example_pipelines/andexample_configurations/expose runnable YAML scenarios you can use for local validation.- Support material sits in
examples/,docs/, andscripts/; add new tooling there to keep the root clean.
cargo buildcompiles the entire workspace; add--releasefor optimized binaries.cargo run -- pipeline -f example_pipelines/test_pipeline.yaml -i "Hello"drives the CLI against a sample pipeline. Pass--config fluent_config.tomlto override defaults.cargo testexecutes all unit and integration suites; scope with-p fluent-clifor CLI-only checks.cargo fmt --allandcargo clippy --all-targets -- -D warningsgate formatting and linting; run them before proposing changes.pre-commit install && pre-commit run -amirrors CI hooks locally.
- Follow Rust 2021 defaults: 4-space indentation, rustfmt line widths, and module organization guidelines.
- Name files and functions with
snake_case, types withCamelCase, and consts withSCREAMING_SNAKE_CASE. - Prefer explicit error types and map user-facing failures to
CliErrorfor consistent exit codes.
- Use the Rust test harness and keep specs deterministic; avoid network calls unless mocked.
- Place crate-specific tests under
crates/<name>/tests/and broader scenarios intests/. - Reference shared fixtures in
tests/data/, or add new ones there when extending coverage.
- Write Conventional Commits such as
feat(cli): add pipeline flagorfix(security): guard config loading. - PRs should summarise intent, link issues, flag breaking changes, and include screenshots or CLI output for UX updates.
- Ensure
cargo fmt,cargo clippy, andcargo testsucceed locally before requesting review.
- Default to
fluent_config.toml; never commit secrets or tokens, and prefer environment variables for overrides. - Validate external inputs, handle expected network failures explicitly, and rely on redacted logging to avoid leaking data.