@hybridlabor-api/aos 4.6.6 → 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 (484) 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-uninstall.mjs +55 -1
  15. package/docs/handover/agenttrail-for-ao.md +58 -0
  16. package/docs/handover/deja-for-ao.md +51 -0
  17. package/installer.js +141 -37
  18. package/mcp_config.json +4 -0
  19. package/mcps/mcsc/README.md +24 -0
  20. package/mcps/mcsc/package-lock.json +1234 -0
  21. package/mcps/mcsc/package.json +14 -0
  22. package/mcps/mcsc/packages/core/bin/mcsc.js +162 -0
  23. package/mcps/mcsc/packages/core/rulebook.default.yaml +49 -0
  24. package/mcps/mcsc/packages/core/schema/rulebook.schema.json +56 -0
  25. package/mcps/mcsc/packages/core/src/adapters/agy.js +107 -0
  26. package/mcps/mcsc/packages/core/src/adapters/codex.js +56 -0
  27. package/mcps/mcsc/packages/core/src/adapters/native.js +14 -0
  28. package/mcps/mcsc/packages/core/src/adapters/opencode.js +183 -0
  29. package/mcps/mcsc/packages/core/src/adapters/types.js +21 -0
  30. package/mcps/mcsc/packages/core/src/capabilities/buildOfferTable.js +34 -0
  31. package/mcps/mcsc/packages/core/src/capabilities/registry.js +99 -0
  32. package/mcps/mcsc/packages/core/src/capabilities/types.js +24 -0
  33. package/mcps/mcsc/packages/core/src/detect/cache.js +47 -0
  34. package/mcps/mcsc/packages/core/src/detect/inventory.js +73 -0
  35. package/mcps/mcsc/packages/core/src/detect/probes.js +158 -0
  36. package/mcps/mcsc/packages/core/src/detect/types.js +26 -0
  37. package/mcps/mcsc/packages/core/src/rulebook/load.js +53 -0
  38. package/mcps/mcsc/packages/core/src/rulebook/resolve.js +227 -0
  39. package/mcps/mcsc/packages/core/src/rulebook/rulebook.types.js +89 -0
  40. package/mcps/mcsc/packages/core/src/trail.js +17 -0
  41. package/mcps/mcsc/packages/mcp/server.js +302 -0
  42. package/mcps/mcsc/server.js +2 -0
  43. package/package.json +3 -1
  44. package/skills/basic/bdbmediastorm/SKILL.md +1 -1
  45. package/skills/basic/godmode-ui-ux/SKILL.md +2 -2
  46. package/skills/basic/godmode-ui-ux/references/anti-slop-rules.md +44 -40
  47. package/skills/basic/godmode-ui-ux/references/taste-archetypes.md +49 -0
  48. package/skills/basic/startcycle/SKILL.md +7 -0
  49. package/skills/basic/startcycle-graph/SKILL.md +12 -0
  50. package/skills/basic/startcycle-graph-user/SKILL.md +3 -0
  51. package/skills/basic/teamwork-preview/SKILL.md +2 -0
  52. package/skills/bdbrainstorm/SKILL.md +1 -0
  53. package/skills/global_config/agenttrail/LICENSE +21 -0
  54. package/skills/global_config/agenttrail/SKILL.md +48 -0
  55. package/skills/global_config/agenttrail/bin/agenttrail.mjs +1002 -0
  56. package/skills/global_config/agenttrail/public/index.html +661 -0
  57. package/skills/global_config/aos-project-init/SKILL.md +25 -5
  58. package/skills/global_config/aos-setup/SKILL.md +34 -1
  59. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +115 -1
  60. package/skills/global_config/archify/LICENSE +22 -0
  61. package/skills/global_config/archify/SKILL.md +140 -0
  62. package/skills/global_config/archify/THIRD_PARTY_NOTICES.md +69 -0
  63. package/skills/global_config/archify/assets/JetBrainsMono-OFL.txt +93 -0
  64. package/skills/global_config/archify/assets/template.html +14937 -0
  65. package/skills/global_config/archify/bin/archify.mjs +2139 -0
  66. package/skills/global_config/archify/bin/open-artifact.mjs +86 -0
  67. package/skills/global_config/archify/bin/preview.mjs +653 -0
  68. package/skills/global_config/archify/bin/visual-check.mjs +829 -0
  69. package/skills/global_config/archify/brand-marks/README.md +31 -0
  70. package/skills/global_config/archify/brand-marks/catalog.json +131 -0
  71. package/skills/global_config/archify/delta/architecture-delta.mjs +1232 -0
  72. package/skills/global_config/archify/examples/agent-run.lifecycle.json +60 -0
  73. package/skills/global_config/archify/examples/agent-tool-call.workflow.json +94 -0
  74. package/skills/global_config/archify/examples/async-job-roundtrip.sequence.json +61 -0
  75. package/skills/global_config/archify/examples/brand-aware-delivery.architecture.json +47 -0
  76. package/skills/global_config/archify/examples/cache-miss-request.sequence.json +82 -0
  77. package/skills/global_config/archify/examples/checkout-platform.base.architecture.json +31 -0
  78. package/skills/global_config/archify/examples/checkout-platform.head.architecture.json +31 -0
  79. package/skills/global_config/archify/examples/deployment-release.lifecycle.json +49 -0
  80. package/skills/global_config/archify/examples/event-stream.dataflow.json +57 -0
  81. package/skills/global_config/archify/examples/incident-response.workflow.json +64 -0
  82. package/skills/global_config/archify/examples/product-analytics.dataflow.json +76 -0
  83. package/skills/global_config/archify/examples/production-deployment.architecture.json +71 -0
  84. package/skills/global_config/archify/examples/release-delivery.workflow.json +62 -0
  85. package/skills/global_config/archify/examples/web-app.architecture.json +46 -0
  86. package/skills/global_config/archify/migrations/workflow-v2.mjs +279 -0
  87. package/skills/global_config/archify/package.json +39 -0
  88. package/skills/global_config/archify/recipes/scenarios.mjs +391 -0
  89. package/skills/global_config/archify/references/authoring-contract.md +247 -0
  90. package/skills/global_config/archify/references/brand-marks.md +65 -0
  91. package/skills/global_config/archify/references/delivery-contract.md +138 -0
  92. package/skills/global_config/archify/references/viewer-runtime.md +45 -0
  93. package/skills/global_config/archify/renderers/architecture/grid.mjs +62 -0
  94. package/skills/global_config/archify/renderers/architecture/render-architecture.mjs +1078 -0
  95. package/skills/global_config/archify/renderers/dataflow/README.md +104 -0
  96. package/skills/global_config/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  97. package/skills/global_config/archify/renderers/lifecycle/README.md +115 -0
  98. package/skills/global_config/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  99. package/skills/global_config/archify/renderers/sequence/README.md +114 -0
  100. package/skills/global_config/archify/renderers/sequence/render-sequence.mjs +464 -0
  101. package/skills/global_config/archify/renderers/shared/brand-marks.mjs +563 -0
  102. package/skills/global_config/archify/renderers/shared/cli.mjs +218 -0
  103. package/skills/global_config/archify/renderers/shared/desktop-readability.mjs +26 -0
  104. package/skills/global_config/archify/renderers/shared/diagnostics.mjs +160 -0
  105. package/skills/global_config/archify/renderers/shared/engineering-profiles.mjs +157 -0
  106. package/skills/global_config/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  107. package/skills/global_config/archify/renderers/shared/generated-validators.mjs +13 -0
  108. package/skills/global_config/archify/renderers/shared/geometry.mjs +1423 -0
  109. package/skills/global_config/archify/renderers/shared/i18n.mjs +595 -0
  110. package/skills/global_config/archify/renderers/shared/layout-report.mjs +40 -0
  111. package/skills/global_config/archify/renderers/shared/legend.mjs +217 -0
  112. package/skills/global_config/archify/renderers/shared/output-path.mjs +340 -0
  113. package/skills/global_config/archify/renderers/shared/repository-evidence.mjs +239 -0
  114. package/skills/global_config/archify/renderers/shared/repository-location.mjs +58 -0
  115. package/skills/global_config/archify/renderers/shared/text-fit.mjs +49 -0
  116. package/skills/global_config/archify/renderers/shared/utils.mjs +232 -0
  117. package/skills/global_config/archify/renderers/shared/validator.mjs +86 -0
  118. package/skills/global_config/archify/renderers/workflow/README.md +223 -0
  119. package/skills/global_config/archify/renderers/workflow/render-workflow.mjs +35 -0
  120. package/skills/global_config/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  121. package/skills/global_config/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  122. package/skills/global_config/archify/schemas/README.md +211 -0
  123. package/skills/global_config/archify/schemas/architecture.schema.json +178 -0
  124. package/skills/global_config/archify/schemas/common.schema.json +115 -0
  125. package/skills/global_config/archify/schemas/dataflow.schema.json +243 -0
  126. package/skills/global_config/archify/schemas/lifecycle.schema.json +266 -0
  127. package/skills/global_config/archify/schemas/sequence.schema.json +223 -0
  128. package/skills/global_config/archify/schemas/workflow.schema.json +428 -0
  129. package/skills/global_config/archify/scripts/check-render-output.mjs +916 -0
  130. package/skills/global_config/archify/scripts/generate-brand-marks.mjs +141 -0
  131. package/skills/global_config/archify/scripts/generate-validators.mjs +66 -0
  132. package/skills/global_config/archify/scripts/render-examples.mjs +26 -0
  133. package/skills/global_config/archify/skill-release.json +10 -0
  134. package/skills/global_config/bdb-security-audit/SKILL.md +109 -0
  135. package/skills/global_config/bdb-security-audit/references/audit-checklists.md +172 -0
  136. package/skills/global_config/bdb-security-audit/references/skylos-guide.md +139 -0
  137. package/skills/global_config/bdb-security-audit/references/xalgorix-bridge.md +110 -0
  138. package/skills/global_config/bdbdesignpro/SKILL.md +4 -4
  139. package/skills/global_config/bdbdesignpro/references/bdb-motion-tokens.md +52 -31
  140. package/skills/global_config/bdbresilience/SKILL.md +10 -0
  141. package/skills/global_config/brag/SKILL.md +179 -0
  142. package/skills/global_config/brag/assets/music/README.md +20 -0
  143. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
  144. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
  145. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
  146. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
  147. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
  148. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
  149. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
  150. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
  151. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
  152. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
  153. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
  154. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
  155. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
  156. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
  157. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
  158. package/skills/global_config/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
  159. package/skills/global_config/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
  160. package/skills/global_config/brag/assets/sfx/casino/card-place-1.ogg +0 -0
  161. package/skills/global_config/brag/assets/sfx/casino/card-place-2.ogg +0 -0
  162. package/skills/global_config/brag/assets/sfx/casino/card-place-3.ogg +0 -0
  163. package/skills/global_config/brag/assets/sfx/casino/card-place-4.ogg +0 -0
  164. package/skills/global_config/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
  165. package/skills/global_config/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
  166. package/skills/global_config/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
  167. package/skills/global_config/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
  168. package/skills/global_config/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
  169. package/skills/global_config/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
  170. package/skills/global_config/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
  171. package/skills/global_config/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
  172. package/skills/global_config/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
  173. package/skills/global_config/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
  174. package/skills/global_config/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
  175. package/skills/global_config/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
  176. package/skills/global_config/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
  177. package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
  178. package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
  179. package/skills/global_config/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
  180. package/skills/global_config/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
  181. package/skills/global_config/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
  182. package/skills/global_config/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
  183. package/skills/global_config/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
  184. package/skills/global_config/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
  185. package/skills/global_config/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
  186. package/skills/global_config/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
  187. package/skills/global_config/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
  188. package/skills/global_config/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
  189. package/skills/global_config/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
  190. package/skills/global_config/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
  191. package/skills/global_config/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
  192. package/skills/global_config/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
  193. package/skills/global_config/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
  194. package/skills/global_config/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
  195. package/skills/global_config/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
  196. package/skills/global_config/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
  197. package/skills/global_config/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
  198. package/skills/global_config/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
  199. package/skills/global_config/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
  200. package/skills/global_config/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
  201. package/skills/global_config/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
  202. package/skills/global_config/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
  203. package/skills/global_config/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
  204. package/skills/global_config/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
  205. package/skills/global_config/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
  206. package/skills/global_config/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
  207. package/skills/global_config/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
  208. package/skills/global_config/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
  209. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
  210. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
  211. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
  212. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
  213. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
  214. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
  215. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
  216. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
  217. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
  218. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
  219. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
  220. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
  221. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
  222. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
  223. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
  224. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
  225. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
  226. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
  227. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
  228. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
  229. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
  230. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
  231. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
  232. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
  233. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
  234. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
  235. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
  236. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
  237. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
  238. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
  239. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
  240. package/skills/global_config/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
  241. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
  242. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
  243. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
  244. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
  245. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
  246. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
  247. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
  248. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
  249. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
  250. package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
  251. package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
  252. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
  253. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
  254. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
  255. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
  256. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
  257. package/skills/global_config/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
  258. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
  259. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
  260. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
  261. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
  262. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
  263. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
  264. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
  265. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
  266. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
  267. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
  268. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
  269. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
  270. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
  271. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
  272. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
  273. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
  274. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
  275. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
  276. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
  277. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
  278. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
  279. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
  280. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
  281. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
  282. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
  283. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
  284. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
  285. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
  286. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
  287. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
  288. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
  289. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
  290. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
  291. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
  292. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
  293. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
  294. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
  295. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
  296. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
  297. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
  298. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
  299. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
  300. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
  301. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
  302. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
  303. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
  304. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
  305. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
  306. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
  307. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
  308. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
  309. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
  310. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
  311. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
  312. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
  313. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
  314. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
  315. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
  316. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
  317. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
  318. package/skills/global_config/brag/assets/sfx/interface/bong_001.ogg +0 -0
  319. package/skills/global_config/brag/assets/sfx/interface/click_001.ogg +0 -0
  320. package/skills/global_config/brag/assets/sfx/interface/click_002.ogg +0 -0
  321. package/skills/global_config/brag/assets/sfx/interface/click_003.ogg +0 -0
  322. package/skills/global_config/brag/assets/sfx/interface/click_004.ogg +0 -0
  323. package/skills/global_config/brag/assets/sfx/interface/click_005.ogg +0 -0
  324. package/skills/global_config/brag/assets/sfx/interface/drop_001.ogg +0 -0
  325. package/skills/global_config/brag/assets/sfx/interface/drop_002.ogg +0 -0
  326. package/skills/global_config/brag/assets/sfx/interface/drop_003.ogg +0 -0
  327. package/skills/global_config/brag/assets/sfx/interface/error_005.ogg +0 -0
  328. package/skills/global_config/brag/assets/sfx/interface/error_006.ogg +0 -0
  329. package/skills/global_config/brag/assets/sfx/interface/glitch_002.ogg +0 -0
  330. package/skills/global_config/brag/assets/sfx/interface/glitch_004.ogg +0 -0
  331. package/skills/global_config/brag/assets/sfx/interface/select_008.ogg +0 -0
  332. package/skills/global_config/brag/assets/sfx/interface/switch_001.ogg +0 -0
  333. package/skills/global_config/brag/assets/sfx/interface/switch_002.ogg +0 -0
  334. package/skills/global_config/brag/assets/sfx/interface/switch_004.ogg +0 -0
  335. package/skills/global_config/brag/assets/sfx/interface/switch_005.ogg +0 -0
  336. package/skills/global_config/brag/assets/sfx/interface/switch_006.ogg +0 -0
  337. package/skills/global_config/brag/assets/sfx/interface/switch_007.ogg +0 -0
  338. package/skills/global_config/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
  339. package/skills/global_config/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
  340. package/skills/global_config/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
  341. package/skills/global_config/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
  342. package/skills/global_config/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
  343. package/skills/global_config/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
  344. package/skills/global_config/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
  345. package/skills/global_config/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
  346. package/skills/global_config/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
  347. package/skills/global_config/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
  348. package/skills/global_config/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
  349. package/skills/global_config/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
  350. package/skills/global_config/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
  351. package/skills/global_config/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
  352. package/skills/global_config/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
  353. package/skills/global_config/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
  354. package/skills/global_config/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
  355. package/skills/global_config/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
  356. package/skills/global_config/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
  357. package/skills/global_config/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
  358. package/skills/global_config/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
  359. package/skills/global_config/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
  360. package/skills/global_config/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
  361. package/skills/global_config/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
  362. package/skills/global_config/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
  363. package/skills/global_config/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
  364. package/skills/global_config/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
  365. package/skills/global_config/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
  366. package/skills/global_config/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
  367. package/skills/global_config/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
  368. package/skills/global_config/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
  369. package/skills/global_config/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
  370. package/skills/global_config/brag/assets/sfx/sfx-analysis.json +15584 -0
  371. package/skills/global_config/brag/assets/sfx/sfx-analysis.md +75 -0
  372. package/skills/global_config/brag/assets/sfx/ui/click1.ogg +0 -0
  373. package/skills/global_config/brag/assets/sfx/ui/click2.ogg +0 -0
  374. package/skills/global_config/brag/assets/sfx/ui/click3.ogg +0 -0
  375. package/skills/global_config/brag/assets/sfx/ui/click4.ogg +0 -0
  376. package/skills/global_config/brag/assets/sfx/ui/click5.ogg +0 -0
  377. package/skills/global_config/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
  378. package/skills/global_config/brag/assets/sfx/ui/rollover1.ogg +0 -0
  379. package/skills/global_config/brag/assets/sfx/ui/rollover2.ogg +0 -0
  380. package/skills/global_config/brag/assets/sfx/ui/rollover4.ogg +0 -0
  381. package/skills/global_config/brag/assets/sfx/ui/rollover5.ogg +0 -0
  382. package/skills/global_config/brag/assets/sfx/ui/switch1.ogg +0 -0
  383. package/skills/global_config/brag/assets/sfx/ui/switch10.ogg +0 -0
  384. package/skills/global_config/brag/assets/sfx/ui/switch11.ogg +0 -0
  385. package/skills/global_config/brag/assets/sfx/ui/switch12.ogg +0 -0
  386. package/skills/global_config/brag/assets/sfx/ui/switch13.ogg +0 -0
  387. package/skills/global_config/brag/assets/sfx/ui/switch14.ogg +0 -0
  388. package/skills/global_config/brag/assets/sfx/ui/switch15.ogg +0 -0
  389. package/skills/global_config/brag/assets/sfx/ui/switch16.ogg +0 -0
  390. package/skills/global_config/brag/assets/sfx/ui/switch17.ogg +0 -0
  391. package/skills/global_config/brag/assets/sfx/ui/switch18.ogg +0 -0
  392. package/skills/global_config/brag/assets/sfx/ui/switch19.ogg +0 -0
  393. package/skills/global_config/brag/assets/sfx/ui/switch2.ogg +0 -0
  394. package/skills/global_config/brag/assets/sfx/ui/switch20.ogg +0 -0
  395. package/skills/global_config/brag/assets/sfx/ui/switch21.ogg +0 -0
  396. package/skills/global_config/brag/assets/sfx/ui/switch22.ogg +0 -0
  397. package/skills/global_config/brag/assets/sfx/ui/switch23.ogg +0 -0
  398. package/skills/global_config/brag/assets/sfx/ui/switch24.ogg +0 -0
  399. package/skills/global_config/brag/assets/sfx/ui/switch25.ogg +0 -0
  400. package/skills/global_config/brag/assets/sfx/ui/switch26.ogg +0 -0
  401. package/skills/global_config/brag/assets/sfx/ui/switch27.ogg +0 -0
  402. package/skills/global_config/brag/assets/sfx/ui/switch28.ogg +0 -0
  403. package/skills/global_config/brag/assets/sfx/ui/switch29.ogg +0 -0
  404. package/skills/global_config/brag/assets/sfx/ui/switch3.ogg +0 -0
  405. package/skills/global_config/brag/assets/sfx/ui/switch30.ogg +0 -0
  406. package/skills/global_config/brag/assets/sfx/ui/switch31.ogg +0 -0
  407. package/skills/global_config/brag/assets/sfx/ui/switch32.ogg +0 -0
  408. package/skills/global_config/brag/assets/sfx/ui/switch33.ogg +0 -0
  409. package/skills/global_config/brag/assets/sfx/ui/switch34.ogg +0 -0
  410. package/skills/global_config/brag/assets/sfx/ui/switch35.ogg +0 -0
  411. package/skills/global_config/brag/assets/sfx/ui/switch36.ogg +0 -0
  412. package/skills/global_config/brag/assets/sfx/ui/switch37.ogg +0 -0
  413. package/skills/global_config/brag/assets/sfx/ui/switch38.ogg +0 -0
  414. package/skills/global_config/brag/assets/sfx/ui/switch4.ogg +0 -0
  415. package/skills/global_config/brag/assets/sfx/ui/switch5.ogg +0 -0
  416. package/skills/global_config/brag/assets/sfx/ui/switch6.ogg +0 -0
  417. package/skills/global_config/brag/assets/sfx/ui/switch7.ogg +0 -0
  418. package/skills/global_config/brag/assets/sfx/ui/switch8.ogg +0 -0
  419. package/skills/global_config/brag/assets/sfx/ui/switch9.ogg +0 -0
  420. package/skills/global_config/brag/references/audio.md +307 -0
  421. package/skills/global_config/brag/references/step-1-inspect.md +133 -0
  422. package/skills/global_config/brag/references/step-2-plan.md +234 -0
  423. package/skills/global_config/brag/references/step-3-compose.md +210 -0
  424. package/skills/global_config/brag/references/step-4-deliver.md +168 -0
  425. package/skills/global_config/brag/references/tones.md +231 -0
  426. package/skills/global_config/brag/scripts/analyze_music_cues.py +309 -0
  427. package/skills/global_config/brag/scripts/pyproject.toml +14 -0
  428. package/skills/global_config/brag/scripts/uv.lock +819 -0
  429. package/skills/global_config/deja-memory/SKILL.md +42 -0
  430. package/skills/global_config/editable-design/LICENSE +202 -0
  431. package/skills/global_config/editable-design/README.md +34 -0
  432. package/skills/global_config/editable-design/SKILL.md +630 -0
  433. package/skills/global_config/editable-design/THIRD_PARTY_NOTICES.md +10 -0
  434. package/skills/global_config/editable-design/agents/openai.yaml +4 -0
  435. package/skills/global_config/editable-design/assets/editor/layer-editor.css +262 -0
  436. package/skills/global_config/editable-design/assets/editor/layer-editor.js +1929 -0
  437. package/skills/global_config/editable-design/assets/poster-starter/README.md +92 -0
  438. package/skills/global_config/editable-design/assets/poster-starter/assets/.gitkeep +0 -0
  439. package/skills/global_config/editable-design/assets/poster-starter/index.html +91 -0
  440. package/skills/global_config/editable-design/assets/poster-starter/poster.json +6 -0
  441. package/skills/global_config/editable-design/assets/poster-starter/reference/.gitkeep +1 -0
  442. package/skills/global_config/editable-design/assets/replay/icons/assets.png +0 -0
  443. package/skills/global_config/editable-design/assets/replay/icons/html.png +0 -0
  444. package/skills/global_config/editable-design/assets/replay/icons/input.png +0 -0
  445. package/skills/global_config/editable-design/assets/replay/icons/layers.png +0 -0
  446. package/skills/global_config/editable-design/assets/replay/icons/plan.png +0 -0
  447. package/skills/global_config/editable-design/assets/replay/icons/reference.png +0 -0
  448. package/skills/global_config/editable-design/assets/replay/icons/review.png +0 -0
  449. package/skills/global_config/editable-design/assets/replay/index.html +59 -0
  450. package/skills/global_config/editable-design/assets/replay/replay-motion.js +410 -0
  451. package/skills/global_config/editable-design/assets/replay/replay.css +380 -0
  452. package/skills/global_config/editable-design/assets/replay/replay.js +374 -0
  453. package/skills/global_config/editable-design/font-kit/package-lock.json +115 -0
  454. package/skills/global_config/editable-design/font-kit/package.json +19 -0
  455. package/skills/global_config/editable-design/pack.sh +20 -0
  456. package/skills/global_config/editable-design/references/asset-architecture.md +72 -0
  457. package/skills/global_config/editable-design/references/editor-pitfalls.md +70 -0
  458. package/skills/global_config/editable-design/references/editor-runtime.md +131 -0
  459. package/skills/global_config/editable-design/references/font-system.md +89 -0
  460. package/skills/global_config/editable-design/references/imagery.md +145 -0
  461. package/skills/global_config/editable-design/references/layout-typography.md +116 -0
  462. package/skills/global_config/editable-design/references/replay-contract.md +169 -0
  463. package/skills/global_config/editable-design/scripts/_browser.mjs +247 -0
  464. package/skills/global_config/editable-design/scripts/bake.mjs +87 -0
  465. package/skills/global_config/editable-design/scripts/build-replay.mjs +316 -0
  466. package/skills/global_config/editable-design/scripts/check-contract.mjs +293 -0
  467. package/skills/global_config/editable-design/scripts/check-fonts.sh +252 -0
  468. package/skills/global_config/editable-design/scripts/check-poster.sh +70 -0
  469. package/skills/global_config/editable-design/scripts/doctor.sh +78 -0
  470. package/skills/global_config/editable-design/scripts/explode.mjs +115 -0
  471. package/skills/global_config/editable-design/scripts/font-kit.mjs +187 -0
  472. package/skills/global_config/editable-design/scripts/import-asset.sh +23 -0
  473. package/skills/global_config/editable-design/scripts/init-poster.sh +64 -0
  474. package/skills/global_config/editable-design/scripts/install-font-kit.sh +13 -0
  475. package/skills/global_config/editable-design/scripts/package-lock.json +334 -0
  476. package/skills/global_config/editable-design/scripts/package.json +14 -0
  477. package/skills/global_config/editable-design/scripts/remove-chroma-key.py +201 -0
  478. package/skills/global_config/editable-design/scripts/render-poster.sh +202 -0
  479. package/skills/global_config/editable-design/scripts/trace.sh +159 -0
  480. package/skills/global_config/editable-design/scripts/verify-replay.mjs +97 -0
  481. package/skills/global_config/editable-design/scripts/verify.mjs +782 -0
  482. package/skills/global_config/editable-design/scripts/wire-editor.mjs +104 -0
  483. package/skills/global_config/editable-design/tests/fixtures/small-explode/index.html +86 -0
  484. package/skills/global_config/plan-canvas/SKILL.md +8 -0
