@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.
Files changed (486) hide show
  1. package/.agents/agents.md +1 -0
  2. package/.agents/nodes.json +5 -1
  3. package/.agents/state.schema.json +2 -1
  4. package/.agents/vendor-manifest.json +50 -0
  5. package/.claude/agents/architect.md +4 -0
  6. package/.claude/agents/security-reviewer.md +1 -1
  7. package/.claude/hooks/memb-inject.mjs +257 -135
  8. package/.claude/hooks/trail-relay.mjs +18 -0
  9. package/.claude/settings.json +70 -0
  10. package/.claude/workflows/startcycle-dispatch.mjs +29 -1
  11. package/.opencode/agents/architect.md +4 -0
  12. package/.opencode/plugins/bdb-aos.js +75 -0
  13. package/THIRD_PARTY_NOTICES.md +48 -0
  14. package/bin/aos-config.mjs +3 -1
  15. package/bin/aos-uninstall.mjs +55 -1
  16. package/docs/handover/agenttrail-for-ao.md +58 -0
  17. package/docs/handover/deja-for-ao.md +51 -0
  18. package/installer.js +257 -56
  19. package/mcp_config.json +4 -0
  20. package/mcps/mcsc/README.md +24 -0
  21. package/mcps/mcsc/package-lock.json +1234 -0
  22. package/mcps/mcsc/package.json +14 -0
  23. package/mcps/mcsc/packages/core/bin/mcsc.js +162 -0
  24. package/mcps/mcsc/packages/core/rulebook.default.yaml +49 -0
  25. package/mcps/mcsc/packages/core/schema/rulebook.schema.json +56 -0
  26. package/mcps/mcsc/packages/core/src/adapters/agy.js +107 -0
  27. package/mcps/mcsc/packages/core/src/adapters/codex.js +56 -0
  28. package/mcps/mcsc/packages/core/src/adapters/native.js +14 -0
  29. package/mcps/mcsc/packages/core/src/adapters/opencode.js +183 -0
  30. package/mcps/mcsc/packages/core/src/adapters/types.js +21 -0
  31. package/mcps/mcsc/packages/core/src/capabilities/buildOfferTable.js +34 -0
  32. package/mcps/mcsc/packages/core/src/capabilities/registry.js +99 -0
  33. package/mcps/mcsc/packages/core/src/capabilities/types.js +24 -0
  34. package/mcps/mcsc/packages/core/src/detect/cache.js +47 -0
  35. package/mcps/mcsc/packages/core/src/detect/inventory.js +73 -0
  36. package/mcps/mcsc/packages/core/src/detect/probes.js +158 -0
  37. package/mcps/mcsc/packages/core/src/detect/types.js +26 -0
  38. package/mcps/mcsc/packages/core/src/rulebook/load.js +53 -0
  39. package/mcps/mcsc/packages/core/src/rulebook/resolve.js +227 -0
  40. package/mcps/mcsc/packages/core/src/rulebook/rulebook.types.js +89 -0
  41. package/mcps/mcsc/packages/core/src/trail.js +17 -0
  42. package/mcps/mcsc/packages/mcp/server.js +302 -0
  43. package/mcps/mcsc/server.js +2 -0
  44. package/package.json +3 -1
  45. package/skills/basic/bdbmediastorm/SKILL.md +1 -1
  46. package/skills/basic/godmode-ui-ux/SKILL.md +2 -2
  47. package/skills/basic/godmode-ui-ux/references/anti-slop-rules.md +44 -40
  48. package/skills/basic/godmode-ui-ux/references/taste-archetypes.md +49 -0
  49. package/skills/basic/startcycle/SKILL.md +7 -0
  50. package/skills/basic/startcycle-graph/SKILL.md +12 -0
  51. package/skills/basic/startcycle-graph-user/SKILL.md +3 -0
  52. package/skills/basic/teamwork-preview/SKILL.md +2 -0
  53. package/skills/bdbrainstorm/SKILL.md +1 -0
  54. package/skills/global_config/agenttrail/LICENSE +21 -0
  55. package/skills/global_config/agenttrail/SKILL.md +48 -0
  56. package/skills/global_config/agenttrail/bin/agenttrail.mjs +1002 -0
  57. package/skills/global_config/agenttrail/public/index.html +661 -0
  58. package/skills/global_config/aos-project-init/SKILL.md +25 -5
  59. package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +11 -0
  60. package/skills/global_config/aos-setup/SKILL.md +34 -1
  61. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +115 -1
  62. package/skills/global_config/archify/LICENSE +22 -0
  63. package/skills/global_config/archify/SKILL.md +140 -0
  64. package/skills/global_config/archify/THIRD_PARTY_NOTICES.md +69 -0
  65. package/skills/global_config/archify/assets/JetBrainsMono-OFL.txt +93 -0
  66. package/skills/global_config/archify/assets/template.html +14937 -0
  67. package/skills/global_config/archify/bin/archify.mjs +2139 -0
  68. package/skills/global_config/archify/bin/open-artifact.mjs +86 -0
  69. package/skills/global_config/archify/bin/preview.mjs +653 -0
  70. package/skills/global_config/archify/bin/visual-check.mjs +829 -0
  71. package/skills/global_config/archify/brand-marks/README.md +31 -0
  72. package/skills/global_config/archify/brand-marks/catalog.json +131 -0
  73. package/skills/global_config/archify/delta/architecture-delta.mjs +1232 -0
  74. package/skills/global_config/archify/examples/agent-run.lifecycle.json +60 -0
  75. package/skills/global_config/archify/examples/agent-tool-call.workflow.json +94 -0
  76. package/skills/global_config/archify/examples/async-job-roundtrip.sequence.json +61 -0
  77. package/skills/global_config/archify/examples/brand-aware-delivery.architecture.json +47 -0
  78. package/skills/global_config/archify/examples/cache-miss-request.sequence.json +82 -0
  79. package/skills/global_config/archify/examples/checkout-platform.base.architecture.json +31 -0
  80. package/skills/global_config/archify/examples/checkout-platform.head.architecture.json +31 -0
  81. package/skills/global_config/archify/examples/deployment-release.lifecycle.json +49 -0
  82. package/skills/global_config/archify/examples/event-stream.dataflow.json +57 -0
  83. package/skills/global_config/archify/examples/incident-response.workflow.json +64 -0
  84. package/skills/global_config/archify/examples/product-analytics.dataflow.json +76 -0
  85. package/skills/global_config/archify/examples/production-deployment.architecture.json +71 -0
  86. package/skills/global_config/archify/examples/release-delivery.workflow.json +62 -0
  87. package/skills/global_config/archify/examples/web-app.architecture.json +46 -0
  88. package/skills/global_config/archify/migrations/workflow-v2.mjs +279 -0
  89. package/skills/global_config/archify/package.json +39 -0
  90. package/skills/global_config/archify/recipes/scenarios.mjs +391 -0
  91. package/skills/global_config/archify/references/authoring-contract.md +247 -0
  92. package/skills/global_config/archify/references/brand-marks.md +65 -0
  93. package/skills/global_config/archify/references/delivery-contract.md +138 -0
  94. package/skills/global_config/archify/references/viewer-runtime.md +45 -0
  95. package/skills/global_config/archify/renderers/architecture/grid.mjs +62 -0
  96. package/skills/global_config/archify/renderers/architecture/render-architecture.mjs +1078 -0
  97. package/skills/global_config/archify/renderers/dataflow/README.md +104 -0
  98. package/skills/global_config/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  99. package/skills/global_config/archify/renderers/lifecycle/README.md +115 -0
  100. package/skills/global_config/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  101. package/skills/global_config/archify/renderers/sequence/README.md +114 -0
  102. package/skills/global_config/archify/renderers/sequence/render-sequence.mjs +464 -0
  103. package/skills/global_config/archify/renderers/shared/brand-marks.mjs +563 -0
  104. package/skills/global_config/archify/renderers/shared/cli.mjs +218 -0
  105. package/skills/global_config/archify/renderers/shared/desktop-readability.mjs +26 -0
  106. package/skills/global_config/archify/renderers/shared/diagnostics.mjs +160 -0
  107. package/skills/global_config/archify/renderers/shared/engineering-profiles.mjs +157 -0
  108. package/skills/global_config/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  109. package/skills/global_config/archify/renderers/shared/generated-validators.mjs +13 -0
  110. package/skills/global_config/archify/renderers/shared/geometry.mjs +1423 -0
  111. package/skills/global_config/archify/renderers/shared/i18n.mjs +595 -0
  112. package/skills/global_config/archify/renderers/shared/layout-report.mjs +40 -0
  113. package/skills/global_config/archify/renderers/shared/legend.mjs +217 -0
  114. package/skills/global_config/archify/renderers/shared/output-path.mjs +340 -0
  115. package/skills/global_config/archify/renderers/shared/repository-evidence.mjs +239 -0
  116. package/skills/global_config/archify/renderers/shared/repository-location.mjs +58 -0
  117. package/skills/global_config/archify/renderers/shared/text-fit.mjs +49 -0
  118. package/skills/global_config/archify/renderers/shared/utils.mjs +232 -0
  119. package/skills/global_config/archify/renderers/shared/validator.mjs +86 -0
  120. package/skills/global_config/archify/renderers/workflow/README.md +223 -0
  121. package/skills/global_config/archify/renderers/workflow/render-workflow.mjs +35 -0
  122. package/skills/global_config/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  123. package/skills/global_config/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  124. package/skills/global_config/archify/schemas/README.md +211 -0
  125. package/skills/global_config/archify/schemas/architecture.schema.json +178 -0
  126. package/skills/global_config/archify/schemas/common.schema.json +115 -0
  127. package/skills/global_config/archify/schemas/dataflow.schema.json +243 -0
  128. package/skills/global_config/archify/schemas/lifecycle.schema.json +266 -0
  129. package/skills/global_config/archify/schemas/sequence.schema.json +223 -0
  130. package/skills/global_config/archify/schemas/workflow.schema.json +428 -0
  131. package/skills/global_config/archify/scripts/check-render-output.mjs +916 -0
  132. package/skills/global_config/archify/scripts/generate-brand-marks.mjs +141 -0
  133. package/skills/global_config/archify/scripts/generate-validators.mjs +66 -0
  134. package/skills/global_config/archify/scripts/render-examples.mjs +26 -0
  135. package/skills/global_config/archify/skill-release.json +10 -0
  136. package/skills/global_config/bdb-security-audit/SKILL.md +109 -0
  137. package/skills/global_config/bdb-security-audit/references/audit-checklists.md +172 -0
  138. package/skills/global_config/bdb-security-audit/references/skylos-guide.md +139 -0
  139. package/skills/global_config/bdb-security-audit/references/xalgorix-bridge.md +110 -0
  140. package/skills/global_config/bdbdesignpro/SKILL.md +4 -4
  141. package/skills/global_config/bdbdesignpro/references/bdb-motion-tokens.md +52 -31
  142. package/skills/global_config/bdbresilience/SKILL.md +10 -0
  143. package/skills/global_config/brag/SKILL.md +179 -0
  144. package/skills/global_config/brag/assets/music/README.md +20 -0
  145. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
  146. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
  147. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
  148. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
  149. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
  150. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
  151. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
  152. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
  153. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
  154. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
  155. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
  156. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
  157. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
  158. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
  159. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
  160. package/skills/global_config/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
  161. package/skills/global_config/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
  162. package/skills/global_config/brag/assets/sfx/casino/card-place-1.ogg +0 -0
  163. package/skills/global_config/brag/assets/sfx/casino/card-place-2.ogg +0 -0
  164. package/skills/global_config/brag/assets/sfx/casino/card-place-3.ogg +0 -0
  165. package/skills/global_config/brag/assets/sfx/casino/card-place-4.ogg +0 -0
  166. package/skills/global_config/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
  167. package/skills/global_config/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
  168. package/skills/global_config/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
  169. package/skills/global_config/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
  170. package/skills/global_config/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
  171. package/skills/global_config/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
  172. package/skills/global_config/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
  173. package/skills/global_config/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
  174. package/skills/global_config/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
  175. package/skills/global_config/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
  176. package/skills/global_config/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
  177. package/skills/global_config/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
  178. package/skills/global_config/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
  179. package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
  180. package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
  181. package/skills/global_config/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
  182. package/skills/global_config/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
  183. package/skills/global_config/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
  184. package/skills/global_config/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
  185. package/skills/global_config/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
  186. package/skills/global_config/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
  187. package/skills/global_config/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
  188. package/skills/global_config/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
  189. package/skills/global_config/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
  190. package/skills/global_config/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
  191. package/skills/global_config/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
  192. package/skills/global_config/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
  193. package/skills/global_config/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
  194. package/skills/global_config/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
  195. package/skills/global_config/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
  196. package/skills/global_config/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
  197. package/skills/global_config/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
  198. package/skills/global_config/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
  199. package/skills/global_config/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
  200. package/skills/global_config/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
  201. package/skills/global_config/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
  202. package/skills/global_config/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
  203. package/skills/global_config/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
  204. package/skills/global_config/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
  205. package/skills/global_config/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
  206. package/skills/global_config/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
  207. package/skills/global_config/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
  208. package/skills/global_config/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
  209. package/skills/global_config/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
  210. package/skills/global_config/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
  211. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
  212. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
  213. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
  214. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
  215. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
  216. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
  217. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
  218. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
  219. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
  220. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
  221. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
  222. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
  223. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
  224. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
  225. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
  226. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
  227. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
  228. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
  229. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
  230. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
  231. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
  232. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
  233. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
  234. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
  235. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
  236. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
  237. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
  238. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
  239. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
  240. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
  241. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
  242. package/skills/global_config/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
  243. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
  244. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
  245. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
  246. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
  247. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
  248. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
  249. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
  250. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
  251. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
  252. package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
  253. package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
  254. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
  255. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
  256. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
  257. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
  258. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
  259. package/skills/global_config/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
  260. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
  261. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
  262. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
  263. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
  264. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
  265. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
  266. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
  267. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
  268. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
  269. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
  270. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
  271. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
  272. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
  273. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
  274. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
  275. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
  276. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
  277. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
  278. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
  279. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
  280. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
  281. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
  282. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
  283. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
  284. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
  285. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
  286. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
  287. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
  288. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
  289. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
  290. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
  291. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
  292. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
  293. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
  294. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
  295. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
  296. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
  297. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
  298. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
  299. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
  300. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
  301. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
  302. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
  303. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
  304. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
  305. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
  306. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
  307. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
  308. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
  309. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
  310. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
  311. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
  312. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
  313. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
  314. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
  315. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
  316. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
  317. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
  318. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
  319. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
  320. package/skills/global_config/brag/assets/sfx/interface/bong_001.ogg +0 -0
  321. package/skills/global_config/brag/assets/sfx/interface/click_001.ogg +0 -0
  322. package/skills/global_config/brag/assets/sfx/interface/click_002.ogg +0 -0
  323. package/skills/global_config/brag/assets/sfx/interface/click_003.ogg +0 -0
  324. package/skills/global_config/brag/assets/sfx/interface/click_004.ogg +0 -0
  325. package/skills/global_config/brag/assets/sfx/interface/click_005.ogg +0 -0
  326. package/skills/global_config/brag/assets/sfx/interface/drop_001.ogg +0 -0
  327. package/skills/global_config/brag/assets/sfx/interface/drop_002.ogg +0 -0
  328. package/skills/global_config/brag/assets/sfx/interface/drop_003.ogg +0 -0
  329. package/skills/global_config/brag/assets/sfx/interface/error_005.ogg +0 -0
  330. package/skills/global_config/brag/assets/sfx/interface/error_006.ogg +0 -0
  331. package/skills/global_config/brag/assets/sfx/interface/glitch_002.ogg +0 -0
  332. package/skills/global_config/brag/assets/sfx/interface/glitch_004.ogg +0 -0
  333. package/skills/global_config/brag/assets/sfx/interface/select_008.ogg +0 -0
  334. package/skills/global_config/brag/assets/sfx/interface/switch_001.ogg +0 -0
  335. package/skills/global_config/brag/assets/sfx/interface/switch_002.ogg +0 -0
  336. package/skills/global_config/brag/assets/sfx/interface/switch_004.ogg +0 -0
  337. package/skills/global_config/brag/assets/sfx/interface/switch_005.ogg +0 -0
  338. package/skills/global_config/brag/assets/sfx/interface/switch_006.ogg +0 -0
  339. package/skills/global_config/brag/assets/sfx/interface/switch_007.ogg +0 -0
  340. package/skills/global_config/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
  341. package/skills/global_config/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
  342. package/skills/global_config/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
  343. package/skills/global_config/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
  344. package/skills/global_config/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
  345. package/skills/global_config/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
  346. package/skills/global_config/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
  347. package/skills/global_config/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
  348. package/skills/global_config/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
  349. package/skills/global_config/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
  350. package/skills/global_config/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
  351. package/skills/global_config/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
  352. package/skills/global_config/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
  353. package/skills/global_config/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
  354. package/skills/global_config/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
  355. package/skills/global_config/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
  356. package/skills/global_config/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
  357. package/skills/global_config/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
  358. package/skills/global_config/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
  359. package/skills/global_config/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
  360. package/skills/global_config/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
  361. package/skills/global_config/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
  362. package/skills/global_config/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
  363. package/skills/global_config/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
  364. package/skills/global_config/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
  365. package/skills/global_config/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
  366. package/skills/global_config/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
  367. package/skills/global_config/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
  368. package/skills/global_config/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
  369. package/skills/global_config/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
  370. package/skills/global_config/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
  371. package/skills/global_config/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
  372. package/skills/global_config/brag/assets/sfx/sfx-analysis.json +15584 -0
  373. package/skills/global_config/brag/assets/sfx/sfx-analysis.md +75 -0
  374. package/skills/global_config/brag/assets/sfx/ui/click1.ogg +0 -0
  375. package/skills/global_config/brag/assets/sfx/ui/click2.ogg +0 -0
  376. package/skills/global_config/brag/assets/sfx/ui/click3.ogg +0 -0
  377. package/skills/global_config/brag/assets/sfx/ui/click4.ogg +0 -0
  378. package/skills/global_config/brag/assets/sfx/ui/click5.ogg +0 -0
  379. package/skills/global_config/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
  380. package/skills/global_config/brag/assets/sfx/ui/rollover1.ogg +0 -0
  381. package/skills/global_config/brag/assets/sfx/ui/rollover2.ogg +0 -0
  382. package/skills/global_config/brag/assets/sfx/ui/rollover4.ogg +0 -0
  383. package/skills/global_config/brag/assets/sfx/ui/rollover5.ogg +0 -0
  384. package/skills/global_config/brag/assets/sfx/ui/switch1.ogg +0 -0
  385. package/skills/global_config/brag/assets/sfx/ui/switch10.ogg +0 -0
  386. package/skills/global_config/brag/assets/sfx/ui/switch11.ogg +0 -0
  387. package/skills/global_config/brag/assets/sfx/ui/switch12.ogg +0 -0
  388. package/skills/global_config/brag/assets/sfx/ui/switch13.ogg +0 -0
  389. package/skills/global_config/brag/assets/sfx/ui/switch14.ogg +0 -0
  390. package/skills/global_config/brag/assets/sfx/ui/switch15.ogg +0 -0
  391. package/skills/global_config/brag/assets/sfx/ui/switch16.ogg +0 -0
  392. package/skills/global_config/brag/assets/sfx/ui/switch17.ogg +0 -0
  393. package/skills/global_config/brag/assets/sfx/ui/switch18.ogg +0 -0
  394. package/skills/global_config/brag/assets/sfx/ui/switch19.ogg +0 -0
  395. package/skills/global_config/brag/assets/sfx/ui/switch2.ogg +0 -0
  396. package/skills/global_config/brag/assets/sfx/ui/switch20.ogg +0 -0
  397. package/skills/global_config/brag/assets/sfx/ui/switch21.ogg +0 -0
  398. package/skills/global_config/brag/assets/sfx/ui/switch22.ogg +0 -0
  399. package/skills/global_config/brag/assets/sfx/ui/switch23.ogg +0 -0
  400. package/skills/global_config/brag/assets/sfx/ui/switch24.ogg +0 -0
  401. package/skills/global_config/brag/assets/sfx/ui/switch25.ogg +0 -0
  402. package/skills/global_config/brag/assets/sfx/ui/switch26.ogg +0 -0
  403. package/skills/global_config/brag/assets/sfx/ui/switch27.ogg +0 -0
  404. package/skills/global_config/brag/assets/sfx/ui/switch28.ogg +0 -0
  405. package/skills/global_config/brag/assets/sfx/ui/switch29.ogg +0 -0
  406. package/skills/global_config/brag/assets/sfx/ui/switch3.ogg +0 -0
  407. package/skills/global_config/brag/assets/sfx/ui/switch30.ogg +0 -0
  408. package/skills/global_config/brag/assets/sfx/ui/switch31.ogg +0 -0
  409. package/skills/global_config/brag/assets/sfx/ui/switch32.ogg +0 -0
  410. package/skills/global_config/brag/assets/sfx/ui/switch33.ogg +0 -0
  411. package/skills/global_config/brag/assets/sfx/ui/switch34.ogg +0 -0
  412. package/skills/global_config/brag/assets/sfx/ui/switch35.ogg +0 -0
  413. package/skills/global_config/brag/assets/sfx/ui/switch36.ogg +0 -0
  414. package/skills/global_config/brag/assets/sfx/ui/switch37.ogg +0 -0
  415. package/skills/global_config/brag/assets/sfx/ui/switch38.ogg +0 -0
  416. package/skills/global_config/brag/assets/sfx/ui/switch4.ogg +0 -0
  417. package/skills/global_config/brag/assets/sfx/ui/switch5.ogg +0 -0
  418. package/skills/global_config/brag/assets/sfx/ui/switch6.ogg +0 -0
  419. package/skills/global_config/brag/assets/sfx/ui/switch7.ogg +0 -0
  420. package/skills/global_config/brag/assets/sfx/ui/switch8.ogg +0 -0
  421. package/skills/global_config/brag/assets/sfx/ui/switch9.ogg +0 -0
  422. package/skills/global_config/brag/references/audio.md +307 -0
  423. package/skills/global_config/brag/references/step-1-inspect.md +133 -0
  424. package/skills/global_config/brag/references/step-2-plan.md +234 -0
  425. package/skills/global_config/brag/references/step-3-compose.md +210 -0
  426. package/skills/global_config/brag/references/step-4-deliver.md +168 -0
  427. package/skills/global_config/brag/references/tones.md +231 -0
  428. package/skills/global_config/brag/scripts/analyze_music_cues.py +309 -0
  429. package/skills/global_config/brag/scripts/pyproject.toml +14 -0
  430. package/skills/global_config/brag/scripts/uv.lock +819 -0
  431. package/skills/global_config/deja-memory/SKILL.md +42 -0
  432. package/skills/global_config/editable-design/LICENSE +202 -0
  433. package/skills/global_config/editable-design/README.md +34 -0
  434. package/skills/global_config/editable-design/SKILL.md +630 -0
  435. package/skills/global_config/editable-design/THIRD_PARTY_NOTICES.md +10 -0
  436. package/skills/global_config/editable-design/agents/openai.yaml +4 -0
  437. package/skills/global_config/editable-design/assets/editor/layer-editor.css +262 -0
  438. package/skills/global_config/editable-design/assets/editor/layer-editor.js +1929 -0
  439. package/skills/global_config/editable-design/assets/poster-starter/README.md +92 -0
  440. package/skills/global_config/editable-design/assets/poster-starter/assets/.gitkeep +0 -0
  441. package/skills/global_config/editable-design/assets/poster-starter/index.html +91 -0
  442. package/skills/global_config/editable-design/assets/poster-starter/poster.json +6 -0
  443. package/skills/global_config/editable-design/assets/poster-starter/reference/.gitkeep +1 -0
  444. package/skills/global_config/editable-design/assets/replay/icons/assets.png +0 -0
  445. package/skills/global_config/editable-design/assets/replay/icons/html.png +0 -0
  446. package/skills/global_config/editable-design/assets/replay/icons/input.png +0 -0
  447. package/skills/global_config/editable-design/assets/replay/icons/layers.png +0 -0
  448. package/skills/global_config/editable-design/assets/replay/icons/plan.png +0 -0
  449. package/skills/global_config/editable-design/assets/replay/icons/reference.png +0 -0
  450. package/skills/global_config/editable-design/assets/replay/icons/review.png +0 -0
  451. package/skills/global_config/editable-design/assets/replay/index.html +59 -0
  452. package/skills/global_config/editable-design/assets/replay/replay-motion.js +410 -0
  453. package/skills/global_config/editable-design/assets/replay/replay.css +380 -0
  454. package/skills/global_config/editable-design/assets/replay/replay.js +374 -0
  455. package/skills/global_config/editable-design/font-kit/package-lock.json +115 -0
  456. package/skills/global_config/editable-design/font-kit/package.json +19 -0
  457. package/skills/global_config/editable-design/pack.sh +20 -0
  458. package/skills/global_config/editable-design/references/asset-architecture.md +72 -0
  459. package/skills/global_config/editable-design/references/editor-pitfalls.md +70 -0
  460. package/skills/global_config/editable-design/references/editor-runtime.md +131 -0
  461. package/skills/global_config/editable-design/references/font-system.md +89 -0
  462. package/skills/global_config/editable-design/references/imagery.md +145 -0
  463. package/skills/global_config/editable-design/references/layout-typography.md +116 -0
  464. package/skills/global_config/editable-design/references/replay-contract.md +169 -0
  465. package/skills/global_config/editable-design/scripts/_browser.mjs +247 -0
  466. package/skills/global_config/editable-design/scripts/bake.mjs +87 -0
  467. package/skills/global_config/editable-design/scripts/build-replay.mjs +316 -0
  468. package/skills/global_config/editable-design/scripts/check-contract.mjs +293 -0
  469. package/skills/global_config/editable-design/scripts/check-fonts.sh +252 -0
  470. package/skills/global_config/editable-design/scripts/check-poster.sh +70 -0
  471. package/skills/global_config/editable-design/scripts/doctor.sh +78 -0
  472. package/skills/global_config/editable-design/scripts/explode.mjs +115 -0
  473. package/skills/global_config/editable-design/scripts/font-kit.mjs +187 -0
  474. package/skills/global_config/editable-design/scripts/import-asset.sh +23 -0
  475. package/skills/global_config/editable-design/scripts/init-poster.sh +64 -0
  476. package/skills/global_config/editable-design/scripts/install-font-kit.sh +13 -0
  477. package/skills/global_config/editable-design/scripts/package-lock.json +334 -0
  478. package/skills/global_config/editable-design/scripts/package.json +14 -0
  479. package/skills/global_config/editable-design/scripts/remove-chroma-key.py +201 -0
  480. package/skills/global_config/editable-design/scripts/render-poster.sh +202 -0
  481. package/skills/global_config/editable-design/scripts/trace.sh +159 -0
  482. package/skills/global_config/editable-design/scripts/verify-replay.mjs +97 -0
  483. package/skills/global_config/editable-design/scripts/verify.mjs +782 -0
  484. package/skills/global_config/editable-design/scripts/wire-editor.mjs +104 -0
  485. package/skills/global_config/editable-design/tests/fixtures/small-explode/index.html +86 -0
  486. 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 servers = JSON.parse(mcpConfigStr).mcpServers || {};
2950
- const tables = Object.entries(servers).map(([name, cfg]) => {
2951
- const rows = [`[mcp_servers.${tomlKey(name)}]`];
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 write the Codex TOML snippet: ${e.message}`);
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
- const machineGlobalHooks = ['memb-inject.mjs'];
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
- function generateAndOpenLaunchpad() {
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
- // Local Developer Workflow Guard:
3965
- // Only generate and open the launchpad if running in a local developer repo environment or explicitly requested.
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, but this check was never updated -- it has been silently
3968
- // false on every real dev machine since that reorg. Checking both keeps
3969
- // this working regardless of which layout a given machine still has.
3970
- const isDevWorkflow = fs.existsSync(path.join(homeDir, 'dev', 'bdb-dev')) ||
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
@@ -74,6 +74,10 @@
74
74
  "GEMINI_API_KEY": "__GEMINI_API_KEY__"
75
75
  }
76
76
  },
77
+ "deja": {
78
+ "command": "deja",
79
+ "args": ["mcp"]
80
+ },
77
81
  "open_design_mcp": {
78
82
  "command": "npx",
79
83
  "args": ["-y", "open-design-mcp", "__MCPS_DIR__/open-design"],
@@ -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