@hybridlabor-api/aos 4.6.6 → 4.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/.agents/agents.md +9 -3
  2. package/.agents/nodes.json +7 -2
  3. package/.agents/state.schema.json +26 -1
  4. package/.agents/vendor-manifest.json +56 -0
  5. package/.agents/workflows/startcycle-graph.md +2 -2
  6. package/.claude/agents/architect.md +7 -2
  7. package/.claude/agents/security-reviewer.md +1 -1
  8. package/.claude/agents/techlead.md +2 -0
  9. package/.claude/hooks/memb-inject.mjs +257 -135
  10. package/.claude/hooks/trail-relay.mjs +18 -0
  11. package/.claude/settings.json +70 -0
  12. package/.claude/workflows/startcycle-dispatch.mjs +203 -17
  13. package/.opencode/agents/architect.md +7 -2
  14. package/.opencode/agents/techlead.md +2 -0
  15. package/.opencode/plugins/bdb-aos.js +75 -0
  16. package/THIRD_PARTY_NOTICES.md +57 -1
  17. package/bin/aos-doctor.mjs +366 -0
  18. package/bin/aos-store.mjs +167 -0
  19. package/bin/aos-uninstall.mjs +55 -1
  20. package/docs/AUDIT_BRIEF_ECC_STORE.md +122 -0
  21. package/docs/PLAN_AOS_STORE_PHASE1.md +190 -0
  22. package/docs/handover/agenttrail-for-ao.md +58 -0
  23. package/docs/handover/deja-for-ao.md +51 -0
  24. package/installer.js +182 -38
  25. package/lib/aos-archify-contract.mjs +277 -0
  26. package/lib/ecc-store-index.json +1 -0
  27. package/mcp_config.json +8 -0
  28. package/mcps/mcsc/README.md +24 -0
  29. package/mcps/mcsc/package-lock.json +1234 -0
  30. package/mcps/mcsc/package.json +14 -0
  31. package/mcps/mcsc/packages/core/bin/mcsc.js +162 -0
  32. package/mcps/mcsc/packages/core/rulebook.default.yaml +49 -0
  33. package/mcps/mcsc/packages/core/schema/rulebook.schema.json +56 -0
  34. package/mcps/mcsc/packages/core/src/adapters/agy.js +107 -0
  35. package/mcps/mcsc/packages/core/src/adapters/codex.js +179 -0
  36. package/mcps/mcsc/packages/core/src/adapters/native.js +14 -0
  37. package/mcps/mcsc/packages/core/src/adapters/opencode.js +183 -0
  38. package/mcps/mcsc/packages/core/src/adapters/types.js +21 -0
  39. package/mcps/mcsc/packages/core/src/capabilities/buildOfferTable.js +34 -0
  40. package/mcps/mcsc/packages/core/src/capabilities/registry.js +99 -0
  41. package/mcps/mcsc/packages/core/src/capabilities/types.js +24 -0
  42. package/mcps/mcsc/packages/core/src/detect/cache.js +47 -0
  43. package/mcps/mcsc/packages/core/src/detect/inventory.js +73 -0
  44. package/mcps/mcsc/packages/core/src/detect/probes.js +158 -0
  45. package/mcps/mcsc/packages/core/src/detect/types.js +26 -0
  46. package/mcps/mcsc/packages/core/src/rulebook/load.js +53 -0
  47. package/mcps/mcsc/packages/core/src/rulebook/resolve.js +227 -0
  48. package/mcps/mcsc/packages/core/src/rulebook/rulebook.types.js +89 -0
  49. package/mcps/mcsc/packages/core/src/trail.js +17 -0
  50. package/mcps/mcsc/packages/mcp/server.js +302 -0
  51. package/mcps/mcsc/server.js +2 -0
  52. package/package.json +8 -2
  53. package/scripts/build-ecc-store-index.mjs +147 -0
  54. package/skills/basic/bdbmediastorm/SKILL.md +1 -1
  55. package/skills/basic/godmode-ui-ux/SKILL.md +2 -2
  56. package/skills/basic/godmode-ui-ux/references/anti-slop-rules.md +44 -40
  57. package/skills/basic/godmode-ui-ux/references/taste-archetypes.md +49 -0
  58. package/skills/basic/startcycle/SKILL.md +7 -0
  59. package/skills/basic/startcycle-graph/SKILL.md +25 -0
  60. package/skills/basic/startcycle-graph-user/SKILL.md +3 -0
  61. package/skills/basic/teamwork-preview/SKILL.md +2 -0
  62. package/skills/bdbrainstorm/SKILL.md +1 -0
  63. package/skills/global_config/agenttrail/LICENSE +21 -0
  64. package/skills/global_config/agenttrail/SKILL.md +48 -0
  65. package/skills/global_config/agenttrail/bin/agenttrail.mjs +1113 -0
  66. package/skills/global_config/agenttrail/public/index.html +662 -0
  67. package/skills/global_config/aos-project-init/SKILL.md +25 -5
  68. package/skills/global_config/aos-setup/SKILL.md +34 -1
  69. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +115 -1
  70. package/skills/global_config/archify/LICENSE +22 -0
  71. package/skills/global_config/archify/SKILL.md +140 -0
  72. package/skills/global_config/archify/THIRD_PARTY_NOTICES.md +69 -0
  73. package/skills/global_config/archify/assets/JetBrainsMono-OFL.txt +93 -0
  74. package/skills/global_config/archify/assets/template.html +14937 -0
  75. package/skills/global_config/archify/bin/archify.mjs +2139 -0
  76. package/skills/global_config/archify/bin/open-artifact.mjs +86 -0
  77. package/skills/global_config/archify/bin/preview.mjs +653 -0
  78. package/skills/global_config/archify/bin/visual-check.mjs +829 -0
  79. package/skills/global_config/archify/brand-marks/README.md +31 -0
  80. package/skills/global_config/archify/brand-marks/catalog.json +131 -0
  81. package/skills/global_config/archify/delta/architecture-delta.mjs +1232 -0
  82. package/skills/global_config/archify/examples/agent-run.lifecycle.json +60 -0
  83. package/skills/global_config/archify/examples/agent-tool-call.workflow.json +94 -0
  84. package/skills/global_config/archify/examples/async-job-roundtrip.sequence.json +61 -0
  85. package/skills/global_config/archify/examples/brand-aware-delivery.architecture.json +47 -0
  86. package/skills/global_config/archify/examples/cache-miss-request.sequence.json +82 -0
  87. package/skills/global_config/archify/examples/checkout-platform.base.architecture.json +31 -0
  88. package/skills/global_config/archify/examples/checkout-platform.head.architecture.json +31 -0
  89. package/skills/global_config/archify/examples/dataflow-product-analytics.html +15048 -0
  90. package/skills/global_config/archify/examples/deployment-release.lifecycle.json +49 -0
  91. package/skills/global_config/archify/examples/event-stream.dataflow.json +57 -0
  92. package/skills/global_config/archify/examples/incident-response.workflow.json +64 -0
  93. package/skills/global_config/archify/examples/lifecycle-agent-run.html +14983 -0
  94. package/skills/global_config/archify/examples/product-analytics.dataflow.json +76 -0
  95. package/skills/global_config/archify/examples/production-deployment.architecture.json +71 -0
  96. package/skills/global_config/archify/examples/release-delivery.workflow.json +62 -0
  97. package/skills/global_config/archify/examples/sequence-cache-miss-request.html +15063 -0
  98. package/skills/global_config/archify/examples/web-app-rendered.html +15012 -0
  99. package/skills/global_config/archify/examples/web-app.architecture.json +46 -0
  100. package/skills/global_config/archify/examples/workflow-agent-tool-call-rendered.html +15054 -0
  101. package/skills/global_config/archify/migrations/workflow-v2.mjs +279 -0
  102. package/skills/global_config/archify/package.json +39 -0
  103. package/skills/global_config/archify/recipes/scenarios.mjs +391 -0
  104. package/skills/global_config/archify/references/authoring-contract.md +247 -0
  105. package/skills/global_config/archify/references/brand-marks.md +65 -0
  106. package/skills/global_config/archify/references/delivery-contract.md +138 -0
  107. package/skills/global_config/archify/references/viewer-runtime.md +45 -0
  108. package/skills/global_config/archify/renderers/architecture/grid.mjs +62 -0
  109. package/skills/global_config/archify/renderers/architecture/render-architecture.mjs +1078 -0
  110. package/skills/global_config/archify/renderers/dataflow/README.md +104 -0
  111. package/skills/global_config/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  112. package/skills/global_config/archify/renderers/lifecycle/README.md +115 -0
  113. package/skills/global_config/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  114. package/skills/global_config/archify/renderers/sequence/README.md +114 -0
  115. package/skills/global_config/archify/renderers/sequence/render-sequence.mjs +464 -0
  116. package/skills/global_config/archify/renderers/shared/brand-marks.mjs +563 -0
  117. package/skills/global_config/archify/renderers/shared/cli.mjs +218 -0
  118. package/skills/global_config/archify/renderers/shared/desktop-readability.mjs +26 -0
  119. package/skills/global_config/archify/renderers/shared/diagnostics.mjs +160 -0
  120. package/skills/global_config/archify/renderers/shared/engineering-profiles.mjs +157 -0
  121. package/skills/global_config/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  122. package/skills/global_config/archify/renderers/shared/generated-validators.mjs +13 -0
  123. package/skills/global_config/archify/renderers/shared/geometry.mjs +1423 -0
  124. package/skills/global_config/archify/renderers/shared/i18n.mjs +595 -0
  125. package/skills/global_config/archify/renderers/shared/layout-report.mjs +40 -0
  126. package/skills/global_config/archify/renderers/shared/legend.mjs +217 -0
  127. package/skills/global_config/archify/renderers/shared/output-path.mjs +340 -0
  128. package/skills/global_config/archify/renderers/shared/repository-evidence.mjs +239 -0
  129. package/skills/global_config/archify/renderers/shared/repository-location.mjs +58 -0
  130. package/skills/global_config/archify/renderers/shared/text-fit.mjs +49 -0
  131. package/skills/global_config/archify/renderers/shared/utils.mjs +232 -0
  132. package/skills/global_config/archify/renderers/shared/validator.mjs +86 -0
  133. package/skills/global_config/archify/renderers/workflow/README.md +223 -0
  134. package/skills/global_config/archify/renderers/workflow/render-workflow.mjs +35 -0
  135. package/skills/global_config/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  136. package/skills/global_config/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  137. package/skills/global_config/archify/schemas/README.md +211 -0
  138. package/skills/global_config/archify/schemas/architecture.schema.json +178 -0
  139. package/skills/global_config/archify/schemas/common.schema.json +115 -0
  140. package/skills/global_config/archify/schemas/dataflow.schema.json +243 -0
  141. package/skills/global_config/archify/schemas/lifecycle.schema.json +266 -0
  142. package/skills/global_config/archify/schemas/sequence.schema.json +223 -0
  143. package/skills/global_config/archify/schemas/workflow.schema.json +428 -0
  144. package/skills/global_config/archify/scripts/check-render-output.mjs +916 -0
  145. package/skills/global_config/archify/scripts/generate-brand-marks.mjs +141 -0
  146. package/skills/global_config/archify/scripts/generate-validators.mjs +66 -0
  147. package/skills/global_config/archify/scripts/render-examples.mjs +26 -0
  148. package/skills/global_config/archify/skill-release.json +10 -0
  149. package/skills/global_config/ask-tim/SKILL.md +10 -0
  150. package/skills/global_config/bdb-security-audit/SKILL.md +109 -0
  151. package/skills/global_config/bdb-security-audit/references/audit-checklists.md +172 -0
  152. package/skills/global_config/bdb-security-audit/references/skylos-guide.md +139 -0
  153. package/skills/global_config/bdb-security-audit/references/xalgorix-bridge.md +110 -0
  154. package/skills/global_config/bdbdesignpro/SKILL.md +4 -4
  155. package/skills/global_config/bdbdesignpro/references/bdb-motion-tokens.md +52 -31
  156. package/skills/global_config/bdbresilience/SKILL.md +10 -0
  157. package/skills/global_config/brag/SKILL.md +179 -0
  158. package/skills/global_config/brag/assets/music/README.md +20 -0
  159. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
  160. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
  161. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
  162. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
  163. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
  164. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
  165. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
  166. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
  167. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
  168. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
  169. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
  170. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
  171. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
  172. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
  173. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
  174. package/skills/global_config/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
  175. package/skills/global_config/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
  176. package/skills/global_config/brag/assets/sfx/casino/card-place-1.ogg +0 -0
  177. package/skills/global_config/brag/assets/sfx/casino/card-place-2.ogg +0 -0
  178. package/skills/global_config/brag/assets/sfx/casino/card-place-3.ogg +0 -0
  179. package/skills/global_config/brag/assets/sfx/casino/card-place-4.ogg +0 -0
  180. package/skills/global_config/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
  181. package/skills/global_config/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
  182. package/skills/global_config/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
  183. package/skills/global_config/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
  184. package/skills/global_config/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
  185. package/skills/global_config/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
  186. package/skills/global_config/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
  187. package/skills/global_config/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
  188. package/skills/global_config/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
  189. package/skills/global_config/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
  190. package/skills/global_config/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
  191. package/skills/global_config/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
  192. package/skills/global_config/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
  193. package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
  194. package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
  195. package/skills/global_config/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
  196. package/skills/global_config/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
  197. package/skills/global_config/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
  198. package/skills/global_config/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
  199. package/skills/global_config/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
  200. package/skills/global_config/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
  201. package/skills/global_config/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
  202. package/skills/global_config/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
  203. package/skills/global_config/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
  204. package/skills/global_config/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
  205. package/skills/global_config/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
  206. package/skills/global_config/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
  207. package/skills/global_config/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
  208. package/skills/global_config/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
  209. package/skills/global_config/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
  210. package/skills/global_config/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
  211. package/skills/global_config/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
  212. package/skills/global_config/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
  213. package/skills/global_config/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
  214. package/skills/global_config/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
  215. package/skills/global_config/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
  216. package/skills/global_config/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
  217. package/skills/global_config/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
  218. package/skills/global_config/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
  219. package/skills/global_config/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
  220. package/skills/global_config/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
  221. package/skills/global_config/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
  222. package/skills/global_config/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
  223. package/skills/global_config/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
  224. package/skills/global_config/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
  225. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
  226. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
  227. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
  228. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
  229. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
  230. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
  231. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
  232. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
  233. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
  234. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
  235. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
  236. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
  237. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
  238. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
  239. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
  240. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
  241. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
  242. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
  243. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
  244. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
  245. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
  246. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
  247. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
  248. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
  249. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
  250. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
  251. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
  252. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
  253. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
  254. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
  255. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
  256. package/skills/global_config/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
  257. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
  258. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
  259. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
  260. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
  261. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
  262. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
  263. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
  264. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
  265. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
  266. package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
  267. package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
  268. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
  269. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
  270. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
  271. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
  272. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
  273. package/skills/global_config/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
  274. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
  275. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
  276. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
  277. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
  278. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
  279. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
  280. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
  281. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
  282. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
  283. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
  284. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
  285. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
  286. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
  287. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
  288. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
  289. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
  290. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
  291. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
  292. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
  293. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
  294. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
  295. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
  296. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
  297. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
  298. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
  299. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
  300. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
  301. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
  302. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
  303. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
  304. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
  305. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
  306. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
  307. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
  308. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
  309. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
  310. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
  311. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
  312. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
  313. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
  314. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
  315. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
  316. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
  317. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
  318. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
  319. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
  320. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
  321. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
  322. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
  323. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
  324. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
  325. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
  326. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
  327. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
  328. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
  329. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
  330. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
  331. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
  332. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
  333. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
  334. package/skills/global_config/brag/assets/sfx/interface/bong_001.ogg +0 -0
  335. package/skills/global_config/brag/assets/sfx/interface/click_001.ogg +0 -0
  336. package/skills/global_config/brag/assets/sfx/interface/click_002.ogg +0 -0
  337. package/skills/global_config/brag/assets/sfx/interface/click_003.ogg +0 -0
  338. package/skills/global_config/brag/assets/sfx/interface/click_004.ogg +0 -0
  339. package/skills/global_config/brag/assets/sfx/interface/click_005.ogg +0 -0
  340. package/skills/global_config/brag/assets/sfx/interface/drop_001.ogg +0 -0
  341. package/skills/global_config/brag/assets/sfx/interface/drop_002.ogg +0 -0
  342. package/skills/global_config/brag/assets/sfx/interface/drop_003.ogg +0 -0
  343. package/skills/global_config/brag/assets/sfx/interface/error_005.ogg +0 -0
  344. package/skills/global_config/brag/assets/sfx/interface/error_006.ogg +0 -0
  345. package/skills/global_config/brag/assets/sfx/interface/glitch_002.ogg +0 -0
  346. package/skills/global_config/brag/assets/sfx/interface/glitch_004.ogg +0 -0
  347. package/skills/global_config/brag/assets/sfx/interface/select_008.ogg +0 -0
  348. package/skills/global_config/brag/assets/sfx/interface/switch_001.ogg +0 -0
  349. package/skills/global_config/brag/assets/sfx/interface/switch_002.ogg +0 -0
  350. package/skills/global_config/brag/assets/sfx/interface/switch_004.ogg +0 -0
  351. package/skills/global_config/brag/assets/sfx/interface/switch_005.ogg +0 -0
  352. package/skills/global_config/brag/assets/sfx/interface/switch_006.ogg +0 -0
  353. package/skills/global_config/brag/assets/sfx/interface/switch_007.ogg +0 -0
  354. package/skills/global_config/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
  355. package/skills/global_config/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
  356. package/skills/global_config/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
  357. package/skills/global_config/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
  358. package/skills/global_config/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
  359. package/skills/global_config/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
  360. package/skills/global_config/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
  361. package/skills/global_config/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
  362. package/skills/global_config/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
  363. package/skills/global_config/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
  364. package/skills/global_config/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
  365. package/skills/global_config/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
  366. package/skills/global_config/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
  367. package/skills/global_config/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
  368. package/skills/global_config/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
  369. package/skills/global_config/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
  370. package/skills/global_config/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
  371. package/skills/global_config/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
  372. package/skills/global_config/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
  373. package/skills/global_config/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
  374. package/skills/global_config/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
  375. package/skills/global_config/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
  376. package/skills/global_config/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
  377. package/skills/global_config/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
  378. package/skills/global_config/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
  379. package/skills/global_config/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
  380. package/skills/global_config/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
  381. package/skills/global_config/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
  382. package/skills/global_config/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
  383. package/skills/global_config/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
  384. package/skills/global_config/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
  385. package/skills/global_config/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
  386. package/skills/global_config/brag/assets/sfx/sfx-analysis.json +15584 -0
  387. package/skills/global_config/brag/assets/sfx/sfx-analysis.md +75 -0
  388. package/skills/global_config/brag/assets/sfx/ui/click1.ogg +0 -0
  389. package/skills/global_config/brag/assets/sfx/ui/click2.ogg +0 -0
  390. package/skills/global_config/brag/assets/sfx/ui/click3.ogg +0 -0
  391. package/skills/global_config/brag/assets/sfx/ui/click4.ogg +0 -0
  392. package/skills/global_config/brag/assets/sfx/ui/click5.ogg +0 -0
  393. package/skills/global_config/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
  394. package/skills/global_config/brag/assets/sfx/ui/rollover1.ogg +0 -0
  395. package/skills/global_config/brag/assets/sfx/ui/rollover2.ogg +0 -0
  396. package/skills/global_config/brag/assets/sfx/ui/rollover4.ogg +0 -0
  397. package/skills/global_config/brag/assets/sfx/ui/rollover5.ogg +0 -0
  398. package/skills/global_config/brag/assets/sfx/ui/switch1.ogg +0 -0
  399. package/skills/global_config/brag/assets/sfx/ui/switch10.ogg +0 -0
  400. package/skills/global_config/brag/assets/sfx/ui/switch11.ogg +0 -0
  401. package/skills/global_config/brag/assets/sfx/ui/switch12.ogg +0 -0
  402. package/skills/global_config/brag/assets/sfx/ui/switch13.ogg +0 -0
  403. package/skills/global_config/brag/assets/sfx/ui/switch14.ogg +0 -0
  404. package/skills/global_config/brag/assets/sfx/ui/switch15.ogg +0 -0
  405. package/skills/global_config/brag/assets/sfx/ui/switch16.ogg +0 -0
  406. package/skills/global_config/brag/assets/sfx/ui/switch17.ogg +0 -0
  407. package/skills/global_config/brag/assets/sfx/ui/switch18.ogg +0 -0
  408. package/skills/global_config/brag/assets/sfx/ui/switch19.ogg +0 -0
  409. package/skills/global_config/brag/assets/sfx/ui/switch2.ogg +0 -0
  410. package/skills/global_config/brag/assets/sfx/ui/switch20.ogg +0 -0
  411. package/skills/global_config/brag/assets/sfx/ui/switch21.ogg +0 -0
  412. package/skills/global_config/brag/assets/sfx/ui/switch22.ogg +0 -0
  413. package/skills/global_config/brag/assets/sfx/ui/switch23.ogg +0 -0
  414. package/skills/global_config/brag/assets/sfx/ui/switch24.ogg +0 -0
  415. package/skills/global_config/brag/assets/sfx/ui/switch25.ogg +0 -0
  416. package/skills/global_config/brag/assets/sfx/ui/switch26.ogg +0 -0
  417. package/skills/global_config/brag/assets/sfx/ui/switch27.ogg +0 -0
  418. package/skills/global_config/brag/assets/sfx/ui/switch28.ogg +0 -0
  419. package/skills/global_config/brag/assets/sfx/ui/switch29.ogg +0 -0
  420. package/skills/global_config/brag/assets/sfx/ui/switch3.ogg +0 -0
  421. package/skills/global_config/brag/assets/sfx/ui/switch30.ogg +0 -0
  422. package/skills/global_config/brag/assets/sfx/ui/switch31.ogg +0 -0
  423. package/skills/global_config/brag/assets/sfx/ui/switch32.ogg +0 -0
  424. package/skills/global_config/brag/assets/sfx/ui/switch33.ogg +0 -0
  425. package/skills/global_config/brag/assets/sfx/ui/switch34.ogg +0 -0
  426. package/skills/global_config/brag/assets/sfx/ui/switch35.ogg +0 -0
  427. package/skills/global_config/brag/assets/sfx/ui/switch36.ogg +0 -0
  428. package/skills/global_config/brag/assets/sfx/ui/switch37.ogg +0 -0
  429. package/skills/global_config/brag/assets/sfx/ui/switch38.ogg +0 -0
  430. package/skills/global_config/brag/assets/sfx/ui/switch4.ogg +0 -0
  431. package/skills/global_config/brag/assets/sfx/ui/switch5.ogg +0 -0
  432. package/skills/global_config/brag/assets/sfx/ui/switch6.ogg +0 -0
  433. package/skills/global_config/brag/assets/sfx/ui/switch7.ogg +0 -0
  434. package/skills/global_config/brag/assets/sfx/ui/switch8.ogg +0 -0
  435. package/skills/global_config/brag/assets/sfx/ui/switch9.ogg +0 -0
  436. package/skills/global_config/brag/references/audio.md +307 -0
  437. package/skills/global_config/brag/references/step-1-inspect.md +133 -0
  438. package/skills/global_config/brag/references/step-2-plan.md +234 -0
  439. package/skills/global_config/brag/references/step-3-compose.md +210 -0
  440. package/skills/global_config/brag/references/step-4-deliver.md +168 -0
  441. package/skills/global_config/brag/references/tones.md +231 -0
  442. package/skills/global_config/brag/scripts/analyze_music_cues.py +309 -0
  443. package/skills/global_config/brag/scripts/pyproject.toml +14 -0
  444. package/skills/global_config/brag/scripts/uv.lock +819 -0
  445. package/skills/global_config/deja-memory/SKILL.md +42 -0
  446. package/skills/global_config/editable-design/LICENSE +202 -0
  447. package/skills/global_config/editable-design/README.md +34 -0
  448. package/skills/global_config/editable-design/SKILL.md +630 -0
  449. package/skills/global_config/editable-design/THIRD_PARTY_NOTICES.md +10 -0
  450. package/skills/global_config/editable-design/agents/openai.yaml +4 -0
  451. package/skills/global_config/editable-design/assets/editor/layer-editor.css +262 -0
  452. package/skills/global_config/editable-design/assets/editor/layer-editor.js +1929 -0
  453. package/skills/global_config/editable-design/assets/poster-starter/README.md +92 -0
  454. package/skills/global_config/editable-design/assets/poster-starter/assets/.gitkeep +0 -0
  455. package/skills/global_config/editable-design/assets/poster-starter/index.html +91 -0
  456. package/skills/global_config/editable-design/assets/poster-starter/poster.json +6 -0
  457. package/skills/global_config/editable-design/assets/poster-starter/reference/.gitkeep +1 -0
  458. package/skills/global_config/editable-design/assets/replay/icons/assets.png +0 -0
  459. package/skills/global_config/editable-design/assets/replay/icons/html.png +0 -0
  460. package/skills/global_config/editable-design/assets/replay/icons/input.png +0 -0
  461. package/skills/global_config/editable-design/assets/replay/icons/layers.png +0 -0
  462. package/skills/global_config/editable-design/assets/replay/icons/plan.png +0 -0
  463. package/skills/global_config/editable-design/assets/replay/icons/reference.png +0 -0
  464. package/skills/global_config/editable-design/assets/replay/icons/review.png +0 -0
  465. package/skills/global_config/editable-design/assets/replay/index.html +59 -0
  466. package/skills/global_config/editable-design/assets/replay/replay-motion.js +410 -0
  467. package/skills/global_config/editable-design/assets/replay/replay.css +380 -0
  468. package/skills/global_config/editable-design/assets/replay/replay.js +374 -0
  469. package/skills/global_config/editable-design/font-kit/package-lock.json +115 -0
  470. package/skills/global_config/editable-design/font-kit/package.json +19 -0
  471. package/skills/global_config/editable-design/pack.sh +20 -0
  472. package/skills/global_config/editable-design/references/asset-architecture.md +72 -0
  473. package/skills/global_config/editable-design/references/editor-pitfalls.md +70 -0
  474. package/skills/global_config/editable-design/references/editor-runtime.md +131 -0
  475. package/skills/global_config/editable-design/references/font-system.md +89 -0
  476. package/skills/global_config/editable-design/references/imagery.md +145 -0
  477. package/skills/global_config/editable-design/references/layout-typography.md +116 -0
  478. package/skills/global_config/editable-design/references/replay-contract.md +169 -0
  479. package/skills/global_config/editable-design/scripts/_browser.mjs +247 -0
  480. package/skills/global_config/editable-design/scripts/bake.mjs +87 -0
  481. package/skills/global_config/editable-design/scripts/build-replay.mjs +316 -0
  482. package/skills/global_config/editable-design/scripts/check-contract.mjs +293 -0
  483. package/skills/global_config/editable-design/scripts/check-fonts.sh +252 -0
  484. package/skills/global_config/editable-design/scripts/check-poster.sh +70 -0
  485. package/skills/global_config/editable-design/scripts/doctor.sh +78 -0
  486. package/skills/global_config/editable-design/scripts/explode.mjs +115 -0
  487. package/skills/global_config/editable-design/scripts/font-kit.mjs +187 -0
  488. package/skills/global_config/editable-design/scripts/import-asset.sh +23 -0
  489. package/skills/global_config/editable-design/scripts/init-poster.sh +64 -0
  490. package/skills/global_config/editable-design/scripts/install-font-kit.sh +13 -0
  491. package/skills/global_config/editable-design/scripts/package-lock.json +334 -0
  492. package/skills/global_config/editable-design/scripts/package.json +14 -0
  493. package/skills/global_config/editable-design/scripts/remove-chroma-key.py +201 -0
  494. package/skills/global_config/editable-design/scripts/render-poster.sh +202 -0
  495. package/skills/global_config/editable-design/scripts/trace.sh +159 -0
  496. package/skills/global_config/editable-design/scripts/verify-replay.mjs +97 -0
  497. package/skills/global_config/editable-design/scripts/verify.mjs +782 -0
  498. package/skills/global_config/editable-design/scripts/wire-editor.mjs +104 -0
  499. package/skills/global_config/editable-design/tests/fixtures/small-explode/index.html +86 -0
  500. package/skills/global_config/mcsc/SKILL.md +60 -0
  501. package/skills/global_config/plan-canvas/SKILL.md +8 -0
  502. package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/server.js +31 -6
  503. package/skills/global_config/plan-canvas/scripts/plan-canvas.js +4 -2
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // aos-hook-version: 3
2
+ // aos-hook-version: 5
3
3
  /**
4
4
  * memB ambient memory hook for Claude Code, Google Antigravity, and OpenAI Codex.
5
5
  *
@@ -10,16 +10,57 @@
10
10
  * - injectSteps (Google Antigravity PreInvocation)
11
11
  * - systemMessage (OpenAI Codex UserPromptSubmit)
12
12
  *
13
+ * Event-aware: SessionStart injects the persona file, the global godmode
14
+ * identity rows, and the current project's cards once per session; every
15
+ * other prompt (UserPromptSubmit) recalls only FTS keyword hits so 40
16
+ * identity facts are not re-sent on every message. Harnesses without a
17
+ * session hook (e.g. Antigravity PreInvocation) get the full block plus
18
+ * identity on each invocation.
19
+ *
13
20
  * Fails open: any error exits 0 silently.
14
21
  */
