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