@hybridlabor-api/aos 4.4.1 → 4.4.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/firecrawl/SKILL.md +149 -0
- package/.agents/skills/firecrawl/rules/install.md +82 -0
- package/.agents/skills/firecrawl/rules/security.md +26 -0
- package/.agents/skills/firecrawl-agent/SKILL.md +58 -0
- package/.agents/skills/firecrawl-build/SKILL.md +39 -0
- package/.agents/skills/firecrawl-build-interact/SKILL.md +68 -0
- package/.agents/skills/firecrawl-build-onboarding/SKILL.md +103 -0
- package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +39 -0
- package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +20 -0
- package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +17 -0
- package/.agents/skills/firecrawl-build-scrape/SKILL.md +69 -0
- package/.agents/skills/firecrawl-build-search/SKILL.md +69 -0
- package/.agents/skills/firecrawl-crawl/SKILL.md +59 -0
- package/.agents/skills/firecrawl-download/SKILL.md +70 -0
- package/.agents/skills/firecrawl-interact/SKILL.md +84 -0
- package/.agents/skills/firecrawl-map/SKILL.md +51 -0
- package/.agents/skills/firecrawl-scrape/SKILL.md +69 -0
- package/.agents/skills/firecrawl-search/SKILL.md +60 -0
- package/CLAUDE.md +573 -0
- package/README.de.md +0 -8
- package/README.md +0 -8
- package/README.pt.md +0 -8
- package/assets/brand/ao-ant-mark.svg +91 -0
- package/assets/brand/bdb-core-mark.svg +34 -0
- package/assets/brand/heimdall-guardian-mark.svg +16 -0
- package/assets/brand/memb-crystal-mark.svg +18 -0
- package/bin/aos-config.mjs +89 -0
- package/bin/aos-dashboard.mjs +608 -0
- package/bin/aos-uninstall.mjs +227 -0
- package/docs/sessions/audit-2026-09-14-silent-failures.md +114 -0
- package/docs/skills_table.md +0 -3
- package/installer.js +471 -237
- package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +10 -0
- package/mcps/after-effects-mcp/build/index.js +840 -0
- package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +153 -0
- package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +218 -0
- package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +71 -0
- package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +147 -0
- package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +114 -0
- package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +115 -0
- package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +192 -0
- package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +90 -0
- package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +50 -0
- package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +1773 -0
- package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +160 -0
- package/mcps/computer-use-mcp/dist/client.d.ts +150 -0
- package/mcps/computer-use-mcp/dist/client.js +136 -0
- package/mcps/computer-use-mcp/dist/entrypoint.d.ts +16 -0
- package/mcps/computer-use-mcp/dist/entrypoint.js +26 -0
- package/mcps/computer-use-mcp/dist/native.d.ts +212 -0
- package/mcps/computer-use-mcp/dist/native.js +50 -0
- package/mcps/computer-use-mcp/dist/server.d.ts +32 -0
- package/mcps/computer-use-mcp/dist/server.js +342 -0
- package/mcps/computer-use-mcp/dist/session.d.ts +101 -0
- package/mcps/computer-use-mcp/dist/session.js +2372 -0
- package/package.json +13 -4
- package/skills/global_config/aos-project-init/SKILL.md +97 -130
- package/skills/global_config/aos-project-init/assets/openwikiignore.template +62 -0
- package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +38 -1
- package/skills/global_config/aos-setup/SKILL.md +98 -8
- package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +21 -2
- package/skills/global_config/ask-tim/SKILL.md +2 -7
- package/skills/global_config/openwiki-skill/scripts/openwiki_daemon.py +65 -12
- package/bin/setup-saas.mjs +0 -792
- package/mcps/blender-mcp-server/.dockerignore +0 -19
- package/mcps/blender-mcp-server/.github/workflows/ci.yml +0 -67
- package/mcps/blender-mcp-server/.github/workflows/publish-pypi.yml +0 -54
- package/mcps/blender-mcp-server/CHANGELOG.md +0 -64
- package/mcps/blender-mcp-server/CONTRIBUTING.md +0 -107
- package/mcps/blender-mcp-server/Dockerfile +0 -19
- package/mcps/blender-mcp-server/LICENSE +0 -21
- package/mcps/blender-mcp-server/README.md +0 -409
- package/mcps/blender-mcp-server/addon/__init__.py +0 -1440
- package/mcps/blender-mcp-server/addon/models.py +0 -223
- package/mcps/blender-mcp-server/pyproject.toml +0 -120
- package/mcps/blender-mcp-server/scripts/blender_bridge_request.py +0 -71
- package/mcps/blender-mcp-server/scripts/blender_create_test_cube.py +0 -49
- package/mcps/blender-mcp-server/scripts/blender_scene_info.py +0 -38
- package/mcps/blender-mcp-server/scripts/build_addon_zip.sh +0 -29
- package/mcps/blender-mcp-server/scripts/demos/README.md +0 -186
- package/mcps/blender-mcp-server/scripts/demos/dam_break_scene.py +0 -276
- package/mcps/blender-mcp-server/scripts/demos/open_dam_break_gui.py +0 -33
- package/mcps/blender-mcp-server/scripts/demos/pipe_movement_study.py +0 -518
- package/mcps/blender-mcp-server/scripts/demos/pipe_pressure_failure_scene.py +0 -806
- package/mcps/blender-mcp-server/scripts/demos/procedural_dam_break_scene.py +0 -600
- package/mcps/blender-mcp-server/scripts/demos/run_dam_break.py +0 -510
- package/mcps/blender-mcp-server/scripts/launch_blender_gui.py +0 -41
- package/mcps/blender-mcp-server/scripts/library/README.md +0 -64
- package/mcps/blender-mcp-server/scripts/library/apply_transforms.py +0 -46
- package/mcps/blender-mcp-server/scripts/library/camera.py +0 -51
- package/mcps/blender-mcp-server/scripts/library/collections.py +0 -65
- package/mcps/blender-mcp-server/scripts/library/create_mesh.py +0 -41
- package/mcps/blender-mcp-server/scripts/library/effector.py +0 -48
- package/mcps/blender-mcp-server/scripts/library/fluid_domain.py +0 -80
- package/mcps/blender-mcp-server/scripts/library/fluid_inflow.py +0 -98
- package/mcps/blender-mcp-server/scripts/library/frame_range.py +0 -35
- package/mcps/blender-mcp-server/scripts/library/keyframes.py +0 -59
- package/mcps/blender-mcp-server/scripts/library/rigid_body.py +0 -52
- package/mcps/blender-mcp-server/scripts/library/save_blend.py +0 -40
- package/mcps/blender-mcp-server/scripts/server_start.sh +0 -26
- package/mcps/blender-mcp-server/src/blender_mcp_server/__init__.py +0 -3
- package/mcps/blender-mcp-server/src/blender_mcp_server/headless.py +0 -330
- package/mcps/blender-mcp-server/src/blender_mcp_server/server.py +0 -606
- package/mcps/davinci-mcp-professional/.bandit +0 -35
- package/mcps/davinci-mcp-professional/.claude/commands/security-review.md +0 -191
- package/mcps/davinci-mcp-professional/.claude/settings.json +0 -1
- package/mcps/davinci-mcp-professional/.editorconfig +0 -27
- package/mcps/davinci-mcp-professional/.gitattributes +0 -207
- package/mcps/davinci-mcp-professional/.github/CODEOWNERS +0 -2
- package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/bug_report.md +0 -33
- package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/feature_request.md +0 -19
- package/mcps/davinci-mcp-professional/.github/PULL_REQUEST_TEMPLATE.md +0 -20
- package/mcps/davinci-mcp-professional/.github/SECURITY.md +0 -97
- package/mcps/davinci-mcp-professional/.github/dependabot.yml +0 -27
- package/mcps/davinci-mcp-professional/.github/workflows/ci.yml +0 -39
- package/mcps/davinci-mcp-professional/ATTRIBUTION.md +0 -4
- package/mcps/davinci-mcp-professional/AUTHORS.md +0 -9
- package/mcps/davinci-mcp-professional/BUGS.md +0 -55
- package/mcps/davinci-mcp-professional/CLAUDE.md +0 -229
- package/mcps/davinci-mcp-professional/CONTRIBUTING.md +0 -51
- package/mcps/davinci-mcp-professional/COPYING.md +0 -228
- package/mcps/davinci-mcp-professional/Doxyfile +0 -379
- package/mcps/davinci-mcp-professional/README.md +0 -143
- package/mcps/davinci-mcp-professional/SECURITY.md +0 -40
- package/mcps/davinci-mcp-professional/USING.md +0 -301
- package/mcps/davinci-mcp-professional/VERSION.md +0 -13
- package/mcps/davinci-mcp-professional/build.py +0 -169
- package/mcps/davinci-mcp-professional/claude_desktop_config_template.json +0 -11
- package/mcps/davinci-mcp-professional/hooks/ci-check.sh +0 -29
- package/mcps/davinci-mcp-professional/hooks/pre-push +0 -46
- package/mcps/davinci-mcp-professional/main.py +0 -40
- package/mcps/davinci-mcp-professional/mcp_server.py +0 -30
- package/mcps/davinci-mcp-professional/pyproject.toml +0 -115
- package/mcps/davinci-mcp-professional/security_audit.py +0 -379
- package/mcps/davinci-mcp-professional/src/davinci_mcp/__init__.py +0 -19
- package/mcps/davinci-mcp-professional/src/davinci_mcp/cli.py +0 -138
- package/mcps/davinci-mcp-professional/src/davinci_mcp/resolve_client.py +0 -342
- package/mcps/davinci-mcp-professional/src/davinci_mcp/resources/__init__.py +0 -60
- package/mcps/davinci-mcp-professional/src/davinci_mcp/server.py +0 -185
- package/mcps/davinci-mcp-professional/src/davinci_mcp/tools/__init__.py +0 -146
- package/mcps/davinci-mcp-professional/src/davinci_mcp/types.py +0 -125
- package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/__init__.py +0 -19
- package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/platform.py +0 -239
- package/mcps/davinci-mcp-professional/test.py +0 -186
- package/mcps/davinci-mcp-professional/uv.lock +0 -2073
- package/mcps/davinci-resolve-mcp/.claude/skills/media-analysis.md +0 -44
- package/mcps/davinci-resolve-mcp/.clinerules +0 -17
- package/mcps/davinci-resolve-mcp/.cursorrules +0 -17
- package/mcps/davinci-resolve-mcp/.github/copilot-instructions.md +0 -17
- package/mcps/davinci-resolve-mcp/.github/workflows/npm-publish.yml +0 -109
- package/mcps/davinci-resolve-mcp/.windsurfrules +0 -17
- package/mcps/davinci-resolve-mcp/AGENTS.md +0 -114
- package/mcps/davinci-resolve-mcp/CHANGELOG.md +0 -2648
- package/mcps/davinci-resolve-mcp/CLAUDE.md +0 -15
- package/mcps/davinci-resolve-mcp/LICENSE +0 -21
- package/mcps/davinci-resolve-mcp/README.md +0 -173
- package/mcps/davinci-resolve-mcp/SECURITY.md +0 -53
- package/mcps/davinci-resolve-mcp/bin/davinci-resolve-mcp.mjs +0 -450
- package/mcps/davinci-resolve-mcp/examples/README.md +0 -53
- package/mcps/davinci-resolve-mcp/examples/markers/README.md +0 -81
- package/mcps/davinci-resolve-mcp/examples/media/README.md +0 -94
- package/mcps/davinci-resolve-mcp/examples/timeline/README.md +0 -98
- package/mcps/davinci-resolve-mcp/install.py +0 -1687
- package/mcps/davinci-resolve-mcp/package.json +0 -52
- package/mcps/davinci-resolve-mcp/release-notes/v2.22.0.md +0 -51
- package/mcps/davinci-resolve-mcp/release-notes/v2.23.0.md +0 -51
- package/mcps/davinci-resolve-mcp/release-notes/v2.23.1.md +0 -35
- package/mcps/davinci-resolve-mcp/release-notes/v2.24.1.md +0 -32
- package/mcps/davinci-resolve-mcp/scripts/audit_api_parity.py +0 -275
- package/mcps/davinci-resolve-mcp/scripts/audit_readwrite_symmetry.py +0 -80
- package/mcps/davinci-resolve-mcp/scripts/doctor.py +0 -227
- package/mcps/davinci-resolve-mcp/scripts/gen_api_limitations.py +0 -144
- package/mcps/davinci-resolve-mcp/scripts/live_media_analysis_polish_probe.py +0 -65
- package/mcps/davinci-resolve-mcp/scripts/measure_bridge_cost.py +0 -65
- package/mcps/davinci-resolve-mcp/scripts/regen_panel_screenshots.py +0 -76
- package/mcps/davinci-resolve-mcp/src/__init__.py +0 -3
- package/mcps/davinci-resolve-mcp/src/analysis_dashboard.py +0 -15505
- package/mcps/davinci-resolve-mcp/src/batch_cli.py +0 -540
- package/mcps/davinci-resolve-mcp/src/control_panel.py +0 -13
- package/mcps/davinci-resolve-mcp/src/granular/__init__.py +0 -17
- package/mcps/davinci-resolve-mcp/src/granular/common.py +0 -741
- package/mcps/davinci-resolve-mcp/src/granular/folder.py +0 -420
- package/mcps/davinci-resolve-mcp/src/granular/gallery.py +0 -306
- package/mcps/davinci-resolve-mcp/src/granular/graph.py +0 -309
- package/mcps/davinci-resolve-mcp/src/granular/media_pool.py +0 -679
- package/mcps/davinci-resolve-mcp/src/granular/media_pool_item.py +0 -1020
- package/mcps/davinci-resolve-mcp/src/granular/media_storage.py +0 -179
- package/mcps/davinci-resolve-mcp/src/granular/project.py +0 -1654
- package/mcps/davinci-resolve-mcp/src/granular/resolve_control.py +0 -538
- package/mcps/davinci-resolve-mcp/src/granular/timeline.py +0 -1075
- package/mcps/davinci-resolve-mcp/src/granular/timeline_item.py +0 -2251
- package/mcps/davinci-resolve-mcp/src/resolve_mcp_server.py +0 -43
- package/mcps/davinci-resolve-mcp/src/server.py +0 -24116
- package/mcps/davinci-resolve-mcp/src/utils/__init__.py +0 -3
- package/mcps/davinci-resolve-mcp/src/utils/actor_identity.py +0 -46
- package/mcps/davinci-resolve-mcp/src/utils/analysis_caps.py +0 -678
- package/mcps/davinci-resolve-mcp/src/utils/analysis_memory.py +0 -755
- package/mcps/davinci-resolve-mcp/src/utils/analysis_runs.py +0 -307
- package/mcps/davinci-resolve-mcp/src/utils/analysis_store.py +0 -945
- package/mcps/davinci-resolve-mcp/src/utils/api_truth.py +0 -525
- package/mcps/davinci-resolve-mcp/src/utils/app_control.py +0 -319
- package/mcps/davinci-resolve-mcp/src/utils/audio_fairlight_live_probe.py +0 -263
- package/mcps/davinci-resolve-mcp/src/utils/brain_edits.py +0 -387
- package/mcps/davinci-resolve-mcp/src/utils/bridge_metrics.py +0 -76
- package/mcps/davinci-resolve-mcp/src/utils/cdl.py +0 -20
- package/mcps/davinci-resolve-mcp/src/utils/clip_query.py +0 -85
- package/mcps/davinci-resolve-mcp/src/utils/cloud_operations.py +0 -192
- package/mcps/davinci-resolve-mcp/src/utils/color_grade_live_probe.py +0 -444
- package/mcps/davinci-resolve-mcp/src/utils/contracts.py +0 -102
- package/mcps/davinci-resolve-mcp/src/utils/cut_ir.py +0 -115
- package/mcps/davinci-resolve-mcp/src/utils/dctl_templates.py +0 -368
- package/mcps/davinci-resolve-mcp/src/utils/deep_vision.py +0 -643
- package/mcps/davinci-resolve-mcp/src/utils/destructive_hook.py +0 -606
- package/mcps/davinci-resolve-mcp/src/utils/edit_engine.py +0 -737
- package/mcps/davinci-resolve-mcp/src/utils/embeddings.py +0 -922
- package/mcps/davinci-resolve-mcp/src/utils/entities.py +0 -579
- package/mcps/davinci-resolve-mcp/src/utils/extension_authoring_live_probe.py +0 -292
- package/mcps/davinci-resolve-mcp/src/utils/failure_tracker.py +0 -119
- package/mcps/davinci-resolve-mcp/src/utils/fuse_templates.py +0 -1968
- package/mcps/davinci-resolve-mcp/src/utils/fusion_composition_live_probe.py +0 -284
- package/mcps/davinci-resolve-mcp/src/utils/fusion_group_settings.py +0 -334
- package/mcps/davinci-resolve-mcp/src/utils/layout_presets.py +0 -333
- package/mcps/davinci-resolve-mcp/src/utils/mcp_stdio.py +0 -32
- package/mcps/davinci-resolve-mcp/src/utils/mcp_transport.py +0 -128
- package/mcps/davinci-resolve-mcp/src/utils/media_analysis.py +0 -7690
- package/mcps/davinci-resolve-mcp/src/utils/media_analysis_jobs.py +0 -805
- package/mcps/davinci-resolve-mcp/src/utils/media_pool_changes.py +0 -121
- package/mcps/davinci-resolve-mcp/src/utils/media_pool_ingest_live_probe.py +0 -592
- package/mcps/davinci-resolve-mcp/src/utils/multicam.py +0 -393
- package/mcps/davinci-resolve-mcp/src/utils/object_inspection.py +0 -301
- package/mcps/davinci-resolve-mcp/src/utils/page_lock.py +0 -75
- package/mcps/davinci-resolve-mcp/src/utils/platform.py +0 -157
- package/mcps/davinci-resolve-mcp/src/utils/proc.py +0 -26
- package/mcps/davinci-resolve-mcp/src/utils/project_cleanup.py +0 -73
- package/mcps/davinci-resolve-mcp/src/utils/project_lifecycle_live_probe.py +0 -376
- package/mcps/davinci-resolve-mcp/src/utils/project_lint.py +0 -131
- package/mcps/davinci-resolve-mcp/src/utils/project_properties.py +0 -601
- package/mcps/davinci-resolve-mcp/src/utils/project_spec.py +0 -459
- package/mcps/davinci-resolve-mcp/src/utils/readback.py +0 -91
- package/mcps/davinci-resolve-mcp/src/utils/render_deliver_live_probe.py +0 -384
- package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_governance.py +0 -214
- package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_ledger.py +0 -244
- package/mcps/davinci-resolve-mcp/src/utils/resolve_busy.py +0 -171
- package/mcps/davinci-resolve-mcp/src/utils/resolve_connection.py +0 -77
- package/mcps/davinci-resolve-mcp/src/utils/review_annotation_live_probe.py +0 -352
- package/mcps/davinci-resolve-mcp/src/utils/script_templates.py +0 -1193
- package/mcps/davinci-resolve-mcp/src/utils/shot_relationships.py +0 -544
- package/mcps/davinci-resolve-mcp/src/utils/structural_diff.py +0 -175
- package/mcps/davinci-resolve-mcp/src/utils/sync_detection.py +0 -889
- package/mcps/davinci-resolve-mcp/src/utils/timeline_brain_db.py +0 -826
- package/mcps/davinci-resolve-mcp/src/utils/timeline_conform_live_probe.py +0 -280
- package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_live_probe.py +0 -1092
- package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_probe.py +0 -185
- package/mcps/davinci-resolve-mcp/src/utils/timeline_title_text.py +0 -87
- package/mcps/davinci-resolve-mcp/src/utils/timeline_versioning.py +0 -730
- package/mcps/davinci-resolve-mcp/src/utils/update_check.py +0 -685
- package/mcps/vectorworks-mcp/.dockerignore +0 -8
- package/mcps/vectorworks-mcp/Dockerfile +0 -28
- package/mcps/vectorworks-mcp/README.md +0 -156
- package/mcps/vectorworks-mcp/app/__init__.py +0 -2
- package/mcps/vectorworks-mcp/app/api.py +0 -52
- package/mcps/vectorworks-mcp/app/chunking.py +0 -56
- package/mcps/vectorworks-mcp/app/config.py +0 -29
- package/mcps/vectorworks-mcp/app/embeddings.py +0 -28
- package/mcps/vectorworks-mcp/app/indexer.py +0 -106
- package/mcps/vectorworks-mcp/app/main.py +0 -33
- package/mcps/vectorworks-mcp/app/mcp_server.py +0 -71
- package/mcps/vectorworks-mcp/app/search.py +0 -54
- package/mcps/vectorworks-mcp/app/utils.py +0 -14
- package/mcps/vectorworks-mcp/data/.gitkeep +0 -1
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_PluginScript.htm +0 -95
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_ScriptEditor.htm +0 -266
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_Scripting.htm +0 -106
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2023_CreatingScriptedPlugins.htm +0 -327
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2024_RunningScripts.htm +0 -116
- package/mcps/vectorworks-mcp/data/vw-devwiki/VS_Function_Reference_category.html +0 -2129
- package/mcps/vectorworks-mcp/data/vw-jp-ref/ObjectsSymbols.html +0 -2035
- package/mcps/vectorworks-mcp/data/vw-jp-ref/ScriptFunctionReference.html +0 -29
- package/mcps/vectorworks-mcp/design.md +0 -57
- package/mcps/vectorworks-mcp/docker-compose.yml +0 -18
- package/mcps/vectorworks-mcp/index/.gitkeep +0 -1
- package/mcps/vectorworks-mcp/index/meta.jsonl +0 -3956
- package/mcps/vectorworks-mcp/index/vw.faiss +0 -0
- package/mcps/vectorworks-mcp/requirements.txt +0 -10
- package/mcps/vectorworks-mcp/scripts/fetch_docs_minimal.sh +0 -84
- package/mcps/vectorworks-mcp/scripts/fetch_github_vectorworks.sh +0 -85
- package/mcps/vectorworks-mcp/templates/index.html +0 -40
- package/scripts/ecosystem-health-audit.js +0 -257
- package/skills/bdb-dev-os-skill/SKILL.md +0 -49
- package/skills/bdb-dev-os-skill/package.json +0 -11
- package/skills/bdbsaastraining/SKILL.md +0 -316
- package/skills/bdbsaastraining/references/exam-pool.md +0 -313
- package/skills/bdbsaastraining/references/interaction-modes.md +0 -94
- package/skills/bdbsaastraining/references/track-a-ai-agent.md +0 -111
- package/skills/bdbsaastraining/references/track-b-wordpress.md +0 -111
- package/skills/bdbsaastraining/references/track-c-mailserver.md +0 -107
- package/skills/bdbsaastraining/references/track-d-debian.md +0 -109
- package/skills/bdbsaastraining/references/track-e-custom.md +0 -83
- package/skills/bdbsaastraining/scripts/build_profile.py +0 -529
- package/skills/bdbsaastraining/scripts/generate_certificate.py +0 -161
- package/skills/bdbsaastraining/scripts/preflight_check.sh +0 -150
- package/skills/bdbsaastraining/templates/certificate_template.html +0 -508
- package/skills/global_config/bdb-ecosystem-health/SKILL.md +0 -68
- package/skills/global_config/bdbsaas-ops/SKILL.md +0 -16
- package/skills/global_config/bdbsaashost/SKILL.md +0 -125
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
# Dam-Break Demo
|
|
2
|
-
|
|
3
|
-
End-to-end validation that the MCP python execution path can build a complete
|
|
4
|
-
flood-through-town scene without manual Blender UI steps (beyond enabling the
|
|
5
|
-
add-on). The repo now ships two variants:
|
|
6
|
-
|
|
7
|
-
- `procedural_dam_break_scene.py`: stable visible flood animation for Blender 4.0.x.
|
|
8
|
-
- `dam_break_scene.py`: experimental Mantaflow setup path.
|
|
9
|
-
|
|
10
|
-
## Recommended Mode
|
|
11
|
-
|
|
12
|
-
For Blender 4.0.x use the procedural scene. It produces visible water in the
|
|
13
|
-
viewport and avoids the Mantaflow viewport crash.
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
python3 scripts/demos/run_dam_break.py
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
To force the older Mantaflow path:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
python3 scripts/demos/run_dam_break.py --simulation mantaflow --bake
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## What the Procedural Demo Builds
|
|
26
|
-
|
|
27
|
-
| Element | Details |
|
|
28
|
-
|---|---|
|
|
29
|
-
| Ground plane | Street + sidewalks + barrier |
|
|
30
|
-
| 6 buildings | Blockout town section around an intersection |
|
|
31
|
-
| Flood animation | Procedural water mesh sequence over 120 frames |
|
|
32
|
-
| Debris objects | 4 props advected by the flood field |
|
|
33
|
-
| Camera | Animated cinematic overview over 120 frames |
|
|
34
|
-
| Frame range | 1–120 at 24 fps |
|
|
35
|
-
| Render settings | EEVEE, 1280×720 preview |
|
|
36
|
-
|
|
37
|
-
## Two Ways to Run
|
|
38
|
-
|
|
39
|
-
### Option A — Single script (all-in-one)
|
|
40
|
-
|
|
41
|
-
Send the monolithic scene script through MCP:
|
|
42
|
-
|
|
43
|
-
```json
|
|
44
|
-
{
|
|
45
|
-
"tool": "blender_python_exec",
|
|
46
|
-
"args": {
|
|
47
|
-
"script_path": "/path/to/scripts/demos/procedural_dam_break_scene.py",
|
|
48
|
-
"args": {"frame_end": 120}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Or via the bridge test helper:
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
python3 scripts/blender_bridge_request.py python.execute \
|
|
57
|
-
--params '{"script_path":"/path/to/scripts/demos/procedural_dam_break_scene.py","args":{"frame_end":120}}'
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Option B — Step-by-step bridge caller
|
|
61
|
-
|
|
62
|
-
The `run_dam_break.py` script sends individual MCP commands, mixing inline
|
|
63
|
-
code (for geometry) with local library scripts (sent as inline code for
|
|
64
|
-
portability, so it does not depend on approved script roots inside Blender):
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
# Dry run — see what would be sent:
|
|
68
|
-
python3 scripts/demos/run_dam_break.py --dry-run
|
|
69
|
-
|
|
70
|
-
# Run against live Blender (stable procedural mode):
|
|
71
|
-
python3 scripts/demos/run_dam_break.py
|
|
72
|
-
|
|
73
|
-
# Run Mantaflow mode instead:
|
|
74
|
-
python3 scripts/demos/run_dam_break.py --simulation mantaflow --bake --render
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Mantaflow Notes
|
|
78
|
-
|
|
79
|
-
The Mantaflow path remains in the repo for experimentation, but Blender 4.0.x
|
|
80
|
-
can crash when a visible liquid domain updates in the viewport. Use the
|
|
81
|
-
procedural scene when you need a stable visible result in the live app.
|
|
82
|
-
|
|
83
|
-
## After Scene Setup
|
|
84
|
-
|
|
85
|
-
### Bake the fluid simulation
|
|
86
|
-
|
|
87
|
-
```json
|
|
88
|
-
{
|
|
89
|
-
"tool": "blender_python_exec_async",
|
|
90
|
-
"args": {
|
|
91
|
-
"code": "import bpy\nbpy.ops.fluid.bake_all()\n__result__ = {'baked': True}",
|
|
92
|
-
"timeout_seconds": 1800
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Then poll:
|
|
98
|
-
|
|
99
|
-
```json
|
|
100
|
-
{"tool": "blender_job_status", "args": {"job_id": "<returned job_id>"}}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### Render a preview still
|
|
104
|
-
|
|
105
|
-
```json
|
|
106
|
-
{
|
|
107
|
-
"tool": "blender_render_still",
|
|
108
|
-
"args": {"output_path": "/tmp/dam_break_preview.png"}
|
|
109
|
-
}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
## What This Validates
|
|
113
|
-
|
|
114
|
-
- [x] Inline code creates geometry (ground, buildings, debris)
|
|
115
|
-
- [x] Library script `frame_range.py` sets frame range
|
|
116
|
-
- [x] Library script `fluid_domain.py` creates Mantaflow domain
|
|
117
|
-
- [x] Library script `fluid_inflow.py` creates inflow source
|
|
118
|
-
- [x] Library script `effector.py` marks objects as collision effectors
|
|
119
|
-
- [x] Library script `rigid_body.py` adds active rigid bodies
|
|
120
|
-
- [x] Library script `camera.py` creates and positions camera
|
|
121
|
-
- [x] Library script `keyframes.py` inserts dolly animation keyframes
|
|
122
|
-
- [x] Library script `collections.py` organizes scene hierarchy
|
|
123
|
-
- [x] Render settings are configurable via inline code
|
|
124
|
-
- [x] Async job path works for baking
|
|
125
|
-
- [x] Job polling and completion work
|
|
126
|
-
- [x] Render still produces output
|
|
127
|
-
|
|
128
|
-
## Gaps & Follow-Up Tickets
|
|
129
|
-
|
|
130
|
-
Issues discovered while building this demo that should be addressed in future
|
|
131
|
-
work:
|
|
132
|
-
|
|
133
|
-
### GAP-1: Live bridge scripts should avoid `bpy.ops.mesh.primitive_*`
|
|
134
|
-
|
|
135
|
-
**Status:** mitigated
|
|
136
|
-
|
|
137
|
-
The repo now includes `scripts/library/create_mesh.py`, and the bridge injects
|
|
138
|
-
an `mcp_create_mesh(...)` helper into `python.execute` scripts. Use those
|
|
139
|
-
instead of `bpy.ops.mesh.primitive_*_add` for bridge-driven blockouts,
|
|
140
|
-
especially near Mantaflow setup.
|
|
141
|
-
|
|
142
|
-
### GAP-2: No library script for render settings
|
|
143
|
-
|
|
144
|
-
**Problem:** There is no library script for configuring render engine, samples,
|
|
145
|
-
resolution, color management, or output format. The demo uses inline code.
|
|
146
|
-
|
|
147
|
-
**Impact:** Render configuration is a common task that would benefit from a
|
|
148
|
-
reusable, validated script.
|
|
149
|
-
|
|
150
|
-
**Recommendation:** Add `scripts/library/render_settings.py` supporting engine
|
|
151
|
-
selection, resolution, samples, output format, and color management.
|
|
152
|
-
|
|
153
|
-
### GAP-3: No fluid bake library script
|
|
154
|
-
|
|
155
|
-
**Problem:** Triggering `bpy.ops.fluid.bake_all()` requires inline code through
|
|
156
|
-
the async path. There is no library wrapper.
|
|
157
|
-
|
|
158
|
-
**Impact:** Minor — the inline call is simple. But a library script could add
|
|
159
|
-
validation (check domain exists, check cache dir).
|
|
160
|
-
|
|
161
|
-
**Recommendation:** Add `scripts/library/fluid_bake.py` that validates the
|
|
162
|
-
domain setup before calling bake.
|
|
163
|
-
|
|
164
|
-
### GAP-4: No viewport/OpenGL render for quick preview
|
|
165
|
-
|
|
166
|
-
**Problem:** The existing render tools only support full engine renders (EEVEE
|
|
167
|
-
or Cycles). There is no viewport render or OpenGL render option for sub-second
|
|
168
|
-
preview captures.
|
|
169
|
-
|
|
170
|
-
**Impact:** Getting visual feedback during iterative scene building requires a
|
|
171
|
-
full render, which is slow even with EEVEE at low resolution.
|
|
172
|
-
|
|
173
|
-
**Recommendation:** Add a `render.viewport` bridge command using
|
|
174
|
-
`bpy.ops.render.opengl()` for instant viewport captures.
|
|
175
|
-
|
|
176
|
-
### GAP-5: No progress callback for async jobs
|
|
177
|
-
|
|
178
|
-
**Problem:** The async job system supports polling via `job.status`, but there
|
|
179
|
-
is no way for the running script to report intermediate progress (e.g., "baking
|
|
180
|
-
frame 45/120").
|
|
181
|
-
|
|
182
|
-
**Impact:** Long bakes appear as opaque "running" status with no visibility
|
|
183
|
-
into progress.
|
|
184
|
-
|
|
185
|
-
**Recommendation:** Add a `__progress__` callback or namespace variable that
|
|
186
|
-
scripts can update, surfaced through `job.status`.
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
"""Dam-break demo scene — end-to-end Blender Python script.
|
|
2
|
-
|
|
3
|
-
Run this through the MCP bridge via ``blender_python_exec`` to build a complete
|
|
4
|
-
low-res fluid-through-town demo scene entirely from script. The scene includes:
|
|
5
|
-
|
|
6
|
-
* Ground plane as a street
|
|
7
|
-
* Three building blockout cubes
|
|
8
|
-
* Fluid domain (Mantaflow liquid, low-res)
|
|
9
|
-
* Inflow source positioned as a water release
|
|
10
|
-
* Collision effectors on ground and buildings
|
|
11
|
-
* Two dynamic rigid-body debris objects
|
|
12
|
-
* Camera with keyframed dolly animation
|
|
13
|
-
* Frame range configured for 120-frame preview
|
|
14
|
-
* Render settings tuned for a fast EEVEE preview
|
|
15
|
-
|
|
16
|
-
After running, trigger a fluid bake via ``blender_python_exec_async``::
|
|
17
|
-
|
|
18
|
-
bpy.ops.fluid.bake_all()
|
|
19
|
-
__result__ = {"baked": True}
|
|
20
|
-
|
|
21
|
-
Then render a preview via ``blender_render_still``.
|
|
22
|
-
|
|
23
|
-
Args (optional overrides):
|
|
24
|
-
resolution (int): Fluid domain max resolution. Default: 32
|
|
25
|
-
frame_end (int): Last frame of the simulation. Default: 120
|
|
26
|
-
output_dir (str): Blender-relative path for caches/renders. Default: "//"
|
|
27
|
-
"""
|
|
28
|
-
|
|
29
|
-
import math
|
|
30
|
-
|
|
31
|
-
import bpy
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def create_box_object(name, size, location):
|
|
35
|
-
if isinstance(size, (int, float)):
|
|
36
|
-
sx = sy = sz = float(size)
|
|
37
|
-
else:
|
|
38
|
-
sx, sy, sz = size
|
|
39
|
-
hx, hy, hz = sx / 2.0, sy / 2.0, sz / 2.0
|
|
40
|
-
verts = [
|
|
41
|
-
(-hx, -hy, -hz),
|
|
42
|
-
(hx, -hy, -hz),
|
|
43
|
-
(hx, hy, -hz),
|
|
44
|
-
(-hx, hy, -hz),
|
|
45
|
-
(-hx, -hy, hz),
|
|
46
|
-
(hx, -hy, hz),
|
|
47
|
-
(hx, hy, hz),
|
|
48
|
-
(-hx, hy, hz),
|
|
49
|
-
]
|
|
50
|
-
faces = [
|
|
51
|
-
(0, 1, 2, 3),
|
|
52
|
-
(4, 5, 6, 7),
|
|
53
|
-
(0, 1, 5, 4),
|
|
54
|
-
(1, 2, 6, 5),
|
|
55
|
-
(2, 3, 7, 6),
|
|
56
|
-
(3, 0, 4, 7),
|
|
57
|
-
]
|
|
58
|
-
mesh = bpy.data.meshes.new(f"{name}Mesh")
|
|
59
|
-
mesh.from_pydata(verts, [], faces)
|
|
60
|
-
mesh.update()
|
|
61
|
-
obj = bpy.data.objects.new(name, mesh)
|
|
62
|
-
bpy.context.scene.collection.objects.link(obj)
|
|
63
|
-
obj.location = location
|
|
64
|
-
return obj
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def create_plane_object(name, size, location):
|
|
68
|
-
half = size / 2.0
|
|
69
|
-
verts = [
|
|
70
|
-
(-half, -half, 0.0),
|
|
71
|
-
(half, -half, 0.0),
|
|
72
|
-
(half, half, 0.0),
|
|
73
|
-
(-half, half, 0.0),
|
|
74
|
-
]
|
|
75
|
-
mesh = bpy.data.meshes.new(f"{name}Mesh")
|
|
76
|
-
mesh.from_pydata(verts, [], [(0, 1, 2, 3)])
|
|
77
|
-
mesh.update()
|
|
78
|
-
obj = bpy.data.objects.new(name, mesh)
|
|
79
|
-
bpy.context.scene.collection.objects.link(obj)
|
|
80
|
-
obj.location = location
|
|
81
|
-
return obj
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
# ---------------------------------------------------------------------------
|
|
85
|
-
# Parameters
|
|
86
|
-
# ---------------------------------------------------------------------------
|
|
87
|
-
resolution = args.get("resolution", 32)
|
|
88
|
-
frame_end = args.get("frame_end", 120)
|
|
89
|
-
output_dir = args.get("output_dir", "//")
|
|
90
|
-
|
|
91
|
-
# ---------------------------------------------------------------------------
|
|
92
|
-
# 1. Clear default scene
|
|
93
|
-
# ---------------------------------------------------------------------------
|
|
94
|
-
bpy.ops.object.select_all(action="SELECT")
|
|
95
|
-
bpy.ops.object.delete(use_global=False)
|
|
96
|
-
|
|
97
|
-
# ---------------------------------------------------------------------------
|
|
98
|
-
# 2. Frame range
|
|
99
|
-
# ---------------------------------------------------------------------------
|
|
100
|
-
scene = bpy.context.scene
|
|
101
|
-
scene.frame_start = 1
|
|
102
|
-
scene.frame_end = frame_end
|
|
103
|
-
scene.frame_current = 1
|
|
104
|
-
scene.render.fps = 24
|
|
105
|
-
|
|
106
|
-
# ---------------------------------------------------------------------------
|
|
107
|
-
# 3. Ground plane (street)
|
|
108
|
-
# ---------------------------------------------------------------------------
|
|
109
|
-
ground = create_plane_object("Ground", 20, (0, 0, 0))
|
|
110
|
-
|
|
111
|
-
# ---------------------------------------------------------------------------
|
|
112
|
-
# 4. Buildings
|
|
113
|
-
# ---------------------------------------------------------------------------
|
|
114
|
-
buildings = [
|
|
115
|
-
{"name": "Building_A", "size": (2, 3, 4), "loc": (3, 2, 2)},
|
|
116
|
-
{"name": "Building_B", "size": (2.5, 2, 5), "loc": (-2, -1, 2.5)},
|
|
117
|
-
{"name": "Building_C", "size": (1.8, 4, 3), "loc": (1, -4, 1.5)},
|
|
118
|
-
]
|
|
119
|
-
|
|
120
|
-
building_names = []
|
|
121
|
-
for b in buildings:
|
|
122
|
-
obj = create_box_object(b["name"], b["size"], b["loc"])
|
|
123
|
-
building_names.append(obj.name)
|
|
124
|
-
|
|
125
|
-
# ---------------------------------------------------------------------------
|
|
126
|
-
# 5. Debris objects (small rigid-body props)
|
|
127
|
-
# ---------------------------------------------------------------------------
|
|
128
|
-
debris_names = []
|
|
129
|
-
debris_specs = [
|
|
130
|
-
{"name": "Debris_Crate", "loc": (2, -2, 0.4), "size": 0.8},
|
|
131
|
-
{"name": "Debris_Barrel", "loc": (-1, 1, 0.5), "size": 0.6},
|
|
132
|
-
]
|
|
133
|
-
for d in debris_specs:
|
|
134
|
-
obj = create_box_object(d["name"], d["size"], d["loc"])
|
|
135
|
-
debris_names.append(obj.name)
|
|
136
|
-
|
|
137
|
-
# ---------------------------------------------------------------------------
|
|
138
|
-
# 6. Rigid bodies on debris
|
|
139
|
-
# ---------------------------------------------------------------------------
|
|
140
|
-
for dname in debris_names:
|
|
141
|
-
obj = bpy.data.objects.get(dname)
|
|
142
|
-
if obj is None:
|
|
143
|
-
continue
|
|
144
|
-
bpy.context.view_layer.objects.active = obj
|
|
145
|
-
obj.select_set(True)
|
|
146
|
-
bpy.ops.rigidbody.object_add()
|
|
147
|
-
obj.rigid_body.type = "ACTIVE"
|
|
148
|
-
obj.rigid_body.mass = 5.0
|
|
149
|
-
obj.rigid_body.friction = 0.6
|
|
150
|
-
obj.rigid_body.restitution = 0.2
|
|
151
|
-
obj.rigid_body.collision_shape = "BOX"
|
|
152
|
-
obj.select_set(False)
|
|
153
|
-
|
|
154
|
-
# ---------------------------------------------------------------------------
|
|
155
|
-
# 7. Fluid domain
|
|
156
|
-
# ---------------------------------------------------------------------------
|
|
157
|
-
domain_size = 22
|
|
158
|
-
domain = create_box_object("FluidDomain", domain_size, (0, 0, 5))
|
|
159
|
-
dmod = domain.modifiers.new(name="Fluid", type="FLUID")
|
|
160
|
-
dmod.fluid_type = "DOMAIN"
|
|
161
|
-
dsettings = dmod.domain_settings
|
|
162
|
-
dsettings.domain_type = "LIQUID"
|
|
163
|
-
dsettings.resolution_max = resolution
|
|
164
|
-
dsettings.cache_directory = output_dir + "fluid_cache"
|
|
165
|
-
dsettings.use_mesh = True
|
|
166
|
-
dmod.show_viewport = False
|
|
167
|
-
domain.display_type = "WIRE"
|
|
168
|
-
|
|
169
|
-
# ---------------------------------------------------------------------------
|
|
170
|
-
# 8. Inflow source (water rushing in from +X side)
|
|
171
|
-
# ---------------------------------------------------------------------------
|
|
172
|
-
inflow = create_box_object("WaterInflow", 3, (8, 0, 3))
|
|
173
|
-
imod = inflow.modifiers.new(name="Fluid", type="FLUID")
|
|
174
|
-
imod.fluid_type = "FLOW"
|
|
175
|
-
imod.show_viewport = False
|
|
176
|
-
flow = imod.flow_settings
|
|
177
|
-
flow.flow_type = "LIQUID"
|
|
178
|
-
flow.flow_behavior = "INFLOW"
|
|
179
|
-
flow.use_initial_velocity = True
|
|
180
|
-
flow.velocity_normal = 0
|
|
181
|
-
flow.velocity_coord = (-4, 0, 0) # rushing toward -X
|
|
182
|
-
inflow.hide_viewport = True
|
|
183
|
-
inflow.hide_render = True
|
|
184
|
-
|
|
185
|
-
# ---------------------------------------------------------------------------
|
|
186
|
-
# 9. Collision effectors — ground + buildings
|
|
187
|
-
# ---------------------------------------------------------------------------
|
|
188
|
-
collider_names = ["Ground"] + building_names
|
|
189
|
-
for cname in collider_names:
|
|
190
|
-
obj = bpy.data.objects.get(cname)
|
|
191
|
-
if obj is None:
|
|
192
|
-
continue
|
|
193
|
-
emod = obj.modifiers.get("Fluid") or obj.modifiers.new(name="Fluid", type="FLUID")
|
|
194
|
-
emod.fluid_type = "EFFECTOR"
|
|
195
|
-
eff = emod.effector_settings
|
|
196
|
-
eff.effector_type = "COLLISION"
|
|
197
|
-
eff.surface_distance = 0.01
|
|
198
|
-
|
|
199
|
-
# ---------------------------------------------------------------------------
|
|
200
|
-
# 10. Camera with dolly keyframes
|
|
201
|
-
# ---------------------------------------------------------------------------
|
|
202
|
-
cam_data = bpy.data.cameras.new("DamBreakCam")
|
|
203
|
-
cam_obj = bpy.data.objects.new("DamBreakCam", cam_data)
|
|
204
|
-
bpy.context.collection.objects.link(cam_obj)
|
|
205
|
-
cam_obj.data.lens = 35
|
|
206
|
-
|
|
207
|
-
scene.camera = cam_obj
|
|
208
|
-
|
|
209
|
-
cam_keyframes = [
|
|
210
|
-
{"frame": 1, "location": (15, -12, 8), "rotation": (math.radians(60), 0, math.radians(50))},
|
|
211
|
-
{"frame": frame_end // 2, "location": (6, -10, 5), "rotation": (math.radians(65), 0, math.radians(30))},
|
|
212
|
-
{"frame": frame_end, "location": (0, -8, 3), "rotation": (math.radians(70), 0, math.radians(10))},
|
|
213
|
-
]
|
|
214
|
-
for kf in cam_keyframes:
|
|
215
|
-
cam_obj.location = kf["location"]
|
|
216
|
-
cam_obj.rotation_euler = kf["rotation"]
|
|
217
|
-
cam_obj.keyframe_insert(data_path="location", frame=kf["frame"])
|
|
218
|
-
cam_obj.keyframe_insert(data_path="rotation_euler", frame=kf["frame"])
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
# ---------------------------------------------------------------------------
|
|
222
|
-
# 11. Collections
|
|
223
|
-
# ---------------------------------------------------------------------------
|
|
224
|
-
def move_to_collection(obj_name, coll_name):
|
|
225
|
-
obj = bpy.data.objects.get(obj_name)
|
|
226
|
-
if obj is None:
|
|
227
|
-
return
|
|
228
|
-
coll = bpy.data.collections.get(coll_name)
|
|
229
|
-
if coll is None:
|
|
230
|
-
coll = bpy.data.collections.new(coll_name)
|
|
231
|
-
scene.collection.children.link(coll)
|
|
232
|
-
for c in obj.users_collection:
|
|
233
|
-
c.objects.unlink(obj)
|
|
234
|
-
coll.objects.link(obj)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
for bn in building_names:
|
|
238
|
-
move_to_collection(bn, "Buildings")
|
|
239
|
-
for dn in debris_names:
|
|
240
|
-
move_to_collection(dn, "Debris")
|
|
241
|
-
move_to_collection("Ground", "Environment")
|
|
242
|
-
move_to_collection("FluidDomain", "Fluid")
|
|
243
|
-
move_to_collection("WaterInflow", "Fluid")
|
|
244
|
-
move_to_collection("DamBreakCam", "Camera")
|
|
245
|
-
|
|
246
|
-
# ---------------------------------------------------------------------------
|
|
247
|
-
# 12. Render settings (fast EEVEE preview)
|
|
248
|
-
# ---------------------------------------------------------------------------
|
|
249
|
-
scene.render.engine = "BLENDER_EEVEE"
|
|
250
|
-
scene.render.resolution_x = 960
|
|
251
|
-
scene.render.resolution_y = 540
|
|
252
|
-
scene.render.resolution_percentage = 100
|
|
253
|
-
scene.render.filepath = output_dir + "dam_break_preview"
|
|
254
|
-
|
|
255
|
-
# ---------------------------------------------------------------------------
|
|
256
|
-
# Result summary
|
|
257
|
-
# ---------------------------------------------------------------------------
|
|
258
|
-
__result__ = {
|
|
259
|
-
"scene": scene.name,
|
|
260
|
-
"frame_range": [scene.frame_start, scene.frame_end],
|
|
261
|
-
"fluid_domain": domain.name,
|
|
262
|
-
"fluid_resolution": resolution,
|
|
263
|
-
"inflow": inflow.name,
|
|
264
|
-
"colliders": collider_names,
|
|
265
|
-
"debris": debris_names,
|
|
266
|
-
"camera": cam_obj.name,
|
|
267
|
-
"camera_keyframes": len(cam_keyframes),
|
|
268
|
-
"buildings": building_names,
|
|
269
|
-
"render_engine": scene.render.engine,
|
|
270
|
-
"render_resolution": [scene.render.resolution_x, scene.render.resolution_y],
|
|
271
|
-
"next_steps": [
|
|
272
|
-
"The liquid domain stays hidden in the viewport to avoid Blender 4.0.2 view-layer update crashes.",
|
|
273
|
-
"Bake fluid: blender_python_exec_async with code 'bpy.ops.fluid.bake_all(); __result__={\"baked\":True}'",
|
|
274
|
-
"Render preview: blender_render_still with output_path '/tmp/dam_break.png'",
|
|
275
|
-
],
|
|
276
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"""Open Blender GUI with the stable procedural dam-break scene built.
|
|
2
|
-
|
|
3
|
-
Run:
|
|
4
|
-
blender --factory-startup --python scripts/demos/open_dam_break_gui.py
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
|
|
11
|
-
import bpy
|
|
12
|
-
|
|
13
|
-
SCENE_SCRIPT = Path(__file__).with_name("procedural_dam_break_scene.py")
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def main() -> None:
|
|
17
|
-
args = {
|
|
18
|
-
"frame_end": 120,
|
|
19
|
-
"output_dir": "//",
|
|
20
|
-
}
|
|
21
|
-
namespace = {
|
|
22
|
-
"__name__": "__main__",
|
|
23
|
-
"args": args,
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
code = SCENE_SCRIPT.read_text(encoding="utf-8")
|
|
27
|
-
exec(compile(code, str(SCENE_SCRIPT), "exec"), namespace)
|
|
28
|
-
bpy.context.scene.frame_set(min(70, bpy.context.scene.frame_end))
|
|
29
|
-
print("Procedural dam-break scene ready in Blender GUI")
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if __name__ == "__main__":
|
|
33
|
-
main()
|