@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,539 @@
|
|
|
1
|
+
# Hlidskjalf UI — working guide
|
|
2
|
+
|
|
3
|
+
Ymir's own surface (one of the three things Ymir owns: the UI, the runtime, A2A).
|
|
4
|
+
Load this when touching `apps/hlidskjalf`. The design contract is `docs/design.md`;
|
|
5
|
+
the tokens are the single source of truth.
|
|
6
|
+
|
|
7
|
+
## Surfaces
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
surfaces[6]{part,where,note}:
|
|
11
|
+
"SPA",":3888 (vite) / built dist served by the gate","React app; gates: Fleet, Chat, Runes, …"
|
|
12
|
+
"gate API",":3889 (bun apps/hlidskjalf/server/index.ts)","auth + /api/* + serves dist/; static types + caching"
|
|
13
|
+
"login","in-app modal → /api/login → session cookie","user/pass from .env.local HLIDSKJALF_AUTH; Heimdall (oauth2-proxy) is the target"
|
|
14
|
+
"register","in-app modal → /api/register → spends an invite code","bin/ymir-invite.sh mints a limited-use code when nothing is live; argon2id account in state/accounts.json (0600, gitignored)"
|
|
15
|
+
"desktop","apps/hlidskjalf/electron/main.cjs + scripts/electron.sh","single instance + one window (never stack); see the ymir skill assets/desktop.md"
|
|
16
|
+
"tunnel","gjallarhorn → your hostname → :3889","outbound only; `bin/gjallarhorn-tunnel.sh`"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Quick rules:
|
|
20
|
+
|
|
21
|
+
- **One login, one window** — no GitHub hop before Heimdall; auth stays in-window.
|
|
22
|
+
- **Gate API protects `/api/*`** and serves the SPA; 401 → `ymir:unauthorized`.
|
|
23
|
+
- **No secrets inline** — `HLIDSKJALF_AUTH` from `.env.local`.
|
|
24
|
+
- **Electron:** single-instance lock; `openWindow` reuses the live window.
|
|
25
|
+
- Raise/repair: `scripts/start.sh`; if the window is gone but ports answer, the
|
|
26
|
+
shell must be restarted (backend ≠ window).
|
|
27
|
+
|
|
28
|
+
## Location & stack
|
|
29
|
+
|
|
30
|
+
- App: `apps/hlidskjalf` — **React 19 + Vite + TypeScript**, state via **Zustand**.
|
|
31
|
+
- The app lives in **its own repo** (`zerwiz/hlidskjalf`, registered in the home
|
|
32
|
+
registry) — the monorepo never tracks it; `bin/ymir-install.sh`'s `apps` step
|
|
33
|
+
clones it into `apps/hlidskjalf` at install, or fast-forwards a present clone.
|
|
34
|
+
- Gate API: `apps/hlidskjalf/server/index.ts` — **Bun + `bun:sqlite`**, read-only,
|
|
35
|
+
bound to the runtime and the smithy trace; Vite proxies `/api` → `:3889`.
|
|
36
|
+
- Raise everything with the scripts (do not hand-start each process):
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
scripts/start.sh # SPA :3888 · gate API :3889 · Smíðja visualizer :8437 · Nornir cron · Bifrost bridge
|
|
40
|
+
scripts/stop.sh # lower them all
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- Verify: `npm run typecheck` (`tsc --noEmit`) and `npm run build` must both be green.
|
|
44
|
+
- Headless check: render with Playwright/Chrome and assert **0 console errors**.
|
|
45
|
+
|
|
46
|
+
## Tokens — never hardcode colour
|
|
47
|
+
|
|
48
|
+
- Canonical tokens: `midgard/design-system/tokens.css`, imported once in
|
|
49
|
+
`src/main.tsx` (Vite `server.fs.allow` grants access outside the app root).
|
|
50
|
+
- Style with CSS variables only (`var(--ymir-cyan-1)`, `var(--ymir-bg-2)`, …).
|
|
51
|
+
**Never** write a raw hex in a component or a stylesheet — add a token instead.
|
|
52
|
+
- The active **accent** is driven by `--realm-tint` / `--realm-tint-2` /
|
|
53
|
+
`--realm-tint-dim` on `:root`, set per realm via `data-realm` and overridable by
|
|
54
|
+
the user (`state/store.ts` → `applyAccent`). Tenant overrides live in
|
|
55
|
+
`tenantColors`.
|
|
56
|
+
- **Fonts** are the cloth's three faces, loaded from Google Fonts in `index.html`:
|
|
57
|
+
Cormorant (display/runes), Newsreader (body), IBM Plex Mono (data), with Noto
|
|
58
|
+
Sans Runic appended to every stack so a rune glyph falls through to the rune
|
|
59
|
+
family.
|
|
60
|
+
|
|
61
|
+
### The cloth (2026-09-13)
|
|
62
|
+
|
|
63
|
+
The token *values* are the **carved cloth of the halls** — the landing page's own
|
|
64
|
+
palette (`CodeP/ymir-homepage/src/lore.html` `:root`; the hall carries its own
|
|
65
|
+
locked copy at `apps/odrerir/src/styles/cloth.css`), so Hlidskjalf, Smíðja and
|
|
66
|
+
Sessrúmnir are one look (`docs/design.md` §0/§4.2 is the contract):
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
canvas bg-0 #0e0c09 · bg-1 #151209 · bg-2 #1a1610 · bg-3 #221d14 (stone)
|
|
70
|
+
accent cyan-1 #c9973f bronze · cyan-2 #7d5f2a bronze-deep
|
|
71
|
+
violet-1 #96a0a8 steel · violet-2 #5f686e steel-dim
|
|
72
|
+
lines steel-1 #2b241a (line) · steel-2 #7d5f2a (brass rule) · chisel #c9973f
|
|
73
|
+
text text-0 #cfc3a9 bone · text-1 rgba(207,195,169,.82) · text-2 #9a8f75 · text-3 #6b6250
|
|
74
|
+
state ok #96a0a8 steel · warn #c9973f · danger #c2584a blood-lit · info #9a8f75
|
|
75
|
+
bevel inset 0 0 0 1px rgba(201,151,79,.12)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Rules that hold it honest:
|
|
79
|
+
|
|
80
|
+
- **The cloth is the default, not a cage** — a user accent/background choice wins
|
|
81
|
+
(`AccentPicker`), and the eight **house/domain seals keep their heraldry**
|
|
82
|
+
(`DOMAINS`), exactly as the landing page keeps its house seals. Chrome is the
|
|
83
|
+
cloth; heraldry is not chrome.
|
|
84
|
+
- The **workspace tints** are cloth too: `work` = bronze `#c9973f`, `personal` =
|
|
85
|
+
steel `#96a0a8` (`src/data/realms.ts` → `WORKSPACES`, mirrored by the
|
|
86
|
+
`data-realm` fallbacks in `styles/global.css`).
|
|
87
|
+
- The **Emblem** (`components/Emblem.tsx`, `midgard/design-system/ymir-mark.svg`)
|
|
88
|
+
is brand, not cloth — it keeps its own colours on the stone.
|
|
89
|
+
- The login's GitHub button is a bone plate with a dark rune (the old white/navy
|
|
90
|
+
literal is gone), and the `HallsChooser` cards read real tokens (they used to
|
|
91
|
+
name two tokens that never existed, `--ymir-line`/`--ymir-panel`).
|
|
92
|
+
- Role-coloured literals in the stylesheets are now `color-mix(… var(--token) …)`,
|
|
93
|
+
so a token change re-themes them.
|
|
94
|
+
- Geometry did not move: radius, spacing and the shell are unchanged by the cloth
|
|
95
|
+
(the carved-slate squaring is still an open question).
|
|
96
|
+
|
|
97
|
+
## The shell (structural, do not redesign)
|
|
98
|
+
|
|
99
|
+
- `.shell` grid: `236px rail | 1fr`; rows `56px topbar · stage · stream`
|
|
100
|
+
(the stream height is draggable, persisted in `streamHeight`).
|
|
101
|
+
- The **Fleet graph** (`gates/Fleet.tsx`) lays the roster on a 100×100 canvas:
|
|
102
|
+
Brokk as the hub, everyone else in a square-ish grid fan (`cols =
|
|
103
|
+
ceil(sqrt(n))`, pitch ≥ one ring + label) so 20 agents never collide; rings
|
|
104
|
+
carry the house glyph from `DOMAINS[agent.domain]` with a `ymirlabs`
|
|
105
|
+
fallback, and the live cards come from `bin/hlidskjalf-agents.sh` — which
|
|
106
|
+
reads each figure's `domain:` frontmatter (never a hardcoded `ymirlabs` for
|
|
107
|
+
everyone).
|
|
108
|
+
- `.rail` (brand · gates · tenants · status), `.topbar` (realm chip · search ·
|
|
109
|
+
accent · density · trace index · account), `main.stage` (the gate), `.stream`
|
|
110
|
+
(Ratatoskr + Runes, pausable).
|
|
111
|
+
- Gates are **deep-linkable** and registered in `src/data/realms.ts` (`GATES`) and
|
|
112
|
+
routed in `src/app/Shell.tsx`:
|
|
113
|
+
`#/fleet` · `#/tasks` · `#/well` · `#/runes` · `#/reviews` · `#/processes` ·
|
|
114
|
+
`#/files` · `#/chat` · `#/forge` · `#/profile` · `#/sessions` · `#/trace` ·
|
|
115
|
+
`#/decisions` · `#/stats` · `#/cron` · `#/runtime`.
|
|
116
|
+
|
|
117
|
+
## Rules of the surface
|
|
118
|
+
|
|
119
|
+
1. **Color-only states are forbidden** — every status carries glyph + colour + text
|
|
120
|
+
(`StatusChip`, `TaskChip`).
|
|
121
|
+
2. **Runecoded, not emoji** — use the rune family (runic glyphs fall through to
|
|
122
|
+
Noto Sans Runic inside the Cormorant/mono stacks); never an emoji as an icon.
|
|
123
|
+
3. **Every button must act** — no dead controls. Wire to a state change, a modal, or
|
|
124
|
+
a toast.
|
|
125
|
+
4. **Motion explains** — 120–240ms, no bounce; honour `prefers-reduced-motion`.
|
|
126
|
+
5. **Metrics are IBM Plex Mono, tabular** (`.mono`, `.tabular`).
|
|
127
|
+
6. **Metadata per page** — a gate declares its title/description/OG tags in
|
|
128
|
+
`src/data/metadata.ts`; `Shell` applies them on gate/realm change.
|
|
129
|
+
|
|
130
|
+
## Interaction patterns (modal + toast)
|
|
131
|
+
|
|
132
|
+
- `src/state/ui.ts` exposes `useUI()` → `toast({kind,title,body})` and
|
|
133
|
+
`openModal({variant,title,body,fields,content,onSubmit})`.
|
|
134
|
+
- `<Overlay/>` (mounted in `App`) renders the modal + toast host. Variants:
|
|
135
|
+
`confirm`, `form` (fields), `info` (content block, e.g. a diff).
|
|
136
|
+
- Any consequential action **must** open a confirm/form modal, mutate the store,
|
|
137
|
+
emit a rune (`pushStream`), and toast the outcome. Reference: `components/PRCard.tsx`
|
|
138
|
+
(Seal / Request changes / View diff).
|
|
139
|
+
- Buttons get press feedback from `styles/overlays.css` (`translateY(1px) scale(.97)`).
|
|
140
|
+
|
|
141
|
+
## State & live data
|
|
142
|
+
|
|
143
|
+
- `src/state/store.ts` — session, realm, gate, accent, tenant colours, company,
|
|
144
|
+
and data: agents, tasks, runes, stream, recall, processes, reviews, files, chat,
|
|
145
|
+
skills, **smidja** (sessions/stats/decisions/db), **mimir**.
|
|
146
|
+
- **Live mode** loads the gate API (`loadLive`); every call degrades on its own and
|
|
147
|
+
has a 10s timeout (`services/api.ts`). Smíðja loads on a **separate track**
|
|
148
|
+
(`refreshSmidja`) so a slow endpoint (e.g. `/api/reviews`) cannot hold its gates
|
|
149
|
+
hostage. `App` polls `refreshSmidja` every 5s.
|
|
150
|
+
- Realm switching is **granted**: `setRealm` refuses a realm the session has no
|
|
151
|
+
grant. Tenant boundaries are sacred — never render another tenant's data.
|
|
152
|
+
- Persist user prefs to `localStorage` (`ymir.accent`, `ymir.tenant-colors`,
|
|
153
|
+
`ymir.company.*`, `ymir.stream-height`).
|
|
154
|
+
|
|
155
|
+
## The gate API surface (`/api`, read-only)
|
|
156
|
+
|
|
157
|
+
`/api/health · /api/me · /api/workspace · /api/agents · /api/tasks · /api/runes ·
|
|
158
|
+
/api/well · /api/processes · /api/reviews · /api/files · /api/runtime · /api/cron ·
|
|
159
|
+
/api/loaders · /api/checks · /api/settings · /api/stream · /api/mimir …` plus the
|
|
160
|
+
smithy trace: `/api/smidja/{health,sessions,sessions/:id,decisions,stats}` and
|
|
161
|
+
chat: `/api/chat/history`, `POST /api/chat`.
|
|
162
|
+
|
|
163
|
+
`POST /api/chat` resolves the chosen model against the operator's Pi catalog and
|
|
164
|
+
tries **every** engine that advertises it (LM Studio `:1234`, the llama.cpp
|
|
165
|
+
router `:8080`, Bifrost `:4603`), never only the first — a dead engine falls
|
|
166
|
+
through to a live one. Recall reads `.agents/memory/well/episodes.jsonl`
|
|
167
|
+
directly, so restoring that file revives the chat's memory without a restart.
|
|
168
|
+
|
|
169
|
+
### The EmberBackground hearth (the shared fire)
|
|
170
|
+
|
|
171
|
+
The animated glow behind the shell, the login, and Sessrúmnir's chat comes from
|
|
172
|
+
**one** hearth, not four copies: `midgard/design-system/ember.js` (`startEmbers`),
|
|
173
|
+
with Sessrúmnir's `ember-background.tsx` as its React port. Both draw the same
|
|
174
|
+
embers + haze, respect reduced-motion, and — since the Sep 17 mend — re-seed
|
|
175
|
+
via **ResizeObserver on the container**, not just `window.resize`: a split pane
|
|
176
|
+
or toggled sidebar changes the chat column's size without a window resize, and a
|
|
177
|
+
canvas that sized itself once at a stale dimension never shows the fire. The
|
|
178
|
+
shared module watches the host; the port watches its parent; re-seeding fires
|
|
179
|
+
only when the measured size actually changed (never per-frame).
|
|
180
|
+
|
|
181
|
+
### The gate API reads cheaply (added 2026-09-16)
|
|
182
|
+
|
|
183
|
+
The gate reads append-only ledgers (Runes, the well's `episodes.jsonl`, masterplan
|
|
184
|
+
orders) and probes live runtime scripts on every request. Both grow without bound,
|
|
185
|
+
so the hot readers are memoised and the probes now run off the event loop:
|
|
186
|
+
|
|
187
|
+
- `runAsync()` — read-only subprocess probes via `Bun.spawn` (was `spawnSync`,
|
|
188
|
+
which could block the single Bun event loop for up to 12s); results cached ~3s
|
|
189
|
+
and concurrent callers share one in-flight spawn. Sync `run()` stays for
|
|
190
|
+
**mutating** actions only (`setupRun`, `workspaceProvision`).
|
|
191
|
+
- `memo()` — `orders`, `runes`, `smidjaStats`, `chatRecall` are cached (2–3s), so a
|
|
192
|
+
request never re-parses the whole ledger or well.
|
|
193
|
+
|
|
194
|
+
Measured: `/api/checks` 442ms → 4ms warm; `/api/runtime` 312ms → 5ms warm;
|
|
195
|
+
20 parallel `/api/runes` in 8ms.
|
|
196
|
+
|
|
197
|
+
**Ports are environment-driven.** The SPA (Vite) and the gate API read
|
|
198
|
+
`HLIDSKJALF_PORT` (default `3888`) and `HLIDSKJALF_API_PORT` (default `3889`);
|
|
199
|
+
`scripts/start.sh` passes the API port to the server as `PORT`, and the visualizer
|
|
200
|
+
uses `SMIDJA_VIZ_API_PORT`. A deployment should use 5-digit ports (the Quadlet/
|
|
201
|
+
Compose examples publish `38888`/`38889`/`54370`) to avoid colliding with other
|
|
202
|
+
services on a shared host; the defaults are unchanged for bare local dev. The SPA
|
|
203
|
+
bind host is `HLIDSKJALF_HOST` (default `127.0.0.1`); inside a container set it to
|
|
204
|
+
`0.0.0.0` so the published port reaches it, and pin the host-side publish to
|
|
205
|
+
`127.0.0.1` so the surface stays private.
|
|
206
|
+
|
|
207
|
+
## Smíðja in the UI
|
|
208
|
+
|
|
209
|
+
The smithy's trace (its own `smidja/smidja_data/smidja.db`) is rendered by four gates:
|
|
210
|
+
|
|
211
|
+
| Gate | Route | Reads |
|
|
212
|
+
|---|---|---|
|
|
213
|
+
| Sessions | `#/sessions` | every run, status, tokens/cost — **Open visualizer** + **Refresh** |
|
|
214
|
+
| Trace | `#/trace` | the selected run: phase lanes, events, agent sessions |
|
|
215
|
+
| Decisions | `#/decisions` | failures clustered by diagnosis/model |
|
|
216
|
+
| Stats | `#/stats` | token/cost breakdown, cache, providers |
|
|
217
|
+
|
|
218
|
+
**Open visualizer** opens `VISUALIZER_URL` (`src/data/metadata.ts`, default
|
|
219
|
+
`http://127.0.0.1:8437`) — Smíðja's own Vue trace UI, served by the smithy's Bun
|
|
220
|
+
API on the same port (`scripts/start.sh` raises it). Details: `assets/smidja.md`,
|
|
221
|
+
`docs/lore.md` §XIII.
|
|
222
|
+
|
|
223
|
+
## Agents, skills & mythological naming
|
|
224
|
+
|
|
225
|
+
- The Forge gate (`src/gates/Forge.tsx`) creates/edits **Eindri** and **skills**,
|
|
226
|
+
and reads/edits the smithy's prompts. The skill list shows each skill's own
|
|
227
|
+
text: the name + aett rune on the head row, and the description line
|
|
228
|
+
underneath (`forge-item-desc`, dimmed until hover) — the description comes
|
|
229
|
+
from the live `/api/skills` index, truncated to 240 chars by the gate API.
|
|
230
|
+
- Naming law: `src/data/mythology.ts` maps a craft/capability → the Norse figure
|
|
231
|
+
whose myth matches it (smith→Sindri, skald→Bragi, sage→Huginn, judge→Tyr,
|
|
232
|
+
forger→Brokk …). Skills take an **aett** prefix.
|
|
233
|
+
- New skills are validated in Utgard before production (Gungnir, W0007).
|
|
234
|
+
|
|
235
|
+
## Identity
|
|
236
|
+
|
|
237
|
+
- Mark: `midgard/design-system/ymir-mark.svg` (served `public/ymir-mark.svg`), used
|
|
238
|
+
for login/rail logo and favicon. OG image: `public/og.png` (1200×630), source
|
|
239
|
+
`public/og.svg`. Rebuild the PNG with headless Chrome if the SVG changes.
|
|
240
|
+
|
|
241
|
+
## The desktop apps (Electron)
|
|
242
|
+
|
|
243
|
+
`Hlidskjalf` and `Smíðja` each run as their own Electron app (`electron/main.cjs`,
|
|
244
|
+
launched by `scripts/electron.sh start --both`).
|
|
245
|
+
|
|
246
|
+
**Window placement.** The apps open on a **non-primary** display when one is
|
|
247
|
+
attached (the Allfather keeps the dashboards beside his work) and on the primary
|
|
248
|
+
otherwise. All geometry is in **logical** units — Electron's `screen` API returns
|
|
249
|
+
physical ÷ scale, and Omarchy commonly runs a fractional scale (e.g. a 1920×1200
|
|
250
|
+
panel at 1.5 is a 1280×800 logical desktop), so a 1440-wide default is clamped to
|
|
251
|
+
the work area rather than overflowing it. `YMIR_DESKTOP_DISPLAY` overrides the
|
|
252
|
+
choice: `other` (default) · `primary` · an index.
|
|
253
|
+
|
|
254
|
+
**Identity.** Never track an Electron app by the pid returned from
|
|
255
|
+
`.bin/electron` — that is a node shim which *spawns* the real binary, so the pid
|
|
256
|
+
is wrong and a second launch stacks on the first. Identify it by its own command
|
|
257
|
+
line (the per-view `--user-data-dir` is stable), which is what `electron.sh` does.
|
|
258
|
+
|
|
259
|
+
**GPU.** On a small-VRAM iGPU the Wayland `--type=gpu-process` can die with
|
|
260
|
+
`amdgpu: Not enough memory for command submission` (SIGSEGV, not an OOM).
|
|
261
|
+
`YMIR_DESKTOP_DISABLE_GPU=1` adds `--disable-gpu --disable-gpu-compositing` —
|
|
262
|
+
these are dashboards, not 3D apps. See the `ymir` skill (its omarchy asset)
|
|
263
|
+
skill for the full native story.
|
|
264
|
+
|
|
265
|
+
## Verification
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
cd apps/hlidskjalf
|
|
269
|
+
npm run typecheck # tsc --noEmit
|
|
270
|
+
npm run build # must be green
|
|
271
|
+
# headless: render the gate and assert 0 console errors (Playwright/Chrome)
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Maintaining this
|
|
275
|
+
|
|
276
|
+
- **Owner:** Brokk. **Router:** `.agents/skills/galdr-ymirsystem/SKILL.md`.
|
|
277
|
+
- **Mirror:** `.agents/skills/tyr-check/assets/hlidskjalf-ui.md`.
|
|
278
|
+
- When the shell, tokens, gates, or the gate API change, update this asset and
|
|
279
|
+
`docs/design.md` together.
|
|
280
|
+
|
|
281
|
+
### The agent path the Fleet gate reads (2026-09-17)
|
|
282
|
+
|
|
283
|
+
`server/index.ts` decides whether a figure is *registered* by testing for its
|
|
284
|
+
profile in the OpenCode agent directory. That directory is **`.opencode/agents/`
|
|
285
|
+
— PLURAL**, which is what OpenCode actually loads. The singular
|
|
286
|
+
`.opencode/agent/` was never read by the harness, so twenty correct symlinks sat
|
|
287
|
+
in a directory no loader opened and the gate reported figures unregistered while
|
|
288
|
+
the tree held them all. Any code that resolves an agent profile must use the
|
|
289
|
+
plural path; the loader (`bin/valknut-load.sh`) migrates a legacy singular dir
|
|
290
|
+
forward and binds the plural one.
|
|
291
|
+
|
|
292
|
+
## Domains, not houses (Rule 01/03)
|
|
293
|
+
|
|
294
|
+
The eight Labs are **domains (Greinar)** — the knowledge axes — not houses. A
|
|
295
|
+
**house is a company** (WayOf). In the UI the eight render as an agent's
|
|
296
|
+
**domain** (`agent.domain` via the `DOMAINS` map in `src/data/realms.ts`); the
|
|
297
|
+
Forge picker is labelled **Domain**. `svartalfaheim/<company>/companies/` holds
|
|
298
|
+
the house card(s); the eight domain cards live under `.../domains/`.
|
|
299
|
+
|
|
300
|
+
### The GPU-process crash on a shared-memory iGPU (fixed 2026-09-12)
|
|
301
|
+
|
|
302
|
+
Symptom: both dashboards appear and work, while `coredumpctl` fills with SIGSEGV
|
|
303
|
+
cores from `electron --type=gpu-process`, and the kernel logs `amdgpu … Not enough
|
|
304
|
+
memory for command submission` immediately before each one. The window survives
|
|
305
|
+
because only the **GPU process** dies; Electron retries it, then falls back.
|
|
306
|
+
|
|
307
|
+
Cause: an iGPU has a small VRAM carve-out and backs the rest with system RAM
|
|
308
|
+
(GTT). A local model served on that same iGPU can hold several GiB of GTT, after
|
|
309
|
+
which the driver fails the desktop's command submissions. Electron's error path
|
|
310
|
+
dereferences NULL — a segfault at a constant offset, not memory corruption.
|
|
311
|
+
|
|
312
|
+
`scripts/electron.sh` now decides for itself: `igpu_vram_small()` reads
|
|
313
|
+
`/sys/class/drm/card*/device/mem_info_vram_total` and switches the dashboards to
|
|
314
|
+
software rendering when the carve-out is under `YMIR_IGPU_VRAM_SMALL_MIB`
|
|
315
|
+
(default 2048). `YMIR_DESKTOP_DISABLE_GPU=1` forces software, `=0` forces the GPU
|
|
316
|
+
path. Verified: with the fix the amdgpu submission errors stop and the
|
|
317
|
+
gpu-process runs SwiftShader instead of the hardware path.
|
|
318
|
+
|
|
319
|
+
If the crash returns, check GTT before anything else — `mem_info_gtt_used` on the
|
|
320
|
+
render device, next to whatever is serving a model on that GPU.
|
|
321
|
+
|
|
322
|
+
### The login surface carries no operator name
|
|
323
|
+
|
|
324
|
+
The in-app login (the gate shows it; there is no browser prompt) renders its
|
|
325
|
+
fields from the server template in `apps/hlidskjalf/server/index.ts`. Neither the
|
|
326
|
+
placeholder nor any default may name the operator: the field says `username`, and
|
|
327
|
+
the password comes from `HLIDSKJALF_AUTH` in `.env.local`, never inline. A
|
|
328
|
+
hardcoded name here is both a leak into the public tree and wrong for any other
|
|
329
|
+
operator — `bin/public-guard.sh` exists to catch exactly that class of mistake.
|
|
330
|
+
|
|
331
|
+
**The gate must actually receive it.** `scripts/start.sh` loads `.env.local`
|
|
332
|
+
(mode `0600`, gitignored) into the environment before raising the gate, because
|
|
333
|
+
the bun process reads `process.env.HLIDSKJALF_AUTH` and nothing else was loading
|
|
334
|
+
it — so a credential set by `bin/ymir-setup-auth.sh` never took effect, and an
|
|
335
|
+
empty `GATE_AUTH` makes the gate treat every request as authenticated. After
|
|
336
|
+
setting a credential, restart the gate: `scripts/stop.sh; scripts/start.sh`.
|
|
337
|
+
|
|
338
|
+
### One login, and it is the one with the lore (2026-09-12)
|
|
339
|
+
|
|
340
|
+
There used to be **two** ways in, and the second was a mistake:
|
|
341
|
+
|
|
342
|
+
| | what it was | fate |
|
|
343
|
+
|---|---|---|
|
|
344
|
+
| `components/LoginModal.tsx` | the gate's login, beside the saga panel | **kept** — the only login |
|
|
345
|
+
| `app/Login.tsx` | a mock identity picker (`MOCK_IDENTITIES`), "Mock · Heimdall W0028 pending", demo mode | **deleted** |
|
|
346
|
+
|
|
347
|
+
The mock was wrong in a way that mattered: `App` rendered it as the fallback
|
|
348
|
+
whenever the store had no session, so a *correct* sign-in could land on a screen
|
|
349
|
+
offering a hardcoded identity — the operator's own name and email among them. The
|
|
350
|
+
demo scaffolding went with it (`demo` flag, `setApiDemo`, `data/mock.ts`,
|
|
351
|
+
`enterDemo`/`signIn`, the fake chat reply that claimed the well was seeded), and
|
|
352
|
+
with it every branch that could invent data in a live session.
|
|
353
|
+
|
|
354
|
+
What replaced it:
|
|
355
|
+
|
|
356
|
+
- **One session shaper.** `services/auth.ts` exports `sessionFor(login)` — the
|
|
357
|
+
gate decides *who*, the UI only shapes what it renders. `App` calls
|
|
358
|
+
`gateApi.session()` at boot and establishes the session from the login the gate
|
|
359
|
+
reports; `establishSession(login)` replaced `signIn`/`enterDemo` in the store.
|
|
360
|
+
- **A GitHub door on the same gate.** `LoginModal` carries *Continue with GitHub*
|
|
361
|
+
→ `GET /api/auth/github`, which returns the authorize URL when
|
|
362
|
+
`GITHUB_CLIENT_ID`/`GITHUB_CLIENT_SECRET` are set, and the exact reason when
|
|
363
|
+
they are not. The callback (`/api/auth/github/callback`) exchanges the code,
|
|
364
|
+
reads `/user`, and then **requires an account for that login** — accounts come
|
|
365
|
+
from an invite, so GitHub never becomes an open door.
|
|
366
|
+
- **A 401 still re-locks.** `noteUnauthorized` is the only thing the demo switch
|
|
367
|
+
was suppressing, and it survives without it.
|
|
368
|
+
|
|
369
|
+
Verified: `tsc --noEmit` and `npm run build` green, and the served SPA renders the
|
|
370
|
+
lore login with the invite affordance and no baked-in identity.
|
|
371
|
+
|
|
372
|
+
### Accounts and invites — how someone else gets in (added 2026-09-12)
|
|
373
|
+
|
|
374
|
+
One operator owns an instance. `HLIDSKJALF_AUTH` is that operator. Everyone else
|
|
375
|
+
enters through an **invite code**: registration is closed unless a live code is
|
|
376
|
+
presented, and a code carries its own ceiling, so a shared link cannot quietly
|
|
377
|
+
become an open door.
|
|
378
|
+
|
|
379
|
+
```
|
|
380
|
+
POST /api/register {username,password,invite} → 201 + session (403 when refused)
|
|
381
|
+
POST /api/login {username,password} → 200 + session (operator OR account)
|
|
382
|
+
GET /api/session → {authed,login,registration}
|
|
383
|
+
GET /api/invites → {invites,accounts} (authed)
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
- **Store:** `apps/hlidskjalf/server/accounts.ts` owns accounts and invites.
|
|
387
|
+
`SESSIONS` is a `Map<token,login>` — a session knows *who* it is, and
|
|
388
|
+
`/api/me` reports that login, never a hardcoded one.
|
|
389
|
+
- **Where it lives:** `~/.config/ymir/accounts.json`, mode `0600`
|
|
390
|
+
(`YMIR_CONFIG_DIR` overrides, for tests). Machine state, never in the repo.
|
|
391
|
+
- **Passwords:** `Bun.password` argon2id via `Bun.password.hash/verify`. The
|
|
392
|
+
plaintext is never written; only the hash lands.
|
|
393
|
+
- **The operator's own tool:** `bin/ymir-invite.sh {mint,list,revoke,where,ensure}`.
|
|
394
|
+
`ensure` mints only when nothing is live, so the installer stays idempotent.
|
|
395
|
+
- **The UI:** `LoginModal` offers "I have an invite code" **only while
|
|
396
|
+
`/api/session.registration` is true**. A spent or revoked code removes the
|
|
397
|
+
offer, because the gate is what decides — the surface merely reports it.
|
|
398
|
+
- **Refusals are spoken:** the gate's own sentence ("that invite code has been
|
|
399
|
+
used up") is carried to the caller by `services/api.ts` (`errorText`), so the
|
|
400
|
+
login surface says what is actually wrong instead of a bare status.
|
|
401
|
+
|
|
402
|
+
### Speed-starts inside the apps (added 2026-09-12)
|
|
403
|
+
|
|
404
|
+
Each app's own UI can raise the other one — `POST /api/desktop {view}`, valid for
|
|
405
|
+
`hlidskjalf` and `smidja`. Both servers implement it by calling
|
|
406
|
+
`scripts/electron.sh start --view <view>`, the same launcher the Omarchy key
|
|
407
|
+
bindings use, so there is **one** way to raise a Ymir window: it raises the app
|
|
408
|
+
when it is already up, and starts it when it is not. The visualizer finds the
|
|
409
|
+
checkout by walking up to the directory holding `scripts/electron.sh`, so it
|
|
410
|
+
works wherever the app is served from.
|
|
411
|
+
|
|
412
|
+
**rename sweep (2026-09-12).** The `galdr` -> `galdr-ymirsystem` rename corrected a stale path reference inside `apps/hlidskjalf/server/index.ts` as well; behaviour unchanged.
|
|
413
|
+
|
|
414
|
+
### The gate's default realm is `wayof` (2026-09-12)
|
|
415
|
+
|
|
416
|
+
Three places in `apps/hlidskjalf/server/index.ts` defaulted to the retired name
|
|
417
|
+
`way-of` (the fleet event realm, the reviews realm, and a seeded lint review).
|
|
418
|
+
They now default to `wayof`, matching `svartalfaheim/README.md`: one company
|
|
419
|
+
container, no person realms. A retired realm name in a default is not cosmetic —
|
|
420
|
+
it sends an event to a directory the platform does not have.
|
|
421
|
+
|
|
422
|
+
### Reviews now reads real pull requests (added 2026-09-13)
|
|
423
|
+
|
|
424
|
+
`/api/reviews` built exactly one synthetic card (`id: 'lint'`, `number: 1`,
|
|
425
|
+
"Brokk lint gate") from the lint + compliance checks — it **never read a pull
|
|
426
|
+
request**, so a delivered change had no Glitnir card and Mjollnir's PR leg had
|
|
427
|
+
nowhere to land. `reviews()` now first lists the repo's **open PRs** via
|
|
428
|
+
`gh pr list --json …` (mapping `statusCheckRollup` to the card's checks; a
|
|
429
|
+
failing check sets `state: 'changes'`), then appends the lint + compliance card
|
|
430
|
+
(now `number: 0`). Real PRs lead the list; the compile-and-lint card stays.
|
|
431
|
+
The review surface's operator copy now names the **Allfather** throughout — the
|
|
432
|
+
seal prompt, the rune emit string, the "awaiting the Allfather" tile, and the
|
|
433
|
+
gate comment — retiring the imported `captain` term.
|
|
434
|
+
|
|
435
|
+
### One seat, three halls (added 2026-09-13)
|
|
436
|
+
|
|
437
|
+
- **Post-login chooser** (`src/components/Halls.tsx`): `App.tsx` shows it once
|
|
438
|
+
after the gate admits the session — three cards explaining Hlidskjalf, Smíðja,
|
|
439
|
+
and Sessrúmnir, each raising its hall.
|
|
440
|
+
- **Switcher**: `Halls.tsx` also exports `HallsSwitcher` (three rune buttons),
|
|
441
|
+
which replaces the lone Smíðja speed-start button in the Topbar. Smíðja's own
|
|
442
|
+
topbar and Sessrúmnir's menu carry matching switchers; all route through the
|
|
443
|
+
gate's `/api/desktop`, which now raises Sessrúmnir too (`bin/sessrumnir.sh`).
|
|
444
|
+
- **Search box**: `.topbar .search` `min-width` was 120px — narrower than the
|
|
445
|
+
text "Search work workspace…", so the placeholder clipped. Raised to 280px;
|
|
446
|
+
the input may shrink (`min-width: 0`).
|
|
447
|
+
- **One login, Sign out everywhere — verified live, never a file.** The gate is
|
|
448
|
+
the one authority: a session is an in-memory `token → login` map, handed out as
|
|
449
|
+
the httpOnly `ymir_session` cookie. There is **no bearer on disk** and **no
|
|
450
|
+
header credential** (`X-Ymir-Session`/`Bearer` are rejected): a persisted token
|
|
451
|
+
is a credential at rest any local process could replay, and a session read from
|
|
452
|
+
a file is "logged in when you are not". A gate restart ends sessions (nothing
|
|
453
|
+
revives one). Other surfaces verify live: the Smíðja visualizer server forwards
|
|
454
|
+
the browser's cookie to the gate's `/api/session`; Sessrúmnir, having no gate
|
|
455
|
+
cookie, shows a Sign-in link rather than claiming a session. Sign out clears the
|
|
456
|
+
cookie and the in-memory token (shell menu; AccountMenu).
|
|
457
|
+
- **The GitHub door is offered only when it can open**: `/api/auth/github`
|
|
458
|
+
returns 503 when no OAuth app is configured, so `/api/session` now carries
|
|
459
|
+
`github: !!(GITHUB_CLIENT_ID && GITHUB_CLIENT_SECRET)` and `LoginModal` renders
|
|
460
|
+
the "Continue with GitHub" button (and its `or` divider) only when true. The
|
|
461
|
+
password door (`HLIDSKJALF_AUTH`) is always present. Configure GitHub with
|
|
462
|
+
`bin/ymir-setup-auth.sh github`.
|
|
463
|
+
|
|
464
|
+
Rule: a Hlidskjalf code change updates this asset in the same pass — the
|
|
465
|
+
compliance gate (`assets/governed assets current`) fails otherwise.
|
|
466
|
+
|
|
467
|
+
### The Hall door — one button out of the three halls (added 2026-09-13)
|
|
468
|
+
|
|
469
|
+
The **Óðrerir Live Hall** (the fleet's carved stone/bronze board; now its own
|
|
470
|
+
app at `apps/odrerir`, migrated from `~/CodeP/ymir-homepage` on 2026-09-15) is
|
|
471
|
+
**not** one of the gate's three apps but it IS its own desktop app since the
|
|
472
|
+
migration. The gate raises Hlidskjalf/Smíðja/Sessrúmnir (`/api/desktop` →
|
|
473
|
+
`scripts/electron.sh`); Óðrerir is raised with them by `scripts/start.sh` on
|
|
474
|
+
`:4322`, opens in its own window via `scripts/electron.sh start --view odrerir`
|
|
475
|
+
(native app identity `ymir-odrerir`), and its in-app door is a plain anchor in a
|
|
476
|
+
new tab — **never** a launcher call.
|
|
477
|
+
|
|
478
|
+
- **Where:** `app/Topbar.tsx` carries it beside `HallsSwitcher` — `.hall-btn`, the
|
|
479
|
+
rune **Othala (ᛟ)** plus "To the Hall", tinted with the active realm accent so
|
|
480
|
+
it reads as the same chrome as the chips around it. Styled in `styles/shell.css`
|
|
481
|
+
(tokens only, no raw hex), press feedback in `styles/overlays.css`.
|
|
482
|
+
- **The hall app:** `apps/odrerir` — an Astro board (the Óðrerir Live Hall) that
|
|
483
|
+
serves `:4322` and reads `public/livehall.json`, written by
|
|
484
|
+
`bin/hall-snapshot.sh` (planning glass; public-safe). Its own Electron shell:
|
|
485
|
+
`apps/odrerir/electron/main.cjs`, raised by `scripts/electron.sh --view odrerir`.
|
|
486
|
+
- **Target rule — one rule for all of Ymir's apps:** `HALL_URL` in
|
|
487
|
+
`src/data/metadata.ts`. `window.location.host` starting with `localhost` or
|
|
488
|
+
`127.0.0.1` → `http://localhost:4322`; any other host → the public
|
|
489
|
+
`https://hall.ymir.zerw.org`. `VITE_HALL_URL` overrides it, exactly as
|
|
490
|
+
`VISUALIZER_URL` does. Each app computes this inline — the Vite builds are
|
|
491
|
+
separate, so there is no shared module to hang it on.
|
|
492
|
+
- **Same door** in the Smíðja visualizer's topbar and in Sessrúmnir, so every
|
|
493
|
+
app's chrome has one way to the Hall.
|
|
494
|
+
- Verified: both branches of the rule in both apps (headless Chromium DOM probe),
|
|
495
|
+
`tsc --noEmit && vite build` green, 0 console errors; `apps/odrerir` builds
|
|
496
|
+
standalone and the hall answers `:4322` from `scripts/start.sh`.
|
|
497
|
+
|
|
498
|
+
## Packaging (Amendment C)
|
|
499
|
+
|
|
500
|
+
Each app ships as its own published package under the `@zerwiz` scope (the scope
|
|
501
|
+
that already carries `@zerwiz/ymir`) — `@zerwiz/hlidskjalf`, `@zerwiz/odrerir`,
|
|
502
|
+
and `apps/hlidskjalf/package.json` carries the metadata that makes that legal:
|
|
503
|
+
`license`, `repository`, `publishConfig.access: public`, a `files` surface, and
|
|
504
|
+
`prepack` where a build exists (never `prepublishOnly`: a build must not be able
|
|
505
|
+
to veto a publish, and neither must a documentation gate).
|
|
506
|
+
|
|
507
|
+
Two facts worth keeping:
|
|
508
|
+
|
|
509
|
+
- **The APK is not in the tarball.** `apps/hlidskjalf/dist/ymir.apk` (~13.6 MB)
|
|
510
|
+
is built for Android, not for npm; `files` excludes it with `!dist/*.apk`.
|
|
511
|
+
Including it took the package from 1.3 MB to 14.5 MB — npm is not an APK
|
|
512
|
+
distribution channel.
|
|
513
|
+
- **`private: true` is the safety catch.** It stays set until the Allfather
|
|
514
|
+
publishes deliberately, so no accidental `npm publish` can push a half-built
|
|
515
|
+
artefact to a public registry.
|
|
516
|
+
|
|
517
|
+
Measured with `npm pack --dry-run --ignore-scripts` (see the app's `files` for
|
|
518
|
+
the exact surface).
|
|
519
|
+
|
|
520
|
+
## The two doors — web logs in, the desktop seat does not
|
|
521
|
+
|
|
522
|
+
There is **one** login surface (`LoginModal` → `POST /api/login`), and it belongs
|
|
523
|
+
to the **web** door. The desktop shell (Electron) is a local, trusted seat and is
|
|
524
|
+
never asked to log in.
|
|
525
|
+
|
|
526
|
+
The mechanism is deliberately narrow, because a marker a client can send is not
|
|
527
|
+
proof of anything:
|
|
528
|
+
|
|
529
|
+
- the Electron preload exposes `window.ymirDesktop = { desktop: true }`;
|
|
530
|
+
- the SPA sends `x-ymir-surface: desktop` on every request, and
|
|
531
|
+
`?surface=desktop` on the SSE stream (EventSource cannot set headers);
|
|
532
|
+
- the gate (`server/index.ts`) honours that marker **only when the request
|
|
533
|
+
arrives over loopback** — `REQUEST_IP`, recorded per request from Bun's
|
|
534
|
+
`server.requestIP(req)`, because Bun's `Request` carries no socket. A remote
|
|
535
|
+
web caller can send the header and still be refused.
|
|
536
|
+
|
|
537
|
+
Verified both ways: `GET /api/session` without a cookie is `authed:false` and
|
|
538
|
+
`/api/orders` is 401; the same calls with the marker from 127.0.0.1 are
|
|
539
|
+
`authed:true` (login = the operator) and 200.
|