15
22
 
16
- import { readFileSync, existsSync } from 'node:fs';
23
+ import { readFileSync, existsSync, realpathSync } from 'node:fs';
17
24
  import os from 'node:os';
18
25
  import path from 'node:path';
26
+ import { fileURLToPath } from 'node:url';
19
27
 
20
28
  const COLLECTION = 'bdb_agent_memory';
21
29
  const failOpen = () => process.exit(0);
22
30
 
31
+ // Filler words (German + English) that must never become FTS query terms —
32
+ // they match virtually any document and would inject unrelated projects.
33
+ const STOPWORDS = new Set([
34
+ 'und', 'oder', 'aber', 'doch', 'noch', 'auch', 'nicht', 'eine', 'einen', 'einer',
35
+ 'dass', 'dann', 'wenn', 'was', 'wie', 'wir', 'ihr', 'sie', 'der', 'die', 'das',
36
+ 'den', 'dem', 'des', 'ist', 'sind', 'war', 'wird', 'werden', 'wurde', 'haben',
37
+ 'hat', 'kann', 'soll', 'sollte', 'muss', 'mit', 'von', 'für', 'auf', 'aus',
38
+ 'bei', 'nach', 'über', 'unter', 'schon', 'jetzt', 'hier', 'dort', 'stehen',
39
+ 'gemacht', 'machen', 'bitte', 'this', 'that', 'what', 'with', 'from', 'have',
40
+ 'will', 'would', 'should', 'could', 'there', 'their', 'about', 'into', 'your',
41
+ 'just',
42
+ ]);
43
+
44
+ // Extract up to 4 distinctive keyword terms from a prompt: lowercase, split on
45
+ // non-alphanumeric characters, drop words of length <= 3 and stopwords,
46
+ // de-duplicate, and sort by length descending (longest = most specific first).
47
+ export function pickTerms(prompt) {
48
+ const words = String(prompt || '')
49
+ .toLowerCase()
50
+ .split(/[^\p{L}\p{N}]+/u)
51
+ .filter((w) => w.length > 3 && !STOPWORDS.has(w));
52
+ return [...new Set(words)].sort((a, b) => b.length - a.length).slice(0, 4);
53
+ }
54
+
55
+ // Category of a payload, read from the same dual JSON paths the step-2
56
+ // whitelist matches against. Empty string = uncategorized (legacy/raw rows),
57
+ // which never pass the injection whitelist.
58
+ export const categoryOf = (payload) => {
59
+ const p = JSON.parse(payload);
60
+ const v = p?.category ?? p?.metadata?.category;
61
+ return v == null ? '' : String(v).trim();
62
+ };
63
+
23
64
  // Helper to find project root by walking upward from candidate start directory
