@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridlabor-api/aos",
3
- "version": "4.4.0",
3
+ "version": "4.4.2-beta.0",
4
4
  "description": "AOS — A Curated AI AGENT OS. Optimized agent skills and add-ons like memB, OpenWiki, Heimdall Token Saver, and Godmode architectures.",
5
5
  "main": "installer.js",
6
6
  "bin": {
@@ -8,8 +8,10 @@
8
8
  "bdb-dev-optimized-agent-skills": "installer.js",
9
9
  "bdb-agent-skills-pro": "installer.js",
10
10
  "bdb-agent-skills": "installer.js",
11
- "setup-saas": "bin/setup-saas.mjs",
12
- "aos-plan-canvas": "skills/global_config/plan-canvas/scripts/plan-canvas.js"
11
+ "aos-plan-canvas": "skills/global_config/plan-canvas/scripts/plan-canvas.js",
12
+ "aos-dashboard": "bin/aos-dashboard.mjs",
13
+ "aos-config": "bin/aos-config.mjs",
14
+ "aos-uninstall": "bin/aos-uninstall.mjs"
13
15
  },
14
16
  "scripts": {
15
17
  "validate": "node scripts/validate-skills.mjs",
@@ -59,7 +61,14 @@
59
61
  "mcps/touchdesigner-mcp/tests/**",
60
62
  "!mcps/tdmcp/training/**/data/**",
61
63
  "!assets/**/*.mp4",
62
- "!assets/**/*.mov"
64
+ "!assets/**/*.mov",
65
+ "!mcps/**/queue.db*",
66
+ "!**/__pycache__/**",
67
+ "!**/*.pyc",
68
+ "!mcps/vectorworks-mcp/**",
69
+ "!mcps/davinci-resolve-mcp/**",
70
+ "!mcps/davinci-mcp-professional/**",
71
+ "!mcps/blender-mcp-server/**"
63
72
  ],
