@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,540 +0,0 @@
1
- """Headless batch-runner CLI for source-safe media analysis.
2
-
3
- Drives src.utils.media_analysis_jobs from outside an MCP/chat client so users
4
- can run long batches via cron, CI, or terminal without holding a chat turn
5
- open. The orchestration loop and durable state live in the jobs engine; this
6
- module only handles argv, progress streaming, and exit codes.
7
- """
8
- from __future__ import annotations
9
-
10
- import argparse
11
- import json
12
- import signal
13
- import sys
14
- import time
15
- from typing import Any, Dict, List, Optional
16
-
17
- from src.utils.media_analysis import (
18
- build_plan,
19
- detect_capabilities,
20
- plan_requires_capabilities,
21
- )
22
- from src.utils.media_analysis_jobs import (
23
- batch_job_status,
24
- cancel_batch_job,
25
- create_batch_job_from_paths,
26
- list_batch_jobs,
27
- records_from_paths,
28
- resume_batch_job,
29
- run_batch_job_slice,
30
- )
31
-
32
-
33
- EXIT_OK = 0
34
- EXIT_PARTIAL = 2
35
- EXIT_FATAL = 3
36
- EXIT_CANCELED = 130
37
-
38
- _TERMINAL_STATUSES = {"completed", "completed_with_errors", "canceled"}
39
-
40
- _canceled = False
41
-
42
-
43
- def _on_sigint(signum, frame): # noqa: ARG001 - signal handler signature
44
- global _canceled
45
- _canceled = True
46
-
47
-
48
- def _emit(message: str, *, json_mode: bool, payload: Optional[Dict[str, Any]] = None) -> None:
49
- if json_mode:
50
- sys.stdout.write(json.dumps(payload or {}, ensure_ascii=False) + "\n")
51
- else:
52
- sys.stdout.write(message + "\n")
53
- sys.stdout.flush()
54
-
55
-
56
- def _build_params(args: argparse.Namespace) -> Dict[str, Any]:
57
- params: Dict[str, Any] = {}
58
- if getattr(args, "depth", None):
59
- params["depth"] = args.depth
60
- if getattr(args, "source_trust", None):
61
- params["source_trust"] = args.source_trust
62
- if getattr(args, "summary_style", None):
63
- params["vision"] = {"summary_style": args.summary_style}
64
- params["analysis_summary_style"] = args.summary_style
65
- return params
66
-
67
-
68
- def _exit_for_status(status: Optional[str]) -> int:
69
- if status == "completed":
70
- return EXIT_OK
71
- if status == "completed_with_errors":
72
- return EXIT_PARTIAL
73
- if status == "canceled":
74
- return EXIT_CANCELED
75
- return EXIT_FATAL
76
-
77
-
78
- def _drive_to_completion(
79
- project_root: str,
80
- job_id: str,
81
- *,
82
- max_clips: int,
83
- max_seconds: Optional[float],
84
- json_mode: bool,
85
- ) -> int:
86
- signal.signal(signal.SIGINT, _on_sigint)
87
- while True:
88
- if _canceled:
89
- cancel_batch_job(project_root, job_id)
90
- _emit(
91
- "Interrupted — job canceled",
92
- json_mode=json_mode,
93
- payload={"event": "canceled", "job_id": job_id},
94
- )
95
- return EXIT_CANCELED
96
- slice_result = run_batch_job_slice(
97
- project_root,
98
- job_id,
99
- max_clips=max_clips,
100
- max_seconds=max_seconds,
101
- )
102
- if not slice_result.get("success"):
103
- _emit(
104
- f"Slice failed: {slice_result.get('error')}",
105
- json_mode=json_mode,
106
- payload={"event": "slice_failed", **slice_result},
107
- )
108
- return EXIT_FATAL
109
- for clip in slice_result.get("processed") or []:
110
- _emit(
111
- f" [{(clip.get('status') or '?'):>9}] #{(clip.get('position') or 0) + 1}"
112
- + (f" — {clip.get('error')}" if clip.get("error") else ""),
113
- json_mode=json_mode,
114
- payload={"event": "clip_done", **clip},
115
- )
116
- job_state = slice_result.get("job") or {}
117
- status = job_state.get("status")
118
- processed_count = int(slice_result.get("processed_count") or 0)
119
- if status in _TERMINAL_STATUSES or processed_count == 0:
120
- final = batch_job_status(
121
- project_root, job_id, include_clips=False, include_events=False
122
- )
123
- counts = final.get("progress", {})
124
- status = final.get("status")
125
- _emit(
126
- f"Done: {status} ({counts.get('done_clips', 0)}/{counts.get('total_clips', 0)})",
127
- json_mode=json_mode,
128
- payload={
129
- "event": "job_done",
130
- "job_id": job_id,
131
- "status": status,
132
- "progress": counts,
133
- "succeeded_clips": final.get("succeeded_clips"),
134
- "failed_clips": final.get("failed_clips"),
135
- "skipped_clips": final.get("skipped_clips"),
136
- },
137
- )
138
- return _exit_for_status(status)
139
-
140
-
141
- def _cmd_plan(args: argparse.Namespace) -> int:
142
- records, warnings = records_from_paths(args.paths, recursive=args.recursive)
143
- if not records:
144
- _emit(
145
- "No analyzable media files found",
146
- json_mode=args.json,
147
- payload={"success": False, "error": "no_media", "warnings": warnings},
148
- )
149
- return EXIT_FATAL
150
- params = _build_params(args)
151
- if args.analysis_root:
152
- params["analysis_root"] = args.analysis_root
153
- target = {
154
- "type": "paths",
155
- "paths": [r["file_path"] for r in records],
156
- "recursive": args.recursive,
157
- }
158
- plan = build_plan(
159
- project_name=args.project_name,
160
- project_id=None,
161
- records=records,
162
- target=target,
163
- params=params,
164
- capabilities=detect_capabilities(),
165
- )
166
- if not plan.get("success"):
167
- _emit(
168
- f"Plan failed: {plan.get('error')}",
169
- json_mode=args.json,
170
- payload=plan,
171
- )
172
- return EXIT_FATAL
173
- if args.json:
174
- plan_payload = dict(plan)
175
- if warnings:
176
- plan_payload["warnings"] = warnings
177
- _emit("", json_mode=True, payload=plan_payload)
178
- else:
179
- root = (plan.get("output_root") or {}).get("project_root", "?")
180
- _emit(f"Project root : {root}", json_mode=False)
181
- _emit(f"Depth : {plan.get('depth', '?')}", json_mode=False)
182
- _emit(
183
- f"Clips : {plan.get('clip_count', 0)}"
184
- f" ({plan.get('reusable_clip_count', 0)} reusable)",
185
- json_mode=False,
186
- )
187
- _emit(
188
- f"Est. seconds : {plan.get('estimated_seconds_after_reuse', '?')}",
189
- json_mode=False,
190
- )
191
- if plan.get("capability_gaps") and plan_requires_capabilities(plan):
192
- _emit(f"Missing tools: {plan['capability_gaps']}", json_mode=False)
193
- for w in warnings:
194
- _emit(f" warning: {w}", json_mode=False)
195
- return EXIT_OK
196
-
197
-
198
- def _cmd_run(args: argparse.Namespace) -> int:
199
- params = _build_params(args)
200
- create = create_batch_job_from_paths(
201
- project_name=args.project_name,
202
- paths=args.paths,
203
- analysis_root=args.analysis_root,
204
- recursive=args.recursive,
205
- params=params,
206
- name=args.name,
207
- )
208
- if not create.get("success"):
209
- _emit(
210
- f"Job creation failed: {create.get('error') or create.get('status')}",
211
- json_mode=args.json,
212
- payload=create,
213
- )
214
- return EXIT_FATAL
215
- job = create["job"]
216
- job_id = job["job_id"]
217
- project_root = job["project_root"]
218
- total = (job.get("progress") or {}).get("total_clips", 0)
219
- _emit(
220
- f"Created job {job_id} ({total} clips, root: {project_root})",
221
- json_mode=args.json,
222
- payload={
223
- "event": "job_created",
224
- "job_id": job_id,
225
- "project_root": project_root,
226
- "total_clips": total,
227
- },
228
- )
229
- if args.no_follow:
230
- return EXIT_OK
231
- return _drive_to_completion(
232
- project_root,
233
- job_id,
234
- max_clips=args.max_clips,
235
- max_seconds=args.max_seconds,
236
- json_mode=args.json,
237
- )
238
-
239
-
240
- def _emit_status(payload: Dict[str, Any], *, json_mode: bool) -> None:
241
- if json_mode:
242
- _emit("", json_mode=True, payload=payload)
243
- return
244
- if not payload.get("success"):
245
- _emit(f"Error: {payload.get('error')}", json_mode=False)
246
- return
247
- counts = payload.get("progress", {})
248
- _emit(f"Job : {payload.get('job_id')}", json_mode=False)
249
- _emit(
250
- f"Status : {payload.get('status')} ({payload.get('phase')})",
251
- json_mode=False,
252
- )
253
- _emit(
254
- f"Progress : {counts.get('done_clips', 0)}/{counts.get('total_clips', 0)} ({counts.get('percent', 0)}%)",
255
- json_mode=False,
256
- )
257
- _emit(f"Succeeded : {payload.get('succeeded_clips')}", json_mode=False)
258
- _emit(f"Failed : {payload.get('failed_clips')}", json_mode=False)
259
- _emit(f"Skipped : {payload.get('skipped_clips')}", json_mode=False)
260
- if payload.get("last_error"):
261
- _emit(f"Last error : {payload['last_error']}", json_mode=False)
262
-
263
-
264
- def _cmd_status(args: argparse.Namespace) -> int:
265
- payload = batch_job_status(args.project_root, args.job_id)
266
- _emit_status(payload, json_mode=args.json)
267
- return EXIT_OK if payload.get("success") else EXIT_FATAL
268
-
269
-
270
- def _cmd_list(args: argparse.Namespace) -> int:
271
- payload = list_batch_jobs(args.project_root, limit=args.limit)
272
- if args.json:
273
- _emit("", json_mode=True, payload=payload)
274
- return EXIT_OK if payload.get("success") else EXIT_FATAL
275
- if not payload.get("success"):
276
- _emit(f"Error: {payload.get('error')}", json_mode=False)
277
- return EXIT_FATAL
278
- jobs = payload.get("jobs") or []
279
- if not jobs:
280
- _emit("No jobs found", json_mode=False)
281
- return EXIT_OK
282
- _emit(f"{'JOB ID':<28} {'STATUS':<22} {'CLIPS':>10} NAME", json_mode=False)
283
- for job in jobs:
284
- counts = job.get("progress", {})
285
- clip_col = f"{counts.get('done_clips', 0)}/{counts.get('total_clips', 0)}"
286
- _emit(
287
- f"{job['job_id']:<28} {job['status']:<22} {clip_col:>10} {job.get('name', '')}",
288
- json_mode=False,
289
- )
290
- return EXIT_OK
291
-
292
-
293
- def _cmd_resume(args: argparse.Namespace) -> int:
294
- resumed = resume_batch_job(args.project_root, args.job_id)
295
- if not resumed.get("success"):
296
- _emit(
297
- f"Resume failed: {resumed.get('error')}",
298
- json_mode=args.json,
299
- payload=resumed,
300
- )
301
- return EXIT_FATAL
302
- _emit(
303
- f"Resumed {args.job_id}",
304
- json_mode=args.json,
305
- payload={"event": "resumed", "job_id": args.job_id},
306
- )
307
- return _drive_to_completion(
308
- args.project_root,
309
- args.job_id,
310
- max_clips=args.max_clips,
311
- max_seconds=args.max_seconds,
312
- json_mode=args.json,
313
- )
314
-
315
-
316
- def _cmd_cancel(args: argparse.Namespace) -> int:
317
- payload = cancel_batch_job(args.project_root, args.job_id)
318
- _emit_status(payload, json_mode=args.json)
319
- return EXIT_OK if payload.get("success") else EXIT_FATAL
320
-
321
-
322
- def _run_spec_action(action: str, params: Dict[str, Any]):
323
- """Connect to Resolve (auto-launch) and run a project_manager spec action.
324
-
325
- Imported lazily so the analysis commands stay free of the MCP/Resolve import.
326
- """
327
- from src.server import get_resolve, _spec_action # lazy: pulls mcp + resolve
328
-
329
- r = get_resolve()
330
- if r is None:
331
- return None
332
- return _spec_action(r, r.GetProjectManager(), action, params)
333
-
334
-
335
- def _emit_spec_result(result, *, json_mode: bool) -> int:
336
- if result is None:
337
- _emit("Could not connect to DaVinci Resolve.",
338
- json_mode=json_mode,
339
- payload={"success": False, "error": "not_connected"})
340
- return EXIT_FATAL
341
- if json_mode:
342
- _emit("", json_mode=True, payload=result)
343
- err = result.get("error")
344
- if err:
345
- _emit(f"Spec error: {err.get('message')}", json_mode=False)
346
- return EXIT_FATAL
347
- if "actions" in result: # plan / diff
348
- changed = result.get("change_count", 0)
349
- _emit(f"Project : {result.get('project')}", json_mode=False)
350
- _emit(f"Changes : {changed}", json_mode=False)
351
- for a in result.get("actions", []):
352
- if a.get("op") != "noop":
353
- _emit(f" [{a['op']:>6}] {a['target']} {a.get('detail', '')}", json_mode=False)
354
- return EXIT_OK
355
- # apply
356
- failures = result.get("failures") or []
357
- _emit(f"Applied : {result.get('applied_count', 0)}", json_mode=False)
358
- if failures:
359
- for f in failures:
360
- _emit(f" [failed] {f.get('target')}", json_mode=False)
361
- return EXIT_PARTIAL
362
- _emit("Done: spec applied", json_mode=False)
363
- return EXIT_OK
364
-
365
-
366
- def _cmd_plan_spec(args: argparse.Namespace) -> int:
367
- result = _run_spec_action("diff_to_spec", {"spec_path": args.spec})
368
- return _emit_spec_result(result, json_mode=args.json)
369
-
370
-
371
- def _cmd_apply(args: argparse.Namespace) -> int:
372
- result = _run_spec_action("apply_spec", {
373
- "spec_path": args.spec,
374
- "dry_run": args.dry_run,
375
- "run_hooks": args.run_hooks,
376
- "continue_on_error": args.continue_on_error,
377
- })
378
- return _emit_spec_result(result, json_mode=args.json)
379
-
380
-
381
- def _add_run_args(parser: argparse.ArgumentParser) -> None:
382
- parser.add_argument("paths", nargs="+", help="Files or directories to analyze")
383
- parser.add_argument(
384
- "--no-recursive",
385
- dest="recursive",
386
- action="store_false",
387
- default=True,
388
- help="Do not descend into subdirectories (default: recurse)",
389
- )
390
- parser.add_argument(
391
- "--analysis-root",
392
- help="Override analysis output root (default ~/Documents/DaVinci Resolve MCP/analysis)",
393
- )
394
- parser.add_argument(
395
- "--project-name",
396
- default=f"CLI batch {time.strftime('%Y-%m-%d')}",
397
- help="Project name written into the analysis root layout",
398
- )
399
- parser.add_argument(
400
- "--depth",
401
- choices=["quick", "standard", "deep", "custom"],
402
- help="Analysis depth (default: standard)",
403
- )
404
- parser.add_argument(
405
- "--source-trust",
406
- choices=["auto", "filename", "low", "medium", "high"],
407
- help="Trust tier hint for the vision pass",
408
- )
409
- parser.add_argument(
410
- "--summary-style",
411
- choices=["full", "concise", "creative", "technical"],
412
- help="Narrative tone for clip_summary / shot descriptions",
413
- )
414
- parser.add_argument("--name", help="Job display name")
415
-
416
-
417
- def _build_parser() -> argparse.ArgumentParser:
418
- common = argparse.ArgumentParser(add_help=False)
419
- # SUPPRESS keeps the subparser from overwriting a --json passed before the
420
- # subcommand (its default would otherwise win over the top-level parser).
421
- # Post-processed in main() so handlers always see a real bool.
422
- common.add_argument(
423
- "--json",
424
- action="store_true",
425
- default=argparse.SUPPRESS,
426
- help="Emit one JSON object per progress event instead of human-readable lines",
427
- )
428
-
429
- parser = argparse.ArgumentParser(
430
- prog="davinci-resolve-mcp batch",
431
- description=(
432
- "Headless runner for source-safe media analysis. Wraps the same engine "
433
- "the MCP server uses; durable state lives in <project-root>/jobs.sqlite."
434
- ),
435
- parents=[common],
436
- )
437
- sub = parser.add_subparsers(dest="cmd", required=True)
438
-
439
- p_plan = sub.add_parser(
440
- "plan",
441
- help="Dry-run: print what would be analyzed without creating a job",
442
- parents=[common],
443
- )
444
- _add_run_args(p_plan)
445
-
446
- p_run = sub.add_parser(
447
- "run",
448
- help="Create a batch job and drive it to completion",
449
- parents=[common],
450
- )
451
- _add_run_args(p_run)
452
- p_run.add_argument(
453
- "--max-clips",
454
- type=int,
455
- default=1,
456
- help="Clips processed per slice (default 1, max 25)",
457
- )
458
- p_run.add_argument(
459
- "--max-seconds",
460
- type=float,
461
- default=None,
462
- help="Optional wall-clock budget per slice (seconds)",
463
- )
464
- p_run.add_argument(
465
- "--no-follow",
466
- action="store_true",
467
- help="Create the job and exit immediately instead of looping until done",
468
- )
469
-
470
- p_status = sub.add_parser("status", help="Inspect a job", parents=[common])
471
- p_status.add_argument("job_id")
472
- p_status.add_argument("--project-root", required=True)
473
-
474
- p_list = sub.add_parser(
475
- "list", help="List jobs under a project root", parents=[common]
476
- )
477
- p_list.add_argument("--project-root", required=True)
478
- p_list.add_argument("--limit", type=int, default=50)
479
-
480
- p_resume = sub.add_parser(
481
- "resume", help="Resume a queued / canceled job", parents=[common]
482
- )
483
- p_resume.add_argument("job_id")
484
- p_resume.add_argument("--project-root", required=True)
485
- p_resume.add_argument("--max-clips", type=int, default=1)
486
- p_resume.add_argument("--max-seconds", type=float, default=None)
487
-
488
- p_cancel = sub.add_parser(
489
- "cancel", help="Cancel a running job", parents=[common]
490
- )
491
- p_cancel.add_argument("job_id")
492
- p_cancel.add_argument("--project-root", required=True)
493
-
494
- p_plan_spec = sub.add_parser(
495
- "plan-spec",
496
- help="Preview drift between a declarative project spec and live Resolve",
497
- parents=[common],
498
- )
499
- p_plan_spec.add_argument("spec", help="Path to project.dvr.yaml (or .json)")
500
-
501
- p_apply = sub.add_parser(
502
- "apply",
503
- help="Reconcile the Resolve project toward a declarative spec (idempotent)",
504
- parents=[common],
505
- )
506
- p_apply.add_argument("spec", help="Path to project.dvr.yaml (or .json)")
507
- p_apply.add_argument("--dry-run", action="store_true",
508
- help="Compute the plan without mutating")
509
- p_apply.add_argument("--run-hooks", action="store_true",
510
- help="Execute the spec's before/after shell hooks (opt-in)")
511
- p_apply.add_argument("--continue-on-error", action="store_true",
512
- help="Accumulate failures instead of aborting on the first")
513
-
514
- return parser
515
-
516
-
517
- _HANDLERS = {
518
- "plan": _cmd_plan,
519
- "run": _cmd_run,
520
- "status": _cmd_status,
521
- "list": _cmd_list,
522
- "resume": _cmd_resume,
523
- "cancel": _cmd_cancel,
524
- "plan-spec": _cmd_plan_spec,
525
- "apply": _cmd_apply,
526
- }
527
-
528
-
529
- def main(argv: Optional[List[str]] = None) -> int:
530
- from src.utils import actor_identity
531
- actor_identity.set_instance("batch-cli")
532
- parser = _build_parser()
533
- args = parser.parse_args(argv)
534
- if not hasattr(args, "json"):
535
- args.json = False
536
- return _HANDLERS[args.cmd](args)
537
-
538
-
539
- if __name__ == "__main__":
540
- sys.exit(main())
@@ -1,13 +0,0 @@
1
- """Friendly launcher for the local Resolve MCP control panel."""
2
-
3
- from __future__ import annotations
4
-
5
- import sys
6
-
7
- from src.analysis_dashboard import main
8
-
9
-
10
- if __name__ == "__main__":
11
- if "--open" not in sys.argv and "--no-open" not in sys.argv:
12
- sys.argv.append("--open")
13
- main()
@@ -1,17 +0,0 @@
1
- """Granular DaVinci Resolve MCP server package."""
2
-
3
- from src.granular.common import VERSION, mcp
4
- from src.granular import (
5
- folder,
6
- gallery,
7
- graph,
8
- media_pool,
9
- media_pool_item,
10
- media_storage,
11
- project,
12
- resolve_control,
13
- timeline,
14
- timeline_item,
15
- )
16
-
17
- __all__ = ["VERSION", "mcp"]