@hybridlabor-api/aos 4.4.0 → 4.4.2-beta.0

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.
Files changed (306) hide show
  1. package/.agents/skills/firecrawl/SKILL.md +149 -0
  2. package/.agents/skills/firecrawl/rules/install.md +82 -0
  3. package/.agents/skills/firecrawl/rules/security.md +26 -0
  4. package/.agents/skills/firecrawl-agent/SKILL.md +58 -0
  5. package/.agents/skills/firecrawl-build/SKILL.md +39 -0
  6. package/.agents/skills/firecrawl-build-interact/SKILL.md +68 -0
  7. package/.agents/skills/firecrawl-build-onboarding/SKILL.md +103 -0
  8. package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +39 -0
  9. package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +20 -0
  10. package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +17 -0
  11. package/.agents/skills/firecrawl-build-scrape/SKILL.md +69 -0
  12. package/.agents/skills/firecrawl-build-search/SKILL.md +69 -0
  13. package/.agents/skills/firecrawl-crawl/SKILL.md +59 -0
  14. package/.agents/skills/firecrawl-download/SKILL.md +70 -0
  15. package/.agents/skills/firecrawl-interact/SKILL.md +84 -0
  16. package/.agents/skills/firecrawl-map/SKILL.md +51 -0
  17. package/.agents/skills/firecrawl-scrape/SKILL.md +69 -0
  18. package/.agents/skills/firecrawl-search/SKILL.md +60 -0
  19. package/.claude/hooks/memb-inject.mjs +6 -0
  20. package/CLAUDE.md +573 -0
  21. package/README.de.md +0 -8
  22. package/README.md +0 -8
  23. package/README.pt.md +0 -8
  24. package/assets/brand/ao-ant-mark.svg +91 -0
  25. package/assets/brand/bdb-core-mark.svg +34 -0
  26. package/assets/brand/heimdall-guardian-mark.svg +16 -0
  27. package/assets/brand/memb-crystal-mark.svg +18 -0
  28. package/bin/aos-config.mjs +89 -0
  29. package/bin/aos-dashboard.mjs +608 -0
  30. package/bin/aos-uninstall.mjs +227 -0
  31. package/docs/sessions/audit-2026-09-14-silent-failures.md +114 -0
  32. package/docs/skills_table.md +0 -3
  33. package/installer.js +428 -237
  34. package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +10 -0
  35. package/mcps/after-effects-mcp/build/index.js +840 -0
  36. package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +153 -0
  37. package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +218 -0
  38. package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +71 -0
  39. package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +147 -0
  40. package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +114 -0
  41. package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +115 -0
  42. package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +192 -0
  43. package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +90 -0
  44. package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +50 -0
  45. package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +1773 -0
  46. package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +160 -0
  47. package/mcps/computer-use-mcp/dist/client.d.ts +150 -0
  48. package/mcps/computer-use-mcp/dist/client.js +136 -0
  49. package/mcps/computer-use-mcp/dist/entrypoint.d.ts +16 -0
  50. package/mcps/computer-use-mcp/dist/entrypoint.js +26 -0
  51. package/mcps/computer-use-mcp/dist/native.d.ts +212 -0
  52. package/mcps/computer-use-mcp/dist/native.js +50 -0
  53. package/mcps/computer-use-mcp/dist/server.d.ts +32 -0
  54. package/mcps/computer-use-mcp/dist/server.js +342 -0
  55. package/mcps/computer-use-mcp/dist/session.d.ts +101 -0
  56. package/mcps/computer-use-mcp/dist/session.js +2372 -0
  57. package/package.json +13 -4
  58. package/skills/global_config/aos-project-init/SKILL.md +97 -130
  59. package/skills/global_config/aos-project-init/assets/openwikiignore.template +62 -0
  60. package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +38 -1
  61. package/skills/global_config/aos-setup/SKILL.md +110 -11
  62. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +48 -4
  63. package/skills/global_config/ask-tim/SKILL.md +2 -7
  64. package/skills/global_config/openwiki-skill/scripts/openwiki_daemon.py +65 -12
  65. package/bin/setup-saas.mjs +0 -792
  66. package/mcps/blender-mcp-server/.dockerignore +0 -19
  67. package/mcps/blender-mcp-server/.github/workflows/ci.yml +0 -67
  68. package/mcps/blender-mcp-server/.github/workflows/publish-pypi.yml +0 -54
  69. package/mcps/blender-mcp-server/CHANGELOG.md +0 -64
  70. package/mcps/blender-mcp-server/CONTRIBUTING.md +0 -107
  71. package/mcps/blender-mcp-server/Dockerfile +0 -19
  72. package/mcps/blender-mcp-server/LICENSE +0 -21
  73. package/mcps/blender-mcp-server/README.md +0 -409
  74. package/mcps/blender-mcp-server/addon/__init__.py +0 -1440
  75. package/mcps/blender-mcp-server/addon/models.py +0 -223
  76. package/mcps/blender-mcp-server/pyproject.toml +0 -120
  77. package/mcps/blender-mcp-server/scripts/blender_bridge_request.py +0 -71
  78. package/mcps/blender-mcp-server/scripts/blender_create_test_cube.py +0 -49
  79. package/mcps/blender-mcp-server/scripts/blender_scene_info.py +0 -38
  80. package/mcps/blender-mcp-server/scripts/build_addon_zip.sh +0 -29
  81. package/mcps/blender-mcp-server/scripts/demos/README.md +0 -186
  82. package/mcps/blender-mcp-server/scripts/demos/dam_break_scene.py +0 -276
  83. package/mcps/blender-mcp-server/scripts/demos/open_dam_break_gui.py +0 -33
  84. package/mcps/blender-mcp-server/scripts/demos/pipe_movement_study.py +0 -518
  85. package/mcps/blender-mcp-server/scripts/demos/pipe_pressure_failure_scene.py +0 -806
  86. package/mcps/blender-mcp-server/scripts/demos/procedural_dam_break_scene.py +0 -600
  87. package/mcps/blender-mcp-server/scripts/demos/run_dam_break.py +0 -510
  88. package/mcps/blender-mcp-server/scripts/launch_blender_gui.py +0 -41
  89. package/mcps/blender-mcp-server/scripts/library/README.md +0 -64
  90. package/mcps/blender-mcp-server/scripts/library/apply_transforms.py +0 -46
  91. package/mcps/blender-mcp-server/scripts/library/camera.py +0 -51
  92. package/mcps/blender-mcp-server/scripts/library/collections.py +0 -65
  93. package/mcps/blender-mcp-server/scripts/library/create_mesh.py +0 -41
  94. package/mcps/blender-mcp-server/scripts/library/effector.py +0 -48
  95. package/mcps/blender-mcp-server/scripts/library/fluid_domain.py +0 -80
  96. package/mcps/blender-mcp-server/scripts/library/fluid_inflow.py +0 -98
  97. package/mcps/blender-mcp-server/scripts/library/frame_range.py +0 -35
  98. package/mcps/blender-mcp-server/scripts/library/keyframes.py +0 -59
  99. package/mcps/blender-mcp-server/scripts/library/rigid_body.py +0 -52
  100. package/mcps/blender-mcp-server/scripts/library/save_blend.py +0 -40
  101. package/mcps/blender-mcp-server/scripts/server_start.sh +0 -26
  102. package/mcps/blender-mcp-server/src/blender_mcp_server/__init__.py +0 -3
  103. package/mcps/blender-mcp-server/src/blender_mcp_server/headless.py +0 -330
  104. package/mcps/blender-mcp-server/src/blender_mcp_server/server.py +0 -606
  105. package/mcps/davinci-mcp-professional/.bandit +0 -35
  106. package/mcps/davinci-mcp-professional/.claude/commands/security-review.md +0 -191
  107. package/mcps/davinci-mcp-professional/.claude/settings.json +0 -1
  108. package/mcps/davinci-mcp-professional/.editorconfig +0 -27
  109. package/mcps/davinci-mcp-professional/.gitattributes +0 -207
  110. package/mcps/davinci-mcp-professional/.github/CODEOWNERS +0 -2
  111. package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/bug_report.md +0 -33
  112. package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/feature_request.md +0 -19
  113. package/mcps/davinci-mcp-professional/.github/PULL_REQUEST_TEMPLATE.md +0 -20
  114. package/mcps/davinci-mcp-professional/.github/SECURITY.md +0 -97
  115. package/mcps/davinci-mcp-professional/.github/dependabot.yml +0 -27
  116. package/mcps/davinci-mcp-professional/.github/workflows/ci.yml +0 -39
  117. package/mcps/davinci-mcp-professional/ATTRIBUTION.md +0 -4
  118. package/mcps/davinci-mcp-professional/AUTHORS.md +0 -9
  119. package/mcps/davinci-mcp-professional/BUGS.md +0 -55
  120. package/mcps/davinci-mcp-professional/CLAUDE.md +0 -229
  121. package/mcps/davinci-mcp-professional/CONTRIBUTING.md +0 -51
  122. package/mcps/davinci-mcp-professional/COPYING.md +0 -228
  123. package/mcps/davinci-mcp-professional/Doxyfile +0 -379
  124. package/mcps/davinci-mcp-professional/README.md +0 -143
  125. package/mcps/davinci-mcp-professional/SECURITY.md +0 -40
  126. package/mcps/davinci-mcp-professional/USING.md +0 -301
  127. package/mcps/davinci-mcp-professional/VERSION.md +0 -13
  128. package/mcps/davinci-mcp-professional/build.py +0 -169
  129. package/mcps/davinci-mcp-professional/claude_desktop_config_template.json +0 -11
  130. package/mcps/davinci-mcp-professional/hooks/ci-check.sh +0 -29
  131. package/mcps/davinci-mcp-professional/hooks/pre-push +0 -46
  132. package/mcps/davinci-mcp-professional/main.py +0 -40
  133. package/mcps/davinci-mcp-professional/mcp_server.py +0 -30
  134. package/mcps/davinci-mcp-professional/pyproject.toml +0 -115
  135. package/mcps/davinci-mcp-professional/security_audit.py +0 -379
  136. package/mcps/davinci-mcp-professional/src/davinci_mcp/__init__.py +0 -19
  137. package/mcps/davinci-mcp-professional/src/davinci_mcp/cli.py +0 -138
  138. package/mcps/davinci-mcp-professional/src/davinci_mcp/resolve_client.py +0 -342
  139. package/mcps/davinci-mcp-professional/src/davinci_mcp/resources/__init__.py +0 -60
  140. package/mcps/davinci-mcp-professional/src/davinci_mcp/server.py +0 -185
  141. package/mcps/davinci-mcp-professional/src/davinci_mcp/tools/__init__.py +0 -146
  142. package/mcps/davinci-mcp-professional/src/davinci_mcp/types.py +0 -125
  143. package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/__init__.py +0 -19
  144. package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/platform.py +0 -239
  145. package/mcps/davinci-mcp-professional/test.py +0 -186
  146. package/mcps/davinci-mcp-professional/uv.lock +0 -2073
  147. package/mcps/davinci-resolve-mcp/.claude/skills/media-analysis.md +0 -44
  148. package/mcps/davinci-resolve-mcp/.clinerules +0 -17
  149. package/mcps/davinci-resolve-mcp/.cursorrules +0 -17
  150. package/mcps/davinci-resolve-mcp/.github/copilot-instructions.md +0 -17
  151. package/mcps/davinci-resolve-mcp/.github/workflows/npm-publish.yml +0 -109
  152. package/mcps/davinci-resolve-mcp/.windsurfrules +0 -17
  153. package/mcps/davinci-resolve-mcp/AGENTS.md +0 -114
  154. package/mcps/davinci-resolve-mcp/CHANGELOG.md +0 -2648
  155. package/mcps/davinci-resolve-mcp/CLAUDE.md +0 -15
  156. package/mcps/davinci-resolve-mcp/LICENSE +0 -21
  157. package/mcps/davinci-resolve-mcp/README.md +0 -173
  158. package/mcps/davinci-resolve-mcp/SECURITY.md +0 -53
  159. package/mcps/davinci-resolve-mcp/bin/davinci-resolve-mcp.mjs +0 -450
  160. package/mcps/davinci-resolve-mcp/examples/README.md +0 -53
  161. package/mcps/davinci-resolve-mcp/examples/markers/README.md +0 -81
  162. package/mcps/davinci-resolve-mcp/examples/media/README.md +0 -94
  163. package/mcps/davinci-resolve-mcp/examples/timeline/README.md +0 -98
  164. package/mcps/davinci-resolve-mcp/install.py +0 -1687
  165. package/mcps/davinci-resolve-mcp/package.json +0 -52
  166. package/mcps/davinci-resolve-mcp/release-notes/v2.22.0.md +0 -51
  167. package/mcps/davinci-resolve-mcp/release-notes/v2.23.0.md +0 -51
  168. package/mcps/davinci-resolve-mcp/release-notes/v2.23.1.md +0 -35
  169. package/mcps/davinci-resolve-mcp/release-notes/v2.24.1.md +0 -32
  170. package/mcps/davinci-resolve-mcp/scripts/audit_api_parity.py +0 -275
  171. package/mcps/davinci-resolve-mcp/scripts/audit_readwrite_symmetry.py +0 -80
  172. package/mcps/davinci-resolve-mcp/scripts/doctor.py +0 -227
  173. package/mcps/davinci-resolve-mcp/scripts/gen_api_limitations.py +0 -144
  174. package/mcps/davinci-resolve-mcp/scripts/live_media_analysis_polish_probe.py +0 -65
  175. package/mcps/davinci-resolve-mcp/scripts/measure_bridge_cost.py +0 -65
  176. package/mcps/davinci-resolve-mcp/scripts/regen_panel_screenshots.py +0 -76
  177. package/mcps/davinci-resolve-mcp/src/__init__.py +0 -3
  178. package/mcps/davinci-resolve-mcp/src/analysis_dashboard.py +0 -15505
  179. package/mcps/davinci-resolve-mcp/src/batch_cli.py +0 -540
  180. package/mcps/davinci-resolve-mcp/src/control_panel.py +0 -13
  181. package/mcps/davinci-resolve-mcp/src/granular/__init__.py +0 -17
  182. package/mcps/davinci-resolve-mcp/src/granular/common.py +0 -741
  183. package/mcps/davinci-resolve-mcp/src/granular/folder.py +0 -420
  184. package/mcps/davinci-resolve-mcp/src/granular/gallery.py +0 -306
  185. package/mcps/davinci-resolve-mcp/src/granular/graph.py +0 -309
  186. package/mcps/davinci-resolve-mcp/src/granular/media_pool.py +0 -679
  187. package/mcps/davinci-resolve-mcp/src/granular/media_pool_item.py +0 -1020
  188. package/mcps/davinci-resolve-mcp/src/granular/media_storage.py +0 -179
  189. package/mcps/davinci-resolve-mcp/src/granular/project.py +0 -1654
  190. package/mcps/davinci-resolve-mcp/src/granular/resolve_control.py +0 -538
  191. package/mcps/davinci-resolve-mcp/src/granular/timeline.py +0 -1075
  192. package/mcps/davinci-resolve-mcp/src/granular/timeline_item.py +0 -2251
  193. package/mcps/davinci-resolve-mcp/src/resolve_mcp_server.py +0 -43
  194. package/mcps/davinci-resolve-mcp/src/server.py +0 -24116
  195. package/mcps/davinci-resolve-mcp/src/utils/__init__.py +0 -3
  196. package/mcps/davinci-resolve-mcp/src/utils/actor_identity.py +0 -46
  197. package/mcps/davinci-resolve-mcp/src/utils/analysis_caps.py +0 -678
  198. package/mcps/davinci-resolve-mcp/src/utils/analysis_memory.py +0 -755
  199. package/mcps/davinci-resolve-mcp/src/utils/analysis_runs.py +0 -307
  200. package/mcps/davinci-resolve-mcp/src/utils/analysis_store.py +0 -945
  201. package/mcps/davinci-resolve-mcp/src/utils/api_truth.py +0 -525
  202. package/mcps/davinci-resolve-mcp/src/utils/app_control.py +0 -319
  203. package/mcps/davinci-resolve-mcp/src/utils/audio_fairlight_live_probe.py +0 -263
  204. package/mcps/davinci-resolve-mcp/src/utils/brain_edits.py +0 -387
  205. package/mcps/davinci-resolve-mcp/src/utils/bridge_metrics.py +0 -76
  206. package/mcps/davinci-resolve-mcp/src/utils/cdl.py +0 -20
  207. package/mcps/davinci-resolve-mcp/src/utils/clip_query.py +0 -85
  208. package/mcps/davinci-resolve-mcp/src/utils/cloud_operations.py +0 -192
  209. package/mcps/davinci-resolve-mcp/src/utils/color_grade_live_probe.py +0 -444
  210. package/mcps/davinci-resolve-mcp/src/utils/contracts.py +0 -102
  211. package/mcps/davinci-resolve-mcp/src/utils/cut_ir.py +0 -115
  212. package/mcps/davinci-resolve-mcp/src/utils/dctl_templates.py +0 -368
  213. package/mcps/davinci-resolve-mcp/src/utils/deep_vision.py +0 -643
  214. package/mcps/davinci-resolve-mcp/src/utils/destructive_hook.py +0 -606
  215. package/mcps/davinci-resolve-mcp/src/utils/edit_engine.py +0 -737
  216. package/mcps/davinci-resolve-mcp/src/utils/embeddings.py +0 -922
  217. package/mcps/davinci-resolve-mcp/src/utils/entities.py +0 -579
  218. package/mcps/davinci-resolve-mcp/src/utils/extension_authoring_live_probe.py +0 -292
  219. package/mcps/davinci-resolve-mcp/src/utils/failure_tracker.py +0 -119
  220. package/mcps/davinci-resolve-mcp/src/utils/fuse_templates.py +0 -1968
  221. package/mcps/davinci-resolve-mcp/src/utils/fusion_composition_live_probe.py +0 -284
  222. package/mcps/davinci-resolve-mcp/src/utils/fusion_group_settings.py +0 -334
  223. package/mcps/davinci-resolve-mcp/src/utils/layout_presets.py +0 -333
  224. package/mcps/davinci-resolve-mcp/src/utils/mcp_stdio.py +0 -32
  225. package/mcps/davinci-resolve-mcp/src/utils/mcp_transport.py +0 -128
  226. package/mcps/davinci-resolve-mcp/src/utils/media_analysis.py +0 -7690
  227. package/mcps/davinci-resolve-mcp/src/utils/media_analysis_jobs.py +0 -805
  228. package/mcps/davinci-resolve-mcp/src/utils/media_pool_changes.py +0 -121
  229. package/mcps/davinci-resolve-mcp/src/utils/media_pool_ingest_live_probe.py +0 -592
  230. package/mcps/davinci-resolve-mcp/src/utils/multicam.py +0 -393
  231. package/mcps/davinci-resolve-mcp/src/utils/object_inspection.py +0 -301
  232. package/mcps/davinci-resolve-mcp/src/utils/page_lock.py +0 -75
  233. package/mcps/davinci-resolve-mcp/src/utils/platform.py +0 -157
  234. package/mcps/davinci-resolve-mcp/src/utils/proc.py +0 -26
  235. package/mcps/davinci-resolve-mcp/src/utils/project_cleanup.py +0 -73
  236. package/mcps/davinci-resolve-mcp/src/utils/project_lifecycle_live_probe.py +0 -376
  237. package/mcps/davinci-resolve-mcp/src/utils/project_lint.py +0 -131
  238. package/mcps/davinci-resolve-mcp/src/utils/project_properties.py +0 -601
  239. package/mcps/davinci-resolve-mcp/src/utils/project_spec.py +0 -459
  240. package/mcps/davinci-resolve-mcp/src/utils/readback.py +0 -91
  241. package/mcps/davinci-resolve-mcp/src/utils/render_deliver_live_probe.py +0 -384
  242. package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_governance.py +0 -214
  243. package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_ledger.py +0 -244
  244. package/mcps/davinci-resolve-mcp/src/utils/resolve_busy.py +0 -171
  245. package/mcps/davinci-resolve-mcp/src/utils/resolve_connection.py +0 -77
  246. package/mcps/davinci-resolve-mcp/src/utils/review_annotation_live_probe.py +0 -352
  247. package/mcps/davinci-resolve-mcp/src/utils/script_templates.py +0 -1193
  248. package/mcps/davinci-resolve-mcp/src/utils/shot_relationships.py +0 -544
  249. package/mcps/davinci-resolve-mcp/src/utils/structural_diff.py +0 -175
  250. package/mcps/davinci-resolve-mcp/src/utils/sync_detection.py +0 -889
  251. package/mcps/davinci-resolve-mcp/src/utils/timeline_brain_db.py +0 -826
  252. package/mcps/davinci-resolve-mcp/src/utils/timeline_conform_live_probe.py +0 -280
  253. package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_live_probe.py +0 -1092
  254. package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_probe.py +0 -185
  255. package/mcps/davinci-resolve-mcp/src/utils/timeline_title_text.py +0 -87
  256. package/mcps/davinci-resolve-mcp/src/utils/timeline_versioning.py +0 -730
  257. package/mcps/davinci-resolve-mcp/src/utils/update_check.py +0 -685
  258. package/mcps/vectorworks-mcp/.dockerignore +0 -8
  259. package/mcps/vectorworks-mcp/Dockerfile +0 -28
  260. package/mcps/vectorworks-mcp/README.md +0 -156
  261. package/mcps/vectorworks-mcp/app/__init__.py +0 -2
  262. package/mcps/vectorworks-mcp/app/api.py +0 -52
  263. package/mcps/vectorworks-mcp/app/chunking.py +0 -56
  264. package/mcps/vectorworks-mcp/app/config.py +0 -29
  265. package/mcps/vectorworks-mcp/app/embeddings.py +0 -28
  266. package/mcps/vectorworks-mcp/app/indexer.py +0 -106
  267. package/mcps/vectorworks-mcp/app/main.py +0 -33
  268. package/mcps/vectorworks-mcp/app/mcp_server.py +0 -71
  269. package/mcps/vectorworks-mcp/app/search.py +0 -54
  270. package/mcps/vectorworks-mcp/app/utils.py +0 -14
  271. package/mcps/vectorworks-mcp/data/.gitkeep +0 -1
  272. package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_PluginScript.htm +0 -95
  273. package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_ScriptEditor.htm +0 -266
  274. package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_Scripting.htm +0 -106
  275. package/mcps/vectorworks-mcp/data/vw-app-help/VW2023_CreatingScriptedPlugins.htm +0 -327
  276. package/mcps/vectorworks-mcp/data/vw-app-help/VW2024_RunningScripts.htm +0 -116
  277. package/mcps/vectorworks-mcp/data/vw-devwiki/VS_Function_Reference_category.html +0 -2129
  278. package/mcps/vectorworks-mcp/data/vw-jp-ref/ObjectsSymbols.html +0 -2035
  279. package/mcps/vectorworks-mcp/data/vw-jp-ref/ScriptFunctionReference.html +0 -29
  280. package/mcps/vectorworks-mcp/design.md +0 -57
  281. package/mcps/vectorworks-mcp/docker-compose.yml +0 -18
  282. package/mcps/vectorworks-mcp/index/.gitkeep +0 -1
  283. package/mcps/vectorworks-mcp/index/meta.jsonl +0 -3956
  284. package/mcps/vectorworks-mcp/index/vw.faiss +0 -0
  285. package/mcps/vectorworks-mcp/requirements.txt +0 -10
  286. package/mcps/vectorworks-mcp/scripts/fetch_docs_minimal.sh +0 -84
  287. package/mcps/vectorworks-mcp/scripts/fetch_github_vectorworks.sh +0 -85
  288. package/mcps/vectorworks-mcp/templates/index.html +0 -40
  289. package/scripts/ecosystem-health-audit.js +0 -257
  290. package/skills/bdb-dev-os-skill/SKILL.md +0 -49
  291. package/skills/bdb-dev-os-skill/package.json +0 -11
  292. package/skills/bdbsaastraining/SKILL.md +0 -316
  293. package/skills/bdbsaastraining/references/exam-pool.md +0 -313
  294. package/skills/bdbsaastraining/references/interaction-modes.md +0 -94
  295. package/skills/bdbsaastraining/references/track-a-ai-agent.md +0 -111
  296. package/skills/bdbsaastraining/references/track-b-wordpress.md +0 -111
  297. package/skills/bdbsaastraining/references/track-c-mailserver.md +0 -107
  298. package/skills/bdbsaastraining/references/track-d-debian.md +0 -109
  299. package/skills/bdbsaastraining/references/track-e-custom.md +0 -83
  300. package/skills/bdbsaastraining/scripts/build_profile.py +0 -529
  301. package/skills/bdbsaastraining/scripts/generate_certificate.py +0 -161
  302. package/skills/bdbsaastraining/scripts/preflight_check.sh +0 -150
  303. package/skills/bdbsaastraining/templates/certificate_template.html +0 -508
  304. package/skills/global_config/bdb-ecosystem-health/SKILL.md +0 -68
  305. package/skills/global_config/bdbsaas-ops/SKILL.md +0 -16
  306. 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()