@zerwiz/ymir 0.1.4 → 0.1.5

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 (850) hide show
  1. package/.agents/README.md +291 -0
  2. package/.agents/agents/bragi-marketer.md +111 -0
  3. package/.agents/agents/brokk.md +352 -0
  4. package/.agents/agents/forseti-reviewer.md +93 -0
  5. package/.agents/agents/frigg-consent.md +77 -0
  6. package/.agents/agents/groa-update.md +77 -0
  7. package/.agents/agents/hnoss-designer.md +69 -0
  8. package/.agents/agents/huginn-researcher.md +99 -0
  9. package/.agents/agents/jord-projects.md +78 -0
  10. package/.agents/agents/kvasir-scout.md +91 -0
  11. package/.agents/agents/mimir-planner.md +92 -0
  12. package/.agents/agents/muninn-stow.md +77 -0
  13. package/.agents/agents/saga-bearings.md +78 -0
  14. package/.agents/agents/sindri-developer.md +114 -0
  15. package/.agents/agents/snotra-documenter.md +105 -0
  16. package/.agents/agents/syn-recovery.md +78 -0
  17. package/.agents/agents/tyr-check.md +78 -0
  18. package/.agents/agents/urdh-hold.md +77 -0
  19. package/.agents/agents/volundr-smith.md +80 -0
  20. package/.agents/agents/vor-diagnostics.md +77 -0
  21. package/.agents/assets/agents/naming.md +50 -0
  22. package/.agents/assets/agents/registry.md +93 -0
  23. package/.agents/assets/agents/runtime.md +36 -0
  24. package/.agents/assets/agents/toon-tasks-cli.md +42 -0
  25. package/.agents/assets/templates/company_entity.template.md +37 -0
  26. package/.agents/backend/backends/cmux.sh +649 -0
  27. package/.agents/backend/backends/herdr-eventwait.py +157 -0
  28. package/.agents/backend/backends/herdr-workspace-move.py +114 -0
  29. package/.agents/backend/backends/herdr.sh +3386 -0
  30. package/.agents/backend/backends/orca.sh +290 -0
  31. package/.agents/backend/backends/tmux.sh +357 -0
  32. package/.agents/backend/backends/zellij.sh +700 -0
  33. package/.agents/backend/fm-afk-launch.sh +654 -0
  34. package/.agents/backend/fm-afk-return.sh +241 -0
  35. package/.agents/backend/fm-afk-start.sh +172 -0
  36. package/.agents/backend/fm-arm-command-policy.mjs +960 -0
  37. package/.agents/backend/fm-arm-pretool-check.sh +200 -0
  38. package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
  39. package/.agents/backend/fm-backend.sh +981 -0
  40. package/.agents/backend/fm-backlog-handoff.sh +909 -0
  41. package/.agents/backend/fm-backlog-receive.sh +187 -0
  42. package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
  43. package/.agents/backend/fm-bearings-board.sh +204 -0
  44. package/.agents/backend/fm-bearings-snapshot.sh +546 -0
  45. package/.agents/backend/fm-bootstrap.sh +1568 -0
  46. package/.agents/backend/fm-branch-outcome.sh +203 -0
  47. package/.agents/backend/fm-branch-prompt.sh +101 -0
  48. package/.agents/backend/fm-brief.sh +452 -0
  49. package/.agents/backend/fm-busy-event.sh +234 -0
  50. package/.agents/backend/fm-busy-lib.sh +986 -0
  51. package/.agents/backend/fm-captain-hold.sh +1001 -0
  52. package/.agents/backend/fm-cd-command-policy.mjs +153 -0
  53. package/.agents/backend/fm-cd-pretool-check.sh +190 -0
  54. package/.agents/backend/fm-check-lib.sh +74 -0
  55. package/.agents/backend/fm-check-register.sh +42 -0
  56. package/.agents/backend/fm-check-unregister.sh +52 -0
  57. package/.agents/backend/fm-classify-lib.sh +1770 -0
  58. package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
  59. package/.agents/backend/fm-composer-lib.sh +1416 -0
  60. package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
  61. package/.agents/backend/fm-config-push.sh +254 -0
  62. package/.agents/backend/fm-control-lib.sh +251 -0
  63. package/.agents/backend/fm-control.sh +878 -0
  64. package/.agents/backend/fm-crew-state.sh +625 -0
  65. package/.agents/backend/fm-cursor-lib.sh +243 -0
  66. package/.agents/backend/fm-decision-hold.sh +232 -0
  67. package/.agents/backend/fm-doc-audience-check.sh +269 -0
  68. package/.agents/backend/fm-dod-lib.sh +67 -0
  69. package/.agents/backend/fm-ensure-agents-md.sh +253 -0
  70. package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
  71. package/.agents/backend/fm-extension.mjs +2577 -0
  72. package/.agents/backend/fm-extension.sh +16 -0
  73. package/.agents/backend/fm-ff-lib.sh +420 -0
  74. package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
  75. package/.agents/backend/fm-fleet-sync.sh +458 -0
  76. package/.agents/backend/fm-fleet-view.sh +96 -0
  77. package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
  78. package/.agents/backend/fm-guard.sh +242 -0
  79. package/.agents/backend/fm-harness.sh +195 -0
  80. package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
  81. package/.agents/backend/fm-herdr-lab.sh +346 -0
  82. package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
  83. package/.agents/backend/fm-home-seed.sh +984 -0
  84. package/.agents/backend/fm-home-summary-refresh.sh +255 -0
  85. package/.agents/backend/fm-hook-host-lib.sh +36 -0
  86. package/.agents/backend/fm-inactive-reconcile.sh +531 -0
  87. package/.agents/backend/fm-inbox.sh +399 -0
  88. package/.agents/backend/fm-install-actionlint.sh +84 -0
  89. package/.agents/backend/fm-install-herdr.sh +96 -0
  90. package/.agents/backend/fm-install-shellcheck.sh +84 -0
  91. package/.agents/backend/fm-install-treehouse.sh +95 -0
  92. package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
  93. package/.agents/backend/fm-lease-lib.sh +218 -0
  94. package/.agents/backend/fm-lease.sh +189 -0
  95. package/.agents/backend/fm-line-cap-lib.sh +51 -0
  96. package/.agents/backend/fm-lint-workflows.sh +137 -0
  97. package/.agents/backend/fm-lint.sh +591 -0
  98. package/.agents/backend/fm-lock-lib.sh +104 -0
  99. package/.agents/backend/fm-lock.sh +107 -0
  100. package/.agents/backend/fm-marker-lib.sh +12 -0
  101. package/.agents/backend/fm-merge-local.sh +74 -0
  102. package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
  103. package/.agents/backend/fm-nm-run-lib.sh +124 -0
  104. package/.agents/backend/fm-on.sh +125 -0
  105. package/.agents/backend/fm-operational-input.sh +253 -0
  106. package/.agents/backend/fm-peek.sh +46 -0
  107. package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
  108. package/.agents/backend/fm-pr-check.sh +135 -0
  109. package/.agents/backend/fm-pr-lib.sh +1016 -0
  110. package/.agents/backend/fm-pr-merge.sh +707 -0
  111. package/.agents/backend/fm-pr-poll.sh +110 -0
  112. package/.agents/backend/fm-primary-scope-lib.sh +33 -0
  113. package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
  114. package/.agents/backend/fm-procevent-lavish.sh +628 -0
  115. package/.agents/backend/fm-procevent-lib.sh +892 -0
  116. package/.agents/backend/fm-procevent-quota.sh +290 -0
  117. package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
  118. package/.agents/backend/fm-procevent-when.sh +504 -0
  119. package/.agents/backend/fm-procevent.sh +1466 -0
  120. package/.agents/backend/fm-project-mode.sh +92 -0
  121. package/.agents/backend/fm-project-origin-lib.sh +180 -0
  122. package/.agents/backend/fm-promote.sh +282 -0
  123. package/.agents/backend/fm-public-followup-emit.sh +260 -0
  124. package/.agents/backend/fm-public-followup-lib.sh +398 -0
  125. package/.agents/backend/fm-public-followup.sh +1330 -0
  126. package/.agents/backend/fm-push-transition-lib.sh +168 -0
  127. package/.agents/backend/fm-quota-axi-lib.sh +93 -0
  128. package/.agents/backend/fm-quota-choose.sh +384 -0
  129. package/.agents/backend/fm-remote-delta-read.sh +189 -0
  130. package/.agents/backend/fm-remote-doctor.sh +800 -0
  131. package/.agents/backend/fm-remote-entrypoint.sh +193 -0
  132. package/.agents/backend/fm-remote-file.sh +234 -0
  133. package/.agents/backend/fm-remote-home-provision.sh +259 -0
  134. package/.agents/backend/fm-remote-home-seed.sh +259 -0
  135. package/.agents/backend/fm-remote-inherit-push.sh +90 -0
  136. package/.agents/backend/fm-remote-inherit.sh +179 -0
  137. package/.agents/backend/fm-remote-job-lib.sh +1241 -0
  138. package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
  139. package/.agents/backend/fm-remote-job-worker.sh +1124 -0
  140. package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
  141. package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
  142. package/.agents/backend/fm-review-diff.sh +158 -0
  143. package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
  144. package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
  145. package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
  146. package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
  147. package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
  148. package/.agents/backend/fm-secondmate-report.sh +88 -0
  149. package/.agents/backend/fm-send.sh +1059 -0
  150. package/.agents/backend/fm-session-lock-lib.sh +176 -0
  151. package/.agents/backend/fm-session-start.sh +970 -0
  152. package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
  153. package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
  154. package/.agents/backend/fm-sessionstart-run.sh +145 -0
  155. package/.agents/backend/fm-spawn.sh +3153 -0
  156. package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
  157. package/.agents/backend/fm-startup-memory-budget.sh +94 -0
  158. package/.agents/backend/fm-startup-network.sh +642 -0
  159. package/.agents/backend/fm-stow-cascade.sh +251 -0
  160. package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
  161. package/.agents/backend/fm-supervise-daemon.sh +1732 -0
  162. package/.agents/backend/fm-supervision-instructions.sh +215 -0
  163. package/.agents/backend/fm-supervision-lib.sh +90 -0
  164. package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
  165. package/.agents/backend/fm-tangle-lib.sh +53 -0
  166. package/.agents/backend/fm-task-inbox-lib.sh +402 -0
  167. package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
  168. package/.agents/backend/fm-teardown.sh +2922 -0
  169. package/.agents/backend/fm-test-isolation-proof.sh +588 -0
  170. package/.agents/backend/fm-test-run.sh +2191 -0
  171. package/.agents/backend/fm-timeout-lib.sh +141 -0
  172. package/.agents/backend/fm-timing-lib.sh +179 -0
  173. package/.agents/backend/fm-tmux-lib.sh +291 -0
  174. package/.agents/backend/fm-tool-update-check.sh +898 -0
  175. package/.agents/backend/fm-trace-context-lib.sh +227 -0
  176. package/.agents/backend/fm-transition-lib.sh +103 -0
  177. package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
  178. package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
  179. package/.agents/backend/fm-turnend-guard.sh +432 -0
  180. package/.agents/backend/fm-update.sh +110 -0
  181. package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
  182. package/.agents/backend/fm-voice-client.py +1373 -0
  183. package/.agents/backend/fm-voice-relay.py +1256 -0
  184. package/.agents/backend/fm-wake-drain.sh +592 -0
  185. package/.agents/backend/fm-wake-grant.sh +127 -0
  186. package/.agents/backend/fm-wake-lib.sh +1849 -0
  187. package/.agents/backend/fm-watch-arm.sh +602 -0
  188. package/.agents/backend/fm-watch-checkpoint.sh +109 -0
  189. package/.agents/backend/fm-watch.sh +1962 -0
  190. package/.agents/backend/fm-x-dismiss.sh +116 -0
  191. package/.agents/backend/fm-x-followup.sh +286 -0
  192. package/.agents/backend/fm-x-lib.sh +1000 -0
  193. package/.agents/backend/fm-x-link.sh +234 -0
  194. package/.agents/backend/fm-x-poll.sh +185 -0
  195. package/.agents/backend/fm-x-reply.sh +385 -0
  196. package/.agents/backend/fm_voice_frame.py +166 -0
  197. package/.agents/backend/fm_voice_records.py +574 -0
  198. package/.agents/backend/model-bridge.py +290 -0
  199. package/.agents/backend/opencode-go-bridge.py +30 -0
  200. package/.agents/bus/README.md +12 -0
  201. package/.agents/bus/messages.json +1 -0
  202. package/.agents/config/agents.machine.example.yaml +16 -0
  203. package/.agents/config/agents.yaml +50 -0
  204. package/.agents/config/agents.yaml.example +72 -0
  205. package/.agents/config/crew-dispatch.json +22 -0
  206. package/.agents/config/cron.yaml +9 -0
  207. package/.agents/config/eindri-dispatch.json +67 -0
  208. package/.agents/config/eindri-harness +1 -0
  209. package/.agents/config/startup-memory-budget +1 -0
  210. package/.agents/config/tailscale-sync.yaml +27 -0
  211. package/.agents/filebrowser/.filebrowser.json +6 -0
  212. package/.agents/filebrowser/README.md +11 -0
  213. package/.agents/gateway/README.md +12 -0
  214. package/.agents/github/README.md +15 -0
  215. package/.agents/github/webhooks/.gitkeep +0 -0
  216. package/.agents/github/workflows/.gitkeep +0 -0
  217. package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
  218. package/.agents/harness/opencode/plugins/package.json +4 -0
  219. package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
  220. package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
  221. package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
  222. package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
  223. package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
  224. package/.agents/memory/README.md +46 -0
  225. package/.agents/memory/kaia.engram +0 -0
  226. package/.agents/memory/kaia.engram-shm +0 -0
  227. package/.agents/memory/kaia.engram-wal +0 -0
  228. package/.agents/memory/runes_audit.md +5 -0
  229. package/.agents/memory/well/episodes.jsonl +367 -0
  230. package/.agents/memory/well/workspace.jsonl +27 -0
  231. package/.agents/migrations/0001-hodd-layout.sh +38 -0
  232. package/.agents/migrations/0002-a2a-mcp.sh +27 -0
  233. package/.agents/migrations/0003-private-data-separation.sh +111 -0
  234. package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
  235. package/.agents/sandbox/Dockerfile.utgard +19 -0
  236. package/.agents/sandbox/README.md +14 -0
  237. package/.agents/sandbox/utgard.config.json +14 -0
  238. package/.agents/skills/README.md +59 -0
  239. package/.agents/skills/bragi-marketing/README.md +3 -0
  240. package/.agents/skills/bragi-marketing/SKILL.md +82 -0
  241. package/.agents/skills/eindri-homes/README.md +3 -0
  242. package/.agents/skills/eindri-homes/SKILL.md +291 -0
  243. package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
  244. package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
  245. package/.agents/skills/frigg-consent/README.md +3 -0
  246. package/.agents/skills/frigg-consent/SKILL.md +56 -0
  247. package/.agents/skills/galdr-ymirsystem/README.md +3 -0
  248. package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
  249. package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
  250. package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
  251. package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
  252. package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
  253. package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
  254. package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
  255. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
  256. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
  257. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
  258. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
  259. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
  260. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
  261. package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
  262. package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
  263. package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
  264. package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
  265. package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
  266. package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
  267. package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
  268. package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
  269. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
  270. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
  271. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
  272. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
  273. package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
  274. package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
  275. package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
  276. package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
  277. package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
  278. package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
  279. package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
  280. package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
  281. package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
  282. package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
  283. package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
  284. package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
  285. package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
  286. package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
  287. package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
  288. package/.agents/skills/gjallarhorn-relay/README.md +3 -0
  289. package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
  290. package/.agents/skills/groa-update/SKILL.md +70 -0
  291. package/.agents/skills/hamr-adapters/README.md +3 -0
  292. package/.agents/skills/hamr-adapters/SKILL.md +123 -0
  293. package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
  294. package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
  295. package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
  296. package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
  297. package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
  298. package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
  299. package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
  300. package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
  301. package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
  302. package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
  303. package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
  304. package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
  305. package/.agents/skills/herdr-panes/README.md +3 -0
  306. package/.agents/skills/herdr-panes/SKILL.md +92 -0
  307. package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
  308. package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
  309. package/.agents/skills/hnoss-design/DESIGN.md +19 -0
  310. package/.agents/skills/hnoss-design/README.md +3 -0
  311. package/.agents/skills/hnoss-design/SKILL.md +83 -0
  312. package/.agents/skills/hvild-afk/README.md +3 -0
  313. package/.agents/skills/hvild-afk/SKILL.md +241 -0
  314. package/.agents/skills/jord-projects/README.md +3 -0
  315. package/.agents/skills/jord-projects/SKILL.md +92 -0
  316. package/.agents/skills/lifecycle/SKILL.md +56 -0
  317. package/.agents/skills/lifecycle/smoke_test.sh +52 -0
  318. package/.agents/skills/lifecycle/start.sh +21 -0
  319. package/.agents/skills/lifecycle/status.sh +35 -0
  320. package/.agents/skills/lifecycle/stop.sh +16 -0
  321. package/.agents/skills/muninn-stow/README.md +3 -0
  322. package/.agents/skills/muninn-stow/SKILL.md +309 -0
  323. package/.agents/skills/no-mistakes/SKILL.md +379 -0
  324. package/.agents/skills/nornir-schedule/README.md +3 -0
  325. package/.agents/skills/nornir-schedule/SKILL.md +25 -0
  326. package/.agents/skills/nornir-schedule/assets/events.md +137 -0
  327. package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
  328. package/.agents/skills/nsr-compliance/README.md +3 -0
  329. package/.agents/skills/nsr-compliance/SKILL.md +29 -0
  330. package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
  331. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
  332. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
  333. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
  334. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
  335. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
  336. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
  337. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
  338. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
  339. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
  340. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
  341. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
  342. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
  343. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
  344. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
  345. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
  346. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
  347. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
  348. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
  349. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
  350. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
  351. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
  352. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
  353. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  354. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
  355. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
  356. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
  357. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
  358. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
  359. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
  360. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
  361. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
  362. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
  363. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
  364. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
  365. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
  366. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
  367. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
  368. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
  369. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
  370. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
  371. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
  372. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
  373. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
  374. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
  375. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
  376. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
  377. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
  378. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
  379. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
  380. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
  381. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
  382. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
  383. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
  384. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
  385. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
  386. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
  387. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
  388. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
  389. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
  390. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
  391. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
  392. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
  393. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
  394. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
  395. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
  396. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
  397. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
  398. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
  399. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
  400. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
  401. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
  402. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
  403. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
  404. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
  405. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
  406. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
  407. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
  408. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
  409. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
  410. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
  411. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
  412. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
  413. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
  414. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
  415. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
  416. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
  417. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
  418. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
  419. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
  420. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
  421. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
  422. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
  423. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
  424. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
  425. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
  426. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
  427. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
  428. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
  429. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
  430. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
  431. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
  432. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
  433. package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
  434. package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
  435. package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
  436. package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
  437. package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
  438. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
  439. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
  440. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
  441. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
  442. package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
  443. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
  444. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
  445. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
  446. package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
  447. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
  448. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
  449. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
  450. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
  451. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
  452. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
  453. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
  454. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  455. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
  456. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
  457. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
  458. package/.agents/skills/pr-ops/README.md +3 -0
  459. package/.agents/skills/pr-ops/SKILL.md +109 -0
  460. package/.agents/skills/ratatoskr-a2a/README.md +3 -0
  461. package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
  462. package/.agents/skills/rules-check-drift/SKILL.md +81 -0
  463. package/.agents/skills/saga-bearings/README.md +3 -0
  464. package/.agents/skills/saga-bearings/SKILL.md +26 -0
  465. package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
  466. package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
  467. package/.agents/skills/saga-bearings/assets/recap.md +56 -0
  468. package/.agents/skills/syn-recovery/README.md +3 -0
  469. package/.agents/skills/syn-recovery/SKILL.md +54 -0
  470. package/.agents/skills/tyr-check/README.md +3 -0
  471. package/.agents/skills/tyr-check/SKILL.md +218 -0
  472. package/.agents/skills/urdh-hold/README.md +3 -0
  473. package/.agents/skills/urdh-hold/SKILL.md +25 -0
  474. package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
  475. package/.agents/skills/urdh-hold/assets/hold.md +54 -0
  476. package/.agents/skills/vor-diagnostics/README.md +3 -0
  477. package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
  478. package/.agents/skills/ymir-host/README.md +3 -0
  479. package/.agents/skills/ymir-host/SKILL.md +34 -0
  480. package/.agents/skills/ymir-host/assets/desktop.md +36 -0
  481. package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
  482. package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
  483. package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
  484. package/.agents/skills/ymir-host/assets/update.md +64 -0
  485. package/.agents/tests/assets/board-render-harness.mjs +117 -0
  486. package/.agents/tests/cmux-test-safety.sh +51 -0
  487. package/.agents/tests/fixtures.sh +291 -0
  488. package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
  489. package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
  490. package/.agents/tests/fm-afk-launch.test.sh +961 -0
  491. package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
  492. package/.agents/tests/fm-afk-return.test.sh +283 -0
  493. package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
  494. package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
  495. package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
  496. package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
  497. package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
  498. package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
  499. package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
  500. package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
  501. package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
  502. package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
  503. package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
  504. package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
  505. package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
  506. package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
  507. package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
  508. package/.agents/tests/fm-backend-orca.test.sh +1357 -0
  509. package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
  510. package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
  511. package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
  512. package/.agents/tests/fm-backend.test.sh +1142 -0
  513. package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
  514. package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
  515. package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
  516. package/.agents/tests/fm-bearings-board.test.sh +414 -0
  517. package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
  518. package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
  519. package/.agents/tests/fm-bootstrap.test.sh +1178 -0
  520. package/.agents/tests/fm-branch-supervision.test.sh +552 -0
  521. package/.agents/tests/fm-brief.test.sh +785 -0
  522. package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
  523. package/.agents/tests/fm-busy-state.test.sh +465 -0
  524. package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
  525. package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
  526. package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
  527. package/.agents/tests/fm-check-unregister.test.sh +198 -0
  528. package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
  529. package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
  530. package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
  531. package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
  532. package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
  533. package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
  534. package/.agents/tests/fm-composer-ghost.test.sh +716 -0
  535. package/.agents/tests/fm-composer-lib.test.sh +666 -0
  536. package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
  537. package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
  538. package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
  539. package/.agents/tests/fm-control.test.sh +910 -0
  540. package/.agents/tests/fm-crew-state.test.sh +1610 -0
  541. package/.agents/tests/fm-cursor-harness.test.sh +404 -0
  542. package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
  543. package/.agents/tests/fm-cursor-primary.test.sh +708 -0
  544. package/.agents/tests/fm-daemon.test.sh +2740 -0
  545. package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
  546. package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
  547. package/.agents/tests/fm-extension-binding.test.sh +2187 -0
  548. package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
  549. package/.agents/tests/fm-fleet-sync.test.sh +721 -0
  550. package/.agents/tests/fm-gate-refuse.test.sh +356 -0
  551. package/.agents/tests/fm-gitignore-config.test.sh +89 -0
  552. package/.agents/tests/fm-gotmp.test.sh +230 -0
  553. package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
  554. package/.agents/tests/fm-grok-harness.test.sh +117 -0
  555. package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
  556. package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
  557. package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
  558. package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
  559. package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
  560. package/.agents/tests/fm-herdr-lab.test.sh +243 -0
  561. package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
  562. package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
  563. package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
  564. package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
  565. package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
  566. package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
  567. package/.agents/tests/fm-kimi-harness.test.sh +687 -0
  568. package/.agents/tests/fm-lint-workflows.test.sh +532 -0
  569. package/.agents/tests/fm-lint.test.sh +1023 -0
  570. package/.agents/tests/fm-muse-harness.test.sh +932 -0
  571. package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
  572. package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
  573. package/.agents/tests/fm-on.test.sh +507 -0
  574. package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
  575. package/.agents/tests/fm-operational-input.test.sh +160 -0
  576. package/.agents/tests/fm-peek-remote.test.sh +110 -0
  577. package/.agents/tests/fm-pending-reply.test.sh +1288 -0
  578. package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
  579. package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
  580. package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
  581. package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
  582. package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
  583. package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
  584. package/.agents/tests/fm-pr-merge.test.sh +2135 -0
  585. package/.agents/tests/fm-procevent-quota.test.sh +225 -0
  586. package/.agents/tests/fm-procevent-when.test.sh +406 -0
  587. package/.agents/tests/fm-procevent.test.sh +1745 -0
  588. package/.agents/tests/fm-project-origin.test.sh +110 -0
  589. package/.agents/tests/fm-public-followup.test.sh +2272 -0
  590. package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
  591. package/.agents/tests/fm-quota-choose.test.sh +626 -0
  592. package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
  593. package/.agents/tests/fm-remote-doctor.test.sh +625 -0
  594. package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
  595. package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
  596. package/.agents/tests/fm-remote-job.test.sh +768 -0
  597. package/.agents/tests/fm-remote-reply.test.sh +520 -0
  598. package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
  599. package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
  600. package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
  601. package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
  602. package/.agents/tests/fm-review-diff.test.sh +176 -0
  603. package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
  604. package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
  605. package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
  606. package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
  607. package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
  608. package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
  609. package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
  610. package/.agents/tests/fm-send-inbox.test.sh +352 -0
  611. package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
  612. package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
  613. package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
  614. package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
  615. package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
  616. package/.agents/tests/fm-send-settle.test.sh +147 -0
  617. package/.agents/tests/fm-send-strict.test.sh +241 -0
  618. package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
  619. package/.agents/tests/fm-session-start.test.sh +2515 -0
  620. package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
  621. package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
  622. package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
  623. package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
  624. package/.agents/tests/fm-spawn-batch.test.sh +148 -0
  625. package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
  626. package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
  627. package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
  628. package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
  629. package/.agents/tests/fm-startup-network.test.sh +712 -0
  630. package/.agents/tests/fm-stow-cascade.test.sh +370 -0
  631. package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
  632. package/.agents/tests/fm-supervision-events.test.sh +156 -0
  633. package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
  634. package/.agents/tests/fm-tangle-guard.test.sh +277 -0
  635. package/.agents/tests/fm-task-delivery.test.sh +420 -0
  636. package/.agents/tests/fm-task-inbox.test.sh +513 -0
  637. package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
  638. package/.agents/tests/fm-teardown.test.sh +2665 -0
  639. package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
  640. package/.agents/tests/fm-test-fixtures.test.sh +132 -0
  641. package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
  642. package/.agents/tests/fm-test-run.test.sh +1196 -0
  643. package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
  644. package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
  645. package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
  646. package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
  647. package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
  648. package/.agents/tests/fm-transition-lib.test.sh +54 -0
  649. package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
  650. package/.agents/tests/fm-update.test.sh +304 -0
  651. package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
  652. package/.agents/tests/fm-voice-relay.test.sh +4741 -0
  653. package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
  654. package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
  655. package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
  656. package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
  657. package/.agents/tests/fm-wake-queue.test.sh +1224 -0
  658. package/.agents/tests/fm-watch-arm.test.sh +821 -0
  659. package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
  660. package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
  661. package/.agents/tests/fm-watch-triage.test.sh +3889 -0
  662. package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
  663. package/.agents/tests/fm-x-mode.test.sh +3042 -0
  664. package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
  665. package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
  666. package/.agents/tests/herdr-test-safety.sh +42 -0
  667. package/.agents/tests/lib.sh +315 -0
  668. package/.agents/tests/remote-herdr-fixture.sh +125 -0
  669. package/.agents/tests/secondmate-helpers.sh +193 -0
  670. package/.agents/tests/smoke.test.sh +93 -0
  671. package/.agents/tests/wake-helpers.sh +338 -0
  672. package/.agents/tests/zellij-test-safety.sh +60 -0
  673. package/.agents/tools/README.md +10 -0
  674. package/.agents/tools/bin/tasks-cli +267 -0
  675. package/.agents/tools/tasks-cli.ts +216 -0
  676. package/AGENTS.md +454 -0
  677. package/CHANGELOG.md +881 -0
  678. package/LICENSE +1 -1
  679. package/NOTICE +63 -0
  680. package/README.md +113 -59
  681. package/RULES/01-domains.md +51 -0
  682. package/RULES/02-agents.md +78 -0
  683. package/RULES/03-houses.md +61 -0
  684. package/RULES/04-hoard.md +65 -0
  685. package/RULES/05-platforms.md +67 -0
  686. package/RULES/06-append-only.md +58 -0
  687. package/RULES/07-config.md +45 -0
  688. package/RULES/08-delivery-gate.md +75 -0
  689. package/RULES/README.md +20 -0
  690. package/bin/README.md +107 -0
  691. package/bin/a2a-mcp.sh +98 -0
  692. package/bin/a2a-serve.py +103 -0
  693. package/bin/a2a-serve.sh +8 -0
  694. package/bin/a2a-talk.sh +50 -0
  695. package/bin/a2abridge-ensure.sh +108 -0
  696. package/bin/agent-run.sh +43 -0
  697. package/bin/agents-config.sh +233 -0
  698. package/bin/apodex-smoke-test.sh +92 -0
  699. package/bin/bifrost-bridge.sh +112 -0
  700. package/bin/bifrost-ingress.sh +77 -0
  701. package/bin/bootstrap-macos.sh +107 -0
  702. package/bin/bootstrap-windows.ps1 +112 -0
  703. package/bin/branch-guard.sh +64 -0
  704. package/bin/brokk +73 -0
  705. package/bin/brokk-classify-lib.sh +1770 -0
  706. package/bin/brokk-lease-lib.sh +222 -0
  707. package/bin/brokk-lease.sh +193 -0
  708. package/bin/brokk-lint.sh +65 -0
  709. package/bin/brokk-send.sh +38 -0
  710. package/bin/brokk-update.sh +9 -0
  711. package/bin/brokk-wake-grant.sh +127 -0
  712. package/bin/brokk-wake-lib.sh +1849 -0
  713. package/bin/changelog-guard.sh +165 -0
  714. package/bin/crash-sense.sh +160 -0
  715. package/bin/desktop-place.sh +224 -0
  716. package/bin/docs-guard.sh +39 -0
  717. package/bin/editor-place.sh +207 -0
  718. package/bin/eindri-acclaim.sh +34 -0
  719. package/bin/eindri-control.sh +28 -0
  720. package/bin/eindri-role.sh +83 -0
  721. package/bin/eindri-seen.sh +41 -0
  722. package/bin/eindri-send.sh +15 -0
  723. package/bin/eindri-start.sh +85 -0
  724. package/bin/eindri-watch.sh +57 -0
  725. package/bin/einherjar-spawn.sh +576 -0
  726. package/bin/eir-doctor.sh +112 -0
  727. package/bin/erindi-brief.sh +271 -0
  728. package/bin/fleet-apply.sh +68 -0
  729. package/bin/github-deploy.sh +81 -0
  730. package/bin/gjallarhorn-expose.sh +102 -0
  731. package/bin/gjallarhorn-notify.sh +58 -0
  732. package/bin/gjallarhorn-purge.sh +54 -0
  733. package/bin/gjallarhorn-tunnel.sh +72 -0
  734. package/bin/gleipnir-lock-lib.sh +284 -0
  735. package/bin/groa-update.sh +122 -0
  736. package/bin/hall-snapshot.sh +92 -0
  737. package/bin/hamr-harness.sh +246 -0
  738. package/bin/heimdall-ssh-keys.sh +374 -0
  739. package/bin/herdr-agents.py +44 -0
  740. package/bin/herdr-ensure.sh +104 -0
  741. package/bin/herdr-run.sh +431 -0
  742. package/bin/hermes-ensure.sh +88 -0
  743. package/bin/hoard-lib.sh +25 -0
  744. package/bin/hodd.sh +78 -0
  745. package/bin/host-sense.sh +199 -0
  746. package/bin/huginn-research-worker.sh +108 -0
  747. package/bin/local-model-lock.sh +51 -0
  748. package/bin/mimir-bridge.py +226 -0
  749. package/bin/mimir-bridge.sh +87 -0
  750. package/bin/mimir-ingest.sh +131 -0
  751. package/bin/mimir.sh +113 -0
  752. package/bin/mjollnir-webhook.sh +59 -0
  753. package/bin/mjollnir.sh +85 -0
  754. package/bin/model-hardware.sh +82 -0
  755. package/bin/model-resolve.sh +147 -0
  756. package/bin/models-detect.sh +178 -0
  757. package/bin/nornir-cron-start.sh +162 -0
  758. package/bin/nornir-job-daily-briefing.sh +191 -0
  759. package/bin/nornir-job-git-sync.sh +152 -0
  760. package/bin/nornir-job-memory-housekeeping.sh +114 -0
  761. package/bin/nornir-job-observer.sh +166 -0
  762. package/bin/nornir-job-skillopt-sleep.sh +76 -0
  763. package/bin/omarchy-hook-install.sh +60 -0
  764. package/bin/omarchy-install.sh +148 -0
  765. package/bin/omarchy-plugins.sh +174 -0
  766. package/bin/omarchy-sense.sh +149 -0
  767. package/bin/perm-guard.sh +30 -0
  768. package/bin/pi-agent.sh +68 -0
  769. package/bin/pi-ensure.sh +77 -0
  770. package/bin/pi-local.sh +37 -0
  771. package/bin/pi-seat.sh +63 -0
  772. package/bin/prereq-ensure.sh +166 -0
  773. package/bin/private-guard.sh +38 -0
  774. package/bin/project-git.sh +55 -0
  775. package/bin/public-guard.sh +70 -0
  776. package/bin/ratatoskr.sh +49 -0
  777. package/bin/realm-lib.sh +32 -0
  778. package/bin/repo-scrub.sh +62 -0
  779. package/bin/rodd-operational-input.sh +250 -0
  780. package/bin/runes-append.sh +198 -0
  781. package/bin/saga-session-start.sh +172 -0
  782. package/bin/saga-sessionstart-run.sh +79 -0
  783. package/bin/saga-wake-drain.sh +41 -0
  784. package/bin/secret-guard.sh +63 -0
  785. package/bin/sessrumnir-ensure.sh +100 -0
  786. package/bin/sessrumnir-sync.sh +237 -0
  787. package/bin/sessrumnir.sh +91 -0
  788. package/bin/skillopt-setup.sh +76 -0
  789. package/bin/skuld-branch-outcome.sh +203 -0
  790. package/bin/skuld-branch-prompt.sh +101 -0
  791. package/bin/smidja-bootstrap.sh +90 -0
  792. package/bin/smidja-observe.sh +86 -0
  793. package/bin/syn-arm-pretool-check.sh +57 -0
  794. package/bin/syn-asset-pretool-check.sh +76 -0
  795. package/bin/syn-cd-pretool-check.sh +28 -0
  796. package/bin/syn-guard-pretool-check.sh +83 -0
  797. package/bin/syn-turnend-guard.sh +36 -0
  798. package/bin/syn-watch-arm.sh +99 -0
  799. package/bin/tailscale-sync.sh +190 -0
  800. package/bin/telegram-bot.sh +69 -0
  801. package/bin/toolchain.sh +74 -0
  802. package/bin/utgard.sh +111 -0
  803. package/bin/valhalla.sh +115 -0
  804. package/bin/valknut-load.sh +260 -0
  805. package/bin/vor-crew-state.sh +124 -0
  806. package/bin/wedge-notify.sh +47 -0
  807. package/bin/workspace-provision.sh +80 -0
  808. package/bin/workspace-rag.sh +150 -0
  809. package/bin/wyrd-db.sh +47 -0
  810. package/bin/yggdrasil.sh +152 -0
  811. package/bin/ymir-edit.sh +145 -0
  812. package/bin/ymir-install.sh +641 -0
  813. package/bin/ymir-invite.sh +93 -0
  814. package/bin/ymir-isolation.sh +88 -0
  815. package/bin/ymir-migrate.sh +61 -0
  816. package/bin/ymir-platform.sh +348 -0
  817. package/bin/ymir-say.sh +97 -0
  818. package/bin/ymir-setup-auth.sh +108 -0
  819. package/bin/ymir-validate.sh +173 -0
  820. package/bin/ymir.js +74 -16
  821. package/docs/Architecture.md +339 -0
  822. package/docs/design.md +351 -0
  823. package/docs/installations/README.md +63 -0
  824. package/docs/installations/ymir-home.md +93 -0
  825. package/docs/integration.md +105 -0
  826. package/docs/lore.md +1056 -0
  827. package/docs/research/agent-harnesses.md +290 -0
  828. package/docs/runbooks/README.md +19 -0
  829. package/docs/runbooks/a2a.md +91 -0
  830. package/docs/runbooks/agent-permissions.md +99 -0
  831. package/docs/runbooks/agents.md +57 -0
  832. package/docs/runbooks/models.md +69 -0
  833. package/docs/runbooks/realm-onboarding.md +60 -0
  834. package/docs/runbooks/secrets-and-hoard.md +60 -0
  835. package/docs/runbooks/updates-and-migrations.md +110 -0
  836. package/docs/runbooks/worktrees-isolation.md +72 -0
  837. package/docs/session-start.md +105 -0
  838. package/docs/skillopt-integration.md +321 -0
  839. package/docs/sync-system.md +66 -0
  840. package/docs/workspaces.md +104 -0
  841. package/docs/ymir-rut.md +260 -0
  842. package/package.json +44 -14
  843. package/packaging/build.sh +74 -0
  844. package/packaging/macos/Ymir Installer.command +43 -0
  845. package/packaging/windows/ymir-setup.nsi +74 -0
  846. package/scripts/README.md +22 -0
  847. package/scripts/electron.sh +210 -0
  848. package/scripts/start.sh +167 -0
  849. package/scripts/stop.sh +113 -0
  850. package/install.sh +0 -35
