ci / checks (push) Successful in 3m4s
ci-platforms / build (amd64, darwin, macos-15-intel) (push) Skipped
ci-platforms / build (amd64, windows, windows-2022) (push) Skipped
ci-platforms / build (arm64, darwin, macos-15) (push) Skipped
ci / build (amd64, linux, ubuntu-24.04) (push) Successful in 3m53s
ci / release (push) Successful in 5m37s
2.9 KiB
2.9 KiB
Contributing
Build and run
bash tools/bootstrap-native.sh
make cli
.cache/bin/aego edit examples/platformer
make res regenerates icons, previews and ES shaders; make golden-update rewrites golden images after an intended UI change.
Check levels
| Level | When | Command |
|---|---|---|
| 1 | after an edit | make quick: build and short tests of the packages your change touches and everything that imports them |
| 2 | before a commit | make affected, plus make check-camera, check-audio, check-gameplay, check-mutate, check-editor, check-web or check-docs for the areas you touched, and make golden after UI changes |
| 3 | before a push or a tag | make ci |
tools/affected.sh [base] lists the affected packages (default base origin/master, uncommitted files included). The CI server always runs the full make ci.
Rules for engine code
- Modules talk through contracts. A module never imports another module: shared types and services live in
contracts/(physics2d,camera2d,scriptcall,signals,debugdraw, …).tools/depcheckenforces the import rules; an exception goes intotools/depcheck/exceptions.txtwith its file and reason. - Kernel stays neutral. Kernel, editor and
sdknever name a built-in module, its components or its diagnostic codes in string literals; names come from the module catalog. - Every component has a Try it scene. It lives at
res/docs/try/<Component>.aescene(with<Component>.aesand prefabs next to it when needed), shows the component's own effect and runs without warnings;aego docs checkfails without it. - Internal state is not a component. Controller state lives in unexported fields of the component it belongs to or in a world service. A component that exists only to carry state for a service is registered
Hidden: it is not in Create, Add Component, Try it or the docs. - Requirements add, they do not block. Declare
Requires; Add Component,scene add-comp, Paste and presets add the missing components in the same undo step. - Every diagnostic code has a page with an example. Component codes (
CAM,AUD,GMP,PHY, …) also have an example scene that produces the code;aego docs checkfails without one. Asset codes sayscope: asset, codes that only an edit during Play produces sayscope: play. - Nodes are labelled, not pathed. UI shows nodes with
props.NodeLabel(icon and name, the path in the tooltip). - Editor edits go through history. Every edit is a history command, normally
commands.Mutation, so Undo, the Play changes diff and agents see it. - Hot paths do not allocate. Systems, mixers and controllers allocate nothing per frame; add
testing.AllocsPerRunchecks and a benchmark next to new hot code.
Commits
One commit per sub-stage, named Stage <n><x>: <what>; decisions go into ARCHITECTURE.md as D<number> in the same commit.