@zerwiz/ymir 0.1.4 → 0.1.7

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 (865) 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/README.md +74 -0
  27. package/.agents/backend/backends/cmux.sh +649 -0
  28. package/.agents/backend/backends/herdr-eventwait.py +157 -0
  29. package/.agents/backend/backends/herdr-workspace-move.py +114 -0
  30. package/.agents/backend/backends/herdr.sh +3386 -0
  31. package/.agents/backend/backends/orca.sh +290 -0
  32. package/.agents/backend/backends/tmux.sh +357 -0
  33. package/.agents/backend/backends/zellij.sh +700 -0
  34. package/.agents/backend/fm-afk-launch.sh +654 -0
  35. package/.agents/backend/fm-afk-return.sh +241 -0
  36. package/.agents/backend/fm-afk-start.sh +172 -0
  37. package/.agents/backend/fm-arm-command-policy.mjs +960 -0
  38. package/.agents/backend/fm-arm-pretool-check.sh +200 -0
  39. package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
  40. package/.agents/backend/fm-backend.sh +981 -0
  41. package/.agents/backend/fm-backlog-handoff.sh +909 -0
  42. package/.agents/backend/fm-backlog-receive.sh +187 -0
  43. package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
  44. package/.agents/backend/fm-bearings-board.sh +204 -0
  45. package/.agents/backend/fm-bearings-snapshot.sh +546 -0
  46. package/.agents/backend/fm-bootstrap.sh +1568 -0
  47. package/.agents/backend/fm-branch-outcome.sh +203 -0
  48. package/.agents/backend/fm-branch-prompt.sh +101 -0
  49. package/.agents/backend/fm-brief.sh +452 -0
  50. package/.agents/backend/fm-busy-event.sh +234 -0
  51. package/.agents/backend/fm-busy-lib.sh +986 -0
  52. package/.agents/backend/fm-captain-hold.sh +1001 -0
  53. package/.agents/backend/fm-cd-command-policy.mjs +153 -0
  54. package/.agents/backend/fm-cd-pretool-check.sh +190 -0
  55. package/.agents/backend/fm-check-lib.sh +74 -0
  56. package/.agents/backend/fm-check-register.sh +42 -0
  57. package/.agents/backend/fm-check-unregister.sh +52 -0
  58. package/.agents/backend/fm-classify-lib.sh +1770 -0
  59. package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
  60. package/.agents/backend/fm-composer-lib.sh +1416 -0
  61. package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
  62. package/.agents/backend/fm-config-push.sh +254 -0
  63. package/.agents/backend/fm-control-lib.sh +251 -0
  64. package/.agents/backend/fm-control.sh +878 -0
  65. package/.agents/backend/fm-crew-state.sh +625 -0
  66. package/.agents/backend/fm-cursor-lib.sh +243 -0
  67. package/.agents/backend/fm-decision-hold.sh +232 -0
  68. package/.agents/backend/fm-doc-audience-check.sh +269 -0
  69. package/.agents/backend/fm-dod-lib.sh +67 -0
  70. package/.agents/backend/fm-ensure-agents-md.sh +253 -0
  71. package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
  72. package/.agents/backend/fm-extension.mjs +2577 -0
  73. package/.agents/backend/fm-extension.sh +16 -0
  74. package/.agents/backend/fm-ff-lib.sh +420 -0
  75. package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
  76. package/.agents/backend/fm-fleet-sync.sh +458 -0
  77. package/.agents/backend/fm-fleet-view.sh +96 -0
  78. package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
  79. package/.agents/backend/fm-guard.sh +242 -0
  80. package/.agents/backend/fm-harness.sh +195 -0
  81. package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
  82. package/.agents/backend/fm-herdr-lab.sh +346 -0
  83. package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
  84. package/.agents/backend/fm-home-seed.sh +984 -0
  85. package/.agents/backend/fm-home-summary-refresh.sh +255 -0
  86. package/.agents/backend/fm-hook-host-lib.sh +36 -0
  87. package/.agents/backend/fm-inactive-reconcile.sh +531 -0
  88. package/.agents/backend/fm-inbox.sh +399 -0
  89. package/.agents/backend/fm-install-actionlint.sh +84 -0
  90. package/.agents/backend/fm-install-herdr.sh +96 -0
  91. package/.agents/backend/fm-install-shellcheck.sh +84 -0
  92. package/.agents/backend/fm-install-treehouse.sh +95 -0
  93. package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
  94. package/.agents/backend/fm-lease-lib.sh +218 -0
  95. package/.agents/backend/fm-lease.sh +189 -0
  96. package/.agents/backend/fm-line-cap-lib.sh +51 -0
  97. package/.agents/backend/fm-lint-workflows.sh +137 -0
  98. package/.agents/backend/fm-lint.sh +591 -0
  99. package/.agents/backend/fm-lock-lib.sh +104 -0
  100. package/.agents/backend/fm-lock.sh +107 -0
  101. package/.agents/backend/fm-marker-lib.sh +12 -0
  102. package/.agents/backend/fm-merge-local.sh +74 -0
  103. package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
  104. package/.agents/backend/fm-nm-run-lib.sh +124 -0
  105. package/.agents/backend/fm-on.sh +125 -0
  106. package/.agents/backend/fm-operational-input.sh +253 -0
  107. package/.agents/backend/fm-peek.sh +46 -0
  108. package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
  109. package/.agents/backend/fm-pr-check.sh +135 -0
  110. package/.agents/backend/fm-pr-lib.sh +1016 -0
  111. package/.agents/backend/fm-pr-merge.sh +707 -0
  112. package/.agents/backend/fm-pr-poll.sh +110 -0
  113. package/.agents/backend/fm-primary-scope-lib.sh +33 -0
  114. package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
  115. package/.agents/backend/fm-procevent-lavish.sh +628 -0
  116. package/.agents/backend/fm-procevent-lib.sh +892 -0
  117. package/.agents/backend/fm-procevent-quota.sh +290 -0
  118. package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
  119. package/.agents/backend/fm-procevent-when.sh +504 -0
  120. package/.agents/backend/fm-procevent.sh +1466 -0
  121. package/.agents/backend/fm-project-mode.sh +92 -0
  122. package/.agents/backend/fm-project-origin-lib.sh +180 -0
  123. package/.agents/backend/fm-promote.sh +282 -0
  124. package/.agents/backend/fm-public-followup-emit.sh +260 -0
  125. package/.agents/backend/fm-public-followup-lib.sh +398 -0
  126. package/.agents/backend/fm-public-followup.sh +1330 -0
  127. package/.agents/backend/fm-push-transition-lib.sh +168 -0
  128. package/.agents/backend/fm-quota-axi-lib.sh +93 -0
  129. package/.agents/backend/fm-quota-choose.sh +384 -0
  130. package/.agents/backend/fm-remote-delta-read.sh +189 -0
  131. package/.agents/backend/fm-remote-doctor.sh +800 -0
  132. package/.agents/backend/fm-remote-entrypoint.sh +193 -0
  133. package/.agents/backend/fm-remote-file.sh +234 -0
  134. package/.agents/backend/fm-remote-home-provision.sh +259 -0
  135. package/.agents/backend/fm-remote-home-seed.sh +259 -0
  136. package/.agents/backend/fm-remote-inherit-push.sh +90 -0
  137. package/.agents/backend/fm-remote-inherit.sh +179 -0
  138. package/.agents/backend/fm-remote-job-lib.sh +1241 -0
  139. package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
  140. package/.agents/backend/fm-remote-job-worker.sh +1124 -0
  141. package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
  142. package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
  143. package/.agents/backend/fm-review-diff.sh +158 -0
  144. package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
  145. package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
  146. package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
  147. package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
  148. package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
  149. package/.agents/backend/fm-secondmate-report.sh +88 -0
  150. package/.agents/backend/fm-send.sh +1059 -0
  151. package/.agents/backend/fm-session-lock-lib.sh +176 -0
  152. package/.agents/backend/fm-session-start.sh +970 -0
  153. package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
  154. package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
  155. package/.agents/backend/fm-sessionstart-run.sh +145 -0
  156. package/.agents/backend/fm-spawn.sh +3153 -0
  157. package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
  158. package/.agents/backend/fm-startup-memory-budget.sh +94 -0
  159. package/.agents/backend/fm-startup-network.sh +642 -0
  160. package/.agents/backend/fm-stow-cascade.sh +251 -0
  161. package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
  162. package/.agents/backend/fm-supervise-daemon.sh +1732 -0
  163. package/.agents/backend/fm-supervision-instructions.sh +215 -0
  164. package/.agents/backend/fm-supervision-lib.sh +90 -0
  165. package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
  166. package/.agents/backend/fm-tangle-lib.sh +53 -0
  167. package/.agents/backend/fm-task-inbox-lib.sh +402 -0
  168. package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
  169. package/.agents/backend/fm-teardown.sh +2922 -0
  170. package/.agents/backend/fm-test-isolation-proof.sh +588 -0
  171. package/.agents/backend/fm-test-run.sh +2191 -0
  172. package/.agents/backend/fm-timeout-lib.sh +141 -0
  173. package/.agents/backend/fm-timing-lib.sh +179 -0
  174. package/.agents/backend/fm-tmux-lib.sh +291 -0
  175. package/.agents/backend/fm-tool-update-check.sh +898 -0
  176. package/.agents/backend/fm-trace-context-lib.sh +227 -0
  177. package/.agents/backend/fm-transition-lib.sh +103 -0
  178. package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
  179. package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
  180. package/.agents/backend/fm-turnend-guard.sh +432 -0
  181. package/.agents/backend/fm-update.sh +110 -0
  182. package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
  183. package/.agents/backend/fm-voice-client.py +1373 -0
  184. package/.agents/backend/fm-voice-relay.py +1256 -0
  185. package/.agents/backend/fm-wake-drain.sh +592 -0
  186. package/.agents/backend/fm-wake-grant.sh +127 -0
  187. package/.agents/backend/fm-wake-lib.sh +1849 -0
  188. package/.agents/backend/fm-watch-arm.sh +602 -0
  189. package/.agents/backend/fm-watch-checkpoint.sh +109 -0
  190. package/.agents/backend/fm-watch.sh +1962 -0
  191. package/.agents/backend/fm-x-dismiss.sh +116 -0
  192. package/.agents/backend/fm-x-followup.sh +286 -0
  193. package/.agents/backend/fm-x-lib.sh +1000 -0
  194. package/.agents/backend/fm-x-link.sh +234 -0
  195. package/.agents/backend/fm-x-poll.sh +185 -0
  196. package/.agents/backend/fm-x-reply.sh +385 -0
  197. package/.agents/backend/fm_voice_frame.py +166 -0
  198. package/.agents/backend/fm_voice_records.py +574 -0
  199. package/.agents/backend/model-bridge.py +360 -0
  200. package/.agents/backend/opencode-go-bridge.py +30 -0
  201. package/.agents/bus/README.md +12 -0
  202. package/.agents/bus/messages.json +1 -0
  203. package/.agents/config/agents.machine.example.yaml +16 -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 +11 -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/filebrowser/.filebrowser.json +6 -0
  211. package/.agents/filebrowser/README.md +11 -0
  212. package/.agents/gateway/README.md +12 -0
  213. package/.agents/github/README.md +15 -0
  214. package/.agents/github/webhooks/.gitkeep +0 -0
  215. package/.agents/github/workflows/.gitkeep +0 -0
  216. package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
  217. package/.agents/harness/opencode/plugins/package.json +4 -0
  218. package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
  219. package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
  220. package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
  221. package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
  222. package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
  223. package/.agents/memory/README.md +46 -0
  224. package/.agents/memory/runes_audit.md +5 -0
  225. package/.agents/migrations/0001-hodd-layout.sh +38 -0
  226. package/.agents/migrations/0002-a2a-mcp.sh +27 -0
  227. package/.agents/migrations/0003-private-data-separation.sh +121 -0
  228. package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
  229. package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
  230. package/.agents/sandbox/Dockerfile.utgard +19 -0
  231. package/.agents/sandbox/README.md +14 -0
  232. package/.agents/sandbox/utgard.config.json +14 -0
  233. package/.agents/skills/README.md +59 -0
  234. package/.agents/skills/bragi-marketing/README.md +3 -0
  235. package/.agents/skills/bragi-marketing/SKILL.md +82 -0
  236. package/.agents/skills/eindri-homes/README.md +3 -0
  237. package/.agents/skills/eindri-homes/SKILL.md +291 -0
  238. package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
  239. package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
  240. package/.agents/skills/frigg-consent/README.md +3 -0
  241. package/.agents/skills/frigg-consent/SKILL.md +56 -0
  242. package/.agents/skills/galdr-ymirsystem/README.md +3 -0
  243. package/.agents/skills/galdr-ymirsystem/SKILL.md +159 -0
  244. package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
  245. package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
  246. package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
  247. package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
  248. package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
  249. package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
  250. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +736 -0
  251. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
  252. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
  253. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
  254. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
  255. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
  256. package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +539 -0
  257. package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -0
  258. package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
  259. package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
  260. package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +163 -0
  261. package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
  262. package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
  263. package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -0
  264. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
  265. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
  266. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +101 -0
  267. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
  268. package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
  269. package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
  270. package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
  271. package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
  272. package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
  273. package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
  274. package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
  275. package/.agents/skills/galdr-ymirsystem/assets/smidja.md +180 -0
  276. package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
  277. package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
  278. package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
  279. package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +503 -0
  280. package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
  281. package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
  282. package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
  283. package/.agents/skills/gjallarhorn-relay/README.md +3 -0
  284. package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
  285. package/.agents/skills/groa-update/SKILL.md +90 -0
  286. package/.agents/skills/hamr-adapters/README.md +3 -0
  287. package/.agents/skills/hamr-adapters/SKILL.md +123 -0
  288. package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
  289. package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
  290. package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
  291. package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
  292. package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
  293. package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
  294. package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
  295. package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
  296. package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
  297. package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
  298. package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
  299. package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
  300. package/.agents/skills/herdr-panes/README.md +3 -0
  301. package/.agents/skills/herdr-panes/SKILL.md +92 -0
  302. package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
  303. package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
  304. package/.agents/skills/hnoss-design/DESIGN.md +19 -0
  305. package/.agents/skills/hnoss-design/README.md +3 -0
  306. package/.agents/skills/hnoss-design/SKILL.md +83 -0
  307. package/.agents/skills/hvild-afk/README.md +3 -0
  308. package/.agents/skills/hvild-afk/SKILL.md +241 -0
  309. package/.agents/skills/jord-projects/README.md +3 -0
  310. package/.agents/skills/jord-projects/SKILL.md +92 -0
  311. package/.agents/skills/lifecycle/SKILL.md +56 -0
  312. package/.agents/skills/lifecycle/smoke_test.sh +57 -0
  313. package/.agents/skills/lifecycle/start.sh +21 -0
  314. package/.agents/skills/lifecycle/status.sh +35 -0
  315. package/.agents/skills/lifecycle/stop.sh +16 -0
  316. package/.agents/skills/muninn-stow/README.md +3 -0
  317. package/.agents/skills/muninn-stow/SKILL.md +309 -0
  318. package/.agents/skills/no-mistakes/SKILL.md +379 -0
  319. package/.agents/skills/nornir-schedule/README.md +3 -0
  320. package/.agents/skills/nornir-schedule/SKILL.md +25 -0
  321. package/.agents/skills/nornir-schedule/assets/events.md +137 -0
  322. package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
  323. package/.agents/skills/nsr-compliance/README.md +3 -0
  324. package/.agents/skills/nsr-compliance/SKILL.md +29 -0
  325. package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
  326. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
  327. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
  328. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
  329. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
  330. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
  331. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
  332. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
  333. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
  334. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
  335. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
  336. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
  337. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
  338. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
  339. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
  340. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
  341. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
  342. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
  343. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
  344. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
  345. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
  346. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
  347. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
  348. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  349. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
  350. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
  351. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
  352. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
  353. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
  354. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
  355. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
  356. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
  357. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
  358. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
  359. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
  360. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
  361. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
  362. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
  363. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
  364. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
  365. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
  366. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
  367. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
  368. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
  369. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
  370. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
  371. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
  372. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
  373. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
  374. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
  375. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
  376. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
  377. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
  378. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
  379. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
  380. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
  381. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
  382. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
  383. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
  384. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
  385. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
  386. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
  387. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
  388. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
  389. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
  390. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
  391. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
  392. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
  393. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
  394. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
  395. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
  396. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
  397. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
  398. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
  399. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
  400. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
  401. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
  402. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
  403. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
  404. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
  405. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
  406. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
  407. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
  408. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
  409. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
  410. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
  411. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
  412. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
  413. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
  414. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
  415. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
  416. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
  417. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
  418. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
  419. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
  420. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
  421. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
  422. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
  423. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
  424. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
  425. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
  426. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
  427. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
  428. package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
  429. package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
  430. package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
  431. package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
  432. package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
  433. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
  434. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
  435. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
  436. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
  437. package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
  438. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
  439. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
  440. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
  441. package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
  442. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
  443. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
  444. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
  445. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
  446. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
  447. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
  448. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
  449. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  450. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
  451. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
  452. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
  453. package/.agents/skills/pr-ops/README.md +3 -0
  454. package/.agents/skills/pr-ops/SKILL.md +109 -0
  455. package/.agents/skills/ratatoskr-a2a/README.md +3 -0
  456. package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
  457. package/.agents/skills/rules-check-drift/SKILL.md +81 -0
  458. package/.agents/skills/saga-bearings/README.md +3 -0
  459. package/.agents/skills/saga-bearings/SKILL.md +26 -0
  460. package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
  461. package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
  462. package/.agents/skills/saga-bearings/assets/recap.md +56 -0
  463. package/.agents/skills/syn-recovery/README.md +3 -0
  464. package/.agents/skills/syn-recovery/SKILL.md +54 -0
  465. package/.agents/skills/tyr-check/README.md +3 -0
  466. package/.agents/skills/tyr-check/SKILL.md +218 -0
  467. package/.agents/skills/urdh-hold/README.md +3 -0
  468. package/.agents/skills/urdh-hold/SKILL.md +25 -0
  469. package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
  470. package/.agents/skills/urdh-hold/assets/hold.md +54 -0
  471. package/.agents/skills/vor-diagnostics/README.md +3 -0
  472. package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
  473. package/.agents/skills/ymir-host/README.md +3 -0
  474. package/.agents/skills/ymir-host/SKILL.md +35 -0
  475. package/.agents/skills/ymir-host/assets/desktop.md +36 -0
  476. package/.agents/skills/ymir-host/assets/install.md +69 -0
  477. package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
  478. package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
  479. package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
  480. package/.agents/skills/ymir-host/assets/update.md +64 -0
  481. package/.agents/tests/assets/board-render-harness.mjs +117 -0
  482. package/.agents/tests/cmux-test-safety.sh +51 -0
  483. package/.agents/tests/fixtures.sh +291 -0
  484. package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
  485. package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
  486. package/.agents/tests/fm-afk-launch.test.sh +961 -0
  487. package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
  488. package/.agents/tests/fm-afk-return.test.sh +283 -0
  489. package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
  490. package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
  491. package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
  492. package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
  493. package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
  494. package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
  495. package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
  496. package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
  497. package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
  498. package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
  499. package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
  500. package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
  501. package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
  502. package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
  503. package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
  504. package/.agents/tests/fm-backend-orca.test.sh +1357 -0
  505. package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
  506. package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
  507. package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
  508. package/.agents/tests/fm-backend.test.sh +1142 -0
  509. package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
  510. package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
  511. package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
  512. package/.agents/tests/fm-bearings-board.test.sh +414 -0
  513. package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
  514. package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
  515. package/.agents/tests/fm-bootstrap.test.sh +1178 -0
  516. package/.agents/tests/fm-branch-supervision.test.sh +552 -0
  517. package/.agents/tests/fm-brief.test.sh +785 -0
  518. package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
  519. package/.agents/tests/fm-busy-state.test.sh +465 -0
  520. package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
  521. package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
  522. package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
  523. package/.agents/tests/fm-check-unregister.test.sh +198 -0
  524. package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
  525. package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
  526. package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
  527. package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
  528. package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
  529. package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
  530. package/.agents/tests/fm-composer-ghost.test.sh +716 -0
  531. package/.agents/tests/fm-composer-lib.test.sh +666 -0
  532. package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
  533. package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
  534. package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
  535. package/.agents/tests/fm-control.test.sh +910 -0
  536. package/.agents/tests/fm-crew-state.test.sh +1610 -0
  537. package/.agents/tests/fm-cursor-harness.test.sh +404 -0
  538. package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
  539. package/.agents/tests/fm-cursor-primary.test.sh +708 -0
  540. package/.agents/tests/fm-daemon.test.sh +2740 -0
  541. package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
  542. package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
  543. package/.agents/tests/fm-extension-binding.test.sh +2187 -0
  544. package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
  545. package/.agents/tests/fm-fleet-sync.test.sh +721 -0
  546. package/.agents/tests/fm-gate-refuse.test.sh +356 -0
  547. package/.agents/tests/fm-gitignore-config.test.sh +89 -0
  548. package/.agents/tests/fm-gotmp.test.sh +230 -0
  549. package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
  550. package/.agents/tests/fm-grok-harness.test.sh +117 -0
  551. package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
  552. package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
  553. package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
  554. package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
  555. package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
  556. package/.agents/tests/fm-herdr-lab.test.sh +243 -0
  557. package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
  558. package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
  559. package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
  560. package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
  561. package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
  562. package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
  563. package/.agents/tests/fm-kimi-harness.test.sh +687 -0
  564. package/.agents/tests/fm-lint-workflows.test.sh +532 -0
  565. package/.agents/tests/fm-lint.test.sh +1023 -0
  566. package/.agents/tests/fm-muse-harness.test.sh +932 -0
  567. package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
  568. package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
  569. package/.agents/tests/fm-on.test.sh +507 -0
  570. package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
  571. package/.agents/tests/fm-operational-input.test.sh +160 -0
  572. package/.agents/tests/fm-peek-remote.test.sh +110 -0
  573. package/.agents/tests/fm-pending-reply.test.sh +1288 -0
  574. package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
  575. package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
  576. package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
  577. package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
  578. package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
  579. package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
  580. package/.agents/tests/fm-pr-merge.test.sh +2135 -0
  581. package/.agents/tests/fm-procevent-quota.test.sh +225 -0
  582. package/.agents/tests/fm-procevent-when.test.sh +406 -0
  583. package/.agents/tests/fm-procevent.test.sh +1745 -0
  584. package/.agents/tests/fm-project-origin.test.sh +110 -0
  585. package/.agents/tests/fm-public-followup.test.sh +2272 -0
  586. package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
  587. package/.agents/tests/fm-quota-choose.test.sh +626 -0
  588. package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
  589. package/.agents/tests/fm-remote-doctor.test.sh +625 -0
  590. package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
  591. package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
  592. package/.agents/tests/fm-remote-job.test.sh +768 -0
  593. package/.agents/tests/fm-remote-reply.test.sh +520 -0
  594. package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
  595. package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
  596. package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
  597. package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
  598. package/.agents/tests/fm-review-diff.test.sh +176 -0
  599. package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
  600. package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
  601. package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
  602. package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
  603. package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
  604. package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
  605. package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
  606. package/.agents/tests/fm-send-inbox.test.sh +352 -0
  607. package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
  608. package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
  609. package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
  610. package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
  611. package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
  612. package/.agents/tests/fm-send-settle.test.sh +147 -0
  613. package/.agents/tests/fm-send-strict.test.sh +241 -0
  614. package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
  615. package/.agents/tests/fm-session-start.test.sh +2515 -0
  616. package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
  617. package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
  618. package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
  619. package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
  620. package/.agents/tests/fm-spawn-batch.test.sh +148 -0
  621. package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
  622. package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
  623. package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
  624. package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
  625. package/.agents/tests/fm-startup-network.test.sh +712 -0
  626. package/.agents/tests/fm-stow-cascade.test.sh +370 -0
  627. package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
  628. package/.agents/tests/fm-supervision-events.test.sh +156 -0
  629. package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
  630. package/.agents/tests/fm-tangle-guard.test.sh +277 -0
  631. package/.agents/tests/fm-task-delivery.test.sh +420 -0
  632. package/.agents/tests/fm-task-inbox.test.sh +513 -0
  633. package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
  634. package/.agents/tests/fm-teardown.test.sh +2665 -0
  635. package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
  636. package/.agents/tests/fm-test-fixtures.test.sh +132 -0
  637. package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
  638. package/.agents/tests/fm-test-run.test.sh +1196 -0
  639. package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
  640. package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
  641. package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
  642. package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
  643. package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
  644. package/.agents/tests/fm-transition-lib.test.sh +54 -0
  645. package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
  646. package/.agents/tests/fm-update.test.sh +304 -0
  647. package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
  648. package/.agents/tests/fm-voice-relay.test.sh +4741 -0
  649. package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
  650. package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
  651. package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
  652. package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
  653. package/.agents/tests/fm-wake-queue.test.sh +1224 -0
  654. package/.agents/tests/fm-watch-arm.test.sh +821 -0
  655. package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
  656. package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
  657. package/.agents/tests/fm-watch-triage.test.sh +3889 -0
  658. package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
  659. package/.agents/tests/fm-x-mode.test.sh +3042 -0
  660. package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
  661. package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
  662. package/.agents/tests/herdr-test-safety.sh +42 -0
  663. package/.agents/tests/lib.sh +315 -0
  664. package/.agents/tests/remote-herdr-fixture.sh +125 -0
  665. package/.agents/tests/secondmate-helpers.sh +193 -0
  666. package/.agents/tests/smoke.test.sh +93 -0
  667. package/.agents/tests/wake-helpers.sh +338 -0
  668. package/.agents/tests/zellij-test-safety.sh +60 -0
  669. package/.agents/tools/README.md +10 -0
  670. package/.agents/tools/bin/tasks-cli +267 -0
  671. package/.agents/tools/tasks-cli.ts +216 -0
  672. package/AGENTS.md +498 -0
  673. package/CHANGELOG.md +1913 -0
  674. package/LICENSE +1 -1
  675. package/NOTICE +63 -0
  676. package/README.md +114 -60
  677. package/RULES/01-domains.md +51 -0
  678. package/RULES/02-agents.md +78 -0
  679. package/RULES/03-houses.md +61 -0
  680. package/RULES/04-hoard.md +97 -0
  681. package/RULES/05-platforms.md +67 -0
  682. package/RULES/06-append-only.md +108 -0
  683. package/RULES/07-config.md +101 -0
  684. package/RULES/08-delivery-gate.md +75 -0
  685. package/RULES/09-electron.md +58 -0
  686. package/RULES/README.md +22 -0
  687. package/bin/README.md +107 -0
  688. package/bin/a2a-mcp.sh +133 -0
  689. package/bin/a2a-serve.py +103 -0
  690. package/bin/a2a-serve.sh +8 -0
  691. package/bin/a2a-talk.sh +50 -0
  692. package/bin/a2abridge-ensure.sh +108 -0
  693. package/bin/agent-run.sh +43 -0
  694. package/bin/agents-config.sh +256 -0
  695. package/bin/apodex-smoke-test.sh +105 -0
  696. package/bin/bifrost-bridge.sh +131 -0
  697. package/bin/bifrost-ingress.sh +77 -0
  698. package/bin/bootstrap-macos.sh +112 -0
  699. package/bin/bootstrap-windows.ps1 +112 -0
  700. package/bin/branch-guard.sh +64 -0
  701. package/bin/brokk +73 -0
  702. package/bin/brokk-classify-lib.sh +1770 -0
  703. package/bin/brokk-lease-lib.sh +222 -0
  704. package/bin/brokk-lease.sh +193 -0
  705. package/bin/brokk-lint.sh +65 -0
  706. package/bin/brokk-send.sh +51 -0
  707. package/bin/brokk-update.sh +9 -0
  708. package/bin/brokk-wake-grant.sh +127 -0
  709. package/bin/brokk-wake-lib.sh +1849 -0
  710. package/bin/changelog-assemble.sh +154 -0
  711. package/bin/changelog-guard.sh +197 -0
  712. package/bin/crash-sense.sh +173 -0
  713. package/bin/design-check.sh +80 -0
  714. package/bin/design-icon.sh +153 -0
  715. package/bin/desktop-place.sh +224 -0
  716. package/bin/docs-guard.sh +39 -0
  717. package/bin/editor-place.sh +225 -0
  718. package/bin/eindri-acclaim.sh +47 -0
  719. package/bin/eindri-control.sh +28 -0
  720. package/bin/eindri-role.sh +83 -0
  721. package/bin/eindri-seat.sh +83 -0
  722. package/bin/eindri-seen.sh +54 -0
  723. package/bin/eindri-send.sh +15 -0
  724. package/bin/eindri-start.sh +98 -0
  725. package/bin/eindri-watch.sh +57 -0
  726. package/bin/einherjar-spawn.sh +576 -0
  727. package/bin/eir-doctor.sh +158 -0
  728. package/bin/erindi-brief.sh +271 -0
  729. package/bin/feature-inventory.sh +73 -0
  730. package/bin/fleet-apply.sh +81 -0
  731. package/bin/github-deploy.sh +94 -0
  732. package/bin/gjallarhorn-expose.sh +136 -0
  733. package/bin/gjallarhorn-notify.sh +71 -0
  734. package/bin/gjallarhorn-purge.sh +67 -0
  735. package/bin/gjallarhorn-tunnel.sh +85 -0
  736. package/bin/gleipnir-lock-lib.sh +284 -0
  737. package/bin/groa-update.sh +130 -0
  738. package/bin/hall-snapshot.sh +111 -0
  739. package/bin/hamr-harness.sh +246 -0
  740. package/bin/heimdall-ssh-keys.sh +374 -0
  741. package/bin/herdr-agents.py +44 -0
  742. package/bin/herdr-ensure.sh +104 -0
  743. package/bin/herdr-run.sh +452 -0
  744. package/bin/hermes-ensure.sh +88 -0
  745. package/bin/hlidskjalf-agents.sh +172 -0
  746. package/bin/hlidskjalf-usage.sh +196 -0
  747. package/bin/hoard-guard.sh +135 -0
  748. package/bin/hoard-lib.sh +105 -0
  749. package/bin/hodd.sh +102 -0
  750. package/bin/host-sense.sh +199 -0
  751. package/bin/huginn-research-worker.sh +121 -0
  752. package/bin/local-model-lock.sh +70 -0
  753. package/bin/mimir-bridge.py +259 -0
  754. package/bin/mimir-bridge.sh +100 -0
  755. package/bin/mimir-ingest.sh +131 -0
  756. package/bin/mimir-reflect.sh +27 -0
  757. package/bin/mimir.sh +113 -0
  758. package/bin/mjollnir-webhook.sh +72 -0
  759. package/bin/mjollnir.sh +104 -0
  760. package/bin/model-hardware.sh +96 -0
  761. package/bin/model-resolve.sh +160 -0
  762. package/bin/models-detect.sh +178 -0
  763. package/bin/nornir-cron-start.sh +162 -0
  764. package/bin/nornir-job-daily-briefing.sh +191 -0
  765. package/bin/nornir-job-git-sync.sh +152 -0
  766. package/bin/nornir-job-hall-snapshot.sh +28 -0
  767. package/bin/nornir-job-memory-housekeeping.sh +114 -0
  768. package/bin/nornir-job-nsr-compliance.sh +54 -0
  769. package/bin/nornir-job-observer.sh +166 -0
  770. package/bin/nornir-job-skillopt-sleep.sh +76 -0
  771. package/bin/npm-publish.sh +136 -0
  772. package/bin/omarchy-hook-install.sh +60 -0
  773. package/bin/omarchy-install.sh +161 -0
  774. package/bin/omarchy-plugins.sh +187 -0
  775. package/bin/omarchy-sense.sh +162 -0
  776. package/bin/perm-guard.sh +30 -0
  777. package/bin/pi-agent.sh +68 -0
  778. package/bin/pi-ensure.sh +77 -0
  779. package/bin/pi-local.sh +37 -0
  780. package/bin/pi-model-agnostic.sh +71 -0
  781. package/bin/pi-seat.sh +63 -0
  782. package/bin/prereq-ensure.sh +166 -0
  783. package/bin/private-guard.sh +58 -0
  784. package/bin/project-git.sh +69 -0
  785. package/bin/public-guard.sh +71 -0
  786. package/bin/ratatoskr.sh +49 -0
  787. package/bin/realm-lib.sh +32 -0
  788. package/bin/repo-scrub.sh +62 -0
  789. package/bin/rodd-operational-input.sh +250 -0
  790. package/bin/runes-append.sh +198 -0
  791. package/bin/saga-session-start.sh +172 -0
  792. package/bin/saga-sessionstart-run.sh +79 -0
  793. package/bin/saga-wake-drain.sh +41 -0
  794. package/bin/secret-guard.sh +63 -0
  795. package/bin/sessrumnir-ensure.sh +100 -0
  796. package/bin/sessrumnir-sync.sh +237 -0
  797. package/bin/sessrumnir.sh +104 -0
  798. package/bin/skillopt-setup.sh +76 -0
  799. package/bin/skuld-branch-outcome.sh +203 -0
  800. package/bin/skuld-branch-prompt.sh +101 -0
  801. package/bin/smidja-bootstrap.sh +94 -0
  802. package/bin/smidja-observe.sh +86 -0
  803. package/bin/syn-arm-pretool-check.sh +57 -0
  804. package/bin/syn-asset-pretool-check.sh +89 -0
  805. package/bin/syn-cd-pretool-check.sh +28 -0
  806. package/bin/syn-guard-pretool-check.sh +83 -0
  807. package/bin/syn-spawn-pretool-check.sh +58 -0
  808. package/bin/syn-turnend-guard.sh +36 -0
  809. package/bin/syn-watch-arm.sh +99 -0
  810. package/bin/tailscale-sync.sh +203 -0
  811. package/bin/telegram-bot.sh +82 -0
  812. package/bin/toolchain.sh +74 -0
  813. package/bin/ui-truth-check.sh +75 -0
  814. package/bin/utgard.sh +111 -0
  815. package/bin/valhalla.sh +115 -0
  816. package/bin/valknut-load.sh +298 -0
  817. package/bin/vor-crew-state.sh +124 -0
  818. package/bin/wedge-notify.sh +60 -0
  819. package/bin/workspace-provision.sh +80 -0
  820. package/bin/workspace-rag.sh +163 -0
  821. package/bin/wyrd-db.sh +47 -0
  822. package/bin/yggdrasil.sh +152 -0
  823. package/bin/ymir-edit.sh +145 -0
  824. package/bin/ymir-install.sh +806 -0
  825. package/bin/ymir-invite.sh +93 -0
  826. package/bin/ymir-isolation.sh +88 -0
  827. package/bin/ymir-migrate.sh +61 -0
  828. package/bin/ymir-plan.sh +356 -0
  829. package/bin/ymir-platform.sh +348 -0
  830. package/bin/ymir-say.sh +110 -0
  831. package/bin/ymir-setup-auth.sh +119 -0
  832. package/bin/ymir-validate.sh +193 -0
  833. package/bin/ymir.js +74 -16
  834. package/docs/Architecture.md +339 -0
  835. package/docs/design.md +351 -0
  836. package/docs/installations/README.md +63 -0
  837. package/docs/installations/ymir-home.md +93 -0
  838. package/docs/integration.md +105 -0
  839. package/docs/lore.md +1060 -0
  840. package/docs/research/agent-harnesses.md +290 -0
  841. package/docs/runbooks/README.md +19 -0
  842. package/docs/runbooks/a2a.md +91 -0
  843. package/docs/runbooks/agent-permissions.md +99 -0
  844. package/docs/runbooks/agents.md +57 -0
  845. package/docs/runbooks/models.md +69 -0
  846. package/docs/runbooks/realm-onboarding.md +60 -0
  847. package/docs/runbooks/secrets-and-hoard.md +60 -0
  848. package/docs/runbooks/updates-and-migrations.md +110 -0
  849. package/docs/runbooks/worktrees-isolation.md +72 -0
  850. package/docs/session-start.md +105 -0
  851. package/docs/skillopt-integration.md +321 -0
  852. package/docs/sync-system.md +66 -0
  853. package/docs/workspaces.md +104 -0
  854. package/docs/ymir-rut.md +260 -0
  855. package/package.json +54 -14
  856. package/packaging/build.sh +74 -0
  857. package/packaging/macos/Ymir Installer.command +43 -0
  858. package/packaging/windows/ymir-setup.nsi +74 -0
  859. package/scripts/README.md +22 -0
  860. package/scripts/electron.sh +269 -0
  861. package/scripts/lower.sh +34 -0
  862. package/scripts/raise.sh +42 -0
  863. package/scripts/start.sh +217 -0
  864. package/scripts/stop.sh +113 -0
  865. package/install.sh +0 -35
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env bash
2
+ # nornir-job-nsr-compliance.sh — the NorthStar compliance round, nightly.
3
+ #
4
+ # Runs the deterministic NSR gates (.compliance/gates/check_*.sh — danger,
5
+ # env, paths, platform, wiring) and carves one Rune with the verdict. A FAIL
6
+ # is reported loudly in the Rune message — the morning briefing reads the
7
+ # ledger, so a broken door is seen at sunrise, not found by accident.
8
+ #
9
+ # Stateless: run gates → write nothing but state/last + the Rune → exit.
10
+ set -u
11
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+ ROOT="${BROKK_ROOT_OVERRIDE:-$(cd "$SCRIPT_DIR/.." && pwd)}"
13
+
14
+ # The roots that live OUTSIDE the code tree: this machine's records and the
15
+ # runtime state belong to the home the operator chose at installation, never in
16
+ # the tree — a packaged install replaces its tree on upgrade (Rule 04).
17
+ if [ -z "${YMIR_HOARD_LIB_LOADED:-}" ]; then
18
+ _yr="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
+ for _yc in "$_yr/hoard-lib.sh" "$(dirname "$_yr")/bin/hoard-lib.sh"; do
20
+ [ -r "$_yc" ] && { . "$_yc"; YMIR_HOARD_LIB_LOADED=1; break; }
21
+ done
22
+ unset _yr _yc
23
+ fi
24
+ hoard_state_dir YMIR_STATE_DIR
25
+ hoard_data_dir YMIR_DATA_DIR
26
+ STATE="${BROKK_STATE_OVERRIDE:-$YMIR_STATE_DIR}"
27
+
28
+ GATES_DIR="$ROOT/.compliance/gates"
29
+ [ -d "$GATES_DIR" ] || { printf 'error: no NSR gates at %s\n' "$GATES_DIR"; exit 1; }
30
+
31
+ passed=0; failed=0; failed_names=""
32
+ for g in "$GATES_DIR"/check_*.sh; do
33
+ name=$(basename "$g" .sh)
34
+ if bash "$g" >/dev/null 2>&1; then
35
+ passed=$((passed+1))
36
+ else
37
+ failed=$((failed+1)); failed_names="$failed_names $name"
38
+ fi
39
+ done
40
+
41
+ printf 'nsr-compliance: gates=%d passed=%d failed=%d%s\n' \
42
+ "$((passed+failed))" "$passed" "$failed" "$failed_names"
43
+
44
+ # shellcheck source=bin/runes-append.sh
45
+ . "$ROOT/bin/runes-append.sh"
46
+ if [ "$failed" = 0 ]; then
47
+ runes_append "nornir" "nsr.compliance" --message "NSR compliance: $passed/$passed gates passed" >/dev/null \
48
+ || printf 'nsr-compliance: rune append failed (non-fatal)\n'
49
+ exit 0
50
+ else
51
+ runes_append "nornir" "nsr.compliance.failed" --message "NSR compliance FAIL: gates $failed_names FAILED — mend at sunrise" >/dev/null \
52
+ || printf 'nsr-compliance: rune append failed (non-fatal)\n'
53
+ exit 1
54
+ fi
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env bash
2
+ # nornir-job-observer.sh - Huginn, the raven of observation.
3
+ #
4
+ # Read-only observation of the Ymir runtime into Runes. This job touches nothing
5
+ # outside Ymir; every source below lives inside the repo (or the external worktree
6
+ # root, which is read-only):
7
+ # docs/masterplan.md open forge orders
8
+ # .agents/agents/*.md the agent roster
9
+ # .agents/memory/well/ the well (episodes)
10
+ # workspace/memory/runes_audit.md the ledger
11
+ # apps/smidja/smidja_data/smidja.db Smíðja runs (read-only SQLite URI)
12
+ # ~/.treehouse external worktrees (read-only)
13
+ #
14
+ # CONTRACT: this job NEVER writes anywhere but state/observer.log and the Runes
15
+ # ledger. It only reads manifests, SQLite databases in read-only mode, and small
16
+ # state files. Every observation is carved as a Runes line and echoed to
17
+ # state/observer.log. When a source is absent the job still carves an ABSENT
18
+ # line — silence is never mistaken for health.
19
+ #
20
+ # Environment:
21
+ # BROKK_YGGDRASIL_ROOT external worktree root to observe (default ~/.treehouse)
22
+ set -u
23
+
24
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
+ ROOT="${BROKK_ROOT_OVERRIDE:-$(cd "$SCRIPT_DIR/.." && pwd)}"
26
+ BROKK_HOME="${BROKK_HOME:-$ROOT}"
27
+ STATE="${BROKK_STATE_OVERRIDE:-$BROKK_HOME/state}"
28
+ # shellcheck source=bin/runes-append.sh
29
+ . "$SCRIPT_DIR/runes-append.sh"
30
+
31
+ WORKTREE_ROOT="${BROKK_YGGDRASIL_ROOT:-$HOME/.treehouse}"
32
+ YMIR_HOME="${YMIR_HOME:-$HOME/Documents/Ymir}"
33
+ SMIDJA_DB="${YMIR_HOME:+$YMIR_HOME/smidja/smidja.db}"
34
+ [ -z "${SMIDJA_DB:-}" ] || [ ! -f "$SMIDJA_DB" ] && SMIDJA_DB="$ROOT/apps/smidja/smidja_data/smidja.db"
35
+ MASTERPLAN="$ROOT/docs/masterplan.md"
36
+ WELL_DIR="$ROOT/.agents/memory/well"
37
+ AGENTS_DIR="$ROOT/.agents/agents"
38
+ RUNES_LEDGER="${YMIR_HOME:+$YMIR_HOME/memory/runes_audit.md}"
39
+ [ -z "${RUNES_LEDGER:-}" ] || [ ! -r "$RUNES_LEDGER" ] && RUNES_LEDGER="$ROOT/workspace/memory/runes_audit.md"
40
+ OBS_LOG="$STATE/observer.log"
41
+ OBS_LAST="$STATE/observer.last"
42
+
43
+ mkdir -p "$STATE"
44
+ LOG_TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
45
+
46
+ observe() { # <source> <message>
47
+ local source=$1 message=$2
48
+ printf '%s observer %s: %s\n' "$LOG_TS" "$source" "$message" >>"$OBS_LOG"
49
+ runes_append "huginn" "observer.$source" --message "$message" >/dev/null 2>&1 || true
50
+ }
51
+
52
+ printf 'OBSERVER - %s\n' "$LOG_TS"
53
+ printf 'root=%s worktrees=%s\n' "$ROOT" "$WORKTREE_ROOT"
54
+
55
+ # ---- ymir: forge orders (masterplan) -------------------------------------
56
+ if [ -r "$MASTERPLAN" ]; then
57
+ open=$(grep -cE '^- Status: ADDED' "$MASTERPLAN" 2>/dev/null | tr -d '[:space:]')
58
+ working=$(grep -cE '^- Status:.*WORKING' "$MASTERPLAN" 2>/dev/null | tr -d '[:space:]')
59
+ done=$(grep -cE '\. \+ <[0-9]{4}' "$MASTERPLAN" 2>/dev/null | tr -d '[:space:]')
60
+ msg="masterplan readable; open=${open:-0} working=${working:-0} completed_notes=${done:-0}"
61
+ printf 'ymir.orders open=%s working=%s\n' "${open:-0}" "${working:-0}"
62
+ else
63
+ msg="masterplan ABSENT at $MASTERPLAN"
64
+ printf 'ymir.orders ABSENT\n'
65
+ fi
66
+ observe "ymir.orders" "$msg"
67
+
68
+ # ---- ymir: agent roster ---------------------------------------------------
69
+ if [ -d "$AGENTS_DIR" ]; then
70
+ n=$(find "$AGENTS_DIR" -maxdepth 1 -name '*.md' 2>/dev/null | wc -l | tr -d '[:space:]')
71
+ msg="agent roster readable; agents=${n:-0}"
72
+ printf 'ymir.agents count=%s\n' "${n:-0}"
73
+ else
74
+ msg="agent roster ABSENT at $AGENTS_DIR"
75
+ printf 'ymir.agents ABSENT\n'
76
+ fi
77
+ observe "ymir.agents" "$msg"
78
+
79
+ # ---- ymir: the well (episodes) -------------------------------------------
80
+ if [ -d "$WELL_DIR" ]; then
81
+ episodes=0
82
+ for f in "$WELL_DIR"/*.jsonl; do
83
+ [ -r "$f" ] || continue
84
+ c=$(wc -l <"$f" 2>/dev/null | tr -d '[:space:]')
85
+ episodes=$((episodes + ${c:-0}))
86
+ done
87
+ msg="well readable; episodes=${episodes}"
88
+ printf 'ymir.well episodes=%s\n' "$episodes"
89
+ else
90
+ msg="well ABSENT at $WELL_DIR"
91
+ printf 'ymir.well ABSENT\n'
92
+ fi
93
+ observe "ymir.well" "$msg"
94
+
95
+ # ---- ymir: the ledger -----------------------------------------------------
96
+ if [ -r "$RUNES_LEDGER" ]; then
97
+ lines=$(wc -l <"$RUNES_LEDGER" 2>/dev/null | tr -d '[:space:]')
98
+ msg="runes ledger readable; lines=${lines:-0}"
99
+ printf 'ymir.runes lines=%s\n' "${lines:-0}"
100
+ else
101
+ msg="runes ledger ABSENT at $RUNES_LEDGER"
102
+ printf 'ymir.runes ABSENT\n'
103
+ fi
104
+ observe "ymir.runes" "$msg"
105
+
106
+ # ---- smidja: runs (smidja.db, read-only) ---------------------------------
107
+ if [ -r "$SMIDJA_DB" ] && command -v python3 >/dev/null 2>&1; then
108
+ smidja_summary=$(python3 - "$SMIDJA_DB" 2>/dev/null <<'PY'
109
+ import sqlite3, sys
110
+ db = sys.argv[1]
111
+ try:
112
+ c = sqlite3.connect('file:' + db + '?mode=ro', uri=True, timeout=3)
113
+ except Exception as e:
114
+ print("open_failed=%s" % e)
115
+ sys.exit(0)
116
+ def q(sql, default=None):
117
+ try:
118
+ return c.execute(sql).fetchone()[0]
119
+ except Exception:
120
+ return default
121
+ sessions = q("select count(*) from sessions", 0)
122
+ phases = q("select count(*) from phases", 0)
123
+ gates = q("select count(*) from gate_results", 0)
124
+ gate_fail = q("select count(*) from gate_results where passed=0", 0)
125
+ print("sessions=%s phases=%s gates=%s gate_fail=%s" % (sessions, phases, gates, gate_fail))
126
+ try:
127
+ rows = c.execute("select smidja_id,status from sessions order by rowid desc limit 3").fetchall()
128
+ print("recent=" + ",".join("%s:%s" % (r[0], r[1]) for r in rows))
129
+ except Exception as e:
130
+ print("recent=unavailable(%s)" % e)
131
+ try:
132
+ rows = c.execute("select status,count(*) from phases group by status order by 2 desc limit 5").fetchall()
133
+ print("phase_status=" + ",".join("%s:%s" % (r[0], r[1]) for r in rows))
134
+ except Exception as e:
135
+ print("phase_status=unavailable(%s)" % e)
136
+ c.close()
137
+ PY
138
+ )
139
+ first_line=$(printf '%s' "$smidja_summary" | head -n 1)
140
+ msg="smidja.db read-only: ${first_line:-unreadable}"
141
+ printf 'smidja.runs %s\n' "$msg"
142
+ printf '%s\n' "$smidja_summary" | tail -n +2 | sed 's/^/ /'
143
+ else
144
+ if [ ! -r "$SMIDJA_DB" ]; then
145
+ msg="smidja.db ABSENT at $SMIDJA_DB"
146
+ else
147
+ msg="smidja.db present but python3 unavailable for read-only query"
148
+ fi
149
+ printf 'smidja.runs ABSENT/UNREADABLE\n'
150
+ fi
151
+ observe "smidja.runs" "$msg"
152
+
153
+ # ---- worktrees (external, read-only) -------------------------------------
154
+ if [ -d "$WORKTREE_ROOT" ]; then
155
+ wt_count=$(find "$WORKTREE_ROOT" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d '[:space:]')
156
+ state_files=$(find "$WORKTREE_ROOT" -mindepth 2 -maxdepth 2 -name 'treehouse-state.json' 2>/dev/null | wc -l | tr -d '[:space:]')
157
+ msg="worktrees=${wt_count:-0} state_files=${state_files:-0}"
158
+ printf 'yggdrasil.worktrees trees=%s state_files=%s\n' "${wt_count:-0}" "${state_files:-0}"
159
+ else
160
+ msg="worktree root ABSENT at $WORKTREE_ROOT"
161
+ printf 'yggdrasil.worktrees ABSENT\n'
162
+ fi
163
+ observe "yggdrasil.worktrees" "$msg"
164
+
165
+ printf '%s\n' "observer summary written: $LOG_TS" >"$OBS_LAST"
166
+ printf 'observer: observations carved (log=%s)\n' "$OBS_LOG"
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env bash
2
+ # nornir-job-skillopt-sleep.sh — SkillOpt overnight self-evolution.
3
+ #
4
+ # Runs SkillOpt-Sleep against Ymir's registered skills and Smíðja
5
+ # prompt files. Harvests today's session trajectories, mines recurring
6
+ # patterns, replays them, and consolidates validated skill edits behind
7
+ # a held-out validation gate.
8
+ #
9
+ # OUTPUT: stages best_skill.md artifacts under .agents/skills/*/staging/
10
+ # — never auto-applies. Allfather reviews before merge.
11
+ #
12
+ # Environment:
13
+ # BROKK_HOME, BROKK_STATE_OVERRIDE
14
+ # SKILLOPT_PATH path to the skillopt venv bin (default .venv/bin)
15
+ # SKILLOPT_SLEEP_OPTS extra args to skillopt-sleep run
16
+ #
17
+ # Safety: writes only to staging dirs and Runes. Never touches
18
+ # .agents/skills/*/SKILL.md directly. The Allfather approves adopted
19
+ # skills before they go live.
20
+ set -u
21
+
22
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
+ ROOT="${BROKK_ROOT_OVERRIDE:-$(cd "$SCRIPT_DIR/.." && pwd)}"
24
+ BROKK_HOME="${BROKK_HOME:-$ROOT}"
25
+ STATE="${BROKK_STATE_OVERRIDE:-$BROKK_HOME/state}"
26
+ SKILLOPT_PATH="${SKILLOPT_PATH:-$BROKK_HOME/.venv/bin}"
27
+ SLEEP_OPTS="${SKILLOPT_SLEEP_OPTS:-}"
28
+
29
+ # shellcheck source=bin/runes-append.sh
30
+ . "$SCRIPT_DIR/runes-append.sh"
31
+
32
+ STAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
33
+ STAGING="$BROKK_HOME/.agents/skills/skillopt-staging"
34
+
35
+ mkdir -p "$STATE" "$STAGING" 2>/dev/null || true
36
+
37
+ printf 'SKILLOPT-SLEEP - %s\n' "$STAMP"
38
+
39
+ # ---- 1. Pre-flight ----------------------------------------------------
40
+ if [ ! -x "$SKILLOPT_PATH/skillopt-sleep" ]; then
41
+ msg="skillopt-sleep not found at $SKILLOPT_PATH/skillopt-sleep — run bin/skillopt-setup.sh first"
42
+ printf 'skillopt: %s\n' "$msg"
43
+ runes_append "skillopt" "sleep.skipped" --message "$msg" >/dev/null 2>&1 || true
44
+ exit 0
45
+ fi
46
+
47
+ # ---- 2. Run SkillOpt-Sleep -------------------------------------------
48
+ # Harvests sessions from ~/.claude and ~/.codex (if present),
49
+ # mines recurring tasks, replays them, and stages best_skill.md.
50
+ # --dry-run: report only. --auto-adopt: never set (human-in-the-loop).
51
+ if [ -d "$BROKK_HOME/.claude" ] || [ -d "$BROKK_HOME/.codex" ]; then
52
+ "$SKILLOPT_PATH/skillopt-sleep" run \
53
+ --project "$BROKK_HOME" \
54
+ --scope all \
55
+ --source auto \
56
+ --lookback-hours 24 \
57
+ --max-sessions 50 \
58
+ --max-tasks 20 \
59
+ --target-skill-path "$STAGING/best_skill.md" \
60
+ --progress \
61
+ $SLEEP_OPTS 2>&1 | tee "$STATE/skillopt-sleep-$STAMP.log" || true
62
+ else
63
+ msg="no Claude/Codex session dirs found at $BROKK_HOME — SkillOpt-Sleep needs agent transcripts"
64
+ printf 'skillopt: %s\n' "$msg"
65
+ runes_append "skillopt" "sleep.skipped" --message "$msg" >/dev/null 2>&1 || true
66
+ fi
67
+
68
+ # ---- 3. Stage report --------------------------------------------------
69
+ if [ -f "$STAGING/best_skill.md" ]; then
70
+ size=$(wc -c <"$STAGING/best_skill.md" | tr -d '[:space:]')
71
+ msg="staged best_skill.md (${size} bytes) — review before adopt"
72
+ else
73
+ msg="no new proposals this cycle"
74
+ fi
75
+ printf 'skillopt: %s\n' "$msg"
76
+ runes_append "skillopt" "sleep.completed" --message "$msg" >/dev/null 2>&1 || true
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env bash
2
+ # npm-publish.sh — publish through the HOARD's npm token, every single time.
3
+ #
4
+ # Why this exists: this machine once held two tokens, and the one in ~/.npmrc was
5
+ # stale. A publish then failed with a 2FA refusal that looked like a policy
6
+ # problem but was a credential problem, and a session was spent on it. The token
7
+ # with bypass-2FA lives in the hoard. So the rule is: never trust ~/.npmrc — read
8
+ # the token from the hoard, hand it to npm through a temporary userconfig, and
9
+ # throw the file away.
10
+ #
11
+ # bin/npm-publish.sh # the platform (the repo root manifest)
12
+ # bin/npm-publish.sh apps/hlidskjalf # one package
13
+ # bin/npm-publish.sh --all # the platform + every app package
14
+ # bin/npm-publish.sh --whoami # which account the hoard token is
15
+ # bin/npm-publish.sh --dry-run apps/odrerir
16
+ # bin/npm-publish.sh --unpublish @zerwiz/ymir@0.1.5 # take ONE version back
17
+ # bin/npm-publish.sh --unpublish @zerwiz/ymir@0.1.5 --dry-run
18
+ #
19
+ # Unpublish: npm allows ONE VERSION back for 72 hours after it was published;
20
+ # past that only npm support can remove it, which is why this door names the
21
+ # version and refuses anything vaguer. A whole package is not a one-word act —
22
+ # that needs npm's own tooling and a deliberate decision, not a flag here.
23
+ #
24
+ # A prerelease version (0.1.8-alpha) is published under `--tag next` automatically
25
+ # — npm refuses a prerelease on `latest`, which is the second half of the same
26
+ # lesson. A scoped package always goes out with public access.
27
+ set -u
28
+
29
+ VERSION="1.0.0"
30
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
31
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
32
+ # shellcheck source=bin/hoard-lib.sh
33
+ . "$SCRIPT_DIR/hoard-lib.sh"
34
+
35
+ DRY=0; WHO=0; ALL=0; UNPUBLISH=0; UNPUB_SPEC=""; TARGETS=()
36
+ for a in "$@"; do
37
+ case "$a" in
38
+ --whoami) WHO=1 ;;
39
+ --dry-run) DRY=1 ;;
40
+ --all) ALL=1 ;;
41
+ --unpublish) UNPUBLISH=1 ;;
42
+ --unpublish=*) UNPUBLISH=1; UNPUB_SPEC="${a#*=}" ;;
43
+ -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
44
+ -h|--help|"") sed -n '2,22p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
45
+ -*) printf 'error: unknown flag %s\nhelp: bin/npm-publish.sh [--all|--whoami|--unpublish <spec>|--dry-run] [<package-dir>...]\n' "$a" >&2; exit 2 ;;
46
+ *) TARGETS+=("$a") ;;
47
+ esac
48
+ done
49
+ # --all is the platform plus every app package. The smithy's own repo is
50
+ # cloned at apps/smidja-factory (the registry maps smidja there), so it is a
51
+ # target like any other app: it publishes as @zerwiz/smidja.
52
+ [ "$ALL" = 1 ] && TARGETS=("$ROOT" "$ROOT/apps/hlidskjalf" "$ROOT/apps/hlidskjalf-mobile" "$ROOT/apps/odrerir" "$ROOT/apps/sessrumnir" "$ROOT/apps/smidja-factory")
53
+ [ "${#TARGETS[@]}" -eq 0 ] && [ "$WHO" = 0 ] && [ "$UNPUBLISH" = 0 ] && TARGETS=("$ROOT")
54
+ # `--unpublish @scope/name@1.2.3` — the spec may also arrive positionally.
55
+ [ "$UNPUBLISH" = 1 ] && UNPUB_SPEC="${UNPUB_SPEC:-${TARGETS[0]:-}}"
56
+
57
+ # ── the token, from the hoard ────────────────────────────────────────────────
58
+ envfile=""; hoard_env envfile
59
+ TOKEN=""
60
+ if [ -r "$envfile" ]; then
61
+ TOKEN="$(sed -n 's/^NPM_TOKEN=//p' "$envfile" | head -1 | tr -d '"'"'"' ')"
62
+ fi
63
+ if [ -z "$TOKEN" ] && [ "$WHO" = 1 ]; then
64
+ printf 'npm[1]{token,state}:\n "NPM_TOKEN","absent in %s"\n' "${envfile#"$HOME"/}"
65
+ exit 1
66
+ fi
67
+ if [ -z "$TOKEN" ]; then
68
+ printf 'error: the hoard holds no NPM_TOKEN\nhelp: add NPM_TOKEN=<granular token with bypass 2FA> to %s\n' "${envfile#"$HOME"/}" >&2
69
+ printf 'help: npmjs.com → Access Tokens → Generate → granular, scope @zerwiz, bypass 2FA on\n' >&2
70
+ exit 1
71
+ fi
72
+
73
+ cfg="$(mktemp)"; chmod 600 "$cfg"
74
+ printf '//registry.npmjs.org/:_authToken=%s\n' "$TOKEN" >"$cfg"
75
+ trap 'rm -f "$cfg"' EXIT
76
+
77
+ if [ "$WHO" = 1 ]; then
78
+ who="$(npm whoami --userconfig "$cfg" 2>/dev/null || printf 'unknown')"
79
+ printf 'npm[2]{token,account}:\n "source","%s"\n "whoami","%s"\n' "${envfile#"$HOME"/}" "$who"
80
+ exit 0
81
+ fi
82
+
83
+ # ── unpublish ────────────────────────────────────────────────────────────────
84
+ # Take ONE version back. npm permits it for 72 hours after publication; beyond
85
+ # that it is npm support's door, not this one. The spec must name a version:
86
+ # `@scope/name@1.2.3`, never a bare name.
87
+ if [ "$UNPUBLISH" = 1 ]; then
88
+ case "$UNPUB_SPEC" in
89
+ *@*@*) ;; # @scope/name@version
90
+ *@[0-9]*) ;;
91
+ *) printf 'error: --unpublish needs a package AND a version\nhelp: bin/npm-publish.sh --unpublish @scope/name@<version>\n' >&2; exit 2 ;;
92
+ esac
93
+ if [ "$DRY" = 1 ]; then
94
+ printf 'npm_unpublish[1]{spec,state}:\n "%s","dry-run — nothing was removed"\n' "$UNPUB_SPEC"
95
+ exit 0
96
+ fi
97
+ out="$(npm unpublish "$UNPUB_SPEC" --force --userconfig "$cfg" 2>&1)"; rc=$?
98
+ if [ "$rc" = 0 ]; then
99
+ printf 'npm_unpublish[1]{spec,state}:\n "%s","unpublished"\n' "$UNPUB_SPEC"
100
+ printf 'note: the registry CDN may serve the tarball for a while after this; publishing a\n'
101
+ printf 'note: newer version moves the "latest" tag off it at once.\n'
102
+ else
103
+ why="$(printf '%s' "$out" | grep -m1 -E 'npm error (code )?[A-Z0-9]+|E[0-9]{3}' | cut -c1-90)"
104
+ printf 'error: unpublish failed — %s\nhelp: is it inside the 72-hour window, and is the token the right account? (bin/npm-publish.sh --whoami)\n' "${why:-see npm log}" >&2
105
+ exit 1
106
+ fi
107
+ exit 0
108
+ fi
109
+
110
+ # ── publish ──────────────────────────────────────────────────────────────────
111
+ printf 'npm_publish[%d]{package,version,tag,state}:\n' "${#TARGETS[@]}"
112
+ failed=0
113
+ for dir in "${TARGETS[@]}"; do
114
+ pkg="$dir/package.json"
115
+ if [ ! -f "$pkg" ]; then
116
+ printf ' "%s","-","-","SKIP (no package.json)"\n' "${dir#"$ROOT"/}"
117
+ continue
118
+ fi
119
+ name="$(sed -n 's/.*"name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$pkg" | head -1)"
120
+ ver="$(sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$pkg" | head -1)"
121
+ case "$ver" in *-*) tag=next ;; *) tag=latest ;; esac # a prerelease never rides `latest`
122
+ if [ "$DRY" = 1 ]; then
123
+ printf ' "%s","%s","%s","dry-run"\n' "$name" "$ver" "$tag"
124
+ continue
125
+ fi
126
+ out="$(cd "$dir" && npm publish --access public --tag "$tag" --userconfig "$cfg" 2>&1)"; rc=$?
127
+ if [ "$rc" = 0 ]; then
128
+ printf ' "%s","%s","%s","published"\n' "$name" "$ver" "$tag"
129
+ else
130
+ why="$(printf '%s' "$out" | grep -m1 -E 'npm error (code )?[A-Z0-9]+|E[0-9]{3}' | cut -c1-90)"
131
+ printf ' "%s","%s","%s","FAILED (%s)"\n' "$name" "$ver" "$tag" "${why:-see npm log}"
132
+ failed=$((failed+1))
133
+ fi
134
+ done
135
+ [ "$failed" = 0 ] || { printf 'error: %d package(s) did not publish\nhelp: bin/npm-publish.sh --whoami (is the hoard token still the right account?)\n' "$failed" >&2; exit 1; }
136
+ exit 0
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env bash
2
+ # omarchy-hook-install.sh — let Ymir notice when Omarchy updates.
3
+ #
4
+ # Omarchy runs `~/.config/omarchy/hooks/post-update.d/*` after `omarchy update`
5
+ # applies packages and migrations. Installing our sensor there means Ymir learns
6
+ # the machine again the moment Omarchy moves — no polling, no cron.
7
+ #
8
+ # This writes only into ~/.config/omarchy/hooks/ (user config, per the Omarchy
9
+ # skill: never /usr/share/omarchy/).
10
+ #
11
+ # Usage:
12
+ # bin/omarchy-hook-install.sh install|status|remove
13
+ # bin/omarchy-hook-install.sh --version
14
+ set -u
15
+
16
+ VERSION="1.0.0"
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
19
+ HOOK_DIR="$HOME/.config/omarchy/hooks/post-update.d"
20
+ HOOK="$HOOK_DIR/ymir-omarchy-sense.sh"
21
+
22
+ is_omarchy() { [ -d /usr/share/omarchy ]; }
23
+ have() { command -v "$1" >/dev/null 2>&1; }
24
+
25
+ case "${1-}" in
26
+ -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
27
+ -h|--help|"") sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
28
+ esac
29
+
30
+ ACTION="${1:-status}"
31
+
32
+ case "$ACTION" in
33
+ status)
34
+ if [ -f "$HOOK" ]; then
35
+ printf 'omarchy-hook[1]{hook,state}:\n "%s","installed"\n' "$HOOK"
36
+ else
37
+ printf 'omarchy-hook[1]{hook,state}:\n "%s","absent"\n' "$HOOK"
38
+ fi
39
+ ;;
40
+ install)
41
+ if ! is_omarchy; then
42
+ printf 'omarchy-hook[1]{state,detail}:\n "skipped","not an Omarchy host (/usr/share/omarchy absent)"\n'
43
+ exit 0
44
+ fi
45
+ mkdir -p "$HOOK_DIR"
46
+ cat >"$HOOK" <<EOF
47
+ #!/usr/bin/env bash
48
+ # Installed by Ymir (bin/omarchy-hook-install.sh). Re-learns the machine after
49
+ # an Omarchy update so the agent stays current with this user's setup.
50
+ exec "$ROOT/bin/omarchy-sense.sh" observe --quiet
51
+ EOF
52
+ chmod +x "$HOOK"
53
+ printf 'omarchy-hook[1]{hook,state}:\n "%s","installed"\n' "$HOOK"
54
+ ;;
55
+ remove)
56
+ rm -f "$HOOK"
57
+ printf 'omarchy-hook[1]{hook,state}:\n "%s","removed"\n' "$HOOK"
58
+ ;;
59
+ *) printf 'error: unknown action %s\nhelp: bin/omarchy-hook-install.sh [install|status|remove]\n' "$ACTION" >&2; exit 2 ;;
60
+ esac
@@ -0,0 +1,161 @@
1
+ #!/usr/bin/env bash
2
+ # omarchy-install.sh — the Omarchy installation layer (Rule 05).
3
+ #
4
+ # Ymir is **Omarchy-first**: this is the first-class desktop layer. It owns
5
+ # everything that is true of Omarchy and not of the core — learning the host, the
6
+ # post-update hook, the suggested shell plugins, each app's numbered Hyprland
7
+ # desktop, the launcher entries, the editor's own desktop, the away-mode alarm
8
+ # channel, and the terminal backend Ymir needs.
9
+ #
10
+ # The core installer (bin/ymir-install.sh) is portable and runs on any platform;
11
+ # it calls THIS only when the host is Omarchy. Every step here therefore detects
12
+ # its host and reports a clean skip elsewhere — the layer is never assumed.
13
+ #
14
+ # Usage:
15
+ # bin/omarchy-install.sh # apply (idempotent)
16
+ # bin/omarchy-install.sh --check # report state only, change nothing
17
+ # bin/omarchy-install.sh --list # the steps, in order
18
+ # bin/omarchy-install.sh --version
19
+ #
20
+ # Output: Galdr TOON. Exit 0 ok, 1 a step failed, 2 usage.
21
+ set -u
22
+
23
+ VERSION="1.0.0"
24
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
26
+
27
+ # The operator's settings and secrets live in the home they chose, never in the
28
+ # code tree — a packaged install replaces its tree on upgrade, and a credential
29
+ # must never sit in a tree that ships (Rule 04).
30
+ if [ -z "${YMIR_HOARD_LIB_LOADED:-}" ]; then
31
+ _yr="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
32
+ for _yc in "$_yr/hoard-lib.sh" "$(dirname "$_yr")/bin/hoard-lib.sh"; do
33
+ [ -r "$_yc" ] && { . "$_yc"; YMIR_HOARD_LIB_LOADED=1; break; }
34
+ done
35
+ unset _yr _yc
36
+ fi
37
+ hoard_settings_dir YMIR_SETTINGS_DIR
38
+ hoard_local_env YMIR_ENV_FILE
39
+
40
+ # portability shim (bin/ymir-platform.sh)
41
+ if [ -z "${YMIR_PLATFORM_LOADED:-}" ]; then
42
+ _ymir_dir="$SCRIPT_DIR"
43
+ for _ymir_c in "$_ymir_dir/ymir-platform.sh" "$(dirname "$_ymir_dir")/bin/ymir-platform.sh"; do
44
+ [ -r "$_ymir_c" ] && { . "$_ymir_c"; YMIR_PLATFORM_LOADED=1; break; }
45
+ done
46
+ unset _ymir_dir _ymir_c
47
+ fi
48
+
49
+ CHECK=0
50
+ for a in "$@"; do
51
+ case "$a" in
52
+ --check) CHECK=1 ;;
53
+ --list) printf 'omarchy-steps[7]{order,step,owns}:\n'
54
+ printf ' 1,"sense","learn the host: packages, configs, monitors, scale, Omarchy version"\n'
55
+ printf ' 2,"hook","re-learn after every `omarchy update` (post-update.d)"\n'
56
+ printf ' 3,"plugins","offer the shell plugins that render Ymir'"'"'s organs; never forced"\n'
57
+ printf ' 4,"desktops","one numbered Hyprland desktop per app + the launcher entries"\n'
58
+ printf ' 5,"editor","the editor opens on its own desktop"\n'
59
+ printf ' 6,"alarm","the away-mode alarm channel and the crash sensor"\n'
60
+ printf ' 7,"backend","the terminal backend Ymir needs (herdr 0.14+/0.8.0+, else tmux)"\n'
61
+ exit 0 ;;
62
+ --version|-v) printf '%s\n' "$VERSION"; exit 0 ;;
63
+ -h|--help) sed -n '2,17p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
64
+ *) printf 'error: unknown flag %s\nhelp: bin/omarchy-install.sh [--check|--list]\n' "$a" >&2; exit 2 ;;
65
+ esac
66
+ done
67
+
68
+ declare -a T S D
69
+ add() { T+=("$1"); S+=("$2"); D+=("$3"); }
70
+ isfail=0
71
+
72
+ have() { command -v "$1" >/dev/null 2>&1; }
73
+ is_omarchy() { [ -d /usr/share/omarchy ] && return 0; [ "$(ymir_os 2>/dev/null)" = linux ] && [ -d "$HOME/.config/omarchy" ]; }
74
+
75
+ # ── the gate ─────────────────────────────────────────────────────────────────
76
+ if ! is_omarchy; then
77
+ printf 'omarchy[1]{step,status,detail}:\n'
78
+ printf ' "layer","SKIP","not an Omarchy host — the core runs without this layer"\n'
79
+ exit 0
80
+ fi
81
+
82
+ run() { # <step> <label> <cmd...>
83
+ local step=$1 label=$2; shift 2
84
+ if [ "$CHECK" = 1 ]; then add "$step" OK "$label (check)"; return 0; fi
85
+ if "$@" >/dev/null 2>&1; then add "$step" OK "$label"; else add "$step" WARN "$label — command reported failure"; fi
86
+ }
87
+
88
+ # ── 1. learn the host ────────────────────────────────────────────────────────
89
+ if [ -x "$SCRIPT_DIR/omarchy-sense.sh" ]; then
90
+ if [ "$CHECK" = 1 ]; then
91
+ snap="$("$SCRIPT_DIR/omarchy-sense.sh" status 2>&1 | sed -n '2p' | tr -d '"' | cut -c1-60)"
92
+ add sense OK "${snap:-no snapshot yet}"
93
+ else
94
+ "$SCRIPT_DIR/omarchy-sense.sh" observe --quiet >/dev/null 2>&1 && add sense OK "host recorded" || add sense WARN "could not record the host"
95
+ fi
96
+ else
97
+ add sense SKIP "no omarchy-sense.sh"
98
+ fi
99
+
100
+ # ── 2. the post-update hook ──────────────────────────────────────────────────
101
+ if [ "$CHECK" = 1 ]; then
102
+ [ -e "$HOME/.config/omarchy/hooks/post-update.d/ymir-omarchy-sense.sh" ] && add hook OK "installed" || add hook WARN "not installed (run without --check)"
103
+ else
104
+ run hook "installed" "$SCRIPT_DIR/omarchy-hook-install.sh" install
105
+ fi
106
+
107
+ # ── 3. the suggested shell plugins (offered, never forced) ───────────────────
108
+ if [ "$CHECK" = 1 ]; then
109
+ add plugins OK "offered via bin/omarchy-plugins.sh add"
110
+ else
111
+ "$SCRIPT_DIR/omarchy-plugins.sh" suggest >/dev/null 2>&1 && add plugins OK "offered (add with: bin/omarchy-plugins.sh add)" || add plugins WARN "could not list the plugins"
112
+ fi
113
+
114
+ # ── 4. desktops + launcher entries ───────────────────────────────────────────
115
+ if [ "$CHECK" = 1 ]; then
116
+ add desktops OK "would place each app on its own numbered desktop + install the entries"
117
+ else
118
+ if [ -x "$SCRIPT_DIR/desktop-place.sh" ]; then
119
+ if "$SCRIPT_DIR/desktop-place.sh" apply >/dev/null 2>&1; then
120
+ n=$(ls "$HOME/.local/share/applications"/ymir-*.desktop 2>/dev/null | wc -l | tr -d ' ')
121
+ add desktops OK "numbered desktops placed; $n launcher entr(y|ies) installed"
122
+ else
123
+ add desktops WARN "desktop-place.sh reported failure"; isfail=1
124
+ fi
125
+ else
126
+ add desktops SKIP "no desktop-place.sh"
127
+ fi
128
+ fi
129
+
130
+ # ── 5. the editor's own desktop ──────────────────────────────────────────────
131
+ if [ -x "$SCRIPT_DIR/editor-place.sh" ]; then
132
+ run editor "the editor opens on its own desktop" "$SCRIPT_DIR/editor-place.sh" apply
133
+ else
134
+ add editor SKIP "no editor-place.sh"
135
+ fi
136
+
137
+ # ── 6. the away-mode alarm channel + the crash sensor ────────────────────────
138
+ if [ -e "$YMIR_SETTINGS_DIR/wedge-alarm" ]; then
139
+ add alarm OK "channel kept"
140
+ elif [ "$CHECK" = 1 ]; then
141
+ add alarm WARN "channel not written (run without --check)"
142
+ elif mkdir -p "$YMIR_SETTINGS_DIR" 2>/dev/null && \
143
+ printf '# The channel the away-mode wedge alarm fires on when an escalation\n# cannot be delivered into the pane. See bin/wedge-notify.sh.\ndesktop\n' >"$YMIR_SETTINGS_DIR/wedge-alarm" 2>/dev/null; then
144
+ add alarm OK "channel written ($YMIR_SETTINGS_DIR/wedge-alarm)"
145
+ else
146
+ add alarm WARN "could not write $YMIR_SETTINGS_DIR/wedge-alarm"
147
+ fi
148
+
149
+ # ── 7. the terminal backend Ymir needs ───────────────────────────────────────
150
+ if [ "$CHECK" = 1 ]; then
151
+ if have herdr || have tmux; then add backend OK "present"; else add backend WARN "no herdr and no tmux"; fi
152
+ elif [ -x "$SCRIPT_DIR/herdr-ensure.sh" ]; then
153
+ if "$SCRIPT_DIR/herdr-ensure.sh" >/dev/null 2>&1 || have tmux; then add backend OK "herdr or tmux ready"; else add backend WARN "no terminal backend — bin/herdr-ensure.sh"; fi
154
+ else
155
+ add backend SKIP "no herdr-ensure.sh"
156
+ fi
157
+
158
+ printf 'omarchy[%s]{step,status,detail}:\n' "${#T[@]}"
159
+ for i in "${!T[@]}"; do printf ' "%s","%s","%s"\n' "${T[$i]}" "${S[$i]}" "${D[$i]}"; done
160
+ [ "$isfail" = 1 ] && exit 1
161
+ exit 0