@@ -0,0 +1,290 @@
1
+ #!/usr/bin/env python3
2
+ """model-bridge.py — expose a model provider to pi via an OpenAI-compatible
3
+ local endpoint.
4
+
5
+ Why: pi resolves models from ~/.pi/agent/models.json, which cannot read the API
6
+ key from the repo's .env. This bridge listens on 127.0.0.1, reads the provider
7
+ credential from .env, and proxies /v1/* to the selected provider. pi then just
8
+ registers the provider with baseUrl=http://127.0.0.1:PORT/v1 and any placeholder
9
+ key.
10
+
11
+ Providers (YMIR_MODEL_PROVIDER):
12
+ opencode-go (default) OpenCode Zen Go gateway — REQUIRES OPENCODE_GO_API_KEY
13
+ lmstudio LM Studio on localhost — NO KEY REQUIRED
14
+ openai-compatible any OpenAI-compatible server — optional key
15
+
16
+ The Allfather chooses. No provider is forced to need a key: LM Studio runs
17
+ entirely locally and the bridge starts with no credential at all.
18
+
19
+ Endpoints (OpenAI-compatible):
20
+ GET /v1/models -> model list (for pi listing)
21
+ POST /v1/chat/completions -> proxied (JSON or SSE stream)
22
+
23
+ Usage:
24
+ python3 model-bridge.py [--port 4603] [--env /path/.env] [--provider NAME]
25
+
26
+ Env:
27
+ YMIR_MODEL_PROVIDER opencode-go | lmstudio | openai-compatible
28
+ YMIR_MODEL_BASE_URL override the provider's base URL
29
+ YMIR_MODEL_API_KEY credential for the selected provider
30
+ OPENCODE_GO_API_KEY credential when provider=opencode-go
31
+ LMSTUDIO_BASE_URL default http://127.0.0.1:1234/v1
32
+ OPENCODE_GO_BASE_URL default https://opencode.ai/zen/go/v1
33
+ OPENCODE_GO_BRIDGE_PORT default 4603
34
+ """
35
+ import argparse
36
+ import json
37
+ import os
38
+ import sys
39
+ import urllib.request
40
+ import urllib.error
41
+ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
42
+
43
+ DEFAULT_PORT = 4603
44
+
45
+ # Provider catalogue. `key_env` lists the env names checked, in order; an empty
46
+ # key requirement (lmstudio) means the bridge starts with no credential.
47
+ PROVIDERS = {
48
+ "opencode-go": {
49
+ "base_url": "https://opencode.ai/zen/go/v1",
50
+ "base_url_env": "OPENCODE_GO_BASE_URL",
51
+ "key_env": ["OPENCODE_GO_API_KEY", "YMIR_MODEL_API_KEY"],
52
+ "requires_key": True,
53
+ },
54
+ "lmstudio": {
55
+ "base_url": "http://127.0.0.1:1234/v1",
56
+ "base_url_env": "LMSTUDIO_BASE_URL",
57
+ "key_env": ["LMSTUDIO_API_KEY", "YMIR_MODEL_API_KEY"],
58
+ "requires_key": False,
59
+ },
60
+ "openai-compatible": {
61
+ "base_url": "",
62
+ "base_url_env": "YMIR_MODEL_BASE_URL",
63
+ "key_env": ["YMIR_MODEL_API_KEY"],
64
+ "requires_key": False,
65
+ },
66
+ }
67
+
68
+ # The opencode-go catalog (from `opencode models`, 2026-08-31).
69
+ # Bare model ids — the gateway rejects the `opencode-go/` prefix.
70
+ MODELS = [
71
+ {"id": "deepseek-v4-flash", "contextWindow": 131072, "input": ["text"]},
72
+ {"id": "deepseek-v4-flash-vision-exp", "contextWindow": 131072, "input": ["text", "image"]},
73
+ {"id": "deepseek-v4-pro", "contextWindow": 131072, "input": ["text"]},
74
+ {"id": "glm-5.1", "contextWindow": 131072, "input": ["text"]},
75
+ ]
76
+
77
+ # Resolved at startup.
78
+ KEY = ""
79
+ BASE_URL = ""
80
+ PROVIDER = "opencode-go"
81
+
82
+
83
+ def load_env(path: str) -> dict:
84
+ env = {}
85
+ try:
86
+ with open(path) as f:
87
+ for line in f:
88
+ line = line.strip()
89
+ if not line or line.startswith("#") or "=" not in line:
90
+ continue
91
+ k, _, v = line.partition("=")
92
+ env[k.strip()] = v.strip().strip('"').strip("'")
93
+ except FileNotFoundError:
94
+ pass
95
+ return env
96
+
97
+
98
+ def resolve_provider(env: dict, cli_provider: str | None) -> str:
99
+ name = (cli_provider or env.get("YMIR_MODEL_PROVIDER")
100
+ or os.environ.get("YMIR_MODEL_PROVIDER") or "opencode-go").strip()
101
+ if name not in PROVIDERS:
102
+ print(f"[bridge] ERROR: unknown provider '{name}'. "
103
+ f"Choose one of: {', '.join(PROVIDERS)}", file=sys.stderr)
104
+ raise SystemExit(2)
105
+ return name
106
+
107
+
108
+ def resolve_base_url(env: dict, spec: dict) -> str:
109
+ for holder in (env, os.environ):
110
+ v = holder.get("YMIR_MODEL_BASE_URL")
111
+ if v:
112
+ return v
113
+ v = env.get(spec["base_url_env"]) or os.environ.get(spec["base_url_env"])
114
+ return v or spec["base_url"]
115
+
116
+
117
+ def resolve_key(env: dict, spec: dict) -> str:
118
+ for name in spec["key_env"]:
119
+ v = env.get(name) or os.environ.get(name)
120
+ if v:
121
+ return v
122
+ return ""
123
+
124
+
125
+ def is_https(url: str) -> bool:
126
+ return url.startswith("https://")
127
+
128
+
129
+ def split_url(url: str) -> tuple[str, str]:
130
+ rest = url.split("://", 1)[1]
131
+ host, _, path = rest.partition("/")
132
+ return host, "/" + path if path else ""
133
+
134
+
135
+ class Handler(BaseHTTPRequestHandler):
136
+ protocol_version = "HTTP/1.1"
137
+
138
+ def log_message(self, fmt, *args): # quieter, timestamped
139
+ print(f"[bridge] {self.log_date_time_string()} {fmt % args}", flush=True)
140
+
141
+ def _send(self, code: int, body: bytes, ctype: str) -> None:
142
+ self.send_response(code)
143
+ self.send_header("Content-Type", ctype)
144
+ self.send_header("Content-Length", str(len(body)))
145
+ self.end_headers()
146
+ self.wfile.write(body)
147
+
148
+ def _models(self) -> list:
149
+ # Ask the provider what it serves; fall back to the static catalogue.
150
+ try:
151
+ req = urllib.request.Request(_upstream("models"),
152
+ headers=_auth_headers())
153
+ with urllib.request.urlopen(req, timeout=10) as r:
154
+ data = json.loads(r.read())
155
+ return data.get("data", [])
156
+ except Exception:
157
+ return [{"id": m["id"], "object": "model"} for m in MODELS]
158
+
159
+ def do_GET(self):
160
+ if self.path.split("?")[0] == "/v1/models":
161
+ payload = {"object": "list", "data": self._models()}
162
+ self._send(200, json.dumps(payload).encode(), "application/json")
163
+ else:
164
+ self._send(404, json.dumps({"error": "not found"}).encode(), "application/json")
165
+
166
+ def do_POST(self):
167
+ if self.path.split("?")[0] != "/v1/chat/completions":
168
+ self._send(404, json.dumps({"error": "not found"}).encode(), "application/json")
169
+ return
170
+ try:
171
+ length = int(self.headers.get("Content-Length", 0))
172
+ body = self.rfile.read(length) if length else b"{}"
173
+ req = json.loads(body)
174
+ mid = req.get("model", "")
175
+ # opencode-go rejects the `opencode-go/` prefix; strip provider prefixes.
176
+ if PROVIDER == "opencode-go" and "/" in mid and mid.split("/", 1)[0] != "openai":
177
+ req["model"] = mid.split("/", 1)[1]
178
+ body = json.dumps(req).encode()
179
+ self._proxy(body, req.get("stream", False))
180
+ except Exception as e:
181
+ print(f"[bridge] proxy error: {e}", flush=True)
182
+ try:
183
+ self._send(500, json.dumps({"error": str(e)}).encode(), "application/json")
184
+ except Exception:
185
+ pass
186
+
187
+ def _proxy(self, body: bytes, stream: bool) -> None:
188
+ req = urllib.request.Request(
189
+ _upstream("chat/completions"),
190
+ data=body,
191
+ headers=_auth_headers(stream),
192
+ method="POST",
193
+ )
194
+ try:
195
+ resp = urllib.request.urlopen(req, timeout=300)
196
+ except urllib.error.HTTPError as e:
197
+ # Relay the provider's error verbatim so the operator sees the cause.
198
+ payload = e.read()
199
+ self._send(e.code, payload, e.headers.get("Content-Type", "application/json"))
200
+ return
201
+ self.send_response(resp.status)
202
+ ctype = resp.headers.get("Content-Type", "application/json")
203
+ self.send_header("Content-Type", ctype)
204
+ self.send_header("Cache-Control", "no-cache")
205
+ if stream:
206
+ # no Content-Length: frame as chunked so the client gets EOF at
207
+ # the terminating 0-chunk even though upstream SSE never closes
208
+ self.send_header("Transfer-Encoding", "chunked")
209
+ self.send_header("Connection", "close")
210
+ chunked = True
211
+ else:
212
+ cl = resp.headers.get("Content-Length")
213
+ if cl:
214
+ self.send_header("Content-Length", cl)
215
+ chunked = False
216
+ self.end_headers()
217
+ while True:
218
+ chunk = resp.read(4096)
219
+ if not chunk:
220
+ break
221
+ try:
222
+ if chunked:
223
+ self.wfile.write(f"{len(chunk):x}\r\n".encode() + chunk + b"\r\n")
224
+ else:
225
+ self.wfile.write(chunk)
226
+ self.wfile.flush()
227
+ except (BrokenPipeError, ConnectionResetError):
228
+ break # client went away; upstream closes with us
229
+ if chunked:
230
+ try:
231
+ self.wfile.write(b"0\r\n\r\n")
232
+ self.wfile.flush()
233
+ except (BrokenPipeError, ConnectionResetError):
234
+ pass
235
+
236
+
237
+ def _upstream(suffix: str) -> str:
238
+ return BASE_URL.rstrip("/") + "/" + suffix
239
+
240
+
241
+ def _auth_headers(stream: bool = False) -> dict:
242
+ h = {"Content-Type": "application/json",
243
+ "Accept": "text/event-stream" if stream else "application/json"}
244
+ if KEY:
245
+ h["Authorization"] = f"Bearer {KEY}"
246
+ return h
247
+
248
+
249
+ def main() -> int:
250
+ ap = argparse.ArgumentParser(description=__doc__)
251
+ ap.add_argument("--port", type=int,
252
+ default=int(os.environ.get("OPENCODE_GO_BRIDGE_PORT", DEFAULT_PORT)))
253
+ ap.add_argument("--env", default=os.environ.get("ENV_FILE",
254
+ str(__import__("pathlib").Path(__file__).resolve().parents[1] / ".env")))
255
+ ap.add_argument("--provider", default=None,
256
+ help="opencode-go | lmstudio | openai-compatible")
257
+ args = ap.parse_args()
258
+
259
+ global KEY, BASE_URL, PROVIDER
260
+ env = load_env(args.env)
261
+ PROVIDER = resolve_provider(env, args.provider)
262
+ spec = PROVIDERS[PROVIDER]
263
+ BASE_URL = resolve_base_url(env, spec)
264
+ KEY = resolve_key(env, spec)
265
+
266
+ if spec["requires_key"] and not KEY:
267
+ print(f"[bridge] ERROR: provider '{PROVIDER}' requires a key. Set "
268
+ f"{' or '.join(spec['key_env'])} in {args.env}, or choose a "
269
+ f"keyless provider such as 'lmstudio'.", file=sys.stderr)
270
+ return 1
271
+ if not BASE_URL:
272
+ print(f"[bridge] ERROR: provider '{PROVIDER}' has no base URL. Set "
273
+ f"YMIR_MODEL_BASE_URL in {args.env}.", file=sys.stderr)
274
+ return 1
275
+
276
+ host, path = split_url(BASE_URL)
277
+ keynote = "no key required" if not KEY else f"key from {args.env}"
278
+ print(f"[bridge] provider '{PROVIDER}' on 127.0.0.1:{args.port}/v1 "
279
+ f"-> {host}{path.rstrip('/')}/chat/completions ({keynote})", flush=True)
280
+
281
+ srv = ThreadingHTTPServer(("127.0.0.1", args.port), Handler)
282
+ try:
283
+ srv.serve_forever()
284
+ except KeyboardInterrupt:
285
+ print("\n[bridge] stopped", flush=True)
286
+ return 0
287
+
288
+
289
+ if __name__ == "__main__":
290
+ sys.exit(main())
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env python3
2
+ """opencode-go-bridge.py — backward-compatible entry point.
3
+
4
+ The bridge grew a provider choice, so the implementation now lives in
5
+ `model-bridge.py`. This shim keeps every existing reference to
6
+ `opencode-go-bridge.py` working by delegating with `--provider opencode-go`.
7
+
8
+ Prefer `model-bridge.py` (or `bin/bifrost-bridge.sh --provider NAME`) for new
9
+ work; the full provider list is opencode-go, lmstudio, openai-compatible.
10
+ """
11
+ import os
12
+ import sys
13
+
14
+
15
+ def main() -> int:
16
+ # Load model-bridge.py by path (its name is not a valid module identifier).
17
+ import importlib.util
18
+ here = os.path.dirname(os.path.abspath(__file__))
19
+ spec = importlib.util.spec_from_file_location(
20
+ "model_bridge", os.path.join(here, "model-bridge.py"))
21
+ mod = importlib.util.module_from_spec(spec)
22
+ spec.loader.exec_module(mod)
23
+ # Force the legacy provider unless the caller already chose one.
24
+ if "--provider" not in sys.argv:
25
+ sys.argv += ["--provider", "opencode-go"]
26
+ return mod.main()
27
+
28
+
29
+ if __name__ == "__main__":
30
+ sys.exit(main())
@@ -0,0 +1,12 @@
1
+ # RATATOSKR — Inter-Agent Message Bus
2
+
3
+ Low-latency event queue carrying messages between agents, realms, and services.
4
+
5
+ ## Planned Files
6
+ - `protocol.ts` — `InterAgentMessage` schema (sender/recipient/type/payload/status)
7
+ - `messages.json` — active message queue state (exists)
8
+
9
+ ## Message Flow
10
+ 1. Broker (Redis or file-backed) dispatches messages
11
+ 2. Inbox consumers (agents) poll for pending tasks
12
+ 3. All messages audited to `workspace/memory/runes_audit.md`
@@ -0,0 +1 @@
1
+ []
@@ -0,0 +1,16 @@
1
+ # config/agents.<hostname>.yaml — a per-machine OVERLAY for the personal setup.
2
+ #
3
+ # Copies next to config/agents.yaml and is deep-merged over it when the
4
+ # hostname matches (short form, before the first dot). Override the hostname
5
+ # with YMIR_AGENTS_MACHINE. Use it so each machine runs its own model/harness
6
+ # combination from one repo. Private (gitignored); this .example is the shape.
7
+
8
+ # Example: this machine's hnoss runs a bigger local model, and its default
9
+ # fallback differs.
10
+ # agents:
11
+ # hnoss: { model: "llama.cpp/qwen3.6-35b-q4_k_s" }
12
+ # brokk: { model: opencode-go/deepseek-v4.1-flash }
13
+ # providers:
14
+ # llama.cpp:
15
+ # base_url: "http://127.0.0.1:8080/v1"
16
+ # default_model: opencode-go/deepseek-v4.1-flash
@@ -0,0 +1,50 @@
1
+ # config/agents.yaml — the Allfather's own combination of smiths and models.
2
+ #
3
+ # THIS IS YOUR FILE. Edit it, then run: bin/agents-config.sh apply
4
+ # No other Ymir file hardcodes a model for you; this YAML is the one place.
5
+ # Any agent without its own `model:` inherits `default_model`.
6
+
7
+ version: 1
8
+
9
+ # The harness is chosen by where the model lives — local through pi, online
10
+ # through opencode. An agent may still name `harness:` to override the rule.
11
+ harness:
12
+ local: pi # a model on a local provider runs through pi
13
+ online: opencode # a hosted model runs through opencode
14
+ local_providers: [llama.cpp, llama-cpp, lmstudio]
15
+ # The same local server is named differently per harness; translate on the way.
16
+ providers:
17
+ llama.cpp: { pi: llama-cpp }
18
+
19
+ # The fallback smith for any agent that does not name a model.
20
+ default_model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl
21
+
22
+ # Local, keyless model servers. `apply` writes these into the project harness
23
+ # config (opencode.json) so a model listed here is immediately usable. A bare
24
+ # alias (no @quant) is auto-resolved against the server's /v1/models.
25
+ providers:
26
+ llama.cpp:
27
+ npm: "@ai-sdk/openai-compatible"
28
+ name: "llama-server (local)"
29
+ base_url: "http://127.0.0.1:8080/v1"
30
+ models:
31
+ # A local llama.cpp router needs the EXACT served id (the @quant suffix);
32
+ # `apply` resolves the bare alias below to the id the server reports.
33
+ - frontend-design-expert-8b
34
+
35
+ # agent name -> { model, harness?, primary? }. Omit model to inherit
36
+ # default_model. Omit harness to follow the local/online rule above.
37
+ # `primary: true` marks the agent runnable directly (mode: all), not only
38
+ # dispatchable by another agent.
39
+ agents:
40
+ brokk: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
41
+ # Hnoss the Shaper runs local (no cloud key) -> pi, and is directly runnable.
42
+ hnoss: { model: "llama.cpp/qwen3.6-35b-a3b@q2_k_xl", primary: true }
43
+ sindri: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
44
+ bragi: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
45
+ huginn: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
46
+ kvasir: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
47
+ mimir: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
48
+ snotra: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
49
+ forseti: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
50
+ galdr: { model: llama.cpp/qwen3.6-35b-a3b@q2_k_xl }
@@ -0,0 +1,72 @@
1
+ # config/agents.yaml.example — TEMPLATE for the Allfather's personal setup.
2
+ #
3
+ # Installation copies this to config/agents.yaml when none exists
4
+ # (bin/ymir-install.sh step: host) — or run: bin/agents-config.sh init
5
+ # Edit config/agents.yaml, then: bin/agents-config.sh apply
6
+ # config/agents.yaml is gitignored: it is YOURS, private, and pushable to a
7
+ # private repo. Override its path with YMIR_AGENTS_YAML=/path/to/yours.yaml.
8
+ # Any agent without its own `model:` inherits `default_model`.
9
+
10
+ version: 1
11
+
12
+ # The harness is chosen by where the model lives — local through pi, online
13
+ # through opencode. An agent may still name `harness:` to override the rule.
14
+ harness:
15
+ local: pi # a model on a local provider runs through pi
16
+ online: opencode # a hosted model runs through opencode
17
+ local_providers: [llama.cpp, llama-cpp, lmstudio, apodex]
18
+ # The same local server is named differently per harness; translate on the way.
19
+ providers:
20
+ llama.cpp: { pi: llama-cpp }
21
+
22
+ # The fallback smith for any agent that does not name a model.
23
+ default_model: opencode-go/deepseek-v4.1-flash
24
+
25
+ # Local, keyless model servers. `apply` writes these into the project harness
26
+ # config (opencode.json) so a model listed here is immediately usable. A bare
27
+ # alias (no @quant) is auto-resolved against the server's /v1/models.
28
+ providers:
29
+ llama.cpp:
30
+ npm: "@ai-sdk/openai-compatible"
31
+ name: "llama-server (local)"
32
+ base_url: "http://127.0.0.1:8080/v1"
33
+ models:
34
+ # A local llama.cpp router needs the EXACT served id (the @quant suffix);
35
+ # `apply` resolves the bare alias below to the id the server reports.
36
+ - frontend-design-expert-8b
37
+ apodex:
38
+ npm: "@ai-sdk/openai-compatible"
39
+ name: "apodex-mini (local)"
40
+ base_url: "http://127.0.0.1:1234/v1"
41
+ models:
42
+ - apodex-1.0-mini
43
+
44
+ # agent name -> { model, harness?, primary? }. Omit model to inherit
45
+ # default_model. Omit harness to follow the local/online rule above.
46
+ # `primary: true` marks the agent runnable directly (mode: all), not only
47
+ # dispatchable by another agent.
48
+ agents:
49
+ brokk: { model: opencode-go/deepseek-v4.1-flash }
50
+ # Hnoss the Shaper runs local (no cloud key) -> pi, and is directly runnable.
51
+ hnoss: { model: "llama.cpp/frontend-design-expert-8b", primary: true }
52
+ sindri: { model: opencode-go/deepseek-v4.1-flash }
53
+ bragi: { model: opencode-go/deepseek-v4.1-flash }
54
+ huginn: { model: "apodex/apodex-1.0-mini" }
55
+ kvasir: { model: opencode-go/deepseek-v4.1-flash }
56
+ mimir: { model: opencode-go/deepseek-v4.1-flash }
57
+ snotra: { model: opencode-go/deepseek-v4.1-flash }
58
+ forseti: { model: opencode-go/deepseek-v4.1-flash }
59
+ galdr: { model: opencode-go/deepseek-v4.1-flash }
60
+ tyr: { model: opencode-go/deepseek-v4.1-flash }
61
+ saga: { model: opencode-go/deepseek-v4.1-flash }
62
+ muninn: { model: opencode-go/deepseek-v4.1-flash }
63
+ urdh: { model: opencode-go/deepseek-v4.1-flash }
64
+ frigg: { model: opencode-go/deepseek-v4.1-flash }
65
+ vor: { model: opencode-go/deepseek-v4.1-flash }
66
+ syn: { model: opencode-go/deepseek-v4.1-flash }
67
+ jord: { model: opencode-go/deepseek-v4.1-flash }
68
+ groa: { model: opencode-go/deepseek-v4.1-flash }
69
+ volundr: { model: opencode-go/deepseek-v4.1-flash }
70
+
71
+ # How many LOCAL models this machine may run at once (most boxes: 1).
72
+ local_concurrency: 1
@@ -0,0 +1,22 @@
1
+ {
2
+ "rules": [
3
+ {
4
+ "when": "General coding tasks, implementation, refactoring, or bug fixes",
5
+ "use": { "harness": "opencode", "model": "opencode/nemotron-3-ultra-free", "effort": "medium" },
6
+ "why": "Nemotron 3 Ultra Free provides strong reasoning for coding tasks at no cost via opencode"
7
+ },
8
+ {
9
+ "when": "Investigation, diagnosis, planning, or ambiguous design work requiring deep reasoning",
10
+ "use": { "harness": "opencode", "model": "opencode/nemotron-3-ultra-free", "effort": "xhigh" },
11
+ "why": "Maximum reasoning for open-ended investigation and design work"
12
+ },
13
+ {
14
+ "when": "Trivial mechanical edits such as rote renames, formatting sweeps, or simple file gathering",
15
+ "use": { "harness": "opencode", "model": "opencode/nemotron-3-ultra-free", "effort": "low" },
16
+ "why": "Fast, cheap profile for narrow low-ambiguity tasks"
17
+ }
18
+ ],
19
+ "default": [
20
+ { "harness": "opencode", "model": "opencode/nemotron-3-ultra-free", "effort": "medium" }
21
+ ]
22
+ }
@@ -0,0 +1,9 @@
1
+ # Nornir cron schedule — real jobs
2
+ # Format: HH:MM <command>. Started idempotently by bin/nornir-cron-start.sh at
3
+ # every session start. Private (gitignored).
4
+
5
+ 07:00 bin/nornir-job-daily-briefing.sh
6
+ 06:00 bin/nornir-job-observer.sh
7
+ 00:30 bin/nornir-job-skillopt-sleep.sh
8
+ 00:15 bin/nornir-job-memory-housekeeping.sh
9
+ 00:00 bin/nornir-job-git-sync.sh
@@ -0,0 +1,67 @@
1
+ {
2
+ "version": 1,
3
+ "platform": "ymir",
4
+ "notes": "Brokk reads these rules before dispatching an Eindri and passes only concrete --harness/--model/--effort flags to bin/einherjar-spawn.sh. opencode is the primary Ymir harness; pi is the verified secondary harness. Model tokens must match a model opencode/pi can run on this host, or be omitted to use the harness default. effort values: low|medium|high|xhigh|max.",
5
+ "rules": [
6
+ {
7
+ "when": "General implementation, refactoring, or bug fixes in a codebase",
8
+ "use": [
9
+ {
10
+ "harness": "opencode",
11
+ "model": "opencode-go/deepseek-v4.1-flash",
12
+ "effort": "medium"
13
+ }
14
+ ],
15
+ "why": "opencode is the primary Ymir harness; the flash model is the verified build model for implementation work"
16
+ },
17
+ {
18
+ "when": "Deep investigation, diagnosis, planning, or ambiguous design work requiring deep reasoning",
19
+ "use": [
20
+ {
21
+ "harness": "opencode",
22
+ "model": "opencode-go/deepseek-v4.1-flash",
23
+ "effort": "xhigh"
24
+ }
25
+ ],
26
+ "why": "Maximum reasoning for open-ended investigation and design work on the primary harness"
27
+ },
28
+ {
29
+ "when": "Trivial mechanical edits such as rote renames, formatting sweeps, or simple file gathering",
30
+ "use": [
31
+ {
32
+ "harness": "opencode",
33
+ "model": "opencode-go/deepseek-v4.1-flash",
34
+ "effort": "low"
35
+ }
36
+ ],
37
+ "why": "Fast, cheap profile for narrow low-ambiguity tasks"
38
+ },
39
+ {
40
+ "when": "Long-running autonomous or background execution: supervision branches, unattended sweeps, or persistent workers",
41
+ "use": [
42
+ {
43
+ "harness": "pi",
44
+ "effort": "medium"
45
+ }
46
+ ],
47
+ "why": "Pi is the verified secondary Ymir harness for persistent and background workers; omitting model uses Pi's configured default"
48
+ },
49
+ {
50
+ "when": "The Allfather names a model, a family/quant, or a locality (local/online)",
51
+ "use": [
52
+ {
53
+ "resolve": "bin/model-resolve.sh resolve \"<request>\"",
54
+ "then": "pass the returned --harness/--model to bin/einherjar-spawn.sh"
55
+ }
56
+ ],
57
+ "why": "Resolve a friendly request to an exact servable id: local -> pi, online -> opencode. If it returns unresolved (or the requested quant is unavailable, e.g. 'iq2' -> nearest), ASK the Allfather with ask_user_question; never guess. Local runs are serialized by bin/local-model-lock.sh."
58
+ }
59
+ ],
60
+ "default": [
61
+ {
62
+ "harness": "opencode",
63
+ "model": "opencode-go/deepseek-v4.1-flash",
64
+ "effort": "medium"
65
+ }
66
+ ]
67
+ }
@@ -0,0 +1 @@
1
+ opencode
@@ -0,0 +1 @@
1
+ 7500
@@ -0,0 +1,27 @@
1
+ # config/tailscale-sync.example.yaml — TEMPLATE for the Allfather's machine mesh.
2
+ #
3
+ # Copies to the private, gitignored config/tailscale-sync.yaml on install, or
4
+ # run: bin/tailscale-sync.sh init
5
+ # Override the path with YMIR_TAILSCALE_SYNC.
6
+ #
7
+ # Sync is peer-to-peer over Tailscale (rsync over ssh, addressed by MagicDNS).
8
+ # There is no central server and no relay unless the Allfather adds one.
9
+
10
+ machine: zerwiz
11
+
12
+ # The allowlist: only these tailnet hosts may be synced with. Use the MagicDNS
13
+ # name (e.g. `ymir-desktop`) or the tailnet IP.
14
+ peers:
15
+ - host: omarchy-1
16
+ - host: zerwizserver
17
+
18
+ # What may move. Paths are on both ends; ~ expands on each machine.
19
+ paths:
20
+ - ~/.pi/agent/models.json
21
+ - ~/.pi/agent/models-store.json
22
+ - ~/.pi/agent/settings.json
23
+ - ~/.pi/agent/trust.json
24
+
25
+ # auth.json holds live credentials. Leave false unless the Allfather trusts
26
+ # every listed peer to hold them; Tailscale encrypts the wire, not the trust.
27
+ include_auth: false
@@ -0,0 +1,6 @@
1
+ {
2
+ "port": 80,
3
+ "baseURL": "/files",
4
+ "root": "/srv",
5
+ "address": "0.0.0.0"
6
+ }
@@ -0,0 +1,11 @@
1
+ # SKRYMIR — Web File Browser Config
2
+
3
+ Web-based drive interface for users to view, upload, and edit workspace files.
4
+
5
+ ## Planned Files
6
+ - `.filebrowser.json` — root config mapping `/files` route (exists)
7
+ - `filebrowser.db` — user auth, roles, scoped permissions (created at runtime)
8
+
9
+ ## Scoping
10
+ - `./svartalfaheim` mounted at `/srv/realms`
11
+ - `./midgard` mounted at `/srv/shared`
@@ -0,0 +1,12 @@
1
+ # BIFROST — Reverse Proxy & Gateway
2
+
3
+ HTTP routing, external traffic ingress, WebSocket tunneling, and authentication guard.
4
+
5
+ ## Planned Files
6
+ - `nginx.conf` — routes UI, WebSocket streams, webhook listeners
7
+
8
+ ## Routes
9
+ - `/` → Hlidskjalf portal
10
+ - `/files/` → Skrymir file browser
11
+ - `/webhooks/github` → Mjollnir issue listener
12
+ - `/oauth2/` → Heimdall GitHub OAuth
@@ -0,0 +1,15 @@
1
+ # HEIMDALL & MJOLLNIR — GitHub Integration
2
+
3
+ Zero-trust GitHub CI/CD, webhook security, and autonomous Issue-to-PR pipeline.
4
+
5
+ ## Webhooks
6
+ - `webhooks/issue_listener.ts` — receives `issues.opened` events, verifies HMAC
7
+
8
+ ## Workflows
9
+ - `workflows/deploy-staging.yml`
10
+ - `workflows/deploy-production.yml`
11
+
12
+ ## Rules
13
+ - Webhooks verified via HMAC signature
14
+ - Secrets injected via `gh secret set` — never committed
15
+ - Mjollnir never force-merges
File without changes
File without changes