@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,525 +0,0 @@
1
- """Behaviorally-verified facts about the DaVinci Resolve scripting API.
2
-
3
- The Resolve scripting API is under-documented and frequently behaves differently
4
- from its apparent signature: methods live on objects you wouldn't expect, return
5
- values lie, string keys are silently rejected, and some documented-looking calls
6
- don't exist. This module records facts we have *verified against live Resolve* so
7
- agents and code can look the reality up instead of rediscovering it the hard way.
8
-
9
- Each entry is a small dict. Grow it opportunistically — every readback recipe and
10
- every fix that uncovers a surprising behavior should add an entry. Facts are
11
- stamped with the Resolve build they were verified on so drift is visible when a
12
- new version ships.
13
-
14
- Optional keys on an entry feed the Blackmagic-facing limitations report
15
- (``docs/reference/api-limitations.md``, generated by
16
- ``scripts/gen_api_limitations.py``):
17
-
18
- - ``submit``: ``"missing"`` (a capability Blackmagic should add) or ``"bug"``
19
- (a behavior Blackmagic should fix). Entries without ``submit`` are internal
20
- quirks/tips and stay out of the report.
21
- - ``issue``: GitHub issue number (int) that drove the finding, for cross-ref.
22
-
23
- When you add or change a ``submit``-tagged entry, regenerate the report
24
- (``venv/bin/python scripts/gen_api_limitations.py``) or the
25
- ``tests.test_api_limitations_doc`` drift guard fails.
26
- """
27
- from typing import Any, Dict, List, Optional
28
-
29
- VERIFIED_ON = "DaVinci Resolve Studio 21.0.0"
30
-
31
- # Each entry: symbol, object, reality, recommended, tags. `signature` optional.
32
- API_TRUTH: List[Dict[str, Any]] = [
33
- {
34
- "symbol": "MediaPool.AutoSyncAudio",
35
- "object": "MediaPool",
36
- "signature": "(clips, settings) -> bool",
37
- "reality": "The boolean return does not reflect whether clips actually "
38
- "linked, and string enum keys in `settings` are silently "
39
- "rejected (the call returns False).",
40
- "recommended": "Resolve the AUDIO_SYNC_* enum constants via the live "
41
- "resolve handle, and verify by reading each clip's "
42
- "'Synced Audio' property (see verify_by_readback).",
43
- "tags": ["unreliable-return", "silent-failure", "audio", "enum"],
44
- "submit": "bug",
45
- "mitigation": ["_normalize_auto_sync_settings", "_safe_auto_sync_audio"],
46
- },
47
- {
48
- "symbol": "Timeline.CreateSubtitlesFromAudio",
49
- "object": "Timeline",
50
- "signature": "(autoCaptionSettings) -> bool",
51
- "reality": "Same failure mode as AutoSyncAudio: the autoCaptionSettings "
52
- "dict is keyed by resolve.SUBTITLE_* enum constants with "
53
- "resolve.AUTO_CAPTION_* enum values, so plain string keys like "
54
- "{'language': 'korean'} are silently rejected (returns False, "
55
- "no subtitle track created). The boolean is also unreliable.",
56
- "recommended": "Resolve the SUBTITLE_*/AUTO_CAPTION_* constants via the "
57
- "live resolve handle (server._normalize_auto_caption_settings) "
58
- "and verify by reading the timeline's subtitle track count "
59
- "before/after (server._safe_create_subtitles).",
60
- "tags": ["unreliable-return", "silent-failure", "subtitle", "enum"],
61
- "submit": "bug",
62
- "mitigation": ["_normalize_auto_caption_settings", "_safe_create_subtitles"],
63
- },
64
- {
65
- "symbol": "ProjectManager CloudProject family (Create/Load/Import/RestoreCloudProject)",
66
- "object": "ProjectManager",
67
- "signature": "(..., cloudSettings) -> Project | bool",
68
- "reality": "All four take an enum-keyed {cloudSettings} dict "
69
- "(resolve.CLOUD_SETTING_* keys, resolve.CLOUD_SYNC_* sync-mode "
70
- "values). Plain string keys are silently rejected, so a settings "
71
- "dict built from human-readable keys yields no project / False.",
72
- "recommended": "Resolve the CLOUD_SETTING_*/CLOUD_SYNC_* constants via the "
73
- "live resolve handle (server._normalize_cloud_settings) "
74
- "before calling, and treat the bool return from "
75
- "Import/RestoreCloudProject as advisory.",
76
- "tags": ["silent-failure", "project", "cloud", "enum"],
77
- "submit": "bug",
78
- "mitigation": ["_normalize_cloud_settings"],
79
- },
80
- {
81
- "symbol": "Timeline.Export",
82
- "object": "Timeline",
83
- "signature": "(fileName, exportType, exportSubtype) -> bool",
84
- "reality": "exportType/exportSubtype must be resolve.EXPORT_* enum *values* "
85
- "resolved from the live handle. A JSON/MCP caller cannot pass a "
86
- "live enum, and a plain string ('fcpxml', or even the constant "
87
- "name 'EXPORT_FCPXML_1_10') is silently rejected with no file "
88
- "written.",
89
- "recommended": "Map a friendly format/subtype to the EXPORT_* constant and "
90
- "resolve it against the live handle "
91
- "(server._timeline_export_spec) before calling; verify the "
92
- "output file exists afterward.",
93
- "tags": ["silent-failure", "timeline", "export", "enum"],
94
- "submit": "bug",
95
- "mitigation": ["_timeline_export_spec", "_timeline_export_value"],
96
- },
97
- {
98
- "symbol": "ProjectManager.DeleteProject",
99
- "object": "ProjectManager",
100
- "signature": "(projectName) -> bool",
101
- "reality": "Returns False (no deletion) when the target project is, or "
102
- "recently was, the current project, and is flaky on the first "
103
- "attempt — so a single bool() call leaves the project undeleted "
104
- "with no useful error.",
105
- "recommended": "Load/close away from the target first, then retry; use "
106
- "src/utils/project_cleanup.py:delete_project_safely.",
107
- "tags": ["unreliable-return", "project", "flaky"],
108
- "submit": "bug",
109
- },
110
- {
111
- "symbol": "Composition.Paste",
112
- "object": "Fusion Composition",
113
- "reality": "Passing tool.SaveSettings()'s in-memory table to Paste() / "
114
- "LoadSettings() fails across the Python bridge with an "
115
- "OrderedDict/null-argument error and creates no node, while "
116
- "reporting nothing useful.",
117
- "recommended": "Duplicate via AddTool(RegID) + SaveSettings(path)/"
118
- "LoadSettings(path) through a temp .setting FILE, which "
119
- "round-trips reliably. Identify the new node by name diff.",
120
- "tags": ["fusion", "bridge", "silent-failure"],
121
- "submit": "bug",
122
- },
123
- {
124
- "symbol": "FlowView.SetPos / FlowView.GetPosTable",
125
- "object": "Fusion FlowView (comp.CurrentFrame.FlowView)",
126
- "reality": "Node positions are read/written through the FlowView, not the "
127
- "tool. SetPos returns nothing reliable; GetPosTable returns a "
128
- "1-indexed table (or dict/tuple depending on bridge).",
129
- "recommended": "Use comp.CurrentFrame.FlowView.SetPos(tool, x, y); confirm "
130
- "with GetPosTable and a liberal position parser.",
131
- "tags": ["fusion", "unreliable-return"],
132
- "submit": "bug",
133
- },
134
- {
135
- "symbol": "Timeline.GetTimelineByName",
136
- "object": "Project",
137
- "reality": "Does not exist. Timelines are looked up by index.",
138
- "recommended": "Iterate GetTimelineByIndex(1..GetTimelineCount()).",
139
- "tags": ["missing-method", "timeline"],
140
- "submit": "missing",
141
- },
142
- {
143
- "symbol": "Project render methods (AddRenderJob, SetRenderSettings, ...)",
144
- "object": "Project",
145
- "reality": "Render methods live on the Project object, not on a separate "
146
- "render-settings interface.",
147
- "recommended": "Call proj.AddRenderJob(), proj.SetRenderSettings(), "
148
- "proj.LoadRenderPreset() directly on the project.",
149
- "tags": ["render"],
150
- },
151
- {
152
- "symbol": "MediaPoolItem.GetClipProperty('Transcription')",
153
- "object": "MediaPoolItem",
154
- "reality": "Returns a PREVIEW of the transcription that ends in an "
155
- "ellipsis when the full transcript is longer than the property "
156
- "exposes.",
157
- "recommended": "Treat a trailing ellipsis as truncation (see "
158
- "media_pool_item get_transcription's `truncated` flag).",
159
- "tags": ["transcription", "truncation"],
160
- "submit": "bug",
161
- },
162
- {
163
- "symbol": "ProjectManager.CreateProject (with a dirty Untitled project)",
164
- "object": "ProjectManager",
165
- "reality": "Returns None and pops a modal 'Save Current Project' dialog "
166
- "when the current unsaved/Untitled project blocks the switch. "
167
- "SaveProject() on an Untitled project re-triggers the same modal.",
168
- "recommended": "CloseProject(current) to discard the untitled project "
169
- "without a prompt, then CreateProject; restore with "
170
- "LoadProject afterward.",
171
- "tags": ["project", "modal", "silent-failure"],
172
- "submit": "bug",
173
- },
174
- {
175
- "symbol": "Timeline.InsertFusionCompositionIntoTimeline",
176
- "object": "Timeline",
177
- "reality": "Reliable way to obtain a Fusion comp on an otherwise empty "
178
- "timeline: it inserts a Fusion composition clip whose comp is "
179
- "then reachable via GetFusionCompByIndex(1).",
180
- "recommended": "Use it (rather than InsertGeneratorIntoTimeline) when you "
181
- "need a comp to operate on.",
182
- "tags": ["fusion", "timeline"],
183
- },
184
- {
185
- "symbol": "Source Track Selector / destination track for Insert*IntoTimeline",
186
- "object": "Timeline",
187
- "reality": "There is no API to read or set the Source/Auto Track Selector "
188
- "(the Edit-page patch panel that picks the destination track). "
189
- "InsertTitleIntoTimeline, InsertFusionTitleIntoTimeline, "
190
- "InsertGeneratorIntoTimeline, InsertFusionGeneratorIntoTimeline, "
191
- "InsertOFXGeneratorIntoTimeline and "
192
- "InsertFusionCompositionIntoTimeline take no trackIndex and "
193
- "always drop the clip on the selector's current target (V1 in "
194
- "practice). Locking lower video tracks does NOT redirect the "
195
- "insert — verified live on 21.0.0: locking V1 makes the insert "
196
- "FAIL rather than land on V2. Titles/generators also can't be "
197
- "moved afterward (no MediaPoolItem, so AppendToTimeline clipInfo "
198
- "and MoveClips don't apply).",
199
- "recommended": "Accept the limitation for titles/generators (insert lands "
200
- "on V1). For clips that DO have a MediaPoolItem, target a "
201
- "track with MediaPool.AppendToTimeline's clipInfo 'trackIndex' "
202
- "instead (exposed as media_pool append_to_timeline clip_infos). "
203
- "See issue #74.",
204
- "tags": ["missing-method", "timeline", "title", "generator", "track"],
205
- "submit": "missing",
206
- "issue": 74,
207
- },
208
- {
209
- "symbol": "Per-clip audio channel-format conversion (Stereo<->Mono)",
210
- "object": "MediaPoolItem / TimelineItem",
211
- "reality": "No scripting method converts an individual clip's audio "
212
- "channel format. ConvertTimelineToStereo is timeline-wide, and "
213
- "CreateStereoClip builds a 3D *visual* stereoscopic clip, not an "
214
- "audio mono->stereo change. The Edit-page 'Clip Attributes > "
215
- "Audio' channel mapping is UI-only.",
216
- "recommended": "Use the supported surface: timeline add_track with audioType "
217
- "(create mono/stereo tracks), get_track_sub_type (query "
218
- "format), convert_to_stereo (timeline-wide), and "
219
- "timeline_item get_source_audio_channel_mapping. Per-clip "
220
- "conversion is not possible. See issue #73.",
221
- "tags": ["missing-method", "audio", "channel"],
222
- "submit": "missing",
223
- "issue": 73,
224
- },
225
- {
226
- "symbol": "Native multicam clip creation",
227
- "object": "MediaPool",
228
- "reality": "There is no method to create a native multicam clip from a set "
229
- "of angles. Angles can be stacked onto tracks programmatically, "
230
- "but the multicam-clip conversion is a UI-only step.",
231
- "recommended": "Prepare a stacked timeline (media_pool setup_multicam_timeline) "
232
- "and finish the multicam-clip conversion in the Resolve UI.",
233
- "tags": ["missing-method", "media-pool", "multicam"],
234
- "submit": "missing",
235
- },
236
- {
237
- "symbol": "Transition create / copy / clone",
238
- "object": "Timeline / TimelineItem",
239
- "reality": "The scripting API exposes no method to add, read, copy, or "
240
- "clone an edit transition (cross-dissolve, etc.). Transitions "
241
- "applied in the UI are invisible to and unmodifiable by scripts.",
242
- "recommended": "Apply/duplicate transitions in the Resolve UI; no scripted "
243
- "equivalent exists.",
244
- "tags": ["missing-method", "timeline", "transition"],
245
- "submit": "missing",
246
- },
247
- {
248
- "symbol": "Cloud project enumeration / export / user management",
249
- "object": "ProjectManager",
250
- "reality": "Only CreateCloudProject, LoadCloudProject, ImportCloudProject "
251
- "and RestoreCloudProject exist. There is no GetCloudProjectList "
252
- "(list available cloud projects), no ExportToCloud, and no "
253
- "Add/RemoveUserToCloudProject — so cloud collaboration can't be "
254
- "fully automated.",
255
- "recommended": "Drive cloud project listing, export, and collaborator "
256
- "management from the Resolve UI; only create/load/import/"
257
- "restore are scriptable.",
258
- "tags": ["missing-method", "project", "cloud"],
259
- "submit": "missing",
260
- },
261
- {
262
- "symbol": "TimelineItem trim / move / re-time (no position setters)",
263
- "object": "TimelineItem",
264
- "reality": "TimelineItem exposes GetStart, GetEnd, GetDuration, "
265
- "GetLeftOffset, GetRightOffset and GetSourceStart/EndFrame, but "
266
- "NO matching setters. A clip cannot be trimmed, slipped, slid, "
267
- "rolled, moved to another time/track, or have its duration "
268
- "changed once it is on the timeline. Verified via dir() on "
269
- "Resolve 21.0.0 (getters only).",
270
- "recommended": "Do edit-point adjustments in the Resolve UI, or rebuild the "
271
- "timeline from MediaPool.AppendToTimeline clipInfos with the "
272
- "desired startFrame/endFrame/recordFrame.",
273
- "tags": ["missing-method", "timeline", "edit", "trim"],
274
- "submit": "missing",
275
- },
276
- {
277
- "symbol": "Razor / blade / split a timeline item",
278
- "object": "Timeline / TimelineItem",
279
- "reality": "There is no method to split/cut/blade a clip at a given frame. "
280
- "Verified absent on Timeline and TimelineItem (dir(), 21.0.0).",
281
- "recommended": "Split in the Resolve UI, or construct the cut up-front by "
282
- "appending two clipInfos with the desired in/out points.",
283
- "tags": ["missing-method", "timeline", "edit"],
284
- "submit": "missing",
285
- },
286
- {
287
- "symbol": "Clip speed / retime ratio and speed ramps",
288
- "object": "TimelineItem",
289
- "reality": "SetProperty exposes only retime *quality* (RetimeProcess, "
290
- "MotionEstimation) and transform/crop/composite/opacity keys — "
291
- "not the speed value itself. There is no way to set a clip to a "
292
- "given % speed, reverse it, or author a speed ramp. Verified "
293
- "against the documented SetProperty key list AND by live "
294
- "mutating attempt on 21.0.0: SetProperty('Speed'|'PlaybackSpeed'"
295
- "|'RetimeSpeed'|'ClipSpeed', 50) all return False, while "
296
- "SetProperty('RetimeProcess', 1) returns True.",
297
- "recommended": "Set clip speed/retime in the Resolve UI; no scripted "
298
- "equivalent exists.",
299
- "tags": ["missing-method", "timeline", "retime", "speed"],
300
- "submit": "missing",
301
- },
302
- {
303
- "symbol": "Color node graph editing and primary grade values",
304
- "object": "Graph / TimelineItem",
305
- "reality": "The Graph object exposes node enable/label/count, LUT get/set, "
306
- "cache mode, ResetAllGrades, ApplyGradeFromDRX and "
307
- "ApplyArriCdlLut; TimelineItem adds SetCDL, CopyGrades and color "
308
- "versions. But you cannot add, delete, or connect nodes, and you "
309
- "cannot read or write primary grade values (lift/gamma/gain/"
310
- "offset/contrast/curves/qualifiers/power windows). Grading is "
311
- "limited to CDL, whole-grade DRX/LUT application and copying.",
312
- "recommended": "Build node trees and dial grades in the Resolve UI or via "
313
- "DRX/CDL/LUT import; per-parameter grade control is not "
314
- "scriptable.",
315
- "tags": ["missing-method", "color", "grade", "node"],
316
- "submit": "missing",
317
- },
318
- {
319
- "symbol": "Fairlight audio levels / pan / EQ / automation / FairlightFX",
320
- "object": "TimelineItem / Timeline",
321
- "reality": "There is no API to set clip or track volume, pan, EQ, audio "
322
- "automation, or to add/configure FairlightFX. SetProperty covers "
323
- "video transform only; the audio surface is read-only "
324
- "(GetSourceAudioChannelMapping, GetAudioMapping, voice "
325
- "isolation). Verified via dir() + SetProperty docs AND by live "
326
- "mutating attempt on 21.0.0: SetProperty('Volume'|'Level'|'Gain'"
327
- "|'AudioVolume', 0) all return False (note 'Pan' is the VIDEO "
328
- "transform key, not audio pan, so it misleadingly succeeds).",
329
- "recommended": "Mix in the Fairlight UI; only voice-isolation state and "
330
- "channel-mapping reads are scriptable.",
331
- "tags": ["missing-method", "audio", "fairlight"],
332
- "submit": "missing",
333
- },
334
- {
335
- "symbol": "Proxy / optimized-media generation",
336
- "object": "MediaPoolItem",
337
- "reality": "Only LinkProxyMedia, UnlinkProxyMedia and "
338
- "LinkFullResolutionMedia exist (attach/detach EXISTING proxies). "
339
- "There is no method to generate proxies or optimized media. "
340
- "Verified via MediaPoolItem dir() (21.0.0).",
341
- "recommended": "Trigger proxy/optimized-media generation from the Resolve "
342
- "UI; scripting can only link/unlink already-rendered proxies.",
343
- "tags": ["missing-method", "media-pool", "proxy"],
344
- "submit": "missing",
345
- },
346
- {
347
- "symbol": "Insert / Overwrite / Replace / Fit-to-Fill edit modes",
348
- "object": "MediaPool / Timeline",
349
- "reality": "MediaPool.AppendToTimeline (with optional recordFrame "
350
- "positioning) is the only programmatic placement. The standard "
351
- "edit modes — insert (ripple), overwrite, replace, fit-to-fill, "
352
- "place-on-top — have no API. Verified via dir() (21.0.0).",
353
- "recommended": "Position clips with AppendToTimeline clipInfo recordFrame, "
354
- "or perform insert/overwrite/replace edits in the Resolve UI.",
355
- "tags": ["missing-method", "timeline", "edit"],
356
- "submit": "missing",
357
- },
358
- {
359
- "symbol": "Smart Bins / Power Bins creation",
360
- "object": "MediaPool",
361
- "reality": "Only AddSubFolder (a regular bin) exists. Smart Bins (rule-"
362
- "based) and Power Bins (cross-project) cannot be created or "
363
- "configured. Verified via MediaPool dir() (21.0.0).",
364
- "recommended": "Create Smart/Power Bins in the Resolve UI; only regular "
365
- "bins are scriptable.",
366
- "tags": ["missing-method", "media-pool", "bins"],
367
- "submit": "missing",
368
- },
369
- {
370
- "symbol": "Per-subtitle text content and timing editing",
371
- "object": "TimelineItem (subtitle track)",
372
- "reality": "TimelineItem on a subtitle track exposes only 21 standard "
373
- "transform/composite properties (Pan, Tilt, ZoomX, Opacity, "
374
- "Crop, etc.). There are no methods to get or set subtitle "
375
- "text (GetText/SetText), start time, end time, or duration "
376
- "for individual subtitle items. Subtitles created via "
377
- "CreateSubtitlesFromAudio or imported via the Resolve UI "
378
- "cannot have their content or timing read or modified "
379
- "programmatically. Verified via dir() and GetProperty() on "
380
- "Resolve 21.0.0.48.",
381
- "recommended": "No workaround exists — subtitle text and timing are "
382
- "completely inaccessible from the scripting API. Must "
383
- "be edited in the Resolve UI.",
384
- "tags": ["missing-method", "subtitle", "text", "timing"],
385
- "submit": "missing",
386
- },
387
- {
388
- "symbol": "Subtitle track styling and presets",
389
- "object": "TimelineItem / Timeline / Project",
390
- "reality": "There is no API method to set or query subtitle font "
391
- "family, font size, text color, background color, outline, "
392
- "shadow, position, alignment, or to apply/query subtitle "
393
- "style presets. TimelineItem.GetProperty() on subtitle "
394
- "items returns only transform/composite keys. "
395
- "Timeline.GetSetting() and Project.GetSetting() return "
396
- "None for all probed subtitle-style keys (e.g. "
397
- "'subtitleFontName', 'subtitleFontSize', "
398
- "'subtitleTextColor', 'subtitleBackgroundColor', "
399
- "'subtitlePosition', 'subtitleAlignment', "
400
- "'subtitlePreset', 'subtitleStyle'). Verified via dir(), "
401
- "GetProperty(), and GetSetting() on Resolve 21.0.0.48.",
402
- "recommended": "No workaround exists — subtitle styling is UI-only. "
403
- "Burn-in overlays via Fusion titles are a visual "
404
- "alternative but do not produce proper subtitle tracks.",
405
- "tags": ["missing-method", "subtitle", "style", "preset"],
406
- "submit": "missing",
407
- },
408
- {
409
- "symbol": "Speech recognition engine selection and SRT import",
410
- "object": "Timeline",
411
- "reality": "Timeline.CreateSubtitlesFromAudio(autoCaptionSettings) "
412
- "always uses the built-in Resolve speech recognition "
413
- "engine. There is no API parameter to select an alternative "
414
- "provider (e.g. whisper-cli, Google Speech, AWS Transcribe). "
415
- "The language selection via resolve.AUTO_CAPTION_LANGUAGE_* "
416
- "is the only customization; the engine itself cannot be "
417
- "changed. Furthermore, there is no API method to import an "
418
- "SRT file into a subtitle track programmatically — "
419
- "File -> Import -> Subtitle is UI-only.",
420
- "recommended": "No workaround exists for provider selection or SRT "
421
- "import. External transcripts must be converted to SRT "
422
- "and imported through the Resolve UI.",
423
- "tags": ["missing-method", "subtitle", "transcription",
424
- "speech-recognition", "asr"],
425
- "submit": "missing",
426
- },
427
- {
428
- "symbol": "Media Pool folder rename",
429
- "object": "MediaPool",
430
- "reality": "MediaPool exposes AddSubFolder(name), "
431
- "DeleteSubFolders([names]), and "
432
- "MoveFolders([names], targetFolder) but no "
433
- "RenameSubFolder(oldName, newName) method. Folders can be "
434
- "created, deleted, and moved, but their names cannot be "
435
- "changed through the API. Verified via dir() on Resolve "
436
- "21.0.0.",
437
- "recommended": "Delete and recreate the folder with the desired name, "
438
- "or rename in the Resolve UI.",
439
- "tags": ["missing-method", "media-pool", "folder"],
440
- "submit": "missing",
441
- },
442
- {
443
- "symbol": "hasattr() / getattr() on Resolve API objects (attribute fabrication)",
444
- "object": "(all Resolve scripting objects)",
445
- "reality": "The Python bridge returns a callable for ANY attribute name, so "
446
- "hasattr(obj, 'TotallyMadeUpMethod') is always True and getattr "
447
- "never raises. This makes capability detection by hasattr "
448
- "impossible — verified on 21.0.0 (hasattr reported SetStart, "
449
- "Razor, AddNode, GenerateProxy, AddSmartBin etc. as present "
450
- "though none exist). Only dir() lists the real methods.",
451
- "recommended": "Never probe method existence with hasattr/getattr; test "
452
- "membership against dir(obj) instead. Calling a fabricated "
453
- "method typically returns None/False with no error.",
454
- "tags": ["bridge", "introspection", "silent-failure"],
455
- "submit": "bug",
456
- },
457
- {
458
- "symbol": "subprocess inheriting stdin under the MCP stdio server",
459
- "object": "(server runtime)",
460
- "reality": "A child process that inherits stdin can race-read bytes off "
461
- "the JSON-RPC protocol stream and corrupt it; capture_output "
462
- "redirects only stdout/stderr.",
463
- "recommended": "Pass stdin=subprocess.DEVNULL on every subprocess that can "
464
- "run while serving over stdio.",
465
- "tags": ["runtime", "stdio", "subprocess"],
466
- },
467
- {
468
- "symbol": "MediaPoolItem.SetClipProperty('Reel Name', ...)",
469
- "object": "MediaPoolItem",
470
- "signature": "(propertyName, propertyValue) -> bool",
471
- "reality": "Setting the 'Reel Name' clip property returns True but the "
472
- "value is silently dropped on read-back when the project is "
473
- "configured to derive reel names automatically "
474
- "(General Options > 'Assist using reel names from the:' set "
475
- "to source clip file / embedding / filename pattern). The "
476
- "same True-but-unpersisted behavior occurs via "
477
- "SetMetadata('Reel Name', ...). Other clip properties on the "
478
- "same clip (e.g. 'Comments') write and persist normally, so "
479
- "this is field-specific, not a bridge/permission failure. "
480
- "Verified on Resolve 21.0.0; reported as issue #77.",
481
- "recommended": "After writing 'Reel Name', read it back with "
482
- "GetClipProperty('Reel Name') and refuse to report "
483
- "success on mismatch; surface the project-setting gate to "
484
- "the caller (server._verify_clip_property_writeback).",
485
- "tags": ["unreliable-return", "silent-failure", "metadata", "reel-name"],
486
- "submit": "bug",
487
- "issue": 77,
488
- "mitigation": ["_verify_clip_property_writeback", "_verify_writeback"],
489
- },
490
- ]
491
-
492
-
493
- def lookup_api_truth(query: Optional[str] = None) -> List[Dict[str, Any]]:
494
- """Return verified facts matching `query`, or all facts if no query.
495
-
496
- Matches a case-insensitive substring against the symbol, tags, and reality.
497
- """
498
- if not query:
499
- return list(API_TRUTH)
500
- q = query.lower()
501
- out = []
502
- for e in API_TRUTH:
503
- hay = " ".join([
504
- e.get("symbol", ""),
505
- e.get("object", ""),
506
- e.get("reality", ""),
507
- " ".join(e.get("tags", [])),
508
- ]).lower()
509
- if q in hay:
510
- out.append(e)
511
- return out
512
-
513
-
514
- def submittable_limitations() -> Dict[str, List[Dict[str, Any]]]:
515
- """Group ``submit``-tagged entries for the Blackmagic-facing report.
516
-
517
- Returns ``{"missing": [...], "bug": [...]}`` — entries Blackmagic should add
518
- vs. behaviors they should fix — preserving API_TRUTH order within each group.
519
- """
520
- groups: Dict[str, List[Dict[str, Any]]] = {"missing": [], "bug": []}
521
- for e in API_TRUTH:
522
- kind = e.get("submit")
523
- if kind in groups:
524
- groups[kind].append(e)
525
- return groups