@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,93 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ymir-invite — hand someone a way in to your Ymir, and take it back.
|
|
3
|
+
#
|
|
4
|
+
# One operator owns the instance; an invite code is how someone else is let in
|
|
5
|
+
# to try it. Codes are machine state (never in the repo), each with its own
|
|
6
|
+
# ceiling, and registration is closed when no live code exists.
|
|
7
|
+
#
|
|
8
|
+
# ymir-invite mint [--limit N] print a new code (default ceiling: 5)
|
|
9
|
+
# ymir-invite list every code, and how much of it is spent
|
|
10
|
+
# ymir-invite revoke <CODE> take a code back, now
|
|
11
|
+
# ymir-invite where where the accounts live on this machine
|
|
12
|
+
# ymir-invite ensure mint only if none is live (used by the installer)
|
|
13
|
+
#
|
|
14
|
+
# The accounts themselves are read and written by the gate's own store module,
|
|
15
|
+
# so there is one definition of what an account and an invite are.
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
19
|
+
MODULE="$ROOT/apps/hlidskjalf/server/accounts.ts"
|
|
20
|
+
STORE="$ROOT/apps/hlidskjalf/server/accounts.ts" # absolute: one definition of an account, wherever this is run from
|
|
21
|
+
|
|
22
|
+
die() { printf 'ymir-invite: %s\n' "$1" >&2; exit 1; }
|
|
23
|
+
|
|
24
|
+
command -v bun >/dev/null 2>&1 || die "bun is required (bin/ymir-install.sh installs it)"
|
|
25
|
+
|
|
26
|
+
# A tiny bun program per action — the module is the single source of truth.
|
|
27
|
+
accounts() {
|
|
28
|
+
( cd "$ROOT/apps/hlidskjalf" && bun -e "$1" )
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
[ -f "$MODULE" ] || die "the account store module is missing: $MODULE"
|
|
32
|
+
|
|
33
|
+
action="${1:-}"
|
|
34
|
+
case "$action" in
|
|
35
|
+
mint)
|
|
36
|
+
limit=5
|
|
37
|
+
shift || true
|
|
38
|
+
while [ $# -gt 0 ]; do
|
|
39
|
+
case "$1" in
|
|
40
|
+
--limit) limit="${2:?--limit needs a number}"; shift 2 ;;
|
|
41
|
+
*) die "unknown option: $1" ;;
|
|
42
|
+
esac
|
|
43
|
+
done
|
|
44
|
+
[[ "$limit" =~ ^[0-9]+$ ]] || die "--limit must be a number"
|
|
45
|
+
accounts "import { addInvite, STORE } from '$STORE';
|
|
46
|
+
const i = addInvite($limit);
|
|
47
|
+
console.log('invite[1]{code,limit,store}:');
|
|
48
|
+
console.log(\` \"\${i.code}\",\${i.limit},\"\${STORE}\"\`);
|
|
49
|
+
console.error(\`\nShare it: it admits \${i.limit} account(s), then it is spent.\`);"
|
|
50
|
+
;;
|
|
51
|
+
|
|
52
|
+
list)
|
|
53
|
+
accounts "import { listInvites, listAccounts } from '$STORE';
|
|
54
|
+
const inv = listInvites(), acc = listAccounts();
|
|
55
|
+
console.log(\`invites[\${inv.length}]{code,used,limit,state}:\`);
|
|
56
|
+
for (const i of inv) console.log(\` \"\${i.code}\",\${i.used},\${i.limit},\"\${i.used >= i.limit ? 'spent' : 'live'}\"\`);
|
|
57
|
+
console.log(\`accounts[\${acc.length}]{login,created}:\`);
|
|
58
|
+
for (const a of acc) console.log(\` \"\${a.login}\",\"\${a.created}\"\`);"
|
|
59
|
+
;;
|
|
60
|
+
|
|
61
|
+
revoke)
|
|
62
|
+
code="${2:-}"; [ -n "$code" ] || die "usage: ymir-invite revoke <CODE>"
|
|
63
|
+
accounts "import { revokeInvite } from '$STORE';
|
|
64
|
+
const gone = revokeInvite('$code');
|
|
65
|
+
console.log(\`revoke[1]{code,removed}:\n \"$code\",\${gone}\`);"
|
|
66
|
+
;;
|
|
67
|
+
|
|
68
|
+
where)
|
|
69
|
+
accounts "import { STORE, CONFIG_DIR } from '$STORE';
|
|
70
|
+
console.log(\`store[1]{path,dir}:\n \"\${STORE}\",\"\${CONFIG_DIR}\"\`);"
|
|
71
|
+
;;
|
|
72
|
+
|
|
73
|
+
ensure)
|
|
74
|
+
# Mint one only when nothing is live — so the installer is idempotent and
|
|
75
|
+
# never quietly grows a pile of codes.
|
|
76
|
+
accounts "import { addInvite, invitesOpen, listInvites, STORE } from '$STORE';
|
|
77
|
+
if (invitesOpen()) {
|
|
78
|
+
const live = listInvites().filter(i => i.used < i.limit);
|
|
79
|
+
console.log(\`invite[\${live.length}]{code,used,limit}:\`);
|
|
80
|
+
for (const i of live) console.log(\` \"\${i.code}\",\${i.used},\${i.limit}\`);
|
|
81
|
+
} else {
|
|
82
|
+
const i = addInvite();
|
|
83
|
+
console.log('invite[1]{code,limit,store}:');
|
|
84
|
+
console.log(\` \"\${i.code}\",\${i.limit},\"\${STORE}\"\`);
|
|
85
|
+
}"
|
|
86
|
+
;;
|
|
87
|
+
|
|
88
|
+
""|-h|--help|help)
|
|
89
|
+
sed -n '2,20p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
|
|
90
|
+
;;
|
|
91
|
+
|
|
92
|
+
*) die "unknown action: $action (try: mint, list, revoke, where, ensure)" ;;
|
|
93
|
+
esac
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ymir-isolation.sh — capability-probed confinement for a single agent command.
|
|
3
|
+
#
|
|
4
|
+
# The layered model (audit §12): the container is the boundary against the rest of
|
|
5
|
+
# a shared host; bwrap is an OPTIONAL innermost scope for one model-generated
|
|
6
|
+
# command; Utgard remains the place for untrusted code. This script never assumes
|
|
7
|
+
# bwrap is usable — it probes, then degrades cleanly.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# ymir-isolation.sh probe
|
|
11
|
+
# ymir-isolation.sh run <worktree> -- <command...> [--net on|off]
|
|
12
|
+
# ymir-isolation.sh --version
|
|
13
|
+
#
|
|
14
|
+
# Exit: 0 ok, 1 error, 2 usage, 3 unavailable (no isolating layer; ran anyway).
|
|
15
|
+
set -u
|
|
16
|
+
|
|
17
|
+
VERSION="1.0.0"
|
|
18
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
19
|
+
# shellcheck source=bin/ymir-platform.sh
|
|
20
|
+
. "$SCRIPT_DIR/ymir-platform.sh"
|
|
21
|
+
|
|
22
|
+
usage() { sed -n '2,15p' "$0" | sed 's/^# \{0,1\}//'; }
|
|
23
|
+
|
|
24
|
+
CMD="${1-}"; shift || true
|
|
25
|
+
case "$CMD" in
|
|
26
|
+
-v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
|
|
27
|
+
-h|--help|"") usage; exit 0 ;;
|
|
28
|
+
esac
|
|
29
|
+
|
|
30
|
+
case "$CMD" in
|
|
31
|
+
probe)
|
|
32
|
+
layers="$(ymir_isolation_layers)"
|
|
33
|
+
in_ctr="$(ymir_in_container && echo yes || echo no)"
|
|
34
|
+
bwrap_ok="$(ymir_bwrap_available && echo yes || echo no)"
|
|
35
|
+
bwrap_bin="$(command -v bwrap 2>/dev/null || echo -)"
|
|
36
|
+
printf 'isolation[1]{layers,in_container,bwrap_binary,bwrap_usable}:\n'
|
|
37
|
+
printf ' "%s","%s","%s","%s"\n' "$layers" "$in_ctr" "$bwrap_bin" "$bwrap_ok"
|
|
38
|
+
if [ "$bwrap_ok" = no ] && [ "$bwrap_bin" != "-" ]; then
|
|
39
|
+
printf 'note[1]: bwrap is installed but cannot create a namespace here.\n'
|
|
40
|
+
printf ' A rootless/Hardened container (e.g. a Quadlet) denies nested user namespaces;\n'
|
|
41
|
+
printf ' keep the container as the boundary, or opt the container in (see deploy/README.md).\n'
|
|
42
|
+
elif [ "$bwrap_bin" = "-" ]; then
|
|
43
|
+
printf 'note[1]: bwrap not installed (Fedora: sudo dnf install bubblewrap).\n'
|
|
44
|
+
fi
|
|
45
|
+
;;
|
|
46
|
+
|
|
47
|
+
run)
|
|
48
|
+
WT=""; NET="off"
|
|
49
|
+
while [ $# -gt 0 ]; do
|
|
50
|
+
case "$1" in
|
|
51
|
+
--) shift; break ;;
|
|
52
|
+
--net) NET="${2-off}"; shift 2 ;;
|
|
53
|
+
*) WT=$1; shift ;;
|
|
54
|
+
esac
|
|
55
|
+
done
|
|
56
|
+
[ -n "$WT" ] || { printf 'error: run needs a worktree path\nhelp: bin/ymir-isolation.sh run <worktree> -- <command>\n' >&2; exit 2; }
|
|
57
|
+
[ -d "$WT" ] || { printf 'error: worktree not found: %s\n' "$WT" >&2; exit 1; }
|
|
58
|
+
[ "$#" -gt 0 ] || { printf 'error: run needs a command after --\n' >&2; exit 2; }
|
|
59
|
+
WT="$(cd "$WT" && pwd)"
|
|
60
|
+
|
|
61
|
+
if ymir_bwrap_available; then
|
|
62
|
+
# Bind the read-only system, a writable worktree, a private /tmp, and no
|
|
63
|
+
# network unless asked. --die-with-parent leaves nothing behind.
|
|
64
|
+
ARGS=(--die-with-parent --unshare-all)
|
|
65
|
+
[ "$NET" = on ] && ARGS+=(--share-net)
|
|
66
|
+
ARGS+=(--proc /proc --dev /dev --tmpfs /tmp --setenv HOME /tmp)
|
|
67
|
+
for d in /usr /lib /lib64 /bin /sbin /etc; do
|
|
68
|
+
[ -e "$d" ] && ARGS+=(--ro-bind "$d" "$d")
|
|
69
|
+
done
|
|
70
|
+
ARGS+=(--bind "$WT" "$WT" --chdir "$WT" -- bash -lc "$*")
|
|
71
|
+
exec bwrap "${ARGS[@]}"
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# No bwrap: degrade to the isolation already in force (the container), never
|
|
75
|
+
# pretend the command was confined.
|
|
76
|
+
if ymir_in_container; then
|
|
77
|
+
printf 'isolation[1]{layer,status}:\n "container","running in the container boundary (bwrap unavailable)"\n' >&2
|
|
78
|
+
else
|
|
79
|
+
printf 'isolation[1]{layer,status}:\n "none","UNCONFINED — bwrap unavailable and not in a container"\n' >&2
|
|
80
|
+
fi
|
|
81
|
+
( cd "$WT" && bash -lc "$*" )
|
|
82
|
+
exit 3
|
|
83
|
+
;;
|
|
84
|
+
|
|
85
|
+
*)
|
|
86
|
+
printf 'error: unknown command %s\nhelp: bin/ymir-isolation.sh [probe|run|--version]\n' "$CMD" >&2
|
|
87
|
+
exit 2 ;;
|
|
88
|
+
esac
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ymir-migrate.sh — versioned STRUCTURE migrations for existing Ymir homes.
|
|
3
|
+
#
|
|
4
|
+
# bin/ymir-migrate.sh status # which migrations exist / are applied
|
|
5
|
+
# bin/ymir-migrate.sh apply # apply everything pending, in order
|
|
6
|
+
# bin/ymir-migrate.sh apply --dry-run # show what would run, touch nothing
|
|
7
|
+
# bin/ymir-migrate.sh --version
|
|
8
|
+
#
|
|
9
|
+
# Each migration is `.agents/migrations/<NNNN>-<name>.sh`, MUST be idempotent,
|
|
10
|
+
# and runs with `bash`. Applied ids are recorded in `state/migrations` (private).
|
|
11
|
+
# `bin/ymir-install.sh` and `bin/brokk-update.sh` call `apply` after an update.
|
|
12
|
+
set -u
|
|
13
|
+
|
|
14
|
+
VERSION="1.0.0"
|
|
15
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
16
|
+
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
17
|
+
YMIR_HOME="${YMIR_HOME:-$HOME/Documents/Ymir}"
|
|
18
|
+
MIG_DIR="$ROOT/.agents/migrations"
|
|
19
|
+
STATE_DIR="${YMIR_STATE_DIR:-$YMIR_HOME/state}"
|
|
20
|
+
APPLIED="$STATE_DIR/migrations"
|
|
21
|
+
|
|
22
|
+
case "${1-}" in -v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
|
|
23
|
+
-h|--help|"") sed -n '2,12p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; esac
|
|
24
|
+
|
|
25
|
+
ACTION="${1:-status}"; shift || true
|
|
26
|
+
DRY=0
|
|
27
|
+
for a in "$@"; do case "$a" in --dry-run|-n) DRY=1 ;; esac; done
|
|
28
|
+
|
|
29
|
+
[ -d "$MIG_DIR" ] || { printf 'ymir-migrate[1]{state}:\n "none","no migrations directory"\n'; exit 0; }
|
|
30
|
+
mkdir -p "$STATE_DIR"; [ -f "$APPLIED" ] || : >"$APPLIED"
|
|
31
|
+
|
|
32
|
+
is_applied() { grep -qxF "$1" "$APPLIED" 2>/dev/null; }
|
|
33
|
+
desc_of() { sed -n 's/^# *[0-9]\{4\}-[a-z0-9-]* *—* *//p' "$1" | head -1; }
|
|
34
|
+
|
|
35
|
+
mapfile -t MIGS < <(ls "$MIG_DIR"/[0-9][0-9][0-9][0-9]-*.sh 2>/dev/null | sort)
|
|
36
|
+
|
|
37
|
+
if [ "$ACTION" = status ]; then
|
|
38
|
+
printf 'ymir-migrate[%d]{migration,state,description}:\n' "${#MIGS[@]}"
|
|
39
|
+
for m in "${MIGS[@]}"; do
|
|
40
|
+
id="$(basename "$m" .sh)"
|
|
41
|
+
if is_applied "$id"; then st=applied; else st=pending; fi
|
|
42
|
+
printf ' "%s","%s","%s"\n' "$id" "$st" "$(desc_of "$m")"
|
|
43
|
+
done
|
|
44
|
+
exit 0
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
[ "$ACTION" = apply ] || { printf 'error: unknown action %s\nhelp: bin/ymir-migrate.sh [status|apply [--dry-run]]\n' "$ACTION" >&2; exit 2; }
|
|
48
|
+
|
|
49
|
+
ran=0; skipped=0
|
|
50
|
+
for m in "${MIGS[@]}"; do
|
|
51
|
+
id="$(basename "$m" .sh)"
|
|
52
|
+
if is_applied "$id"; then skipped=$((skipped+1)); continue; fi
|
|
53
|
+
printf 'ymir-migrate[1]{apply,migration}:\n "%s","%s"\n' "$([ "$DRY" = 1 ] && echo dry-run || echo run)" "$id"
|
|
54
|
+
if [ "$DRY" = 1 ]; then continue; fi
|
|
55
|
+
if bash "$m"; then
|
|
56
|
+
printf '%s\n' "$id" >>"$APPLIED"; ran=$((ran+1))
|
|
57
|
+
else
|
|
58
|
+
printf 'error: migration %s failed — stopping; fix and re-run\n' "$id" >&2; exit 1
|
|
59
|
+
fi
|
|
60
|
+
done
|
|
61
|
+
printf 'ymir-migrate[1]{action,applied,pending}:\n "%s",%s,%s\n' "$([ "$DRY" = 1 ] && echo dry-run || echo apply)" "$ran" "$skipped"
|
package/bin/ymir-plan.sh
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ymir-plan.sh — THE INSTALL PLAN. Probe this machine, print what would change,
|
|
3
|
+
# change nothing.
|
|
4
|
+
#
|
|
5
|
+
# The consent a real install asks for used to be a hardcoded paragraph, and a
|
|
6
|
+
# paragraph cannot know the host: it named an Omarchy version on a Mac, promised
|
|
7
|
+
# a workspace tree that already stood, and never mentioned that no application
|
|
8
|
+
# had been installed at all. This is the replacement: a plan COMPUTED from the
|
|
9
|
+
# same host the install will act on, one row per step, each row carrying its
|
|
10
|
+
# state and the reason for it.
|
|
11
|
+
#
|
|
12
|
+
# DO a change will be made
|
|
13
|
+
# SKIP already satisfied — nothing to do
|
|
14
|
+
# DO · (with a note) the step is available but conditional
|
|
15
|
+
# BLOCKED cannot run; the reason names what is missing
|
|
16
|
+
# CONSENT needs the operator's word before it may run
|
|
17
|
+
# INFO a fact about this host, discovered — no change implied
|
|
18
|
+
#
|
|
19
|
+
# Usage:
|
|
20
|
+
# bin/ymir-plan.sh # the plan (TOON)
|
|
21
|
+
# bin/ymir-plan.sh --json # the same, as JSON, for automation
|
|
22
|
+
# bin/ymir-plan.sh --phase 5 # one phase
|
|
23
|
+
# bin/ymir-plan.sh --blocked # only what cannot proceed, and why
|
|
24
|
+
#
|
|
25
|
+
# Exit: 0 the plan was printed (a BLOCKED row is a fact, not a failure), 1 error,
|
|
26
|
+
# 2 usage.
|
|
27
|
+
set -u
|
|
28
|
+
|
|
29
|
+
# --- portability shim: bin/ymir-platform.sh --------------------------------
|
|
30
|
+
if [ -z "${YMIR_PLATFORM_LOADED:-}" ]; then
|
|
31
|
+
_ymir_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
32
|
+
for _ymir_c in "$_ymir_dir/ymir-platform.sh" "$(dirname "$_ymir_dir")/bin/ymir-platform.sh"; do
|
|
33
|
+
[ -r "$_ymir_c" ] && { . "$_ymir_c"; YMIR_PLATFORM_LOADED=1; break; }
|
|
34
|
+
done
|
|
35
|
+
unset _ymir_dir _ymir_c
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
VERSION="1.0.0"
|
|
39
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
40
|
+
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
41
|
+
# Whether the home was named explicitly matters: a home that was chosen is not
|
|
42
|
+
# the same as one we defaulted to, and the plan says which.
|
|
43
|
+
YMIR_HOME_WAS_SET=0; [ -n "${YMIR_HOME:-}" ] && YMIR_HOME_WAS_SET=1
|
|
44
|
+
# shellcheck source=bin/hoard-lib.sh
|
|
45
|
+
. "$SCRIPT_DIR/hoard-lib.sh"
|
|
46
|
+
ymir_home_root YMIR_HOME
|
|
47
|
+
hoard_root HOARD
|
|
48
|
+
|
|
49
|
+
JSON=0; ONLY_PHASE=""; ONLY_BLOCKED=0
|
|
50
|
+
case "${1-}" in
|
|
51
|
+
-v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
|
|
52
|
+
-h|--help) sed -n '2,30p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
|
|
53
|
+
esac
|
|
54
|
+
while [ $# -gt 0 ]; do
|
|
55
|
+
case "$1" in
|
|
56
|
+
--json) JSON=1; shift ;;
|
|
57
|
+
--phase) ONLY_PHASE="${2-}"; shift 2 ;;
|
|
58
|
+
--blocked) ONLY_BLOCKED=1; shift ;;
|
|
59
|
+
*) printf 'error: unknown flag %s\nhelp: bin/ymir-plan.sh [--json] [--phase N] [--blocked]\n' "$1" >&2; exit 2 ;;
|
|
60
|
+
esac
|
|
61
|
+
done
|
|
62
|
+
|
|
63
|
+
declare -a P_N P_NAME P_STEP P_STATE P_WHY
|
|
64
|
+
emit() { P_N+=("$1"); P_NAME+=("$2"); P_STEP+=("$3"); P_STATE+=("$4"); P_WHY+=("$5"); }
|
|
65
|
+
|
|
66
|
+
have() { command -v "$1" >/dev/null 2>&1; }
|
|
67
|
+
port_up() { # <port>
|
|
68
|
+
if have curl; then curl -s -o /dev/null --max-time 1 "http://127.0.0.1:$1/" 2>/dev/null && return 0; fi
|
|
69
|
+
if have ss; then ss -ltn 2>/dev/null | grep -q ":$1 " && return 0; fi
|
|
70
|
+
return 1
|
|
71
|
+
}
|
|
72
|
+
# An app is ours by one of two shapes: a source checkout under apps/, or a
|
|
73
|
+
# published package under node_modules/@zerwiz/. Neither is guessed.
|
|
74
|
+
app_dir() { # <name> -> path, or empty
|
|
75
|
+
local n="$1" c
|
|
76
|
+
for c in "$ROOT/apps/$n" "$ROOT/node_modules/@zerwiz/$n"; do
|
|
77
|
+
[ -d "$c" ] && { printf '%s' "$c"; return 0; }
|
|
78
|
+
done
|
|
79
|
+
return 1
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# ── phase 0 · resolve — where this runs, and against what ────────────────────
|
|
83
|
+
resolve_phase() {
|
|
84
|
+
local os="" desk="terminal"
|
|
85
|
+
os="$(ymir_os 2>/dev/null || printf unknown)"
|
|
86
|
+
[ -n "${WAYLAND_DISPLAY:-}" ] && desk="wayland"
|
|
87
|
+
[ -n "${DISPLAY:-}" ] && desk="x11"
|
|
88
|
+
[ -d /usr/share/omarchy ] && desk="$desk · omarchy first-class"
|
|
89
|
+
case "$os" in
|
|
90
|
+
wsl) desk="$desk · wsl2" ;;
|
|
91
|
+
msys) desk="$desk · msys (best-effort)" ;;
|
|
92
|
+
esac
|
|
93
|
+
emit 0 resolve os INFO "$os · $desk"
|
|
94
|
+
|
|
95
|
+
local eng=""
|
|
96
|
+
if command -v ymir_container_engine >/dev/null 2>&1; then eng="$(ymir_container_engine_name 2>/dev/null || true)"; fi
|
|
97
|
+
[ -z "$eng" ] && have docker && eng=docker
|
|
98
|
+
[ -z "$eng" ] && have podman && eng=podman
|
|
99
|
+
if [ -n "$eng" ]; then emit 0 resolve engine INFO "$eng"
|
|
100
|
+
else emit 0 resolve engine BLOCKED "no docker or podman on PATH — the Utgard image cannot be built"; fi
|
|
101
|
+
|
|
102
|
+
case "$ROOT" in
|
|
103
|
+
*/node_modules/*) emit 0 resolve code INFO "$ROOT — a package install (read-only at runtime)" ;;
|
|
104
|
+
*) emit 0 resolve code INFO "$ROOT — a source checkout" ;;
|
|
105
|
+
esac
|
|
106
|
+
|
|
107
|
+
case "$HOARD" in
|
|
108
|
+
"$ROOT"/*) emit 0 resolve home BLOCKED "the home ($HOARD) sits inside the code tree — private data would live in the package" ;;
|
|
109
|
+
*) emit 0 resolve home INFO "$HOARD (the home = $YMIR_HOME)" ;;
|
|
110
|
+
esac
|
|
111
|
+
|
|
112
|
+
# The home is the OPERATOR's to choose. Until they have, it is only a default,
|
|
113
|
+
# and the install will ask — so the plan says so rather than pretending.
|
|
114
|
+
local rec=""
|
|
115
|
+
ymir_home_record rec
|
|
116
|
+
if [ -n "$rec" ]; then
|
|
117
|
+
emit 0 resolve chosen SKIP "the home was chosen at installation: $rec"
|
|
118
|
+
elif [ "$YMIR_HOME_WAS_SET" = 1 ]; then
|
|
119
|
+
emit 0 resolve chosen SKIP "the home is set by \$YMIR_HOME: $YMIR_HOME"
|
|
120
|
+
else
|
|
121
|
+
emit 0 resolve chosen CONSENT "no home chosen yet — the install asks, then records it (default $YMIR_HOME_DEFAULT)"
|
|
122
|
+
fi
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# ── phase 1 · code — the tree itself, and its purity ────────────────────────
|
|
126
|
+
code_phase() {
|
|
127
|
+
local n=0
|
|
128
|
+
[ -x "$ROOT/bin/ymir-install.sh" ] && n=$(find "$ROOT/bin" -maxdepth 1 -name '*.sh' 2>/dev/null | wc -l)
|
|
129
|
+
if [ "$n" -gt 0 ] && [ -d "$ROOT/.agents/skills" ] && [ -d "$ROOT/RULES" ]; then
|
|
130
|
+
emit 1 code integrity SKIP "tree intact — $n scripts, .agents/skills, RULES/"
|
|
131
|
+
else
|
|
132
|
+
emit 1 code integrity BLOCKED "bin/, .agents/skills or RULES/ is missing — reinstall the package or re-clone"
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# The law this row enforces: the package is the code that RUNS the programs.
|
|
136
|
+
# Everything the operator owns — their records, their state, their settings,
|
|
137
|
+
# their credentials — lives in the home they chose. A packaged install replaces
|
|
138
|
+
# its tree on upgrade, so anything of theirs kept here is kept at its peril.
|
|
139
|
+
# A settings file GIT TRACKS is not theirs: that is the distro's shipped
|
|
140
|
+
# default, and it stays where the code ships it.
|
|
141
|
+
local leaked="" f n
|
|
142
|
+
n="$(ls -A "$ROOT/data" 2>/dev/null | grep -vc '^\.gitkeep$' || true)"
|
|
143
|
+
[ -d "$ROOT/data" ] && [ "${n:-0}" -gt 0 ] && leaked="$leaked data/"
|
|
144
|
+
n="$(ls -A "$ROOT/state" 2>/dev/null | grep -vc '^\.gitkeep$' || true)"
|
|
145
|
+
[ -d "$ROOT/state" ] && [ "${n:-0}" -gt 0 ] && leaked="$leaked state/"
|
|
146
|
+
for f in config/agents.yaml config/cron.yaml config/tailscale-sync.yaml config/wedge-alarm .env.local; do
|
|
147
|
+
[ -e "$ROOT/$f" ] || continue
|
|
148
|
+
# `config` is a symlink into .agents/config, and git tracks the REAL path —
|
|
149
|
+
# ask it about the name the index holds, not the link the tree shows.
|
|
150
|
+
local ask="$f"
|
|
151
|
+
case "$f" in config/*) [ -L "$ROOT/config" ] && ask=".agents/config/${f#config/}" ;; esac
|
|
152
|
+
if command -v git >/dev/null 2>&1 && git -C "$ROOT" ls-files --error-unmatch "$ask" >/dev/null 2>&1; then
|
|
153
|
+
continue # the distro ships this one — code, not the operator's own
|
|
154
|
+
fi
|
|
155
|
+
leaked="$leaked $f"
|
|
156
|
+
done
|
|
157
|
+
if [ -n "$leaked" ]; then
|
|
158
|
+
emit 1 code purity DO "the operator's own things sit in the code tree ($leaked) — they belong in $YMIR_HOME, or the next upgrade will erase them"
|
|
159
|
+
else
|
|
160
|
+
emit 1 code purity SKIP "nothing of the operator's is written into the code tree"
|
|
161
|
+
fi
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# ── phase 2 · home — the operator's world, outside the tree ─────────────────
|
|
165
|
+
home_phase() {
|
|
166
|
+
if [ -d "$HOARD/identity" ] && [ -d "$HOARD/secrets" ]; then
|
|
167
|
+
emit 2 home hoard SKIP "hodd/{identity,secrets,memory} present"
|
|
168
|
+
else
|
|
169
|
+
emit 2 home hoard DO "create hodd/{identity,secrets,docs,tenants,memory} — all private data lives here"
|
|
170
|
+
fi
|
|
171
|
+
if [ -d "$YMIR_HOME/workspaces" ]; then
|
|
172
|
+
emit 2 home workspaces SKIP "$YMIR_HOME/workspaces present"
|
|
173
|
+
else
|
|
174
|
+
emit 2 home workspaces DO "create workspaces/{work,personal} and the registries"
|
|
175
|
+
fi
|
|
176
|
+
# Settings are the operator's: they live in the home, never in the package.
|
|
177
|
+
local settings; hoard_settings_dir settings
|
|
178
|
+
if [ -e "$settings/agents.yaml" ]; then
|
|
179
|
+
emit 2 home agents-config SKIP "the agent set is seeded ($settings/agents.yaml)"
|
|
180
|
+
else
|
|
181
|
+
emit 2 home agents-config DO "seed the private agent set into $settings/agents.yaml (harness + model per agent)"
|
|
182
|
+
fi
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# ── phase 3 · runtimes — every one proven by a probe, never assumed ─────────
|
|
186
|
+
runtimes_phase() {
|
|
187
|
+
local missing=""
|
|
188
|
+
for c in git python3; do have "$c" || missing="$missing $c"; done
|
|
189
|
+
if [ -n "$missing" ]; then
|
|
190
|
+
emit 3 runtimes system BLOCKED "missing$missing — a system package (apt/dnf/brew), not user space"
|
|
191
|
+
else
|
|
192
|
+
emit 3 runtimes system SKIP "git and python3 present"
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
local user=""
|
|
196
|
+
for c in bun uv; do have "$c" || user="$user $c"; done
|
|
197
|
+
if [ -n "$user" ]; then emit 3 runtimes userspace DO "install in user space (no sudo):$user"
|
|
198
|
+
else emit 3 runtimes userspace SKIP "bun and uv present"; fi
|
|
199
|
+
|
|
200
|
+
if have mcp; then emit 3 runtimes mcp SKIP "mcp<2> present"; else emit 3 runtimes mcp DO "install mcp<2> via pip"; fi
|
|
201
|
+
if have pi; then emit 3 runtimes pi SKIP "the Pi harness present"; else emit 3 runtimes pi DO "install the Pi harness"; fi
|
|
202
|
+
if have hermes; then emit 3 runtimes hermes SKIP "the Hermes worker runtime present"; else emit 3 runtimes hermes DO "install the Hermes worker runtime"; fi
|
|
203
|
+
|
|
204
|
+
if have herdr; then emit 3 runtimes backend SKIP "herdr — Þjazi (the preferred terminal backend)"
|
|
205
|
+
elif have tmux; then emit 3 runtimes backend SKIP "tmux — the accepted reference backend"
|
|
206
|
+
else emit 3 runtimes backend DO "install herdr (Þjazi), else tmux — without a backend no Eindri can be seated"; fi
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
# ── phase 4 · engines — the OSS anvils Ymir wraps ───────────────────────────
|
|
210
|
+
engine_row() { # <bin> <label>
|
|
211
|
+
if have "$1"; then emit 4 engines "$1" SKIP "$2 present"
|
|
212
|
+
else emit 4 engines "$1" DO "install $2 ($1)"; fi
|
|
213
|
+
}
|
|
214
|
+
engines_phase() {
|
|
215
|
+
engine_row treehouse "Yggdrasil (the worktree engine)"
|
|
216
|
+
engine_row no-mistakes "the clean-PR gate (Mjollnir · Glitnir)"
|
|
217
|
+
if have sandcastle; then emit 4 engines sandcastle SKIP "Utgard present"
|
|
218
|
+
else emit 4 engines sandcastle DO "install sandcastle (Utgard) if available"; fi
|
|
219
|
+
|
|
220
|
+
if have docker || have podman; then
|
|
221
|
+
local img
|
|
222
|
+
if have docker && docker image inspect utgard-runner:latest >/dev/null 2>&1; then
|
|
223
|
+
emit 4 engines utgard-image SKIP "utgard-runner:latest present"
|
|
224
|
+
elif have podman && podman image exists utgard-runner:latest >/dev/null 2>&1; then
|
|
225
|
+
emit 4 engines utgard-image SKIP "utgard-runner:latest present (podman)"
|
|
226
|
+
else
|
|
227
|
+
emit 4 engines utgard-image DO "build the sandbox image utgard-runner:latest"
|
|
228
|
+
fi
|
|
229
|
+
else
|
|
230
|
+
emit 4 engines utgard-image BLOCKED "no container engine — the sandbox cannot be built"
|
|
231
|
+
fi
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
# ── phase 5 · apps — the surfaces the operator actually sees ────────────────
|
|
235
|
+
# Four surfaces, one shape each: web build required, Electron shell gated.
|
|
236
|
+
# The apps are their own packages (@zerwiz/<app>) — the distro depends on them.
|
|
237
|
+
app_row() { # <name> <about>
|
|
238
|
+
local name="$1" about="$2" dir
|
|
239
|
+
if dir="$(app_dir "$name")"; then
|
|
240
|
+
if [ -d "$dir/dist" ] || [ -d "$dir/out" ]; then
|
|
241
|
+
emit 5 apps "$name" SKIP "$about — installed, and its build shipped with it"
|
|
242
|
+
else
|
|
243
|
+
emit 5 apps "$name" DO "$about — installed from source; the web build is still to make"
|
|
244
|
+
fi
|
|
245
|
+
elif grep -q "\"@zerwiz/$name\"" "$ROOT/package.json" 2>/dev/null; then
|
|
246
|
+
# Declared as a dependency of the distro but not present: the package exists,
|
|
247
|
+
# the tree simply has not fetched it. That is a DO, not a dead end.
|
|
248
|
+
emit 5 apps "$name" DO "$about — declared as a dependency but not fetched (npm i -g @zerwiz/ymir fetches it)"
|
|
249
|
+
else
|
|
250
|
+
emit 5 apps "$name" BLOCKED "$about — no apps/$name, no @zerwiz/$name package, and the distro does not depend on it"
|
|
251
|
+
fi
|
|
252
|
+
}
|
|
253
|
+
apps_phase() {
|
|
254
|
+
app_row hlidskjalf "the control plane (the high seat), served on :3888"
|
|
255
|
+
app_row odrerir "the live hall (chat + council)"
|
|
256
|
+
app_row sessrumnir "the seat-hall desktop"
|
|
257
|
+
app_row smidja "the smithy and its visualizer (:8437)"
|
|
258
|
+
|
|
259
|
+
local shells=0 d
|
|
260
|
+
for d in hlidskjalf odrerir sessrumnir; do
|
|
261
|
+
dir="$(app_dir "$d" 2>/dev/null || true)"
|
|
262
|
+
if [ -n "$dir" ] && [ -d "$dir/node_modules/electron/dist" ]; then shells=$((shells+1)); fi
|
|
263
|
+
done
|
|
264
|
+
if [ "$shells" -ge 3 ]; then
|
|
265
|
+
emit 5 apps electron SKIP "the three desktop shells are built (electron runtime present)"
|
|
266
|
+
elif [ "${YMIR_NO_DESKTOP:-0}" = 1 ]; then
|
|
267
|
+
emit 5 apps electron SKIP "declined (--no-desktop) — the web surfaces stand without the shells"
|
|
268
|
+
else
|
|
269
|
+
emit 5 apps electron CONSENT "build the desktop shells? each pulls a ~100 MB Electron runtime — the web surfaces need none of it"
|
|
270
|
+
fi
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
# ── phase 6 · wire — the way in, and the agent set ──────────────────────────
|
|
274
|
+
wire_phase() {
|
|
275
|
+
local door="none"
|
|
276
|
+
if [ -x "$ROOT/bin/ymir-setup-auth.sh" ]; then
|
|
277
|
+
door="$(bash "$ROOT/bin/ymir-setup-auth.sh" status 2>/dev/null | sed -n '2p' | cut -d, -f1 | tr -d ' "')"
|
|
278
|
+
fi
|
|
279
|
+
if [ -n "$door" ] && [ "$door" != none ]; then
|
|
280
|
+
emit 6 wire auth SKIP "an operator credential is set ($door)"
|
|
281
|
+
else
|
|
282
|
+
emit 6 wire auth CONSENT "no credential — a password or GitHub sign-in; without it the gate has no door"
|
|
283
|
+
fi
|
|
284
|
+
|
|
285
|
+
local codes=""
|
|
286
|
+
[ -x "$ROOT/bin/ymir-invite.sh" ] && codes="$(bash "$ROOT/bin/ymir-invite.sh" list 2>/dev/null | grep -c '^ "' || true)"
|
|
287
|
+
if [ "${codes:-0}" -gt 0 ]; then emit 6 wire invite SKIP "a live invite code exists"
|
|
288
|
+
else emit 6 wire invite CONSENT "mint an invite code — how anyone else is let in (registration stays closed without one)"; fi
|
|
289
|
+
|
|
290
|
+
if [ -d /usr/share/omarchy ]; then
|
|
291
|
+
emit 6 wire launchers DO "place each app on its own numbered desktop + write the launcher entries"
|
|
292
|
+
else
|
|
293
|
+
emit 6 wire launchers SKIP "not an Omarchy host — the Omarchy layer skips cleanly (Rule 05)"
|
|
294
|
+
fi
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
# ── phase 7 · raise — the services, then what the operator sees ─────────────
|
|
298
|
+
raise_phase() {
|
|
299
|
+
local down="" p
|
|
300
|
+
for p in 3888:Hlidskjalf 3889:gate-API 4603:Bifrost 8437:Smidja-visualizer; do
|
|
301
|
+
port_up "${p%%:*}" || down="$down ${p#*:}"
|
|
302
|
+
done
|
|
303
|
+
if [ -n "$down" ]; then emit 7 raise services DO "raise:$down"
|
|
304
|
+
else emit 7 raise services SKIP "every service is listening (SPA · gate API · Bifrost · visualizer)"; fi
|
|
305
|
+
if have hermes; then emit 7 raise well INFO "the memory well (engram) is provisioned by its own step"; fi
|
|
306
|
+
emit 7 raise desktop CONSENT "open the desktop apps so they are seen, not merely installed"
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
# ── phase 8 · verify — what stands, honestly ────────────────────────────────
|
|
310
|
+
verify_phase() {
|
|
311
|
+
if [ -x "$SCRIPT_DIR/ymir-validate.sh" ]; then
|
|
312
|
+
emit 8 verify validate DO "observe the result: ports, stores, processes, the sandbox image"
|
|
313
|
+
else
|
|
314
|
+
emit 8 verify validate BLOCKED "bin/ymir-validate.sh is absent — the install could not be proven"
|
|
315
|
+
fi
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
resolve_phase; code_phase; home_phase; runtimes_phase; engines_phase; apps_phase; wire_phase; raise_phase; verify_phase
|
|
319
|
+
|
|
320
|
+
# ── output ──────────────────────────────────────────────────────────────────
|
|
321
|
+
if [ "$JSON" = 1 ]; then
|
|
322
|
+
printf '['
|
|
323
|
+
local_i=0
|
|
324
|
+
for i in "${!P_STEP[@]}"; do
|
|
325
|
+
[ -n "$ONLY_PHASE" ] && [ "${P_N[$i]}" != "$ONLY_PHASE" ] && continue
|
|
326
|
+
[ "$ONLY_BLOCKED" = 1 ] && [ "${P_STATE[$i]}" != BLOCKED ] && continue
|
|
327
|
+
[ "$local_i" -gt 0 ] && printf ','
|
|
328
|
+
printf '\n {"phase":%s,"name":"%s","step":"%s","state":"%s","why":"%s"}' \
|
|
329
|
+
"${P_N[$i]}" "${P_NAME[$i]}" "${P_STEP[$i]}" "${P_STATE[$i]}" "${P_WHY[$i]}"
|
|
330
|
+
local_i=$((local_i+1))
|
|
331
|
+
done
|
|
332
|
+
[ "$local_i" -gt 0 ] && printf '\n'
|
|
333
|
+
printf ']\n'
|
|
334
|
+
exit 0
|
|
335
|
+
fi
|
|
336
|
+
|
|
337
|
+
shown=0
|
|
338
|
+
for i in "${!P_STEP[@]}"; do
|
|
339
|
+
[ -n "$ONLY_PHASE" ] && [ "${P_N[$i]}" != "$ONLY_PHASE" ] && continue
|
|
340
|
+
[ "$ONLY_BLOCKED" = 1 ] && [ "${P_STATE[$i]}" != BLOCKED ] && continue
|
|
341
|
+
shown=$((shown+1))
|
|
342
|
+
done
|
|
343
|
+
|
|
344
|
+
if [ "$shown" -eq 0 ]; then
|
|
345
|
+
if [ "$ONLY_BLOCKED" = 1 ]; then printf 'plan: 0 blocked steps — nothing is holding the install back\n'
|
|
346
|
+
else printf 'plan: 0 rows for phase %s\n' "$ONLY_PHASE"; fi
|
|
347
|
+
exit 0
|
|
348
|
+
fi
|
|
349
|
+
|
|
350
|
+
printf 'plan[%d]{phase,name,step,state,why}:\n' "$shown"
|
|
351
|
+
for i in "${!P_STEP[@]}"; do
|
|
352
|
+
[ -n "$ONLY_PHASE" ] && [ "${P_N[$i]}" != "$ONLY_PHASE" ] && continue
|
|
353
|
+
[ "$ONLY_BLOCKED" = 1 ] && [ "${P_STATE[$i]}" != BLOCKED ] && continue
|
|
354
|
+
printf ' "%s","%s","%s","%s","%s"\n' "${P_N[$i]}" "${P_NAME[$i]}" "${P_STEP[$i]}" "${P_STATE[$i]}" "${P_WHY[$i]}"
|
|
355
|
+
done
|
|
356
|
+
exit 0
|