64
73
  "keywords": [
65
74
  "codex-plugin",
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: aos-project-init
3
3
  description: >-
4
- Wire one project folder into AOS — git and private remote, AGENTS.md with its
5
- harness symlinks, the dispatcher harness, an OpenWiki wiki, memB project
6
- memory, and a Synapse map. Use when starting a new project, or when an
7
- existing repo has drifted and its agents behave like they know nothing about it.
4
+ Interview a project folder into AOS and write the result: a stable slug and
5
+ domain in .aos/project.json, an OpenWiki wiki that is actually watched and
6
+ does not index junk, memB memory bound to the slug, a Synapse map, AGENTS.md
7
+ with its harness symlinks, and optionally CI and issue triage.
8
8
  category: bdb-core
9
9
  risk: low
10
10
  source: bdb
@@ -13,182 +13,149 @@ date_added: "2026-09-13"
13
13
 
14
14
  # AOS Project Init — Per Workspace
15
15
 
16
- A machine-level AOS install gives an agent the skills. It gives it nothing
17
- about *this* project: no repo rules, no memory bound to it, no wiki, no
18
- dispatcher contract. That per-project layer is what this skill installs.
16
+ `/aos-setup` prepares the machine. This prepares one folder in it — and unlike
17
+ the machine skill, **this one writes**. It asks what it cannot know, shows what
18
+ it intends to write, and writes it once you agree.
19
19
 
20
- Machine-level setup is `/aos-setup` and comes first — this skill assumes memB,
21
- OpenWiki and Synapse already exist on the machine.
22
-
23
- **This is prompt-driven, not a script that runs blind.** Explore, report,
24
- confirm, then write.
20
+ Everything it decides lands in `.aos/project.json`, so a second run knows what
21
+ was already settled and changes only what you ask it to.
25
22
 
26
23
  ---
27
24
 
28
- ## 1. Measure
25
+ ## 1. Preconditions
29
26
 
30
27
  ```bash
31
- node ~/.claude/skills/aos-project-init/scripts/aos-project-doctor.mjs [dir]
28
+ aos-config show # is this machine's vocabulary present?
32
29
  ```
33
30
 
34
- `[dir]` defaults to the current directory. `--json` for machine-readable
35
- output. Up to 16 checks across five areas — a folder that is not a git repo
36
- yet reports that one row and skips the rest of the `git` block, and the
37
- visibility row appears only for a GitHub remote:
38
-
39
- | Area | What is verified |
40
- |---|---|
41
- | `git` | repo, `origin`, **private** visibility, `.gitignore` covers `.env` |
42
- | `docs` | `AGENTS.md`, and `CLAUDE.md` / `GEMINI.md` / `CODEX.md` as symlinks to it |
43
- | `harness` | `.agents/graph.md`, `.agents/nodes.json`, `.claude/{workflows,hooks,agents,settings.json}` |
44
- | `openwiki` | `.openwiki/` holds pages |
45
- | `memB` | memories bound to `project_id = <folder name>` |
31
+ If it reports *unvollständig*, stop and run `/aos-setup` first. The domain list
32
+ is per-machine and nothing ships with one — guessing here would invent a
33
+ vocabulary the user never chose.
46
34
 
47
- Report the failing rows before touching anything. On an existing repo, some
48
- failures are deliberate — a public repo that is meant to be public, a scratch
49
- folder with no remote. Ask rather than "fixing" those.
50
-
51
- ---
52
-
53
- ## 2. Git and the remote
35
+ Then measure this folder:
54
36
 
55
37
  ```bash
56
- git init && git add -A && git commit -m "chore: initial commit"
57
- gh repo create <name> --private --source=. --remote=origin
38
+ node ~/.claude/skills/aos-project-init/scripts/aos-project-doctor.mjs
58
39
  ```
59
40
 
60
- Repositories are **private by default**. Verify rather than assume — the
61
- doctor reads actual visibility through `gh`, not intent. Live secrets never
62
- enter the repo: keep `.env` files outside it and commit a placeholder.
41
+ Report the failing rows before touching anything. On an existing repo some
42
+ failures are deliberate: a repo public on purpose, a scratch folder with no
43
+ remote, a project nobody wants the wiki daemon to visit. Ask rather than
44
+ "fixing" those.
63
45
 
64
46
  ---
65
47
 
66
- ## 3. AGENTS.md and its symlinks
48
+ ## 2. The interview
67
49
 
68
- One file holds the repo's agent rules; every harness reads the same bytes:
50
+ One question at a time, each with a proposal the user can accept in a word.
51
+ Skip anything already settled in `.aos/project.json` unless asked to change it.
69
52
 
70
- ```bash
71
- cp ~/.claude/skills/aos-project-init/assets/AGENTS.template.md AGENTS.md
72
- ln -sf AGENTS.md CLAUDE.md
73
- ln -sf AGENTS.md GEMINI.md
74
- ln -sf AGENTS.md CODEX.md
75
- ```
53
+ **Name and slug.** Propose the folder name for both. The slug becomes the memB
54
+ `project_id`, and it is written down precisely so it survives a rename: a
55
+ binding derived from the basename orphans every memory the day the folder
56
+ moves, and two folders sharing a basename share one memory scope.
76
57
 
77
- Then fill the template in — see [AGENTS.template.md](./assets/AGENTS.template.md).
78
- Do not leave the placeholders: an `AGENTS.md` full of `<PROJECT NAME>` is worse
79
- than none, because agents will trust it. Interview the user for the stack, the
80
- commands, and above all the **domain notes** — the constraints that are not
81
- derivable from the code.
58
+ **Domain.** Offer the list from `aos-config`, preselected by what the path
59
+ implies — the first segment under the workspace root. If the project sits
60
+ outside that root, ask instead of guessing.
82
61
 
83
- If a real `CLAUDE.md` already exists with content of its own, merge it into
84
- `AGENTS.md` first and only then replace it with the symlink. Never silently
85
- overwrite it.
62
+ **Wiki.** Three separate questions, because they are three separate things:
63
+ initialise a wiki here at all · **watch it**, so the daemon refreshes it every
64
+ 2h · write `.openwikiignore`.
86
65
 
87
- ---
66
+ Watching is not free. Every watched project with changes costs an LLM call per
67
+ cycle, and a free-tier key hits quota on a handful. Recommend watching repos
68
+ under active work and leaving archives out.
88
69
 
89
- ## 4. The dispatcher harness
70
+ **memB.** Bind the slug; offer a one-time ingest of the folder. Ingest reads a
71
+ lot — offer it, never assume it.
90
72
 
91
- Only for projects that will actually run `/startcycle-graph` — it is not
92
- required for a small repo.
73
+ **Synapse.** A spatial map earns its keep on a codebase too large to hold in
74
+ your head. Ask; do not default it on.
93
75
 
94
- ```bash
95
- npx -y @hybridlabor-api/aos --project-harness
96
- ```
76
+ **AGENTS.md.** If missing, offer the template. If a real `CLAUDE.md` already
77
+ holds content, merge it into `AGENTS.md` first and only then replace it with a
78
+ symlink. Never silently overwrite it.
97
79
 
98
- Copies into the project, writing nothing to `$HOME`:
80
+ **With a GitHub remote, two more.** Skip both entirely without a remote — a
81
+ local-only repo has nowhere to put them, and a skipped question is clearer than
82
+ one answered "no".
99
83
 
100
- - `.agents/` — the graph contract, node registry, state schema
101
- - `.claude/workflows/` — the dispatcher
102
- - `.claude/hooks/` — `go-gate.mjs`, `graph-gate.mjs` and `memb-inject.mjs`
103
- (the memory hook stays `$HOME`-anchored; only the gates become project-local)
104
- - `.claude/agents/` — the agent definitions the dispatcher's prompts reference
105
- - `.claude/settings.json` — wired to the project-local hooks
84
+ - **CI:** none · a gate (lint, typecheck, test — matched to the project type) ·
85
+ gate plus `release-please`.
86
+ - **Triage:** none · GitHub labels (`needs-triage`, `needs-info`,
87
+ `ready-for-agent`, `ready-for-human`, `wontfix`) · local markdown in
88
+ `.scratch/`.
106
89
 
107
- Take all of it or none: a bare `.agents/` copy leaves the graph contract
108
- half-installed, and the dispatcher's pointers resolve to nothing.
90
+ `release-please` computes the version from Conventional Commits and nothing
91
+ else: an unprefixed subject is invisible to it, and one `feat:` forces a minor
92
+ bump however small the change. Offering it imposes that rule on the project, so
93
+ write the rule into `AGENTS.md` in the same breath — and ask what the version
94
+ policy is. Some repos here move in patch steps only, where `feat:` needs
95
+ explicit permission.
109
96
 
110
97
  ---
111
98
 
112
- ## 5. memB — bind memory to this project
113
-
114
- memB scopes memories by `project_id`, and `project_id` is **the folder's
115
- basename**. Two consequences worth stating out loud:
116
-
117
- - Renaming the folder orphans every memory bound to the old name.
118
- - Two folders with the same basename share one memory scope.
119
-
120
- Seed the project by ingesting it:
121
-
122
- ```bash
123
- MCP=~/.gemini/config/mcps/memb-mcp # Gemini / Antigravity install
124
- "$MCP/.venv/bin/python" "$MCP/memb_ingest.py" <project dir>
99
+ ## 3. Write
100
+
101
+ Show every intended write as one list, then write on agreement.
102
+
103
+ ```json
104
+ {
105
+ "name": "<Project Name>",
106
+ "slug": "<stable-slug>",
107
+ "domain": "<from aos-config>",
108
+ "openwiki": { "enabled": true, "watch": true },
109
+ "memb": { "projectId": "<stable-slug>" },
110
+ "synapse": false,
111
+ "ci": "gate",
112
+ "triage": "github"
113
+ }
125
114
  ```
126
115
 
127
- The MCP payload does not always land there — the installer picks the directory
128
- per harness, so on a Claude-only machine it sits under
129
- `~/Library/Application Support/Claude/mcps/` (`%APPDATA%\Claude\mcps\` on
130
- Windows), and under `.cursor` / `.codex` / `.windsurf` for those. Take the path
131
- `/aos-setup`'s doctor prints in its `memb-mcp server` row rather than assuming
132
- this one.
133
-
134
- Add `--transcripts` only when past conversation logs should be pulled in too —
135
- that is off by default for a reason.
136
-
137
- Afterwards, write the decisions that matter through the memB MCP with an
138
- explicit `project_id`: `add_memory({ text: "…", category: "project_node",
139
- project_id: "<folder name>" })`. Never write credentials or high-entropy
140
- strings into memory.
141
-
142
- Re-run the doctor to confirm the count went above zero. An ingest script that
143
- exits `0` is not evidence that anything was stored.
144
-
145
- ---
146
-
147
- ## 6. OpenWiki — the project wiki
116
+ Then, only for what the interview enabled:
148
117
 
149
118
  ```bash
150
- openwiki --init # first time, inside the project
151
- openwiki --update # after significant changes
119
+ cp ~/.claude/skills/aos-project-init/assets/openwikiignore.template .openwikiignore
120
+ openwiki --init # needs `openwiki auth <provider>` from /aos-setup
152
121
  ```
153
122
 
154
- Pages land in `.openwiki/`. The machine-level daemon refreshes wikis every two
155
- hours once the repo has one; without `--init` this repo is simply skipped.
156
-
157
- Requires provider credentials from `/aos-setup` (`openwiki auth <provider>`).
158
-
159
- ---
123
+ When the user chose to watch it, add the absolute path to `projects` in
124
+ `~/.openwiki/projects.json` — that file is the daemon's watch list. Merge into
125
+ it; never rewrite it.
160
126
 
161
- ## 7. Synapse — spatial map
127
+ For memB, write decisions through the MCP with the slug as `project_id` and the
128
+ domain as `category`:
162
129
 
163
- ```bash
164
- synapse map .
130
+ ```
131
+ add_memory({ text: "…", category: "<domain>", project_id: "<slug>" })
165
132
  ```
166
133
 
167
- Optional, and useful mainly on a codebase large enough that structure is hard
168
- to hold in your head. Needs the daemon on `:7781` (`/aos-setup` covers it).
134
+ Never write credentials or high-entropy strings into memory.
169
135
 
170
136
  ---
171
137
 
172
- ## 8. Confirm
138
+ ## 4. Confirm
173
139
 
174
140
  ```bash
175
141
  node ~/.claude/skills/aos-project-init/scripts/aos-project-doctor.mjs
176
- # 16/16 checks pass. Project is fully wired.
177
142
  ```
178
143
 
179
- Report the doctor's own count, and name explicitly anything left failing on
180
- purpose. Then commit the new files — `chore:` for the harness wiring, `docs:`
181
- for `AGENTS.md`.
144
+ Report the doctor's own count, and name anything left failing on purpose. Then
145
+ commit: `chore:` for wiring, `docs:` for `AGENTS.md`. Check the project's
146
+ version policy before reaching for `feat:`.
182
147
 
183
148
  ---
184
149
 
185
150
  ## Red flags
186
151
 
187
- - Committing an `AGENTS.md` still holding template placeholders.
188
- - Replacing an existing `CLAUDE.md` with a symlink without merging its content.
189
- - Reporting the memB ingest as done from the script's exit code instead of the
190
- memory count.
191
- - Installing the dispatcher harness into a repo that will never run the graph —
192
- five directories of machinery nobody uses.
193
- - Renaming a project folder later without moving its memories to the new
194
- `project_id`.
152
+ - Inventing a domain because `aos-config` has none. Send the user to
153
+ `/aos-setup` instead.
154
+ - Deriving the memB binding from the folder name once a slug exists.
155
+ - Treating "has a wiki" as "is watched". They are different, and that gap is
156
+ why wikis sit stale for months.
157
+ - Turning watching on for every repo. Quota is real.
158
+ - Committing an `AGENTS.md` still full of template placeholders.
159
+ - Asking about CI or GitHub triage in a repo with no remote.
160
+ - Offering `release-please` without writing the Conventional Commits rule into
161
+ `AGENTS.md` — it is a trap otherwise.
@@ -0,0 +1,62 @@
1
+ # .openwikiignore — what the wiki agent must not read or write.
2
+ #
3
+ # OpenWiki ships with NO defaults: with no such file it loads zero rules and
4
+ # indexes everything, including dependency trees and its own output. Measured
5
+ # on one small repo: 33 of 145 graph nodes were junk — .venv internals and
6
+ # .openwiki's own pages fed back into itself.
7
+ #
8
+ # gitignore syntax: `!` re-includes, a leading `/` anchors to the repo root,
9
+ # a trailing `/` matches directories, and matching is case-insensitive.
10
+
11
+ # Its own output — otherwise the wiki documents itself, recursively.
12
+ .openwiki/
13
+
14
+ # Dependencies. Someone else's code is not this project's documentation.
15
+ node_modules/
16
+ .venv/
17
+ venv/
18
+ vendor/
19
+ Pods/
20
+ .bundle/
21
+
22
+ # Build output and caches — generated, never a source of truth.
23
+ dist/
24
+ build/
25
+ out/
26
+ target/
27
+ coverage/
28
+ .next/
29
+ .turbo/
30
+ .cache/
31
+ __pycache__/
32
+ *.pyc
33
+
34
+ # Lockfiles: thousands of lines, no meaning for a reader.
35
+ *.lock
36
+ package-lock.json
37
+ pnpm-lock.yaml
38
+ uv.lock
39
+
40
+ # Secrets. Nothing here may reach a model or a generated page.
41
+ .env
42
+ .env.*
43
+ *.pem
44
+ *.key
45
+ id_rsa*
46
+ secrets/
47
+
48
+ # Version control internals.
49
+ .git/
50
+
51
+ # Binaries and media: no text to summarise, and expensive to read.
52
+ *.png
53
+ *.jpg
54
+ *.jpeg
55
+ *.gif
56
+ *.webp
57
+ *.svg
58
+ *.pdf
59
+ *.zip
60
+ *.tgz
61
+ *.mp4
62
+ *.mov
@@ -11,9 +11,18 @@ import path from 'node:path';
11
11
  const args = process.argv.slice(2).filter((a) => a !== '--json');
12
12
  const JSON_OUT = process.argv.includes('--json');
13
13
  const ROOT = path.resolve(args[0] || process.cwd());
14
- const PROJECT = path.basename(ROOT);
15
14
  const HOME = os.homedir();
16
15
 
16
+ // .aos/project.json is what /aos-project-init writes. Its slug is the stable
17
+ // memB project_id: deriving it from the folder name means a rename orphans
18
+ // every memory bound to the old one, and two folders with the same basename
19
+ // share a memory scope.
20
+ const aosConfig = (() => {
21
+ try { return JSON.parse(readFileSync(path.join(ROOT, '.aos', 'project.json'), 'utf8')); }
22
+ catch { return null; }
23
+ })();
24
+ const PROJECT = aosConfig?.slug || path.basename(ROOT);
25
+
17
26
  const results = [];
18
27
  const add = (area, name, ok, detail, fix) => results.push({ area, name, ok, detail, fix });
19
28
  const p = (...rel) => path.join(ROOT, ...rel);
@@ -44,6 +53,19 @@ function checkGit() {
44
53
  'Add `.env` and `*.env` to .gitignore; keep live secrets outside the repo.');
45
54
  }
