@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,75 +0,0 @@
|
|
|
1
|
-
"""Serialize DaVinci Resolve page switches across threads and processes.
|
|
2
|
-
|
|
3
|
-
Resolve has a single globally-active page (Edit / Color / Fusion / Fairlight /
|
|
4
|
-
Deliver / Cut). An operation that switches the page, does work there, and reads a
|
|
5
|
-
result is only correct if no other operation flips the page underneath it. With a
|
|
6
|
-
single stdio client that never happens, but the moment two agents (threads, or
|
|
7
|
-
separate server processes) drive one Resolve, concurrent page switches corrupt
|
|
8
|
-
each other. This primitive serializes the critical section, so it must be in
|
|
9
|
-
place before any concurrent-agent feature ships.
|
|
10
|
-
|
|
11
|
-
- Intra-process: a reentrant lock (nested page_lock() calls are safe).
|
|
12
|
-
- Inter-process: a best-effort advisory file lock around the OUTERMOST section
|
|
13
|
-
(fcntl). On platforms without fcntl (Windows) the inter-process guard is a
|
|
14
|
-
no-op and only the intra-process lock applies.
|
|
15
|
-
|
|
16
|
-
Usage:
|
|
17
|
-
|
|
18
|
-
with page_lock():
|
|
19
|
-
resolve.OpenPage("color")
|
|
20
|
-
... do color-page work, read results ...
|
|
21
|
-
"""
|
|
22
|
-
import os
|
|
23
|
-
import tempfile
|
|
24
|
-
import threading
|
|
25
|
-
from contextlib import contextmanager
|
|
26
|
-
|
|
27
|
-
try:
|
|
28
|
-
import fcntl # type: ignore
|
|
29
|
-
_HAS_FCNTL = True
|
|
30
|
-
except ImportError: # pragma: no cover - Windows
|
|
31
|
-
_HAS_FCNTL = False
|
|
32
|
-
|
|
33
|
-
_INTRA = threading.RLock()
|
|
34
|
-
_LOCKFILE = os.path.join(tempfile.gettempdir(), "davinci_resolve_mcp_page.lock")
|
|
35
|
-
|
|
36
|
-
# Nesting depth and the held file handle, both guarded by _INTRA. The file lock
|
|
37
|
-
# is taken only at the outermost level — a second fcntl.flock() on a new fd from
|
|
38
|
-
# the same process would block on the first, deadlocking nested page_lock()s.
|
|
39
|
-
_depth = 0
|
|
40
|
-
_fh = None
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
@contextmanager
|
|
44
|
-
def page_lock():
|
|
45
|
-
"""Hold the page-switch lock for the duration of the block (reentrant)."""
|
|
46
|
-
global _depth, _fh
|
|
47
|
-
_INTRA.acquire()
|
|
48
|
-
_depth += 1
|
|
49
|
-
try:
|
|
50
|
-
if _depth == 1 and _HAS_FCNTL:
|
|
51
|
-
try:
|
|
52
|
-
_fh = open(_LOCKFILE, "w")
|
|
53
|
-
fcntl.flock(_fh, fcntl.LOCK_EX)
|
|
54
|
-
except OSError:
|
|
55
|
-
# Advisory lock is best-effort; never block real work on it.
|
|
56
|
-
if _fh is not None:
|
|
57
|
-
_fh.close()
|
|
58
|
-
_fh = None
|
|
59
|
-
yield
|
|
60
|
-
finally:
|
|
61
|
-
_depth -= 1
|
|
62
|
-
if _depth == 0 and _fh is not None:
|
|
63
|
-
try:
|
|
64
|
-
fcntl.flock(_fh, fcntl.LOCK_UN)
|
|
65
|
-
except OSError:
|
|
66
|
-
pass
|
|
67
|
-
_fh.close()
|
|
68
|
-
_fh = None
|
|
69
|
-
_INTRA.release()
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def open_page_serialized(resolve, page):
|
|
73
|
-
"""Switch Resolve to `page` under the page lock. Returns OpenPage's result."""
|
|
74
|
-
with page_lock():
|
|
75
|
-
return resolve.OpenPage(page)
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Platform-specific functionality for DaVinci Resolve MCP Server
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
import os
|
|
7
|
-
import sys
|
|
8
|
-
import platform
|
|
9
|
-
|
|
10
|
-
def get_platform():
|
|
11
|
-
"""Identify the current operating system platform.
|
|
12
|
-
|
|
13
|
-
Returns:
|
|
14
|
-
str: 'windows', 'darwin' (macOS), or 'linux'
|
|
15
|
-
"""
|
|
16
|
-
system = platform.system().lower()
|
|
17
|
-
if system == 'darwin':
|
|
18
|
-
return 'darwin'
|
|
19
|
-
elif system == 'windows':
|
|
20
|
-
return 'windows'
|
|
21
|
-
elif system == 'linux':
|
|
22
|
-
return 'linux'
|
|
23
|
-
return system
|
|
24
|
-
|
|
25
|
-
def get_resolve_paths():
|
|
26
|
-
"""Get platform-specific paths for DaVinci Resolve scripting API.
|
|
27
|
-
|
|
28
|
-
Returns:
|
|
29
|
-
dict: Dictionary containing api_path, lib_path, and modules_path
|
|
30
|
-
"""
|
|
31
|
-
platform_name = get_platform()
|
|
32
|
-
|
|
33
|
-
if platform_name == 'darwin': # macOS
|
|
34
|
-
api_path = "/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting"
|
|
35
|
-
lib_path = "/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so"
|
|
36
|
-
modules_path = os.path.join(api_path, "Modules")
|
|
37
|
-
|
|
38
|
-
elif platform_name == 'windows': # Windows
|
|
39
|
-
program_files = os.environ.get('PROGRAMDATA', 'C:\\ProgramData')
|
|
40
|
-
program_files_64 = os.environ.get('PROGRAMFILES', 'C:\\Program Files')
|
|
41
|
-
|
|
42
|
-
api_path = os.path.join(program_files, 'Blackmagic Design', 'DaVinci Resolve', 'Support', 'Developer', 'Scripting')
|
|
43
|
-
lib_path = os.path.join(program_files_64, 'Blackmagic Design', 'DaVinci Resolve', 'fusionscript.dll')
|
|
44
|
-
modules_path = os.path.join(api_path, "Modules")
|
|
45
|
-
|
|
46
|
-
elif platform_name == 'linux': # Linux (not fully implemented)
|
|
47
|
-
# Default locations for Linux - these may need to be adjusted
|
|
48
|
-
api_path = "/opt/resolve/Developer/Scripting"
|
|
49
|
-
lib_path = "/opt/resolve/libs/fusionscript.so"
|
|
50
|
-
modules_path = os.path.join(api_path, "Modules")
|
|
51
|
-
|
|
52
|
-
else:
|
|
53
|
-
# Fallback to macOS paths if unknown platform
|
|
54
|
-
api_path = "/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting"
|
|
55
|
-
lib_path = "/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so"
|
|
56
|
-
modules_path = os.path.join(api_path, "Modules")
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
"api_path": api_path,
|
|
60
|
-
"lib_path": lib_path,
|
|
61
|
-
"modules_path": modules_path
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
def get_resolve_plugin_paths():
|
|
65
|
-
"""Get platform-specific paths for Resolve plugin install dirs.
|
|
66
|
-
|
|
67
|
-
Returns:
|
|
68
|
-
dict: {
|
|
69
|
-
'fuses_dir': Fusion Fuses directory,
|
|
70
|
-
'dctl_dir': LUT directory (where regular .dctl files live),
|
|
71
|
-
'aces_idt_dir': ACES IDT transforms (separate scan path; restart
|
|
72
|
-
required after install),
|
|
73
|
-
'aces_odt_dir': ACES ODT transforms (same caveat),
|
|
74
|
-
}
|
|
75
|
-
"""
|
|
76
|
-
platform_name = get_platform()
|
|
77
|
-
home = os.path.expanduser("~")
|
|
78
|
-
|
|
79
|
-
# NOTE: The Fuse SDK doc (June 2023) lists Fuses under "Support/Fusion/Fuses"
|
|
80
|
-
# on macOS, but the directory Resolve actually scans is the sibling
|
|
81
|
-
# "Fusion/Fuses" (without "Support") — verified live against Resolve Studio
|
|
82
|
-
# 20.3.2.9 by writing test fuses to both paths and observing which loaded.
|
|
83
|
-
# Per-platform conventions also differ from the SDK doc; we follow the
|
|
84
|
-
# canonical Fusion user-data layout where every Fusion user directory
|
|
85
|
-
# (Macros, Templates, Scripts, Modules, Fuses, ...) lives directly under
|
|
86
|
-
# the platform's Fusion user root.
|
|
87
|
-
if platform_name == 'darwin':
|
|
88
|
-
support = os.path.join(home, "Library", "Application Support",
|
|
89
|
-
"Blackmagic Design", "DaVinci Resolve")
|
|
90
|
-
fuses_dir = os.path.join(support, "Fusion", "Fuses")
|
|
91
|
-
dctl_dir = os.path.join(support, "LUT")
|
|
92
|
-
aces_root = os.path.join(support, "ACES Transforms")
|
|
93
|
-
elif platform_name == 'windows':
|
|
94
|
-
appdata = os.environ.get('APPDATA', os.path.join(home, 'AppData', 'Roaming'))
|
|
95
|
-
fuses_dir = os.path.join(appdata, 'Blackmagic Design', 'DaVinci Resolve',
|
|
96
|
-
'Support', 'Fusion', 'Fuses')
|
|
97
|
-
dctl_dir = os.path.join(appdata, 'Blackmagic Design', 'DaVinci Resolve',
|
|
98
|
-
'Support', 'LUT')
|
|
99
|
-
aces_root = os.path.join(appdata, 'Blackmagic Design', 'DaVinci Resolve',
|
|
100
|
-
'Support', 'ACES Transforms')
|
|
101
|
-
elif platform_name == 'linux':
|
|
102
|
-
base = os.path.join(home, '.local', 'share', 'DaVinciResolve')
|
|
103
|
-
fuses_dir = os.path.join(base, 'Fusion', 'Fuses')
|
|
104
|
-
dctl_dir = os.path.join(base, 'LUT')
|
|
105
|
-
aces_root = os.path.join(base, 'ACES Transforms')
|
|
106
|
-
else:
|
|
107
|
-
support = os.path.join(home, "Library", "Application Support",
|
|
108
|
-
"Blackmagic Design", "DaVinci Resolve")
|
|
109
|
-
fuses_dir = os.path.join(support, "Fusion", "Fuses")
|
|
110
|
-
dctl_dir = os.path.join(support, "LUT")
|
|
111
|
-
aces_root = os.path.join(support, "ACES Transforms")
|
|
112
|
-
|
|
113
|
-
# Resolve scans these subdirs of Fusion/Scripts/ at startup and exposes
|
|
114
|
-
# them in Workspace → Scripts → <category>. Categories per Resolve docs.
|
|
115
|
-
if platform_name == 'darwin':
|
|
116
|
-
scripts_root = os.path.join(support, "Fusion", "Scripts")
|
|
117
|
-
elif platform_name == 'windows':
|
|
118
|
-
scripts_root = os.path.join(appdata, 'Blackmagic Design', 'DaVinci Resolve',
|
|
119
|
-
'Support', 'Fusion', 'Scripts')
|
|
120
|
-
elif platform_name == 'linux':
|
|
121
|
-
scripts_root = os.path.join(base, 'Fusion', 'Scripts')
|
|
122
|
-
else:
|
|
123
|
-
scripts_root = os.path.join(support, "Fusion", "Scripts")
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
"fuses_dir": fuses_dir,
|
|
127
|
-
"dctl_dir": dctl_dir,
|
|
128
|
-
"aces_idt_dir": os.path.join(aces_root, "IDT"),
|
|
129
|
-
"aces_odt_dir": os.path.join(aces_root, "ODT"),
|
|
130
|
-
"scripts_root": scripts_root,
|
|
131
|
-
# Category subdirs Resolve actually scans (verified live):
|
|
132
|
-
"scripts_categories": ("Edit", "Color", "Deliver", "Comp",
|
|
133
|
-
"Tool", "Utility", "Views"),
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def setup_environment():
|
|
138
|
-
"""Set up environment variables for DaVinci Resolve scripting.
|
|
139
|
-
|
|
140
|
-
Returns:
|
|
141
|
-
bool: True if setup was successful, False otherwise
|
|
142
|
-
"""
|
|
143
|
-
try:
|
|
144
|
-
paths = get_resolve_paths()
|
|
145
|
-
|
|
146
|
-
os.environ["RESOLVE_SCRIPT_API"] = paths["api_path"]
|
|
147
|
-
os.environ["RESOLVE_SCRIPT_LIB"] = paths["lib_path"]
|
|
148
|
-
|
|
149
|
-
# Add modules path to Python's path if it's not already there
|
|
150
|
-
if paths["modules_path"] not in sys.path:
|
|
151
|
-
sys.path.append(paths["modules_path"])
|
|
152
|
-
|
|
153
|
-
return True
|
|
154
|
-
|
|
155
|
-
except Exception as e:
|
|
156
|
-
print(f"Error setting up environment: {str(e)}")
|
|
157
|
-
return False
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"""Subprocess helpers that are safe to call while the MCP stdio server is live.
|
|
2
|
-
|
|
3
|
-
The server owns the JSON-RPC stdin/stdout while serving over stdio. A child
|
|
4
|
-
process that inherits stdin can race-read bytes off the protocol stream and
|
|
5
|
-
corrupt it; ``capture_output`` only redirects stdout/stderr. These wrappers
|
|
6
|
-
default ``stdin`` to ``DEVNULL`` so subprocess hygiene is centralized rather
|
|
7
|
-
than re-applied at every call site.
|
|
8
|
-
"""
|
|
9
|
-
import subprocess
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def safe_run(*args: Any, **kwargs: Any) -> "subprocess.CompletedProcess":
|
|
14
|
-
"""subprocess.run with stdin defaulted to DEVNULL (override by passing stdin).
|
|
15
|
-
|
|
16
|
-
If ``input`` is given, stdin is left alone — subprocess forbids passing both.
|
|
17
|
-
"""
|
|
18
|
-
if "input" not in kwargs:
|
|
19
|
-
kwargs.setdefault("stdin", subprocess.DEVNULL)
|
|
20
|
-
return subprocess.run(*args, **kwargs)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def safe_popen(*args: Any, **kwargs: Any) -> "subprocess.Popen":
|
|
24
|
-
"""subprocess.Popen with stdin defaulted to DEVNULL (override by passing stdin)."""
|
|
25
|
-
kwargs.setdefault("stdin", subprocess.DEVNULL)
|
|
26
|
-
return subprocess.Popen(*args, **kwargs)
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"""Best-effort deletion of disposable Resolve projects.
|
|
2
|
-
|
|
3
|
-
DeleteProject is flaky on some Resolve builds: it silently returns False when
|
|
4
|
-
the target is (or was very recently) the current project, and occasionally on
|
|
5
|
-
the first attempt even when it isn't. Disposable test projects then linger in
|
|
6
|
-
the project library. This helper centralizes the mitigation so every
|
|
7
|
-
disposable-project flow gets it for free:
|
|
8
|
-
|
|
9
|
-
1. make sure the target is not the current project (load a fallback project,
|
|
10
|
-
or close the target if no fallback is available),
|
|
11
|
-
2. retry the delete once after a short pause,
|
|
12
|
-
3. report the leftover by name when it still fails, so callers can surface it
|
|
13
|
-
instead of silently leaking.
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
import time
|
|
17
|
-
from typing import Any, Dict, Optional
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def delete_project_safely(
|
|
21
|
-
pm: Any,
|
|
22
|
-
name: str,
|
|
23
|
-
*,
|
|
24
|
-
switch_to: Optional[str] = None,
|
|
25
|
-
retries: int = 1,
|
|
26
|
-
delay_seconds: float = 1.0,
|
|
27
|
-
) -> Dict[str, Any]:
|
|
28
|
-
"""Delete project `name` via project-manager handle `pm`, working around
|
|
29
|
-
DeleteProject flakiness. Returns {success, attempts, leftover, detail}.
|
|
30
|
-
|
|
31
|
-
`switch_to`: project to load first when `name` is current (e.g. the
|
|
32
|
-
project that was open before the disposable one was created). Without it,
|
|
33
|
-
the current project is closed instead.
|
|
34
|
-
"""
|
|
35
|
-
attempts = 0
|
|
36
|
-
detail = ""
|
|
37
|
-
try:
|
|
38
|
-
current = None
|
|
39
|
-
try:
|
|
40
|
-
project = pm.GetCurrentProject()
|
|
41
|
-
current = project.GetName() if project else None
|
|
42
|
-
except Exception:
|
|
43
|
-
current = None
|
|
44
|
-
if current == name:
|
|
45
|
-
switched = False
|
|
46
|
-
if switch_to and switch_to != name:
|
|
47
|
-
try:
|
|
48
|
-
switched = bool(pm.LoadProject(switch_to))
|
|
49
|
-
except Exception:
|
|
50
|
-
switched = False
|
|
51
|
-
if not switched:
|
|
52
|
-
try:
|
|
53
|
-
project = pm.GetCurrentProject()
|
|
54
|
-
if project is not None:
|
|
55
|
-
pm.CloseProject(project)
|
|
56
|
-
except Exception:
|
|
57
|
-
pass
|
|
58
|
-
|
|
59
|
-
last_error = None
|
|
60
|
-
for attempt in range(1 + max(0, int(retries))):
|
|
61
|
-
attempts = attempt + 1
|
|
62
|
-
try:
|
|
63
|
-
if bool(pm.DeleteProject(name)):
|
|
64
|
-
return {"success": True, "attempts": attempts, "leftover": None, "detail": ""}
|
|
65
|
-
last_error = "DeleteProject returned False"
|
|
66
|
-
except Exception as exc:
|
|
67
|
-
last_error = str(exc)
|
|
68
|
-
if attempt < retries:
|
|
69
|
-
time.sleep(max(0.0, delay_seconds))
|
|
70
|
-
detail = last_error or "DeleteProject failed"
|
|
71
|
-
except Exception as exc:
|
|
72
|
-
detail = str(exc)
|
|
73
|
-
return {"success": False, "attempts": attempts, "leftover": name, "detail": detail}
|