@zerwiz/ymir 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 +290 -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 +50 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +9 -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/config/tailscale-sync.yaml +27 -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/kaia.engram +0 -0
- package/.agents/memory/kaia.engram-shm +0 -0
- package/.agents/memory/kaia.engram-wal +0 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/memory/well/episodes.jsonl +367 -0
- package/.agents/memory/well/workspace.jsonl +27 -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 +111 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -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 +158 -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 +673 -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 +496 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -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 +161 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -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 +96 -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 +175 -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 +360 -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 +70 -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 +52 -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 +34 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -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 +454 -0
- package/CHANGELOG.md +881 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +113 -59
- 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 +65 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +58 -0
- package/RULES/07-config.md +45 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/README.md +20 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +98 -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 +233 -0
- package/bin/apodex-smoke-test.sh +92 -0
- package/bin/bifrost-bridge.sh +112 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +107 -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 +38 -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-guard.sh +165 -0
- package/bin/crash-sense.sh +160 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +207 -0
- package/bin/eindri-acclaim.sh +34 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seen.sh +41 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +85 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +112 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/fleet-apply.sh +68 -0
- package/bin/github-deploy.sh +81 -0
- package/bin/gjallarhorn-expose.sh +102 -0
- package/bin/gjallarhorn-notify.sh +58 -0
- package/bin/gjallarhorn-purge.sh +54 -0
- package/bin/gjallarhorn-tunnel.sh +72 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +122 -0
- package/bin/hall-snapshot.sh +92 -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 +431 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hoard-lib.sh +25 -0
- package/bin/hodd.sh +78 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +108 -0
- package/bin/local-model-lock.sh +51 -0
- package/bin/mimir-bridge.py +226 -0
- package/bin/mimir-bridge.sh +87 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +59 -0
- package/bin/mjollnir.sh +85 -0
- package/bin/model-hardware.sh +82 -0
- package/bin/model-resolve.sh +147 -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-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +148 -0
- package/bin/omarchy-plugins.sh +174 -0
- package/bin/omarchy-sense.sh +149 -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-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +38 -0
- package/bin/project-git.sh +55 -0
- package/bin/public-guard.sh +70 -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 +91 -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 +90 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +76 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +190 -0
- package/bin/telegram-bot.sh +69 -0
- package/bin/toolchain.sh +74 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +260 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +47 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +150 -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 +641 -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-platform.sh +348 -0
- package/bin/ymir-say.sh +97 -0
- package/bin/ymir-setup-auth.sh +108 -0
- package/bin/ymir-validate.sh +173 -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 +1056 -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 +44 -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 +210 -0
- package/scripts/start.sh +167 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Rule 06 — Append-only
|
|
2
|
+
|
|
3
|
+
Some records are the system's memory. They are **appended to**, never rewritten,
|
|
4
|
+
never truncated, never reordered — and **never lost in a move**.
|
|
5
|
+
|
|
6
|
+
## What is append-only
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
append_only[6]{artifact,why}:
|
|
10
|
+
"$YMIR_HOME/memory/runes_audit.md","the Runes ledger — each entry folds the previous checksum, so a rewritten line breaks every later line"
|
|
11
|
+
"$YMIR_HOME/docs/append-only-log.md","the decision log: what was decided, when, and why"
|
|
12
|
+
"CHANGELOG.md","chronological entries; Brokk appends and never rewrites"
|
|
13
|
+
"RULES/*.md","house law: a rule that contradicts another is changed first, never silently edited"
|
|
14
|
+
"$YMIR_HOME/**","the private record — the operator's hoard, committed to the private git repo, never gitignored"
|
|
15
|
+
"*.jsonl / branch outcomes / session logs","event streams; a re-run is a new file, not a shorter one"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## The law
|
|
19
|
+
|
|
20
|
+
- **Append, never rewrite.** A correction is a **new** entry that cites the old
|
|
21
|
+
one. The old text stays; that is what makes the record trustworthy.
|
|
22
|
+
- **Never truncate.** Rotation is a new file with a new name, never a shortened
|
|
23
|
+
one. "It is long" is not a reason to delete a line.
|
|
24
|
+
- **Never lose one in a move.** A migration, re-clone, swap or backup **must carry
|
|
25
|
+
every append-only artifact**. They are the part of the system that cannot be
|
|
26
|
+
regenerated from code.
|
|
27
|
+
- **Never rewrite shared history to tidy it.** A force-push or history rewrite
|
|
28
|
+
must be weighed against this rule before it happens, not after.
|
|
29
|
+
- **A contradiction changes the rule first.** The rules themselves obey this
|
|
30
|
+
rule: append the change, keep the history.
|
|
31
|
+
- **Verify by name at the boundary.** Before and after any move, check the
|
|
32
|
+
append-only set explicitly — a move that drops one is a **violation**, not an
|
|
33
|
+
accident.
|
|
34
|
+
|
|
35
|
+
## The duty at a move
|
|
36
|
+
|
|
37
|
+
This rule exists because a home swap dropped `docs/append-only-log.md`,
|
|
38
|
+
`docs/masterplan.md`, `docs/plans/` and the private business set: the backup
|
|
39
|
+
carried `state`, `.env.local`, `data`, the realm and `workspace` — but not
|
|
40
|
+
`docs/` or `assets/`. The code arrived; the memory did not.
|
|
41
|
+
|
|
42
|
+
So the check is explicit, and it is part of the move:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# the append-only set must exist on both sides of a move
|
|
46
|
+
for f in CHANGELOG.md docs/append-only-log.md; do
|
|
47
|
+
[ -e "$f" ] || echo "MISSING append-only artifact: $f"
|
|
48
|
+
done
|
|
49
|
+
# and the private set must be in YMIR_HOME, not merely in the old home
|
|
50
|
+
ls "$YMIR_HOME/docs" "$YMIR_HOME/identity" "$YMIR_HOME/data" 2>/dev/null
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
A backup is only as good as its file list. If a directory is not named in the
|
|
54
|
+
backup, it is not carried — and this rule says the append-only and private sets
|
|
55
|
+
are always named.
|
|
56
|
+
|
|
57
|
+
**Related:** `RULES/04-hoard.md` (where private records live), `AGENTS.md`,
|
|
58
|
+
`.agents/skills/galdr-ymirsystem/assets/installation.md` (the move procedure).
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Rule 07 — Configuration is never hardcoded
|
|
2
|
+
|
|
3
|
+
Every port, host, endpoint, path, credential, and tunable is **configuration**, not
|
|
4
|
+
a literal baked into shipped runtime. A hardcoded value is a bug that only appears
|
|
5
|
+
on someone else's machine — or someone else's server.
|
|
6
|
+
|
|
7
|
+
## The law
|
|
8
|
+
|
|
9
|
+
- **One default, one place.** A value has exactly one documented default, owned by
|
|
10
|
+
the portability layer (`bin/ymir-platform.sh`) or a config file (e.g.
|
|
11
|
+
`config/agents.yaml`). Everywhere else reads it; nothing else restates it.
|
|
12
|
+
- **Env first, then config, then the documented default.** Resolve as
|
|
13
|
+
`${VAR:-default}` (or the app's equivalent) — never a bare literal.
|
|
14
|
+
- **No literal ports.** Ports come from env (`HLIDSKJALF_PORT`,
|
|
15
|
+
`HLIDSKJALF_API_PORT`, `SMIDJA_VIZ_API_PORT`, `PORT`, …). A published port, a
|
|
16
|
+
proxy target, and a health probe must all read the *same* source.
|
|
17
|
+
- **No literal hosts or URLs.** `127.0.0.1`, `localhost`, tunnel hostnames, registry
|
|
18
|
+
and mesh endpoints resolve from env/config.
|
|
19
|
+
- **No literal paths to secrets.** Secrets are referenced by path (`YMIR_HOARD`,
|
|
20
|
+
`.env.local`, `.env.realm`) and resolved at run time; never inlined.
|
|
21
|
+
- **No literal credentials. Ever.**
|
|
22
|
+
- **Bind and publish are separate and explicit.** An app binds a host
|
|
23
|
+
(`HLIDSKJALF_HOST`); a deployment publishes a host-IP/port. Neither assumes the
|
|
24
|
+
other's value.
|
|
25
|
+
- **A deployment overrides; it never patches the core.** Environments run from
|
|
26
|
+
env/config (`deploy/env.example`, Quadlet/Compose env), so the same core runs
|
|
27
|
+
anywhere — a laptop, a bare box, a container, or a shared server.
|
|
28
|
+
|
|
29
|
+
## Scope
|
|
30
|
+
|
|
31
|
+
Every shipped surface: `bin/`, `scripts/`, `apps/`, `.agents/skills/**` tools,
|
|
32
|
+
deploy manifests, and generated config.
|
|
33
|
+
|
|
34
|
+
## Enforcement
|
|
35
|
+
|
|
36
|
+
- Review, plus `bash .agents/skills/galdr-ymirsystem/scripts/compliance-check.sh`.
|
|
37
|
+
- The portability layer is the **one** place that knows an environment difference
|
|
38
|
+
(Rule 05). A hardcoded value is a Rule 05 violation as well as a Rule 07 one.
|
|
39
|
+
|
|
40
|
+
## Why
|
|
41
|
+
|
|
42
|
+
Hardcoding is how a substrate written on one machine breaks on another, or
|
|
43
|
+
collides with a neighbour's port on a shared server — the exact failure a
|
|
44
|
+
host-agnostic core exists to prevent. This rule is the companion of Rule 05: Rule
|
|
45
|
+
05 keeps *behaviour* portable; Rule 07 keeps *configuration* portable.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Rule 08 — Delivery Gate & Worktree Engine
|
|
2
|
+
|
|
3
|
+
## 08.1 Every Change Leaves by Pull Request
|
|
4
|
+
|
|
5
|
+
**No direct pushes to `main` or any protected branch.** Every change — code,
|
|
6
|
+
config, docs, scripts — must:
|
|
7
|
+
|
|
8
|
+
1. Be done in a Yggdrasil worktree on a feature branch
|
|
9
|
+
2. Pass all local gates (lint, typecheck, tests)
|
|
10
|
+
3. Be pushed as a branch
|
|
11
|
+
4. Opened as a Pull Request via `gh pr create`
|
|
12
|
+
5. Reviewed in Glitnir (human review)
|
|
13
|
+
6. Approved by the Allfather
|
|
14
|
+
7. Merged via the PR interface — **never locally**
|
|
15
|
+
|
|
16
|
+
A local merge on a verbal "word" is a decision, not a delivery. It leaves
|
|
17
|
+
Glitnir with nothing to review. The gate is only fed by a PR.
|
|
18
|
+
|
|
19
|
+
**Exception:** None. If work is already on local `main`, ship it as a PR (a
|
|
20
|
+
branch at that commit) before doing anything else.
|
|
21
|
+
|
|
22
|
+
## 08.2 Yggdrasil Worktrees Use treehouse
|
|
23
|
+
|
|
24
|
+
**All worktree operations go through `treehouse`** (github.com/kunchenguid/treehouse).
|
|
25
|
+
Never use raw `git worktree` commands directly.
|
|
26
|
+
|
|
27
|
+
| Operation | Command |
|
|
28
|
+
|-----------|---------|
|
|
29
|
+
| Create worktree | `bin/yggdrasil.sh create <branch>` |
|
|
30
|
+
| List worktrees | `bin/yggdrasil.sh list` |
|
|
31
|
+
| Remove worktree | `bin/yggdrasil.sh remove <branch>` |
|
|
32
|
+
| Sync worktree | `bin/yggdrasil.sh sync <branch>` |
|
|
33
|
+
|
|
34
|
+
The `bin/yggdrasil.sh` script is the Norse shell over the treehouse engine.
|
|
35
|
+
It handles:
|
|
36
|
+
- Branch creation from correct base
|
|
37
|
+
- Worktree path management under `.yggdrasil/<agent-id>/`
|
|
38
|
+
- Remote tracking setup
|
|
39
|
+
- Cleanup on completion
|
|
40
|
+
|
|
41
|
+
## 08.3 Utgard Sandboxes Use sandcastle
|
|
42
|
+
|
|
43
|
+
**All untrusted code, dynamic skills, and sub-agent tasks run inside Utgard**
|
|
44
|
+
via `sandcastle` (github.com/mattpocock/sandcastle, @ai-hero/sandcastle).
|
|
45
|
+
Never run untrusted code on the host.
|
|
46
|
+
|
|
47
|
+
| Operation | Command |
|
|
48
|
+
|-----------|---------|
|
|
49
|
+
| Spawn sandbox | `bin/utgard.sh spawn <profile>` |
|
|
50
|
+
| Run in sandbox | `bin/utgard.sh run <profile> <cmd>` |
|
|
51
|
+
| Destroy sandbox | `bin/utgard.sh destroy <id>` |
|
|
52
|
+
|
|
53
|
+
Utgard enforces: CPU/RAM/timeout caps, no host root, no network by default.
|
|
54
|
+
A failed Utgard execution never touches main.
|
|
55
|
+
|
|
56
|
+
## 08.4 Enforcement
|
|
57
|
+
|
|
58
|
+
- **Pre-push hook** (installed by `bin/ymir-install.sh`) rejects direct pushes
|
|
59
|
+
to protected branches
|
|
60
|
+
- **CI gate** (`.no-mistakes.yaml` + `no-mistakes` skill) validates PRs before
|
|
61
|
+
merge
|
|
62
|
+
- **Mjollnir pipeline** (`bin/mjollnir.sh`) automates issue → worktree → PR
|
|
63
|
+
|
|
64
|
+
## 08.5 References
|
|
65
|
+
|
|
66
|
+
- `bin/yggdrasil.sh` — treehouse wrapper
|
|
67
|
+
- `bin/utgard.sh` — sandcastle wrapper
|
|
68
|
+
- `bin/mjollnir.sh` — issue→PR pipeline
|
|
69
|
+
- `.no-mistakes.yaml` — clean-PR gate config
|
|
70
|
+
- `RULES/02-agents.md` — agents are canonical, harness dirs are symlinks
|
|
71
|
+
- `RULES/05-platforms.md` — core portable, per-OS layers updated together
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
*Append-only. A correction is a new entry citing the old one.*
|
package/RULES/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# RULES — the house law
|
|
2
|
+
|
|
3
|
+
Numbered, binding rules for how Ymir is organised. A rule is law: code, plans,
|
|
4
|
+
UI, and agents obey it, and a change that contradicts a rule must first change
|
|
5
|
+
the rule (append-only; never silently rewritten).
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
rules_index[9]{file,subject}:
|
|
9
|
+
"01-domains.md","domains (Greinar) · houses · Eindri"
|
|
10
|
+
"02-agents.md","agents: home, kinds, profile contract, no mock"
|
|
11
|
+
"03-houses.md","houses = companies; ownership, records, boundaries"
|
|
12
|
+
"04-hoard.md","Hodd: the one private place — secrets, docs, tenants, identity"
|
|
13
|
+
"05-platforms.md","one portable core + per-OS installation layers; core changes propagate"
|
|
14
|
+
"06-append-only.md","some records are memory: append, never rewrite, never lose on a move"
|
|
15
|
+
"07-config.md","configuration is never hardcoded: ports/hosts/paths/credentials resolve from env/config"
|
|
16
|
+
"08-delivery-gate.md","PR-only delivery; treehouse worktrees; sandcastle sandboxes"
|
|
17
|
+
"README.md","this index"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Keep each rule short and unambiguous; reference it from code where it bites.
|
package/bin/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# `bin/` — what every file does
|
|
2
|
+
|
|
3
|
+
Auto-generated from each script's header. One line per tool. Ported scripts are
|
|
4
|
+
credited to the upstream `firstmate` distro (port record: `.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md`); the rest are Ymir's own.
|
|
5
|
+
|
|
6
|
+
bin[101]{file,does}:
|
|
7
|
+
"a2a-mcp.sh","a2a-mcp.sh — install/verify the two A2A MCP servers into the harnesses so"
|
|
8
|
+
"a2a-serve.py","a2a-serve.py — a real A2A 1.0 server (a2a-sdk) whose agent is a seated Eindri:"
|
|
9
|
+
"a2a-serve.sh","a2a-serve.sh — run the a2a-sdk A2A 1.0 server for a seated Eindri."
|
|
10
|
+
"a2a-talk.sh","a2a-talk.sh — list A2A agents and talk to one (bidirectional reply)."
|
|
11
|
+
"agent-run.sh","agent-run.sh — run one agent's errand through the harness the Allfather chose."
|
|
12
|
+
"agents-config.sh","agents-config.sh — one YAML for the Allfather's agent/harness/model combination."
|
|
13
|
+
"bifrost-bridge.sh","bifrost-bridge.sh — raise/lower the model bridge (Bifrost: the bridge between"
|
|
14
|
+
"bifrost-ingress.sh","bifrost-ingress.sh — raise/lower the ingress stack (Bifrost · Heimdall · Gjallarhorn)."
|
|
15
|
+
"brokk","brokk — the primary agent's CLI (Brokk, the bellows-smith)."
|
|
16
|
+
"brokk-classify-lib.sh","tests, declared-external-wait vocabulary, and the working/paused absorb"
|
|
17
|
+
"brokk-lease-lib.sh","brokk-lease-lib.sh - the per-task supervision lease contract (one owner)."
|
|
18
|
+
"brokk-lease.sh","brokk-lease.sh - claim, release, inspect, and sweep per-task supervision leases."
|
|
19
|
+
"brokk-lint.sh","brokk-lint.sh — the Brokk lint gate. Single owner of lint for CI and"
|
|
20
|
+
"brokk-send.sh","brokk-send.sh — send a one-line steer to a running Brokk/Eindri-home."
|
|
21
|
+
"brokk-update.sh","brokk-update.sh — update Brokk and every registered Eindri-home to the latest."
|
|
22
|
+
"brokk-wake-grant.sh","shellcheck source=bin/brokk-wake-lib.sh"
|
|
23
|
+
"brokk-wake-lib.sh","Shared durable wake queue and portable lock helpers."
|
|
24
|
+
"crash-sense.sh","A crash nobody sees is a crash nobody fixes. This watches systemd-coredump for"
|
|
25
|
+
"desktop-place.sh","desktop-place.sh — put the Ymir apps on their own Hyprland desktops."
|
|
26
|
+
"docs-guard.sh","docs-guard.sh — docs/ is the PUBLIC, user-facing tree. Block operator-private"
|
|
27
|
+
"editor-place.sh","editor-place.sh — the editor opens on its OWN desktop, never on yours."
|
|
28
|
+
"eindri-control.sh","eindri-control.sh — the CONTROL plane: allowlisted lifecycle verbs for a"
|
|
29
|
+
"eindri-role.sh","eindri-role.sh — the right smith for the right metal."
|
|
30
|
+
"eindri-send.sh","eindri-send.sh — the DATA plane: send conversational text to a seated Eindri."
|
|
31
|
+
"eindri-start.sh","eindri-start.sh — start an Eindri as the Allfather asks. One command."
|
|
32
|
+
"einherjar-spawn.sh","einherjar-spawn.sh - gather an Eindri worker (Einherjar = the chosen who are"
|
|
33
|
+
"erindi-brief.sh","erindi-brief.sh - scaffold an Eindri worker brief at data/<task-id>/brief.md."
|
|
34
|
+
"fleet-apply.sh","fleet-apply.sh — apply fleet-wide preferences to every registered Eindri-home."
|
|
35
|
+
"github-deploy.sh","github-deploy.sh — zero-trust deploys (W0035). Sync secrets from the local env"
|
|
36
|
+
"gjallarhorn-notify.sh","gjallarhorn-notify.sh — the horn (W0036). Unified push: Telegram + a web/WS"
|
|
37
|
+
"gjallarhorn-purge.sh","gjallarhorn-purge.sh — purge the Cloudflare edge cache for a hostname."
|
|
38
|
+
"gjallarhorn-tunnel.sh","gjallarhorn-tunnel.sh — raise/lower the `ymir` Cloudflare tunnel (Gjallarhorn)."
|
|
39
|
+
"gleipnir-lock-lib.sh","gleipnir-lock-lib.sh - per-home session lock for the Brokk runtime."
|
|
40
|
+
"hamr-harness.sh","hamr-harness.sh - detect the agent harness (Hamr) this process tree runs on."
|
|
41
|
+
"heimdall-ssh-keys.sh","heimdall-ssh-keys.sh — Heimdall's SSH-keys surface."
|
|
42
|
+
"herdr-agents.py","(no header description)"
|
|
43
|
+
"herdr-ensure.sh","herdr-ensure.sh — Þjazi: guarantee the terminal backend Ymir needs."
|
|
44
|
+
"herdr-run.sh","herdr-run.sh — raise an Eindri in herdr, by the grain that fits the errand."
|
|
45
|
+
"hermes-ensure.sh","hermes-ensure.sh — ensure the Hermes agent runtime is present."
|
|
46
|
+
"hodd.sh","hodd.sh — the Allfather's private hoard: path, init, ls, load, tenant."
|
|
47
|
+
"local-model-lock.sh","local-model-lock.sh — serialize LOCAL model inference on one machine."
|
|
48
|
+
"mimir-bridge.py","(no header description)"
|
|
49
|
+
"mimir-bridge.sh","mimir-bridge.sh — raise/lower the well bridge (Mimirsbrunn on :4602)."
|
|
50
|
+
"mimir-ingest.sh","mimir-ingest.sh — ingest the repo's data material into the well (Mimirsbrunn)."
|
|
51
|
+
"mimir.sh","mimir.sh — the well (Mimirsbrunn). Drink before you act, water it after."
|
|
52
|
+
"mjollnir-webhook.sh","mjollnir-webhook.sh — HMAC-verified GitHub webhook → Mjollnir (W0018)."
|
|
53
|
+
"mjollnir.sh","mjollnir.sh — the hammer (W0018). An issue becomes a PR: read the issue, cut a"
|
|
54
|
+
"model-resolve.sh","model-resolve.sh — resolve a human model request to a concrete harness+model."
|
|
55
|
+
"nornir-cron-start.sh","nornir-cron-start.sh - ensure Brokk's scheduled jobs are running (idempotent)."
|
|
56
|
+
"nornir-job-daily-briefing.sh","nornir-job-daily-briefing.sh - the 07:00 Sága daily seeing."
|
|
57
|
+
"nornir-job-git-sync.sh","nornir-job-git-sync.sh - Yggdrasil, the world-tree kept in order."
|
|
58
|
+
"nornir-job-memory-housekeeping.sh","nornir-job-memory-housekeeping.sh - Muninn, the raven of memory."
|
|
59
|
+
"nornir-job-observer.sh","nornir-job-observer.sh - Huginn, the raven of observation."
|
|
60
|
+
"omarchy-hook-install.sh","omarchy-hook-install.sh — let Ymir notice when Omarchy updates."
|
|
61
|
+
"omarchy-install.sh","omarchy-install.sh — the Omarchy installation layer (Rule 05)."
|
|
62
|
+
"omarchy-plugins.sh","omarchy-plugins.sh — the Omarchy plugins Ymir suggests, and installs on consent."
|
|
63
|
+
"omarchy-sense.sh","omarchy-sense.sh — learn the Allfather's Omarchy machine."
|
|
64
|
+
"perm-guard.sh","perm-guard.sh — flag agent profiles whose permissions are self-defeating."
|
|
65
|
+
"pi-agent.sh","pi-agent.sh — run a Ymir agent on a LOCAL model with ITS OWN persona/mission"
|
|
66
|
+
"pi-local.sh","pi-local.sh — run a Pi agent on a LOCAL model, reusable."
|
|
67
|
+
"pi-seat.sh","pi-seat.sh — seat a Pi agent in a VISIBLE herdr pane, optionally on a local"
|
|
68
|
+
"prereq-ensure.sh","prereq-ensure.sh — self-healing prerequisite engine for Ymir."
|
|
69
|
+
"private-guard.sh","private-guard.sh — enforce the Hoard boundary (Rule 04). Nothing under a"
|
|
70
|
+
"project-git.sh","project-git.sh — resolve a project's GitHub block from the master registry"
|
|
71
|
+
"public-guard.sh","public-guard.sh — every PUBLIC, user-facing file must be free of operator"
|
|
72
|
+
"ratatoskr.sh","ratatoskr.sh — Ymir's front door to the A2A engine (`a2abridge`)."
|
|
73
|
+
"repo-scrub.sh","repo-scrub.sh — purge private paths from ALL git history before going public."
|
|
74
|
+
"rodd-operational-input.sh","rodd-operational-input.sh - canonical Rödd operational-input protocol."
|
|
75
|
+
"runes-append.sh","runes-append.sh - append-only Runes audit ledger."
|
|
76
|
+
"saga-session-start.sh","saga-session-start.sh - the one-command Brokk session start."
|
|
77
|
+
"saga-sessionstart-run.sh","saga-sessionstart-run.sh - session-open entry point for run-tier harnesses."
|
|
78
|
+
"saga-wake-drain.sh","saga-wake-drain.sh - present durable Brokk wakes."
|
|
79
|
+
"secret-guard.sh","secret-guard.sh — refuse to commit obvious secrets or private env files."
|
|
80
|
+
"skuld-branch-outcome.sh","skuld-branch-outcome.sh - the durable outcome store for the Pi supervision"
|
|
81
|
+
"skuld-branch-prompt.sh","skuld-branch-prompt.sh - emit the supervision branch's system prompt"
|
|
82
|
+
"smidja-bootstrap.sh","smidja-bootstrap.sh — make the Smíðja visualizer ready on a fresh install."
|
|
83
|
+
"smidja-observe.sh","smidja-observe.sh — the smithy's trace, read-only (W0075). Reads the REPO's own"
|
|
84
|
+
"syn-arm-pretool-check.sh","syn-arm-pretool-check.sh - PreToolUse seatbelt for watcher-arm bash commands."
|
|
85
|
+
"syn-asset-pretool-check.sh","syn-asset-pretool-check.sh — PreToolUse seatbelt for governed paths."
|
|
86
|
+
"syn-cd-pretool-check.sh","syn-cd-pretool-check.sh - PreToolUse seatbelt for directory-changing commands."
|
|
87
|
+
"syn-guard-pretool-check.sh","syn-guard-pretool-check.sh — PreToolUse seatbelt for the runtime's load-bearing invariants."
|
|
88
|
+
"syn-turnend-guard.sh","syn-turnend-guard.sh - refuse to let a Brokk turn end blind."
|
|
89
|
+
"syn-watch-arm.sh","syn-watch-arm.sh - arm one Brokk supervision watcher cycle."
|
|
90
|
+
"tailscale-sync.sh","tailscale-sync.sh — sync the Allfather's pi data across his OWN machines over"
|
|
91
|
+
"telegram-bot.sh","telegram-bot.sh — the horn answers (W0036). Long-poll Telegram for the owner's"
|
|
92
|
+
"toolchain.sh","toolchain.sh — the provider wrappers (W0033). A typed front door to the tools"
|
|
93
|
+
"utgard.sh","utgard.sh — the sealed execution barrier (Utgard, the realm outside the wall)."
|
|
94
|
+
"valhalla.sh","valhalla.sh — the process hall (Valhalla). List, inspect, revive, and read logs"
|
|
95
|
+
"valknut-load.sh","valknut-load.sh — Valknut, the knot that binds the repo distro into each tool's"
|
|
96
|
+
"vor-crew-state.sh","vor-crew-state.sh - deterministic read of an Eindri worker's CURRENT state."
|
|
97
|
+
"wedge-notify.sh","wedge-notify.sh — the Ymir wedge-alarm notifier."
|
|
98
|
+
"workspace-provision.sh","workspace-provision.sh — carve one workspace for the operator. Single tenant:"
|
|
99
|
+
"workspace-rag.sh","workspace-rag.sh — memory over the realm workspaces (W0038)."
|
|
100
|
+
"wyrd-db.sh","wyrd-db.sh — the database layer (W0040). Applies the platform schema and reports"
|
|
101
|
+
"yggdrasil.sh","yggdrasil.sh — the worktree manager (Yggdrasil, the world-tree)."
|
|
102
|
+
"ymir-edit.sh","ymir-edit.sh — open a file in the Allfather's editor, on its own desktop."
|
|
103
|
+
"ymir-install.sh","ymir-install.sh — THE FIRST SETUP. Stand the full Ymir up for the operator:"
|
|
104
|
+
"ymir-migrate.sh","ymir-migrate.sh — versioned STRUCTURE migrations for existing Ymir homes."
|
|
105
|
+
"ymir-platform.sh","ymir-platform.sh — the portability layer."
|
|
106
|
+
"ymir-say.sh","ymir-say.sh — let Ymir speak on the Allfather's desktop."
|
|
107
|
+
"ymir-validate.sh","ymir-validate.sh — verify the installation actually works."
|
package/bin/a2a-mcp.sh
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# a2a-mcp.sh — install/verify the Ymir MCP servers into the harnesses so every
|
|
3
|
+
# agent can use the mesh, the memory well, and the control plane at once.
|
|
4
|
+
#
|
|
5
|
+
# bin/a2a-mcp.sh install # add a2abridge + engram (+wayofteams if present) to pi + opencode
|
|
6
|
+
# bin/a2a-mcp.sh install --project # scoped: write the REPO's .pi/mcp.json + opencode.json, never ~/.pi
|
|
7
|
+
# bin/a2a-mcp.sh show [--project] # what is wired, in the chosen scope
|
|
8
|
+
# bin/a2a-mcp.sh --version
|
|
9
|
+
#
|
|
10
|
+
# Scope: default writes Pi's GLOBAL MCP list (~/.pi/agent/mcp.json). `--project`
|
|
11
|
+
# keeps everything inside the repo (`.pi/mcp.json` + `opencode.json`) so a Pi used
|
|
12
|
+
# in other areas is left untouched — launch it with `pi --mcp-config .pi/mcp.json`
|
|
13
|
+
# to pick the repo up.
|
|
14
|
+
set -u
|
|
15
|
+
|
|
16
|
+
VERSION="1.0.0"
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
18
|
+
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
19
|
+
OC="$ROOT/opencode.json"
|
|
20
|
+
A2AB="${A2ABRIDGE_BIN:-$HOME/.a2abridge/bin/a2abridge}"
|
|
21
|
+
DIR="${A2A_DIRECTORY:-http://127.0.0.1:7777}"
|
|
22
|
+
ADVERT="${A2A_ADVERTISE_HOST:-$(tailscale ip -4 2>/dev/null | head -1)}"
|
|
23
|
+
[ -n "$ADVERT" ] || ADVERT="127.0.0.1"
|
|
24
|
+
|
|
25
|
+
PROJECT=0; ACTION="show"
|
|
26
|
+
while [ $# -gt 0 ]; do
|
|
27
|
+
case "$1" in
|
|
28
|
+
--project) PROJECT=1 ;;
|
|
29
|
+
-v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
|
|
30
|
+
-h|--help) sed -n '2,12p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
|
|
31
|
+
*) ACTION="$1" ;;
|
|
32
|
+
esac
|
|
33
|
+
shift
|
|
34
|
+
done
|
|
35
|
+
if [ "$PROJECT" = 1 ]; then PI_MCP="$ROOT/.pi/mcp.json"; else PI_MCP="$HOME/.pi/agent/mcp.json"; fi
|
|
36
|
+
|
|
37
|
+
WOTES="$(command -v wayofteams-mcp 2>/dev/null || true)"
|
|
38
|
+
ENGRAM_BIN="${ENGRAM_BIN:-$HOME/.local/bin/engram-mcp}"
|
|
39
|
+
YMIR_HOME="${YMIR_HOME:-$HOME/Documents/Ymir}"
|
|
40
|
+
ENGRAM_DB="${ENGRAM_DB:-$YMIR_HOME/memory/kaia.engram}"
|
|
41
|
+
|
|
42
|
+
python3 - "$ROOT" "$PI_MCP" "$OC" "$A2AB" "$DIR" "$ADVERT" "$WOTES" "$ACTION" "$ENGRAM_BIN" "$ENGRAM_DB" <<'PY'
|
|
43
|
+
import sys, os, json
|
|
44
|
+
root, pi_path, oc_path, a2ab, durl, advert, wotes, action, engram_bin, engram_db = sys.argv[1:11]
|
|
45
|
+
|
|
46
|
+
def load(p, default):
|
|
47
|
+
try: return json.load(open(p))
|
|
48
|
+
except Exception: return default
|
|
49
|
+
|
|
50
|
+
ones = {
|
|
51
|
+
"a2abridge": {
|
|
52
|
+
"pi": {"command": a2ab, "args": ["bridge"],
|
|
53
|
+
"env": {"A2A_DIRECTORY": durl, "A2A_ADVERTISE_HOST": advert}},
|
|
54
|
+
"oc": {"type": "local", "command": [a2ab, "bridge"],
|
|
55
|
+
"environment": {"A2A_DIRECTORY": durl, "A2A_ADVERTISE_HOST": advert}},
|
|
56
|
+
},
|
|
57
|
+
"engram": {
|
|
58
|
+
"pi": {"command": engram_bin, "args": ["--db", engram_db]},
|
|
59
|
+
"oc": {"type": "local", "command": [engram_bin, "--db", engram_db], "environment": {}},
|
|
60
|
+
},
|
|
61
|
+
}
|
|
62
|
+
if wotes:
|
|
63
|
+
ones["wayofteams"] = {
|
|
64
|
+
"pi": {"command": wotes, "args": ["--stdio"], "env": {"WOTEAMS_URL": os.environ.get("WOTEAMS_URL","")}},
|
|
65
|
+
"oc": {"type": "local", "command": [wotes, "--stdio"], "environment": {"WOTEAMS_URL": os.environ.get("WOTEAMS_URL","")}},
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if action == "show":
|
|
69
|
+
pi = load(pi_path, {}).get("mcpServers", {})
|
|
70
|
+
oc = load(oc_path, {}).get("mcp", {})
|
|
71
|
+
print(f"a2a-mcp[{len(ones)}]{{server,in_pi,in_opencode}}:")
|
|
72
|
+
for name in ones:
|
|
73
|
+
print(f' "{name}","{"yes" if name in pi else "no"}","{"yes" if name in oc else "no"}"')
|
|
74
|
+
if not wotes:
|
|
75
|
+
print('help: wayofteams-mcp not on PATH — install it to enable the Teams plane')
|
|
76
|
+
sys.exit(0)
|
|
77
|
+
|
|
78
|
+
if action != "install":
|
|
79
|
+
print("error: use install|show"); sys.exit(2)
|
|
80
|
+
|
|
81
|
+
# pi mcp.json
|
|
82
|
+
pid = load(pi_path, {"mcpServers": {}})
|
|
83
|
+
pid.setdefault("mcpServers", {})
|
|
84
|
+
for name, spec in ones.items():
|
|
85
|
+
pid["mcpServers"][name] = spec["pi"]
|
|
86
|
+
os.makedirs(os.path.dirname(pi_path), exist_ok=True)
|
|
87
|
+
json.dump(pid, open(pi_path, "w"), indent=2)
|
|
88
|
+
|
|
89
|
+
# opencode.json mcp block
|
|
90
|
+
ocd = load(oc_path, {"mcp": {}})
|
|
91
|
+
ocd.setdefault("mcp", {})
|
|
92
|
+
for name, spec in ones.items():
|
|
93
|
+
entry = spec["oc"]; entry["enabled"] = True
|
|
94
|
+
ocd["mcp"][name] = entry
|
|
95
|
+
json.dump(ocd, open(oc_path, "w"), indent=2); open(oc_path, "a").write("\n")
|
|
96
|
+
|
|
97
|
+
print(f'a2a-mcp[1]{{action,servers}}:\n "install","{",".join(ones)}"')
|
|
98
|
+
PY
|
package/bin/a2a-serve.py
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# a2a-serve.py — a real A2A 1.0 server (a2a-sdk) whose agent is a seated Eindri:
|
|
3
|
+
# it injects the task into the agent's chat via herdr and returns the reply.
|
|
4
|
+
#
|
|
5
|
+
# a2a-serve.py <pane-or-agent> <name> <port>
|
|
6
|
+
#
|
|
7
|
+
# Replaces the hand-rolled server. Protocol/Agent Card/JSON-RPC are the SDK's;
|
|
8
|
+
# our only job is the executor below.
|
|
9
|
+
import asyncio
|
|
10
|
+
import os
|
|
11
|
+
import subprocess
|
|
12
|
+
import sys
|
|
13
|
+
import time
|
|
14
|
+
|
|
15
|
+
import uvicorn
|
|
16
|
+
from starlette.applications import Starlette
|
|
17
|
+
|
|
18
|
+
from a2a.helpers import (
|
|
19
|
+
get_message_text,
|
|
20
|
+
new_task_from_user_message,
|
|
21
|
+
new_text_message,
|
|
22
|
+
new_text_part,
|
|
23
|
+
)
|
|
24
|
+
from a2a.server.agent_execution import AgentExecutor, RequestContext
|
|
25
|
+
from a2a.server.events import EventQueue
|
|
26
|
+
from a2a.server.request_handlers import DefaultRequestHandler
|
|
27
|
+
from a2a.server.routes import create_agent_card_routes, create_jsonrpc_routes
|
|
28
|
+
from a2a.server.tasks import InMemoryTaskStore, TaskUpdater
|
|
29
|
+
from a2a.types import (
|
|
30
|
+
AgentCapabilities,
|
|
31
|
+
AgentCard,
|
|
32
|
+
AgentInterface,
|
|
33
|
+
AgentSkill,
|
|
34
|
+
TaskState,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
TARGET = sys.argv[1]
|
|
38
|
+
NAME = sys.argv[2]
|
|
39
|
+
PORT = int(sys.argv[3])
|
|
40
|
+
WAIT = float(os.environ.get("A2A_SERVE_WAIT", "30"))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def sh(*a: str) -> str:
|
|
44
|
+
try:
|
|
45
|
+
return subprocess.run(a, capture_output=True, text=True, timeout=90).stdout
|
|
46
|
+
except Exception:
|
|
47
|
+
return ""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def inject_and_read(text: str) -> str:
|
|
51
|
+
"""Deliver the task into the seated agent's chat, then read its reply."""
|
|
52
|
+
sh("herdr", "agent", "prompt", TARGET, text)
|
|
53
|
+
time.sleep(WAIT)
|
|
54
|
+
out = sh("herdr", "agent", "read", TARGET).strip()
|
|
55
|
+
return "\n".join(out.splitlines()[-8:]) or "(no output)"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class EindriExecutor(AgentExecutor):
|
|
59
|
+
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
60
|
+
if context.current_task:
|
|
61
|
+
task = context.current_task
|
|
62
|
+
else:
|
|
63
|
+
task = new_task_from_user_message(context.message)
|
|
64
|
+
await event_queue.enqueue_event(task)
|
|
65
|
+
up = TaskUpdater(event_queue=event_queue, task_id=task.id, context_id=task.context_id)
|
|
66
|
+
await up.update_status(
|
|
67
|
+
state=TaskState.TASK_STATE_WORKING,
|
|
68
|
+
message=new_text_message("Delivering to the Eindri..."),
|
|
69
|
+
)
|
|
70
|
+
query = get_message_text(context.message) or ""
|
|
71
|
+
result = await asyncio.to_thread(inject_and_read, query)
|
|
72
|
+
await up.add_artifact(parts=[new_text_part(text=result, media_type="text/plain")])
|
|
73
|
+
await up.update_status(
|
|
74
|
+
state=TaskState.TASK_STATE_COMPLETED,
|
|
75
|
+
message=new_text_message(result),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
79
|
+
raise NotImplementedError("Cancel is not supported.")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
skill = AgentSkill(
|
|
83
|
+
id="eindri", name=NAME, description=f"Ymir Eindri {NAME}",
|
|
84
|
+
input_modes=["text/plain"], output_modes=["text/plain"], tags=["ymir", "eindri"],
|
|
85
|
+
)
|
|
86
|
+
card = AgentCard(
|
|
87
|
+
name=NAME, description=f"Ymir Eindri {NAME}", version="1.0.0",
|
|
88
|
+
default_input_modes=["text/plain"], default_output_modes=["text/plain"],
|
|
89
|
+
capabilities=AgentCapabilities(streaming=False),
|
|
90
|
+
supported_interfaces=[AgentInterface(
|
|
91
|
+
protocol_binding="JSONRPC", url=f"http://127.0.0.1:{PORT}", protocol_version="1.0")],
|
|
92
|
+
skills=[skill],
|
|
93
|
+
)
|
|
94
|
+
handler = DefaultRequestHandler(
|
|
95
|
+
agent_executor=EindriExecutor(), task_store=InMemoryTaskStore(), agent_card=card,
|
|
96
|
+
)
|
|
97
|
+
routes: list = []
|
|
98
|
+
routes.extend(create_agent_card_routes(card))
|
|
99
|
+
routes.extend(create_jsonrpc_routes(handler, "/"))
|
|
100
|
+
|
|
101
|
+
if __name__ == "__main__":
|
|
102
|
+
print(f"a2a-serve: {NAME} -> {TARGET} on http://127.0.0.1:{PORT}/", flush=True)
|
|
103
|
+
uvicorn.run(Starlette(routes=routes), host="127.0.0.1", port=PORT, log_level="warning")
|
package/bin/a2a-serve.sh
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# a2a-serve.sh — run the a2a-sdk A2A 1.0 server for a seated Eindri.
|
|
3
|
+
# bin/a2a-serve.sh <pane-or-agent> <name> [port]
|
|
4
|
+
# The server is bin/a2a-serve.py (a2a-sdk); the executor injects via herdr.
|
|
5
|
+
set -u
|
|
6
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
PORT="${3:-7791}"
|
|
8
|
+
exec python3 "$SCRIPT_DIR/a2a-serve.py" "$1" "${2:-eindri}" "$PORT"
|
package/bin/a2a-talk.sh
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# a2a-talk.sh — list A2A agents and talk to one (bidirectional reply).
|
|
3
|
+
#
|
|
4
|
+
# bin/a2a-talk.sh agents # who is registered
|
|
5
|
+
# bin/a2a-talk.sh send <peer> "<text>" # send a task, print the reply
|
|
6
|
+
#
|
|
7
|
+
# Peer is matched by name (exact or prefix). Directory from A2A_DIRECTORY
|
|
8
|
+
# (default http://127.0.0.1:7777). This is the proof-of-channel; pi gets the
|
|
9
|
+
# same as a tool once the extension execute-API is wired.
|
|
10
|
+
set -u
|
|
11
|
+
DIR="${A2A_DIRECTORY:-http://127.0.0.1:7777}"
|
|
12
|
+
ACTION="${1:-agents}"; shift || true
|
|
13
|
+
|
|
14
|
+
agents_json() { curl -s --max-time 6 "$DIR/" 2>/dev/null; }
|
|
15
|
+
|
|
16
|
+
case "$ACTION" in
|
|
17
|
+
agents)
|
|
18
|
+
agents_json | python3 -c 'import json,sys
|
|
19
|
+
try:
|
|
20
|
+
d=json.load(sys.stdin); ags=d.get("served_agents",[])
|
|
21
|
+
print("a2a-agents[%d]{name,url,local}:" % len(ags))
|
|
22
|
+
for a in ags:
|
|
23
|
+
print(" \"%s\",\"%s\",\"%s\"" % (a.get("name"), a.get("url"), str(bool(a.get("local"))).lower()))
|
|
24
|
+
except Exception:
|
|
25
|
+
print("error: directory unreachable")' ;;
|
|
26
|
+
send)
|
|
27
|
+
PEER="${1:-}"; shift || true; TEXT="${*:-}"
|
|
28
|
+
[ -n "$PEER" ] && [ -n "$TEXT" ] || { printf 'error: send <peer> "<text>"\n' >&2; exit 2; }
|
|
29
|
+
URL="$(agents_json | python3 -c 'import json,sys
|
|
30
|
+
peer=sys.argv[1]
|
|
31
|
+
try:
|
|
32
|
+
d=json.load(sys.stdin)
|
|
33
|
+
for a in d.get("served_agents",[]):
|
|
34
|
+
if a.get("name")==peer or (a.get("name") or "").startswith(peer):
|
|
35
|
+
print(a.get("url")); break
|
|
36
|
+
except Exception: pass' "$PEER")"
|
|
37
|
+
[ -n "$URL" ] || { printf 'error: no peer matching "%s"\nhelp: bin/a2a-talk.sh agents\n' "$PEER" >&2; exit 1; }
|
|
38
|
+
curl -s --max-time 90 -X POST "$URL" -H 'Content-Type: application/json' \
|
|
39
|
+
-d "$(python3 -c 'import json,sys;print(json.dumps({"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"user","parts":[{"kind":"text","text":sys.argv[1]}]}}}))' "$TEXT")" \
|
|
40
|
+
| python3 -c 'import json,sys
|
|
41
|
+
try:
|
|
42
|
+
d=json.load(sys.stdin); r=d.get("result",{}); st=r.get("status",{})
|
|
43
|
+
parts=(st.get("message") or {}).get("parts",[])
|
|
44
|
+
text="\n".join(p.get("text","") for p in parts)
|
|
45
|
+
print("a2a-talk[1]{peer,state,reply}:")
|
|
46
|
+
print(" \"%s\",\"%s\",\"%s\"" % (sys.argv[1], st.get("state","?"), text))
|
|
47
|
+
except Exception as e:
|
|
48
|
+
print("error: no reply:", e)' "$PEER" ;;
|
|
49
|
+
*) printf 'error: usage: bin/a2a-talk.sh agents|<send peer text>\n' >&2; exit 2 ;;
|
|
50
|
+
esac
|