mirror of
https://github.com/storytold/effectcraft.git
synced 2026-11-10 10:20:47 -06:00
- [profile.ci] (release without LTO, 16 codegen units); `xtask ci` runs clippy and tests with --profile ci instead of --release. - Wall-clock asserts in engine memory_tick, gpu OpenGL decline and script socket tests keep their intent with bounds that survive a loaded machine. - docs/testing.md and CONTRIBUTING.md mention the profile. (cherry picked from commit b45c8a379351ebdfda0d7076ad4b740baf6f2087) (cherry picked from commit fa1ea6a107c4c1936cde89b518a05adc73f2b4b0)
2.3 KiB
2.3 KiB
Contributing to EffectCraft
Thanks for helping. Please read AGENTS.md first: its rules on assets and clean-room work apply to everyone, people and AI agents alike, and they are not negotiable.
Setup
You need Rust 1.95 or newer.
cargo run -p effectcraft -- --demo # the desktop app, with the demo project
cargo test --workspace
cargo xtask ci # what every commit must pass (tests use --profile ci)
Ground rules
- Clean room. Work from After Effects' public documentation and its observable behaviour only. Never use Adobe artwork, presets or code, and never copy GPL/LGPL/AGPL code.
- Every asset is attributed. Add a
.attributionsidecar and an ATTRIBUTION.md row;cargo xtask assetschecks it. - Layering. Nothing below the interface layer depends on UI or OS crates; see docs/architecture.md.
- Everything is a command. New features are engine commands with an id, label, menu path, shortcut and parameters, so the UI, the CLI and the MCP server get them at once. Interactive widgets register an automation id.
- Never crash. Non-test code returns errors instead of panicking: no
unwrap(),expect(),panic!,unreachable!,todo!,unimplemented!orunsafe, checked indexing and arithmetic on input-derived values, and a regression test with every crash fix. See the "Never crash" section of AGENTS.md. - Tests with every change, and green
cargo xtask cibefore every commit. One task per commit.
How to add…
- An effect: add an
EffectSpecincrates/effects(AE display name, category, parameters with AE's names, defaults and ranges) and its render function, with a determinism test and a behaviour test. If it reads the clock directly, add it toTIME_DEPENDENT. - A command: register it with
cmd!incrates/engine/src/commands/, place it in the menu tree incrates/engine/src/menus.rs, and test it including undo. - A panel or dialog:
crates/ui-egui/src/panels/; look at the result with the headless snapshot tool described in docs/testing.md.
Talk to us
Questions, ideas and bug reports are welcome on Discord and in GitHub issues.