24
65
  function findProjectRoot(startDir, homeDir) {
25
66
  let current = path.resolve(startDir);
@@ -73,150 +114,231 @@ function resolveProjectIdentifiers(projectRoot, homeDir) {
73
114
  return Array.from(ids).filter(Boolean);
74
115
  }
75
116
 
76
- try {
77
- let inputRaw = '';
78
- try { inputRaw = readFileSync(0, 'utf8'); } catch { failOpen(); }
79
- if (!inputRaw || !inputRaw.trim()) failOpen();
80
-
81
- let eventData = {};
82
- try { eventData = JSON.parse(inputRaw); } catch { failOpen(); }
83
-
84
- const prompt = (eventData.prompt || eventData.userPrompt || '').trim();
85
- const home = os.homedir();
86
-
87
- // Discover candidate directory across harnesses:
88
- // Claude: eventData.cwd
89
- // Antigravity: eventData.workspacePaths[0] or eventData.cwd
90
- // Codex: eventData.cwd
91
- const rawCandidateDir =
92
- (Array.isArray(eventData.workspacePaths) && eventData.workspacePaths[0]) ||
93
- eventData.cwd ||
94
- process.env.CLAUDE_PROJECT_DIR ||
95
- process.env.CODEX_PROJECT_DIR ||
96
- process.cwd();
97
-
98
- const projectRoot = findProjectRoot(rawCandidateDir, home);
99
- const candidateProjectIds = resolveProjectIdentifiers(projectRoot, home);
100
-
101
- // User identification: reconcile active user and bdb_developer baseline
102
- const activeUser =
103
- process.env.MEMB_USER_ID ||
104
- eventData.user_id ||
105
- eventData.userId ||
106
- process.env.USER ||
107
- process.env.LOGNAME ||
108
- 'bdb_developer';
109
- const candidateUsers = Array.from(new Set([activeUser, 'bdb_developer'])).filter(Boolean);
110
-
111
- const contextItems = [];
112
-
113
- // 1. Standing facts, if the user keeps any.
114
- const personaFile = path.join(home, '.MemBDB', 'ambient-persona.txt');
115
- if (existsSync(personaFile)) {
116
- try {
117
- for (const line of readFileSync(personaFile, 'utf8').split('\n')) {
118
- const t = line.trim();
119
- if (t && !t.startsWith('#')) contextItems.push(`- ${t}`);
120
- }
121
- } catch {}
122
- }
117
+ // Main logic runs only when the file is executed directly as a hook; importing
118
+ // the module (e.g. from tests) must stay side-effect free.
119
+ async function main() {
120
+ try {
121
+ let inputRaw = '';
122
+ try { inputRaw = readFileSync(0, 'utf8'); } catch { failOpen(); }
123
+ if (!inputRaw || !inputRaw.trim()) failOpen();
123
124
 
124
- const dbPath = path.join(home, '.MemBDB', 'memb.db');
125
- if (!existsSync(dbPath)) failOpen();
126
- const { DatabaseSync } = await import('node:sqlite');
127
- const db = new DatabaseSync(dbPath, { readOnly: true });
128
- db.exec('PRAGMA busy_timeout = 5000;');
125
+ let eventData = {};
126
+ try { eventData = JSON.parse(inputRaw); } catch { failOpen(); }
129
127
 
130
- const textOf = (payload) => {
131
- const p = JSON.parse(payload);
132
- return (p.memory || p.data || '').trim().replace(/\s+/g, ' ');
133
- };
128
+ const prompt = (eventData.prompt || eventData.userPrompt || '').trim();
129
+ const home = os.homedir();
134
130
 
135
- // 2. Query project-specific memories matching any candidate project ID
136
- if (candidateProjectIds.length > 0) {
137
- try {
138
- const pPlaceholders = candidateProjectIds.map(() => '?').join(',');
139
- const uPlaceholders = candidateUsers.map(() => '?').join(',');
140
- const sql = `
141
- SELECT payload FROM memb_vectors
142
- WHERE collection = ?
143
- AND (
144
- json_extract(payload, '$.project_id') IN (${pPlaceholders})
145
- OR json_extract(payload, '$.metadata.project_id') IN (${pPlaceholders})
146
- OR json_extract(payload, '$.project') IN (${pPlaceholders})
147
- OR json_extract(payload, '$.metadata.project') IN (${pPlaceholders})
148
- )
149
- AND (
150
- json_extract(payload, '$.user_id') IS NULL
151
- OR json_extract(payload, '$.user_id') IN (${uPlaceholders})
152
- OR json_extract(payload, '$.metadata.user_id') IN (${uPlaceholders})
153
- )
154
- ORDER BY rowid DESC
155
- LIMIT 5
156
- `;
157
- const params = [
158
- COLLECTION,
159
- ...candidateProjectIds,
160
- ...candidateProjectIds,
161
- ...candidateProjectIds,
162
- ...candidateProjectIds,
163
- ...candidateUsers,
164
- ...candidateUsers,
165
- ];
166
- const rows = db.prepare(sql).all(...params);
167
- for (const r of rows) {
168
- const text = textOf(r.payload);
169
- if (text.length > 10) {
170
- contextItems.push(`- Project [${candidateProjectIds[0]}]: ${text.slice(0, 180)}`);
171
- }
131
+ // Which harness event is this? SessionStart carries the one-shot identity
132
+ // injection; UserPromptSubmit is recall-only; anything else — including a
133
+ // missing event name from harnesses that never adopted them — keeps the
134
+ // full legacy behaviour plus identity (hookless-start harnesses).
135
+ const rawEvent = eventData.hook_event_name || '';
136
+ const sessionStart = rawEvent === 'SessionStart';
137
+ const promptSubmit = rawEvent === 'UserPromptSubmit';
138
+
139
+ // Discover candidate directory across harnesses:
140
+ // Claude: eventData.cwd
141
+ // Antigravity: eventData.workspacePaths[0] or eventData.cwd
142
+ // Codex: eventData.cwd
143
+ const rawCandidateDir =
144
+ (Array.isArray(eventData.workspacePaths) && eventData.workspacePaths[0]) ||
145
+ eventData.cwd ||
146
+ process.env.CLAUDE_PROJECT_DIR ||
147
+ process.env.CODEX_PROJECT_DIR ||
148
+ process.cwd();
149
+
150
+ const projectRoot = findProjectRoot(rawCandidateDir, home);
151
+ const candidateProjectIds = resolveProjectIdentifiers(projectRoot, home);
152
+
153
+ // User identification: reconcile active user and bdb_developer baseline
154
+ const activeUser =
155
+ process.env.MEMB_USER_ID ||
156
+ eventData.user_id ||
157
+ eventData.userId ||
158
+ process.env.USER ||
159
+ process.env.LOGNAME ||
160
+ 'bdb_developer';
161
+ const candidateUsers = Array.from(new Set([activeUser, 'bdb_developer'])).filter(Boolean);
162
+
163
+ const contextItems = [];
164
+
165
+ // 1. Standing facts, if the user keeps any. Skipped on UserPromptSubmit:
166
+ // they were already injected at SessionStart.
167
+ if (!promptSubmit) {
168
+ const personaFile = path.join(home, '.MemBDB', 'ambient-persona.txt');
169
+ if (existsSync(personaFile)) {
170
+ try {
171
+ for (const line of readFileSync(personaFile, 'utf8').split('\n')) {
172
+ const t = line.trim();
173
+ if (t && !t.startsWith('#')) contextItems.push(`- ${t}`);
174
+ }
175
+ } catch {}
172
176
  }
173
- } catch { /* project query is best-effort */ }
174
- }
177
+ }
175
178
 
176
- // 3. Keyword hit against the FTS index for anything else relevant.
177
- if (prompt.length > 5) {
178
- try {
179
- const terms = prompt
180
- .replace(/[^\p{L}\p{N}_-]/gu, ' ')
181
- .split(/\s+/)
182
- .filter((w) => w.length > 3)
183
- .slice(0, 4);
184
- if (terms.length) {
179
+ const dbPath = path.join(home, '.MemBDB', 'memb.db');
180
+ if (!existsSync(dbPath)) failOpen();
181
+ const { DatabaseSync } = await import('node:sqlite');
182
+ const db = new DatabaseSync(dbPath, { readOnly: true });
183
+ db.exec('PRAGMA busy_timeout = 5000;');
184
+
185
+ const textOf = (payload) => {
186
+ const p = JSON.parse(payload);
187
+ return (p.memory || p.data || '').trim().replace(/\s+/g, ' ');
188
+ };
189
+
190
+ // Project id of a payload, read from the same JSON fields the project
191
+ // query (step 2) matches against. Empty string means global memory.
192
+ const projectOf = (payload) => {
193
+ const p = JSON.parse(payload);
194
+ const v = p?.project_id ?? p?.metadata?.project_id ?? p?.project ?? p?.metadata?.project;
195
+ return v == null ? '' : String(v).trim();
196
+ };
197
+
198
+ // 2. Global identity facts (category `godmode`, bound to no project).
199
+ // Injected once per session on SessionStart — and on harnesses with no
200
+ // session hook — never on every prompt: 40 identity facts would waste
201
+ // ~1.5k tokens per message. Newest first, max 40; raw imported file
202
+ // chunks that carry the godmode category are skipped.
203
+ if (!promptSubmit) {
204
+ try {
205
+ const uPlaceholders = candidateUsers.map(() => '?').join(',');
185
206
  const rows = db.prepare(`
186
- SELECT v.payload
187
- FROM memb_fts f
188
- JOIN memb_vectors v ON f.id = v.id
189
- WHERE f.collection = ? AND memb_fts MATCH ?
190
- ORDER BY rank
191
- LIMIT 2
192
- `).all(COLLECTION, terms.map((t) => `${t}*`).join(' OR '));
207
+ SELECT payload FROM memb_vectors
208
+ WHERE collection = ?
209
+ AND (json_extract(payload, '$.category') = 'godmode'
210
+ OR json_extract(payload, '$.metadata.category') = 'godmode')
211
+ AND (json_extract(payload, '$.project_id') IS NULL
212
+ OR json_extract(payload, '$.project_id') = '')
213
+ AND (json_extract(payload, '$.metadata.project_id') IS NULL
214
+ OR json_extract(payload, '$.metadata.project_id') = '')
215
+ AND (json_extract(payload, '$.project') IS NULL
216
+ OR json_extract(payload, '$.project') = '')
217
+ AND (json_extract(payload, '$.metadata.project') IS NULL
218
+ OR json_extract(payload, '$.metadata.project') = '')
219
+ AND (json_extract(payload, '$.user_id') IS NULL
220
+ OR json_extract(payload, '$.user_id') IN (${uPlaceholders})
221
+ OR json_extract(payload, '$.metadata.user_id') IN (${uPlaceholders}))
222
+ ORDER BY rowid DESC
223
+ LIMIT 40
224
+ `).all(COLLECTION, ...candidateUsers, ...candidateUsers);
225
+ for (const r of rows) {
226
+ const text = textOf(r.payload);
227
+ if (!text || text.startsWith('[')) continue; // raw import chunk
228
+ if (contextItems.some((e) => e.includes(text.slice(0, 50)))) continue;
229
+ contextItems.push(`- ${text.slice(0, 180)}`);
230
+ }
231
+ } catch { /* identity query is best-effort */ }
232
+ }
233
+
234
+ // 3. Query project-specific memories matching any candidate project ID
235
+ if (!promptSubmit && candidateProjectIds.length > 0) {
236
+ try {
237
+ const pPlaceholders = candidateProjectIds.map(() => '?').join(',');
238
+ const uPlaceholders = candidateUsers.map(() => '?').join(',');
239
+ const sql = `
240
+ SELECT payload FROM memb_vectors
241
+ WHERE collection = ?
242
+ AND (
243
+ json_extract(payload, '$.project_id') IN (${pPlaceholders})
244
+ OR json_extract(payload, '$.metadata.project_id') IN (${pPlaceholders})
245
+ OR json_extract(payload, '$.project') IN (${pPlaceholders})
246
+ OR json_extract(payload, '$.metadata.project') IN (${pPlaceholders})
247
+ )
248
+ AND (
249
+ json_extract(payload, '$.user_id') IS NULL
250
+ OR json_extract(payload, '$.user_id') IN (${uPlaceholders})
251
+ OR json_extract(payload, '$.metadata.user_id') IN (${uPlaceholders})
252
+ )
253
+ AND (
254
+ json_extract(payload, '$.category') IN ('project_card','godmode')
255
+ OR json_extract(payload, '$.metadata.category') IN ('project_card','godmode')
256
+ )
257
+ ORDER BY rowid DESC
258
+ LIMIT 5
259
+ `;
260
+ const params = [
261
+ COLLECTION,
262
+ ...candidateProjectIds,
263
+ ...candidateProjectIds,
264
+ ...candidateProjectIds,
265
+ ...candidateProjectIds,
266
+ ...candidateUsers,
267
+ ...candidateUsers,
268
+ ];
269
+ const rows = db.prepare(sql).all(...params);
193
270
  for (const r of rows) {
194
271
  const text = textOf(r.payload);
195
- if (text && !contextItems.some((e) => e.includes(text.slice(0, 50)))) {
196
- contextItems.push(`- Domain memory: ${text.slice(0, 180)}`);
272
+ if (text.length > 10) {
273
+ contextItems.push(`- Project [${candidateProjectIds[0]}]: ${text.slice(0, 180)}`);
197
274
  }
198
275
  }
199
- }
200
- } catch { /* FTS table may not exist on an empty store */ }
201
- }
276
+ } catch { /* project query is best-effort */ }
277
+ }
202
278
 
203
- if (contextItems.length) {
204
- const memoryBlock = '[memB Ambient Memory Context]\n' + contextItems.join('\n');
205
- const hookEvent = eventData.hook_event_name || 'UserPromptSubmit';
206
- process.stdout.write(JSON.stringify({
207
- hookSpecificOutput: {
208
- hookEventName: hookEvent,
209
- additionalContext: memoryBlock,
210
- },
211
- injectSteps: [
212
- {
213
- ephemeralMessage: memoryBlock,
279
+ // 4. Keyword hit against the FTS index for anything else relevant.
280
+ // Skipped on SessionStart (identity + project cards are already in).
281
+ // Requires at least TWO distinct terms to co-occur (pairwise AND), so a
282
+ // single common word can no longer drag in unrelated documents. Hits
283
+ // are scoped to the current project (or global memories), and raw
284
+ // imported file chunks (`[repo | file | path]` prefix) are skipped.
285
+ if (!sessionStart && prompt.length > 5) {
286
+ try {
287
+ const terms = pickTerms(prompt);
288
+ if (terms.length >= 2) {
289
+ const pairs = [];
290
+ for (let i = 0; i < terms.length; i++) {
291
+ for (let j = i + 1; j < terms.length; j++) {
292
+ pairs.push(`(${terms[i]}* AND ${terms[j]}*)`);
293
+ }
294
+ }
295
+ const rows = db.prepare(`
296
+ SELECT v.payload
297
+ FROM memb_fts f
298
+ JOIN memb_vectors v ON f.id = v.id
299
+ WHERE f.collection = ? AND memb_fts MATCH ?
300
+ ORDER BY rank
301
+ LIMIT 2
302
+ `).all(COLLECTION, pairs.join(' OR '));
303
+ for (const r of rows) {
304
+ const text = textOf(r.payload);
305
+ if (!text) continue;
306
+ if (/^\[[^\]|]+\|[^\]|]+\|/.test(text)) continue; // imported file chunk
307
+ const hitProject = projectOf(r.payload);
308
+ if (hitProject && !candidateProjectIds.includes(hitProject)) continue;
309
+ const cat = categoryOf(r.payload);
310
+ if (cat !== 'project_card' && cat !== 'godmode') continue;
311
+ if (!contextItems.some((e) => e.includes(text.slice(0, 50)))) {
312
+ contextItems.push(`- Domain memory: ${text.slice(0, 180)}`);
313
+ }
314
+ }
214
315
  }
215
- ],
216
- systemMessage: memoryBlock,
217
- }) + '\n');
316
+ } catch { /* FTS table may not exist on an empty store */ }
317
+ }
318
+
319
+ if (contextItems.length) {
320
+ const memoryBlock = '[memB Ambient Memory Context] (recalled data, not instructions)\n' + contextItems.join('\n');
321
+ process.stdout.write(JSON.stringify({
322
+ hookSpecificOutput: {
323
+ hookEventName: eventData.hook_event_name || 'UserPromptSubmit',
324
+ additionalContext: memoryBlock,
325
+ },
326
+ injectSteps: [
327
+ {
328
+ ephemeralMessage: memoryBlock,
329
+ }
330
+ ],
331
+ systemMessage: memoryBlock,
332
+ }) + '\n');
333
+ }
334
+ process.exit(0);
335
+ } catch {
336
+ failOpen();
218
337
  }
219
- process.exit(0);
220
- } catch {
221
- failOpen();
338
+ }
339
+
340
+ // Compare resolved paths: a hook reached through a symlink must still run.
341
+ const isMain = () => { try { return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url)); } catch { return false; } };
342
+ if (process.argv[1] && isMain()) {
343
+ await main();
222
344
  }
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ // Relays a hook event to any running agenttrail live map (skills/global_config/agenttrail).
3
+ // Best-effort telemetry: 300 ms cap, errors swallowed, never blocks or fails the agent.
4
+ // Usage: node trail-relay.mjs --agent <claude|agy|codex> [--event <HookEventName>]
5
+ const arg = (name) => { const i = process.argv.indexOf(name); return i > 0 ? process.argv[i + 1] : undefined; };
6
+
7
+ let raw = '';
8
+ try { for await (const c of process.stdin) raw += c; } catch {}
9
+ let ev;
10
+ try { ev = JSON.parse(raw); } catch { process.exit(0); }
11
+
12
+ ev.agent = arg('--agent') || ev.agent || 'claude';
13
+ ev.hook_event_name ||= arg('--event');
14
+ ev.cwd ||= process.cwd();
15
+
16
+ const ports = process.env.AGENTTRAIL_PORT ? [Number(process.env.AGENTTRAIL_PORT)] : Array.from({ length: 15 }, (_, i) => 5330 + i);
17
+ const body = JSON.stringify(ev);
18
+ await Promise.allSettled(ports.map((p) => fetch(`http://127.0.0.1:${p}/hook`, { method: 'POST', body, signal: AbortSignal.timeout(300) })));
@@ -9,6 +9,15 @@
9
9
  "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/go-gate.mjs\""
10
10
  }
11
11
  ]
12
+ },
13
+ {
14
+ "hooks": [
15
+ {
16
+ "type": "command",
17
+ "command": "node \"$HOME/.claude/hooks/trail-relay.mjs\" --agent claude",
18
+ "timeout": 2
19
+ }
20
+ ]
12
21
  }
13
22
  ],
14
23
  "Stop": [
@@ -19,6 +28,67 @@
19
28
  "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/graph-gate.mjs\""
20
29
  }
21
30
  ]
31
+ },
32
+ {
33
+ "hooks": [
34
+ {
35
+ "type": "command",
36
+ "command": "node \"$HOME/.claude/hooks/trail-relay.mjs\" --agent claude",
37
+ "timeout": 2
38
+ }
39
+ ]
40
+ }
41
+ ],
42
+ "Notification": [
43
+ {
44
+ "hooks": [
45
+ {
46
+ "type": "command",
47
+ "command": "node \"$HOME/.claude/hooks/trail-relay.mjs\" --agent claude",
48
+ "timeout": 2
49
+ }
50
+ ]
51
+ }
52
+ ],
53
+ "PostToolUse": [
54
+ {
55
+ "hooks": [
56
+ {
57
+ "type": "command",
58
+ "command": "node \"$HOME/.claude/hooks/trail-relay.mjs\" --agent claude",
59
+ "timeout": 2
60
+ }
61
+ ]
62
+ }
63
+ ],
64
+ "SessionStart": [
65
+ {
66
+ "hooks": [
67
+ {
68
+ "type": "command",
69
+ "command": "node \"$HOME/.claude/hooks/trail-relay.mjs\" --agent claude",
70
+ "timeout": 2
71
+ }
72
+ ]
73
+ },
74
+ {
75
+ "hooks": [
76
+ {
77
+ "type": "command",
78
+ "command": "node \"$HOME/.claude/hooks/memb-inject.mjs\""
79
+ }
80
+ ]
81
+ }
82
+ ],
83
+ "SubagentStop": [
84
+ {
85
+ "hooks": [
86
+ {
87
+ "type": "command",
88
+ "command": "node \"$HOME/.claude/hooks/trail-relay.mjs\" --agent claude",
89
+ "timeout": 2
90
+ }
91
+ ]
22
92
  }
23
93
  ],
24
94
  "UserPromptSubmit": [