@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
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "@hybridlabor-api/mcsc",
3
+ "version": "0.1.0",
4
+ "description": "Multi-CLI Subagent Configurator (MCSC) MCP Server for local subagent delegation",
5
+ "type": "module",
6
+ "main": "server.js",
7
+ "bin": {
8
+ "mcsc": "./packages/core/bin/mcsc.js"
9
+ },
10
+ "dependencies": {
11
+ "@modelcontextprotocol/sdk": "^1.30.0",
12
+ "js-yaml": "^5.4.1"
13
+ }
14
+ }
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+
3
+ // NOTE: an earlier draft of this file used a `node:module` loader hook
4
+ // (`register()`) to monkey-patch detect/inventory.js and detect/cache.js at
5
+ // import time instead of fixing their actual bugs (a dead `CliHealth` runtime
6
+ // import, and wrong-module imports for `homedir`/`performance`). That hack
7
+ // is gone — those files are fixed directly (they're our own code, not a
8
+ // vendor CLI wrapper, so "wrap don't patch" §7 doesn't apply here).
9
+
10
+ async function run() {
11
+ const fs = (await import('fs')).default;
12
+ const path = (await import('path')).default;
13
+ const os = (await import('os')).default;
14
+ const { fileURLToPath } = await import('url');
15
+
16
+ const { loadRulebook } = await import('../src/rulebook/load.js');
17
+ const { decide } = await import('../src/rulebook/resolve.js');
18
+ const { runInventory } = await import('../src/detect/inventory.js');
19
+ const { getCached, setCached } = await import('../src/detect/cache.js');
20
+ const { buildOfferTable } = await import('../src/capabilities/buildOfferTable.js');
21
+
22
+ const { delegate: agyDelegate } = await import('../src/adapters/agy.js');
23
+ const { delegate: opencodeDelegate } = await import('../src/adapters/opencode.js');
24
+ const { delegate: nativeDelegate } = await import('../src/adapters/native.js');
25
+
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = path.dirname(__filename);
28
+
29
+ const CLI_IDS = ['agy', 'opencode', 'codex', 'native'];
30
+ const TTL_MS = 24 * 60 * 60 * 1000;
31
+
32
+ async function getInventory() {
33
+ const cliHealthMap = new Map();
34
+ const missingCliIds = [];
35
+
36
+ for (const cliId of CLI_IDS) {
37
+ const cached = await getCached(cliId);
38
+ if (cached) {
39
+ cliHealthMap.set(cliId, cached);
40
+ } else {
41
+ missingCliIds.push(cliId);
42
+ }
43
+ }
44
+
45
+ if (missingCliIds.length > 0) {
46
+ const newHealthMap = await runInventory({ cliIds: missingCliIds, maxAgeMs: TTL_MS });
47
+ for (const [cliId, health] of newHealthMap.entries()) {
48
+ cliHealthMap.set(cliId, health);
49
+ await setCached(cliId, health, TTL_MS);
50
+ }
51
+ }
52
+
53
+ return cliHealthMap;
54
+ }
55
+
56
+ const argv = process.argv;
57
+ const subcommand = argv[2];
58
+
59
+ let taskType = null;
60
+ let promptText = null;
61
+ let isJson = false;
62
+
63
+ for (let i = 3; i < argv.length; i++) {
64
+ if (argv[i] === '--task-type' && i + 1 < argv.length) {
65
+ taskType = argv[++i];
66
+ } else if (argv[i] === '--prompt' && i + 1 < argv.length) {
67
+ promptText = argv[++i];
68
+ } else if (argv[i] === '--json') {
69
+ isJson = true;
70
+ }
71
+ }
72
+
73
+ if (subcommand === 'detect') {
74
+ const inventoryMap = await getInventory();
75
+ const inventoryObj = Object.fromEntries(inventoryMap);
76
+ if (isJson) {
77
+ console.log(JSON.stringify(inventoryObj, null, 2));
78
+ } else {
79
+ console.log(inventoryObj);
80
+ }
81
+ return;
82
+ }
83
+
84
+ if (subcommand === 'route' || subcommand === 'exec') {
85
+ const inventoryMap = await getInventory();
86
+
87
+ const defaultsPath = path.resolve(__dirname, '../rulebook.default.yaml');
88
+ const overridePath = path.resolve(os.homedir(), '.config/mcsc/rulebook.yaml');
89
+
90
+ let rules = [];
91
+ try {
92
+ rules = await loadRulebook({
93
+ defaultsPath,
94
+ overridePath: fs.existsSync(overridePath) ? overridePath : undefined
95
+ });
96
+ } catch (e) {
97
+ console.error('Failed to load rulebook:', e);
98
+ process.exit(1);
99
+ }
100
+
101
+ const now = Date.now();
102
+ const offerTable = await buildOfferTable(rules, inventoryMap, now);
103
+
104
+ const inventorySnapshot = { cliHealth: Object.fromEntries(inventoryMap) };
105
+ const taskDescriptor = { task_type: taskType };
106
+
107
+ const decision = decide(taskDescriptor, rules, inventorySnapshot, offerTable, now);
108
+
109
+ if (subcommand === 'route') {
110
+ if (isJson) {
111
+ console.log(JSON.stringify(decision, null, 2));
112
+ } else {
113
+ console.log(decision);
114
+ }
115
+ if (decision.kind === 'refuse') {
116
+ process.exit(1);
117
+ }
118
+ return;
119
+ }
120
+
121
+ if (subcommand === 'exec') {
122
+ if (decision.kind === 'refuse') {
123
+ console.error(JSON.stringify(decision, null, 2));
124
+ process.exit(1);
125
+ }
126
+
127
+ if (decision.kind === 'route') {
128
+ const delegateReq = {
129
+ taskType,
130
+ prompt: promptText,
131
+ model: decision.offer.modelId,
132
+ cwd: process.cwd()
133
+ };
134
+
135
+ let result;
136
+ try {
137
+ if (decision.cliId === 'agy') {
138
+ result = await agyDelegate(delegateReq);
139
+ } else if (decision.cliId === 'opencode') {
140
+ result = await opencodeDelegate(delegateReq);
141
+ } else if (decision.cliId === 'native') {
142
+ result = await nativeDelegate(delegateReq);
143
+ } else {
144
+ console.error('No adapter for CLI:', decision.cliId);
145
+ process.exit(1);
146
+ }
147
+
148
+ console.log(result.output);
149
+ process.exit(result.exit);
150
+ } catch (e) {
151
+ console.error(e);
152
+ process.exit(1);
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+
159
+ run().catch(e => {
160
+ console.error(e);
161
+ process.exit(1);
162
+ });
@@ -0,0 +1,49 @@
1
+ version: 1
2
+ # Model ids are the SHORT ids agy reports in `agy models` (left column) --
3
+ # e.g. "gemini-3.8-flash-medium", not "Gemini 3.8 Flash (Medium)" and not
4
+ # "gemini-flash-3.8". Verify with `agy models` after any agy upgrade; the
5
+ # ids carry both the version AND the effort suffix (-low/-medium/-high),
6
+ # so dropping the suffix does not resolve.
7
+ rules:
8
+ # Media + fast/mechanical coding -> newest Flash. Cheap, quick, and the
9
+ # tier that actually has media capability.
10
+ - id: media-generation
11
+ match: {task_type: [image-gen, video-gen, media]}
12
+ candidates:
13
+ - {cli: agy, model: "gemini-3.8-flash-medium"}
14
+ - {cli: native}
15
+
16
+ - id: fast-coding
17
+ match: {task_type: [boilerplate, quick-check, scaffold, mechanical-edit]}
18
+ candidates:
19
+ - {cli: agy, model: "gemini-3.8-flash-medium"}
20
+ - {cli: opencode, model_select: {provider: opencode, prefer: [free]}}
21
+ - {cli: native}
22
+
23
+ # Research reads a lot and distils -- same family, more effort headroom.
24
+ - id: deep-research
25
+ match: {task_type: [research, web-search, docs-survey]}
26
+ candidates:
27
+ - {cli: agy, model: "gemini-3.8-flash-high"}
28
+ - {cli: opencode, model_select: {provider: opencode, prefer: [free], match: "*gemini*"}}
29
+ - {cli: native}
30
+
31
+ # Review needs real judgment to be adversarial rather than agreeable --
32
+ # Sonnet, not a Flash tier.
33
+ - id: review
34
+ match: {task_type: [review, code-review, adversarial-review]}
35
+ candidates:
36
+ - {cli: agy, model: "claude-sonnet-4-6"}
37
+ - {cli: native}
38
+
39
+ # Architecture/refactor planning: mistakes here propagate to every
40
+ # downstream worker, so this is the one place worth the top tier.
41
+ - id: complex-code
42
+ match: {task_type: [architecture, refactor-plan], min_complexity: high}
43
+ candidates:
44
+ - {cli: agy, model: "claude-opus-4-6-thinking"}
45
+ - {cli: agy, model: "claude-sonnet-4-6"}
46
+ - {cli: codex, model: "gpt-5-codex"}
47
+ - {cli: native}
48
+
49
+ defaults: {fallback: native, on_unresolvable: native}
@@ -0,0 +1,56 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Rulebook Schema",
4
+ "type": "object",
5
+ "properties": {
6
+ "version": {
7
+ "type": "integer",
8
+ "const": 1
9
+ },
10
+ "rules": {
11
+ "type": "array",
12
+ "minItems": 1,
13
+ "items": {
14
+ "type": "object",
15
+ "properties": {
16
+ "id": {
17
+ "type": "string"
18
+ },
19
+ "match": {
20
+ "type": "object"
21
+ },
22
+ "candidates": {
23
+ "type": "array",
24
+ "minItems": 1,
25
+ "items": {
26
+ "type": "object",
27
+ "properties": {
28
+ "cli": {
29
+ "type": "string",
30
+ "enum": ["agy", "opencode", "codex", "native"]
31
+ }
32
+ },
33
+ "required": ["cli"]
34
+ }
35
+ }
36
+ },
37
+ "required": ["id", "match", "candidates"]
38
+ }
39
+ },
40
+ "defaults": {
41
+ "type": "object",
42
+ "properties": {
43
+ "fallback": {
44
+ "type": "string",
45
+ "enum": ["native"]
46
+ },
47
+ "on_unresolvable": {
48
+ "type": "string",
49
+ "enum": ["native"]
50
+ }
51
+ },
52
+ "required": ["fallback", "on_unresolvable"]
53
+ }
54
+ },
55
+ "required": ["version", "rules", "defaults"]
56
+ }
@@ -0,0 +1,107 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { emitTrail } from '../trail.js';
4
+ const execFileAsync = promisify(execFile);
5
+
6
+ /**
7
+ * CliAdapter shelling out DIRECTLY to the vendor 'agy' binary.
8
+ *
9
+ * @param {import('../types.js').DelegationRequest} req
10
+ * @returns {Promise<{ exit: number; output: string; attestation: { kind: 'confirmed' | 'unavailable'; modelId?: string; sessionRef?: string } }>}
11
+ */
12
+ export async function delegate(req) {
13
+ const trailEvent = {
14
+ session_id: `mcsc-agy-${process.pid}-${Date.now()}`,
15
+ cwd: req.cwd || process.cwd(),
16
+ agent:
17
+ typeof req.label === 'string' && req.label.length > 0
18
+ ? `agy:${req.label}`
19
+ : 'agy',
20
+ };
21
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionStart' });
22
+ try {
23
+ const args = [];
24
+ if (req.model) args.push('--model', req.model);
25
+ args.push(
26
+ '--print-timeout',
27
+ '15m',
28
+ '--output-format',
29
+ 'json',
30
+ '--project',
31
+ 'mcsc-delegate',
32
+ '--print',
33
+ req.prompt
34
+ );
35
+
36
+ const env = { ...process.env, MCSC_CALLER: 'agy' };
37
+
38
+ const run = execFileAsync(
39
+ 'agy',
40
+ args,
41
+ {
42
+ cwd: req.cwd,
43
+ encoding: 'utf-8',
44
+ maxBuffer: 1024 * 1024 * 50,
45
+ env,
46
+ signal: req.signal
47
+ }
48
+ );
49
+ // An open stdin pipe makes the CLI wait for input forever.
50
+ run.child.stdin.end();
51
+ const { stdout, stderr } = await run;
52
+
53
+ const raw = stdout || stderr;
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(raw);
57
+ } catch {
58
+ // If we can't parse JSON, we cannot attest the model.
59
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
60
+ return {
61
+ exit: 0,
62
+ output: raw.trim(),
63
+ attestation: { kind: 'unavailable' },
64
+ };
65
+ }
66
+
67
+ if (parsed && typeof parsed === 'object') {
68
+ const modelId = parsed.modelId || parsed.model || parsed.cli_model || parsed.id;
69
+ const sessionRef = parsed.conversation_id || parsed.session || parsed.sessionId || parsed.id;
70
+
71
+ if (modelId) {
72
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
73
+ return {
74
+ exit: 0,
75
+ output: raw.trim(),
76
+ attestation: {
77
+ kind: 'confirmed',
78
+ modelId: String(modelId),
79
+ sessionRef: String(sessionRef || ''),
80
+ },
81
+ };
82
+ }
83
+ }
84
+
85
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
86
+ return {
87
+ exit: 0,
88
+ output: raw.trim(),
89
+ attestation: { kind: 'unavailable' },
90
+ };
91
+ } catch (e) {
92
+ if (e.name === 'AbortError') {
93
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
94
+ return {
95
+ exit: 1,
96
+ output: 'Cancelled by orchestrator',
97
+ attestation: { kind: 'unavailable' }
98
+ };
99
+ }
100
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
101
+ return {
102
+ exit: 1,
103
+ output: (e.stderr || e.message || '').trim(),
104
+ attestation: { kind: 'unavailable' },
105
+ };
106
+ }
107
+ }
@@ -0,0 +1,56 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { emitTrail } from '../trail.js';
4
+
5
+ const execFileAsync = promisify(execFile);
6
+
7
+ /**
8
+ * Adapter für die Codex CLI.
9
+ * Implementiert die DelegationRequest Schnittstelle.
10
+ * @param {import('./types.js').DelegationRequest} req
11
+ * @returns {Promise<{ exit: number; output: string }>}
12
+ */
13
+ export async function delegate(req) {
14
+ const trailEvent = {
15
+ session_id: `mcsc-codex-${process.pid}-${Date.now()}`,
16
+ cwd: req.cwd || process.cwd(),
17
+ agent:
18
+ typeof req.label === 'string' && req.label.length > 0
19
+ ? `codex:${req.label}`
20
+ : 'codex',
21
+ };
22
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionStart' });
23
+ try {
24
+ const args = ['exec'];
25
+ if (req.model) args.push('-m', req.model);
26
+ args.push(req.prompt);
27
+
28
+ // Recursion Guard
29
+ const env = { ...process.env, MCSC_CALLER: 'codex' };
30
+
31
+ const run = execFileAsync(
32
+ 'codex', args,
33
+ {
34
+ cwd: req.cwd,
35
+ encoding: 'utf-8',
36
+ maxBuffer: 1024 * 1024 * 50, // 50MB Limit
37
+ env,
38
+ signal: req.signal
39
+ }
40
+ );
41
+ // An open stdin pipe makes the CLI wait for input forever.
42
+ run.child.stdin.end();
43
+ const { stdout, stderr } = await run;
44
+
45
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
46
+ return { exit: 0, output: stdout || stderr };
47
+ } catch (e) {
48
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
49
+ if (e.name === 'AbortError') {
50
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
51
+ return { exit: 1, output: 'Cancelled by orchestrator' };
52
+ }
53
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
54
+ return { exit: 1, output: (e.stderr || e.message || '').trim() };
55
+ }
56
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * CliAdapter for 'native'.
3
+ *
4
+ * Native delegation happens at the orchestrator level (Agent tool),
5
+ * not by shelling out. This adapter is a no-op that signals
6
+ * unattested delegation — the orchestrator should handle the
7
+ * native Claude Code subagent lifecycle itself.
8
+ *
9
+ * @param {import('../adapters/types.js').DelegationRequest} req
10
+ * @returns {Promise<{ exit: number; output: string; attestation: { kind: 'unavailable'; } }>}
11
+ */
12
+ export async function delegate(req) {
13
+ throw new Error("Task requires native handling by the current orchestrator. Do not use delegate tools for this.");
14
+ }
@@ -0,0 +1,183 @@
1
+ import { spawn } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { emitTrail } from '../trail.js';
4
+
5
+ const MAX_OUTPUT = 1024 * 1024 * 50; // 50MB, mirrors the old execFile maxBuffer
6
+
7
+ /**
8
+ * CliAdapter shelling out to `opencode run --auto --format json [--model <model>] <prompt>`.
9
+ * Optional `req.variant` is passed through as `--variant <variant>` (model reasoning effort).
10
+ * Reads stdout line by line: assistant text parts are collected and joined as
11
+ * `output`; tool events are forwarded to the live map as PreToolUse/PostToolUse.
12
+ *
13
+ * @param {import('../types.js').DelegationRequest} req
14
+ * @returns {Promise<{ exit: number; output: string; attestation: { kind: 'unavailable'; } }>}
15
+ */
16
+ export async function delegate(req) {
17
+ const cwd = req.cwd || process.cwd();
18
+ const trailEvent = {
19
+ session_id: `mcsc-opencode-${process.pid}-${Date.now()}`,
20
+ cwd,
21
+ agent:
22
+ typeof req.label === 'string' && req.label.length > 0
23
+ ? `opencode:${req.label}`
24
+ : 'opencode',
25
+ };
26
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionStart' });
27
+
28
+ const env = { ...process.env, MCSC_CALLER: 'opencode' };
29
+ const args = ['run', '--auto', '--format', 'json'];
30
+ if (req.model) args.push('--model', req.model);
31
+ if (req.variant) args.push('--variant', String(req.variant));
32
+ args.push(req.prompt);
33
+
34
+ const child = spawn('opencode', args, {
35
+ cwd: req.cwd,
36
+ env,
37
+ stdio: ['ignore', 'pipe', 'pipe'],
38
+ });
39
+
40
+ return new Promise((resolve) => {
41
+ const textParts = [];
42
+ let stdoutBuf = '';
43
+ let stderrBuf = '';
44
+ let stdoutBytes = 0;
45
+ let stderrBytes = 0;
46
+ let overflowed = false;
47
+ let aborted = false;
48
+ let settled = false;
49
+
50
+ const onAbort = () => {
51
+ aborted = true;
52
+ child.kill('SIGKILL');
53
+ };
54
+ if (req.signal) {
55
+ if (req.signal.aborted) onAbort();
56
+ else req.signal.addEventListener('abort', onAbort, { once: true });
57
+ }
58
+
59
+ const finalize = (result) => {
60
+ if (settled) return;
61
+ settled = true;
62
+ if (req.signal) req.signal.removeEventListener('abort', onAbort);
63
+ emitTrail({ ...trailEvent, hook_event_name: 'SessionEnd' });
64
+ resolve(result);
65
+ };
66
+
67
+ const buildToolInput = (input) => {
68
+ const toolInput = {};
69
+ if (!input || typeof input !== 'object') return toolInput;
70
+ const rawPath = input.filePath || input.file_path || input.path || input.file;
71
+ if (typeof rawPath === 'string' && rawPath.length > 0) {
72
+ toolInput.file_path = path.isAbsolute(rawPath)
73
+ ? rawPath
74
+ : path.resolve(cwd, rawPath);
75
+ }
76
+ const rawCommand = input.command || input.cmd;
77
+ if (typeof rawCommand === 'string' && rawCommand.length > 0) {
78
+ toolInput.command = rawCommand;
79
+ }
80
+ return toolInput;
81
+ };
82
+
83
+ const handleLine = (line) => {
84
+ if (!line) return;
85
+ let evt;
86
+ try {
87
+ evt = JSON.parse(line);
88
+ } catch {
89
+ return; // Not valid JSON — ignore.
90
+ }
91
+ if (!evt || typeof evt !== 'object') return;
92
+ const part = evt.part;
93
+ if (!part || typeof part !== 'object') return;
94
+
95
+ if (evt.type === 'text') {
96
+ if (typeof part.text === 'string' && part.text.length > 0) {
97
+ textParts.push(part.text);
98
+ }
99
+ return;
100
+ }
101
+
102
+ if (
103
+ evt.type === 'tool_use' &&
104
+ typeof part.tool === 'string' &&
105
+ part.tool.length > 0
106
+ ) {
107
+ const state = part.state || {};
108
+ const finished = state.status === 'completed' || state.status === 'error';
109
+ emitTrail({
110
+ ...trailEvent,
111
+ hook_event_name: finished ? 'PostToolUse' : 'PreToolUse',
112
+ tool_name: part.tool.charAt(0).toUpperCase() + part.tool.slice(1),
113
+ tool_input: buildToolInput(state.input),
114
+ });
115
+ }
116
+ };
117
+
118
+ child.stdout.setEncoding('utf8');
119
+ child.stdout.on('data', (chunk) => {
120
+ stdoutBytes += Buffer.byteLength(chunk);
121
+ if (stdoutBytes > MAX_OUTPUT) {
122
+ if (!overflowed) {
123
+ overflowed = true;
124
+ child.kill('SIGKILL');
125
+ }
126
+ return;
127
+ }
128
+ stdoutBuf += chunk;
129
+ let idx;
130
+ while ((idx = stdoutBuf.indexOf('\n')) !== -1) {
131
+ const line = stdoutBuf.slice(0, idx).trim();
132
+ stdoutBuf = stdoutBuf.slice(idx + 1);
133
+ handleLine(line);
134
+ }
135
+ });
136
+
137
+ child.stderr.setEncoding('utf8');
138
+ child.stderr.on('data', (chunk) => {
139
+ stderrBytes += Buffer.byteLength(chunk);
140
+ if (stderrBytes > MAX_OUTPUT) return; // cap stderr, never fail on it
141
+ stderrBuf += chunk;
142
+ });
143
+
144
+ child.on('error', (err) => {
145
+ finalize({
146
+ exit: 1,
147
+ output: (stderrBuf || err.message || '').trim(),
148
+ attestation: { kind: 'unavailable' },
149
+ });
150
+ });
151
+
152
+ child.on('close', (code) => {
153
+ const rest = stdoutBuf.trim();
154
+ if (rest) handleLine(rest); // flush a trailing line without newline
155
+ if (aborted) {
156
+ finalize({
157
+ exit: 1,
158
+ output: 'Cancelled by orchestrator',
159
+ attestation: { kind: 'unavailable' },
160
+ });
161
+ return;
162
+ }
163
+ if (overflowed) {
164
+ finalize({
165
+ exit: 1,
166
+ output: 'stdout maxBuffer length exceeded',
167
+ attestation: { kind: 'unavailable' },
168
+ });
169
+ return;
170
+ }
171
+ if (code === 0) {
172
+ const output = textParts.length > 0 ? textParts.join('\n') : stderrBuf;
173
+ finalize({ exit: 0, output, attestation: { kind: 'unavailable' } });
174
+ return;
175
+ }
176
+ finalize({
177
+ exit: 1,
178
+ output: (stderrBuf || `opencode exited with code ${code}`).trim(),
179
+ attestation: { kind: 'unavailable' },
180
+ });
181
+ });
182
+ });
183
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @typedef {Object} DelegationRequest
3
+ * @property {string} taskType
4
+ * @property {string} prompt
5
+ * @property {string} model
6
+ * @property {string} cwd
7
+ * @property {string} [variant] Optional model variant (reasoning effort) passed to `opencode run --variant`.
8
+ */
9
+
10
+ /**
11
+ * @typedef {Object} DelegationResult
12
+ * @property {number} exit
13
+ * @property {string} output
14
+ * @property {{
15
+ * kind: 'confirmed' | 'mismatch' | 'unavailable',
16
+ * modelId?: string,
17
+ * sessionRef?: string,
18
+ * requested?: string,
19
+ * actual?: string
20
+ * }} attestation
21
+ */