@hybridlabor-api/aos 4.4.1 → 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 (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 +387 -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,592 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Live Media Pool / ingest boundary probe.
3
-
4
- Creates a disposable Resolve project with generated synthetic media, probes
5
- Media Storage, Media Pool, Folder, MediaPoolItem, and annotation surfaces,
6
- writes JSON/Markdown evidence reports, and deletes the project unless
7
- --keep-open is provided.
8
-
9
- Run with Python 3.10-3.12 against a running Resolve Studio instance:
10
-
11
- python3.11 tests/live_media_pool_ingest_validation.py --output-dir /tmp/media-pool-ingest-probe
12
- """
13
-
14
- from __future__ import annotations
15
-
16
- import json
17
- import platform
18
- import shutil
19
- import subprocess
20
- import sys
21
- import tempfile
22
- import time
23
- from pathlib import Path
24
- from typing import Any, Dict, Optional
25
-
26
- from src.utils.timeline_kernel_probe import ProbeRecorder, render_markdown_report, utc_timestamp
27
-
28
-
29
- def _require_success(label: str, result: Dict[str, Any]) -> Dict[str, Any]:
30
- if not isinstance(result, dict):
31
- raise AssertionError(f"{label}: expected dict, got {result!r}")
32
- if result.get("error"):
33
- raise AssertionError(f"{label}: {result['error']}")
34
- if "success" in result and result["success"] is not True:
35
- raise AssertionError(f"{label}: expected success=True, got {result!r}")
36
- return result
37
-
38
-
39
- def _record_tool_result(
40
- recorder: ProbeRecorder,
41
- category: str,
42
- name: str,
43
- result: Dict[str, Any],
44
- *,
45
- expected_boundary: bool = False,
46
- ) -> None:
47
- if not isinstance(result, dict):
48
- recorder.record(category, name, "error", details={"reason": "non-dict result", "result": repr(result)})
49
- return
50
- if result.get("error"):
51
- recorder.record(
52
- category,
53
- name,
54
- "unsupported" if expected_boundary else "error",
55
- details={"reason": result.get("error"), "expected_boundary": expected_boundary},
56
- evidence=result,
57
- )
58
- return
59
- if "success" in result and result["success"] is not True:
60
- recorder.record(
61
- category,
62
- name,
63
- "partially_supported" if not expected_boundary else "unsupported",
64
- details={"reason": "success returned false", "expected_boundary": expected_boundary},
65
- evidence=result,
66
- )
67
- return
68
- if expected_boundary and result.get("imported") == 0:
69
- recorder.record(
70
- category,
71
- name,
72
- "unsupported",
73
- details={"reason": "Resolve returned zero imported items for expected negative fixture"},
74
- evidence=result,
75
- )
76
- return
77
- recorder.record(category, name, "supported", evidence=result)
78
-
79
-
80
- def _run_ffmpeg(args: list[str]) -> None:
81
- subprocess.run(["ffmpeg", "-hide_banner", "-loglevel", "error", *args], check=True)
82
-
83
-
84
- def _make_synthetic_assets(work_dir: Path) -> Dict[str, Path]:
85
- video = work_dir / "ingest_probe_video.mov"
86
- video_alt = work_dir / "ingest_probe_video_alt.mov"
87
- audio = work_dir / "ingest_probe_audio.wav"
88
- still = work_dir / "ingest_probe_still.png"
89
- sequence_dir = work_dir / "sequence"
90
- sequence_dir.mkdir(parents=True, exist_ok=True)
91
-
92
- _run_ffmpeg(
93
- [
94
- "-f",
95
- "lavfi",
96
- "-i",
97
- "testsrc2=size=320x180:rate=24:duration=5",
98
- "-f",
99
- "lavfi",
100
- "-i",
101
- "sine=frequency=880:sample_rate=48000:duration=5",
102
- "-shortest",
103
- "-pix_fmt",
104
- "yuv420p",
105
- "-c:v",
106
- "libx264",
107
- "-c:a",
108
- "aac",
109
- "-y",
110
- str(video),
111
- ]
112
- )
113
- _run_ffmpeg(
114
- [
115
- "-f",
116
- "lavfi",
117
- "-i",
118
- "testsrc=size=320x180:rate=24:duration=5",
119
- "-f",
120
- "lavfi",
121
- "-i",
122
- "sine=frequency=660:sample_rate=48000:duration=5",
123
- "-shortest",
124
- "-pix_fmt",
125
- "yuv420p",
126
- "-c:v",
127
- "libx264",
128
- "-c:a",
129
- "aac",
130
- "-y",
131
- str(video_alt),
132
- ]
133
- )
134
- _run_ffmpeg(["-f", "lavfi", "-i", "sine=frequency=440:sample_rate=48000:duration=3", "-y", str(audio)])
135
- _run_ffmpeg(["-f", "lavfi", "-i", "color=c=red:s=96x54", "-frames:v", "1", "-y", str(still)])
136
- for index, color in enumerate(("blue", "green", "yellow"), start=1):
137
- frame_path = sequence_dir / f"ingest_probe_seq_{index:03d}.png"
138
- _run_ffmpeg(["-f", "lavfi", "-i", f"color=c={color}:s=96x54", "-frames:v", "1", "-y", str(frame_path)])
139
-
140
- unsupported = work_dir / "not_media.txt"
141
- unsupported.write_text("synthetic non-media boundary fixture\n", encoding="utf-8")
142
- return {
143
- "video": video,
144
- "video_alt": video_alt,
145
- "audio": audio,
146
- "still": still,
147
- "sequence_pattern": sequence_dir / "ingest_probe_seq_%03d.png",
148
- "unsupported": unsupported,
149
- }
150
-
151
-
152
- def _first_imported_clip_id(imported_items) -> Optional[str]:
153
- for item in imported_items or []:
154
- try:
155
- item_id = item.GetUniqueId()
156
- except Exception:
157
- item_id = None
158
- if item_id:
159
- return str(item_id)
160
- return None
161
-
162
-
163
- def run_probe(server, output_dir: Path, keep_open: bool = False) -> Dict[str, Any]:
164
- output_dir.mkdir(parents=True, exist_ok=True)
165
- work_dir = Path(tempfile.mkdtemp(prefix="mcp_media_pool_ingest_probe_"))
166
- project_name = f"_mcp_media_pool_ingest_probe_{int(time.time())}"
167
- recorder = ProbeRecorder()
168
- created_project = False
169
- delete_result: Optional[Dict[str, Any]] = None
170
-
171
- metadata: Dict[str, Any] = {
172
- "title": "Media Pool Ingest Kernel Capability Probe",
173
- "timestamp_utc": utc_timestamp(),
174
- "python": sys.version,
175
- "platform": platform.platform(),
176
- "output_dir": str(output_dir),
177
- "project_name": project_name,
178
- }
179
-
180
- try:
181
- version = _require_success("resolve_control.get_version", server.resolve_control("get_version"))
182
- metadata.update(
183
- {
184
- "product": version.get("product"),
185
- "version": version.get("version"),
186
- "version_string": version.get("version_string"),
187
- }
188
- )
189
- print(f"Connected to {metadata['product']} {metadata['version_string']}")
190
-
191
- _require_success("project_manager.create", server.project_manager("create", {"name": project_name}))
192
- created_project = True
193
- print(f"Created disposable project: {project_name}")
194
- server.resolve_control("open_page", {"page": "media"})
195
-
196
- assets = _make_synthetic_assets(work_dir)
197
- metadata["synthetic_media"] = {key: str(value) for key, value in assets.items()}
198
- print(f"Generated synthetic media under: {work_dir}")
199
-
200
- resolve = server.get_resolve()
201
- project = resolve.GetProjectManager().GetCurrentProject()
202
- media_pool = project.GetMediaPool()
203
-
204
- imported_video = media_pool.ImportMedia([str(assets["video"])]) or []
205
- video_id = _first_imported_clip_id(imported_video)
206
- if not video_id:
207
- raise AssertionError("Failed to import synthetic video")
208
- metadata["video_clip_id"] = video_id
209
- print(f"Imported video clip: {video_id}")
210
-
211
- imported_target = media_pool.ImportMedia([str(assets["video_alt"])]) or []
212
- target_video_id = _first_imported_clip_id(imported_target)
213
- if not target_video_id:
214
- raise AssertionError("Failed to import target synthetic video")
215
- metadata["target_video_clip_id"] = target_video_id
216
-
217
- imports = {
218
- "audio": server.media_pool("import_media", {"paths": [str(assets["audio"])]}),
219
- "still": server.media_pool("import_media", {"paths": [str(assets["still"])]}),
220
- "sequence": server.media_pool(
221
- "import_media",
222
- {
223
- "clip_infos": [
224
- {
225
- "FilePath": str(assets["sequence_pattern"]),
226
- "StartIndex": 1,
227
- "EndIndex": 3,
228
- }
229
- ]
230
- },
231
- ),
232
- "unsupported_text": server.media_pool("import_media", {"paths": [str(assets["unsupported"])]}),
233
- }
234
- for name, result in imports.items():
235
- _record_tool_result(recorder, "imports", name, result, expected_boundary=(name == "unsupported_text"))
236
-
237
- kernel_imports = {
238
- "safe_import_media_dry_run": server.media_pool(
239
- "safe_import_media",
240
- {"paths": [str(assets["audio"])], "dry_run": True},
241
- ),
242
- "safe_import_media": server.media_pool(
243
- "safe_import_media",
244
- {"paths": [str(assets["audio"])]},
245
- ),
246
- "safe_import_sequence": server.media_pool(
247
- "safe_import_sequence",
248
- {
249
- "pattern": str(assets["sequence_pattern"]),
250
- "start_index": 1,
251
- "end_index": 3,
252
- },
253
- ),
254
- "safe_import_folder_dry_run": server.media_pool(
255
- "safe_import_folder",
256
- {"path": str(work_dir), "dry_run": True},
257
- ),
258
- }
259
- for name, result in kernel_imports.items():
260
- _record_tool_result(recorder, "kernel_imports", name, result)
261
-
262
- _record_tool_result(recorder, "storage", "get_volumes", server.media_storage("get_volumes"))
263
- _record_tool_result(
264
- recorder,
265
- "storage",
266
- "get_files_work_dir",
267
- server.media_storage("get_files", {"path": str(work_dir)}),
268
- )
269
- _record_tool_result(recorder, "capabilities", "ingest_capabilities", server.media_pool("ingest_capabilities"))
270
- _record_tool_result(recorder, "probe", "probe_media_pool", server.media_pool("probe_media_pool", {"depth": 2}))
271
- _record_tool_result(
272
- recorder,
273
- "probe",
274
- "probe_ingest_item_by_id",
275
- server.media_pool("probe_ingest_item", {"clip_ids": [video_id]}),
276
- )
277
- _record_tool_result(
278
- recorder,
279
- "probe",
280
- "probe_clip_properties",
281
- server.media_pool("probe_clip_properties", {"clip_ids": [video_id]}),
282
- )
283
- _record_tool_result(
284
- recorder,
285
- "probe",
286
- "media_pool_boundary_report",
287
- server.media_pool("media_pool_boundary_report", {"depth": 1, "clip_ids": [video_id]}),
288
- )
289
-
290
- _record_tool_result(
291
- recorder,
292
- "organization",
293
- "set_selected",
294
- server.media_pool("set_selected", {"clip_id": video_id}),
295
- )
296
- _record_tool_result(recorder, "organization", "get_selected", server.media_pool("get_selected"))
297
- _record_tool_result(
298
- recorder,
299
- "probe",
300
- "probe_ingest_item_selected",
301
- server.media_pool("probe_ingest_item", {"selected": True}),
302
- )
303
-
304
- subfolder = server.media_pool("add_subfolder", {"name": "Ingest Probe"})
305
- _record_tool_result(recorder, "organization", "add_subfolder", subfolder)
306
- _record_tool_result(
307
- recorder,
308
- "organization",
309
- "set_current_folder",
310
- server.media_pool("set_current_folder", {"path": "Master/Ingest Probe"}),
311
- )
312
- _record_tool_result(recorder, "folder", "get_current_folder", server.media_pool("get_current_folder"))
313
- _record_tool_result(recorder, "folder", "folder_get_subfolders", server.folder("get_subfolders", {"path": "Master"}))
314
- _record_tool_result(recorder, "folder", "folder_is_stale", server.folder("is_stale", {"path": "Master"}))
315
- _record_tool_result(recorder, "organization", "reset_current_folder", server.media_pool("set_current_folder", {"path": "Master"}))
316
- _record_tool_result(
317
- recorder,
318
- "organization",
319
- "organize_clips_dry_run",
320
- server.media_pool(
321
- "organize_clips",
322
- {"clip_ids": [target_video_id], "target_path": "Master/Ingest Probe", "dry_run": True},
323
- ),
324
- )
325
- _record_tool_result(
326
- recorder,
327
- "organization",
328
- "organize_clips",
329
- server.media_pool(
330
- "organize_clips",
331
- {"clip_ids": [target_video_id], "target_path": "Master/Ingest Probe"},
332
- ),
333
- )
334
-
335
- _record_tool_result(
336
- recorder,
337
- "metadata",
338
- "set_metadata_scalar",
339
- server.media_pool_item("set_metadata", {"clip_id": video_id, "key": "Comments", "value": "MCP ingest probe"}),
340
- )
341
- _record_tool_result(
342
- recorder,
343
- "metadata",
344
- "get_metadata_comments",
345
- server.media_pool_item("get_metadata", {"clip_id": video_id, "key": "Comments"}),
346
- )
347
- _record_tool_result(
348
- recorder,
349
- "metadata",
350
- "set_third_party_metadata",
351
- server.media_pool_item(
352
- "set_third_party_metadata",
353
- {"clip_id": video_id, "key": "mcp_ingest_probe", "value": "supported"},
354
- ),
355
- )
356
- _record_tool_result(
357
- recorder,
358
- "metadata",
359
- "get_third_party_metadata",
360
- server.media_pool_item("get_third_party_metadata", {"clip_id": video_id, "key": "mcp_ingest_probe"}),
361
- )
362
- _record_tool_result(
363
- recorder,
364
- "metadata",
365
- "get_clip_property_all",
366
- server.media_pool_item("get_clip_property", {"clip_id": video_id}),
367
- )
368
- _record_tool_result(
369
- recorder,
370
- "metadata",
371
- "get_clip_property_file_path",
372
- server.media_pool_item("get_clip_property", {"clip_id": video_id, "key": "File Path"}),
373
- )
374
- _record_tool_result(
375
- recorder,
376
- "metadata",
377
- "normalize_metadata",
378
- server.media_pool(
379
- "normalize_metadata",
380
- {
381
- "clip_ids": [target_video_id],
382
- "metadata": {"Comments": "MCP normalized metadata"},
383
- "third_party_metadata": {"mcp_ingest_normalized": "true"},
384
- },
385
- ),
386
- )
387
- _record_tool_result(
388
- recorder,
389
- "metadata",
390
- "copy_metadata",
391
- server.media_pool(
392
- "copy_metadata",
393
- {"source_clip_id": video_id, "target_clip_ids": [target_video_id], "include_third_party": True},
394
- ),
395
- )
396
-
397
- _record_tool_result(
398
- recorder,
399
- "annotations",
400
- "set_clip_color",
401
- server.media_pool_item("set_clip_color", {"clip_id": video_id, "color": "Blue"}),
402
- )
403
- _record_tool_result(
404
- recorder,
405
- "annotations",
406
- "get_clip_color",
407
- server.media_pool_item("get_clip_color", {"clip_id": video_id}),
408
- )
409
- _record_tool_result(
410
- recorder,
411
- "annotations",
412
- "marker_add",
413
- server.media_pool_item_markers(
414
- "add",
415
- {
416
- "clip_id": video_id,
417
- "frame": 12,
418
- "color": "Blue",
419
- "name": "Ingest Probe",
420
- "note": "Synthetic media marker",
421
- "duration": 1,
422
- "custom_data": "mcp-ingest-probe",
423
- },
424
- ),
425
- )
426
- _record_tool_result(
427
- recorder,
428
- "annotations",
429
- "marker_get_custom_data",
430
- server.media_pool_item_markers(
431
- "get_custom_data",
432
- {"clip_id": video_id, "frame": 12},
433
- ),
434
- )
435
- _record_tool_result(
436
- recorder,
437
- "annotations",
438
- "marker_update_custom_data",
439
- server.media_pool_item_markers(
440
- "update_custom_data",
441
- {"clip_id": video_id, "frame": 12, "custom_data": "mcp-ingest-probe-updated"},
442
- ),
443
- )
444
- _record_tool_result(
445
- recorder,
446
- "annotations",
447
- "flag_add",
448
- server.media_pool_item_markers("add_flag", {"clip_id": video_id, "color": "Blue"}),
449
- )
450
- _record_tool_result(
451
- recorder,
452
- "annotations",
453
- "flag_get",
454
- server.media_pool_item_markers("get_flags", {"clip_id": video_id}),
455
- )
456
- _record_tool_result(
457
- recorder,
458
- "annotations",
459
- "set_mark_in_out",
460
- server.media_pool_item("set_mark_in_out", {"clip_id": video_id, "mark_in": 0, "mark_out": 24}),
461
- )
462
- _record_tool_result(
463
- recorder,
464
- "annotations",
465
- "get_mark_in_out",
466
- server.media_pool_item("get_mark_in_out", {"clip_id": video_id}),
467
- )
468
- _record_tool_result(
469
- recorder,
470
- "annotations",
471
- "set_clip_marks",
472
- server.media_pool("set_clip_marks", {"clip_ids": [target_video_id], "mark_in": 0, "mark_out": 24}),
473
- )
474
- _record_tool_result(
475
- recorder,
476
- "annotations",
477
- "copy_clip_annotations",
478
- server.media_pool(
479
- "copy_clip_annotations",
480
- {"source_clip_id": video_id, "target_clip_ids": [target_video_id]},
481
- ),
482
- )
483
-
484
- _record_tool_result(
485
- recorder,
486
- "links",
487
- "link_proxy",
488
- server.media_pool_item("link_proxy", {"clip_id": video_id, "proxy_path": str(assets["video"])}),
489
- )
490
- _record_tool_result(
491
- recorder,
492
- "links",
493
- "unlink_proxy",
494
- server.media_pool_item("unlink_proxy", {"clip_id": video_id}),
495
- )
496
- _record_tool_result(
497
- recorder,
498
- "links",
499
- "link_proxy_checked",
500
- server.media_pool("link_proxy_checked", {"clip_id": video_id, "proxy_path": str(assets["video"])}),
501
- )
502
- _record_tool_result(
503
- recorder,
504
- "links",
505
- "safe_relink_dry_run",
506
- server.media_pool("safe_relink", {"clip_ids": [video_id], "folder_path": str(work_dir), "dry_run": True}),
507
- )
508
- _record_tool_result(
509
- recorder,
510
- "links",
511
- "safe_unlink_dry_run",
512
- server.media_pool("safe_unlink", {"clip_ids": [video_id], "dry_run": True}),
513
- )
514
- _record_tool_result(
515
- recorder,
516
- "links",
517
- "link_full_resolution_checked",
518
- server.media_pool("link_full_resolution_checked", {"clip_id": video_id, "path": str(assets["video"])}),
519
- )
520
-
521
- metadata_path = output_dir / "ingest_metadata.csv"
522
- _record_tool_result(
523
- recorder,
524
- "exports",
525
- "export_metadata",
526
- server.media_pool("export_metadata", {"path": str(metadata_path), "clip_ids": [video_id]}),
527
- )
528
-
529
- _record_tool_result(
530
- recorder,
531
- "cleanup_mutations",
532
- "clear_clip_color",
533
- server.media_pool_item("clear_clip_color", {"clip_id": video_id}),
534
- )
535
- _record_tool_result(
536
- recorder,
537
- "cleanup_mutations",
538
- "clear_flags",
539
- server.media_pool_item_markers("clear_flags", {"clip_id": video_id, "color": "Blue"}),
540
- )
541
- _record_tool_result(
542
- recorder,
543
- "cleanup_mutations",
544
- "delete_marker",
545
- server.media_pool_item_markers("delete_at_frame", {"clip_id": video_id, "frame": 12}),
546
- )
547
- _record_tool_result(
548
- recorder,
549
- "cleanup_mutations",
550
- "clear_mark_in_out",
551
- server.media_pool_item("clear_mark_in_out", {"clip_id": video_id}),
552
- )
553
- _record_tool_result(
554
- recorder,
555
- "cleanup_mutations",
556
- "clear_clip_marks",
557
- server.media_pool("clear_clip_marks", {"clip_ids": [target_video_id]}),
558
- )
559
-
560
- if keep_open:
561
- server.project_manager("save")
562
- print(f"LEFT PROJECT OPEN FOR INSPECTION: {project_name}")
563
- created_project = False
564
-
565
- finally:
566
- if created_project:
567
- server.project_manager("save")
568
- server.project_manager("close")
569
- delete_result = server.project_manager("delete", {"name": project_name})
570
- print(f"Deleted disposable project: {delete_result}")
571
-
572
- report = recorder.to_report(
573
- metadata,
574
- {
575
- "json": str(output_dir / "media-pool-ingest-probe.json"),
576
- "markdown": str(output_dir / "media-pool-ingest-probe.md"),
577
- },
578
- )
579
- json_path = output_dir / "media-pool-ingest-probe.json"
580
- markdown_path = output_dir / "media-pool-ingest-probe.md"
581
- json_path.write_text(json.dumps(report, indent=2, sort_keys=True), encoding="utf-8")
582
- markdown_path.write_text(render_markdown_report(report), encoding="utf-8")
583
- print(f"Wrote JSON report: {json_path}")
584
- print(f"Wrote Markdown report: {markdown_path}")
585
- print(f"Counts: {json.dumps(report['counts'], sort_keys=True)}")
586
- if not keep_open:
587
- shutil.rmtree(work_dir, ignore_errors=True)
588
- print(f"Removed synthetic media directory: {work_dir}")
589
-
590
- if delete_result and delete_result.get("success") is not True:
591
- raise AssertionError(f"Cleanup failed for {project_name}: {delete_result!r}")
592
- return report