@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.
- package/.agents/skills/firecrawl/SKILL.md +149 -0
- package/.agents/skills/firecrawl/rules/install.md +82 -0
- package/.agents/skills/firecrawl/rules/security.md +26 -0
- package/.agents/skills/firecrawl-agent/SKILL.md +58 -0
- package/.agents/skills/firecrawl-build/SKILL.md +39 -0
- package/.agents/skills/firecrawl-build-interact/SKILL.md +68 -0
- package/.agents/skills/firecrawl-build-onboarding/SKILL.md +103 -0
- package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +39 -0
- package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +20 -0
- package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +17 -0
- package/.agents/skills/firecrawl-build-scrape/SKILL.md +69 -0
- package/.agents/skills/firecrawl-build-search/SKILL.md +69 -0
- package/.agents/skills/firecrawl-crawl/SKILL.md +59 -0
- package/.agents/skills/firecrawl-download/SKILL.md +70 -0
- package/.agents/skills/firecrawl-interact/SKILL.md +84 -0
- package/.agents/skills/firecrawl-map/SKILL.md +51 -0
- package/.agents/skills/firecrawl-scrape/SKILL.md +69 -0
- package/.agents/skills/firecrawl-search/SKILL.md +60 -0
- package/CLAUDE.md +573 -0
- package/README.de.md +0 -8
- package/README.md +0 -8
- package/README.pt.md +0 -8
- package/assets/brand/ao-ant-mark.svg +91 -0
- package/assets/brand/bdb-core-mark.svg +34 -0
- package/assets/brand/heimdall-guardian-mark.svg +16 -0
- package/assets/brand/memb-crystal-mark.svg +18 -0
- package/bin/aos-config.mjs +89 -0
- package/bin/aos-dashboard.mjs +608 -0
- package/bin/aos-uninstall.mjs +227 -0
- package/docs/sessions/audit-2026-09-14-silent-failures.md +114 -0
- package/docs/skills_table.md +0 -3
- package/installer.js +471 -237
- package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +10 -0
- package/mcps/after-effects-mcp/build/index.js +840 -0
- package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +153 -0
- package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +218 -0
- package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +71 -0
- package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +147 -0
- package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +114 -0
- package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +115 -0
- package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +192 -0
- package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +90 -0
- package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +50 -0
- package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +1773 -0
- package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +160 -0
- package/mcps/computer-use-mcp/dist/client.d.ts +150 -0
- package/mcps/computer-use-mcp/dist/client.js +136 -0
- package/mcps/computer-use-mcp/dist/entrypoint.d.ts +16 -0
- package/mcps/computer-use-mcp/dist/entrypoint.js +26 -0
- package/mcps/computer-use-mcp/dist/native.d.ts +212 -0
- package/mcps/computer-use-mcp/dist/native.js +50 -0
- package/mcps/computer-use-mcp/dist/server.d.ts +32 -0
- package/mcps/computer-use-mcp/dist/server.js +342 -0
- package/mcps/computer-use-mcp/dist/session.d.ts +101 -0
- package/mcps/computer-use-mcp/dist/session.js +2372 -0
- package/package.json +13 -4
- package/skills/global_config/aos-project-init/SKILL.md +97 -130
- package/skills/global_config/aos-project-init/assets/openwikiignore.template +62 -0
- package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +38 -1
- package/skills/global_config/aos-setup/SKILL.md +98 -8
- package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +21 -2
- package/skills/global_config/ask-tim/SKILL.md +2 -7
- package/skills/global_config/openwiki-skill/scripts/openwiki_daemon.py +65 -12
- package/bin/setup-saas.mjs +0 -792
- package/mcps/blender-mcp-server/.dockerignore +0 -19
- package/mcps/blender-mcp-server/.github/workflows/ci.yml +0 -67
- package/mcps/blender-mcp-server/.github/workflows/publish-pypi.yml +0 -54
- package/mcps/blender-mcp-server/CHANGELOG.md +0 -64
- package/mcps/blender-mcp-server/CONTRIBUTING.md +0 -107
- package/mcps/blender-mcp-server/Dockerfile +0 -19
- package/mcps/blender-mcp-server/LICENSE +0 -21
- package/mcps/blender-mcp-server/README.md +0 -409
- package/mcps/blender-mcp-server/addon/__init__.py +0 -1440
- package/mcps/blender-mcp-server/addon/models.py +0 -223
- package/mcps/blender-mcp-server/pyproject.toml +0 -120
- package/mcps/blender-mcp-server/scripts/blender_bridge_request.py +0 -71
- package/mcps/blender-mcp-server/scripts/blender_create_test_cube.py +0 -49
- package/mcps/blender-mcp-server/scripts/blender_scene_info.py +0 -38
- package/mcps/blender-mcp-server/scripts/build_addon_zip.sh +0 -29
- package/mcps/blender-mcp-server/scripts/demos/README.md +0 -186
- package/mcps/blender-mcp-server/scripts/demos/dam_break_scene.py +0 -276
- package/mcps/blender-mcp-server/scripts/demos/open_dam_break_gui.py +0 -33
- package/mcps/blender-mcp-server/scripts/demos/pipe_movement_study.py +0 -518
- package/mcps/blender-mcp-server/scripts/demos/pipe_pressure_failure_scene.py +0 -806
- package/mcps/blender-mcp-server/scripts/demos/procedural_dam_break_scene.py +0 -600
- package/mcps/blender-mcp-server/scripts/demos/run_dam_break.py +0 -510
- package/mcps/blender-mcp-server/scripts/launch_blender_gui.py +0 -41
- package/mcps/blender-mcp-server/scripts/library/README.md +0 -64
- package/mcps/blender-mcp-server/scripts/library/apply_transforms.py +0 -46
- package/mcps/blender-mcp-server/scripts/library/camera.py +0 -51
- package/mcps/blender-mcp-server/scripts/library/collections.py +0 -65
- package/mcps/blender-mcp-server/scripts/library/create_mesh.py +0 -41
- package/mcps/blender-mcp-server/scripts/library/effector.py +0 -48
- package/mcps/blender-mcp-server/scripts/library/fluid_domain.py +0 -80
- package/mcps/blender-mcp-server/scripts/library/fluid_inflow.py +0 -98
- package/mcps/blender-mcp-server/scripts/library/frame_range.py +0 -35
- package/mcps/blender-mcp-server/scripts/library/keyframes.py +0 -59
- package/mcps/blender-mcp-server/scripts/library/rigid_body.py +0 -52
- package/mcps/blender-mcp-server/scripts/library/save_blend.py +0 -40
- package/mcps/blender-mcp-server/scripts/server_start.sh +0 -26
- package/mcps/blender-mcp-server/src/blender_mcp_server/__init__.py +0 -3
- package/mcps/blender-mcp-server/src/blender_mcp_server/headless.py +0 -330
- package/mcps/blender-mcp-server/src/blender_mcp_server/server.py +0 -606
- package/mcps/davinci-mcp-professional/.bandit +0 -35
- package/mcps/davinci-mcp-professional/.claude/commands/security-review.md +0 -191
- package/mcps/davinci-mcp-professional/.claude/settings.json +0 -1
- package/mcps/davinci-mcp-professional/.editorconfig +0 -27
- package/mcps/davinci-mcp-professional/.gitattributes +0 -207
- package/mcps/davinci-mcp-professional/.github/CODEOWNERS +0 -2
- package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/bug_report.md +0 -33
- package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/feature_request.md +0 -19
- package/mcps/davinci-mcp-professional/.github/PULL_REQUEST_TEMPLATE.md +0 -20
- package/mcps/davinci-mcp-professional/.github/SECURITY.md +0 -97
- package/mcps/davinci-mcp-professional/.github/dependabot.yml +0 -27
- package/mcps/davinci-mcp-professional/.github/workflows/ci.yml +0 -39
- package/mcps/davinci-mcp-professional/ATTRIBUTION.md +0 -4
- package/mcps/davinci-mcp-professional/AUTHORS.md +0 -9
- package/mcps/davinci-mcp-professional/BUGS.md +0 -55
- package/mcps/davinci-mcp-professional/CLAUDE.md +0 -229
- package/mcps/davinci-mcp-professional/CONTRIBUTING.md +0 -51
- package/mcps/davinci-mcp-professional/COPYING.md +0 -228
- package/mcps/davinci-mcp-professional/Doxyfile +0 -379
- package/mcps/davinci-mcp-professional/README.md +0 -143
- package/mcps/davinci-mcp-professional/SECURITY.md +0 -40
- package/mcps/davinci-mcp-professional/USING.md +0 -301
- package/mcps/davinci-mcp-professional/VERSION.md +0 -13
- package/mcps/davinci-mcp-professional/build.py +0 -169
- package/mcps/davinci-mcp-professional/claude_desktop_config_template.json +0 -11
- package/mcps/davinci-mcp-professional/hooks/ci-check.sh +0 -29
- package/mcps/davinci-mcp-professional/hooks/pre-push +0 -46
- package/mcps/davinci-mcp-professional/main.py +0 -40
- package/mcps/davinci-mcp-professional/mcp_server.py +0 -30
- package/mcps/davinci-mcp-professional/pyproject.toml +0 -115
- package/mcps/davinci-mcp-professional/security_audit.py +0 -379
- package/mcps/davinci-mcp-professional/src/davinci_mcp/__init__.py +0 -19
- package/mcps/davinci-mcp-professional/src/davinci_mcp/cli.py +0 -138
- package/mcps/davinci-mcp-professional/src/davinci_mcp/resolve_client.py +0 -342
- package/mcps/davinci-mcp-professional/src/davinci_mcp/resources/__init__.py +0 -60
- package/mcps/davinci-mcp-professional/src/davinci_mcp/server.py +0 -185
- package/mcps/davinci-mcp-professional/src/davinci_mcp/tools/__init__.py +0 -146
- package/mcps/davinci-mcp-professional/src/davinci_mcp/types.py +0 -125
- package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/__init__.py +0 -19
- package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/platform.py +0 -239
- package/mcps/davinci-mcp-professional/test.py +0 -186
- package/mcps/davinci-mcp-professional/uv.lock +0 -2073
- package/mcps/davinci-resolve-mcp/.claude/skills/media-analysis.md +0 -44
- package/mcps/davinci-resolve-mcp/.clinerules +0 -17
- package/mcps/davinci-resolve-mcp/.cursorrules +0 -17
- package/mcps/davinci-resolve-mcp/.github/copilot-instructions.md +0 -17
- package/mcps/davinci-resolve-mcp/.github/workflows/npm-publish.yml +0 -109
- package/mcps/davinci-resolve-mcp/.windsurfrules +0 -17
- package/mcps/davinci-resolve-mcp/AGENTS.md +0 -114
- package/mcps/davinci-resolve-mcp/CHANGELOG.md +0 -2648
- package/mcps/davinci-resolve-mcp/CLAUDE.md +0 -15
- package/mcps/davinci-resolve-mcp/LICENSE +0 -21
- package/mcps/davinci-resolve-mcp/README.md +0 -173
- package/mcps/davinci-resolve-mcp/SECURITY.md +0 -53
- package/mcps/davinci-resolve-mcp/bin/davinci-resolve-mcp.mjs +0 -450
- package/mcps/davinci-resolve-mcp/examples/README.md +0 -53
- package/mcps/davinci-resolve-mcp/examples/markers/README.md +0 -81
- package/mcps/davinci-resolve-mcp/examples/media/README.md +0 -94
- package/mcps/davinci-resolve-mcp/examples/timeline/README.md +0 -98
- package/mcps/davinci-resolve-mcp/install.py +0 -1687
- package/mcps/davinci-resolve-mcp/package.json +0 -52
- package/mcps/davinci-resolve-mcp/release-notes/v2.22.0.md +0 -51
- package/mcps/davinci-resolve-mcp/release-notes/v2.23.0.md +0 -51
- package/mcps/davinci-resolve-mcp/release-notes/v2.23.1.md +0 -35
- package/mcps/davinci-resolve-mcp/release-notes/v2.24.1.md +0 -32
- package/mcps/davinci-resolve-mcp/scripts/audit_api_parity.py +0 -275
- package/mcps/davinci-resolve-mcp/scripts/audit_readwrite_symmetry.py +0 -80
- package/mcps/davinci-resolve-mcp/scripts/doctor.py +0 -227
- package/mcps/davinci-resolve-mcp/scripts/gen_api_limitations.py +0 -144
- package/mcps/davinci-resolve-mcp/scripts/live_media_analysis_polish_probe.py +0 -65
- package/mcps/davinci-resolve-mcp/scripts/measure_bridge_cost.py +0 -65
- package/mcps/davinci-resolve-mcp/scripts/regen_panel_screenshots.py +0 -76
- package/mcps/davinci-resolve-mcp/src/__init__.py +0 -3
- package/mcps/davinci-resolve-mcp/src/analysis_dashboard.py +0 -15505
- package/mcps/davinci-resolve-mcp/src/batch_cli.py +0 -540
- package/mcps/davinci-resolve-mcp/src/control_panel.py +0 -13
- package/mcps/davinci-resolve-mcp/src/granular/__init__.py +0 -17
- package/mcps/davinci-resolve-mcp/src/granular/common.py +0 -741
- package/mcps/davinci-resolve-mcp/src/granular/folder.py +0 -420
- package/mcps/davinci-resolve-mcp/src/granular/gallery.py +0 -306
- package/mcps/davinci-resolve-mcp/src/granular/graph.py +0 -309
- package/mcps/davinci-resolve-mcp/src/granular/media_pool.py +0 -679
- package/mcps/davinci-resolve-mcp/src/granular/media_pool_item.py +0 -1020
- package/mcps/davinci-resolve-mcp/src/granular/media_storage.py +0 -179
- package/mcps/davinci-resolve-mcp/src/granular/project.py +0 -1654
- package/mcps/davinci-resolve-mcp/src/granular/resolve_control.py +0 -538
- package/mcps/davinci-resolve-mcp/src/granular/timeline.py +0 -1075
- package/mcps/davinci-resolve-mcp/src/granular/timeline_item.py +0 -2251
- package/mcps/davinci-resolve-mcp/src/resolve_mcp_server.py +0 -43
- package/mcps/davinci-resolve-mcp/src/server.py +0 -24116
- package/mcps/davinci-resolve-mcp/src/utils/__init__.py +0 -3
- package/mcps/davinci-resolve-mcp/src/utils/actor_identity.py +0 -46
- package/mcps/davinci-resolve-mcp/src/utils/analysis_caps.py +0 -678
- package/mcps/davinci-resolve-mcp/src/utils/analysis_memory.py +0 -755
- package/mcps/davinci-resolve-mcp/src/utils/analysis_runs.py +0 -307
- package/mcps/davinci-resolve-mcp/src/utils/analysis_store.py +0 -945
- package/mcps/davinci-resolve-mcp/src/utils/api_truth.py +0 -525
- package/mcps/davinci-resolve-mcp/src/utils/app_control.py +0 -319
- package/mcps/davinci-resolve-mcp/src/utils/audio_fairlight_live_probe.py +0 -263
- package/mcps/davinci-resolve-mcp/src/utils/brain_edits.py +0 -387
- package/mcps/davinci-resolve-mcp/src/utils/bridge_metrics.py +0 -76
- package/mcps/davinci-resolve-mcp/src/utils/cdl.py +0 -20
- package/mcps/davinci-resolve-mcp/src/utils/clip_query.py +0 -85
- package/mcps/davinci-resolve-mcp/src/utils/cloud_operations.py +0 -192
- package/mcps/davinci-resolve-mcp/src/utils/color_grade_live_probe.py +0 -444
- package/mcps/davinci-resolve-mcp/src/utils/contracts.py +0 -102
- package/mcps/davinci-resolve-mcp/src/utils/cut_ir.py +0 -115
- package/mcps/davinci-resolve-mcp/src/utils/dctl_templates.py +0 -368
- package/mcps/davinci-resolve-mcp/src/utils/deep_vision.py +0 -643
- package/mcps/davinci-resolve-mcp/src/utils/destructive_hook.py +0 -606
- package/mcps/davinci-resolve-mcp/src/utils/edit_engine.py +0 -737
- package/mcps/davinci-resolve-mcp/src/utils/embeddings.py +0 -922
- package/mcps/davinci-resolve-mcp/src/utils/entities.py +0 -579
- package/mcps/davinci-resolve-mcp/src/utils/extension_authoring_live_probe.py +0 -292
- package/mcps/davinci-resolve-mcp/src/utils/failure_tracker.py +0 -119
- package/mcps/davinci-resolve-mcp/src/utils/fuse_templates.py +0 -1968
- package/mcps/davinci-resolve-mcp/src/utils/fusion_composition_live_probe.py +0 -284
- package/mcps/davinci-resolve-mcp/src/utils/fusion_group_settings.py +0 -334
- package/mcps/davinci-resolve-mcp/src/utils/layout_presets.py +0 -333
- package/mcps/davinci-resolve-mcp/src/utils/mcp_stdio.py +0 -32
- package/mcps/davinci-resolve-mcp/src/utils/mcp_transport.py +0 -128
- package/mcps/davinci-resolve-mcp/src/utils/media_analysis.py +0 -7690
- package/mcps/davinci-resolve-mcp/src/utils/media_analysis_jobs.py +0 -805
- package/mcps/davinci-resolve-mcp/src/utils/media_pool_changes.py +0 -121
- package/mcps/davinci-resolve-mcp/src/utils/media_pool_ingest_live_probe.py +0 -592
- package/mcps/davinci-resolve-mcp/src/utils/multicam.py +0 -393
- package/mcps/davinci-resolve-mcp/src/utils/object_inspection.py +0 -301
- package/mcps/davinci-resolve-mcp/src/utils/page_lock.py +0 -75
- package/mcps/davinci-resolve-mcp/src/utils/platform.py +0 -157
- package/mcps/davinci-resolve-mcp/src/utils/proc.py +0 -26
- package/mcps/davinci-resolve-mcp/src/utils/project_cleanup.py +0 -73
- package/mcps/davinci-resolve-mcp/src/utils/project_lifecycle_live_probe.py +0 -376
- package/mcps/davinci-resolve-mcp/src/utils/project_lint.py +0 -131
- package/mcps/davinci-resolve-mcp/src/utils/project_properties.py +0 -601
- package/mcps/davinci-resolve-mcp/src/utils/project_spec.py +0 -459
- package/mcps/davinci-resolve-mcp/src/utils/readback.py +0 -91
- package/mcps/davinci-resolve-mcp/src/utils/render_deliver_live_probe.py +0 -384
- package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_governance.py +0 -214
- package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_ledger.py +0 -244
- package/mcps/davinci-resolve-mcp/src/utils/resolve_busy.py +0 -171
- package/mcps/davinci-resolve-mcp/src/utils/resolve_connection.py +0 -77
- package/mcps/davinci-resolve-mcp/src/utils/review_annotation_live_probe.py +0 -352
- package/mcps/davinci-resolve-mcp/src/utils/script_templates.py +0 -1193
- package/mcps/davinci-resolve-mcp/src/utils/shot_relationships.py +0 -544
- package/mcps/davinci-resolve-mcp/src/utils/structural_diff.py +0 -175
- package/mcps/davinci-resolve-mcp/src/utils/sync_detection.py +0 -889
- package/mcps/davinci-resolve-mcp/src/utils/timeline_brain_db.py +0 -826
- package/mcps/davinci-resolve-mcp/src/utils/timeline_conform_live_probe.py +0 -280
- package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_live_probe.py +0 -1092
- package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_probe.py +0 -185
- package/mcps/davinci-resolve-mcp/src/utils/timeline_title_text.py +0 -87
- package/mcps/davinci-resolve-mcp/src/utils/timeline_versioning.py +0 -730
- package/mcps/davinci-resolve-mcp/src/utils/update_check.py +0 -685
- package/mcps/vectorworks-mcp/.dockerignore +0 -8
- package/mcps/vectorworks-mcp/Dockerfile +0 -28
- package/mcps/vectorworks-mcp/README.md +0 -156
- package/mcps/vectorworks-mcp/app/__init__.py +0 -2
- package/mcps/vectorworks-mcp/app/api.py +0 -52
- package/mcps/vectorworks-mcp/app/chunking.py +0 -56
- package/mcps/vectorworks-mcp/app/config.py +0 -29
- package/mcps/vectorworks-mcp/app/embeddings.py +0 -28
- package/mcps/vectorworks-mcp/app/indexer.py +0 -106
- package/mcps/vectorworks-mcp/app/main.py +0 -33
- package/mcps/vectorworks-mcp/app/mcp_server.py +0 -71
- package/mcps/vectorworks-mcp/app/search.py +0 -54
- package/mcps/vectorworks-mcp/app/utils.py +0 -14
- package/mcps/vectorworks-mcp/data/.gitkeep +0 -1
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_PluginScript.htm +0 -95
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_ScriptEditor.htm +0 -266
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_Scripting.htm +0 -106
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2023_CreatingScriptedPlugins.htm +0 -327
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2024_RunningScripts.htm +0 -116
- package/mcps/vectorworks-mcp/data/vw-devwiki/VS_Function_Reference_category.html +0 -2129
- package/mcps/vectorworks-mcp/data/vw-jp-ref/ObjectsSymbols.html +0 -2035
- package/mcps/vectorworks-mcp/data/vw-jp-ref/ScriptFunctionReference.html +0 -29
- package/mcps/vectorworks-mcp/design.md +0 -57
- package/mcps/vectorworks-mcp/docker-compose.yml +0 -18
- package/mcps/vectorworks-mcp/index/.gitkeep +0 -1
- package/mcps/vectorworks-mcp/index/meta.jsonl +0 -3956
- package/mcps/vectorworks-mcp/index/vw.faiss +0 -0
- package/mcps/vectorworks-mcp/requirements.txt +0 -10
- package/mcps/vectorworks-mcp/scripts/fetch_docs_minimal.sh +0 -84
- package/mcps/vectorworks-mcp/scripts/fetch_github_vectorworks.sh +0 -85
- package/mcps/vectorworks-mcp/templates/index.html +0 -40
- package/scripts/ecosystem-health-audit.js +0 -257
- package/skills/bdb-dev-os-skill/SKILL.md +0 -49
- package/skills/bdb-dev-os-skill/package.json +0 -11
- package/skills/bdbsaastraining/SKILL.md +0 -316
- package/skills/bdbsaastraining/references/exam-pool.md +0 -313
- package/skills/bdbsaastraining/references/interaction-modes.md +0 -94
- package/skills/bdbsaastraining/references/track-a-ai-agent.md +0 -111
- package/skills/bdbsaastraining/references/track-b-wordpress.md +0 -111
- package/skills/bdbsaastraining/references/track-c-mailserver.md +0 -107
- package/skills/bdbsaastraining/references/track-d-debian.md +0 -109
- package/skills/bdbsaastraining/references/track-e-custom.md +0 -83
- package/skills/bdbsaastraining/scripts/build_profile.py +0 -529
- package/skills/bdbsaastraining/scripts/generate_certificate.py +0 -161
- package/skills/bdbsaastraining/scripts/preflight_check.sh +0 -150
- package/skills/bdbsaastraining/templates/certificate_template.html +0 -508
- package/skills/global_config/bdb-ecosystem-health/SKILL.md +0 -68
- package/skills/global_config/bdbsaas-ops/SKILL.md +0 -16
- package/skills/global_config/bdbsaashost/SKILL.md +0 -125
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Remove AOS from this machine.
|
|
3
|
+
//
|
|
4
|
+
// aos-uninstall what AOS installed; your data stays
|
|
5
|
+
// aos-uninstall --purge also the memory store, wikis and credentials
|
|
6
|
+
// aos-uninstall --dry-run list everything, delete nothing
|
|
7
|
+
// aos-uninstall --yes skip the confirmations (CI only)
|
|
8
|
+
//
|
|
9
|
+
// The file-level install manifest records every path AOS wrote together with
|
|
10
|
+
// the sha256 it wrote. That is what makes a precise uninstall possible: a file
|
|
11
|
+
// still matching its recorded hash is ours and untouched, so it goes; a file
|
|
12
|
+
// that differs was edited after installation and is backed up rather than
|
|
13
|
+
// deleted; a file with no manifest entry was never ours and is not considered
|
|
14
|
+
// at all.
|
|
15
|
+
|
|
16
|
+
import { readFileSync, existsSync, rmSync, copyFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
|
|
17
|
+
import { execFileSync } from 'node:child_process';
|
|
18
|
+
import { createHash } from 'node:crypto';
|
|
19
|
+
import { createInterface } from 'node:readline/promises';
|
|
20
|
+
import os from 'node:os';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
|
|
23
|
+
const HOME = os.homedir();
|
|
24
|
+
const h = (...p) => path.join(HOME, ...p);
|
|
25
|
+
const tilde = (p) => p.replace(HOME, '~');
|
|
26
|
+
|
|
27
|
+
const PURGE = process.argv.includes('--purge');
|
|
28
|
+
const DRY = process.argv.includes('--dry-run');
|
|
29
|
+
const YES = process.argv.includes('--yes');
|
|
30
|
+
|
|
31
|
+
const MANIFEST = h('.agents', '.bdb-install-manifest.json');
|
|
32
|
+
|
|
33
|
+
// Machine-global state AOS creates but does not own the contents of. Removed
|
|
34
|
+
// only under --purge, and each is named individually before anything happens —
|
|
35
|
+
// losing a memory store to a flag nobody read would be unforgivable.
|
|
36
|
+
const DATA_PATHS = [
|
|
37
|
+
{ path: h('.MemBDB'), what: 'memB memory store — every memory on this machine' },
|
|
38
|
+
{ path: h('.openwiki'), what: 'OpenWiki credentials, daemon config and the watch list' },
|
|
39
|
+
{ path: h('.synapse'), what: 'Synapse logs and reports' },
|
|
40
|
+
{ path: h('.memb'), what: 'memB WebUI logs' },
|
|
41
|
+
{ path: h('.ao'), what: 'AO Orchestrator logs' },
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
const AGENTS = [
|
|
45
|
+
'com.bdb.memb.webui', 'com.bdb.synapse', 'com.bdb.openwiki.daemon',
|
|
46
|
+
'com.bdb.ao.daemon', 'com.bdb.agent-workspace', 'com.hybridlabor.bdb-remote',
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
const MODULE_DIRS = ['memB', 'bdb-synapse', 'bdb-os-remote', 'bdb-dev-creator-extension',
|
|
50
|
+
'bdb-dev-tool-installer',
|
|
51
|
+
'bdb-agent-orchestrator', // AO
|
|
52
|
+
'bdb-os-agent-workspace', // AO's archived predecessor, if still lying around
|
|
53
|
+
].map((m) => h('.agents', m));
|
|
54
|
+
|
|
55
|
+
const sha256 = (file) => {
|
|
56
|
+
try { return createHash('sha256').update(readFileSync(file)).digest('hex'); }
|
|
57
|
+
catch { return null; }
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// --------------------------------------------------------------------- plan
|
|
61
|
+
function plan() {
|
|
62
|
+
const manifest = (() => {
|
|
63
|
+
try { return JSON.parse(readFileSync(MANIFEST, 'utf8')); } catch { return null; }
|
|
64
|
+
})();
|
|
65
|
+
|
|
66
|
+
const ours = []; // matches its recorded hash — delete
|
|
67
|
+
const edited = []; // differs — back up, then delete
|
|
68
|
+
const gone = []; // already absent
|
|
69
|
+
|
|
70
|
+
for (const [p, entry] of Object.entries(manifest || {})) {
|
|
71
|
+
if (!existsSync(p)) { gone.push(p); continue; }
|
|
72
|
+
(sha256(p) === entry.sha256 ? ours : edited).push(p);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const agents = AGENTS
|
|
76
|
+
.map((label) => ({ label, plist: h('Library', 'LaunchAgents', `${label}.plist`) }))
|
|
77
|
+
.filter((a) => existsSync(a.plist));
|
|
78
|
+
|
|
79
|
+
const modules = MODULE_DIRS.filter(existsSync);
|
|
80
|
+
const data = PURGE ? DATA_PATHS.filter((d) => existsSync(d.path)) : [];
|
|
81
|
+
|
|
82
|
+
return { manifest, ours, edited, gone, agents, modules, data };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function describe(p) {
|
|
86
|
+
const { manifest, ours, edited, gone, agents, modules, data } = p;
|
|
87
|
+
|
|
88
|
+
if (!manifest) {
|
|
89
|
+
console.log('Kein Installations-Manifest unter ' + tilde(MANIFEST) + '.');
|
|
90
|
+
console.log('Ohne das lässt sich nicht sagen, welche Datei von AOS stammt — es wird nichts gelöscht.');
|
|
91
|
+
console.log('Betroffen wären sonst: ~/.claude/skills, ~/.gemini/config/skills, ~/.codex/skills, ~/.agents/');
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
console.log(`\nManifest: ${Object.keys(manifest).length} Dateien erfasst`);
|
|
96
|
+
console.log(` ${String(ours.length).padStart(5)} unverändert seit der Installation → werden entfernt`);
|
|
97
|
+
console.log(` ${String(edited.length).padStart(5)} nach der Installation bearbeitet → erst .bak, dann entfernt`);
|
|
98
|
+
console.log(` ${String(gone.length).padStart(5)} bereits nicht mehr vorhanden`);
|
|
99
|
+
|
|
100
|
+
if (edited.length) {
|
|
101
|
+
console.log('\n bearbeitet:');
|
|
102
|
+
for (const f of edited.slice(0, 8)) console.log(` ${tilde(f)}`);
|
|
103
|
+
if (edited.length > 8) console.log(` … und ${edited.length - 8} weitere`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (agents.length) {
|
|
107
|
+
console.log(`\nHintergrunddienste (${agents.length}): ${agents.map((a) => a.label).join(', ')}`);
|
|
108
|
+
}
|
|
109
|
+
if (modules.length) {
|
|
110
|
+
console.log('\nModule:');
|
|
111
|
+
for (const m of modules) console.log(` ${tilde(m)}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
console.log('\nBleibt erhalten:');
|
|
115
|
+
if (!PURGE) for (const d of DATA_PATHS.filter((d) => existsSync(d.path))) console.log(` ${tilde(d.path).padEnd(18)} ${d.what}`);
|
|
116
|
+
console.log(' jede Datei ohne Manifest-Eintrag — eigene Skills, fremde Hooks, alles Selbstgeschriebene');
|
|
117
|
+
|
|
118
|
+
if (data.length) {
|
|
119
|
+
console.log('\n\x1b[31mWIRD GELÖSCHT (--purge):\x1b[0m');
|
|
120
|
+
for (const d of data) {
|
|
121
|
+
let size = '';
|
|
122
|
+
try { size = ` (${(dirSize(d.path) / 1e6).toFixed(1)} MB)`; } catch { /* unreadable */ }
|
|
123
|
+
console.log(` \x1b[31m${tilde(d.path).padEnd(18)}\x1b[0m ${d.what}${size}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function dirSize(p) {
|
|
130
|
+
let total = 0;
|
|
131
|
+
const walk = (d) => {
|
|
132
|
+
for (const e of readdirSync(d, { withFileTypes: true })) {
|
|
133
|
+
const f = path.join(d, e.name);
|
|
134
|
+
try { e.isDirectory() ? walk(f) : (total += statSync(f).size); } catch { /* raced */ }
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
try { statSync(p).isDirectory() ? walk(p) : (total = statSync(p).size); } catch { /* gone */ }
|
|
138
|
+
return total;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ------------------------------------------------------------------ execute
|
|
142
|
+
function execute(p) {
|
|
143
|
+
const { ours, edited, agents, modules, data } = p;
|
|
144
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '').slice(0, 15);
|
|
145
|
+
let removed = 0, backed = 0;
|
|
146
|
+
|
|
147
|
+
for (const a of agents) {
|
|
148
|
+
try { execFileSync('launchctl', ['unload', a.plist], { stdio: 'ignore' }); } catch { /* not loaded */ }
|
|
149
|
+
try { rmSync(a.plist); } catch { /* already gone */ }
|
|
150
|
+
}
|
|
151
|
+
if (agents.length) console.log(` ${agents.length} Dienste gestoppt und entfernt`);
|
|
152
|
+
|
|
153
|
+
for (const f of edited) {
|
|
154
|
+
try { copyFileSync(f, `${f}.${stamp}.bak`); backed++; } catch { /* unreadable */ }
|
|
155
|
+
}
|
|
156
|
+
for (const f of [...ours, ...edited]) {
|
|
157
|
+
try { rmSync(f); removed++; } catch { /* already gone */ }
|
|
158
|
+
}
|
|
159
|
+
console.log(` ${removed} Dateien entfernt, ${backed} vorher gesichert`);
|
|
160
|
+
|
|
161
|
+
for (const m of modules) { try { rmSync(m, { recursive: true, force: true }); } catch { /* in use */ } }
|
|
162
|
+
if (modules.length) console.log(` ${modules.length} Module entfernt`);
|
|
163
|
+
|
|
164
|
+
// Only the BDB hook entries leave settings.json; everything else in it is
|
|
165
|
+
// the user's and must survive an uninstall exactly as it survives an install.
|
|
166
|
+
const settings = h('.claude', 'settings.json');
|
|
167
|
+
if (existsSync(settings)) {
|
|
168
|
+
try {
|
|
169
|
+
const s = JSON.parse(readFileSync(settings, 'utf8'));
|
|
170
|
+
const bdb = ['go-gate.mjs', 'graph-gate.mjs', 'memb-inject.mjs'];
|
|
171
|
+
let touched = false;
|
|
172
|
+
for (const [event, entries] of Object.entries(s.hooks || {})) {
|
|
173
|
+
const kept = entries.filter((e) => !(e.hooks || []).some((x) => bdb.some((n) => String(x.command).includes(n))));
|
|
174
|
+
if (kept.length !== entries.length) { touched = true; s.hooks[event] = kept; }
|
|
175
|
+
if (!kept.length) delete s.hooks[event];
|
|
176
|
+
}
|
|
177
|
+
if (touched) {
|
|
178
|
+
writeFileSync(settings, JSON.stringify(s, null, 2) + '\n');
|
|
179
|
+
console.log(' BDB-Hooks aus settings.json entfernt, alles andere unverändert');
|
|
180
|
+
}
|
|
181
|
+
} catch { console.log(' settings.json nicht lesbar — von Hand prüfen'); }
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
for (const d of data) {
|
|
185
|
+
try { rmSync(d.path, { recursive: true, force: true }); console.log(` \x1b[31mgelöscht:\x1b[0m ${tilde(d.path)}`); }
|
|
186
|
+
catch (e) { console.log(` konnte ${tilde(d.path)} nicht löschen: ${e.message}`); }
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
for (const f of [MANIFEST, h('.agents', '.bdb-manifest.json')]) {
|
|
190
|
+
try { rmSync(f); } catch { /* already gone */ }
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ---------------------------------------------------------------------- main
|
|
195
|
+
const ask = async (q) => {
|
|
196
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
197
|
+
const a = (await rl.question(q)).trim();
|
|
198
|
+
rl.close();
|
|
199
|
+
return a;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const p = plan();
|
|
203
|
+
console.log(PURGE ? '\x1b[31mAOS UNINSTALL — PURGE\x1b[0m' : 'AOS Uninstall');
|
|
204
|
+
if (!describe(p)) process.exit(1);
|
|
205
|
+
|
|
206
|
+
if (DRY) {
|
|
207
|
+
console.log('\n[dry-run] Es wurde nichts verändert.');
|
|
208
|
+
process.exit(0);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (!YES) {
|
|
212
|
+
if ((await ask('\nFortfahren? [ja/nein] ')).toLowerCase() !== 'ja') {
|
|
213
|
+
console.log('Abgebrochen. Nichts verändert.');
|
|
214
|
+
process.exit(0);
|
|
215
|
+
}
|
|
216
|
+
if (PURGE) {
|
|
217
|
+
console.log('\n\x1b[31mDer zweite Schritt löscht das Gedächtnis und die Zugangsdaten unwiderruflich.\x1b[0m');
|
|
218
|
+
if ((await ask('Zum Bestätigen PURGE eingeben: ')).trim() !== 'PURGE') {
|
|
219
|
+
console.log('Abgebrochen. Nichts verändert.');
|
|
220
|
+
process.exit(0);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
console.log('');
|
|
226
|
+
execute(p);
|
|
227
|
+
console.log('\nFertig. Neu einrichten mit: npx -y @hybridlabor-api/aos@latest');
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Audit 2026-09-13/14 — the "reports success, does nothing" family
|
|
2
|
+
|
|
3
|
+
Every defect below was found in one session, and they are all the same shape:
|
|
4
|
+
**a component reports a state it is not in.** Not crashes, not exceptions — a
|
|
5
|
+
clean run, a green check, and nothing actually delivered. That is why they
|
|
6
|
+
survived so many releases: the installer's own output said it worked.
|
|
7
|
+
|
|
8
|
+
Read this before adding a check anywhere in this repo. The question that
|
|
9
|
+
catches this family is not "does the check pass" but **"does the check measure
|
|
10
|
+
the thing, or something the tool itself produced?"**
|
|
11
|
+
|
|
12
|
+
Numbers here are measurements taken on one machine on 2026-09-13/14; they are
|
|
13
|
+
evidence for the defect, not invariants.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Fixed and tested
|
|
18
|
+
|
|
19
|
+
| # | Defect | Why it was invisible |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| 1 | `runQuickUpdate()` delivered no harness files — hooks, dispatcher workflows, compiled subagents, `GEMINI.md` | Quick Update is what an existing install is offered. Everything `injectHarnessRules()` does was fresh-install-only, so machines kept first-install agent definitions forever. Fixed once for hooks in 4.4.1; the rest recurred one layer up |
|
|
22
|
+
| 2 | `memb-inject.mjs` imported `node:sqlite` at top level, outside its own `try` | The file documents itself as fail-open. A top-level import that throws escapes the `try`, so a Node without unflagged `node:sqlite` got a hook error on every prompt |
|
|
23
|
+
| 3 | The same hook read `project_id` from `$.metadata.project_id` | memB stores it at the payload top level. The lookup matched nothing, ever — the injected block rendered as `- None` and nobody read it as a bug |
|
|
24
|
+
| 4 | `resolveFileConflict()` skipped files whose content it did not recognise | Only ever called for paths the payload owns, so "unknown content" almost always meant *our own older file*. Bootstrap adoption catches only byte-identical files, so anything changed in between froze permanently. 50 files on one machine, the oldest untouched since July |
|
|
25
|
+
| 5 | `detectPlatforms()` tested for config directories | `syncSkillsToGlobalHarnesses()` and `universalHarnessSync()` create those directories. The detector read back evidence the installer had planted: 7 harnesses reported, 5 installed |
|
|
26
|
+
| 6 | `tar -xzf` unpacked module updates over the installed tree | A merge, not a replacement. Files the new version dropped stayed forever while `package.json` reported the module current |
|
|
27
|
+
| 7 | Seven call sites ignored `downloadOrUpdateModule()`'s `false` | A failed download fell through into venv setup and daemon registration, and the run still ended in a success banner |
|
|
28
|
+
| 8 | A failed `npm view` was swallowed | Every module read "up to date" indefinitely on an offline or proxied machine, indistinguishable from a real answer |
|
|
29
|
+
| 9 | The Agent Workspace printed its WebUI URL unconditionally | Directly under a warning that the port had not answered, and on Linux where no daemon is registered at all |
|
|
30
|
+
| 10 | `--dry-run` created a venv | The global `fs.*` dry-run patch does not cover child processes; `uv venv` ran for real |
|
|
31
|
+
| 11 | A second run overwrote the first `.bak` | Backups were not timestamped, so the recovery copy was destroyed by the act of recovering |
|
|
32
|
+
| 12 | AO's LaunchAgent ran the binary with no subcommand | Bare `ao` prints help and exits; with `KeepAlive` launchd restarted it until throttled. On every machine that installed AO through AOS the daemon never ran — it only looked installed |
|
|
33
|
+
| 13 | AO pointed at `@hybridlabor-api/bdb-os-agent-workspace` | That repository is archived and its last npm release predates the archiving, so installing it hands out the build with the CDC loop defect |
|
|
34
|
+
| 14 | There was no uninstall | "Remove and reinstall cleanly" was not possible, which also makes a genuine fresh-install test impossible |
|
|
35
|
+
| 15 | The OpenWiki daemon discovered nothing | `get_projects()` seeded a list with one entry and read it back unchanged forever. 31 wikis existed, 3 were refreshed, the oldest untouched since 23 July |
|
|
36
|
+
| 16 | No repository had a `.openwikiignore` | OpenWiki's `load()` falls back to `parse("")` — with no file it loads **zero** rules and indexes `.venv`, build output and its own `.openwiki/` recursively. Measured on one repo: 33 of 145 graph nodes were junk, 0 false positives after applying the template |
|
|
37
|
+
|
|
38
|
+
`tests/installer-e2e.sh` covers 18 of these against a throwaway `$HOME`. It is
|
|
39
|
+
deliberately outside `npm test` — real network, minutes to run — and belongs
|
|
40
|
+
before a release. The unit tests cover the logic; this covers whether the
|
|
41
|
+
installer does anything at all.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Found, not yet fixed
|
|
46
|
+
|
|
47
|
+
**Operational data one publish away from the public package — corrected.**
|
|
48
|
+
`mcps/bdb-remoteos-mcp/queue.db` holds 134 real approval rows and `npm pack`
|
|
49
|
+
included it. The first reading of this was that it had already shipped. That
|
|
50
|
+
was wrong, and the correction matters more than the original claim: the
|
|
51
|
+
published tarballs for 4.2.0, 4.3.0, 4.4.0 and 4.4.1 were each downloaded and
|
|
52
|
+
searched, and every one contains zero matches for `queue.db` and `.pyc`. The
|
|
53
|
+
file has never been in git; it is created at runtime by the MCP, so a release
|
|
54
|
+
built from a clean checkout cannot contain it. A release published from a
|
|
55
|
+
development machine would have — which is exactly what 4.4.2 was going to be.
|
|
56
|
+
|
|
57
|
+
So this was a near miss, not a leak, and the lesson is about the check rather
|
|
58
|
+
than the defect: `npm pack --dry-run` on a working tree answers "what would
|
|
59
|
+
ship from *here*", which is not the same question as "what did ship". Only the
|
|
60
|
+
published tarball answers the second one. Both fixes stay: the negation inside
|
|
61
|
+
`files` (`.npmignore` has no effect on a path `files` includes wholesale), and
|
|
62
|
+
`.gitignore`, so neither the store nor its `-shm`/`-wal` siblings can enter
|
|
63
|
+
either channel from any machine.
|
|
64
|
+
|
|
65
|
+
**~46 MB that has never worked.** `tdmcp`, `touchdesigner-mcp` and `unreal_mcp`
|
|
66
|
+
declare `main` as `dist/index.js`; `dist/` is in no tarball. It exists only if
|
|
67
|
+
`npm run build` succeeds at install time, and that result is discarded — so the
|
|
68
|
+
MCP config is written pointing at files that were never produced.
|
|
69
|
+
|
|
70
|
+
**A smoke test that is theatre.** Four of the six Python MCP prewarm entries
|
|
71
|
+
call `uv -m mcp_server --help` without the required `run` subcommand. They fail
|
|
72
|
+
before `uv` reaches the script, `stdio` is `ignore`, and the result is
|
|
73
|
+
discarded.
|
|
74
|
+
|
|
75
|
+
**Hardcoded versions.** `bdb-os-remote` serves `1.0.0` from
|
|
76
|
+
`src/server/sse-server.js:94,189` while its manifest says 2.0.1; memB serves
|
|
77
|
+
`1.0.0` from `src/backend/server.py:36` against a manifest of 2.3.2.
|
|
78
|
+
|
|
79
|
+
**AO is macOS-arm64 only on npm.** The package ships one prebuilt binary. The
|
|
80
|
+
upstream project publishes every platform through GitHub Releases
|
|
81
|
+
(`darwin-arm64`, `darwin-x64`, `linux-x64` as AppImage/deb/rpm, `win32-x64.exe`)
|
|
82
|
+
and the fork's own `build-artifacts.yml` already produces them — only the path
|
|
83
|
+
into the package is missing. Separately, `bin/ao.js`'s `findBinary()` returns
|
|
84
|
+
the first path that *exists* without checking it can execute, so on Windows the
|
|
85
|
+
shim dies with an exec-format error instead of printing the hint it means to.
|
|
86
|
+
|
|
87
|
+
**12 of 187 skills are filler.** Three identical "Red Flags" lines appear in
|
|
88
|
+
eleven skills, one identical sentence in ten. `synapse-integration-skill` is
|
|
89
|
+
23 % unique content and 72 % identical to `bdb-dev-os-skill`. `bdbsaas-ops` is
|
|
90
|
+
16 lines, marked retired, and carries no commands.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## What a check has to do here
|
|
95
|
+
|
|
96
|
+
1. **Measure the thing, not a proxy.** A port that answers is not the right
|
|
97
|
+
process; a directory that exists is not an installed application; a
|
|
98
|
+
`package.json` version is not what the running service reports.
|
|
99
|
+
2. **Never read back your own writes as evidence.** If the installer creates
|
|
100
|
+
the path, the path proves nothing.
|
|
101
|
+
3. **Distinguish "checked, fine" from "could not check."** An offline
|
|
102
|
+
registry must not read as up to date.
|
|
103
|
+
4. **A discarded return value is a swallowed failure.** `installStep()` only
|
|
104
|
+
catches throws; a function that signals failure by returning `false` needs
|
|
105
|
+
its result read.
|
|
106
|
+
5. **Every code path, not just the fresh one.** Quick Update, `--project-harness`,
|
|
107
|
+
`-y`, `--dry-run` and the interactive path each need the step, or the step
|
|
108
|
+
does not exist for the people on that path.
|
|
109
|
+
6. **Ask about the artefact people actually have.** A dry run on a working tree
|
|
110
|
+
describes a hypothetical release from that machine. What users installed is
|
|
111
|
+
the published tarball, and only downloading it answers that. This rule was
|
|
112
|
+
added after the `queue.db` finding above was reported as a live leak on the
|
|
113
|
+
strength of a local `npm pack --dry-run`, and turned out on inspection of
|
|
114
|
+
all four published versions never to have shipped.
|
package/docs/skills_table.md
CHANGED
|
@@ -199,9 +199,6 @@
|
|
|
199
199
|
|------------|-------------|
|
|
200
200
|
| `bdbmediastorm` | The ultimate creative-tech and show-control brainstorming engine. Orchestrates multi-agent ideation focused on signal flow, hardware constraints, protocols, and BDB MCP integrations. Now strictly governed by the 3 Core Godmodes (engineering, ui-ux, shipping). |
|
|
201
201
|
| `bdbrainstorm` | Combines multi-agent brainstorming, the /grill-me slash command, and the 3 Core Godmodes (godmode-engineering, godmode-ui-ux, godmode-shipping) to force a comprehensive, multi-agent ideation and technical design workflow. |
|
|
202
|
-
| `bdbsaas-ops` | Retired — superseded by bdbsaashost. Use /bdbsaashost instead; this skill's content was merged there (2026-09-05, plan production_artifacts/00_execution_plan.md item B2). |
|
|
203
|
-
| `bdbsaashost` | Use when operating the BDB Multi-Cloud Fleet. Governs Primary Compute, GCP Identity, Oracle, FastMCP SSE Gateway, 4-Eyes Approvals, agent-sudo guardrails, Incus containers, and LLDAP/Authelia identity management. |
|
|
204
|
-
| `bdbsaastraining` | Use when onboarding or training staff on the BDB SaaS Host Engine. Guides trainees via interactive workloads (WordPress, mail, agents) through SSH 2FA, Incus, and FastMCP guardrails, culminating in a PDF certificate. |
|
|
205
202
|
| `github-repo` | Standards and workflows for writing, formatting, sanitizing, and publishing high-quality GitHub repositories, complementing openwiki-skill. |
|
|
206
203
|
| `memb-ingest` | Deep scan and ingest project files (.md, .json, agent.md, .openwiki) and past conversation logs into the local memB vector memory engine. |
|
|
207
204
|
|