package/.agents/agents.md CHANGED
@@ -170,6 +170,7 @@ Ported from [affaan-m/ECC](https://github.com/affaan-m/ECC) (MIT) — see
170
170
  - `systematic-debugging`
171
171
  - `clean-code`
172
172
  - `api-design-principles`
173
+ - `bdb-security-audit`
173
174
  - **Output Artifact**: findings returned inline (writes no file)
174
175
 
175
176
  ---
@@ -45,6 +45,8 @@
45
45
  "optional": false,
46
46
  "skills": [
47
47
  "godmode-ui-ux",
48
+ "bdbdesignpro",
49
+ "editable-design",
48
50
  "senior-frontend",
49
51
  "landing-page-generator",
50
52
  "shadcn",
@@ -125,12 +127,14 @@
125
127
  "optional": false,
126
128
  "skills": [
127
129
  "godmode-shipping",
130
+ "brag",
128
131
  "webapp-testing",
129
132
  "seo-audit",
130
133
  "wcag-audit-patterns",
131
134
  "github-repo",
132
135
  "clean-code",
133
- "bdbresilience"
136
+ "bdbresilience",
137
+ "bdb-security-audit"
134
138
  ],
135
139
  "instructions": null
136
140
  }
@@ -60,7 +60,8 @@
60
60
  "typecheck": { "type": "string", "enum": ["pass", "fail", "skip"] },
61
61
  "tests": { "type": "string", "enum": ["pass", "fail", "skip"] },
62
62
  "a11y": { "type": "string", "enum": ["pass", "fail", "skip"] },
63
- "seo": { "type": "string", "enum": ["pass", "fail", "skip"] }
63
+ "seo": { "type": "string", "enum": ["pass", "fail", "skip"] },
64
+ "security": { "type": "string", "enum": ["pass", "fail", "skip"] }
64
65
  },
65
66
  "additionalProperties": false
66
67
  },
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "version": "1.0.0",
4
+ "description": "Pinned upstream vendor repositories tracked for AOS skills and tools",
5
+ "updated_at": "2026-09-24T07:27:44Z",
6
+ "vendors": {
7
+ "superdesign-skill": {
8
+ "upstream": "https://github.com/superdesigndev/superdesign-skill",
9
+ "pinned_commit": "f9f05cd988c247dce6c072eaf9ac6b162f2ffc4b",
10
+ "purpose": "Design tokens, typography hierarchy, spacing scale, component patterns, dsh",
11
+ "target_skill": "godmode-ui-ux"
12
+ },
13
+ "taste-skill": {
14
+ "upstream": "https://github.com/Leonxlnx/taste-skill",
15
+ "pinned_commit": "c184364c58658b2f131b4ae8bd3d206cabb3deee",
16
+ "purpose": "Aesthetic archetypes (Swiss, Minimalist, Luxury, Soft, Tactical) and taste injection",
17
+ "target_skill": "godmode-ui-ux"
18
+ },
19
+ "anti-slop": {
20
+ "upstream": "https://github.com/miqdadbadjuber/anti-slop",
21
+ "pinned_commit": "0e384b7bff3301c8ec56dea300330772fed28e6a",
22
+ "purpose": "Strict negative rules, banned buzzwords, banned generic patterns, touch zones",
23
+ "target_skill": "godmode-ui-ux, reviewer"
24
+ },
25
+ "editable-design": {
26
+ "upstream": "https://github.com/yejy53/Editable-Design",
27
+ "pinned_commit": "42ab412fec1d5f32cb86c107430e9fb69674200f",
28
+ "purpose": "Fixed-canvas visual design, interactive editor.html, exploded layer inspection",
29
+ "target_skill": "editable-design"
30
+ },
31
+ "brag": {
32
+ "upstream": "https://github.com/latent-spaces/brag",
33
+ "pinned_commit": "57ce4c9bb912f01a0078b154318bf67c5cbf780f",
34
+ "purpose": "Hyperframes project-to-launch-video generator",
35
+ "target_skill": "brag (post-shipping release hook)"
36
+ },
37
+ "skylos": {
38
+ "upstream": "https://github.com/duriantaco/skylos",
39
+ "pinned_commit": "0c95b002424453983d5c96708cf7865939745d98",
40
+ "purpose": "Diff-based AST and static security analyzer for shipping gate",
41
+ "target_skill": "bdb-security-audit, godmode-shipping"
42
+ },
43
+ "claude-red": {
44
+ "upstream": "https://github.com/SnailSploit/claude-red",
45
+ "pinned_commit": "739512a8588b28ff3b554e669391c22508602878",
46
+ "purpose": "Defensive audit heuristics and vulnerability checklists (offensive exploits stripped)",
47
+ "target_skill": "bdb-security-audit, security-reviewer"
48
+ }
49
+ }
50
+ }
@@ -10,3 +10,7 @@ Turns the user's goal (or `/bdbrainstorm` / `/grill-me` output) into a system pl
10
10
  **MCP servers used:** openwiki-skill, memb_mcp
11
11
 
12
12
  **Output artifact(s):** `production_artifacts/00_execution_plan.md`
13
+
14
+ - The plan uses the agenttrail component convention (`## Name {#id}`, `needs:`, `files:`, tasks `- [ ] ... {#id}`).
15
+ - The Architect renders the architecture with `aos-archify` to `production_artifacts/00_architecture.html` and links it from the relevant component with a `url:` line.
16
+ - Plan-canvas can review that HTML too.
@@ -5,6 +5,6 @@ model: sonnet
5
5
  ---
6
6
  Security vulnerability detection and remediation. Use after writing code that handles user input, authentication, API endpoints, or sensitive data. Flags secrets, SSRF, injection, unsafe crypto, and OWASP Top 10.
7
7
 
8
- **Primary skills:** systematic-debugging, clean-code, api-design-principles
8
+ **Primary skills:** systematic-debugging, clean-code, api-design-principles, bdb-security-audit
9
9
 
10
10
  **Output artifact(s):** findings returned inline (writes no file)
@@ -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": [