@hybridlabor-api/aos 4.6.5 → 4.7.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.
- package/.agents/agents.md +1 -0
- package/.agents/nodes.json +5 -1
- package/.agents/state.schema.json +2 -1
- package/.agents/vendor-manifest.json +50 -0
- package/.claude/agents/architect.md +4 -0
- package/.claude/agents/security-reviewer.md +1 -1
- package/.claude/hooks/memb-inject.mjs +257 -135
- package/.claude/hooks/trail-relay.mjs +18 -0
- package/.claude/settings.json +70 -0
- package/.claude/workflows/startcycle-dispatch.mjs +29 -1
- package/.opencode/agents/architect.md +4 -0
- package/.opencode/plugins/bdb-aos.js +75 -0
- package/THIRD_PARTY_NOTICES.md +48 -0
- package/bin/aos-config.mjs +3 -1
- package/bin/aos-uninstall.mjs +55 -1
- package/docs/handover/agenttrail-for-ao.md +58 -0
- package/docs/handover/deja-for-ao.md +51 -0
- package/installer.js +257 -56
- package/mcp_config.json +4 -0
- package/mcps/mcsc/README.md +24 -0
- package/mcps/mcsc/package-lock.json +1234 -0
- package/mcps/mcsc/package.json +14 -0
- package/mcps/mcsc/packages/core/bin/mcsc.js +162 -0
- package/mcps/mcsc/packages/core/rulebook.default.yaml +49 -0
- package/mcps/mcsc/packages/core/schema/rulebook.schema.json +56 -0
- package/mcps/mcsc/packages/core/src/adapters/agy.js +107 -0
- package/mcps/mcsc/packages/core/src/adapters/codex.js +56 -0
- package/mcps/mcsc/packages/core/src/adapters/native.js +14 -0
- package/mcps/mcsc/packages/core/src/adapters/opencode.js +183 -0
- package/mcps/mcsc/packages/core/src/adapters/types.js +21 -0
- package/mcps/mcsc/packages/core/src/capabilities/buildOfferTable.js +34 -0
- package/mcps/mcsc/packages/core/src/capabilities/registry.js +99 -0
- package/mcps/mcsc/packages/core/src/capabilities/types.js +24 -0
- package/mcps/mcsc/packages/core/src/detect/cache.js +47 -0
- package/mcps/mcsc/packages/core/src/detect/inventory.js +73 -0
- package/mcps/mcsc/packages/core/src/detect/probes.js +158 -0
- package/mcps/mcsc/packages/core/src/detect/types.js +26 -0
- package/mcps/mcsc/packages/core/src/rulebook/load.js +53 -0
- package/mcps/mcsc/packages/core/src/rulebook/resolve.js +227 -0
- package/mcps/mcsc/packages/core/src/rulebook/rulebook.types.js +89 -0
- package/mcps/mcsc/packages/core/src/trail.js +17 -0
- package/mcps/mcsc/packages/mcp/server.js +302 -0
- package/mcps/mcsc/server.js +2 -0
- package/package.json +3 -1
- package/skills/basic/bdbmediastorm/SKILL.md +1 -1
- package/skills/basic/godmode-ui-ux/SKILL.md +2 -2
- package/skills/basic/godmode-ui-ux/references/anti-slop-rules.md +44 -40
- package/skills/basic/godmode-ui-ux/references/taste-archetypes.md +49 -0
- package/skills/basic/startcycle/SKILL.md +7 -0
- package/skills/basic/startcycle-graph/SKILL.md +12 -0
- package/skills/basic/startcycle-graph-user/SKILL.md +3 -0
- package/skills/basic/teamwork-preview/SKILL.md +2 -0
- package/skills/bdbrainstorm/SKILL.md +1 -0
- package/skills/global_config/agenttrail/LICENSE +21 -0
- package/skills/global_config/agenttrail/SKILL.md +48 -0
- package/skills/global_config/agenttrail/bin/agenttrail.mjs +1002 -0
- package/skills/global_config/agenttrail/public/index.html +661 -0
- package/skills/global_config/aos-project-init/SKILL.md +25 -5
- package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +11 -0
- package/skills/global_config/aos-setup/SKILL.md +34 -1
- package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +115 -1
- package/skills/global_config/archify/LICENSE +22 -0
- package/skills/global_config/archify/SKILL.md +140 -0
- package/skills/global_config/archify/THIRD_PARTY_NOTICES.md +69 -0
- package/skills/global_config/archify/assets/JetBrainsMono-OFL.txt +93 -0
- package/skills/global_config/archify/assets/template.html +14937 -0
- package/skills/global_config/archify/bin/archify.mjs +2139 -0
- package/skills/global_config/archify/bin/open-artifact.mjs +86 -0
- package/skills/global_config/archify/bin/preview.mjs +653 -0
- package/skills/global_config/archify/bin/visual-check.mjs +829 -0
- package/skills/global_config/archify/brand-marks/README.md +31 -0
- package/skills/global_config/archify/brand-marks/catalog.json +131 -0
- package/skills/global_config/archify/delta/architecture-delta.mjs +1232 -0
- package/skills/global_config/archify/examples/agent-run.lifecycle.json +60 -0
- package/skills/global_config/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/global_config/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/global_config/archify/examples/brand-aware-delivery.architecture.json +47 -0
- package/skills/global_config/archify/examples/cache-miss-request.sequence.json +82 -0
- package/skills/global_config/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/global_config/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/global_config/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/global_config/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/global_config/archify/examples/incident-response.workflow.json +64 -0
- package/skills/global_config/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/global_config/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/global_config/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/global_config/archify/examples/web-app.architecture.json +46 -0
- package/skills/global_config/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/global_config/archify/package.json +39 -0
- package/skills/global_config/archify/recipes/scenarios.mjs +391 -0
- package/skills/global_config/archify/references/authoring-contract.md +247 -0
- package/skills/global_config/archify/references/brand-marks.md +65 -0
- package/skills/global_config/archify/references/delivery-contract.md +138 -0
- package/skills/global_config/archify/references/viewer-runtime.md +45 -0
- package/skills/global_config/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/global_config/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/global_config/archify/renderers/dataflow/README.md +104 -0
- package/skills/global_config/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/global_config/archify/renderers/lifecycle/README.md +115 -0
- package/skills/global_config/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/global_config/archify/renderers/sequence/README.md +114 -0
- package/skills/global_config/archify/renderers/sequence/render-sequence.mjs +464 -0
- package/skills/global_config/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/global_config/archify/renderers/shared/cli.mjs +218 -0
- package/skills/global_config/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/global_config/archify/renderers/shared/diagnostics.mjs +160 -0
- package/skills/global_config/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/global_config/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/global_config/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/global_config/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/global_config/archify/renderers/shared/i18n.mjs +595 -0
- package/skills/global_config/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/global_config/archify/renderers/shared/legend.mjs +217 -0
- package/skills/global_config/archify/renderers/shared/output-path.mjs +340 -0
- package/skills/global_config/archify/renderers/shared/repository-evidence.mjs +239 -0
- package/skills/global_config/archify/renderers/shared/repository-location.mjs +58 -0
- package/skills/global_config/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/global_config/archify/renderers/shared/utils.mjs +232 -0
- package/skills/global_config/archify/renderers/shared/validator.mjs +86 -0
- package/skills/global_config/archify/renderers/workflow/README.md +223 -0
- package/skills/global_config/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/global_config/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/global_config/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/global_config/archify/schemas/README.md +211 -0
- package/skills/global_config/archify/schemas/architecture.schema.json +178 -0
- package/skills/global_config/archify/schemas/common.schema.json +115 -0
- package/skills/global_config/archify/schemas/dataflow.schema.json +243 -0
- package/skills/global_config/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/global_config/archify/schemas/sequence.schema.json +223 -0
- package/skills/global_config/archify/schemas/workflow.schema.json +428 -0
- package/skills/global_config/archify/scripts/check-render-output.mjs +916 -0
- package/skills/global_config/archify/scripts/generate-brand-marks.mjs +141 -0
- package/skills/global_config/archify/scripts/generate-validators.mjs +66 -0
- package/skills/global_config/archify/scripts/render-examples.mjs +26 -0
- package/skills/global_config/archify/skill-release.json +10 -0
- package/skills/global_config/bdb-security-audit/SKILL.md +109 -0
- package/skills/global_config/bdb-security-audit/references/audit-checklists.md +172 -0
- package/skills/global_config/bdb-security-audit/references/skylos-guide.md +139 -0
- package/skills/global_config/bdb-security-audit/references/xalgorix-bridge.md +110 -0
- package/skills/global_config/bdbdesignpro/SKILL.md +4 -4
- package/skills/global_config/bdbdesignpro/references/bdb-motion-tokens.md +52 -31
- package/skills/global_config/bdbresilience/SKILL.md +10 -0
- package/skills/global_config/brag/SKILL.md +179 -0
- package/skills/global_config/brag/assets/music/README.md +20 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-place-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-place-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-place-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-place-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/bong_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_005.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/drop_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/drop_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/drop_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/error_005.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/error_006.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/glitch_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/glitch_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/select_008.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_005.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_006.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_007.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
- package/skills/global_config/brag/assets/sfx/sfx-analysis.json +15584 -0
- package/skills/global_config/brag/assets/sfx/sfx-analysis.md +75 -0
- package/skills/global_config/brag/assets/sfx/ui/click1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/click2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/click3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/click4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/click5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/rollover1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/rollover2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/rollover4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/rollover5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch10.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch11.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch12.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch13.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch14.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch15.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch16.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch17.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch18.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch19.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch20.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch21.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch22.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch23.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch24.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch25.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch26.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch27.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch28.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch29.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch30.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch31.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch32.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch33.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch34.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch35.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch36.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch37.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch38.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch6.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch7.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch8.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch9.ogg +0 -0
- package/skills/global_config/brag/references/audio.md +307 -0
- package/skills/global_config/brag/references/step-1-inspect.md +133 -0
- package/skills/global_config/brag/references/step-2-plan.md +234 -0
- package/skills/global_config/brag/references/step-3-compose.md +210 -0
- package/skills/global_config/brag/references/step-4-deliver.md +168 -0
- package/skills/global_config/brag/references/tones.md +231 -0
- package/skills/global_config/brag/scripts/analyze_music_cues.py +309 -0
- package/skills/global_config/brag/scripts/pyproject.toml +14 -0
- package/skills/global_config/brag/scripts/uv.lock +819 -0
- package/skills/global_config/deja-memory/SKILL.md +42 -0
- package/skills/global_config/editable-design/LICENSE +202 -0
- package/skills/global_config/editable-design/README.md +34 -0
- package/skills/global_config/editable-design/SKILL.md +630 -0
- package/skills/global_config/editable-design/THIRD_PARTY_NOTICES.md +10 -0
- package/skills/global_config/editable-design/agents/openai.yaml +4 -0
- package/skills/global_config/editable-design/assets/editor/layer-editor.css +262 -0
- package/skills/global_config/editable-design/assets/editor/layer-editor.js +1929 -0
- package/skills/global_config/editable-design/assets/poster-starter/README.md +92 -0
- package/skills/global_config/editable-design/assets/poster-starter/assets/.gitkeep +0 -0
- package/skills/global_config/editable-design/assets/poster-starter/index.html +91 -0
- package/skills/global_config/editable-design/assets/poster-starter/poster.json +6 -0
- package/skills/global_config/editable-design/assets/poster-starter/reference/.gitkeep +1 -0
- package/skills/global_config/editable-design/assets/replay/icons/assets.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/html.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/input.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/layers.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/plan.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/reference.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/review.png +0 -0
- package/skills/global_config/editable-design/assets/replay/index.html +59 -0
- package/skills/global_config/editable-design/assets/replay/replay-motion.js +410 -0
- package/skills/global_config/editable-design/assets/replay/replay.css +380 -0
- package/skills/global_config/editable-design/assets/replay/replay.js +374 -0
- package/skills/global_config/editable-design/font-kit/package-lock.json +115 -0
- package/skills/global_config/editable-design/font-kit/package.json +19 -0
- package/skills/global_config/editable-design/pack.sh +20 -0
- package/skills/global_config/editable-design/references/asset-architecture.md +72 -0
- package/skills/global_config/editable-design/references/editor-pitfalls.md +70 -0
- package/skills/global_config/editable-design/references/editor-runtime.md +131 -0
- package/skills/global_config/editable-design/references/font-system.md +89 -0
- package/skills/global_config/editable-design/references/imagery.md +145 -0
- package/skills/global_config/editable-design/references/layout-typography.md +116 -0
- package/skills/global_config/editable-design/references/replay-contract.md +169 -0
- package/skills/global_config/editable-design/scripts/_browser.mjs +247 -0
- package/skills/global_config/editable-design/scripts/bake.mjs +87 -0
- package/skills/global_config/editable-design/scripts/build-replay.mjs +316 -0
- package/skills/global_config/editable-design/scripts/check-contract.mjs +293 -0
- package/skills/global_config/editable-design/scripts/check-fonts.sh +252 -0
- package/skills/global_config/editable-design/scripts/check-poster.sh +70 -0
- package/skills/global_config/editable-design/scripts/doctor.sh +78 -0
- package/skills/global_config/editable-design/scripts/explode.mjs +115 -0
- package/skills/global_config/editable-design/scripts/font-kit.mjs +187 -0
- package/skills/global_config/editable-design/scripts/import-asset.sh +23 -0
- package/skills/global_config/editable-design/scripts/init-poster.sh +64 -0
- package/skills/global_config/editable-design/scripts/install-font-kit.sh +13 -0
- package/skills/global_config/editable-design/scripts/package-lock.json +334 -0
- package/skills/global_config/editable-design/scripts/package.json +14 -0
- package/skills/global_config/editable-design/scripts/remove-chroma-key.py +201 -0
- package/skills/global_config/editable-design/scripts/render-poster.sh +202 -0
- package/skills/global_config/editable-design/scripts/trace.sh +159 -0
- package/skills/global_config/editable-design/scripts/verify-replay.mjs +97 -0
- package/skills/global_config/editable-design/scripts/verify.mjs +782 -0
- package/skills/global_config/editable-design/scripts/wire-editor.mjs +104 -0
- package/skills/global_config/editable-design/tests/fixtures/small-explode/index.html +86 -0
- package/skills/global_config/plan-canvas/SKILL.md +8 -0
package/installer.js
CHANGED
|
@@ -1828,6 +1828,50 @@ function moduleBasePath() {
|
|
|
1828
1828
|
return scriptDir.includes('_npx') ? path.join(os.homedir(), '.agents') : path.dirname(srcDir);
|
|
1829
1829
|
}
|
|
1830
1830
|
|
|
1831
|
+
// deja resolves its exclude file as $XDG_CONFIG_HOME/deja/exclude, falling
|
|
1832
|
+
// back to $HOME/.config on ALL platforms including Windows -- do not switch
|
|
1833
|
+
// this to os.UserConfigDir()/APPDATA, deja would never read that file there.
|
|
1834
|
+
function ensureDejaExclude(excludePath) {
|
|
1835
|
+
fs.mkdirSync(path.dirname(excludePath), { recursive: true });
|
|
1836
|
+
let existing = '';
|
|
1837
|
+
if (fs.existsSync(excludePath)) {
|
|
1838
|
+
existing = fs.readFileSync(excludePath, 'utf8');
|
|
1839
|
+
}
|
|
1840
|
+
// deja skips comment lines when matching, so a '# secret' line does not
|
|
1841
|
+
// count as the pattern being present. Only a line trimming to exactly
|
|
1842
|
+
// 'secret' counts -- never rewrite, reorder or deduplicate user lines.
|
|
1843
|
+
if (existing.split(/\r?\n/).some(line => line.trim() === 'secret')) return false;
|
|
1844
|
+
let content = existing;
|
|
1845
|
+
if (content.length > 0 && !content.endsWith('\n')) content += '\n';
|
|
1846
|
+
fs.writeFileSync(excludePath, `${content}secret\n`);
|
|
1847
|
+
return true;
|
|
1848
|
+
}
|
|
1849
|
+
|
|
1850
|
+
async function installDeja() {
|
|
1851
|
+
if (DRY_RUN) {
|
|
1852
|
+
log.step('[dry-run] would install deja-vu 0.21.1 globally and add its exclude pattern');
|
|
1853
|
+
return;
|
|
1854
|
+
}
|
|
1855
|
+
try {
|
|
1856
|
+
log.step('Installing deja-vu session memory...');
|
|
1857
|
+
execSync('npm install -g @vshulcz/deja-vu@0.21.1', { stdio: 'ignore' });
|
|
1858
|
+
} catch (e) {
|
|
1859
|
+
log.warn('deja-vu install failed. Install later with: npm install -g @vshulcz/deja-vu@0.21.1');
|
|
1860
|
+
}
|
|
1861
|
+
if (!hasExecutable('deja')) {
|
|
1862
|
+
log.warn('deja is not on PATH. Install it with: npm install -g @vshulcz/deja-vu@0.21.1');
|
|
1863
|
+
}
|
|
1864
|
+
const base = process.env.XDG_CONFIG_HOME || path.join(homeDir, '.config');
|
|
1865
|
+
const excludePath = path.join(base, 'deja', 'exclude');
|
|
1866
|
+
try {
|
|
1867
|
+
if (ensureDejaExclude(excludePath)) {
|
|
1868
|
+
log.step(`Added 'secret' to the deja exclude list at ${excludePath}`);
|
|
1869
|
+
}
|
|
1870
|
+
} catch (e) {
|
|
1871
|
+
log.warn(`Could not update the deja exclude list at ${excludePath}: ${e.message}. Add the line 'secret' to it by hand.`);
|
|
1872
|
+
}
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1831
1875
|
async function installMemB(interactive) {
|
|
1832
1876
|
let installWebUI = true;
|
|
1833
1877
|
if (interactive && !isAutoYes) {
|
|
@@ -1845,6 +1889,7 @@ async function installMemB(interactive) {
|
|
|
1845
1889
|
log.warn('Skipping memB setup: the module could not be downloaded.');
|
|
1846
1890
|
return;
|
|
1847
1891
|
}
|
|
1892
|
+
await installDeja();
|
|
1848
1893
|
if (DRY_RUN) {
|
|
1849
1894
|
log.step('[dry-run] would bootstrap memB venv + pip requirements');
|
|
1850
1895
|
return;
|
|
@@ -2546,6 +2591,11 @@ function verifyEcosystemInstallation() {
|
|
|
2546
2591
|
console.log(` • ${colors.bold}${mod.name.padEnd(35)}${colors.reset} ➔ ${colors.dim}⚪ Optional / Not downloaded${colors.reset}`);
|
|
2547
2592
|
}
|
|
2548
2593
|
}
|
|
2594
|
+
|
|
2595
|
+
console.log('');
|
|
2596
|
+
console.log(` ${colors.bold}━━━ BDB Agent OS Dashboard ━━━${colors.reset}`);
|
|
2597
|
+
console.log(` Interactive Control Center: npx aos-dashboard`);
|
|
2598
|
+
console.log(` ${colors.dim}(Live status & service control at http://127.0.0.1:7900)${colors.reset}`);
|
|
2549
2599
|
}
|
|
2550
2600
|
|
|
2551
2601
|
function resolveTargetPaths(platformValue, customPaths) {
|
|
@@ -2841,6 +2891,13 @@ async function installMcpsForTarget(paths, ctx) {
|
|
|
2841
2891
|
const skippedMcpConfigKeys = resolveUnsupportedMcpConfigKeys();
|
|
2842
2892
|
try {
|
|
2843
2893
|
const parsedMcpConfig = JSON.parse(mcpConfigStr);
|
|
2894
|
+
// npm's Windows shim is deja.cmd, which Node refuses to spawn without
|
|
2895
|
+
// a shell (EINVAL since the CVE-2024-27980 fix) -- wrap the command in
|
|
2896
|
+
// cmd /c here so every generated config, the Codex TOML block and the
|
|
2897
|
+
// ~/.claude.json mirror get the launchable form.
|
|
2898
|
+
if (process.platform === 'win32' && parsedMcpConfig.mcpServers.deja) {
|
|
2899
|
+
parsedMcpConfig.mcpServers.deja = { command: 'cmd', args: ['/c', 'deja', 'mcp'] };
|
|
2900
|
+
}
|
|
2844
2901
|
const finalMcpServers = {};
|
|
2845
2902
|
const availableFolders = fs.readdirSync(mcpSrcDir);
|
|
2846
2903
|
|
|
@@ -2898,7 +2955,7 @@ async function installMcpsForTarget(paths, ctx) {
|
|
|
2898
2955
|
? path.join(mcpCodeTarget, 'memb-mcp', '.venv', 'Scripts', 'python.exe')
|
|
2899
2956
|
: path.join(mcpCodeTarget, 'memb-mcp', '.venv', 'bin', 'python');
|
|
2900
2957
|
const pythonBinValue = pythonBinPath.split('\\').join('/');
|
|
2901
|
-
const geminiKeyValue = creds.gemini || process.env.GEMINI_API_KEY || '';
|
|
2958
|
+
const geminiKeyValue = (creds.keyEnvName === 'GEMINI_API_KEY' ? creds.gemini : '') || process.env.GEMINI_API_KEY || '';
|
|
2902
2959
|
mcpConfigStr = mcpConfigStr.replace(/__PYTHON_BIN__/g, () => JSON.stringify(pythonBinValue).slice(1, -1));
|
|
2903
2960
|
mcpConfigStr = mcpConfigStr.replace(/__GEMINI_API_KEY__/g, () => JSON.stringify(geminiKeyValue).slice(1, -1));
|
|
2904
2961
|
}
|
|
@@ -2934,39 +2991,12 @@ async function installMcpsForTarget(paths, ctx) {
|
|
|
2934
2991
|
if (!mcpTemplate.ok) {
|
|
2935
2992
|
log.warn(`No MCP config was written: the template could not be read. ${configName} left untouched.`);
|
|
2936
2993
|
} else if (isTomlConfig) {
|
|
2937
|
-
const snippetPath = `${paths.mcpConfigPath}.bdb-mcp-servers.toml`;
|
|
2938
|
-
const tomlKey = (k) => (/^[A-Za-z0-9_-]+$/.test(k) ? k : JSON.stringify(k));
|
|
2939
|
-
const tomlValue = (v) => {
|
|
2940
|
-
if (Array.isArray(v)) return `[${v.map(tomlValue).join(', ')}]`;
|
|
2941
|
-
if (v && typeof v === 'object') {
|
|
2942
|
-
const pairs = Object.entries(v).map(([k, x]) => `${tomlKey(k)} = ${tomlValue(x)}`);
|
|
2943
|
-
return `{ ${pairs.join(', ')} }`;
|
|
2944
|
-
}
|
|
2945
|
-
if (typeof v === 'number' || typeof v === 'boolean') return String(v);
|
|
2946
|
-
return JSON.stringify(String(v));
|
|
2947
|
-
};
|
|
2948
2994
|
try {
|
|
2949
|
-
const
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
Object.entries(cfg || {}).forEach(([k, v]) => rows.push(`${tomlKey(k)} = ${tomlValue(v)}`));
|
|
2953
|
-
return rows.join('\n');
|
|
2954
|
-
});
|
|
2955
|
-
const snippet = [
|
|
2956
|
-
'# BDB MCP servers for Codex, generated by installer.beta.js.',
|
|
2957
|
-
`# Append these tables to ${configName}; if you ran the installer`,
|
|
2958
|
-
'# before, replace the [mcp_servers.*] tables of the same name',
|
|
2959
|
-
'# instead of adding them a second time.',
|
|
2960
|
-
'',
|
|
2961
|
-
tables.join('\n\n'),
|
|
2962
|
-
''
|
|
2963
|
-
].join('\n');
|
|
2964
|
-
// Snippets can embed injected API keys — keep them user-readable only.
|
|
2965
|
-
fs.writeFileSync(snippetPath, snippet, { mode: 0o600 });
|
|
2966
|
-
try { fs.chmodSync(snippetPath, 0o600); } catch (e) { logDebug(e, 'chmod snippetPath'); }
|
|
2967
|
-
log.warn(`${configName} is TOML; written as snippet instead: ${snippetPath}`);
|
|
2995
|
+
const skipped = mergeCodexTomlMcpServers(paths.mcpConfigPath, JSON.parse(mcpConfigStr).mcpServers || {});
|
|
2996
|
+
log.step(`Merged BDB MCP servers into ${configName}`);
|
|
2997
|
+
if (skipped.length) log.step(`Kept your own entries for: ${skipped.join(', ')}`);
|
|
2968
2998
|
} catch (e) {
|
|
2969
|
-
log.warn(`Could not
|
|
2999
|
+
log.warn(`Could not merge MCP servers into ${configName}: ${e.message}`);
|
|
2970
3000
|
}
|
|
2971
3001
|
} else if (mode === 'merge' && fs.existsSync(paths.mcpConfigPath) && !existingConfigIsEmpty()) {
|
|
2972
3002
|
const oldConfig = readJsonFile(paths.mcpConfigPath);
|
|
@@ -3559,6 +3589,51 @@ function installGlobalHooks() {
|
|
|
3559
3589
|
log.warn(`Could not install OpenCode plugin: ${e.message}`);
|
|
3560
3590
|
}
|
|
3561
3591
|
}
|
|
3592
|
+
|
|
3593
|
+
// 5. Global CLI launcher binaries (aos-config, aos-dashboard, aos-uninstall)
|
|
3594
|
+
installGlobalBinaries();
|
|
3595
|
+
}
|
|
3596
|
+
|
|
3597
|
+
function installGlobalBinaries() {
|
|
3598
|
+
const binSrc = path.join(srcDir, 'bin');
|
|
3599
|
+
const globalAgentsBin = path.join(homeDir, '.agents', 'bin');
|
|
3600
|
+
if (fs.existsSync(binSrc)) {
|
|
3601
|
+
copyDirRecursiveSync(binSrc, globalAgentsBin);
|
|
3602
|
+
log.step(`Installed CLI binaries to ${globalAgentsBin}`);
|
|
3603
|
+
}
|
|
3604
|
+
|
|
3605
|
+
const localBinDir = path.join(homeDir, '.local', 'bin');
|
|
3606
|
+
if (!fs.existsSync(localBinDir)) {
|
|
3607
|
+
try { fs.mkdirSync(localBinDir, { recursive: true }); } catch (e) { logDebug(e, 'mkdir localBin'); }
|
|
3608
|
+
}
|
|
3609
|
+
|
|
3610
|
+
const isWin = process.platform === 'win32';
|
|
3611
|
+
const cliBins = ['aos-config', 'aos-dashboard', 'aos-uninstall'];
|
|
3612
|
+
|
|
3613
|
+
for (const name of cliBins) {
|
|
3614
|
+
const targetMjs = path.join(globalAgentsBin, `${name}.mjs`);
|
|
3615
|
+
if (!fs.existsSync(targetMjs)) continue;
|
|
3616
|
+
|
|
3617
|
+
// Shell wrapper for Unix / Git Bash
|
|
3618
|
+
const shPath = path.join(localBinDir, name);
|
|
3619
|
+
const shContent = `#!/bin/sh\nexec node "${targetMjs}" "$@"\n`;
|
|
3620
|
+
try {
|
|
3621
|
+
fs.writeFileSync(shPath, shContent, { mode: 0o755 });
|
|
3622
|
+
try { fs.chmodSync(shPath, 0o755); } catch (e) { logDebug(e, `chmod ${shPath}`); }
|
|
3623
|
+
} catch (e) { logDebug(e, `write ${shPath}`); }
|
|
3624
|
+
|
|
3625
|
+
// Windows CMD and PowerShell launchers
|
|
3626
|
+
if (isWin) {
|
|
3627
|
+
const cmdPath = path.join(localBinDir, `${name}.cmd`);
|
|
3628
|
+
const cmdContent = `@echo off\r\nnode "${targetMjs}" %*\r\n`;
|
|
3629
|
+
try { fs.writeFileSync(cmdPath, cmdContent); } catch (e) { logDebug(e, `write ${cmdPath}`); }
|
|
3630
|
+
|
|
3631
|
+
const ps1Path = path.join(localBinDir, `${name}.ps1`);
|
|
3632
|
+
const ps1Content = `node "${targetMjs}" $args\r\n`;
|
|
3633
|
+
try { fs.writeFileSync(ps1Path, ps1Content); } catch (e) { logDebug(e, `write ${ps1Path}`); }
|
|
3634
|
+
}
|
|
3635
|
+
}
|
|
3636
|
+
log.step(`Wired CLI launcher binaries (aos-config, aos-dashboard, aos-uninstall) in ${localBinDir}`);
|
|
3562
3637
|
}
|
|
3563
3638
|
|
|
3564
3639
|
// Merge the BDB hooks -- the two gates plus the memB ambient-memory hook --
|
|
@@ -3576,13 +3651,14 @@ function installGlobalHooks() {
|
|
|
3576
3651
|
// merged result goes to a .bdb-new.json sidecar -- the same recovery pattern
|
|
3577
3652
|
// the MCP config merge in installMcpsForTarget uses.
|
|
3578
3653
|
function mergeBdbSettingsHooks(settingsPath, { projectLocal = false } = {}) {
|
|
3579
|
-
const bdbHookScripts = ['go-gate.mjs', 'graph-gate.mjs', 'memb-inject.mjs'];
|
|
3654
|
+
const bdbHookScripts = ['go-gate.mjs', 'graph-gate.mjs', 'memb-inject.mjs', 'trail-relay.mjs'];
|
|
3580
3655
|
// memb-inject reads the machine-global memB store under $HOME and is
|
|
3581
3656
|
// installed once per machine, so it stays $HOME-anchored even inside a
|
|
3582
3657
|
// project harness -- unlike the two gate hooks, which are per-checkout by
|
|
3583
3658
|
// design. Pointing it at $CLAUDE_PROJECT_DIR would make it fail on every
|
|
3584
|
-
// prompt in any project the harness was never installed into.
|
|
3585
|
-
|
|
3659
|
+
// prompt in any project the harness was never installed into. trail-relay
|
|
3660
|
+
// talks to machine-global live-map daemons, so it is anchored the same way.
|
|
3661
|
+
const machineGlobalHooks = ['memb-inject.mjs', 'trail-relay.mjs'];
|
|
3586
3662
|
const isBdbEntry = (entry) => {
|
|
3587
3663
|
const cmds = (entry && Array.isArray(entry.hooks) ? entry.hooks : [])
|
|
3588
3664
|
.map((h) => (h && typeof h.command === 'string' ? h.command : ''))
|
|
@@ -3647,7 +3723,7 @@ function mergeBdbSettingsHooks(settingsPath, { projectLocal = false } = {}) {
|
|
|
3647
3723
|
// Merge the BDB hooks into Google Antigravity's hooks.json (.agents/hooks.json or
|
|
3648
3724
|
// ~/.gemini/config/hooks.json), preserving user-defined foreign hooks.
|
|
3649
3725
|
function mergeAntigravityHooks(hooksPath, { projectLocal = false } = {}) {
|
|
3650
|
-
const bdbHookScripts = ['go-gate.mjs', 'graph-gate.mjs', 'memb-inject.mjs', 'startcycle-dispatch.mjs'];
|
|
3726
|
+
const bdbHookScripts = ['go-gate.mjs', 'graph-gate.mjs', 'memb-inject.mjs', 'startcycle-dispatch.mjs', 'trail-relay.mjs'];
|
|
3651
3727
|
const isBdbEntry = (entry) => {
|
|
3652
3728
|
const cmds = (entry && Array.isArray(entry.hooks) ? entry.hooks : [entry])
|
|
3653
3729
|
.map((h) => (h && typeof h.command === 'string' ? h.command : (typeof h === 'string' ? h : '')))
|
|
@@ -3665,11 +3741,17 @@ function mergeAntigravityHooks(hooksPath, { projectLocal = false } = {}) {
|
|
|
3665
3741
|
{
|
|
3666
3742
|
matcher: "run_command|Bash",
|
|
3667
3743
|
hooks: [{ type: "command", command: `node "${path.join(hooksDir, 'go-gate.mjs')}"`, timeout: 10000 }]
|
|
3744
|
+
},
|
|
3745
|
+
{
|
|
3746
|
+
hooks: [{ type: "command", command: `node "${path.join(globalHooksDir, 'trail-relay.mjs')}" --agent agy --event PreToolUse`, timeout: 2000 }]
|
|
3668
3747
|
}
|
|
3669
3748
|
],
|
|
3670
3749
|
Stop: [
|
|
3671
3750
|
{
|
|
3672
3751
|
hooks: [{ type: "command", command: `node "${path.join(hooksDir, 'graph-gate.mjs')}"`, timeout: 10000 }]
|
|
3752
|
+
},
|
|
3753
|
+
{
|
|
3754
|
+
hooks: [{ type: "command", command: `node "${path.join(globalHooksDir, 'trail-relay.mjs')}" --agent agy --event Stop`, timeout: 2000 }]
|
|
3673
3755
|
}
|
|
3674
3756
|
],
|
|
3675
3757
|
PreInvocation: [
|
|
@@ -3726,6 +3808,46 @@ function mergeAntigravityHooks(hooksPath, { projectLocal = false } = {}) {
|
|
|
3726
3808
|
}
|
|
3727
3809
|
}
|
|
3728
3810
|
|
|
3811
|
+
// Writes the AOS MCP servers into Codex's config.toml between AOS:MCP markers,
|
|
3812
|
+
// replacing the block on re-runs. A server the user already declared outside the
|
|
3813
|
+
// block is skipped: a second [mcp_servers.<name>] table would make the file invalid TOML.
|
|
3814
|
+
function mergeCodexTomlMcpServers(configTomlPath, servers) {
|
|
3815
|
+
const tomlKey = (k) => (/^[A-Za-z0-9_-]+$/.test(k) ? k : JSON.stringify(k));
|
|
3816
|
+
const tomlValue = (v) => {
|
|
3817
|
+
if (Array.isArray(v)) return `[${v.map(tomlValue).join(', ')}]`;
|
|
3818
|
+
if (v && typeof v === 'object') {
|
|
3819
|
+
const pairs = Object.entries(v).map(([k, x]) => `${tomlKey(k)} = ${tomlValue(x)}`);
|
|
3820
|
+
return `{ ${pairs.join(', ')} }`;
|
|
3821
|
+
}
|
|
3822
|
+
if (typeof v === 'number' || typeof v === 'boolean') return String(v);
|
|
3823
|
+
return JSON.stringify(String(v));
|
|
3824
|
+
};
|
|
3825
|
+
let content = fs.existsSync(configTomlPath) ? fs.readFileSync(configTomlPath, 'utf8') : '';
|
|
3826
|
+
const blockRegex = /# AOS:MCP:START[\s\S]*?# AOS:MCP:END\n?/;
|
|
3827
|
+
const outside = content.replace(blockRegex, '');
|
|
3828
|
+
const tables = [];
|
|
3829
|
+
const skipped = [];
|
|
3830
|
+
Object.entries(servers || {}).forEach(([name, cfg]) => {
|
|
3831
|
+
const header = `[mcp_servers.${tomlKey(name)}]`;
|
|
3832
|
+
const headerRegex = new RegExp(`^${header.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*$`, 'm');
|
|
3833
|
+
if (headerRegex.test(outside)) { skipped.push(name); return; }
|
|
3834
|
+
const rows = [header];
|
|
3835
|
+
Object.entries(cfg || {}).forEach(([k, v]) => rows.push(`${tomlKey(k)} = ${tomlValue(v)}`));
|
|
3836
|
+
tables.push(rows.join('\n'));
|
|
3837
|
+
});
|
|
3838
|
+
const block = ['# AOS:MCP:START', tables.join('\n\n'), '# AOS:MCP:END'].join('\n');
|
|
3839
|
+
if (blockRegex.test(content)) {
|
|
3840
|
+
content = content.replace(blockRegex, `${block}\n`);
|
|
3841
|
+
} else if (content.length) {
|
|
3842
|
+
content = `${content.trimEnd()}\n\n${block}\n`;
|
|
3843
|
+
} else {
|
|
3844
|
+
content = `${block}\n`;
|
|
3845
|
+
}
|
|
3846
|
+
fs.writeFileSync(configTomlPath, content, { mode: 0o600 });
|
|
3847
|
+
try { fs.chmodSync(configTomlPath, 0o600); } catch (e) { logDebug(e, 'chmod configTomlPath'); }
|
|
3848
|
+
return skipped;
|
|
3849
|
+
}
|
|
3850
|
+
|
|
3729
3851
|
// Merge the BDB hooks into ChatGPT Codex CLI's config.toml (~/.codex/config.toml or
|
|
3730
3852
|
// .codex/config.toml), ensuring [features] hooks = true and preserving existing
|
|
3731
3853
|
// non-BDB settings, comments, and MCP servers.
|
|
@@ -3756,11 +3878,29 @@ function mergeCodexTomlHooks(configTomlPath, { projectLocal = false } = {}) {
|
|
|
3756
3878
|
`command = ${JSON.stringify(`node "${path.join(globalHooksDir, 'memb-inject.mjs')}"`)}`,
|
|
3757
3879
|
'timeout = 30',
|
|
3758
3880
|
'',
|
|
3881
|
+
'[[hooks.SessionStart]]',
|
|
3882
|
+
'[[hooks.SessionStart.hooks]]',
|
|
3883
|
+
'type = "command"',
|
|
3884
|
+
`command = ${JSON.stringify(`node "${path.join(globalHooksDir, 'memb-inject.mjs')}"`)}`,
|
|
3885
|
+
'timeout = 30',
|
|
3886
|
+
'',
|
|
3759
3887
|
'[[hooks.UserPromptSubmit]]',
|
|
3760
3888
|
'[[hooks.UserPromptSubmit.hooks]]',
|
|
3761
3889
|
'type = "command"',
|
|
3762
3890
|
`command = ${JSON.stringify(`node "${path.join(workflowsDir, 'startcycle-dispatch.mjs')}"`)}`,
|
|
3763
3891
|
'timeout = 30',
|
|
3892
|
+
'',
|
|
3893
|
+
'[[hooks.PreToolUse]]',
|
|
3894
|
+
'[[hooks.PreToolUse.hooks]]',
|
|
3895
|
+
'type = "command"',
|
|
3896
|
+
`command = ${JSON.stringify(`node "${path.join(globalHooksDir, 'trail-relay.mjs')}" --agent codex --event PreToolUse`)}`,
|
|
3897
|
+
'timeout = 2',
|
|
3898
|
+
'',
|
|
3899
|
+
'[[hooks.Stop]]',
|
|
3900
|
+
'[[hooks.Stop.hooks]]',
|
|
3901
|
+
'type = "command"',
|
|
3902
|
+
`command = ${JSON.stringify(`node "${path.join(globalHooksDir, 'trail-relay.mjs')}" --agent codex --event Stop`)}`,
|
|
3903
|
+
'timeout = 2',
|
|
3764
3904
|
'# AOS:HOOKS:END'
|
|
3765
3905
|
].join('\n');
|
|
3766
3906
|
|
|
@@ -3877,6 +4017,9 @@ async function promptMcpSelection(tier) {
|
|
|
3877
4017
|
.map(d => d.name);
|
|
3878
4018
|
} catch (e) { return []; }
|
|
3879
4019
|
|
|
4020
|
+
// memb-mcp ships via npm, not as a folder under mcps/, so readdir never lists it.
|
|
4021
|
+
if (!availableMcps.includes(CORE_MCP)) availableMcps.push(CORE_MCP);
|
|
4022
|
+
|
|
3880
4023
|
if (tier === '2') {
|
|
3881
4024
|
const basicMcps = ['computer-use-mcp', 'memb-mcp', 'windows-computer-use-mcp'];
|
|
3882
4025
|
availableMcps = availableMcps.filter(m => basicMcps.includes(m));
|
|
@@ -3954,26 +4097,59 @@ async function promptOptionalModules(installedModules) {
|
|
|
3954
4097
|
return chosen;
|
|
3955
4098
|
}
|
|
3956
4099
|
|
|
3957
|
-
|
|
4100
|
+
// Module ids whose daemons ship a web interface or background service worth
|
|
4101
|
+
// surfacing in the launchpad (each has a card in the generated HTML below).
|
|
4102
|
+
const LAUNCHPAD_WEB_MODULES = ['memb', 'synapse', 'openwiki', 'ao', 'remote'];
|
|
4103
|
+
|
|
4104
|
+
// Explicit opt-in flags that open the launchpad even outside a dev checkout.
|
|
4105
|
+
const LAUNCHPAD_OPEN_FLAGS = ['--launchpad', '--dashboard', '--open', '--dev'];
|
|
4106
|
+
|
|
4107
|
+
// True on a local BDB dev checkout (or BDB_DEV=1). This is intentionally
|
|
4108
|
+
// narrower than the old isDevWorkflow check: CLI flags live in
|
|
4109
|
+
// shouldOpenLaunchpad(), not here, so callers can tell "dev machine" apart
|
|
4110
|
+
// from "user asked for it". Overrides exist for tests.
|
|
4111
|
+
function isDevEnvironment(overrides = {}) {
|
|
4112
|
+
const home = overrides.homeDir || homeDir;
|
|
4113
|
+
const env = overrides.env || process.env;
|
|
4114
|
+
return fs.existsSync(path.join(home, 'dev', 'bdb-dev')) ||
|
|
4115
|
+
fs.existsSync(path.join(home, 'bdb-dev')) ||
|
|
4116
|
+
env.BDB_DEV === '1';
|
|
4117
|
+
}
|
|
4118
|
+
|
|
4119
|
+
// True when the launchpad should be generated and opened: a dev checkout, an
|
|
4120
|
+
// explicit flag, or installed daemon/WebUI modules. Overrides exist for tests.
|
|
4121
|
+
function shouldOpenLaunchpad(installedModules = [], overrides = {}) {
|
|
4122
|
+
const argv = overrides.argv || process.argv;
|
|
4123
|
+
if (isDevEnvironment(overrides)) return true;
|
|
4124
|
+
if (LAUNCHPAD_OPEN_FLAGS.some(f => argv.includes(f))) return true;
|
|
4125
|
+
const installed = Array.isArray(installedModules) ? installedModules : [];
|
|
4126
|
+
return installed.some(m => LAUNCHPAD_WEB_MODULES.includes(m));
|
|
4127
|
+
}
|
|
4128
|
+
|
|
4129
|
+
// Boot autostart (login item) is opt-in only: an explicit flag or a dev
|
|
4130
|
+
// checkout. Regular end-user installs must not get an autostart entry that
|
|
4131
|
+
// opens a browser on every login. Overrides exist for tests.
|
|
4132
|
+
function shouldAutostartLaunchpad(overrides = {}) {
|
|
4133
|
+
const argv = overrides.argv || process.argv;
|
|
4134
|
+
if (argv.includes('--autostart-launchpad')) return true;
|
|
4135
|
+
return isDevEnvironment(overrides);
|
|
4136
|
+
}
|
|
4137
|
+
|
|
4138
|
+
function generateAndOpenLaunchpad(installedModules = []) {
|
|
3958
4139
|
if (DRY_RUN) {
|
|
3959
4140
|
log.step('[dry-run] would generate & open BDB Launchpad HTML');
|
|
3960
|
-
return;
|
|
4141
|
+
return false;
|
|
3961
4142
|
}
|
|
3962
|
-
if (process.env.SSH_CLIENT || process.env.SSH_TTY) return;
|
|
4143
|
+
if (process.env.SSH_CLIENT || process.env.SSH_TTY) return false;
|
|
3963
4144
|
|
|
3964
|
-
//
|
|
3965
|
-
//
|
|
4145
|
+
// Decoupled from the dev-checkout layout: on a regular end-user machine
|
|
4146
|
+
// (no ~/dev/bdb-dev, no ~/bdb-dev) the launchpad still opens when daemon
|
|
4147
|
+
// modules are installed or an explicit flag was passed.
|
|
3966
4148
|
// ~/bdb-dev was the pre-reorg workspace root; the State-0 reorg moved it to
|
|
3967
|
-
// ~/dev/bdb-dev
|
|
3968
|
-
//
|
|
3969
|
-
|
|
3970
|
-
|
|
3971
|
-
fs.existsSync(path.join(homeDir, 'bdb-dev')) ||
|
|
3972
|
-
process.env.BDB_DEV === '1' ||
|
|
3973
|
-
process.argv.includes('--launchpad') ||
|
|
3974
|
-
process.argv.includes('--dev');
|
|
3975
|
-
if (!isDevWorkflow) {
|
|
3976
|
-
return;
|
|
4149
|
+
// ~/dev/bdb-dev. Both are checked so this works regardless of which layout
|
|
4150
|
+
// a given machine still has.
|
|
4151
|
+
if (!shouldOpenLaunchpad(installedModules)) {
|
|
4152
|
+
return false;
|
|
3977
4153
|
}
|
|
3978
4154
|
|
|
3979
4155
|
const html = `<!DOCTYPE html>
|
|
@@ -4309,6 +4485,12 @@ function generateAndOpenLaunchpad() {
|
|
|
4309
4485
|
// own background services, but the dashboard itself (a static file, not
|
|
4310
4486
|
// a process) never got the equivalent: something to open it automatically
|
|
4311
4487
|
// on login too, not just right after an installer run.
|
|
4488
|
+
// Opt-in only: without --autostart-launchpad (or a dev checkout) a regular
|
|
4489
|
+
// end-user install must not drop a login item that opens a browser on
|
|
4490
|
+
// every boot.
|
|
4491
|
+
if (!shouldAutostartLaunchpad()) {
|
|
4492
|
+
return true;
|
|
4493
|
+
}
|
|
4312
4494
|
if (process.platform === 'darwin') {
|
|
4313
4495
|
const plistPath = path.join(homeDir, 'Library', 'LaunchAgents', 'com.bdb.launchpad.plist');
|
|
4314
4496
|
const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -4344,9 +4526,10 @@ function generateAndOpenLaunchpad() {
|
|
|
4344
4526
|
fs.writeFileSync(vbsPath, vbsContent, 'utf-8');
|
|
4345
4527
|
} catch (e) { logDebug(e, 'launchpad autostart vbs'); }
|
|
4346
4528
|
}
|
|
4529
|
+
return true;
|
|
4347
4530
|
}
|
|
4348
4531
|
|
|
4349
|
-
async function universalHarnessSync(primaryMcpConfigPath) {
|
|
4532
|
+
async function universalHarnessSync(primaryMcpConfigPath, installedModules = []) {
|
|
4350
4533
|
log.info('Universal Agent Harness Sync...');
|
|
4351
4534
|
const detections = detectPlatforms();
|
|
4352
4535
|
let masterMcpData = {};
|
|
@@ -4381,7 +4564,7 @@ async function universalHarnessSync(primaryMcpConfigPath) {
|
|
|
4381
4564
|
// OpenCode provider APIs (e.g. OpenAI-compatible, Console) enforce tool name length limits
|
|
4382
4565
|
// (e.g. max 64 chars) and context limits. Loading 20+ MCPs causes provider errors (e.g. 73-char tool names).
|
|
4383
4566
|
// OpenCode uses a slim profile: only core servers (memb_mcp, zavora_computer_use) are enabled by default.
|
|
4384
|
-
const OPENCODE_DEFAULT_SLIM = new Set(['memb_mcp', 'zavora_computer_use']);
|
|
4567
|
+
const OPENCODE_DEFAULT_SLIM = new Set(['memb_mcp', 'zavora_computer_use', 'deja']);
|
|
4385
4568
|
const existingMcp = existing && existing.mcp ? existing.mcp : {};
|
|
4386
4569
|
const hasExistingKeys = Object.keys(existingMcp).length > 0;
|
|
4387
4570
|
|
|
@@ -4505,10 +4688,18 @@ async function universalHarnessSync(primaryMcpConfigPath) {
|
|
|
4505
4688
|
syncMcpConfig(path.join(homeDir, '.aider', 'mcp.json'));
|
|
4506
4689
|
} else if (d.key === 'opencode') {
|
|
4507
4690
|
syncOpencodeConfig(path.join(d.path, 'opencode.jsonc'));
|
|
4691
|
+
} else if (d.key === 'codex') {
|
|
4692
|
+
// Universal Sync never had a branch for Codex, so its config.toml
|
|
4693
|
+
// was never updated here even though the log claimed it was.
|
|
4694
|
+
try {
|
|
4695
|
+
mergeCodexTomlMcpServers(path.join(d.path, 'config.toml'), masterMcpData.mcpServers || {});
|
|
4696
|
+
} catch (e) {
|
|
4697
|
+
log.warn(`Failed to sync MCP to ${path.join(d.path, 'config.toml')}: ${e.message}`);
|
|
4698
|
+
}
|
|
4508
4699
|
}
|
|
4509
4700
|
}
|
|
4510
4701
|
log.success('Universal Sync Complete!');
|
|
4511
|
-
generateAndOpenLaunchpad();
|
|
4702
|
+
generateAndOpenLaunchpad(installedModules);
|
|
4512
4703
|
}
|
|
4513
4704
|
|
|
4514
4705
|
async function runQuickUpdate(installState) {
|
|
@@ -4614,7 +4805,7 @@ async function runQuickUpdate(installState) {
|
|
|
4614
4805
|
// did, so a dev-workflow machine only ever saw it once, on day one --
|
|
4615
4806
|
// every subsequent run is a Quick Update, which is what almost every
|
|
4616
4807
|
// real run after the first actually is.
|
|
4617
|
-
generateAndOpenLaunchpad();
|
|
4808
|
+
generateAndOpenLaunchpad(modulesToUpdate);
|
|
4618
4809
|
}
|
|
4619
4810
|
|
|
4620
4811
|
|
|
@@ -5013,7 +5204,7 @@ async function main() {
|
|
|
5013
5204
|
saveManifest({ tier, isUniversal: wantsUniversal, installedModules: installedModulesForPrompt });
|
|
5014
5205
|
|
|
5015
5206
|
if (wantsUniversal) {
|
|
5016
|
-
await universalHarnessSync(primaryTarget.mcpConfigPath);
|
|
5207
|
+
await universalHarnessSync(primaryTarget.mcpConfigPath, installedModulesForPrompt);
|
|
5017
5208
|
}
|
|
5018
5209
|
|
|
5019
5210
|
// Flush file-level install manifest after all writes are done.
|
|
@@ -5039,9 +5230,12 @@ module.exports = {
|
|
|
5039
5230
|
mergeAntigravityHooks,
|
|
5040
5231
|
mergeCodexTomlHooks,
|
|
5041
5232
|
mergeCodexHooks: mergeCodexTomlHooks,
|
|
5233
|
+
mergeCodexTomlMcpServers,
|
|
5042
5234
|
installGlobalHooks,
|
|
5043
5235
|
installProjectHarness,
|
|
5236
|
+
promptMcpSelection,
|
|
5044
5237
|
mirrorMcpServersTo,
|
|
5238
|
+
ensureDejaExclude,
|
|
5045
5239
|
// Manifest store (exported for verification tests)
|
|
5046
5240
|
computeFileHash,
|
|
5047
5241
|
getInstallManifestPath,
|
|
@@ -5061,4 +5255,11 @@ module.exports = {
|
|
|
5061
5255
|
loadPipelineConfig,
|
|
5062
5256
|
resolveAgentConfig,
|
|
5063
5257
|
CANONICAL_TIERS,
|
|
5258
|
+
// Launchpad lifecycle (exported for regression tests)
|
|
5259
|
+
generateAndOpenLaunchpad,
|
|
5260
|
+
shouldOpenLaunchpad,
|
|
5261
|
+
shouldAutostartLaunchpad,
|
|
5262
|
+
isDevEnvironment,
|
|
5263
|
+
LAUNCHPAD_WEB_MODULES,
|
|
5264
|
+
LAUNCHPAD_OPEN_FLAGS,
|
|
5064
5265
|
};
|
package/mcp_config.json
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# multi-cli-subagent-configurator (mcsc)
|
|
2
|
+
|
|
3
|
+
> Sandbox project. Full README pending — design is in `.openwiki/architecture.md`.
|
|
4
|
+
|
|
5
|
+
Detects which coding-agent CLIs (agy / Google Antigravity, opencode, Codex CLI,
|
|
6
|
+
native Claude Code subagents) are installed and authenticated on a machine, and
|
|
7
|
+
routes delegated subtasks to the right one via a capability-tier YAML rulebook
|
|
8
|
+
— never a pinned model ID, since free-tier model IDs churn within days.
|
|
9
|
+
|
|
10
|
+
Status: Core package implemented and tested. Includes an **MCP Server** (`packages/mcp/server.js`) that allows any MCP-compatible client to securely delegate tasks to local agent CLIs. The architecture includes rigorous recursion protection (via `MCSC_CALLER` environment variables) to prevent autonomous agents from calling themselves in infinite loops.
|
|
11
|
+
|
|
12
|
+
See [.openwiki/architecture.md](.openwiki/architecture.md) for the validated design.
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
node packages/core/bin/mcsc.js detect --json
|
|
16
|
+
node packages/core/bin/mcsc.js route --task-type review
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Documentation
|
|
20
|
+
|
|
21
|
+
Full docs live in [.openwiki/](.openwiki/quickstart.md):
|
|
22
|
+
- [quickstart.md](.openwiki/quickstart.md) — where to start
|
|
23
|
+
- [architecture.md](.openwiki/architecture.md) — the validated design
|
|
24
|
+
- [release_notes.md](.openwiki/release_notes.md) — timeline
|