@zerwiz/ymir 0.1.3 → 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 -39
  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,148 @@
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
+ # portability shim (bin/ymir-platform.sh)
28
+ if [ -z "${YMIR_PLATFORM_LOADED:-}" ]; then
29
+ _ymir_dir="$SCRIPT_DIR"
30
+ for _ymir_c in "$_ymir_dir/ymir-platform.sh" "$(dirname "$_ymir_dir")/bin/ymir-platform.sh"; do
31
+ [ -r "$_ymir_c" ] && { . "$_ymir_c"; YMIR_PLATFORM_LOADED=1; break; }
32
+ done
33
+ unset _ymir_dir _ymir_c
34
+ fi
35
+
36
+ CHECK=0
37
+ for a in "$@"; do
38
+ case "$a" in
39
+ --check) CHECK=1 ;;
40
+ --list) printf 'omarchy-steps[7]{order,step,owns}:\n'
41
+ printf ' 1,"sense","learn the host: packages, configs, monitors, scale, Omarchy version"\n'
42
+ printf ' 2,"hook","re-learn after every `omarchy update` (post-update.d)"\n'
43
+ printf ' 3,"plugins","offer the shell plugins that render Ymir'"'"'s organs; never forced"\n'
44
+ printf ' 4,"desktops","one numbered Hyprland desktop per app + the launcher entries"\n'
45
+ printf ' 5,"editor","the editor opens on its own desktop"\n'
46
+ printf ' 6,"alarm","the away-mode alarm channel and the crash sensor"\n'
47
+ printf ' 7,"backend","the terminal backend Ymir needs (herdr 0.14+/0.8.0+, else tmux)"\n'
48
+ exit 0 ;;
49
+ --version|-v) printf '%s\n' "$VERSION"; exit 0 ;;
50
+ -h|--help) sed -n '2,17p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
51
+ *) printf 'error: unknown flag %s\nhelp: bin/omarchy-install.sh [--check|--list]\n' "$a" >&2; exit 2 ;;
52
+ esac
53
+ done
54
+
55
+ declare -a T S D
56
+ add() { T+=("$1"); S+=("$2"); D+=("$3"); }
57
+ isfail=0
58
+
59
+ have() { command -v "$1" >/dev/null 2>&1; }
60
+ is_omarchy() { [ -d /usr/share/omarchy ] && return 0; [ "$(ymir_os 2>/dev/null)" = linux ] && [ -d "$HOME/.config/omarchy" ]; }
61
+
62
+ # ── the gate ─────────────────────────────────────────────────────────────────
63
+ if ! is_omarchy; then
64
+ printf 'omarchy[1]{step,status,detail}:\n'
65
+ printf ' "layer","SKIP","not an Omarchy host — the core runs without this layer"\n'
66
+ exit 0
67
+ fi
68
+
69
+ run() { # <step> <label> <cmd...>
70
+ local step=$1 label=$2; shift 2
71
+ if [ "$CHECK" = 1 ]; then add "$step" OK "$label (check)"; return 0; fi
72
+ if "$@" >/dev/null 2>&1; then add "$step" OK "$label"; else add "$step" WARN "$label — command reported failure"; fi
73
+ }
74
+
75
+ # ── 1. learn the host ────────────────────────────────────────────────────────
76
+ if [ -x "$SCRIPT_DIR/omarchy-sense.sh" ]; then
77
+ if [ "$CHECK" = 1 ]; then
78
+ snap="$("$SCRIPT_DIR/omarchy-sense.sh" status 2>&1 | sed -n '2p' | tr -d '"' | cut -c1-60)"
79
+ add sense OK "${snap:-no snapshot yet}"
80
+ else
81
+ "$SCRIPT_DIR/omarchy-sense.sh" observe --quiet >/dev/null 2>&1 && add sense OK "host recorded" || add sense WARN "could not record the host"
82
+ fi
83
+ else
84
+ add sense SKIP "no omarchy-sense.sh"
85
+ fi
86
+
87
+ # ── 2. the post-update hook ──────────────────────────────────────────────────
88
+ if [ "$CHECK" = 1 ]; then
89
+ [ -e "$HOME/.config/omarchy/hooks/post-update.d/ymir-omarchy-sense.sh" ] && add hook OK "installed" || add hook WARN "not installed (run without --check)"
90
+ else
91
+ run hook "installed" "$SCRIPT_DIR/omarchy-hook-install.sh" install
92
+ fi
93
+
94
+ # ── 3. the suggested shell plugins (offered, never forced) ───────────────────
95
+ if [ "$CHECK" = 1 ]; then
96
+ add plugins OK "offered via bin/omarchy-plugins.sh add"
97
+ else
98
+ "$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"
99
+ fi
100
+
101
+ # ── 4. desktops + launcher entries ───────────────────────────────────────────
102
+ if [ "$CHECK" = 1 ]; then
103
+ add desktops OK "would place each app on its own numbered desktop + install the entries"
104
+ else
105
+ if [ -x "$SCRIPT_DIR/desktop-place.sh" ]; then
106
+ if "$SCRIPT_DIR/desktop-place.sh" apply >/dev/null 2>&1; then
107
+ n=$(ls "$HOME/.local/share/applications"/ymir-*.desktop 2>/dev/null | wc -l | tr -d ' ')
108
+ add desktops OK "numbered desktops placed; $n launcher entr(y|ies) installed"
109
+ else
110
+ add desktops WARN "desktop-place.sh reported failure"; isfail=1
111
+ fi
112
+ else
113
+ add desktops SKIP "no desktop-place.sh"
114
+ fi
115
+ fi
116
+
117
+ # ── 5. the editor's own desktop ──────────────────────────────────────────────
118
+ if [ -x "$SCRIPT_DIR/editor-place.sh" ]; then
119
+ run editor "the editor opens on its own desktop" "$SCRIPT_DIR/editor-place.sh" apply
120
+ else
121
+ add editor SKIP "no editor-place.sh"
122
+ fi
123
+
124
+ # ── 6. the away-mode alarm channel + the crash sensor ────────────────────────
125
+ if [ -e "$ROOT/config/wedge-alarm" ]; then
126
+ add alarm OK "channel kept"
127
+ elif [ "$CHECK" = 1 ]; then
128
+ add alarm WARN "channel not written (run without --check)"
129
+ elif mkdir -p "$ROOT/config" 2>/dev/null && \
130
+ 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' >"$ROOT/config/wedge-alarm" 2>/dev/null; then
131
+ add alarm OK "channel written (config/wedge-alarm)"
132
+ else
133
+ add alarm WARN "could not write config/wedge-alarm"
134
+ fi
135
+
136
+ # ── 7. the terminal backend Ymir needs ───────────────────────────────────────
137
+ if [ "$CHECK" = 1 ]; then
138
+ if have herdr || have tmux; then add backend OK "present"; else add backend WARN "no herdr and no tmux"; fi
139
+ elif [ -x "$SCRIPT_DIR/herdr-ensure.sh" ]; then
140
+ 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
141
+ else
142
+ add backend SKIP "no herdr-ensure.sh"
143
+ fi
144
+
145
+ printf 'omarchy[%s]{step,status,detail}:\n' "${#T[@]}"
146
+ for i in "${!T[@]}"; do printf ' "%s","%s","%s"\n' "${T[$i]}" "${S[$i]}" "${D[$i]}"; done
147
+ [ "$isfail" = 1 ] && exit 1
148
+ exit 0
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env bash
2
+ # omarchy-plugins.sh — the Omarchy plugins Ymir suggests, and installs on consent.
3
+ #
4
+ # Ymir runs on Omarchy, and Omarchy's shell is plugin-shaped: the bar, the panels,
5
+ # the overlays are all plugins. A few of them are Ymir's own organs rendered on
6
+ # the desktop — herdr (Þjazi), Hermes (our worker runtime), and skills (the Galdr
7
+ # family). This suggests them at install, and installs only what the Allfather
8
+ # accepts.
9
+ #
10
+ # Installing is Omarchy's own verb — never a raw clone:
11
+ # omarchy plugin add <repo> [--enable] · omarchy plugin remove <id>
12
+ # (Omarchy docs: "A plugin is a git repo with a manifest.json at its root.")
13
+ #
14
+ # Usage:
15
+ # bin/omarchy-plugins.sh list # what Ymir suggests
16
+ # bin/omarchy-plugins.sh installed # what is present now
17
+ # bin/omarchy-plugins.sh suggest [--yes] # offer them; install on consent
18
+ # bin/omarchy-plugins.sh add <id> # install one (with consent unless --yes)
19
+ # bin/omarchy-plugins.sh --version
20
+ #
21
+ # Consent: nothing is installed without an explicit yes (or --yes). These are
22
+ # third-party plugins that run unsandboxed inside the Omarchy shell — the registry
23
+ # itself says it "validates listings, not plugin security".
24
+ set -u
25
+
26
+ VERSION="1.0.0"
27
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
28
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
29
+ YES=0
30
+
31
+ case "${1-}" in
32
+ -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
33
+ -h|--help|"") sed -n '2,20p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
34
+ esac
35
+ ACTION="${1:-list}"; shift || true
36
+ [ "${1:-}" = "--yes" ] && YES=1
37
+ [ "${1:-}" = "-y" ] && YES=1
38
+
39
+ have() { command -v "$1" >/dev/null 2>&1; }
40
+
41
+ # id | name | why it earns a place in Ymir's suggestion list
42
+ catalog() {
43
+ cat <<'PLUGINS'
44
+ io.github.eszanon.herdr|Herdr Watch|herdr agents in the bar, flags the ones waiting on you — Þjazi made visible
45
+ io.github.mbot11.hermes-deck|Hermes Deck|live Hermes companion: status, sessions, usage, controls — Hermes is our worker runtime
46
+ firstpick.skill-manager|Skill Manager|links local skills across Pi, OpenCode, Claude Code, Cursor, Codex — the Galdr family on every harness
47
+ io.github.fabean.herdr|Herdr|monitor herdr agent activity and status from the bar
48
+ stappmus.udder|Udder|all your herdr agents in the bar, notified when one finishes
49
+ mrpbennett.herdr-agents|Herdr Agents|every agent's state and current activity in the bar
50
+ io.github.andy-spike.herdr-theme-sync|Herdr Theme Sync|keeps herdr colors in step with the Omarchy theme
51
+ yordanbuilds.rig|Rig|project stacks for herdr — one JSON file and the workspace is up
52
+ tsouth89.omcp|OMCP|turn this desktop into an MCP server other agents can drive
53
+ PLUGINS
54
+ }
55
+
56
+ installed_plugins() {
57
+ have omarchy || return 0
58
+ # omarchy plugin list --json is the structured form; fall back to plain text.
59
+ if omarchy plugin list --json >/dev/null 2>&1; then
60
+ omarchy plugin list --json 2>/dev/null | python3 -c '
61
+ import json,sys
62
+ try:
63
+ d=json.load(sys.stdin)
64
+ items = d.get("plugins") if isinstance(d, dict) else d
65
+ if isinstance(items, dict): items = list(items.values())
66
+ for it in (items or []):
67
+ print(it.get("id") or it.get("name") or "")
68
+ except Exception:
69
+ pass' 2>/dev/null
70
+ else
71
+ omarchy plugin list 2>/dev/null | awk '{print $1}'
72
+ fi
73
+ }
74
+
75
+ is_installed() { # <id>
76
+ installed_plugins | grep -qxF "$1" 2>/dev/null
77
+ }
78
+
79
+ repo_for() { # <id> — read the repo from the registry's own catalog when reachable
80
+ local id=$1 cache="$ROOT/state/omarchy-catalog.json"
81
+ if [ -r "$cache" ]; then
82
+ python3 - "$cache" "$id" <<'PY' 2>/dev/null
83
+ import json,sys
84
+ try:
85
+ d=json.load(open(sys.argv[1])); items=d.get("plugins", d)
86
+ if isinstance(items, dict): items=list(items.values())
87
+ for it in items:
88
+ if it.get("id")==sys.argv[2]:
89
+ print(it.get("repo") or ""); break
90
+ except Exception:
91
+ pass
92
+ PY
93
+ fi
94
+ }
95
+
96
+ case "$ACTION" in
97
+ list)
98
+ printf 'omarchy-plugins[%d]{id,name,why}:\n' "$(catalog | grep -c .)"
99
+ while IFS='|' read -r id name why; do
100
+ [ -n "$id" ] || continue
101
+ printf ' "%s","%s","%s"\n' "$id" "$name" "$why"
102
+ done < <(catalog)
103
+ printf 'install: bin/omarchy-plugins.sh add <id> (Omarchy installs via `omarchy plugin add`)\n'
104
+ ;;
105
+ installed)
106
+ if ! have omarchy; then printf 'omarchy-plugins[1]{state}:\n "not an Omarchy host"\n'; exit 0; fi
107
+ mapfile -t have_ids < <(installed_plugins)
108
+ printf 'omarchy-plugins[%d]{id,present}:\n' "${#have_ids[@]}"
109
+ for id in "${have_ids[@]}"; do [ -n "$id" ] && printf ' "%s","yes"\n' "$id"; done
110
+ ;;
111
+ suggest)
112
+ if ! have omarchy; then printf 'omarchy-plugins[1]{state}:\n "skipped — not an Omarchy host"\n'; exit 0; fi
113
+ printf 'Ymir suggests these Omarchy plugins — third-party code that runs inside your shell:\n\n'
114
+ while IFS='|' read -r id name why; do
115
+ [ -n "$id" ] || continue
116
+ if is_installed "$id"; then printf ' [have] %-32s %s\n' "$name" "$why"
117
+ else printf ' [ -- ] %-32s %s\n' "$name" "$why"; fi
118
+ done < <(catalog)
119
+ printf '\nEach is Omarchy-verified as a listing, not audited for safety. Install one at a time:\n'
120
+ printf ' bin/omarchy-plugins.sh add <id>\n'
121
+ if [ "$YES" = 1 ]; then
122
+ while IFS='|' read -r id name why; do
123
+ [ -n "$id" ] || continue
124
+ is_installed "$id" && continue
125
+ "$SCRIPT_DIR/omarchy-plugins.sh" add "$id" --yes || true
126
+ done < <(catalog)
127
+ fi
128
+ ;;
129
+ add)
130
+ id="${1:-}"; shift || true
131
+ [ -n "$id" ] || { printf 'error: add needs a plugin id\nhelp: bin/omarchy-plugins.sh list\n' >&2; exit 2; }
132
+ [ "${1:-}" = "--yes" ] && YES=1
133
+ have omarchy || { printf 'error: not an Omarchy host (no `omarchy` command)\n' >&2; exit 1; }
134
+ if is_installed "$id"; then
135
+ printf 'omarchy-plugins[1]{id,state}:\n "%s","already installed"\n' "$id"; exit 0
136
+ fi
137
+ # Resolve the repo from the registry catalog; refresh it if absent.
138
+ cache="$ROOT/state/omarchy-catalog.json"
139
+ if [ ! -r "$cache" ] && have curl; then
140
+ mkdir -p "$(dirname "$cache")"
141
+ curl -fsS --max-time 25 https://plugins.omarchy.org/catalog.json -o "$cache" 2>/dev/null || true
142
+ fi
143
+ repo="$(repo_for "$id")"
144
+ if [ -z "$repo" ]; then
145
+ printf 'error: cannot resolve the repository for %s\nhelp: check the id (bin/omarchy-plugins.sh list), or install by repo:\n' "$id" >&2
146
+ printf ' omarchy plugin add <git-url> --enable\n' >&2
147
+ exit 1
148
+ fi
149
+ if [ "$YES" != 1 ]; then
150
+ if [ ! -t 0 ]; then
151
+ printf 'error: refusing to install %s without --yes\nhelp: bin/omarchy-plugins.sh add %s --yes\n' "$id" "$id" >&2
152
+ exit 3
153
+ fi
154
+ printf 'Install %s from %s? It runs unsandboxed inside your Omarchy shell. [y/N] ' "$id" "$repo"
155
+ read -r reply || reply=""
156
+ case "$reply" in y|Y|yes|YES) ;; *) printf 'skipped.\n'; exit 0 ;; esac
157
+ fi
158
+ # Omarchy's own installer demands consent too (`--yes` to it). We already took
159
+ # the Allfather's consent above, so pass it through.
160
+ # Private tempfile (was a predictable /tmp/<name>.$$ path — a symlink/race risk).
161
+ log="$(mktemp)" || { printf 'error: could not create a temp file\n' >&2; exit 1; }
162
+ if omarchy plugin add "$repo" --enable --yes >"$log" 2>&1; then
163
+ rm -f "$log"
164
+ printf 'omarchy-plugins[1]{id,state,repo}:\n "%s","installed","%s"\n' "$id" "$repo"
165
+ else
166
+ printf 'omarchy-plugins[1]{id,state}:\n "%s","install failed"\n' "$id"
167
+ printf 'help: omarchy said:\n' >&2
168
+ tail -5 "$log" >&2 2>/dev/null || true
169
+ rm -f "$log"
170
+ exit 1
171
+ fi
172
+ ;;
173
+ *) printf 'error: unknown action %s\nhelp: bin/omarchy-plugins.sh [list|installed|suggest|add]\n' "$ACTION" >&2; exit 2 ;;
174
+ esac
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env bash
2
+ # omarchy-sense.sh — learn the Allfather's Omarchy machine.
3
+ #
4
+ # Ymir runs on an Omarchy host, and that host changes: packages get installed,
5
+ # configs get edited, Omarchy itself updates. This records what is stable, what
6
+ # changed since the last look, and when Omarchy itself moved — so the agent can
7
+ # help with *this* machine rather than a generic one.
8
+ #
9
+ # It is a sensor, not a fixer: it observes, records, and reports. Nothing on the
10
+ # user's machine is modified.
11
+ #
12
+ # Usage:
13
+ # bin/omarchy-sense.sh observe [--quiet] # record the current state, diff vs last
14
+ # bin/omarchy-sense.sh status # show the latest snapshot + last change
15
+ # bin/omarchy-sense.sh --version
16
+ #
17
+ # State: state/omarchy-setup.json (gitignored — this is per-user, per-machine).
18
+ # Output: Galdr TOON.
19
+ set -u
20
+
21
+ VERSION="1.0.0"
22
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
24
+ STATE_DIR="${BROKK_STATE_OVERRIDE:-$ROOT/state}"
25
+ SNAP="$STATE_DIR/omarchy-setup.json"
26
+
27
+ # Rule 05: this is the OMARCHY layer's sensor, so it is gated on its host. Ymir
28
+ # is Omarchy-first — that layer is first-class — but first is not only: this
29
+ # script observes an Omarchy machine, and on any other host it skips cleanly
30
+ # and points at the portable sensor instead of recording the wrong machine.
31
+ if ! { command -v omarchy >/dev/null 2>&1 || [ -d "$HOME/.local/share/omarchy" ]; }; then
32
+ printf 'omarchy-sense[1]{step,status,detail}:\n'
33
+ printf ' "sensor","SKIP","not an Omarchy host — this layer applies where Omarchy is; run bin/host-sense.sh for THIS machine"\n'
34
+ exit 0
35
+ fi
36
+ QUIET=0
37
+
38
+ case "${1-}" in
39
+ -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
40
+ -h|--help|"") sed -n '2,18p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
41
+ esac
42
+ ACTION="${1:-observe}"; shift || true
43
+ [ "${1:-}" = "--quiet" ] && QUIET=1
44
+
45
+ is_omarchy() { [ -d /usr/share/omarchy ]; }
46
+
47
+ # A stable, comparable fingerprint of the machine. Keep keys short (TOON).
48
+ snapshot() {
49
+ local ov="" pkgs cnf monitors scale wm
50
+ is_omarchy && ov="$(omarchy version 2>/dev/null | head -1)"
51
+ # Explicitly installed packages (the user's own choices, not the base image).
52
+ pkgs="$(pacman -Qe 2>/dev/null | wc -l | tr -d ' ')"
53
+ # The user's config surface: what they have customised.
54
+ cnf="$(find "$HOME/.config" -maxdepth 3 -type f \
55
+ \( -name '*.lua' -o -name 'shell.json' -o -name '*.conf' -o -name '*.jsonc' \) \
56
+ 2>/dev/null | wc -l | tr -d ' ')"
57
+ monitors="$(hyprctl monitors -j 2>/dev/null \
58
+ | python3 -c 'import json,sys
59
+ try:
60
+ m=json.load(sys.stdin); print(len(m))
61
+ except Exception: print(0)' 2>/dev/null || echo 0)"
62
+ scale="$(hyprctl monitors -j 2>/dev/null \
63
+ | python3 -c 'import json,sys
64
+ try:
65
+ m=json.load(sys.stdin); print(m[0].get("scale") if m else 0)
66
+ except Exception: print(0)' 2>/dev/null || echo 0)"
67
+ wm="${XDG_CURRENT_DESKTOP:-unknown}"
68
+ python3 - "$ov" "$pkgs" "$cnf" "$monitors" "$scale" "$wm" <<'PY'
69
+ import json, sys
70
+ ov, pkgs, cnf, monitors, scale, wm = sys.argv[1:7]
71
+ print(json.dumps({
72
+ "omarchy": ov,
73
+ "explicit_pkgs": int(pkgs or 0),
74
+ "config_files": int(cnf or 0),
75
+ "monitors": int(monitors or 0),
76
+ "scale": scale,
77
+ "wm": wm,
78
+ }, sort_keys=True))
79
+ PY
80
+ }
81
+
82
+ observe() {
83
+ mkdir -p "$STATE_DIR"
84
+ local now; now="$(snapshot)"
85
+ local prev="{}"
86
+ [ -r "$SNAP" ] && prev="$(cat "$SNAP")"
87
+
88
+ # Diff the scalars that matter, so we can report what the user changed.
89
+ local report
90
+ report="$(python3 - "$prev" "$now" <<'PY'
91
+ import json, sys
92
+ prev = json.loads(sys.argv[1] or "{}")
93
+ now = json.loads(sys.argv[2] or "{}")
94
+ keys = ["omarchy", "explicit_pkgs", "config_files", "monitors", "scale", "wm"]
95
+ changes = []
96
+ for k in keys:
97
+ if k in prev and prev[k] != now.get(k):
98
+ changes.append((k, prev[k], now.get(k)))
99
+ print(json.dumps({"changes": changes, "now": now}))
100
+ PY
101
+ )"
102
+ # Persist the new snapshot with a timestamp (the snapshot itself stays comparable).
103
+ python3 - "$SNAP" "$now" <<'PY'
104
+ import json, sys, datetime, os, tempfile
105
+ path, now = sys.argv[1], json.loads(sys.argv[2])
106
+ now["observed_at"] = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
107
+ d = os.path.dirname(path) or "."
108
+ fd, tmp = tempfile.mkstemp(dir=d)
109
+ with os.fdopen(fd, "w") as f:
110
+ json.dump(now, f, indent=2, sort_keys=True)
111
+ os.replace(tmp, path)
112
+ PY
113
+
114
+ [ "$QUIET" = 1 ] && return 0
115
+ printf 'omarchy-sense[1]{omarchy,monitors,scale,configs,pkgs,changes}:\n'
116
+ python3 - "$report" "$SNAP" <<'PY'
117
+ import json, sys
118
+ rep = json.loads(sys.argv[1])
119
+ n = rep["now"]
120
+ ch = rep["changes"]
121
+ print(f' "{n.get("omarchy") or "not-omarchy"}",{n.get("monitors",0)},"{n.get("scale",0)}",'
122
+ f'{n.get("config_files",0)},{n.get("explicit_pkgs",0)},{len(ch)}')
123
+ PY
124
+ python3 - "$report" <<'PY'
125
+ import json, sys
126
+ rep = json.loads(sys.argv[1])
127
+ for k, a, b in rep["changes"]:
128
+ print(f'changed[1]{{field,was,now}}:\n "{k}","{a}","{b}"')
129
+ PY
130
+ }
131
+
132
+ case "$ACTION" in
133
+ observe) observe ;;
134
+ status)
135
+ if [ -r "$SNAP" ]; then
136
+ printf 'omarchy-sense[1]{snapshot}:\n'
137
+ python3 - "$SNAP" <<'PY'
138
+ import json, sys
139
+ d = json.load(open(sys.argv[1]))
140
+ print(f' "{d.get("omarchy") or "not-omarchy"} · monitors={d.get("monitors")} '
141
+ f'scale={d.get("scale")} configs={d.get("config_files")} '
142
+ f'pkgs={d.get("explicit_pkgs")} · seen {d.get("observed_at")}"')
143
+ PY
144
+ else
145
+ printf 'omarchy-sense[1]{snapshot}:\n "none yet — run bin/omarchy-sense.sh observe"\n'
146
+ fi
147
+ ;;
148
+ *) printf 'error: unknown action %s\nhelp: bin/omarchy-sense.sh [observe|status]\n' "$1" >&2; exit 2 ;;
149
+ esac
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env bash
2
+ # perm-guard.sh — flag agent profiles whose permissions are self-defeating.
3
+ # The headline case: a flat `bash: allow` gives a total shell, so any
4
+ # `edit: deny` / `write: deny` on the same agent stops nothing.
5
+ #
6
+ # bin/perm-guard.sh # report (exit 0)
7
+ # bin/perm-guard.sh --strict # exit 1 if any flat bash allowance exists
8
+ set -u
9
+
10
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
12
+ STRICT=0; [ "${1:-}" = "--strict" ] && STRICT=1
13
+
14
+ hits=0
15
+ printf 'perm-guard{agent,issue}:\n'
16
+ for f in "$ROOT"/.agents/agents/*.md; do
17
+ [ -e "$f" ] || continue
18
+ name="$(sed -n 's/^name: *//p' "$f" | head -1)"; [ -n "$name" ] || name="$(basename "$f" .md)"
19
+ if grep -Eq '^ bash: *allow *$' "$f"; then
20
+ if grep -Eq '^ (edit|write): *deny' "$f"; then
21
+ printf ' "%s","flat bash:allow defeats edit/write deny"\n' "$name"
22
+ else
23
+ printf ' "%s","flat bash:allow (total shell)"\n' "$name"
24
+ fi
25
+ hits=$((hits+1))
26
+ fi
27
+ done
28
+ [ "$hits" -gt 0 ] || printf ' "none","all agents use a patterned bash"\n'
29
+ [ "$STRICT" = 1 ] && [ "$hits" -gt 0 ] && exit 1
30
+ exit 0
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env bash
2
+ # pi-agent.sh — run a Ymir agent on a LOCAL model with ITS OWN persona/mission
3
+ # (not Brokk's), loading only the skills it needs. Reusable for users.
4
+ #
5
+ # bin/pi-agent.sh <agent> "<task>"
6
+ # bin/pi-agent.sh hnoss "design a hero" --skill .agents/skills/hnoss-design
7
+ # bin/pi-agent.sh sindri "fix the bug" -m qwen3.6-35b-q4_k_s
8
+ #
9
+ # It loads the agent's canonical profile body as the system prompt, disables the
10
+ # root AGENTS.md / global skills / Ymir persona, and adds the agent's own skill
11
+ # (if it has one) plus any --skill paths. Local models run one at a time — see
12
+ # bin/local-model-lock.sh.
13
+ set -u
14
+
15
+ VERSION="1.0.0"
16
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
17
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
18
+ PROVIDER="${PI_LOCAL_PROVIDER:-llama-cpp}"
19
+ MODEL="${PI_LOCAL_MODEL:-frontend-design-expert-8b@q4_k_m}"
20
+ AGENT=""; TASK=""; SKILLS=()
21
+
22
+ case "${1-}" in -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
23
+ -h|--help|"") sed -n '2,10p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; esac
24
+
25
+ [ $# -gt 0 ] || { printf 'error: usage: bin/pi-agent.sh <agent> "<task>"\n' >&2; exit 2; }
26
+ AGENT="$1"; shift
27
+ while [ $# -gt 0 ]; do
28
+ case "$1" in
29
+ -m|--model) MODEL=${2-}; shift 2 ;;
30
+ -p|--provider) PROVIDER=${2-}; shift 2 ;;
31
+ --skill) SKILLS+=("${2-}"); shift 2 ;;
32
+ *) TASK="$TASK${TASK:+ }$1"; shift ;;
33
+ esac
34
+ done
35
+ [ -n "$TASK" ] || { printf 'error: %s needs a task\n' "$AGENT" >&2; exit 2; }
36
+
37
+ # 1. the agent's canonical profile (persona + mission) by `name:`.
38
+ PROFILE=""
39
+ for f in "$ROOT"/.agents/agents/*.md; do
40
+ [ -e "$f" ] || continue
41
+ grep -qx "name: $AGENT" "$f" && { PROFILE="$f"; break; }
42
+ done
43
+ [ -n "$PROFILE" ] || { printf 'error: no profile named %s\nhelp: bin/agents-config.sh show\n' "$AGENT" >&2; exit 1; }
44
+
45
+ # 2. persona = the profile body (everything after the frontmatter).
46
+ PERSONA="$(python3 - "$PROFILE" <<'PY'
47
+ import sys
48
+ t = open(sys.argv[1]).read()
49
+ parts = t.split("---")
50
+ print("---".join(parts[2:]).strip() if len(parts) >= 3 else t)
51
+ PY
52
+ )"
53
+
54
+ # 3. the agent's own skill, if it has one (folder is now figure-function,
55
+ # e.g. hnoss-design), plus any explicit --skill.
56
+ for sk in "$ROOT/.agents/skills/$AGENT" "$ROOT"/.agents/skills/"$AGENT"-*; do
57
+ [ -f "$sk/SKILL.md" ] && { SKILLS+=("$sk"); break; }
58
+ done
59
+
60
+ command -v pi >/dev/null 2>&1 || { printf 'error: pi is not on PATH\n' >&2; exit 1; }
61
+
62
+ args=(--print --no-context-files --no-skills --system-prompt "$PERSONA" --model "$PROVIDER/$MODEL")
63
+ for s in "${SKILLS[@]:-}"; do [ -n "$s" ] && args+=(--skill "$s"); done
64
+
65
+ printf 'pi-agent[1]{agent,provider,model,skills}:\n "%s","%s","%s","%s"\n' \
66
+ "$AGENT" "$PROVIDER" "$MODEL" "$(IFS=,; echo "${SKILLS[*]:-none}")" >&2
67
+ # Local inference is serialized per host (one model at a time by default).
68
+ exec "$SCRIPT_DIR/local-model-lock.sh" pi "${args[@]}" "$TASK"
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env bash
2
+ # pi-ensure.sh — ensure the Pi coding agent and the Ymir-required Pi packages.
3
+ #
4
+ # Pi has no native MCP, no native web access, and no built-in local-model bridge:
5
+ # those arrive as Pi packages. This guarantees the three Ymir depends on:
6
+ # npm:pi-mcp-adapter — MCP servers (from mcp.json: a2abridge, engram)
7
+ # npm:pi-web-access — web fetch/search tools
8
+ # npm:pi-lmstudio — LM Studio / local model provider
9
+ #
10
+ # Usage:
11
+ # pi-ensure.sh status # pi + which packages are present
12
+ # pi-ensure.sh ensure [--install]
13
+ # pi-ensure.sh install
14
+ # pi-ensure.sh --version
15
+ set -u
16
+
17
+ VERSION="1.0.0"
18
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
+ ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
20
+ SETTINGS="${PI_SETTINGS:-$HOME/.pi/agent/settings.json}"
21
+ REQUIRED=(pi-mcp-adapter pi-web-access pi-lmstudio)
22
+
23
+ CMD="status"; INSTALL=0
24
+ case "${1-}" in -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;; -h|--help|"") sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; esac
25
+ case "$1" in status|ensure|install) CMD=$1; shift ;; *) printf 'error: unknown command %s\nhelp: pi-ensure.sh [status|ensure|install]\n' "$1" >&2; exit 2 ;; esac
26
+ while [ $# -gt 0 ]; do case "$1" in --install) INSTALL=1; shift ;; *) shift ;; esac; done
27
+ [ "$CMD" = install ] && INSTALL=1
28
+
29
+ have() { command -v "$1" >/dev/null 2>&1; }
30
+ pi_bin() { command -v pi 2>/dev/null || true; }
31
+ pkg_present() { grep -q "npm:$1" "$SETTINGS" 2>/dev/null; }
32
+
33
+ install_pi() {
34
+ have pi && return 0
35
+ if have mise; then
36
+ mise install pi@latest >/dev/null 2>&1 || mise use -g pi@latest >/dev/null 2>&1 || true
37
+ fi
38
+ have pi
39
+ }
40
+
41
+ install_pkgs() {
42
+ local p
43
+ have pi || return 1
44
+ for p in "${REQUIRED[@]}"; do
45
+ pkg_present "$p" && continue
46
+ pi install "npm:$p" >/dev/null 2>&1 || true
47
+ done
48
+ return 0
49
+ }
50
+
51
+ report() {
52
+ local bin ver p rows="" missing=0
53
+ bin="$(pi_bin)"; ver="$(pi --version 2>/dev/null | head -1)"
54
+ printf 'pi[1]{bin,version}:\n "%s","%s"\n' "${bin:-none}" "${ver:-none}"
55
+ for p in "${REQUIRED[@]}"; do
56
+ if pkg_present "$p"; then rows="${rows} \"${p}\",\"present\"\n"; else rows="${rows} \"${p}\",\"absent\"\n"; missing=$((missing+1)); fi
57
+ done
58
+ printf 'pi-packages[%d]{package,state}:\n' "${#REQUIRED[@]}"
59
+ printf '%b' "$rows"
60
+ return "$missing"
61
+ }
62
+
63
+ case "$CMD" in
64
+ status)
65
+ report || exit 1
66
+ ;;
67
+ ensure)
68
+ if ! have pi && [ "$INSTALL" = 1 ]; then install_pi || true; fi
69
+ if have pi && [ "$INSTALL" = 1 ]; then install_pkgs || true; fi
70
+ if report; then exit 0; else exit 1; fi
71
+ ;;
72
+ install)
73
+ install_pi || { printf 'error: pi could not be installed (need mise or npm)\n' >&2; exit 1; }
74
+ install_pkgs
75
+ report && exit 0 || exit 1
76
+ ;;
77
+ esac