@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,79 @@
1
+ #!/usr/bin/env bash
2
+ # saga-sessionstart-run.sh - session-open entry point for run-tier harnesses.
3
+ #
4
+ # Sága's runner. A harness whose session-open adapter can RUN a command invokes
5
+ # this; it decides from the session-open source whether the open needs the full
6
+ # digest, a context re-emit, or a short nudge. Ported from the upstream agent-distro reference for plan 29.
7
+ #
8
+ # Usage: saga-sessionstart-run.sh [--source <source>] [--pi-prerequisite]
9
+ # --source startup|new|clear|compact|resume|reload|fork. When omitted it is
10
+ # read from a Claude/Codex-shaped JSON hook payload on stdin.
11
+ # --pi-prerequisite Pi extension mode: an intentional stand-down exits 3 so
12
+ # provider preflight can distinguish it from an eligible attempt
13
+ # that settled without output.
14
+ #
15
+ # Every ordinary transport path exits 0: a failed session start must reach the
16
+ # agent as digest text it can act on, never as a refusal to open the session.
17
+
18
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
+ ROOT="${BROKK_ROOT_OVERRIDE:-$(cd "$SCRIPT_DIR/.." && pwd)}"
20
+ BROKK_HOME="${BROKK_HOME:-$ROOT}"
21
+ STATE="${BROKK_STATE_OVERRIDE:-$BROKK_HOME/state}"
22
+ COMPLETION_FILE="$STATE/.session-start-complete"
23
+
24
+ SOURCE=""
25
+ PI_PREREQUISITE=0
26
+ while [ $# -gt 0 ]; do
27
+ case "$1" in
28
+ --source) SOURCE=${2:-}; if [ $# -ge 2 ]; then shift 2; else shift; fi ;;
29
+ --pi-prerequisite) PI_PREREQUISITE=1; shift ;;
30
+ *) shift ;;
31
+ esac
32
+ done
33
+
34
+ if [ -z "$SOURCE" ] && [ ! -t 0 ]; then
35
+ payload=$(cat 2>/dev/null || true)
36
+ case "$payload" in
37
+ *'"source":"startup"'*|*'"source": "startup"'*) SOURCE=startup ;;
38
+ *'"source":"clear"'*|*'"source": "clear"'*) SOURCE=clear ;;
39
+ *'"source":"compact"'*|*'"source": "compact"'*) SOURCE=compact ;;
40
+ *'"source":"resume"'*|*'"source": "resume"'*) SOURCE=resume ;;
41
+ *'"source":"fork"'*|*'"source": "fork"'*) SOURCE=fork ;;
42
+ *'"source":"new"'*|*'"source": "new"'*) SOURCE=new ;;
43
+ esac
44
+ fi
45
+ SOURCE="${SOURCE:-startup}"
46
+
47
+ # Pi prerequisite eligibility: this build always considers the primary eligible.
48
+ # A deployment that must stand down sets BROKK_SESSIONSTART_INELIGIBLE=1.
49
+ if [ "$PI_PREREQUISITE" = "1" ] && [ "${BROKK_SESSIONSTART_INELIGIBLE:-0}" = "1" ]; then
50
+ exit 3
51
+ fi
52
+
53
+ mkdir -p "$STATE"
54
+
55
+ case "$SOURCE" in
56
+ startup|new)
57
+ "$SCRIPT_DIR/saga-session-start.sh"
58
+ : >"$COMPLETION_FILE"
59
+ ;;
60
+ clear|compact)
61
+ if [ -f "$COMPLETION_FILE" ]; then
62
+ printf 'CONTEXT RE-EMIT (source=%s)\n\n' "$SOURCE"
63
+ printf 'Session-start context was already taken this lock. Re-read data/operator.md,\n'
64
+ printf 'data/projects.md, and data/learnings.md only if this turn needs them.\n'
65
+ else
66
+ "$SCRIPT_DIR/saga-session-start.sh"
67
+ : >"$COMPLETION_FILE"
68
+ fi
69
+ ;;
70
+ resume|reload|fork)
71
+ printf 'Run `%s` exactly once now, before executing any other instructions.\n' "bash $SCRIPT_DIR/saga-session-start.sh"
72
+ ;;
73
+ *)
74
+ "$SCRIPT_DIR/saga-session-start.sh"
75
+ : >"$COMPLETION_FILE"
76
+ ;;
77
+ esac
78
+
79
+ exit 0
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env bash
2
+ # saga-wake-drain.sh - present durable Brokk wakes.
3
+ #
4
+ # Sága sees the queue. This drains the durable wake queue written by the watcher
5
+ # and prints each record; records stay durable until acknowledged. Ported/trimmed
6
+ # from the upstream wake-drain contract for plan 29.
7
+ set -u
8
+
9
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
+ ROOT="${BROKK_ROOT_OVERRIDE:-$(cd "$SCRIPT_DIR/.." && pwd)}"
11
+ BROKK_HOME="${BROKK_HOME:-$ROOT}"
12
+ STATE="${BROKK_STATE_OVERRIDE:-$BROKK_HOME/state}"
13
+
14
+ mkdir -p "$STATE"
15
+ QUEUE="$STATE/.wake-queue"
16
+ # The FM runner's own durable queue (its published check-wakes) lives under the
17
+ # .agents home, not the main state. The watcher hollers on BOTH doors; a drain
18
+ # that reads only one lets strikes hide in the other. Combine them here.
19
+ FMQ="$SCRIPT_DIR/../.agents/state/.wake-queue"
20
+ if [ -s "$FMQ" ]; then
21
+ printf 'FM wake queue: %s pending (fm-queued wakes below)\n' "$(wc -l <"$FMQ" | tr -d '[:space:]')"
22
+ while IFS= read -r line; do
23
+ [ -n "$line" ] && printf 'WAKE %s\n' "$line"
24
+ done <"$FMQ"
25
+ printf 'FM_ACK_REQUIRED: acknowledge handled fm wakes to drop them from the fm queue\n'
26
+ fi
27
+
28
+ if [ ! -s "$QUEUE" ]; then
29
+ printf 'wake queue: 0 pending\n'
30
+ else
31
+ count=$(wc -l <"$QUEUE" | tr -d '[:space:]')
32
+ printf 'wake queue: %s pending\n' "${count:-0}"
33
+ while IFS= read -r line; do
34
+ [ -n "$line" ] && printf 'WAKE %s\n' "$line"
35
+ done <"$QUEUE"
36
+ printf 'WAKE_ACK_REQUIRED: acknowledge handled wakes to drop them from the queue\n'
37
+ fi
38
+
39
+ # Open-decision markers (approval gates) left unhandled.
40
+ decisions=$(find "$STATE" -maxdepth 1 -name '*.decision' 2>/dev/null | wc -l | tr -d '[:space:]')
41
+ printf 'open decisions: %s\n' "${decisions:-0}"
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env bash
2
+ # secret-guard.sh — refuse to commit obvious secrets or private env files.
3
+ #
4
+ # bin/secret-guard.sh # scan the staged change (used as pre-commit)
5
+ # bin/secret-guard.sh --install # wire it into .git/hooks/pre-commit
6
+ # bin/secret-guard.sh --all # scan every tracked file once
7
+ #
8
+ # Exit 1 on any hit, so a commit is blocked before a secret leaves the machine.
9
+ set -u
10
+
11
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
13
+
14
+ PATTERNS='(AKIA[0-9A-Z]{16}|-----BEGIN [A-Z ]*PRIVATE KEY-----|(ghp|gho|ghs|ghr)_[A-Za-z0-9]{36}|github_pat_[A-Za-z0-9_]{20,}|sk-[A-Za-z0-9]{20,}|xox[baprs]-[A-Za-z0-9-]+|AIza[0-9A-Za-z_-]{35}|(CLOUDFLARE_API_TOKEN|OPENCODE_GO_API_KEY|GITHUB_TOKEN|OPENAI_API_KEY|ANTHROPIC_API_KEY)[[:space:]]*=[[:space:]]*[A-Za-z0-9_./+=-]{8,})'
15
+
16
+ # Paths deliberately exempt (test fixtures with fake secret-shaped strings),
17
+ # one glob per line in .secret-guardignore.
18
+ IGNORE="$ROOT/.secret-guardignore"
19
+ is_ignored() {
20
+ [ -r "$IGNORE" ] || return 1
21
+ local p
22
+ while IFS= read -r p; do
23
+ [ -n "$p" ] || continue
24
+ case "$p" in \#*) continue ;; esac
25
+ case "$1" in $p) return 0 ;; esac
26
+ done <"$IGNORE"
27
+ return 1
28
+ }
29
+
30
+ case "${1:-}" in
31
+ -v|-V|--version) printf '1.0.0\n'; exit 0 ;;
32
+ -h|--help) sed -n '2,9p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
33
+ --install)
34
+ hook="$ROOT/.git/hooks/pre-commit"
35
+ mkdir -p "$(dirname "$hook")" || exit 1
36
+ printf '#!/usr/bin/env bash\n"%s/public-guard.sh" "$@" || exit 1\n"%s/docs-guard.sh" "$@" || exit 1\n"%s/private-guard.sh" "$@" || exit 1\nexec "%s/secret-guard.sh" "$@"\n' "$SCRIPT_DIR" "$SCRIPT_DIR" "$SCRIPT_DIR" "$SCRIPT_DIR" >"$hook"
37
+ chmod +x "$hook"
38
+ printf 'secret-guard[1]{action,path}:\n "install","%s"\n' "$hook"
39
+ exit 0 ;;
40
+ esac
41
+
42
+ scan_list() {
43
+ local hit=0 f
44
+ while IFS= read -r f; do
45
+ [ -n "$f" ] || continue
46
+ is_ignored "$f" && continue
47
+ case "$f" in
48
+ .env.local|*/.env.local|*.env.local|.env.realm|*/.env.realm)
49
+ printf 'secret-guard: private env file: %s\n' "$f" >&2; hit=1; continue ;;
50
+ esac
51
+ if git -C "$ROOT" show ":$f" 2>/dev/null | sed 's/AKIAIOSFODNN7EXAMPLE//g' | grep -Eq "$PATTERNS"; then
52
+ printf 'secret-guard: possible secret in %s\n' "$f" >&2; hit=1
53
+ fi
54
+ done
55
+ return "$hit"
56
+ }
57
+
58
+ if [ "${1:-}" = "--all" ]; then
59
+ scan_list < <(git -C "$ROOT" ls-files)
60
+ else
61
+ scan_list < <(git -C "$ROOT" diff --cached --name-only --diff-filter=ACM)
62
+ fi || { printf 'secret-guard: blocked — remove the secret or move it to a .example file\n' >&2; exit 1; }
63
+ exit 0
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env bash
2
+ # sessrumnir-ensure.sh — ensure the Sessrúmnir desktop GUI is present and runnable.
3
+ #
4
+ # **Sessrúmnir** is the seat-hall where the Allfather converses with the
5
+ # machine: a vendored, re-themed fork of the Apache-2.0 **pi-desktop** project
6
+ # (github.com/FaqFirebase/pi-desktop, v0.1.7-alpha) living at apps/sessrumnir.
7
+ # The external engine keeps its product name; the GUI the user sees is
8
+ # Sessrúmnir. Dependencies are never committed — this script installs them on
9
+ # first run, exactly as scripts/electron.sh does for the other desktop apps.
10
+ #
11
+ # Usage:
12
+ # sessrumnir-ensure.sh status
13
+ # sessrumnir-ensure.sh ensure [--install]
14
+ # sessrumnir-ensure.sh install
15
+ # sessrumnir-ensure.sh --version
16
+ #
17
+ # Exit: 0 ready (or made ready), 1 not ready, 2 usage.
18
+ set -u
19
+
20
+ VERSION="1.0.0"
21
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
23
+ APP="$ROOT/apps/sessrumnir"
24
+
25
+ case "${1-}" in -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;; -h|--help|"") sed -n '2,16p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; esac
26
+ CMD="${1-}"; shift || true
27
+ DO_INSTALL=0
28
+ case "$CMD" in ensure) ;; status|install) ;; *) printf 'error: unknown command %s\nhelp: bin/sessrumnir-ensure.sh [status|ensure|install]\n' "$CMD" >&2; exit 2 ;; esac
29
+ while [ $# -gt 0 ]; do case "$1" in --install) DO_INSTALL=1; shift ;; *) shift ;; esac; done
30
+ [ "$CMD" = install ] && DO_INSTALL=1
31
+
32
+ app_dir() { [ -d "$APP" ] && [ -f "$APP/package.json" ]; }
33
+ deps_present() { [ -d "$APP/node_modules" ] && [ -x "$APP/node_modules/.bin/electron" ]; }
34
+ built_present() { [ -f "$APP/out/main/index.js" ]; }
35
+
36
+ status() {
37
+ local dir deps built electron
38
+ if app_dir; then dir="$APP"; else dir="absent"; fi
39
+ if deps_present; then deps="yes"; else deps="no"; fi
40
+ if built_present; then built="yes"; else built="no"; fi
41
+ if [ -x "$APP/node_modules/electron/dist/electron" ]; then electron="yes"; else electron="no"; fi
42
+ printf 'sessrumnir[1]{dir,deps,built,electron}:\n'
43
+ printf ' "%s","%s","%s","%s"\n' "$dir" "$deps" "$built" "$electron"
44
+ [ "$dir" = "absent" ] || [ "$deps" = "no" ] && return 1
45
+ return 0
46
+ }
47
+
48
+ npm_install() {
49
+ command -v npm >/dev/null 2>&1 || { printf 'error: npm not found — cannot install Sessrúmnir deps\nhelp: install node/npm\n' >&2; return 1; }
50
+ printf 'sessrumnir: installing dependencies (first run)…\n' >&2
51
+ ( cd "$APP" && npm install ) >/dev/null 2>&1 || return 1
52
+ }
53
+
54
+ # npm 11+ gates postinstall scripts (allowScripts), so Electron's binary is
55
+ # often never downloaded even though the package installed. Heal that here —
56
+ # the same remedy scripts/electron.sh uses: run the package's own postinstall,
57
+ # then extract from the already-cached zip and write path.txt.
58
+ ensure_electron_binary() {
59
+ local bin="$APP/node_modules/electron/dist/electron"
60
+ [ -x "$bin" ] && return 0
61
+ [ -d "$APP/node_modules/electron" ] || return 0
62
+ if [ -f "$APP/node_modules/electron/install.js" ]; then
63
+ ( cd "$APP" && node node_modules/electron/install.js ) >/dev/null 2>&1 || true
64
+ fi
65
+ [ -x "$bin" ] && return 0
66
+ local zip
67
+ zip="$(ls "$HOME"/.cache/electron/*/electron-v*-linux-*.zip 2>/dev/null | head -1)"
68
+ if [ -n "$zip" ] && command -v unzip >/dev/null 2>&1; then
69
+ mkdir -p "$APP/node_modules/electron/dist"
70
+ unzip -q -o "$zip" -d "$APP/node_modules/electron/dist" >/dev/null 2>&1 && \
71
+ printf 'electron' >"$APP/node_modules/electron/path.txt"
72
+ fi
73
+ [ -x "$bin" ]
74
+ }
75
+
76
+ build_app() {
77
+ printf 'sessrumnir: building the app (npm run build)…\n' >&2
78
+ ( cd "$APP" && npm run build ) >/dev/null 2>&1 || return 1
79
+ }
80
+
81
+ case "$CMD" in
82
+ status) status; exit $? ;;
83
+ install)
84
+ npm_install || { printf 'error: npm install failed — see apps/sessrumnir\n' >&2; exit 1; }
85
+ ensure_electron_binary || { printf 'error: Electron binary missing — run: cd apps/sessrumnir && node node_modules/electron/install.js\n' >&2; exit 1; }
86
+ build_app || { printf 'error: build failed — run: cd apps/sessrumnir && npm run build\n' >&2; exit 1; }
87
+ status; exit $? ;;
88
+ ensure)
89
+ if status >/dev/null 2>&1; then status; exit 0; fi
90
+ if [ "$DO_INSTALL" = 1 ]; then
91
+ npm_install || true
92
+ ensure_electron_binary || true
93
+ [ "$built_present" ] || build_app || true
94
+ status
95
+ exit $?
96
+ fi
97
+ status
98
+ printf 'sessrumnir: not ready — run `bin/sessrumnir-ensure.sh install`\n' >&2
99
+ exit 1 ;;
100
+ esac
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env bash
2
+ # sessrumnir-sync.sh — pull a new pi-desktop release into the Sessrúmnir fork
3
+ # without losing the Ymir delta. The law: upstream owns everything except the
4
+ # Ymir-owned files; the branding rides on top and is re-applied by a true
5
+ # 3-way git merge, never by clobbering.
6
+ #
7
+ # bin/sessrumnir-sync.sh # sync to the version pinned in fork/PIN
8
+ # bin/sessrumnir-sync.sh <tag-or-commit> # sync to an explicit upstream ref
9
+ # bin/sessrumnir-sync.sh --check [<ref>] # dry-run: what would change (no writes)
10
+ # bin/sessrumnir-sync.sh --regen <ref> # after hand-resolving conflicts: renumber PIN,
11
+ # # regenerate mods.patch, run the gate
12
+ #
13
+ # How a sync works (the fork-rebase):
14
+ # base = pristine upstream tree at PIN (what the fork was cut from)
15
+ # ours = the branded fork as it sits now (base + Ymir delta)
16
+ # theirs = pristine upstream tree at <ref> (whatever the Allfather pulls)
17
+ # git merge base←ours + base←theirs → a true 3-way merge. Conflicts are
18
+ # left in the working tree for Brokk to resolve, never auto-resolved, never
19
+ # half-applied. Bare changes from upstream land; our branding survives where
20
+ # upstream did not touch the same lines; collisions are surfaced as markers.
21
+ #
22
+ # Exits 0 on a clean, gated sync; 2 on merge conflicts left for the operator;
23
+ # 1 on any hard failure.
24
+ set -euo pipefail
25
+
26
+ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
27
+ APP="$ROOT/apps/sessrumnir"
28
+ FORK="$APP/fork"
29
+ UPSTREAM_REPO="${SESSRUMNIR_UPSTREAM:-https://github.com/zerwiz/pi-desktop.git}"
30
+ OWNED_JSON="$FORK/owned.json"
31
+ MODS_PATCH="$FORK/mods.patch"
32
+ PIN_FILE="$FORK/PIN"
33
+
34
+ MODE="sync"
35
+ while [[ $# -gt 0 ]]; do
36
+ case "$1" in
37
+ --check) MODE="check"; shift ;;
38
+ --regen) MODE="regen"; shift ;;
39
+ *) break ;;
40
+ esac
41
+ done
42
+ TARGET="${1:-}"
43
+
44
+ fail() { echo "✗ $*" >&2; exit 1; }
45
+ step() { printf '\n▸ %s\n' "$*"; }
46
+
47
+ # ─── Pin reading ──────────────────────────────────────────────────────────────
48
+ read_pin() {
49
+ [[ -f "$PIN_FILE" ]] || fail "no PIN at $PIN_FILE — a full sync never happened yet"
50
+ local line hash
51
+ while IFS= read -r line; do
52
+ hash="${line%%#*}"
53
+ hash="${hash// /}"
54
+ [[ "$hash" =~ ^[0-9a-f]{7,40}$ ]] && { echo "$hash"; return; }
55
+ done < "$PIN_FILE"
56
+ fail "PIN file at $PIN_FILE holds no commit hash"
57
+ }
58
+
59
+ # ─── Named sets from owned.json ───────────────────────────────────────────────
60
+ [[ -f "$OWNED_JSON" ]] || fail "owned.json missing — the fork contract is gone ($OWNED_JSON)"
61
+ OWNED_FILES=()
62
+ while IFS= read -r f; do OWNED_FILES+=("$f"); done < <(jq -r '.files[]' "$OWNED_JSON" 2>/dev/null || fail "owned.json unreadable — is jq installed?")
63
+ GENERATED_PATHS=()
64
+ while IFS= read -r f; do GENERATED_PATHS+=("$f"); done < <(jq -r '.generated[]' "$OWNED_JSON" 2>/dev/null)
65
+
66
+ step "Sessrúmnir fork sync ($MODE)"
67
+ echo " upstream : $UPSTREAM_REPO"
68
+ echo " target : ${TARGET:-$(read_pin)}"
69
+
70
+ # ─── Fetch upstream ───────────────────────────────────────────────────────────
71
+ SCRATCH="$(mktemp -d)"
72
+ trap 'rm -rf "$SCRATCH"' EXIT
73
+ step "cloning upstream into $SCRATCH/up"
74
+ git clone "$UPSTREAM_REPO" "$SCRATCH/up" >/dev/null 2>&1 || fail "clone failed for $UPSTREAM_REPO"
75
+
76
+ resolve_ref() { # <ref-or-empty> -> commit hash
77
+ local ref="${1:-}"; ref="${ref:-HEAD}"
78
+ ( cd "$SCRATCH/up" && git rev-parse --verify "$ref^{commit}" ) 2>/dev/null \
79
+ || fail "ref not found upstream: $ref"
80
+ }
81
+
82
+ THEIRS_COMMIT="$(resolve_ref "$TARGET")"
83
+ THEIRS_SHORT="${THEIRS_COMMIT:0:10}"
84
+ echo " upstream HEAD: $THEIRS_SHORT ($(cd "$SCRATCH/up" && git log -1 --format=%s "$THEIRS_COMMIT"))"
85
+
86
+ # ─── Materialise the three trees ──────────────────────────────────────────────
87
+ pin_commit="$(read_pin 2>/dev/null || echo "")"
88
+ BASE_COMMIT="$pin_commit"
89
+ if [[ -z "$BASE_COMMIT" ]]; then
90
+ echo " (no PIN yet — first sync; base := empty tree, every upstream file arrives)"
91
+ IS_FIRST_SYNC=1
92
+ BASE_COMMIT=""
93
+ fi
94
+
95
+ checkout_tree() { # <dir> <commit-or-empty>
96
+ local dir="$1" commit="$2"
97
+ if [[ -z "$commit" ]]; then
98
+ mkdir -p "$dir"
99
+ else
100
+ git -C "$SCRATCH/up" worktree add --detach "$dir" "$commit" >/dev/null 2>&1 \
101
+ || fail "cannot materialise $commit"
102
+ fi
103
+ }
104
+
105
+ checkout_tree "$SCRATCH/base" "$BASE_COMMIT"
106
+ checkout_tree "$SCRATCH/theirs" "$THEIRS_COMMIT"
107
+ ours=$APP # the branded fork is the working tree itself
108
+
109
+ # ─── Exclude map shared by every copy ─────────────────────────────────────────
110
+ copy_tree() { # <src> <dst> (rsync: refresh files, delete upstream removals)
111
+ local src="$1" dst="$2" ex=()
112
+ for f in "${GENERATED_PATHS[@]}" ".git" "fork"; do ex+=(--exclude="$f"); done
113
+ for f in "${OWNED_FILES[@]}"; do ex+=(--exclude="$f"); done
114
+ rsync -a --delete "${ex[@]}" "$src/" "$dst/"
115
+ }
116
+
117
+ # ─── --check: show what a sync would change ───────────────────────────────────
118
+ if [[ "$MODE" == "check" ]]; then
119
+ step "--check: what a sync to $THEIRS_SHORT would change (no writes)"
120
+ local ex=()
121
+ for f in "${GENERATED_PATHS[@]}" ".git" "fork"; do ex+=(--exclude="$f"); done
122
+ for f in "${OWNED_FILES[@]}"; do ex+=(--exclude="$f"); done
123
+ rsync -a --delete --dry-run "${ex[@]}" "$SCRATCH/theirs/" "$APP/" 2>/dev/null \
124
+ | grep -E "^deleting|^>f" | head -60
125
+ echo
126
+ echo " owned files and fork/ are never touched; upstream deletions are respected;"
127
+ echo " branding rides in fork/mods.patch and is re-merged, not clobbered."
128
+ exit 0
129
+ fi
130
+
131
+ # ─── --regen: after hand-resolving conflicts ──────────────────────────────────
132
+ if [[ "$MODE" == "regen" ]]; then
133
+ [[ -n "$TARGET" ]] || fail "--regen needs the upstream ref you synced to"
134
+ step "regenerating delta from resolved tree (base=$THEIRS_SHORT)"
135
+ # pristine base at target vs current (resolved) app tree, owned files excluded.
136
+ mkdir -p "$SCRATCH/out" && copy_tree "$SCRATCH/theirs" "$SCRATCH/out/base"
137
+ mkdir -p "$SCRATCH/out/app" && copy_tree "$APP" "$SCRATCH/out/app"
138
+ ( cd "$SCRATCH/out" && diff -ruN base app > "$SCRATCH/mods.patch" 2>/dev/null || true )
139
+ [[ -s "$SCRATCH/mods.patch" ]] || fail "no delta between pristine $THEIRS_SHORT and app — nothing vendored?"
140
+ cp "$SCRATCH/mods.patch" "$MODS_PATCH"
141
+ cat > "$PIN_FILE" <<EOF
142
+ # Upstream pi-desktop commit currently vendored into apps/sessrumnir
143
+ $THEIRS_COMMIT # $(cd "$SCRATCH/up" && git log -1 --format=%s "$THEIRS_COMMIT")
144
+ $(cd "$SCRATCH/up" && git describe --tags "$THEIRS_COMMIT" 2>/dev/null || echo "(no tag at $THEIRS_SHORT)")
145
+ EOF
146
+ echo " PIN → $THEIRS_SHORT; mods.patch regenerated ($(wc -l < "$SCRATCH/mods.patch") lines)"
147
+ step "gate: install, typecheck, lint, build"
148
+ ( cd "$APP" && npm install --no-audit --no-fund >/dev/null 2>&1 ) || fail "npm install failed"
149
+ ( cd "$APP" && npm run typecheck 2>&1 | tail -5 ) || fail "typecheck failed"
150
+ ( cd "$APP" && npm run lint 2>&1 | tail -8 ) || fail "lint failed"
151
+ ( cd "$APP" && npm run build 2>&1 | tail -5 ) || fail "build failed"
152
+ echo
153
+ echo "✓ sync sealed — Sessrúmnir now vendors $THEIRS_SHORT"
154
+ echo " next: stage the tree, review, open a PR (human seals merges)."
155
+ exit 0
156
+ fi
157
+
158
+ # ─── Sync: the fork-rebase ────────────────────────────────────────────────────
159
+ step "materialising the three trees"
160
+ checkout_tree "$SCRATCH/ours.tmp" "$BASE_COMMIT" 2>/dev/null || true
161
+ copy_tree "$APP" "$SCRATCH/ours.tmp" # ours = branded fork as it sits (owned files ride along)
162
+
163
+ step "building the merge in a scratch repo"
164
+ MERGE="$SCRATCH/merge"
165
+ git init -q "$MERGE"
166
+ cd "$MERGE"
167
+ git config user.name "Brokk" >/dev/null 2>&1 || true
168
+ git config user.email "brokk@ymir.local" >/dev/null 2>&1 || true
169
+ export GIT_AUTHOR_NAME="Brokk" GIT_AUTHOR_EMAIL="brokk@ymir.local"
170
+ export GIT_COMMITTER_NAME="Brokk" GIT_COMMITTER_EMAIL="brokk@ymir.local"
171
+
172
+ # base commit (pristine upstream at PIN)
173
+ rsync -a --exclude=.git "$SCRATCH/base/" ./
174
+ git add -A -f; BASE_T=$(git write-tree); BASE_C=$(git commit-tree "$BASE_T" -m "base")
175
+ # clean worktree + index for ours (branded fork, owned+fork excluded by design)
176
+ git rm -rf --quiet . 2>/dev/null; git clean -fd >/dev/null 2>&1
177
+ rsync -a --exclude=.git "$SCRATCH/ours.tmp/" ./
178
+ git add -A -f; OURS_T=$(git write-tree); OURS_C=$(git commit-tree "$OURS_T" -p "$BASE_C" -m "ours")
179
+ # clean again for theirs (new upstream)
180
+ git rm -rf --quiet . 2>/dev/null; git clean -fd >/dev/null 2>&1
181
+ rsync -a --exclude=.git "$SCRATCH/theirs/" ./
182
+ git add -A -f; THEIRS_T=$(git write-tree); THEIRS_C=$(git commit-tree "$THEIRS_T" -p "$BASE_C" -m "theirs")
183
+ # branches + merge
184
+ git update-ref refs/heads/ours "$OURS_C"
185
+ git update-ref refs/heads/theirs "$THEIRS_C"
186
+ git symbolic-ref HEAD refs/heads/ours
187
+ git checkout -f ours >/dev/null 2>&1 || true
188
+
189
+ step "merging upstream $THEIRS_SHORT into the branded fork (3-way)"
190
+ git merge --no-commit --no-ff theirs >merge.log 2>&1 || true
191
+ grep -E "CONFLICT|Automatic merge failed" merge.log || true
192
+
193
+ # conflicts?
194
+ CONFLICTED="$(git diff --name-only --diff-filter=U)"
195
+ if [[ -n "$CONFLICTED" ]]; then
196
+ echo
197
+ echo "⚠ merge conflicts — resolving in apps/sessrumnir before sealing:" >&2
198
+ echo "$CONFLICTED" | sed 's/^/ /' >&2
199
+ # lay the merged tree (conflict markers included) into the fork so resolution
200
+ # happens in the real working tree; owned files and fork/ are never touched.
201
+ copy_tree "$MERGE" "$APP"
202
+ echo >&2
203
+ echo " the merged tree with conflict markers is now the working tree under" >&2
204
+ echo " apps/sessrumnir. Branding is ours; upstream-only change is theirs. A" >&2
205
+ echo " deleted file either side re-added by upstream means: decide. Present" >&2
206
+ echo " the changed files and resolve by hand (owned files carry the Ymir text)." >&2
207
+ echo " When done, re-run the merge and seal with:" >&2
208
+ echo ' bin/sessrumnir-sync.sh --regen '"$THEIRS_SHORT" >&2
209
+ exit 2
210
+ fi
211
+
212
+ step "sealing sync (no conflicts)"
213
+ copy_tree "$MERGE" "$APP" # merged tree back into the fork (owned + fork/ excluded separately)
214
+ step "writing PIN"
215
+ cat > "$PIN_FILE" <<EOF
216
+ # Upstream pi-desktop commit currently vendored into apps/sessrumnir
217
+ $THEIRS_COMMIT # $(cd "$SCRATCH/up" && git log -1 --format=%s "$THEIRS_COMMIT")
218
+ $(cd "$SCRATCH/up" && git describe --tags "$THEIRS_COMMIT" 2>/dev/null || echo "(no tag at $THEIRS_SHORT)")
219
+ EOF
220
+ echo " pinned $THEIRS_SHORT"
221
+
222
+ step "regenerating mods.patch (pristine $THEIRS_SHORT → branded fork)"
223
+ mkdir -p "$SCRATCH/out/base" "$SCRATCH/out/app"
224
+ copy_tree "$SCRATCH/theirs" "$SCRATCH/out/base"
225
+ copy_tree "$APP" "$SCRATCH/out/app"
226
+ ( cd "$SCRATCH/out" && diff -ruN base app > "$SCRATCH/mods.patch" 2>/dev/null || true )
227
+ cp "$SCRATCH/mods.patch" "$MODS_PATCH"
228
+
229
+ step "gate: install, typecheck, lint, build"
230
+ ( cd "$APP" && npm install --no-audit --no-fund >/dev/null 2>&1 ) || fail "npm install failed"
231
+ ( cd "$APP" && npm run typecheck 2>&1 | tail -5 ) || fail "typecheck failed"
232
+ ( cd "$APP" && npm run lint 2>&1 | tail -8 ) || fail "lint failed"
233
+ ( cd "$APP" && npm run build 2>&1 | tail -5 ) || fail "build failed"
234
+
235
+ echo
236
+ echo "✓ sync complete — Sessrúmnir now vendors $THEIRS_SHORT"
237
+ echo " next: review the diff, then open a PR (human seals merges)."
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env bash
2
+ # sessrumnir.sh — launch the Sessrúmnir desktop GUI (the seat-hall).
3
+ # Ensures deps + build are present (bin/sessrumnir-ensure.sh), then raises the
4
+ # Electron window via the app's own launcher. Galdr-style TOON.
5
+ #
6
+ # Usage:
7
+ # sessrumnir.sh [start] [path] # launch (deps installed on first run)
8
+ # sessrumnir.sh start ~/my-project # launch with a workspace
9
+ # sessrumnir.sh status
10
+ # sessrumnir.sh stop
11
+ # sessrumnir.sh --version
12
+ set -u
13
+
14
+ VERSION="1.0.0"
15
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
17
+ APP="$ROOT/apps/sessrumnir"
18
+ PID_FILE="$ROOT/state/sessrumnir.pid"
19
+ LOG_FILE="$ROOT/state/sessrumnir.log"
20
+
21
+ case "${1-}" in -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;; -h|--help|"") sed -n '2,12p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; esac
22
+ ACTION="${1:-start}"; shift || true
23
+ WORKSPACE="${1-}"
24
+
25
+ # The launcher spawns Electron as its child; track the real Electron by its
26
+ # command line — the Sessrúmnir user-data-dir is a unique, stable identity.
27
+ view_pids() {
28
+ pgrep -f "electron/dist/electron.*sessrumnir" 2>/dev/null || true
29
+ }
30
+ is_running() { [ -n "$(view_pids)" ]; }
31
+
32
+ # Raise the running window. The desktop-placement rule may have opened it on its
33
+ # own numbered desktop (desktop-place.sh), so a launch from elsewhere would
34
+ # otherwise show nothing — the focus dispatch also switches to where it sits.
35
+ # Omarchy configures Hyprland in Lua, so the dispatch is a Lua expression (the
36
+ # classic `focuswindow class:...` form does not parse).
37
+ focus_window() {
38
+ command -v hyprctl >/dev/null 2>&1 || return 0
39
+ hyprctl dispatch "hl.dsp.focus({window=\"class:^sessrumnir\$\"})" >/dev/null 2>&1 || true
40
+ }
41
+
42
+ case "$ACTION" in
43
+ status)
44
+ if is_running; then
45
+ p="$(view_pids | head -1)"
46
+ printf 'sessrumnir[1]{state,pid}:\n "up",%s\n' "$p"
47
+ else
48
+ printf 'sessrumnir[1]{state,pid}:\n "down",0\n'
49
+ fi
50
+ exit 0 ;;
51
+ stop)
52
+ pids="$(view_pids)"
53
+ if [ -n "$pids" ]; then
54
+ printf '%s\n' "$pids" | while IFS= read -r p; do [ -n "$p" ] && kill "$p" 2>/dev/null || true; done
55
+ printf 'sessrumnir: stopped pid(s)=%s\n' "$(printf '%s' "$pids" | tr '\n' ',' | sed 's/,$//')"
56
+ fi
57
+ rm -f "$PID_FILE"
58
+ printf 'sessrumnir: stopped\n'
59
+ exit 0 ;;
60
+ start) ;;
61
+ *) printf 'error: unknown action %s\nhelp: bin/sessrumnir.sh [start|status|stop]\n' "$ACTION" >&2; exit 2 ;;
62
+ esac
63
+
64
+ if is_running; then
65
+ focus_window
66
+ printf 'sessrumnir[1]{state,pid}:\n "already up",%s\n' "$(view_pids | head -1)"
67
+ exit 0
68
+ fi
69
+
70
+ "$SCRIPT_DIR/sessrumnir-ensure.sh" ensure --install >/dev/null 2>&1 || {
71
+ printf 'error: Sessrúmnir is not ready — run bin/sessrumnir-ensure.sh install\n' >&2
72
+ exit 1
73
+ }
74
+
75
+ mkdir -p "$ROOT/state"
76
+ args=()
77
+ [ -n "$WORKSPACE" ] && args+=("$WORKSPACE")
78
+
79
+ nohup node "$APP/bin/sessrumnir.js" "${args[@]}" >"$LOG_FILE" 2>&1 < /dev/null &
80
+ echo $! >"$PID_FILE"
81
+
82
+ i=0
83
+ for i in $(seq 1 30); do [ -n "$(view_pids)" ] && break; sleep 0.5; done
84
+
85
+ if is_running; then
86
+ focus_window
87
+ printf 'sessrumnir[1]{state,pid}:\n "up",%s\n' "$(view_pids | head -1)"
88
+ else
89
+ printf 'error: Sessrúmnir failed to start; see %s\n' "${LOG_FILE#"$ROOT"/}" >&2
90
+ exit 1
91
+ fi