@hybridlabor-api/aos 4.4.1 → 4.4.2-beta.1

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