@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.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/README.md +74 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +360 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +11 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +121 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +159 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +736 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +539 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +101 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +180 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +503 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +90 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +57 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +35 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/install.md +69 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +498 -0
- package/CHANGELOG.md +1913 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +114 -60
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +97 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +108 -0
- package/RULES/07-config.md +101 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/09-electron.md +58 -0
- package/RULES/README.md +22 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +133 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +256 -0
- package/bin/apodex-smoke-test.sh +105 -0
- package/bin/bifrost-bridge.sh +131 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +112 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +51 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-assemble.sh +154 -0
- package/bin/changelog-guard.sh +197 -0
- package/bin/crash-sense.sh +173 -0
- package/bin/design-check.sh +80 -0
- package/bin/design-icon.sh +153 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +225 -0
- package/bin/eindri-acclaim.sh +47 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seat.sh +83 -0
- package/bin/eindri-seen.sh +54 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +98 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +158 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/feature-inventory.sh +73 -0
- package/bin/fleet-apply.sh +81 -0
- package/bin/github-deploy.sh +94 -0
- package/bin/gjallarhorn-expose.sh +136 -0
- package/bin/gjallarhorn-notify.sh +71 -0
- package/bin/gjallarhorn-purge.sh +67 -0
- package/bin/gjallarhorn-tunnel.sh +85 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +130 -0
- package/bin/hall-snapshot.sh +111 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +452 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hlidskjalf-agents.sh +172 -0
- package/bin/hlidskjalf-usage.sh +196 -0
- package/bin/hoard-guard.sh +135 -0
- package/bin/hoard-lib.sh +105 -0
- package/bin/hodd.sh +102 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +121 -0
- package/bin/local-model-lock.sh +70 -0
- package/bin/mimir-bridge.py +259 -0
- package/bin/mimir-bridge.sh +100 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir-reflect.sh +27 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +72 -0
- package/bin/mjollnir.sh +104 -0
- package/bin/model-hardware.sh +96 -0
- package/bin/model-resolve.sh +160 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-hall-snapshot.sh +28 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-nsr-compliance.sh +54 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/npm-publish.sh +136 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +161 -0
- package/bin/omarchy-plugins.sh +187 -0
- package/bin/omarchy-sense.sh +162 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-model-agnostic.sh +71 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +58 -0
- package/bin/project-git.sh +69 -0
- package/bin/public-guard.sh +71 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +104 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +94 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +89 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-spawn-pretool-check.sh +58 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +203 -0
- package/bin/telegram-bot.sh +82 -0
- package/bin/toolchain.sh +74 -0
- package/bin/ui-truth-check.sh +75 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +298 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +60 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +163 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +806 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-plan.sh +356 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +110 -0
- package/bin/ymir-setup-auth.sh +119 -0
- package/bin/ymir-validate.sh +193 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1060 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +54 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +269 -0
- package/scripts/lower.sh +34 -0
- package/scripts/raise.sh +42 -0
- package/scripts/start.sh +217 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,763 @@
|
|
|
1
|
+
# Installation & First Setup — stand the whole system up
|
|
2
|
+
|
|
3
|
+
> **Purpose:** Everything Galdr must know to install, provision, and repair
|
|
4
|
+
> Ymir for an operator who does not have it. The code is authoritative; this
|
|
5
|
+
> page is the map.
|
|
6
|
+
|
|
7
|
+
One command sets up the whole system for the user; it self-heals what it can and
|
|
8
|
+
reports what it cannot. It **asks for consent first** — with a plan it computes on
|
|
9
|
+
this host, not a recited paragraph — and it **validates at the end** that what it
|
|
10
|
+
claims is actually running.
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
bin/ymir-install.sh # the first setup (idempotent; asks to proceed)
|
|
14
|
+
bin/ymir-install.sh --plan # the plan, probed — changes nothing (--json too)
|
|
15
|
+
bin/ymir-install.sh --check # report only, no writes, no prompt
|
|
16
|
+
bin/ymir-install.sh --yes # non-interactive (accept the plan)
|
|
17
|
+
bin/ymir-install.sh --skip-engines --skip-services
|
|
18
|
+
bin/ymir-install.sh --no-desktop # don't open the desktop apps at the end
|
|
19
|
+
bin/ymir-install.sh --status # alias of --check
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## The plan comes first — `bin/ymir-plan.sh`
|
|
23
|
+
|
|
24
|
+
The consent a real install asks for is a **computed plan**, one row per step, each
|
|
25
|
+
carrying its state and the reason for it. A hardcoded paragraph cannot know the
|
|
26
|
+
host: the old one named an Omarchy version on a Mac, promised a workspace tree that
|
|
27
|
+
already stood, and never mentioned that no application had been installed at all.
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
bin/ymir-plan.sh # the plan (TOON)
|
|
31
|
+
bin/ymir-plan.sh --json # the same, for automation
|
|
32
|
+
bin/ymir-plan.sh --phase 5 # one phase
|
|
33
|
+
bin/ymir-plan.sh --blocked # only what cannot proceed, and why
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
plan_states[5]{state,means}:
|
|
38
|
+
"DO","a change will be made"
|
|
39
|
+
"SKIP","already satisfied — nothing to do"
|
|
40
|
+
"INFO","a fact about this host, discovered; no change implied"
|
|
41
|
+
"BLOCKED","cannot run — the reason names what is missing"
|
|
42
|
+
"CONSENT","needs the operator's word (a credential, an invite, the shells)"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
plan_phases[9]{n,name,gate}:
|
|
47
|
+
"0","resolve","this host, the container engine, the code root, and the home"
|
|
48
|
+
"1","code","the tree is intact — and holds nothing of the operator's"
|
|
49
|
+
"2","home","the operator's world, outside the tree"
|
|
50
|
+
"3","runtimes","git/python3 · bun/uv/mcp<2> · pi · hermes · the terminal backend"
|
|
51
|
+
"4","engines","treehouse · no-mistakes · sandcastle · the Utgard image"
|
|
52
|
+
"5","apps","hlidskjalf · odrerir · sessrumnir · smidja — web build required, shell gated"
|
|
53
|
+
"6","wire","the way in (auth · invite) and the launcher entries"
|
|
54
|
+
"7","raise","every port listening, then the desktop apps"
|
|
55
|
+
"8","verify","what stands, honestly"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`ymir-install.sh` prints the plan at the consent prompt; `--plan`/`--dry-run` prints
|
|
59
|
+
it and exits without writing. The plan is recomputed on every run, so it cannot
|
|
60
|
+
drift behind the code the way a paragraph did. `bin/ymir-plan.sh` is the ward for
|
|
61
|
+
the law below: its phase-1 `purity` row names any of the operator's things found in
|
|
62
|
+
the code tree.
|
|
63
|
+
|
|
64
|
+
## Where things live — the package is code, the home is the operator's
|
|
65
|
+
|
|
66
|
+
**Law (Rule 04):** the package carries the **core systems** — everything needed to
|
|
67
|
+
run the programs. Everything the **operator** owns goes to `$YMIR_HOME`: their
|
|
68
|
+
info, their records, their documents, their settings, their state, their
|
|
69
|
+
credentials. A packaged install (npm) treats its tree as read-only; the next
|
|
70
|
+
upgrade replaces it, so anything of theirs kept there is kept at its peril.
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
roots[5]{root,resolves_from,holds}:
|
|
74
|
+
"ymir_home_root","$YMIR_HOME → the choice recorded at installation → one documented default","everything private the operator owns"
|
|
75
|
+
"hoard_root","$YMIR_HOARD → <home>/hodd","docs · secrets · identity · tenants · memory"
|
|
76
|
+
"hoard_data_dir","$YMIR_DATA_DIR → <hoard>/data","this machine's records: operator, fleet, machines, the host profile"
|
|
77
|
+
"hoard_state_dir","$YMIR_STATE_DIR → <home>/state","runtime state: pids, logs, locks, caches"
|
|
78
|
+
"hoard_settings_dir","$YMIR_SETTINGS_DIR → <home>/config","settings: agents.yaml, cron.yaml, tailscale-sync, the wedge channel"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Plus `hoard_local_env` → `$YMIR_HOME/.env.local`: the operator's **credentials**
|
|
82
|
+
(`HLIDSKJALF_AUTH`, OAuth keys, tokens), never in the tree.
|
|
83
|
+
|
|
84
|
+
**The home is chosen, not assumed.** A real interactive install asks once
|
|
85
|
+
(`step_home`), records the answer as machine state under `~/.config/ymir/home`
|
|
86
|
+
(the same place `engram-python` and `accounts.json` live), and every later script
|
|
87
|
+
resolves it through `bin/hoard-lib.sh`. `--check` never writes; `--yes` takes what
|
|
88
|
+
is recorded, else the documented default.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
bin/hoard-lib.sh # the lib (source-safe; functions only)
|
|
92
|
+
ymir_home_root HOME # → the home
|
|
93
|
+
hoard_settings_dir SETTINGS # → <home>/config
|
|
94
|
+
hoard_local_env ENVFILE # → <home>/.env.local
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Rule for new code:** never write `$ROOT/data`, `$ROOT/state`, `$ROOT/config`,
|
|
98
|
+
`$ROOT/.env.local` or `$ROOT/workspace`. Resolve the root through the lib. A script
|
|
99
|
+
that points an operator's thing into the tree is the bug the `purity` row exists to
|
|
100
|
+
catch.
|
|
101
|
+
|
|
102
|
+
### Carrying an existing tree home — migration 0005
|
|
103
|
+
|
|
104
|
+
Every *writer* resolves the home now, but an installation made before this change
|
|
105
|
+
still holds the operator's things in the tree. `.agents/migrations/0005-roots-out-of-tree.sh`
|
|
106
|
+
carries them:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
what moves from to
|
|
110
|
+
------------------ --------------------- ----------------------------
|
|
111
|
+
this machine's data/ <hoard>/data
|
|
112
|
+
records
|
|
113
|
+
runtime state state/ <home>/state
|
|
114
|
+
(pids · logs · (including the (running services keep their open
|
|
115
|
+
locks · the applied-migrations fds across the move — `mv` keeps
|
|
116
|
+
applied-marker) marker) the inode)
|
|
117
|
+
credentials the local env file $YMIR_HOME/.env.local (0600)
|
|
118
|
+
settings .agents/config/* <home>/config
|
|
119
|
+
that git does NOT track
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
One name, two files — the migration decides by evidence, never by assumption:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
collision[3]{case,what_happens,nothing_lost}:
|
|
126
|
+
"identical content","the tree's copy is removed","the content is provably at home already"
|
|
127
|
+
"different content","the home's keeps the name; the tree's is carried beside it as <name>.stale-<UTC>","both are real, so both are kept — never merged, never discarded"
|
|
128
|
+
"not a plain file","left in place and reported","a directory is not silently swallowed"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Templates and defaults never move: `*.example` (and `*.example.*`), `.gitkeep`, and
|
|
132
|
+
any settings file **git tracks** — that is the distro's shipped default, not the
|
|
133
|
+
operator's. The plan's `purity` row applies the same rule, asking git about the
|
|
134
|
+
real path (the tree's `config` is a symlink into `.agents/config`, and git tracks
|
|
135
|
+
what the index holds, not the link). Idempotent: a second run changes nothing.
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
bin/ymir-migrate.sh status # pending / applied
|
|
139
|
+
bin/ymir-migrate.sh apply --dry-run # name the migration, touch nothing
|
|
140
|
+
bin/ymir-migrate.sh apply # carry it
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Stop the runtime first if you want no stale pid files; nothing is lost either way.
|
|
144
|
+
|
|
145
|
+
## The app packages — how the four surfaces arrive
|
|
146
|
+
|
|
147
|
+
The distro depends on the surfaces as their own npm packages, so one
|
|
148
|
+
`npm install -g @zerwiz/ymir` fetches them into the tree:
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
app_packages[4]{package,repo,what}:
|
|
152
|
+
"@zerwiz/hlidskjalf","zerwiz/hlidskjalf","the control plane — dist/ ships built, served on :3888"
|
|
153
|
+
"@zerwiz/odrerir","zerwiz/odrerir","the live hall — dist/ ships built"
|
|
154
|
+
"@zerwiz/sessrumnir","zerwiz/sessrumnir","the seat-hall desktop — out/ ships built (a fork of pi-desktop)"
|
|
155
|
+
"@zerwiz/smidja-factory","zerwiz/smidja","the smithy and its visualizer — the factory plus the UI's source, built at install"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
They are **optionalDependencies**, deliberately: a broken app package must never
|
|
159
|
+
stop the CORE from installing, and a package not yet on the registry is skipped by
|
|
160
|
+
npm and starts arriving the moment it is published. The plan's phase-5 rows report
|
|
161
|
+
each surface separately — installed, declared-but-not-fetched, or no package at all
|
|
162
|
+
— so a silent skip cannot hide.
|
|
163
|
+
|
|
164
|
+
A global install nests them under the distro's own `node_modules`
|
|
165
|
+
(`<prefix>/lib/node_modules/@zerwiz/ymir/node_modules/@zerwiz/<app>`); a local one
|
|
166
|
+
hoists them to `node_modules/@zerwiz/<app>`. The plan checks both shapes.
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
bin/npm-publish.sh # the platform only
|
|
170
|
+
bin/npm-publish.sh --all # the platform + every app package
|
|
171
|
+
bin/npm-publish.sh --dry-run --all # what would go out, and from where
|
|
172
|
+
bin/npm-publish.sh --unpublish @zerwiz/ymir@0.1.5 # take ONE version back
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**A version can be taken back, and the window is short.** npm permits unpublishing
|
|
176
|
+
**one version for 72 hours** after it was published; past that it is npm support's
|
|
177
|
+
door. So `--unpublish` demands a spec that names the version — never a bare name —
|
|
178
|
+
and the row says where the CDN may still serve the tarball for a while afterwards.
|
|
179
|
+
Publishing a newer version is the other half of the repair: it moves the `latest`
|
|
180
|
+
tag off the bad build at once, even before the removal propagates.
|
|
181
|
+
|
|
182
|
+
**A `files[]` entry that names a directory overrides `.gitignore`.** This is how
|
|
183
|
+
`@zerwiz/ymir@0.1.5` shipped the memory well: `files: [".agents/"]` packed that
|
|
184
|
+
subtree *including* the gitignored stores, and the repo stayed clean while the
|
|
185
|
+
artefact did not. Name what ships, exclude what must not, and prove it with
|
|
186
|
+
`npm pack --dry-run` — the repo's cleanliness says nothing about the tarball.
|
|
187
|
+
|
|
188
|
+
The app repos are cloned into `apps/` by the install's `apps` step (from the
|
|
189
|
+
registry's `repo: apps/<path>` blocks), which is where `--all` reads their
|
|
190
|
+
manifests. The token comes from the hoard, never from `~/.npmrc`.
|
|
191
|
+
|
|
192
|
+
## The steps
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
install[23]{step,what,self-heals}:
|
|
196
|
+
"panes","the run shown in a herdr pane","bin/herdr-run.sh sits a pane beside the caller when inside herdr; inline otherwise — a pane that cannot be raised never loses the work"
|
|
197
|
+
"prereqs","git python3 bun docker|podman gh · mcp<2","bin/prereq-ensure.sh installs bun+uv+mcp in user space; engram is an honest optional SKIP"
|
|
198
|
+
"memory-well","the engram engine (Mimirsbrunn)","optional; reported with the exact next command, never a fake fix"
|
|
199
|
+
"home","the home the operator CHOOSES, recorded under ~/.config/ymir/home","asks once, records the answer; --check never writes, --yes takes what is recorded, else the documented default"
|
|
200
|
+
"tree","workspace/{work,personal}/<domains>, companies/, workspaces.yaml, projects.yaml, and the hoard OUTSIDE the repo (secrets/ · docs/ · identity/ · tenants/ at the hoard root under the chosen home)","creates if missing; hoard_root resolves through bin/hoard-lib.sh so no script can point the hoard inside the checkout (Rule 04), and an empty secrets/platform.env (0600) is seeded so bin/hodd.sh emit resolves"
|
|
201
|
+
"apps","the app repos (the app split) — hlidskjalf · hlidskjalf-mobile · odrerir · sessrumnir · smidja","reads $HOARD/identity/projects.yaml (never guesses a remote); clones a missing apps/<path> from its registered git{} block, fast-forwards a present one, and stamps the smithy engine (apps/smidja) from the cloned factory's templates"
|
|
202
|
+
"engines","treehouse · sandcastle · no-mistakes","installs treehouse + no-mistakes from their installers"
|
|
203
|
+
"hermes","the Nous Research agent runtime","installs via bin/hermes-ensure.sh when absent"
|
|
204
|
+
"sessrumnir","the Sessrúmnir desktop GUI (its own repo; lands via the `apps` step at apps/sessrumnir)","bin/sessrumnir-ensure.sh installs deps + builds on first run (deps are never committed); launch via bin/sessrumnir.sh"
|
|
205
|
+
"backend","Þjazi — herdr (protocol 14+) or tmux","bin/herdr-ensure.sh detects/tests version, installs via the pinned installer or falls back to tmux"
|
|
206
|
+
"host","this machine — sensed on EVERY host","bin/host-sense.sh senses the setup on ANY host (Rule 05); the Omarchy layer then RECORDS it (bin/omarchy-sense.sh observe), places the apps (bin/desktop-place.sh), installs the post-update hook and the wedge-alarm channel, and (on Omarchy) offers the suggested shell plugins — listed, never installed unbidden; seeds the private config/agents.yaml from its example"
|
|
207
|
+
"sandbox","utgard-runner:latest image","builds via bin/utgard.sh build on Docker or rootless Podman; distinguishes an unreachable engine from a build failure"
|
|
208
|
+
"memory","engram store + harness MCP registrations","raises the bridge; reports MCP coverage"
|
|
209
|
+
"smidja","smidja/smidja_data/smidja.db","bin/smidja-bootstrap.sh creates it from the tracer schema + a bootstrap session"
|
|
210
|
+
"visualizer","the Smíðja visualizer UI (Vue, served on :8437)","builds ./dist with bun when absent — the API serves the UI from dist, and without it the API answers but shows no interface"
|
|
211
|
+
"loaders","agents/skills into the harnesses","runs bin/valknut-load.sh"
|
|
212
|
+
"gates","the git delivery gates — secret-guard (pre-commit), branch-guard + changelog-guard (pre-push)","bin/secret-guard.sh --install and bin/changelog-guard.sh --install seat the versioned guards into .git/hooks, so the gate is live from the first commit of a fresh clone; idempotent"
|
|
213
|
+
"marks","each app's rune icon + .desktop entry into the operator's own desktop, and the Ymir contract into pi's agent home","bin/design-icon.sh mint --all + install writes to $HOME/.local/share (never a session sandbox), so every app is dockable and pinnable; the contract symlink means every pi session, in ANY folder, loads Brokk"
|
|
214
|
+
"invite","the way in for anyone else — an invite code","bin/ymir-invite.sh ensure mints one only when nothing is live, so the step is idempotent; the code is printed at the end of the run and again in workspace/INSTALL.md"
|
|
215
|
+
"register","workspace/INSTALL.md","writes the record"
|
|
216
|
+
"services","gate API, SPA, Nornir, bridges, visualizer","raises via scripts/start.sh (which builds the visualizer UI when ./dist is absent)"
|
|
217
|
+
"desktop","Hlidskjalf + Smíðja desktop apps","bin/desktop-place.sh puts each on its OWN numbered desktop (preferring EMPTY ones); scripts/electron.sh start --both self-heals the Electron binary"
|
|
218
|
+
"validate","the running system","bin/ymir-validate.sh — live port/store/process checks"
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**25** `step_*` functions are defined (`home` asks, `tree` builds). A step is not a row: one step may emit
|
|
222
|
+
several. `prereqs` also emits `memory-well`, `host` also emits `agents-config`,
|
|
223
|
+
`smidja` also emits `visualizer`, and `spa` also emits `hlidskjalf`. `--check`
|
|
224
|
+
skips the runtime-only steps (`services`, `desktop`, `validate`), which have
|
|
225
|
+
nothing to report when the runtime is not raised, so a real run prints those
|
|
226
|
+
three in addition. The exact set is whatever the host honestly has — never
|
|
227
|
+
assume the count:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
bash bin/ymir-install.sh --check | grep -cE '^ "' # the honest count, on your host
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Configuration is never hardcoded (Rule 07)
|
|
234
|
+
|
|
235
|
+
Every port, host, endpoint, path, and credential is resolved from env/config with
|
|
236
|
+
**one documented default** — never a literal in shipped runtime. Ports read
|
|
237
|
+
`HLIDSKJALF_PORT` / `HLIDSKJALF_API_PORT` / `SMIDJA_VIZ_API_PORT`, the SPA bind
|
|
238
|
+
host reads `HLIDSKJALF_HOST`, and a deployment overrides them in its env file
|
|
239
|
+
(Quadlet/Compose), never by patching the core. Law: `RULES/07-config.md`.
|
|
240
|
+
|
|
241
|
+
## Container engine: Docker **or** rootless Podman
|
|
242
|
+
|
|
243
|
+
The core never assumes an engine binary. `bin/ymir-platform.sh` resolves whichever
|
|
244
|
+
this host can reach (`YMIR_CONTAINER_ENGINE` forces one) and exposes:
|
|
245
|
+
|
|
246
|
+
- `ymir_container_engine` / `ymir_container_engine_name` — `docker` or `podman`.
|
|
247
|
+
- `ymir_engine_is_podman` — true even when a `docker` binary fronts Podman (the
|
|
248
|
+
podman-docker shim).
|
|
249
|
+
- `ymir_volume_suffix` — `:Z` whenever SELinux is enforcing (Docker and Podman
|
|
250
|
+
both need the relabel), else empty.
|
|
251
|
+
- `ymir_rootless_podman` — rootless Podman needs `--userns=keep-id` so a bind
|
|
252
|
+
mount lands owned by the invoking user.
|
|
253
|
+
|
|
254
|
+
`bin/utgard.sh`, `bin/einherjar-spawn.sh`, `bin/valhalla.sh`, `bin/ymir-validate.sh`,
|
|
255
|
+
this installer, and `bin/prereq-ensure.sh` all use these; none names an engine
|
|
256
|
+
directly. **Quadlet**-managed containers (Podman + systemd) surface as
|
|
257
|
+
`systemd --user` units, which the process hall lists. A host-managed deployment
|
|
258
|
+
layer (Quadlet, compose, bare) sits **over** this agnostic core — never inside it.
|
|
259
|
+
|
|
260
|
+
## The visualizer UI
|
|
261
|
+
|
|
262
|
+
The Smíðja visualizer **API** runs on `:8437` and serves its **UI** from
|
|
263
|
+
`apps/visualizer/dist`. A fresh clone has no `dist`, so the API answers but shows
|
|
264
|
+
"No ./dist build found" — an install gap. The installer (and `scripts/start.sh`)
|
|
265
|
+
now build it when absent:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
(cd .agents/skills/smidja-factory/apps/visualizer && bun run build) # vue-tsc + vite
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
`bin/ymir-validate.sh` reports `visualizer` FAIL when `./dist` is missing **and**
|
|
272
|
+
when the build exists but nothing is listening on `:8437`. A PASS means the UI is
|
|
273
|
+
built *and* the API is up — so a built-but-dead visualizer (a bad `CMD_DB`, a
|
|
274
|
+
crashed API) can no longer read as green.
|
|
275
|
+
|
|
276
|
+
## Desktop placement (Omarchy desktops, not monitors)
|
|
277
|
+
|
|
278
|
+
On Omarchy the numbered **desktops** (1 2 3 4 5 …) are the "screens" an operator
|
|
279
|
+
switches between. `bin/desktop-place.sh` gives each Ymir app its **own** desktop,
|
|
280
|
+
**preferring an empty one**, so the apps open separated and reachable with
|
|
281
|
+
`Super+<n>` rather than stacking on the active desktop.
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
bin/desktop-place.sh plan # which desktop each app would take
|
|
285
|
+
bin/desktop-place.sh apply # write the rules + hyprctl reload
|
|
286
|
+
bin/desktop-place.sh status # what is installed
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
It writes `~/.config/hypr/ymir-desktops.lua` using Omarchy's own idiom —
|
|
290
|
+
`o.window({ class = "^ymir-hlidskjalf$" }, { workspace = "2" })` — and adds one
|
|
291
|
+
`require("hypr.ymir-desktops")` line to the user's `hyprland.lua`. It **never**
|
|
292
|
+
touches `/usr/share/omarchy/`. Verify with `hyprctl configerrors` (must be empty).
|
|
293
|
+
On a non-Omarchy host the step is a clean SKIP.
|
|
294
|
+
|
|
295
|
+
## The Þjazi backend (herdr-first)
|
|
296
|
+
|
|
297
|
+
Ymir spawns agents into terminal panes, so a terminal backend must exist. Ymir is
|
|
298
|
+
**herdr-first**: `herdr` (Þjazi) is preferred, `tmux` is the accepted reference
|
|
299
|
+
backend, and a missing backend is reported — never a silent fallback.
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
backend_priority[3]{rank,backend,note}:
|
|
303
|
+
"1","herdr","preferred; protocol 14+ for panes, 0.8.0+ for presentation spaces"
|
|
304
|
+
"2","tmux","verified reference backend; always acceptable"
|
|
305
|
+
"3","none","spawn is refused with a plain reason"
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
```
|
|
309
|
+
bin/herdr-ensure.sh status # what is present, and does it meet the floor
|
|
310
|
+
bin/herdr-ensure.sh ensure --install # install via the pinned, SHA-verified installer
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
`ensure` installs through `.agents/backend/fm-install-herdr.sh` (exact version +
|
|
314
|
+
protocol check), and falls back to reporting `tmux` when herdr cannot be fetched.
|
|
315
|
+
Selection order for the running system: `config/backend` → `BROKK_BACKEND` →
|
|
316
|
+
`HERDR_ENV=1` → else tmux. Full reference: the `ymir` skill, `assets/thjazi.md`.
|
|
317
|
+
|
|
318
|
+
## Suggested Omarchy plugins (offered, never forced)
|
|
319
|
+
|
|
320
|
+
Omarchy's shell is plugin-shaped, and a few registry plugins are Ymir's own organs
|
|
321
|
+
rendered on the desktop. `bin/omarchy-plugins.sh` suggests them and installs only
|
|
322
|
+
what the Allfather accepts.
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
bin/omarchy-plugins.sh list # what Ymir suggests, and why
|
|
326
|
+
bin/omarchy-plugins.sh installed # reads omarchy's own plugin list
|
|
327
|
+
bin/omarchy-plugins.sh suggest # the offer (no install)
|
|
328
|
+
bin/omarchy-plugins.sh add <id> # install one, with consent
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
The core three are Ymir's organs: **Herdr Watch** (Þjazi in the bar), **Hermes
|
|
332
|
+
Deck** (our worker runtime), **Skill Manager** (the Galdr family across harnesses).
|
|
333
|
+
Installation uses Omarchy's own verb — `omarchy plugin add <repo> --enable` — never
|
|
334
|
+
a raw clone.
|
|
335
|
+
|
|
336
|
+
**These run unsandboxed inside the shell.** The registry "validates listings, not
|
|
337
|
+
plugin security", so nothing installs without an explicit yes (`--yes` for
|
|
338
|
+
non-interactive callers; without it a non-interactive `add` refuses with exit 3).
|
|
339
|
+
The installer only *offers*.
|
|
340
|
+
|
|
341
|
+
## Consent
|
|
342
|
+
A real install prints **the plan it computed** (`bin/ymir-plan.sh`) and waits for
|
|
343
|
+
`[y/N]`. Declining changes nothing (exit 3). `--check` and `--plan` never prompt.
|
|
344
|
+
A non-interactive caller without `--yes` is refused rather than silently
|
|
345
|
+
proceeding.
|
|
346
|
+
|
|
347
|
+
The plan names every step with its state and the reason for it — including the
|
|
348
|
+
home the operator is asked to choose, the four app surfaces and whether each can
|
|
349
|
+
be installed at all, the terminal backend, and what will be skipped and why. The
|
|
350
|
+
state vocabulary is `DO · SKIP · INFO · BLOCKED · CONSENT`.
|
|
351
|
+
|
|
352
|
+
`--check` writes nothing — and that includes the migrations. `bin/ymir-migrate.sh
|
|
353
|
+
apply` **moves private data**, so the step chain runs it only on a real run;
|
|
354
|
+
a preview leaves the home exactly as it found it. (It used to apply them even
|
|
355
|
+
under `--check`, which moved a home during a "report only" pass.)
|
|
356
|
+
|
|
357
|
+
## The operator's way in (auth) — `bin/ymir-setup-auth.sh`
|
|
358
|
+
|
|
359
|
+
A fresh checkout seeds **no credential**, so the gate has no way in until the
|
|
360
|
+
operator sets one. `step_auth` (interactive install prompts; `--yes`/non-tty
|
|
361
|
+
defers) covers two doors:
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
bin/ymir-setup-auth.sh status # which door (if any) is configured
|
|
365
|
+
bin/ymir-setup-auth.sh set [--user U] # a local password -> HLIDSKJALF_AUTH in .env.local
|
|
366
|
+
bin/ymir-setup-auth.sh github # GitHub sign-in -> GITHUB_CLIENT_ID + GITHUB_CLIENT_SECRET
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Both write `.env.local` (0600, gitignored); a secret is never printed or put in a
|
|
370
|
+
child process's argv. The gate reads `HLIDSKJALF_AUTH` (`user:pass`) and the
|
|
371
|
+
GitHub OAuth keys (`/api/auth/github`; sign-in names a login but never grants
|
|
372
|
+
access on its own — an account/invite is still required). Restart the gate after
|
|
373
|
+
setting a credential. One login is meant to cover every surface — see the shared
|
|
374
|
+
session below.
|
|
375
|
+
|
|
376
|
+
## Letting someone else in (invites)
|
|
377
|
+
|
|
378
|
+
One operator owns the instance. The installer mints an **invite code**
|
|
379
|
+
(`step_invite`) and prints it at the end of the run; share that code and someone
|
|
380
|
+
else can create their own account at the gate login screen. Registration is
|
|
381
|
+
closed unless a live code exists, so an instance is never accidentally open.
|
|
382
|
+
|
|
383
|
+
```bash
|
|
384
|
+
bin/ymir-invite.sh mint [--limit N] # a new code (default ceiling 5 accounts)
|
|
385
|
+
bin/ymir-invite.sh list # every code, what is spent, who is in
|
|
386
|
+
bin/ymir-invite.sh revoke <CODE> # take one back, now
|
|
387
|
+
bin/ymir-invite.sh where # where the accounts live on this machine
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Accounts are stored in `~/.config/ymir/accounts.json` (mode `0600`), machine
|
|
391
|
+
state that never enters the repo, with argon2id hashes only. The operator's own
|
|
392
|
+
credentials stay `HLIDSKJALF_AUTH` in `.env.local` — invites are for everyone
|
|
393
|
+
*else*. Full surface: the galdr `hlidskjalf-ui.md` asset.
|
|
394
|
+
|
|
395
|
+
## Validation
|
|
396
|
+
|
|
397
|
+
After the runtime is up, `bin/ymir-validate.sh` observes the result: prerequisites,
|
|
398
|
+
the Utgard image, the gate API (`:3889`), the SPA (`:3888`), Bifrost (`:4603`),
|
|
399
|
+
Nornir cron, `smidja.db`, the desktop apps, the well (`:4602`), and the audit
|
|
400
|
+
ledger. A FAIL means the install is not usable; a WARN means a documented-optional
|
|
401
|
+
part is off. `--json` for machine consumption.
|
|
402
|
+
|
|
403
|
+
## What the system adopts (engines)
|
|
404
|
+
|
|
405
|
+
| Engine | Norse shell | Role |
|
|
406
|
+
|---|---|---|
|
|
407
|
+
| **treehouse** (`kunchenguid/treehouse`) | Yggdrasil | reusable worktree pool |
|
|
408
|
+
| **sandcastle** (`mattpocock/sandcastle`) | Utgard | Docker/Podman/Vercel sandboxes |
|
|
409
|
+
| **no-mistakes** (`kunchenguid/no-mistakes`) | Mjollnir · Glitnir | clean-PR validation gate |
|
|
410
|
+
| **Hermes** (`NousResearch/hermes-agent`, MIT) | — (product name) | worker agent runtime: own brain, memory, skills, subagents, sandbox backends |
|
|
411
|
+
| **pi-desktop** (`FaqFirebase/pi-desktop`, Apache-2.0) | **Sessrúmnir** (cloned from its own repo to `apps/sessrumnir` at install) | desktop GUI for the Pi/OMP coding agents — the seat-hall, themed with the Ymir way-of palette |
|
|
412
|
+
|
|
413
|
+
## Missing dependencies
|
|
414
|
+
|
|
415
|
+
- **Fixable in user space** (no sudo): `bun`, `uv`, `mcp<2>` — via
|
|
416
|
+
`bin/prereq-ensure.sh`. `treehouse`, `no-mistakes`, **Hermes**, and the **Þjazi
|
|
417
|
+
backend** (herdr, or tmux) are installed by their own ensure/steps.
|
|
418
|
+
- **Needs a system package** (reported with the exact command): `git`,
|
|
419
|
+
`python3`, `docker`, `gh`.
|
|
420
|
+
- **Optional, honest SKIP:** the `engram` memory engine. The published PyPI
|
|
421
|
+
`engram` is **not** Ymir's engine (it is an unrelated scientific package), so
|
|
422
|
+
the installer reports the well as off rather than installing the wrong thing.
|
|
423
|
+
- **Offline:** engine/Hermes/herdr installers fail gracefully and are reported;
|
|
424
|
+
re-run when the network returns.
|
|
425
|
+
|
|
426
|
+
## Hermes specifically (`bin/hermes-ensure.sh`)
|
|
427
|
+
|
|
428
|
+
```
|
|
429
|
+
hermes-ensure.sh status # hermes[1]{installed,version,path,method}
|
|
430
|
+
hermes-ensure.sh ensure --install # install if absent, then report
|
|
431
|
+
hermes-ensure.sh install # curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
A user who lacks Hermes gets it at setup (`hermes` step). Config/identity
|
|
435
|
+
(`hermes setup`, auth) stays the user's own; Ymir guarantees only the runtime.
|
|
436
|
+
|
|
437
|
+
## Sessrúmnir specifically (`bin/sessrumnir-ensure.sh`, `bin/sessrumnir.sh`)
|
|
438
|
+
|
|
439
|
+
```
|
|
440
|
+
sessrumnir-ensure.sh status # sessrumnir[1]{dir,deps,built,electron}
|
|
441
|
+
sessrumnir-ensure.sh ensure --install # install deps + build when absent, then report
|
|
442
|
+
sessrumnir-ensure.sh install # npm install + electron-binary heal + npm run build
|
|
443
|
+
sessrumnir.sh start [path] # launch the seat-hall (deps installed on first run)
|
|
444
|
+
sessrumnir.sh status | stop
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
Deps are never committed; the ensure step installs them on first run, exactly as
|
|
448
|
+
`scripts/electron.sh` does for the other desktop apps. The external engine keeps
|
|
449
|
+
its product name `pi-desktop`; the GUI the user sees is Sessrúmnir, themed with
|
|
450
|
+
Ymir's deep-navy palette. The Omarchy launcher entry is rendered from
|
|
451
|
+
`apps/sessrumnir/resources/ymir-sessrumnir.desktop.in` by `bin/desktop-place.sh`
|
|
452
|
+
(placement + `SUPER+B`).
|
|
453
|
+
|
|
454
|
+
## Neutral tenant defaults — a fresh Ymir is a distro, not the company
|
|
455
|
+
|
|
456
|
+
A fresh install ships **no company of its own**. `bin/ymir-install.sh` seeds one
|
|
457
|
+
`personal` workspace and an **empty** projects registry (a commented example
|
|
458
|
+
only); it never writes a company slug, a company remote, or a `work (company: …)`
|
|
459
|
+
line. The runtime resolves the active realm **neutrally** through
|
|
460
|
+
`bin/realm-lib.sh` (`ymir_active_realm`): `data/realm.md` (first line) → the first
|
|
461
|
+
non-example tenant under `svartalfaheim/` → `default`. **No script may fall back
|
|
462
|
+
to a company slug.** The reference tenant the distro was built for lives at
|
|
463
|
+
`svartalfaheim/examples/wayof/` — an example to copy, never the default. A `work`
|
|
464
|
+
workspace must name its own company: `workspace-provision.sh` requires
|
|
465
|
+
`--company <slug>`.
|
|
466
|
+
|
|
467
|
+
## Per-workspace provisioning
|
|
468
|
+
|
|
469
|
+
```
|
|
470
|
+
bin/workspace-provision.sh <name> --kind work|personal [--domains a,b,c] [--company <slug>]
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
Creates `workspace/<name>/<domains>/`, registers it in `workspaces.yaml`, and
|
|
474
|
+
for a **work** workspace attaches it to the tenant container
|
|
475
|
+
`svartalfaheim/<company>/`. `--company` is required for a work workspace — the
|
|
476
|
+
company is the operator's to name; Ymir ships no default.
|
|
477
|
+
|
|
478
|
+
## Verify
|
|
479
|
+
|
|
480
|
+
```
|
|
481
|
+
bin/ymir-install.sh --check # all steps OK/WARN
|
|
482
|
+
bin/ymir-validate.sh # the running system actually works
|
|
483
|
+
bin/herdr-ensure.sh status # the Þjazi backend and its protocol floor
|
|
484
|
+
bin/host-sense.sh # sense THIS machine (any host)
|
|
485
|
+
bin/omarchy-sense.sh status # the Omarchy recording (Omarchy hosts)
|
|
486
|
+
bin/saga-session-start.sh # the session digest
|
|
487
|
+
bash .agents/skills/galdr-ymirsystem/scripts/compliance-check.sh
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
On **every** host the installer senses the machine with `bin/host-sense.sh`. On
|
|
491
|
+
an **Omarchy** host the layer also *records* it (`bin/omarchy-sense.sh observe`)
|
|
492
|
+
and installs a `post-update` hook so Ymir re-learns it every time Omarchy
|
|
493
|
+
updates. On a non-Omarchy host that layer step is a clean SKIP.
|
|
494
|
+
|
|
495
|
+
Rule: the installer is **idempotent** — running it again changes nothing but
|
|
496
|
+
fills gaps. It never overwrites real user data.
|
|
497
|
+
|
|
498
|
+
## Node dependencies in a fresh clone — the postinstall trap
|
|
499
|
+
|
|
500
|
+
A clone never carries `node_modules`. Two components need them, and each has its
|
|
501
|
+
own package manager:
|
|
502
|
+
|
|
503
|
+
```bash
|
|
504
|
+
# Hlidskjalf (npm + package-lock.json) — what scripts/start.sh runs
|
|
505
|
+
cd apps/hlidskjalf && npm install --no-audit --no-fund
|
|
506
|
+
npm run typecheck && npm run build # dist/ is what the SPA serves
|
|
507
|
+
|
|
508
|
+
# Smiðja visualizer (bun + bun.lock)
|
|
509
|
+
cd .agents/skills/smidja-factory/apps/visualizer && bun install && bun run build
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
The visualizer's `dist/` is not optional: its API serves the UI from `./dist`,
|
|
513
|
+
and without a build it answers the API but prints *"No ./dist build found"*.
|
|
514
|
+
|
|
515
|
+
### The trap: install scripts can be skipped silently
|
|
516
|
+
|
|
517
|
+
Newer npm versions gate package install scripts (`allowScripts`). When a script
|
|
518
|
+
is not approved the install still reports success, so you get a **half-broken
|
|
519
|
+
tree that passes its own build**:
|
|
520
|
+
|
|
521
|
+
```
|
|
522
|
+
2 packages have install scripts not yet covered by allowScripts:
|
|
523
|
+
electron@33.4.11 (postinstall: node install.js)
|
|
524
|
+
esbuild@0.25.12 (postinstall: node install.js)
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
- `esbuild` survives it (its binary arrives through the platform-specific
|
|
528
|
+
package), so `npm run build` succeeds and everything looks healthy.
|
|
529
|
+
- **`electron` does not.** Its postinstall downloads the ~100 MB runtime; without
|
|
530
|
+
it `node_modules/electron/dist/` is left partial and `path.txt` is never
|
|
531
|
+
written, so the desktop shell cannot start — while the web app builds perfectly.
|
|
532
|
+
|
|
533
|
+
Detect it:
|
|
534
|
+
|
|
535
|
+
```bash
|
|
536
|
+
npm install-scripts ls # what is unapproved
|
|
537
|
+
node_modules/electron/dist/electron --version # fails if skipped
|
|
538
|
+
cat node_modules/electron/path.txt # absent if skipped
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
Fix it:
|
|
542
|
+
|
|
543
|
+
```bash
|
|
544
|
+
npm install-scripts approve electron esbuild
|
|
545
|
+
npm rebuild electron
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
If the rebuild still exits **silently** and `dist/` stays partial, the download
|
|
549
|
+
is cached but was not re-extracted — complete it by hand, which is all the
|
|
550
|
+
package's own installer does:
|
|
551
|
+
|
|
552
|
+
```bash
|
|
553
|
+
ZIP=$(ls ~/.cache/electron/*/electron-v*-linux-x64.zip | head -1)
|
|
554
|
+
rm -rf node_modules/electron/dist && mkdir -p node_modules/electron/dist
|
|
555
|
+
unzip -q -o "$ZIP" -d node_modules/electron/dist
|
|
556
|
+
printf 'electron' > node_modules/electron/path.txt # the linux binary name
|
|
557
|
+
chmod +x node_modules/electron/dist/electron
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
**Verify the install as a whole**, not just that a build passed: the electron and
|
|
561
|
+
esbuild binaries report versions, both `dist/` directories exist, and
|
|
562
|
+
`bin/ymir-install.sh --check` reports the visualizer and smidja green.
|
|
563
|
+
|
|
564
|
+
## Platform support — Linux, macOS, Windows
|
|
565
|
+
|
|
566
|
+
Ymir runs on Linux (native), macOS (native) and Windows (through **WSL2**, with
|
|
567
|
+
MSYS/Git Bash as best-effort). The runtime is bash, so Windows means a POSIX
|
|
568
|
+
shell: WSL2 is the supported path, and it is also the only one where the Linux
|
|
569
|
+
GPU and service paths behave normally.
|
|
570
|
+
|
|
571
|
+
### One place knows the difference
|
|
572
|
+
|
|
573
|
+
`bin/ymir-platform.sh` is the portability layer. It defines functions only and is
|
|
574
|
+
sourced, never executed:
|
|
575
|
+
|
|
576
|
+
```bash
|
|
577
|
+
. "$ROOT/bin/ymir-platform.sh" # scripts already do this via the shim block
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
| Need | Function | Why it exists |
|
|
581
|
+
|---|---|---|
|
|
582
|
+
| Which OS | `ymir_os` → `linux` \| `macos` \| `wsl` \| `msys` | branching, once |
|
|
583
|
+
| CPU count | `ymir_nproc` | `nproc` is GNU; macOS uses `sysctl -n hw.ncpu` |
|
|
584
|
+
| Resolve a path | `ymir_readlink_f` | BSD `readlink` has no `-f`; mirrors GNU semantics including the "parent must exist" rule |
|
|
585
|
+
| File facts | `ymir_stat_mtime`, `ymir_stat_size`, `ymir_stat_id`, `ymir_stat_birth`, `ymir_stat_mode` | GNU `stat -c` vs BSD `stat -f`, and birth time exists on both but differently |
|
|
586
|
+
| Timing | `ymir_epoch_ns` | BSD `date` has no `%N` |
|
|
587
|
+
| A pid's command line | `ymir_pid_cmdline`, `ymir_pid_matches` | `/proc` is Linux-only; falls back to `ps -o command=` |
|
|
588
|
+
| Signal a process by pattern | `ymir_kill_matching` | `pkill` is absent on some MSYS/WSL images; falls back to `ps` + `kill` |
|
|
589
|
+
| Detach a process | `ymir_detach` | `setsid` is absent on macOS; falls back to `nohup` |
|
|
590
|
+
| Exclusive lock | `ymir_lock` | `flock` is Linux; falls back to an atomic `mkdir` lock |
|
|
591
|
+
| Services | `ymir_service_backend`, `ymir_service_active` | `systemd` on Linux, `launchd` on macOS, neither elsewhere |
|
|
592
|
+
| GPUs | `ymir_gpu_name`, `ymir_gpu_mem_used` | never assume NVIDIA: `nvidia-smi`, then `rocm-smi`, then Apple's unified memory |
|
|
593
|
+
| Paths | `ymir_tmp`, `ymir_expand_tilde` | `TMPDIR`/`TEMP` vary; a leading `~` must be expanded explicitly |
|
|
594
|
+
|
|
595
|
+
Scripts that need any of these carry a short shim block near the top that finds
|
|
596
|
+
and sources the library, then marks it loaded so a second source is a no-op:
|
|
597
|
+
|
|
598
|
+
```bash
|
|
599
|
+
if [ -z "${YMIR_PLATFORM_LOADED:-}" ]; then
|
|
600
|
+
_ymir_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
601
|
+
for _ymir_c in "$_ymir_dir/ymir-platform.sh" "$(dirname "$_ymir_dir")/bin/ymir-platform.sh"; do
|
|
602
|
+
[ -r "$_ymir_c" ] && { . "$_ymir_c"; YMIR_PLATFORM_LOADED=1; break; }
|
|
603
|
+
done
|
|
604
|
+
unset _ymir_dir _ymir_c
|
|
605
|
+
fi
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
### Rules for new code
|
|
609
|
+
|
|
610
|
+
1. **Never call `readlink -f`, `stat -c`, `nproc`, `setsid`, `flock`, `date +%N`
|
|
611
|
+
or read `/proc` directly.** Use the shim.
|
|
612
|
+
2. **Never assume NVIDIA.** Ask the shim; a machine may be AMD, Intel or Apple.
|
|
613
|
+
3. **Never hardcode a home directory.** Use `$HOME`, or `ymir_expand_tilde` for a
|
|
614
|
+
user-supplied path, and keep machine-specific values in generated config
|
|
615
|
+
rather than in the tree.
|
|
616
|
+
4. **Never assume a desktop.** `.desktop` files, `systemctl` and window managers
|
|
617
|
+
are Linux-shaped; a launcher must be generated for the host, not shipped as
|
|
618
|
+
one file for all.
|
|
619
|
+
5. **Test the fallback, not just the happy path.** Most of these functions exist
|
|
620
|
+
because the Linux path already worked; the risk is the other branch.
|
|
621
|
+
|
|
622
|
+
Standalone tools that ship outside a Ymir checkout (for example
|
|
623
|
+
`.agents/skills/galdr-ymirsystem/scripts/bench-one.sh`) carry their own small portable
|
|
624
|
+
helpers instead of sourcing the library, so they run anywhere on their own.
|
|
625
|
+
|
|
626
|
+
### Machine config is rendered, never shipped
|
|
627
|
+
|
|
628
|
+
Two files must contain **absolute** paths (the engram MCP server's binary and its
|
|
629
|
+
database), so a tracked copy would hand every operator the previous one's home —
|
|
630
|
+
exactly what `/home/<user>/...` did in this tree. They follow the `.env.example`
|
|
631
|
+
pattern instead:
|
|
632
|
+
|
|
633
|
+
| Shipped (tracked) | Rendered (gitignored) |
|
|
634
|
+
|---|---|
|
|
635
|
+
| `opencode.json.example` | `opencode.json` |
|
|
636
|
+
| `.pi/mcp.json.example` | `.pi/mcp.json` |
|
|
637
|
+
|
|
638
|
+
Placeholders `__YMIR_HOME__` and `__YMIR_ROOT__` are substituted with `$HOME` and
|
|
639
|
+
the checkout root by `bin/valknut-load.sh` (its `render_config`, run for both
|
|
640
|
+
`--pi` and `--opencode`). It is idempotent: identical content is left alone and
|
|
641
|
+
reported as `unchanged`.
|
|
642
|
+
|
|
643
|
+
Rule: **if a config must hold an absolute path, it is generated from an
|
|
644
|
+
`.example`, not committed.** The same applies to launchers — a `.desktop` file
|
|
645
|
+
is one OS's answer and must be produced for the host, not shipped for all.
|
|
646
|
+
|
|
647
|
+
## Omarchy-first: the core is portable, the desktop is Omarchy's
|
|
648
|
+
|
|
649
|
+
Ymir is an **Omarchy-first** system. That is a design statement, not a
|
|
650
|
+
restriction — it says which desktop integration is first-class, not which
|
|
651
|
+
machines may run the runtime.
|
|
652
|
+
|
|
653
|
+
**Two layers, deliberately separate:**
|
|
654
|
+
|
|
655
|
+
| Layer | Runs on | What it owns |
|
|
656
|
+
|---|---|---|
|
|
657
|
+
| **Portable core** | Linux, macOS, Windows (WSL2; MSYS best-effort) | the runtime — session digest, lock, watch, cron, skills — the installer's user-space prerequisites, the capability shim, generated machine config |
|
|
658
|
+
| **Omarchy layer** | Omarchy only | recording the host (`omarchy-sense observe`), placing each app on its own numbered Hyprland desktop (`desktop-place`), the launcher entries (`.desktop`), the suggested shell plugins, the post-update hook |
|
|
659
|
+
|
|
660
|
+
The core never grows a Hyprland branch, and the Omarchy layer is never stretched
|
|
661
|
+
into pretending it is portable. An Omarchy-specific step is gated on the host and
|
|
662
|
+
reports a clean skip anywhere else:
|
|
663
|
+
|
|
664
|
+
```bash
|
|
665
|
+
[ -d /usr/share/omarchy ] && ... || add host OK "... (not an Omarchy host)"
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
That is why the only Omarchy branches left in the core installer are the ones
|
|
669
|
+
that call the layer (`step_omarchy`) and desktop placement (`step_desktop`):
|
|
670
|
+
`step_host` senses the host portably with `host-sense`, and everywhere else the
|
|
671
|
+
same code path runs on any host.
|
|
672
|
+
|
|
673
|
+
The **consent preamble** the installer prints before it acts says the same thing —
|
|
674
|
+
*"learn this machine (OS, desktop, packages, configs, monitors, scale — Omarchy
|
|
675
|
+
hosts recorded first-class)"* — so the operator is told what will happen in the
|
|
676
|
+
portable terms the code now uses, not the Omarchy-only terms it used before.
|
|
677
|
+
|
|
678
|
+
### What the Omarchy layer installs
|
|
679
|
+
|
|
680
|
+
```bash
|
|
681
|
+
bin/omarchy-sense.sh observe # learn packages, configs, Omarchy version
|
|
682
|
+
bin/omarchy-plugins.sh add # the suggested shell plugins (never forced)
|
|
683
|
+
bin/omarchy-hook-install.sh install # re-learn after every `omarchy update`
|
|
684
|
+
bin/desktop-place.sh apply # Hyprland desktops + launcher entries
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
`desktop-place.sh apply` does both halves of the desktop integration: it writes
|
|
688
|
+
the Hyprland window rules that give each Ymir app its own numbered desktop, and
|
|
689
|
+
it renders the launcher templates into `~/.local/share/applications/`. The
|
|
690
|
+
templates (`apps/hlidskjalf/electron/*.desktop.in`) carry `__YMIR_ROOT__` rather
|
|
691
|
+
than an absolute path, because where the checkout lives is a fact about the
|
|
692
|
+
machine, not about Ymir.
|
|
693
|
+
|
|
694
|
+
**Rule:** `RULES/05-platforms.md` — a core change updates every
|
|
695
|
+
platform layer in the same change.
|
|
696
|
+
|
|
697
|
+
**Rule for a new desktop feature:** if it is Omarchy-specific, it belongs in the
|
|
698
|
+
Omarchy layer and is gated; if it is core, it must work on every platform. Do not
|
|
699
|
+
blur the two — a branch of Hyprland logic inside a core script is how a portable
|
|
700
|
+
runtime stops being portable.
|
|
701
|
+
|
|
702
|
+
### A move must carry the memory, not just the code
|
|
703
|
+
|
|
704
|
+
Rule 06 makes this explicit, because a home swap here dropped
|
|
705
|
+
`docs/append-only-log.md`, `docs/masterplan.md`, `docs/plans/` and the private
|
|
706
|
+
business set: the backup carried `state`, `.env.local`, `data`, the realm and
|
|
707
|
+
`workspace` — but not `docs/` or `assets/`. The code arrived; the memory did not.
|
|
708
|
+
|
|
709
|
+
Before and after any migration, re-clone or swap, check the sets **by name**:
|
|
710
|
+
|
|
711
|
+
```bash
|
|
712
|
+
for f in CHANGELOG.md docs/append-only-log.md workspace/memory/runes_audit.md; do
|
|
713
|
+
[ -e "$f" ] || echo "MISSING append-only artifact: $f"
|
|
714
|
+
done
|
|
715
|
+
ls "$YMIR_HOARD/docs" "$YMIR_HOARD/identity" 2>/dev/null # the private set
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
A backup is only as good as its file list. If a directory is not named in the
|
|
719
|
+
backup, it is not carried.
|
|
720
|
+
|
|
721
|
+
### The memory engine is provisioned, not hinted (2026-09-12)
|
|
722
|
+
|
|
723
|
+
`bin/ymir-install.sh` used to *check* for the well engine and, failing, print
|
|
724
|
+
`SKIP "optional — install engine then run bin/mimir-bridge.sh"`. A SKIP never
|
|
725
|
+
blocks, so the well was silently down on every install — and the hint named the
|
|
726
|
+
wrong package, so following it made things worse.
|
|
727
|
+
|
|
728
|
+
Now the installer provisions it: `bin/prereq-ensure.sh engram` installs
|
|
729
|
+
**`engdbram`** (the distribution; the *module* is `engram`) into an interpreter
|
|
730
|
+
that can run it (>=3.11; uv supplies 3.12 when the distro's Python is unsuitable),
|
|
731
|
+
and records that interpreter in `~/.config/ymir/engram-python`. `bin/mimir-bridge.sh`
|
|
732
|
+
reads the same file, so the installer and the bridge always agree.
|
|
733
|
+
|
|
734
|
+
```bash
|
|
735
|
+
bin/prereq-ensure.sh engram # install and record the interpreter
|
|
736
|
+
bin/mimir-bridge.sh --start # the :4602 face over the engine
|
|
737
|
+
curl -s 127.0.0.1:4602/health # {"status": "up", "store": ".agents/memory/kaia.engram"}
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
**Never `pip install engram`.** PyPI's `engram` is an unrelated rendering library
|
|
741
|
+
(mitsuba/drjit/torch) whose install pulls gigabytes of CUDA wheels and still
|
|
742
|
+
leaves Ymir with no engine. The prerequisite target exists so nobody has to know
|
|
743
|
+
that: `bin/prereq-ensure.sh engram`.
|
|
744
|
+
|
|
745
|
+
### The rename sweep broke governed paths, not just prose (2026-09-12)
|
|
746
|
+
|
|
747
|
+
The `smidja` → `smidja-factory` rename left `smidja-factory-factory` behind in
|
|
748
|
+
**seven** places — `scripts/start.sh` (`VIZ_DIR`), `bin/ymir-validate.sh`,
|
|
749
|
+
`bin/ymir-install.sh` (twice: the dist probe and the build dir),
|
|
750
|
+
`bin/saga-session-start.sh` (the governed-path TOON row), `AGENTS.md` (the
|
|
751
|
+
`governed[]` table, twice) and the guard's own `asset_for` pattern.
|
|
752
|
+
|
|
753
|
+
The damage was not cosmetic: a governed path that does not exist makes the
|
|
754
|
+
pretool guard stop matching, so the smidja rule protected nothing while every
|
|
755
|
+
check still passed. A `governed` check now exists in
|
|
756
|
+
`compliance-check.sh` for exactly this class (see `runtime-compliance.md` §G13);
|
|
757
|
+
it reports `all 25 governed paths exist`.
|
|
758
|
+
|
|
759
|
+
`bin/ymir-install.sh` and `bin/ymir-validate.sh` are the two files of this asset
|
|
760
|
+
that the sweep corrected. The visualizer path is
|
|
761
|
+
`.agents/skills/smidja-factory/apps/visualizer` — **not** a doubled
|
|
762
|
+
`smidja-factory-factory`, and not the abandoned `.agents/skills/smidja/` tree
|
|
763
|
+
(stale build output, moved aside).
|