@@ -26,6 +26,13 @@ See [QUICKSTART.md](QUICKSTART.md) for a full end-to-end walkthrough.
2626
2727### Python
2828
29+ ``` bash
30+ pip install . # install via pip (requires scikit-build-core)
31+ python3 -c " import simforge as sf; print(sf.available_stages())"
32+ ```
33+
34+ Or build manually:
35+
2936``` bash
3037cmake -B build -G Ninja -DSIMFORGE_BUILD_PYTHON=ON && cmake --build build
3138PYTHONPATH=build/python python3 -c " import simforge as sf; print(sf.available_stages())"
@@ -67,7 +74,7 @@ See [DESIGN.md](DESIGN.md) for the full design document, [ROADMAP.md](ROADMAP.md
6774| ` init ` | Generate a default ` simforge.yaml ` config |
6875| ` validate ` | Run validators on processed assets |
6976
70- Global option: ` --log-level <trace|debug|info|warn|error> ` (default: ` info ` )
77+ Global options: ` --version ` , ` --log-level <trace|debug|info|warn|error> ` (default: ` info ` )
7178
7279` process ` options: ` -j,--threads <N> ` (0=auto, 1=sequential), ` --force ` (reprocess all, ignore cached hashes), ` --dry-run ` , ` --json-report `
7380
@@ -81,7 +88,7 @@ A config file has two top-level keys:
8188- ** ` stages ` ** — Per-stage settings:
8289 - ` ingest ` — Accepted input formats (OBJ, STL, FBX, GLTF, URDF, MJCF, ...).
8390 - ` articulation ` — Kinematic tree configuration: links, joints, actuators, sensors. Merges data from source files, sidecar metadata (` .simforge.yaml ` ), and inline YAML config.
84- - ` collision ` — Decomposition method (` coacd ` , ` convex_hull ` , ` triangle_mesh ` , ` primitive ` ), concavity threshold, max hulls.
91+ - ` collision ` — Decomposition method (` convex_hull ` , ` coacd ` , ` triangle_mesh ` , ` primitive ` ), concavity threshold, max hulls. Default: ` convex_hull ` (CoACD requires ` -DSIMFORGE_USE_COACD=ON ` ) .
8592 - ` physics ` — Mass estimation strategy (` geometry ` , ` explicit ` , ` lookup ` ), density, friction, restitution, ` material_library ` path.
8693 - ` optimize ` — LOD levels and triangle budgets.
8794 - ` validate ` — Which checks to run (watertight, physics plausibility, collision correctness, mesh integrity, scale sanity, kinematic tree, actuators, sensors, joint limits).
@@ -92,7 +99,8 @@ A config file has two top-level keys:
9299```
93100simforge/
94101├── .github/workflows/ # CI/CD
95- │ └── ci.yml # Build matrix + gate job
102+ │ ├── ci.yml # Build matrix + gate job
103+ │ └── release.yml # Tag-triggered release builds
96104├── include/simforge/ # Public headers
97105│ ├── adapters/ # Adapter interfaces, mesh writer, exporter headers
98106│ ├── core/ # Core types, MaterialLibrary, hashing
@@ -121,11 +129,13 @@ simforge/
121129│ ├── test_materials.cpp # Material library + lookup tests
122130│ ├── test_parallel.cpp # Parallel pipeline tests
123131│ ├── test_incremental.cpp # Incremental processing tests
132+ │ ├── test_coverage_gaps.cpp # Articulated export, edge case, and stage tests
124133│ └── test_bindings.py # Python binding tests (pytest)
125134├── data/ # Default data files
126135│ └── materials.yaml # 21 common materials (steel, rubber, ABS, ...)
127136├── samples/ # Sample assets (OBJ, STL, GLTF, URDF, MJCF)
128137├── CMakeLists.txt # Build configuration
138+ ├── pyproject.toml # Python packaging (pip install .)
129139├── CHANGELOG.md # Release history
130140├── DESIGN.md # Full design document
131141├── QUICKSTART.md # End-to-end walkthrough
@@ -135,7 +145,7 @@ simforge/
135145
136146## CI/CD
137147
138- GitHub Actions runs on every push to ` develop ` and on PRs to ` main ` .
148+ GitHub Actions runs on every push to ` develop ` and on PRs to ` main ` or ` develop ` .
139149
140150| Job | Description |
141151| -----| -------------|
@@ -146,6 +156,8 @@ GitHub Actions runs on every push to `develop` and on PRs to `main`.
146156| ` Python Bindings ` | Build with pybind11, run pytest suite (Python 3.11) |
147157| ` Gate ` | Required status check — passes only when all jobs pass |
148158
159+ A separate ** release workflow** triggers on version tags (` v* ` ) — builds, tests, packages, and creates a GitHub Release with artifacts.
160+
149161** Branching workflow:** develop locally on ` develop ` → push → CI runs → open PR to ` main ` → Gate must pass to merge.
150162
151163## Development
0 commit comments