@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,115 +0,0 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "davinci-mcp-professional"
|
|
3
|
-
dynamic = ["version"]
|
|
4
|
-
description = "Model Context Protocol server for DaVinci Resolve integration"
|
|
5
|
-
readme = "README.md"
|
|
6
|
-
license = { file = "COPYING.md" }
|
|
7
|
-
authors = [
|
|
8
|
-
{ name = "Hoyt Harness", email = "hoyt.harness@gmail.com" }
|
|
9
|
-
]
|
|
10
|
-
classifiers = [
|
|
11
|
-
"Development Status :: 4 - Beta",
|
|
12
|
-
"Intended Audience :: Developers",
|
|
13
|
-
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
|
|
14
|
-
"Programming Language :: Python :: 3.10",
|
|
15
|
-
"Programming Language :: Python :: 3.11",
|
|
16
|
-
"Programming Language :: Python :: 3.12",
|
|
17
|
-
"Programming Language :: Python :: 3.13",
|
|
18
|
-
"Programming Language :: Python :: 3.14",
|
|
19
|
-
]
|
|
20
|
-
requires-python = ">=3.10"
|
|
21
|
-
dependencies = [
|
|
22
|
-
"mcp>=1.10.0",
|
|
23
|
-
"anyio>=4.9",
|
|
24
|
-
"httpx>=0.27.1,<1.0.0",
|
|
25
|
-
"pydantic>=2.12.0",
|
|
26
|
-
"click>=8.0.0",
|
|
27
|
-
"colorama>=0.4.6",
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
[project.optional-dependencies]
|
|
31
|
-
build = [
|
|
32
|
-
"pyinstaller>=6.0.0",
|
|
33
|
-
]
|
|
34
|
-
|
|
35
|
-
[project.scripts]
|
|
36
|
-
davinci-mcp = "davinci_mcp.cli:main"
|
|
37
|
-
|
|
38
|
-
[project.urls]
|
|
39
|
-
Homepage = "https://github.com/Positronikal/davinci-mcp-professional"
|
|
40
|
-
Repository = "https://github.com/Positronikal/davinci-mcp-professional"
|
|
41
|
-
Issues = "https://github.com/Positronikal/davinci-mcp-professional/issues"
|
|
42
|
-
|
|
43
|
-
[build-system]
|
|
44
|
-
requires = ["hatchling", "hatch-vcs"]
|
|
45
|
-
build-backend = "hatchling.build"
|
|
46
|
-
|
|
47
|
-
[tool.hatch.version]
|
|
48
|
-
source = "vcs"
|
|
49
|
-
raw-options = { version_scheme = "no-guess-dev" }
|
|
50
|
-
|
|
51
|
-
[tool.hatch.build.hooks.vcs]
|
|
52
|
-
version-file = "src/davinci_mcp/_version.py"
|
|
53
|
-
|
|
54
|
-
[tool.hatch.build.targets.wheel]
|
|
55
|
-
packages = ["src/davinci_mcp"]
|
|
56
|
-
|
|
57
|
-
[tool.uv]
|
|
58
|
-
default-groups = ["dev"]
|
|
59
|
-
|
|
60
|
-
[dependency-groups]
|
|
61
|
-
dev = [
|
|
62
|
-
"pytest>=8.0.0",
|
|
63
|
-
"pytest-asyncio>=0.23.0",
|
|
64
|
-
"pytest-cov>=5.0.0",
|
|
65
|
-
"mypy>=1.10.0",
|
|
66
|
-
"ruff>=0.4.0",
|
|
67
|
-
"safety>=3.0.0",
|
|
68
|
-
"bandit>=1.7.8",
|
|
69
|
-
"pip-licenses>=4.4.0",
|
|
70
|
-
"pyright>=1.1.400",
|
|
71
|
-
]
|
|
72
|
-
|
|
73
|
-
[tool.mypy]
|
|
74
|
-
python_version = "3.10"
|
|
75
|
-
warn_return_any = true
|
|
76
|
-
warn_unused_configs = true
|
|
77
|
-
disallow_untyped_defs = true
|
|
78
|
-
check_untyped_defs = true
|
|
79
|
-
|
|
80
|
-
[tool.pyright]
|
|
81
|
-
pythonVersion = "3.10"
|
|
82
|
-
typeCheckingMode = "basic"
|
|
83
|
-
reportMissingImports = true
|
|
84
|
-
reportMissingTypeStubs = false
|
|
85
|
-
reportUnusedImport = true
|
|
86
|
-
reportUnusedVariable = true
|
|
87
|
-
reportDuplicateImport = true
|
|
88
|
-
reportUntypedFunctionDecorator = false
|
|
89
|
-
reportUntypedClassDecorator = false
|
|
90
|
-
reportUntypedBaseClass = false
|
|
91
|
-
reportUntypedNamedTuple = false
|
|
92
|
-
reportPrivateUsage = false
|
|
93
|
-
reportConstantRedefinition = true
|
|
94
|
-
reportIncompatibleMethodOverride = true
|
|
95
|
-
reportIncompatibleVariableOverride = true
|
|
96
|
-
reportInconsistentConstructor = true
|
|
97
|
-
exclude = [
|
|
98
|
-
"**/__pycache__",
|
|
99
|
-
"**/node_modules",
|
|
100
|
-
".venv",
|
|
101
|
-
"build",
|
|
102
|
-
"dist",
|
|
103
|
-
"tests",
|
|
104
|
-
]
|
|
105
|
-
include = [
|
|
106
|
-
"src",
|
|
107
|
-
]
|
|
108
|
-
|
|
109
|
-
[tool.ruff]
|
|
110
|
-
line-length = 88
|
|
111
|
-
target-version = "py310"
|
|
112
|
-
|
|
113
|
-
[tool.ruff.lint]
|
|
114
|
-
select = ["E", "F", "I", "UP", "C4", "PERF"]
|
|
115
|
-
ignore = ["PERF203"]
|
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Security audit script for DaVinci MCP Professional.
|
|
4
|
-
|
|
5
|
-
This script runs a comprehensive security audit including:
|
|
6
|
-
- Dependency vulnerability scanning
|
|
7
|
-
- Static application security testing (SAST)
|
|
8
|
-
- License compliance checking
|
|
9
|
-
- Code quality analysis
|
|
10
|
-
- Security test execution
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
import subprocess
|
|
14
|
-
import sys
|
|
15
|
-
import json
|
|
16
|
-
import os
|
|
17
|
-
from pathlib import Path
|
|
18
|
-
from typing import Dict, List, Tuple, Optional
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class SecurityAuditor:
|
|
22
|
-
"""Comprehensive security auditing tool."""
|
|
23
|
-
|
|
24
|
-
def __init__(self, project_root: Optional[Path] = None):
|
|
25
|
-
self.project_root = project_root or Path(__file__).parent
|
|
26
|
-
self.results = {}
|
|
27
|
-
self.errors = []
|
|
28
|
-
|
|
29
|
-
def run_command(self, cmd: List[str], description: str) -> Tuple[bool, str, str]:
|
|
30
|
-
"""Run a command and capture output."""
|
|
31
|
-
try:
|
|
32
|
-
result = subprocess.run(
|
|
33
|
-
cmd, capture_output=True, text=True, cwd=self.project_root
|
|
34
|
-
)
|
|
35
|
-
return (
|
|
36
|
-
result.returncode == 0,
|
|
37
|
-
result.stdout,
|
|
38
|
-
result.stderr
|
|
39
|
-
)
|
|
40
|
-
except FileNotFoundError:
|
|
41
|
-
return False, "", f"Command not found: {cmd[0]}"
|
|
42
|
-
except Exception as e:
|
|
43
|
-
return False, "", str(e)
|
|
44
|
-
|
|
45
|
-
def check_dependencies_safety(self) -> Dict:
|
|
46
|
-
"""Check dependencies for known vulnerabilities using Safety."""
|
|
47
|
-
print("🔍 Checking dependencies with Safety...")
|
|
48
|
-
|
|
49
|
-
success, stdout, stderr = self.run_command(
|
|
50
|
-
["safety", "check", "--json"],
|
|
51
|
-
"Safety vulnerability scan"
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
if success:
|
|
55
|
-
try:
|
|
56
|
-
vulnerabilities = json.loads(stdout) if stdout.strip() else []
|
|
57
|
-
return {
|
|
58
|
-
"status": "success",
|
|
59
|
-
"vulnerabilities": vulnerabilities,
|
|
60
|
-
"count": len(vulnerabilities)
|
|
61
|
-
}
|
|
62
|
-
except json.JSONDecodeError:
|
|
63
|
-
return {
|
|
64
|
-
"status": "error",
|
|
65
|
-
"error": "Failed to parse Safety output"
|
|
66
|
-
}
|
|
67
|
-
else:
|
|
68
|
-
return {
|
|
69
|
-
"status": "error",
|
|
70
|
-
"error": stderr or "Safety check failed"
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
def run_bandit_sast(self) -> Dict:
|
|
74
|
-
"""Run Bandit static application security testing."""
|
|
75
|
-
print("🔍 Running Bandit SAST analysis...")
|
|
76
|
-
|
|
77
|
-
success, stdout, stderr = self.run_command(
|
|
78
|
-
["bandit", "-r", "src/", "-f", "json", "-o", "bandit-report.json"],
|
|
79
|
-
"Bandit SAST scan"
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
# Bandit returns non-zero when issues are found, so check the output file
|
|
83
|
-
report_file = self.project_root / "bandit-report.json"
|
|
84
|
-
if report_file.exists():
|
|
85
|
-
try:
|
|
86
|
-
with open(report_file, 'r') as f:
|
|
87
|
-
report = json.load(f)
|
|
88
|
-
|
|
89
|
-
return {
|
|
90
|
-
"status": "success",
|
|
91
|
-
"results": report.get("results", []),
|
|
92
|
-
"metrics": report.get("metrics", {}),
|
|
93
|
-
"count": len(report.get("results", []))
|
|
94
|
-
}
|
|
95
|
-
except Exception as e:
|
|
96
|
-
return {
|
|
97
|
-
"status": "error",
|
|
98
|
-
"error": f"Failed to read Bandit report: {e}"
|
|
99
|
-
}
|
|
100
|
-
else:
|
|
101
|
-
return {
|
|
102
|
-
"status": "error",
|
|
103
|
-
"error": "Bandit report not generated"
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
def check_license_compliance(self) -> Dict:
|
|
107
|
-
"""Check license compliance."""
|
|
108
|
-
print("📄 Checking license compliance...")
|
|
109
|
-
|
|
110
|
-
success, stdout, stderr = self.run_command(
|
|
111
|
-
["pip-licenses", "--format=json"],
|
|
112
|
-
"License compliance check"
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
if success:
|
|
116
|
-
try:
|
|
117
|
-
licenses = json.loads(stdout)
|
|
118
|
-
|
|
119
|
-
# Check for problematic licenses
|
|
120
|
-
problematic_licenses = [
|
|
121
|
-
"GPL", "AGPL", "LGPL", "CDDL", "EPL", "MPL"
|
|
122
|
-
]
|
|
123
|
-
|
|
124
|
-
issues = []
|
|
125
|
-
for package in licenses:
|
|
126
|
-
license_name = package.get("License", "").upper()
|
|
127
|
-
if any(prob in license_name for prob in problematic_licenses):
|
|
128
|
-
issues.append({
|
|
129
|
-
"package": package.get("Name"),
|
|
130
|
-
"license": package.get("License"),
|
|
131
|
-
"version": package.get("Version")
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
return {
|
|
135
|
-
"status": "success",
|
|
136
|
-
"licenses": licenses,
|
|
137
|
-
"total_packages": len(licenses),
|
|
138
|
-
"problematic_licenses": issues,
|
|
139
|
-
"issues_count": len(issues)
|
|
140
|
-
}
|
|
141
|
-
except json.JSONDecodeError:
|
|
142
|
-
return {
|
|
143
|
-
"status": "error",
|
|
144
|
-
"error": "Failed to parse license data"
|
|
145
|
-
}
|
|
146
|
-
else:
|
|
147
|
-
return {
|
|
148
|
-
"status": "error",
|
|
149
|
-
"error": stderr or "License check failed"
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
def run_security_tests(self) -> Dict:
|
|
153
|
-
"""Run security-focused tests."""
|
|
154
|
-
print("🧪 Running security tests...")
|
|
155
|
-
|
|
156
|
-
success, stdout, stderr = self.run_command(
|
|
157
|
-
["python", "-m", "pytest", "tests/test_security.py", "-v", "--tb=short"],
|
|
158
|
-
"Security tests"
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
"status": "success" if success else "failed",
|
|
163
|
-
"output": stdout,
|
|
164
|
-
"error": stderr if not success else None
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
def run_code_quality_checks(self) -> Dict:
|
|
168
|
-
"""Run code quality and style checks."""
|
|
169
|
-
print("✨ Running code quality checks...")
|
|
170
|
-
|
|
171
|
-
results = {}
|
|
172
|
-
|
|
173
|
-
# Run Black formatter check
|
|
174
|
-
success, stdout, stderr = self.run_command(
|
|
175
|
-
["black", "--check", "--diff", "src/"],
|
|
176
|
-
"Black formatter check"
|
|
177
|
-
)
|
|
178
|
-
results["black"] = {
|
|
179
|
-
"passed": success,
|
|
180
|
-
"output": stdout,
|
|
181
|
-
"error": stderr if not success else None
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
# Run isort import sorting check
|
|
185
|
-
success, stdout, stderr = self.run_command(
|
|
186
|
-
["isort", "--check-only", "--diff", "src/"],
|
|
187
|
-
"isort import check"
|
|
188
|
-
)
|
|
189
|
-
results["isort"] = {
|
|
190
|
-
"passed": success,
|
|
191
|
-
"output": stdout,
|
|
192
|
-
"error": stderr if not success else None
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
# Run Ruff linting
|
|
196
|
-
success, stdout, stderr = self.run_command(
|
|
197
|
-
["ruff", "check", "src/"],
|
|
198
|
-
"Ruff linting"
|
|
199
|
-
)
|
|
200
|
-
results["ruff"] = {
|
|
201
|
-
"passed": success,
|
|
202
|
-
"output": stdout,
|
|
203
|
-
"error": stderr if not success else None
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return results
|
|
207
|
-
|
|
208
|
-
def generate_report(self) -> str:
|
|
209
|
-
"""Generate a comprehensive security report."""
|
|
210
|
-
report_lines = [
|
|
211
|
-
"=" * 80,
|
|
212
|
-
"🛡️ DAVINCI MCP PROFESSIONAL SECURITY AUDIT REPORT",
|
|
213
|
-
"=" * 80,
|
|
214
|
-
""
|
|
215
|
-
]
|
|
216
|
-
|
|
217
|
-
# Safety results
|
|
218
|
-
if "safety" in self.results:
|
|
219
|
-
safety = self.results["safety"]
|
|
220
|
-
report_lines.append("📦 DEPENDENCY SECURITY (Safety)")
|
|
221
|
-
report_lines.append("-" * 40)
|
|
222
|
-
if safety["status"] == "success":
|
|
223
|
-
vuln_count = safety["count"]
|
|
224
|
-
if vuln_count == 0:
|
|
225
|
-
report_lines.append("✅ No known vulnerabilities found")
|
|
226
|
-
else:
|
|
227
|
-
report_lines.append(f"⚠️ {vuln_count} vulnerabilities found:")
|
|
228
|
-
for vuln in safety["vulnerabilities"][:5]: # Show first 5
|
|
229
|
-
pkg = vuln.get("package", "Unknown")
|
|
230
|
-
ver = vuln.get("installed_version", "Unknown")
|
|
231
|
-
vuln_id = vuln.get("vulnerability_id", "Unknown")
|
|
232
|
-
report_lines.append(f" • {pkg} {ver} - {vuln_id}")
|
|
233
|
-
else:
|
|
234
|
-
report_lines.append(f"❌ Error: {safety['error']}")
|
|
235
|
-
report_lines.append("")
|
|
236
|
-
|
|
237
|
-
# Bandit results
|
|
238
|
-
if "bandit" in self.results:
|
|
239
|
-
bandit = self.results["bandit"]
|
|
240
|
-
report_lines.append("🔍 STATIC APPLICATION SECURITY TESTING (Bandit)")
|
|
241
|
-
report_lines.append("-" * 50)
|
|
242
|
-
if bandit["status"] == "success":
|
|
243
|
-
issue_count = bandit["count"]
|
|
244
|
-
if issue_count == 0:
|
|
245
|
-
report_lines.append("✅ No security issues found")
|
|
246
|
-
else:
|
|
247
|
-
report_lines.append(f"⚠️ {issue_count} security issues found:")
|
|
248
|
-
for issue in bandit["results"][:5]: # Show first 5
|
|
249
|
-
test_id = issue.get("test_id", "Unknown")
|
|
250
|
-
severity = issue.get("issue_severity", "Unknown")
|
|
251
|
-
confidence = issue.get("issue_confidence", "Unknown")
|
|
252
|
-
text = issue.get("issue_text", "Unknown")
|
|
253
|
-
report_lines.append(f" • {test_id} ({severity}/{confidence}): {text}")
|
|
254
|
-
else:
|
|
255
|
-
report_lines.append(f"❌ Error: {bandit['error']}")
|
|
256
|
-
report_lines.append("")
|
|
257
|
-
|
|
258
|
-
# License compliance
|
|
259
|
-
if "licenses" in self.results:
|
|
260
|
-
licenses = self.results["licenses"]
|
|
261
|
-
report_lines.append("📄 LICENSE COMPLIANCE")
|
|
262
|
-
report_lines.append("-" * 20)
|
|
263
|
-
if licenses["status"] == "success":
|
|
264
|
-
total = licenses["total_packages"]
|
|
265
|
-
issues = licenses["issues_count"]
|
|
266
|
-
report_lines.append(f"📊 Total packages: {total}")
|
|
267
|
-
if issues == 0:
|
|
268
|
-
report_lines.append("✅ No problematic licenses found")
|
|
269
|
-
else:
|
|
270
|
-
report_lines.append(f"⚠️ {issues} potentially problematic licenses:")
|
|
271
|
-
for issue in licenses["problematic_licenses"]:
|
|
272
|
-
pkg = issue["package"]
|
|
273
|
-
lic = issue["license"]
|
|
274
|
-
report_lines.append(f" • {pkg}: {lic}")
|
|
275
|
-
else:
|
|
276
|
-
report_lines.append(f"❌ Error: {licenses['error']}")
|
|
277
|
-
report_lines.append("")
|
|
278
|
-
|
|
279
|
-
# Security tests
|
|
280
|
-
if "security_tests" in self.results:
|
|
281
|
-
tests = self.results["security_tests"]
|
|
282
|
-
report_lines.append("🧪 SECURITY TESTS")
|
|
283
|
-
report_lines.append("-" * 15)
|
|
284
|
-
if tests["status"] == "success":
|
|
285
|
-
report_lines.append("✅ All security tests passed")
|
|
286
|
-
else:
|
|
287
|
-
report_lines.append("❌ Some security tests failed")
|
|
288
|
-
if tests.get("error"):
|
|
289
|
-
report_lines.append(f"Error: {tests['error']}")
|
|
290
|
-
report_lines.append("")
|
|
291
|
-
|
|
292
|
-
# Code quality
|
|
293
|
-
if "code_quality" in self.results:
|
|
294
|
-
quality = self.results["code_quality"]
|
|
295
|
-
report_lines.append("✨ CODE QUALITY")
|
|
296
|
-
report_lines.append("-" * 13)
|
|
297
|
-
for tool, result in quality.items():
|
|
298
|
-
status = "✅" if result["passed"] else "❌"
|
|
299
|
-
report_lines.append(f"{status} {tool.capitalize()}")
|
|
300
|
-
report_lines.append("")
|
|
301
|
-
|
|
302
|
-
# Summary
|
|
303
|
-
report_lines.extend([
|
|
304
|
-
"📊 SECURITY AUDIT SUMMARY",
|
|
305
|
-
"-" * 25,
|
|
306
|
-
f"🗓️ Audit Date: {os.environ.get('DATE', 'Unknown')}",
|
|
307
|
-
f"👤 Auditor: Security Automation Script",
|
|
308
|
-
f"📁 Project: DaVinci MCP Professional v2.2.1",
|
|
309
|
-
"",
|
|
310
|
-
"🔗 Next Steps:",
|
|
311
|
-
"1. Review and address any security vulnerabilities",
|
|
312
|
-
"2. Update dependencies with known issues",
|
|
313
|
-
"3. Fix code quality issues",
|
|
314
|
-
"4. Re-run audit after fixes",
|
|
315
|
-
"",
|
|
316
|
-
"=" * 80
|
|
317
|
-
])
|
|
318
|
-
|
|
319
|
-
return "\n".join(report_lines)
|
|
320
|
-
|
|
321
|
-
def run_full_audit(self) -> None:
|
|
322
|
-
"""Run the complete security audit."""
|
|
323
|
-
print("🚀 Starting comprehensive security audit...")
|
|
324
|
-
print()
|
|
325
|
-
|
|
326
|
-
# Run all security checks
|
|
327
|
-
self.results["safety"] = self.check_dependencies_safety()
|
|
328
|
-
self.results["bandit"] = self.run_bandit_sast()
|
|
329
|
-
self.results["licenses"] = self.check_license_compliance()
|
|
330
|
-
self.results["security_tests"] = self.run_security_tests()
|
|
331
|
-
self.results["code_quality"] = self.run_code_quality_checks()
|
|
332
|
-
|
|
333
|
-
# Generate and save report
|
|
334
|
-
report = self.generate_report()
|
|
335
|
-
print(report)
|
|
336
|
-
|
|
337
|
-
# Save report to file
|
|
338
|
-
report_file = self.project_root / "security-audit-report.txt"
|
|
339
|
-
with open(report_file, 'w') as f:
|
|
340
|
-
f.write(report)
|
|
341
|
-
|
|
342
|
-
print(f"\n📄 Full report saved to: {report_file}")
|
|
343
|
-
|
|
344
|
-
# Save JSON results for CI/CD
|
|
345
|
-
json_file = self.project_root / "security-audit-results.json"
|
|
346
|
-
with open(json_file, 'w') as f:
|
|
347
|
-
json.dump(self.results, f, indent=2)
|
|
348
|
-
|
|
349
|
-
print(f"📊 JSON results saved to: {json_file}")
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
def main():
|
|
353
|
-
"""Main entry point."""
|
|
354
|
-
if len(sys.argv) > 1 and sys.argv[1] == "--help":
|
|
355
|
-
print("""
|
|
356
|
-
DaVinci MCP Professional Security Auditor
|
|
357
|
-
|
|
358
|
-
Usage: python security_audit.py [options]
|
|
359
|
-
|
|
360
|
-
Options:
|
|
361
|
-
--help Show this help message
|
|
362
|
-
|
|
363
|
-
This script performs a comprehensive security audit including:
|
|
364
|
-
- Dependency vulnerability scanning (Safety)
|
|
365
|
-
- Static application security testing (Bandit)
|
|
366
|
-
- License compliance checking
|
|
367
|
-
- Security test execution
|
|
368
|
-
- Code quality analysis
|
|
369
|
-
|
|
370
|
-
Results are saved to security-audit-report.txt and security-audit-results.json
|
|
371
|
-
""")
|
|
372
|
-
return
|
|
373
|
-
|
|
374
|
-
auditor = SecurityAuditor()
|
|
375
|
-
auditor.run_full_audit()
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
if __name__ == "__main__":
|
|
379
|
-
main()
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
DaVinci Resolve MCP Server
|
|
3
|
-
|
|
4
|
-
A modern, clean implementation of a Model Context Protocol server
|
|
5
|
-
for DaVinci Resolve integration.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
try:
|
|
9
|
-
from ._version import __version__
|
|
10
|
-
except ImportError:
|
|
11
|
-
from importlib.metadata import version
|
|
12
|
-
|
|
13
|
-
__version__ = version("davinci-mcp-professional")
|
|
14
|
-
__author__ = "Hoyt Harness"
|
|
15
|
-
|
|
16
|
-
from .resolve_client import DaVinciResolveClient
|
|
17
|
-
from .server import DaVinciMCPServer
|
|
18
|
-
|
|
19
|
-
__all__ = ["DaVinciMCPServer", "DaVinciResolveClient"]
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Command line interface for DaVinci Resolve MCP Server.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import asyncio
|
|
6
|
-
import logging
|
|
7
|
-
import os
|
|
8
|
-
import sys
|
|
9
|
-
|
|
10
|
-
import click
|
|
11
|
-
from colorama import Fore, Style
|
|
12
|
-
from colorama import init as init_colorama
|
|
13
|
-
|
|
14
|
-
# Set UTF-8 encoding for Windows console only for direct output, not for stdio
|
|
15
|
-
if os.name == "nt": # Windows
|
|
16
|
-
os.environ["PYTHONIOENCODING"] = "utf-8"
|
|
17
|
-
# Only set console encoding if we're running in interactive mode
|
|
18
|
-
# Don't modify stdout/stderr if they might be used by MCP stdio
|
|
19
|
-
if hasattr(sys.stdout, "isatty") and sys.stdout.isatty():
|
|
20
|
-
try:
|
|
21
|
-
# Store original stdout/stderr in case we need them
|
|
22
|
-
_original_stdout = sys.stdout
|
|
23
|
-
_original_stderr = sys.stderr
|
|
24
|
-
except (AttributeError, OSError):
|
|
25
|
-
pass # Fallback to default behavior
|
|
26
|
-
|
|
27
|
-
from . import __version__
|
|
28
|
-
from .server import DaVinciMCPServer
|
|
29
|
-
from .utils import check_resolve_installation, check_resolve_running
|
|
30
|
-
|
|
31
|
-
# Initialize colorama for cross-platform colored output
|
|
32
|
-
init_colorama()
|
|
33
|
-
|
|
34
|
-
# Set up logging
|
|
35
|
-
logging.basicConfig(
|
|
36
|
-
level=logging.INFO,
|
|
37
|
-
format=f"{Fore.CYAN}%(asctime)s{Style.RESET_ALL} - "
|
|
38
|
-
f"{Fore.YELLOW}%(name)s{Style.RESET_ALL} - "
|
|
39
|
-
f"%(levelname)s - %(message)s",
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
logger = logging.getLogger(__name__)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def print_status(message: str, status: str = "INFO") -> None:
|
|
46
|
-
"""Print a colored status message."""
|
|
47
|
-
if status == "OK":
|
|
48
|
-
click.echo(f"{Fore.GREEN}[OK]{Style.RESET_ALL} {message}")
|
|
49
|
-
elif status == "ERROR":
|
|
50
|
-
click.echo(f"{Fore.RED}[ERROR]{Style.RESET_ALL} {message}")
|
|
51
|
-
elif status == "WARNING":
|
|
52
|
-
click.echo(f"{Fore.YELLOW}[WARNING]{Style.RESET_ALL} {message}")
|
|
53
|
-
else:
|
|
54
|
-
click.echo(f"{Fore.CYAN}[INFO]{Style.RESET_ALL} {message}")
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def check_prerequisites() -> bool:
|
|
58
|
-
"""Check if prerequisites are met."""
|
|
59
|
-
print_status("Checking DaVinci Resolve installation...")
|
|
60
|
-
|
|
61
|
-
installation = check_resolve_installation()
|
|
62
|
-
|
|
63
|
-
if not installation["api_path_exists"]:
|
|
64
|
-
print_status("DaVinci Resolve API path not found", "ERROR")
|
|
65
|
-
return False
|
|
66
|
-
|
|
67
|
-
if not installation["lib_path_exists"]:
|
|
68
|
-
print_status("DaVinci Resolve library not found", "ERROR")
|
|
69
|
-
return False
|
|
70
|
-
|
|
71
|
-
if not installation["modules_path_exists"]:
|
|
72
|
-
print_status("DaVinci Resolve modules path not found", "ERROR")
|
|
73
|
-
return False
|
|
74
|
-
|
|
75
|
-
print_status("DaVinci Resolve installation verified", "OK")
|
|
76
|
-
|
|
77
|
-
print_status("Checking if DaVinci Resolve is running...")
|
|
78
|
-
if not check_resolve_running():
|
|
79
|
-
print_status("DaVinci Resolve is not running", "ERROR")
|
|
80
|
-
print_status(
|
|
81
|
-
"Please start DaVinci Resolve before running the MCP server", "WARNING"
|
|
82
|
-
)
|
|
83
|
-
return False
|
|
84
|
-
|
|
85
|
-
print_status("DaVinci Resolve is running", "OK")
|
|
86
|
-
return True
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
@click.command()
|
|
90
|
-
@click.option("--debug", is_flag=True, help="Enable debug logging")
|
|
91
|
-
@click.option("--skip-checks", is_flag=True, help="Skip prerequisite checks")
|
|
92
|
-
def main(debug: bool = False, skip_checks: bool = False) -> None:
|
|
93
|
-
"""Start the DaVinci Resolve MCP Server."""
|
|
94
|
-
|
|
95
|
-
if debug:
|
|
96
|
-
logging.getLogger().setLevel(logging.DEBUG)
|
|
97
|
-
logging.getLogger("davinci_mcp").setLevel(logging.DEBUG)
|
|
98
|
-
print_status("Debug logging enabled")
|
|
99
|
-
|
|
100
|
-
# Print banner
|
|
101
|
-
vi = sys.version_info
|
|
102
|
-
py_ver = f"{vi.major}.{vi.minor}.{vi.micro}"
|
|
103
|
-
click.echo(f"\n{Fore.MAGENTA}{'=' * 60}{Style.RESET_ALL}")
|
|
104
|
-
click.echo(
|
|
105
|
-
f"{Fore.MAGENTA} DaVinci MCP Professional v{__version__}{Style.RESET_ALL}"
|
|
106
|
-
)
|
|
107
|
-
click.echo(f"{Fore.MAGENTA} Python {py_ver}{Style.RESET_ALL}")
|
|
108
|
-
click.echo(f"{Fore.MAGENTA}{'=' * 60}{Style.RESET_ALL}\n")
|
|
109
|
-
|
|
110
|
-
# Check prerequisites unless skipped
|
|
111
|
-
if not skip_checks:
|
|
112
|
-
if not check_prerequisites():
|
|
113
|
-
print_status("Prerequisites not met. Exiting.", "ERROR")
|
|
114
|
-
sys.exit(1)
|
|
115
|
-
|
|
116
|
-
click.echo() # Empty line for spacing
|
|
117
|
-
|
|
118
|
-
# Start the server
|
|
119
|
-
try:
|
|
120
|
-
print_status("Starting MCP server...")
|
|
121
|
-
server = DaVinciMCPServer()
|
|
122
|
-
|
|
123
|
-
asyncio.run(server.run())
|
|
124
|
-
|
|
125
|
-
except KeyboardInterrupt:
|
|
126
|
-
print_status("\nShutting down server...", "WARNING")
|
|
127
|
-
sys.exit(0)
|
|
128
|
-
except Exception as e:
|
|
129
|
-
print_status(f"Server error: {e}", "ERROR")
|
|
130
|
-
if debug:
|
|
131
|
-
import traceback
|
|
132
|
-
|
|
133
|
-
traceback.print_exc()
|
|
134
|
-
sys.exit(1)
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if __name__ == "__main__":
|
|
138
|
-
main()
|