46
55
 
56
+ // ---------------------------------------------------------------- aos config
57
+ function checkAosConfig() {
58
+ add('aos', '.aos/project.json', !!aosConfig,
59
+ aosConfig
60
+ ? `slug "${aosConfig.slug}"${aosConfig.domain ? ` · domain ${aosConfig.domain}` : ''}${aosConfig.watch ? ' · überwacht' : ''}`
61
+ : 'missing — memB binding falls back to the folder name, which breaks on rename',
62
+ 'Run /aos-project-init in this folder.');
63
+
64
+ if (aosConfig && aosConfig.slug !== path.basename(ROOT)) {
65
+ add('aos', 'slug vs folder', true, `slug "${aosConfig.slug}" ≠ folder "${path.basename(ROOT)}" — intentional, the slug wins`, '');
66
+ }
67
+ }
68
+
47
69
  // ---------------------------------------------------------------- agent docs
48
70
  function checkAgentDocs() {
49
71
  const agents = p('AGENTS.md');
@@ -84,6 +106,20 @@ function checkWiki() {
84
106
  const pages = existsSync(dir) ? readdirSync(dir).filter((f) => f.endsWith('.md')) : [];
85
107
  add('openwiki', 'wiki initialised', pages.length > 0, pages.length ? `${pages.length} pages: ${pages.slice(0, 4).join(', ')}${pages.length > 4 ? ' …' : ''}` : 'no .openwiki pages',
86
108
  'openwiki --init (run inside the project; needs `openwiki auth <provider>` first)');
109
+
110
+ // Without this file OpenWiki loads zero rules and indexes .venv, node_modules
111
+ // and its own output — measured at 23% junk on one small repo.
112
+ add('openwiki', '.openwikiignore', existsSync(p('.openwikiignore')),
113
+ existsSync(p('.openwikiignore')) ? 'exclusions in place' : 'missing — the wiki will index dependencies and its own pages',
114
+ 'cp ~/.claude/skills/aos-project-init/assets/openwikiignore.template .openwikiignore');
115
+
116
+ // A wiki that exists is not a wiki that is refreshed.
117
+ let watched = false;
118
+ try { watched = (JSON.parse(readFileSync(path.join(HOME, '.openwiki', 'projects.json'), 'utf8')).projects || []).includes(ROOT); }
119
+ catch { /* the daemon has not written it yet */ }
120
+ add('openwiki', 'watched by the daemon', watched || pages.length === 0,
121
+ watched ? 'in projects.json' : pages.length ? 'has a wiki but the daemon never refreshes it' : 'no wiki, nothing to watch',
122
+ 'Add this path to ~/.openwiki/projects.json, or let /aos-project-init do it.');
87
123
  }
88
124
 
89
125
  // ---------------------------------------------------------------- memB
@@ -129,6 +165,7 @@ function report() {
129
165
  }
130
166
 
131
167
  checkGit();
168
+ checkAosConfig();
132
169
  checkAgentDocs();
133
170
  checkHarness();
134
171
  checkWiki();
@@ -21,8 +21,30 @@ documentation and visualization layers silently do nothing.
21
21
 
22
22
  This skill closes that gap: **measure first, then fix only what is broken.**
23
23
 
24
- For per-project wiring — a new project folder, its `AGENTS.md`, its memB
25
- project binding, its wiki — use `/aos-project-init` after this one.
24
+ This is also where a **new agent harness** gets wired: adding Codex or
25
+ Antigravity to a machine that already runs Claude Code is this skill's job, not
26
+ a reinstall.
27
+
28
+ For per-project wiring — a folder's slug, its wiki, its memB binding — use
29
+ `/aos-project-init` after this one.
30
+
31
+ ### What each harness can actually do
32
+
33
+ Portability is not uniform, and pretending otherwise is how people end up
34
+ believing memory works everywhere:
35
+
36
+ | | Skills | MCP | Hooks |
37
+ |---|---|---|---|
38
+ | Claude Code | `~/.claude/skills` | `~/.claude.json` | **yes** |
39
+ | Antigravity | `~/.gemini/config/skills` | `mcp_config.json` | no |
40
+ | Codex | `~/.codex/skills` | `config.toml` | no |
41
+ | OpenCode | — | `opencode.jsonc` | no |
42
+ | Cursor / Roo | `bdb-skills` | `mcp.json` | no |
43
+
44
+ Only Claude Code has hooks, so only there can memB inject per prompt. Elsewhere
45
+ the same context arrives through the rule files that harness loads at start —
46
+ see section 5 — which means it is as fresh as the last write, not as fresh as
47
+ the prompt. Say so plainly rather than letting someone assume parity.
26
48
 
27
49
  ---
28
50
 
@@ -59,7 +81,35 @@ one covers a block the doctor can flag.
59
81
 
60
82
  ---
61
83
 
62
- ## 2. Install or update AOS itself
84
+ ## 2. Machine configuration
85
+
86
+ Two things are machine-specific and ship with **no** value, because AOS is a
87
+ public package: one person's `web, media, infra` means nothing on someone
88
+ else's disk.
89
+
90
+ ```bash
91
+ aos-config propose # read this machine's layout, suggest nothing more
92
+ aos-config show # what is configured now
93
+ ```
94
+
95
+ `propose` looks for a workspace root (`~/dev`, `~/Projects`, `~/src`, `~/code`)
96
+ and offers its immediate subdirectories as the domain vocabulary. **Present the
97
+ proposal, do not apply it** — the user decides which of those are real domains
98
+ and which are just folders. Then ask for the memB `user_id`, which must never
99
+ be invented either.
100
+
101
+ ```bash
102
+ aos-config set workspaceRoot ~/dev
103
+ aos-config set domains bdb-core,web,media,agents,infra
104
+ aos-config set userId <the user's memB id>
105
+ ```
106
+
107
+ The result lands in `~/.agents/aos-config.json`. `/aos-project-init` reads it
108
+ to offer a domain per project and refuses to guess when it is missing.
109
+
110
+ ---
111
+
112
+ ## 3. Install or update AOS itself
63
113
 
64
114
  ```bash
65
115
  npx -y @hybridlabor-api/aos@latest
@@ -88,7 +138,7 @@ a harness directory.
88
138
 
89
139
  ---
90
140
 
91
- ## 3. memB — memory that actually retains
141
+ ## 4. memB — memory that actually retains
92
142
 
93
143
  memB is three separate pieces, and a machine can have any subset:
94
144
 
@@ -115,7 +165,7 @@ machine — `/aos-project-init` seeds it per project.
115
165
 
116
166
  ---
117
167
 
118
- ## 4. The ambient memory hook
168
+ ## 5. The ambient memory hook
119
169
 
120
170
  The hook is what makes memB *ambient* rather than something an agent has to
121
171
  remember to query. On every prompt it reads the SQLite store directly and
@@ -123,9 +173,11 @@ injects the relevant memories as context. It fails open: any error exits `0`
123
173
  and the prompt proceeds untouched.
124
174
 
125
175
  Since v4.4.0 the installer ships `memb-inject.mjs` into `~/.claude/hooks/` and
126
- wires it as a `UserPromptSubmit` hook, so on a current install both doctor rows
127
- pass on their own. A machine where they fail is running an older AOS — the fix
128
- is the installer, not a manual copy:
176
+ wires it as a `UserPromptSubmit` hook. **v4.4.0's Quick Update did not** — it
177
+ refreshes skills and submodules, and hooks are harness plumbing rather than
178
+ skills, so a machine that already had AOS updated to 4.4.0 without ever
179
+ receiving the hook. Fixed in v4.4.1; a machine that took that update needs one
180
+ more run:
129
181
 
130
182
  ```bash
131
183
  npx -y @hybridlabor-api/aos@latest
@@ -135,11 +187,30 @@ The wiring is merged into `~/.claude/settings.json`, never written over it:
135
187
  user keys and foreign hook entries survive, and a re-run replaces the BDB entry
136
188
  rather than adding a second copy.
137
189
 
190
+ The hook carries an `aos-hook-version:` line on its second line, and the doctor
191
+ compares it against what the installed release expects. That is why the row can
192
+ read *stale* rather than simply passing: a hook file that exists and is wired
193
+ can still be an old copy carrying a bug this version fixed. When you change the
194
+ hook in a way machines must pick up, bump that line and the expected value in
195
+ `aos-doctor.mjs` in the same commit — the test suite fails if the two disagree.
196
+
138
197
  Unlike the two gate hooks, this one stays `$HOME`-anchored even in a project
139
198
  harness — the memB store is machine-global, and pointing it at
140
199
  `$CLAUDE_PROJECT_DIR` would make it fail on every prompt in any project the
141
200
  harness was never installed into.
142
201
 
202
+ **On a harness without hooks** — everything except Claude Code — the same
203
+ context is written into the rule files that harness loads instead:
204
+
205
+ ```bash
206
+ python3 ~/.agents/memB/memb_auto_inject.py --global # GEMINI.md, CODEX.md, …
207
+ python3 ~/.agents/memB/memb_auto_inject.py --dir <repo> # a project's AGENTS.md
208
+ ```
209
+
210
+ It merges into a delimited block and leaves everything outside it alone. The
211
+ block carries the time it was written, because this path is only ever as fresh
212
+ as its last run.
213
+
143
214
  Standing facts that should reach every prompt — persona, brand rules, house
144
215
  style — go one per line into `~/.MemBDB/ambient-persona.txt`. Lines starting
145
216
  with `#` are ignored. This file is deliberately *not* shipped: ask the user
@@ -150,7 +221,7 @@ Verify by starting a session and checking that the first prompt carries a
150
221
 
151
222
  ---
152
223
 
153
- ## 5. OpenWiki
224
+ ## 6. OpenWiki
154
225
 
155
226
  ```bash
156
227
  npm install -g openwiki@latest # CLI, needs Node >= 22
@@ -175,7 +246,7 @@ Wikis themselves are per-repository (`.openwiki/` in each project) — that is
175
246
 
176
247
  ---
177
248
 
178
- ## 6. Synapse
249
+ ## 7. Synapse
179
250
 
180
251
  The installer downloads the module, symlinks the binary to
181
252
  `~/.local/bin/synapse` and registers a daemon on port `7781`. Two failure modes
@@ -191,7 +262,35 @@ If no pre-built binary exists for the platform, build it:
191
262
 
192
263
  ---
193
264
 
194
- ## 7. Confirm
265
+ ## 8. The dashboard
266
+
267
+ `aos-dashboard` serves one page on `http://127.0.0.1:7900` showing every BDB
268
+ service live — memB, Synapse, the OpenWiki daemon, AO Orchestrator and RemoteOS
269
+ — with its version, port, LaunchAgent state, start/stop/restart, and its log
270
+ files inline. It polls every five seconds.
271
+
272
+ ```bash
273
+ aos-dashboard # opens the browser
274
+ aos-dashboard --no-open # just serve
275
+ aos-dashboard --port 7901 # if 7900 is taken
276
+ ```
277
+
278
+ It binds to `127.0.0.1` only, and every control action is matched against a
279
+ fixed service table — an id or action the table does not contain is refused,
280
+ and no value from the request ever reaches a shell or a file path.
281
+
282
+ It also surfaces causes a port probe cannot see. The AO Orchestrator card
283
+ checks the code signature of `~/.local/bin/ao`: a binary rebuilt and copied
284
+ into place unsigned is SIGKILLed by AMFI at launch (exit 137), which otherwise
285
+ looks like a daemon that is simply down, with nothing in the log. The fix it
286
+ names is `codesign -s - -f ~/.local/bin/ao`.
287
+
288
+ Use it when the user asks what is running, or when a doctor row says a port is
289
+ closed and the question is why.
290
+
291
+ ---
292
+
293
+ ## 9. Confirm
195
294
 
196
295
  Re-run the doctor. Do not report success from the fact that commands ran —
197
296
  report the doctor's own count: