@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
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @typedef {import('js-yaml').YamlMap} YamlMap
3
+ *
4
+ * NOTE: This module depends on the npm package `js-yaml`.
5
+ * Add it to package.json: `npm i js-yaml`
6
+ * The package.json currently has no YAML dependency.
7
+ */
8
+ import { load as parseYaml } from 'js-yaml';
9
+ import { readFile } from 'node:fs/promises';
10
+
11
+ /**
12
+ * Load and merge the rulebook YAML files.
13
+ *
14
+ * @param {{ defaultsPath: string; overridePath?: string }} opts
15
+ * @param {string} opts.defaultsPath - Path to the default rulebook YAML (e.g. packages/core/rulebook.default.yaml)
16
+ * @param {string} [opts.overridePath] - Path to the user override rulebook YAML (e.g. ~/.config/mcsc/rulebook.yaml)
17
+ * @returns {import('./rulebook.types.js').Rule[]} Merged rule list, with overrides applied by id,
18
+ * disabled ids removed, and unknown ids appended.
19
+ */
20
+ export async function loadRulebook({ defaultsPath, overridePath }) {
21
+ const defaultsContent = await readFile(defaultsPath, 'utf8');
22
+ const defaultsYaml = parseYaml(defaultsContent);
23
+
24
+ // Build a Map keyed by rule id for O(1) lookups and whole-rule replace
25
+ const merged = new Map();
26
+ for (const rule of defaultsYaml.rules || []) {
27
+ merged.set(rule.id, rule);
28
+ }
29
+
30
+ // Apply override layer
31
+ if (overridePath) {
32
+ try {
33
+ const overrideContent = await readFile(overridePath, 'utf8');
34
+ const overrideYaml = parseYaml(overrideContent);
35
+
36
+ // Per architecture.md §2: a top-level `disabled: [id]` list removes
37
+ // shipped rules — this is NOT a per-rule field.
38
+ for (const id of overrideYaml.disabled || []) {
39
+ merged.delete(id);
40
+ }
41
+
42
+ // Whole-rule replace by id (Map#set both replaces a known id and
43
+ // appends an unknown one — no deep-merging of candidate arrays).
44
+ for (const rule of overrideYaml.rules || []) {
45
+ merged.set(rule.id, rule);
46
+ }
47
+ } catch (_) {
48
+ // If override file doesn't exist or can't be parsed, keep defaults as-is
49
+ }
50
+ }
51
+
52
+ return [...merged.values()];
53
+ }
@@ -0,0 +1,227 @@
1
+ /**
2
+ * PURE function: routing decision implementing the Rulebook §3 Decision logic
3
+ * and the §6 fallback/degradation contract.
4
+ *
5
+ * Synchronous, side-effect free, no Date.now() inside — the `attemptTrace`
6
+ * records resolutions but never calls `Date.now()` at the top level; the TTL
7
+ * check inside uses the offered `resolvedAt` timestamps only.
8
+ *
9
+ * @param {Object} taskDescriptor - { task_type: string, complexity?: string }
10
+ * @param {import('./rulebook.types.js').Rule[]} rules - Merged rule list from loadRulebook()
11
+ * @param {import('./rulebook.types.js').InventorySnapshot} inventorySnapshot - CLI health snapshot
12
+ * @param {import('./rulebook.types.js').OfferTable} offerTable - Model offer registry per CLI per rule
13
+ * @returns {import('./rulebook.types.js').Decision} Route or refuse decision
14
+ */
15
+ export function decide(taskDescriptor, rules, inventorySnapshot, offerTable, now) {
16
+ // Step 0: Find the first rule whose match criteria the taskDescriptor satisfies
17
+ const matchingRule = rules.find(rule => matchesMatch(rule.match, taskDescriptor));
18
+
19
+ if (!matchingRule) {
20
+ return {
21
+ kind: 'refuse',
22
+ reason: 'no matching rule for task descriptor',
23
+ attempted: []
24
+ };
25
+ }
26
+
27
+ const candidates = matchingRule.candidates;
28
+ const attemptTrace = [];
29
+ const taskTier = inferTier(taskDescriptor, matchingRule);
30
+
31
+ // --- Helper: find offer for a CLI within this rule ---
32
+ function findOffer(cliId) {
33
+ const ruleOffers = offerTable[cliId]?.[matchingRule.id];
34
+ if (!ruleOffers) return null;
35
+ return ruleOffers;
36
+ }
37
+
38
+ // --- Step 1: Preferred CLI, live registry offer ---
39
+ // The "preferred CLI" is the first candidate in the rule's chain that is not 'native'
40
+ const preferredCandidate = candidates.find(c => c.cli !== 'native');
41
+ const preferredCliId = preferredCandidate ? preferredCandidate.cli : null;
42
+
43
+ if (preferredCliId) {
44
+ const cliHealth = inventorySnapshot.cliHealth?.[preferredCliId];
45
+ if (cliHealth && (cliHealth.status === 'ready' || cliHealth.status === 'degraded')) {
46
+ const offer = findOffer(preferredCliId);
47
+
48
+ // Step 1: Preferred CLI has a live registry offer
49
+ if (offer && offer.source === 'live-list') {
50
+ return {
51
+ kind: 'route',
52
+ cliId: preferredCliId,
53
+ offer: {
54
+ cliId: preferredCliId,
55
+ modelId: offer.modelId,
56
+ tier: offer.tier,
57
+ resolvedAt: offer.resolvedAt,
58
+ source: offer.source
59
+ },
60
+ degraded: cliHealth.status === 'degraded' ? ['cli-degraded'] : []
61
+ };
62
+ }
63
+
64
+ // Step 2: Preferred CLI, cached offer ≤ TTL
65
+ if (offer && offer.source !== 'live-list') {
66
+ const ttlMs = preferredCliId === 'opencode' ? 3_600_000 : 86_400_000; // 1h vs 24h
67
+ if (offer.resolvedAt != null && (now - offer.resolvedAt) <= ttlMs) {
68
+ return {
69
+ kind: 'route',
70
+ cliId: preferredCliId,
71
+ offer: {
72
+ cliId: preferredCliId,
73
+ modelId: offer.modelId,
74
+ tier: offer.tier,
75
+ resolvedAt: offer.resolvedAt,
76
+ source: offer.source
77
+ },
78
+ degraded: ['stale-offer']
79
+ };
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ // --- Steps 3 & 4: Fallback to other CLIs ---
86
+ // Identify non-native candidates in their declared order
87
+ const nonNativeCandidates = candidates.filter(c => c.cli !== 'native');
88
+
89
+ const checkedNonNative = new Set();
90
+ if (preferredCliId) checkedNonNative.add(preferredCliId);
91
+
92
+ // Step 3: Next CLI in the rule's candidates order, same tier
93
+ // Try each subsequent non-native candidate after the preferred one
94
+ // Skip index 0 (the preferred CLI already checked in steps 1-2)
95
+ for (let i = 1; i < nonNativeCandidates.length; i += 1) {
96
+ const cliId = nonNativeCandidates[i].cli;
97
+ const cliHealth = inventorySnapshot.cliHealth?.[cliId];
98
+
99
+ if (!cliHealth || cliHealth.status !== 'ready') {
100
+ attemptTrace.push({
101
+ step: `step3-${i}`,
102
+ cli: cliId,
103
+ reason: cliHealth?.status === 'unusable' ? 'cli-unusable' : 'cli-absent',
104
+ offered: false
105
+ });
106
+ checkedNonNative.add(cliId);
107
+ continue;
108
+ }
109
+
110
+ const offer = findOffer(cliId);
111
+ if (offer && offer.tier === taskTier) {
112
+ // Step 3: Next CLI in the rule's candidates order, same tier
113
+ return {
114
+ kind: 'route',
115
+ cliId,
116
+ offer: {
117
+ cliId,
118
+ modelId: offer.modelId,
119
+ tier: offer.tier,
120
+ resolvedAt: offer.resolvedAt,
121
+ source: offer.source
122
+ },
123
+ degraded: ['cli-substituted']
124
+ };
125
+ }
126
+
127
+ attemptTrace.push({
128
+ step: `step3-${i}`,
129
+ cli: cliId,
130
+ reason: 'tier-mismatch',
131
+ offered: false
132
+ });
133
+ checkedNonNative.add(cliId);
134
+ }
135
+
136
+ // Step 4: Any healthy CLI at the same tier (outside preference chain)
137
+ // Check all CLIs in the inventory, including those not in the candidate chain
138
+ for (const [cliId, health] of Object.entries(inventorySnapshot.cliHealth || {})) {
139
+ if (health.status !== 'ready' || cliId === 'native' || checkedNonNative.has(cliId)) continue;
140
+ checkedNonNative.add(cliId);
141
+
142
+ const offer = findOffer(cliId);
143
+ if (offer && offer.tier === taskTier) {
144
+ // Step 4: Any healthy CLI at the same tier, outside preference
145
+ return {
146
+ kind: 'route',
147
+ cliId,
148
+ offer: {
149
+ cliId,
150
+ modelId: offer.modelId,
151
+ tier: offer.tier,
152
+ resolvedAt: offer.resolvedAt,
153
+ source: offer.source
154
+ },
155
+ degraded: ['cli-substituted', 'outside-preference']
156
+ };
157
+ }
158
+
159
+ attemptTrace.push({
160
+ step: `step4-${cliId}`,
161
+ cli: cliId,
162
+ reason: 'tier-mismatch',
163
+ offered: false
164
+ });
165
+ }
166
+
167
+ // --- Step 5: Tier downgrade (if fail-open policy) ---
168
+ const rulePolicy = matchingRule.policy || (matchingRule.id === 'media-generation' ? 'fail-open' : 'fail-closed');
169
+ if (rulePolicy === 'fail-open') {
170
+ // Deterministic downgrade target: use 'quick-review' as the fallback tier
171
+ const downgradeTier = taskTier === 'complex-code' ? 'quick-review' : taskTier;
172
+ return {
173
+ kind: 'route',
174
+ cliId: 'native',
175
+ offer: {
176
+ cliId: 'native',
177
+ modelId: 'native',
178
+ tier: downgradeTier,
179
+ resolvedAt: now,
180
+ source: 'pinned'
181
+ },
182
+ degraded: ['tier-downgraded']
183
+ };
184
+ }
185
+
186
+ // --- Step 6: Otherwise refuse ---
187
+ return {
188
+ kind: 'refuse',
189
+ reason: 'no suitable CLI available after full fallback chain',
190
+ attempted: attemptTrace
191
+ };
192
+ }
193
+
194
+ /**
195
+ * Infer the task tier from the taskDescriptor and rule match criteria.
196
+ */
197
+ function inferTier(taskDescriptor, rule) {
198
+ const { task_type, complexity } = taskDescriptor;
199
+ const { task_type: ruleTaskTypes, min_complexity } = rule.match;
200
+
201
+ if (ruleTaskTypes && Array.isArray(ruleTaskTypes) && ruleTaskTypes.includes(task_type)) {
202
+ return task_type;
203
+ }
204
+
205
+ if (min_complexity && complexity) {
206
+ return complexity;
207
+ }
208
+
209
+ // Default: media-generation falls to quick-review; others default quick-review too
210
+ return 'quick-review';
211
+ }
212
+
213
+ /**
214
+ * Check whether a taskDescriptor satisfies a rule's match criteria.
215
+ */
216
+ function matchesMatch(matchCriteria, taskDescriptor) {
217
+ if (!matchCriteria.task_type) return true;
218
+
219
+ const descriptorTaskTypes = taskDescriptor.task_type;
220
+ const ruleTaskTypes = matchCriteria.task_type;
221
+
222
+ if (!Array.isArray(ruleTaskTypes)) {
223
+ return ruleTaskTypes === descriptorTaskTypes;
224
+ }
225
+
226
+ return ruleTaskTypes.some(rt => descriptorTaskTypes.includes(rt));
227
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @typedef {Object} CliId
3
+ * @type {string}
4
+ * @readonly */
5
+ export const CliId = {
6
+ AGY: 'agy',
7
+ OPENCODE: 'opencode',
8
+ CODEX: 'codex',
9
+ NATIVE: 'native'
10
+ };
11
+
12
+ /** @readonly */ export const Tier = {
13
+ DEEP_RESEARCH: 'deep-research',
14
+ COMPLEX_CODE: 'complex-code',
15
+ QUICK_REVIEW: 'quick-review',
16
+ MEDIA_GENERATION: 'media-generation'
17
+ };
18
+
19
+ /**
20
+ * @typedef {Object} ProbeResult
21
+ * @property {boolean} pass
22
+ * @property {string} evidence
23
+ * @property {string} reason
24
+ */
25
+
26
+ /**
27
+ * @typedef {Object} CliHealth
28
+ * @property {('ready'|'degraded'|'unusable'|'absent')} status
29
+ * @property {string} binary
30
+ * @property {string} version
31
+ * @property {ProbeResult[]} probes
32
+ */
33
+
34
+ /**
35
+ * @typedef {Object} ModelOffer
36
+ * @property {string} cliId
37
+ * @property {string} modelId
38
+ * @property {string} tier
39
+ * @property {string} resolvedAt
40
+ * @property {'live-list'|'pinned'|'stale-cache'} source
41
+ */
42
+
43
+ /** @typedef {('stale-offer'|'cli-substituted'|'outside-preference'|'tier-downgraded')} DegradationNote */
44
+
45
+ /**
46
+ * @typedef {Object} AttemptTrace
47
+ * @property {number} step
48
+ * @property {string} cli
49
+ * @property {string} reason
50
+ * @property {boolean} offered
51
+ */
52
+
53
+ /**
54
+ * @typedef {Object} Rule
55
+ * @property {string} id
56
+ * @property {Object} match - { task_type: string[], min_complexity?: string }
57
+ * @property {Array<{cli: string, model?: string, model_select?: Object}>} candidates
58
+ * @property {('fail-open'|'fail-closed')} policy
59
+ */
60
+
61
+ /**
62
+ * @typedef {Object} InventorySnapshot
63
+ * @property {{[cliId: string]: CliHealth}} cliHealth
64
+ */
65
+
66
+ /**
67
+ * @typedef {Object} OfferTableEntry
68
+ * @property {string} modelId
69
+ * @property {string} tier
70
+ * @property {string} resolvedAt
71
+ * @property {'live-list'|'pinned'|'stale-cache'} source
72
+ */
73
+
74
+ /**
75
+ * @typedef {Object} OfferTable
76
+ * @property {{[ruleId: string]: OfferTableEntry}} [ruleId]
77
+ * @property {{[cliId: string]: OfferTableEntry}} [cliId]
78
+ */
79
+
80
+ /**
81
+ * @typedef {Object} Decision
82
+ * @property {('route'|'refuse')} kind
83
+ * @property {string} kind
84
+ * @property {string} cliId
85
+ * @property {ModelOffer} offer
86
+ * @property {DegradationNote[]} degraded
87
+ * @property {string} reason
88
+ * @property {AttemptTrace[]} attempted
89
+ */
@@ -0,0 +1,17 @@
1
+ // Best-effort fire-and-forget telemetry for the AOS live map (agenttrail daemon).
2
+ export async function emitTrail(event) {
3
+ const body = JSON.stringify(event);
4
+ const ports = process.env.AGENTTRAIL_PORT
5
+ ? [Number(process.env.AGENTTRAIL_PORT)]
6
+ : Array.from({ length: 15 }, (_, i) => 5330 + i);
7
+ await Promise.allSettled(
8
+ ports.map((port) =>
9
+ fetch(`http://127.0.0.1:${port}/hook`, {
10
+ method: 'POST',
11
+ headers: { 'content-type': 'application/json' },
12
+ body,
13
+ signal: AbortSignal.timeout(300),
14
+ }).catch(() => {})
15
+ )
16
+ );
17
+ }
@@ -0,0 +1,302 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import {
6
+ CallToolRequestSchema,
7
+ ListToolsRequestSchema,
8
+ } from "@modelcontextprotocol/sdk/types.js";
9
+ import { runInventory } from "../core/src/detect/inventory.js";
10
+ import { getCached, setCached } from "../core/src/detect/cache.js";
11
+ import { delegate as agyDelegate } from "../core/src/adapters/agy.js";
12
+ import { delegate as opencodeDelegate } from "../core/src/adapters/opencode.js";
13
+ import { delegate as codexDelegate } from "../core/src/adapters/codex.js";
14
+ import { decide } from "../core/src/rulebook/resolve.js";
15
+ import { loadRulebook } from "../core/src/rulebook/load.js";
16
+ import { buildOfferTable } from "../core/src/capabilities/buildOfferTable.js";
17
+ import * as path from 'node:path';
18
+ import * as fs from 'node:fs';
19
+ import { fileURLToPath } from 'node:url';
20
+
21
+ const __filename = fileURLToPath(import.meta.url);
22
+ const __dirname = path.dirname(__filename);
23
+
24
+ // --- Global State ---
25
+ let inventory = new Map();
26
+ let rules = [];
27
+ let offerTable = {};
28
+
29
+ const caller = process.env.MCSC_CALLER || 'none';
30
+ const CLI_IDS = ['agy', 'opencode', 'codex'];
31
+ const TTL_MS = 24 * 60 * 60 * 1000;
32
+
33
+ async function getInventory() {
34
+ const cliHealthMap = new Map();
35
+ const missingCliIds = [];
36
+
37
+ for (const cliId of CLI_IDS) {
38
+ const cached = await getCached(cliId);
39
+ if (cached) {
40
+ cliHealthMap.set(cliId, cached);
41
+ } else {
42
+ missingCliIds.push(cliId);
43
+ }
44
+ }
45
+
46
+ if (missingCliIds.length > 0) {
47
+ try {
48
+ const newHealthMap = await runInventory({ cliIds: missingCliIds, maxAgeMs: TTL_MS });
49
+ for (const [cliId, health] of newHealthMap.entries()) {
50
+ cliHealthMap.set(cliId, health);
51
+ await setCached(cliId, health, TTL_MS);
52
+ }
53
+ } catch (e) {
54
+ console.error(`[mcsc-mcp] Warning: inventory run failed: ${e.message}`);
55
+ }
56
+ }
57
+
58
+ return cliHealthMap;
59
+ }
60
+
61
+ // --- Initialization ---
62
+ async function init() {
63
+ inventory = await getInventory();
64
+
65
+ const customRulebook = path.resolve(process.cwd(), 'rulebook.yaml');
66
+ const defaultRulebook = path.resolve(__dirname, '../core/rulebook.default.yaml');
67
+ const rulebookPath = fs.existsSync(customRulebook) ? customRulebook : defaultRulebook;
68
+
69
+ try {
70
+ if (fs.existsSync(rulebookPath)) {
71
+ rules = loadRulebook(rulebookPath);
72
+ const now = Date.now();
73
+ offerTable = await buildOfferTable(rules, inventory, now);
74
+ }
75
+ } catch (e) {
76
+ console.error(`[mcsc-mcp] Warning: could not load rulebook from ${rulebookPath}: ${e.message}`);
77
+ }
78
+ }
79
+
80
+ // --- MCP Server Definition ---
81
+ const server = new Server(
82
+ {
83
+ name: "mcsc-mcp",
84
+ version: "0.1.0",
85
+ },
86
+ {
87
+ capabilities: {
88
+ tools: {},
89
+ },
90
+ }
91
+ );
92
+
93
+ // --- Tool Registration ---
94
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
95
+ const tools = [];
96
+
97
+ // delegate_agy
98
+ const agyHealth = inventory.get('agy');
99
+ if (agyHealth && agyHealth.status === 'ready' && caller !== 'agy') {
100
+ tools.push({
101
+ name: "delegate_agy",
102
+ description: "Delegate a task to Antigravity CLI (Gemini 3.8 Flash or Claude 3.7 Sonnet). Provides full coding capabilities.",
103
+ inputSchema: {
104
+ type: "object",
105
+ properties: {
106
+ prompt: {
107
+ type: "string",
108
+ description: "The complete task description or objective for the subagent to accomplish."
109
+ },
110
+ model: {
111
+ type: "string",
112
+ description: "Optional model hint for the subagent (e.g., 'flash', 'pro'). Default varies by tool.",
113
+ default: "flash"
114
+ }
115
+ },
116
+ required: ["prompt"]
117
+ }
118
+ });
119
+ }
120
+
121
+ // delegate_opencode
122
+ const opencodeHealth = inventory.get('opencode');
123
+ if (opencodeHealth && opencodeHealth.status === 'ready' && caller !== 'opencode') {
124
+ tools.push({
125
+ name: "delegate_opencode",
126
+ description: "Delegate a task to OpenCode CLI.",
127
+ inputSchema: {
128
+ type: "object",
129
+ properties: {
130
+ prompt: {
131
+ type: "string",
132
+ description: "The complete task description."
133
+ },
134
+ model: {
135
+ type: "string",
136
+ description: "Optional model override."
137
+ },
138
+ variant: {
139
+ type: "string",
140
+ description: "Optional model variant (reasoning effort, e.g. high/max/minimal)."
141
+ }
142
+ },
143
+ required: ["prompt"]
144
+ }
145
+ });
146
+ }
147
+
148
+ // delegate_codex
149
+ const codexHealth = inventory.get('codex');
150
+ if (codexHealth && codexHealth.status === 'ready' && caller !== 'codex') {
151
+ tools.push({
152
+ name: "delegate_codex",
153
+ description: "Delegate a task to Codex CLI.",
154
+ inputSchema: {
155
+ type: "object",
156
+ properties: {
157
+ prompt: {
158
+ type: "string",
159
+ description: "The complete task description."
160
+ },
161
+ model: {
162
+ type: "string",
163
+ description: "Optional model override."
164
+ }
165
+ },
166
+ required: ["prompt"]
167
+ }
168
+ });
169
+ }
170
+
171
+ // delegate_smart (Routing Engine)
172
+ if (rules && rules.length > 0) {
173
+ tools.push({
174
+ name: "delegate_smart",
175
+ description: "Smart task delegation. Reads the rulebook to find the best CLI for the task type and delegates automatically.",
176
+ inputSchema: {
177
+ type: "object",
178
+ properties: {
179
+ task_type: {
180
+ type: "string",
181
+ description: "The type of task (e.g. 'review', 'architecture', 'media')."
182
+ },
183
+ prompt: {
184
+ type: "string",
185
+ description: "The exact prompt for the delegated CLI."
186
+ }
187
+ },
188
+ required: ["task_type", "prompt"]
189
+ }
190
+ });
191
+ }
192
+
193
+ return { tools };
194
+ });
195
+
196
+ // --- Tool Execution ---
197
+ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
198
+ const { name, arguments: args } = request.params;
199
+ const signal = extra.signal;
200
+
201
+ const req = {
202
+ cwd: process.cwd(),
203
+ prompt: args.prompt,
204
+ model: args.model,
205
+ variant: args.variant,
206
+ signal
207
+ };
208
+
209
+ try {
210
+ let result;
211
+
212
+ switch (name) {
213
+ case "delegate_agy":
214
+ result = await agyDelegate(req);
215
+ break;
216
+
217
+ case "delegate_opencode":
218
+ result = await opencodeDelegate(req);
219
+ break;
220
+
221
+ case "delegate_codex":
222
+ result = await codexDelegate(req);
223
+ break;
224
+
225
+ case "delegate_smart": {
226
+ const taskDescriptor = { task_type: args.task_type };
227
+ const snapshot = { cliHealth: Object.fromEntries(inventory) };
228
+ const decision = decide(taskDescriptor, rules, snapshot, offerTable, Date.now());
229
+
230
+ if (decision.kind === 'refuse') {
231
+ return {
232
+ content: [{ type: "text", text: `Smart Delegation refused: ${decision.reason}` }],
233
+ isError: true,
234
+ };
235
+ }
236
+
237
+ if (decision.offer && decision.offer.modelId) {
238
+ req.model = decision.offer.modelId;
239
+ }
240
+
241
+ switch (decision.cliId) {
242
+ case 'agy':
243
+ result = await agyDelegate(req);
244
+ break;
245
+ case 'opencode':
246
+ result = await opencodeDelegate(req);
247
+ break;
248
+ case 'codex':
249
+ result = await codexDelegate(req);
250
+ break;
251
+ case 'native':
252
+ throw new Error("Task requires native handling by the current orchestrator. Do not use delegate tools for this.");
253
+ default:
254
+ throw new Error(`Unknown CLI: ${decision.cliId}`);
255
+ }
256
+ break;
257
+ }
258
+
259
+ default:
260
+ return {
261
+ content: [{ type: "text", text: `Unknown tool: ${name}` }],
262
+ isError: true,
263
+ };
264
+ }
265
+
266
+ if (result.exit !== 0) {
267
+ return {
268
+ content: [{ type: "text", text: `Delegation failed (Exit ${result.exit}):\n${result.output}` }],
269
+ isError: true,
270
+ };
271
+ }
272
+
273
+ return {
274
+ content: [{ type: "text", text: result.output }],
275
+ };
276
+
277
+ } catch (error) {
278
+ if (error.name === 'AbortError') {
279
+ return {
280
+ content: [{ type: "text", text: "Tool execution was cancelled by the orchestrator." }],
281
+ isError: true,
282
+ };
283
+ }
284
+ return {
285
+ content: [{ type: "text", text: `Error executing ${name}: ${error.message}` }],
286
+ isError: true,
287
+ };
288
+ }
289
+ });
290
+
291
+ // --- Startup ---
292
+ async function main() {
293
+ await init();
294
+ const transport = new StdioServerTransport();
295
+ await server.connect(transport);
296
+ console.error("MCSC MCP Server running on stdio");
297
+ }
298
+
299
+ main().catch((error) => {
300
+ console.error("Server error:", error);
301
+ process.exit(1);
302
+ });
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import './packages/mcp/server.js';