@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,399 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-inbox.sh - the captain's out-of-band capture surface.
|
|
3
|
+
#
|
|
4
|
+
# Solves three DIFFERENT problems with three different mechanisms, because they
|
|
5
|
+
# are not the same problem:
|
|
6
|
+
#
|
|
7
|
+
# note Queue an idea for firstmate while firstmate is mid-turn and cannot
|
|
8
|
+
# answer. Writes a durable record and appends ONE `check` wake, so the
|
|
9
|
+
# note survives a crash and is presented at firstmate's next drain.
|
|
10
|
+
# This is the only subcommand that touches firstmate's wake queue.
|
|
11
|
+
# say Same as `note`, but the body comes from spoken audio on stdin.
|
|
12
|
+
# Speech is an INPUT METHOD here, not an architecture: it transcribes
|
|
13
|
+
# and then takes exactly the `note` path.
|
|
14
|
+
# status Answer "what is happening" from durable records ONLY. Reads no
|
|
15
|
+
# network and appends NO wake, so it never interrupts work and is safe
|
|
16
|
+
# to run in a loop.
|
|
17
|
+
# ask Answer a side question with a one-shot model call that never touches
|
|
18
|
+
# firstmate, the backlog, or the wake queue. A side question is not
|
|
19
|
+
# fleet work and must not become fleet work.
|
|
20
|
+
#
|
|
21
|
+
# Usage:
|
|
22
|
+
# fm-inbox.sh note <text>... | fm-inbox.sh note - (body from stdin)
|
|
23
|
+
# fm-inbox.sh say [<file.wav>] (default: audio on stdin)
|
|
24
|
+
# fm-inbox.sh status
|
|
25
|
+
# fm-inbox.sh ask <question>...
|
|
26
|
+
# fm-inbox.sh list
|
|
27
|
+
# fm-inbox.sh drain [--ack <id>...]
|
|
28
|
+
#
|
|
29
|
+
# Configuration. A region, a model id and an AWS profile name somebody's account
|
|
30
|
+
# and somebody's choices, so this file carries no default for any of them. Each is
|
|
31
|
+
# read from the home's gitignored config/ directory, or from the matching
|
|
32
|
+
# environment variable, and the model-backed subcommands refuse with the path to
|
|
33
|
+
# write rather than reaching for a value that belongs to another home. That
|
|
34
|
+
# configuration is also the opt-in: `say` and `ask` are off until it exists.
|
|
35
|
+
#
|
|
36
|
+
# config/inbox-region FM_INBOX_REGION AWS region. required
|
|
37
|
+
# config/inbox-stt-model FM_INBOX_STT_MODEL speech-to-text model. required by say
|
|
38
|
+
# config/inbox-ask-model FM_INBOX_ASK_MODEL side-question model. required by ask
|
|
39
|
+
# config/inbox-profile FM_INBOX_PROFILE AWS profile. optional
|
|
40
|
+
#
|
|
41
|
+
# An absent profile means the call uses whatever credentials are already in the
|
|
42
|
+
# environment, which is also what FM_INBOX_PROFILE= (empty) forces.
|
|
43
|
+
#
|
|
44
|
+
# `note`, `status`, `list` and `drain` need NO configuration at all, because they
|
|
45
|
+
# make no model call. The voice handover depends on `note`, so it keeps working in
|
|
46
|
+
# a home that has configured nothing.
|
|
47
|
+
#
|
|
48
|
+
# Environment:
|
|
49
|
+
# FM_HOME operational home whose state/ and data/ are used.
|
|
50
|
+
#
|
|
51
|
+
# PRIVACY: `say` sends your audio and `ask` sends your question to Bedrock.
|
|
52
|
+
# `note`, `status`, `list` and `drain` make no network call at all.
|
|
53
|
+
#
|
|
54
|
+
# `note` is also the queueing half of the spoken interface: when the voice agent
|
|
55
|
+
# in bin/fm-voice-relay.py hands real work over to firstmate, it runs this
|
|
56
|
+
# subcommand rather than carrying a second queue of its own. Keep the `note`
|
|
57
|
+
# contract stable for that caller. `status` is the HUMAN view of the records;
|
|
58
|
+
# bin/fm_voice_records.py owns the scope-controlled machine view the voice agent
|
|
59
|
+
# reads, because the voice agent must be able to answer without record free text
|
|
60
|
+
# ever reaching a model.
|
|
61
|
+
set -euo pipefail
|
|
62
|
+
|
|
63
|
+
# A non-interactive `ssh host fm-inbox.sh ...` does NOT get a login shell, so it
|
|
64
|
+
# does not get ~/.toolbox/bin on PATH. The AWS profile's credential_process is
|
|
65
|
+
# the bare word `ada`, so without this the model-backed subcommands fail with
|
|
66
|
+
# "[Errno 2] No such file or directory: 'ada'" while note/status still work.
|
|
67
|
+
# Verified: this is exactly what happens over SSH without the fix.
|
|
68
|
+
for _extra in "$HOME/.toolbox/bin" "$HOME/.local/bin"; do
|
|
69
|
+
case ":$PATH:" in
|
|
70
|
+
*":$_extra:"*) ;;
|
|
71
|
+
*) [ -d "$_extra" ] && PATH="$_extra:$PATH" ;;
|
|
72
|
+
esac
|
|
73
|
+
done
|
|
74
|
+
unset _extra
|
|
75
|
+
export PATH
|
|
76
|
+
|
|
77
|
+
SELF_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
78
|
+
FM_ROOT="$(cd "$SELF_DIR/.." && pwd)"
|
|
79
|
+
FM_HOME="${FM_HOME:-$FM_ROOT}"
|
|
80
|
+
STATE="${FM_STATE_OVERRIDE:-$FM_HOME/state}"
|
|
81
|
+
DATA="${FM_DATA_OVERRIDE:-$FM_HOME/data}"
|
|
82
|
+
INBOX="$STATE/inbox"
|
|
83
|
+
|
|
84
|
+
CONFIG="${FM_CONFIG_OVERRIDE:-$FM_HOME/config}"
|
|
85
|
+
|
|
86
|
+
die() { printf 'fm-inbox: %s\n' "$*" >&2; exit 1; }
|
|
87
|
+
|
|
88
|
+
# First non-comment, non-blank line of a config file, or nothing.
|
|
89
|
+
read_setting() { # <file-name>
|
|
90
|
+
local path="$CONFIG/$1" line
|
|
91
|
+
[ -r "$path" ] || return 0
|
|
92
|
+
while IFS= read -r line || [ -n "$line" ]; do
|
|
93
|
+
line=${line%%#*}
|
|
94
|
+
line=${line#"${line%%[![:space:]]*}"}
|
|
95
|
+
line=${line%"${line##*[![:space:]]}"}
|
|
96
|
+
[ -n "$line" ] || continue
|
|
97
|
+
printf '%s' "$line"
|
|
98
|
+
return 0
|
|
99
|
+
done < "$path"
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# Refuse by naming the file to write. A model call that guessed at a region or an
|
|
103
|
+
# account would either fail confusingly or, worse, succeed against a stranger's.
|
|
104
|
+
require_setting() { # <file-name> <env-var> <what>
|
|
105
|
+
local value
|
|
106
|
+
value=$(read_setting "$1")
|
|
107
|
+
[ -n "$value" ] || die "no $3 is configured: write one line into $CONFIG/$1 or set $2"
|
|
108
|
+
printf '%s' "$value"
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
REGION="${FM_INBOX_REGION:-}"
|
|
112
|
+
STT_MODEL="${FM_INBOX_STT_MODEL:-}"
|
|
113
|
+
ASK_MODEL="${FM_INBOX_ASK_MODEL:-}"
|
|
114
|
+
# Unset falls through to config; explicitly empty means "use ambient credentials".
|
|
115
|
+
PROFILE="${FM_INBOX_PROFILE-$(read_setting inbox-profile)}"
|
|
116
|
+
|
|
117
|
+
# Resolved only by the subcommands that make a model call, so note, status, list
|
|
118
|
+
# and drain keep working in a home that has configured nothing.
|
|
119
|
+
need_region() {
|
|
120
|
+
[ -n "$REGION" ] || REGION=$(require_setting inbox-region FM_INBOX_REGION "AWS region")
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
need_stt_model() {
|
|
124
|
+
need_region
|
|
125
|
+
[ -n "$STT_MODEL" ] || STT_MODEL=$(require_setting inbox-stt-model \
|
|
126
|
+
FM_INBOX_STT_MODEL "speech-to-text model")
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
need_ask_model() {
|
|
130
|
+
need_region
|
|
131
|
+
[ -n "$ASK_MODEL" ] || ASK_MODEL=$(require_setting inbox-ask-model \
|
|
132
|
+
FM_INBOX_ASK_MODEL "side-question model")
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
need() { command -v "$1" >/dev/null 2>&1 || die "required command not found: $1"; }
|
|
136
|
+
|
|
137
|
+
# The profile's credential_process (`ada`) costs a MEASURED ~1030ms on every
|
|
138
|
+
# single call, which is about half the wall time of `say` and `ask`. If real
|
|
139
|
+
# credentials are already in the environment, skip --profile entirely and let the
|
|
140
|
+
# ambient ones win. Set FM_INBOX_PROFILE= (empty) to force that even without env
|
|
141
|
+
# credentials present.
|
|
142
|
+
aws_call() {
|
|
143
|
+
if [ -z "$PROFILE" ] || [ -n "${AWS_ACCESS_KEY_ID:-}" ]; then
|
|
144
|
+
aws --region "$REGION" "$@"
|
|
145
|
+
else
|
|
146
|
+
aws --profile "$PROFILE" --region "$REGION" "$@"
|
|
147
|
+
fi
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
# ---------------------------------------------------------------- note
|
|
151
|
+
|
|
152
|
+
# Append exactly one wake so firstmate picks the note up at its next drain.
|
|
153
|
+
# Failure to wake is NOT allowed to lose the note: the record is already on
|
|
154
|
+
# disk, so we report the wake failure and still exit non-zero loudly.
|
|
155
|
+
wake_for() {
|
|
156
|
+
local id=$1 summary=$2 lib="$FM_ROOT/bin/fm-wake-lib.sh"
|
|
157
|
+
if [ ! -r "$lib" ]; then
|
|
158
|
+
printf 'fm-inbox: note saved but NOT announced (missing %s)\n' "$lib" >&2
|
|
159
|
+
return 1
|
|
160
|
+
fi
|
|
161
|
+
# shellcheck source=/dev/null
|
|
162
|
+
FM_ROOT_OVERRIDE="$FM_ROOT" FM_HOME="$FM_HOME" STATE="$STATE" . "$lib"
|
|
163
|
+
fm_wake_append check "inbox:$id" "check: captain inbox note $id - $summary"
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
queue_note() {
|
|
167
|
+
local source=$1 body=$2 extra=${3:-}
|
|
168
|
+
[ -n "${body//[[:space:]]/}" ] || die "refusing to queue an empty note"
|
|
169
|
+
mkdir -p "$INBOX"
|
|
170
|
+
|
|
171
|
+
local tmp id summary staging_name
|
|
172
|
+
tmp=$(mktemp "$INBOX/.staging-XXXXXX")
|
|
173
|
+
staging_name=$(basename "$tmp")
|
|
174
|
+
id="$(date +%s)-${staging_name#.staging-}"
|
|
175
|
+
{
|
|
176
|
+
printf 'id=%s\n' "$id"
|
|
177
|
+
printf 'at=%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
178
|
+
printf 'source=%s\n' "$source"
|
|
179
|
+
[ -z "$extra" ] || printf '%s\n' "$extra"
|
|
180
|
+
printf -- '--\n'
|
|
181
|
+
printf '%s\n' "$body"
|
|
182
|
+
} >"$tmp"
|
|
183
|
+
|
|
184
|
+
# Publish the completed note atomically.
|
|
185
|
+
mv "$tmp" "$INBOX/$id.note"
|
|
186
|
+
|
|
187
|
+
# One-line summary for the wake payload; the full body stays in the file.
|
|
188
|
+
summary=$(printf '%s' "$body" | tr '\n\t' ' ' | cut -c1-100)
|
|
189
|
+
printf 'queued %s\n' "$id"
|
|
190
|
+
printf ' %s\n' "$summary"
|
|
191
|
+
if wake_for "$id" "$summary"; then
|
|
192
|
+
printf ' firstmate will pick this up at its next check.\n'
|
|
193
|
+
else
|
|
194
|
+
die "note $id is saved at $INBOX/$id.note but firstmate was NOT woken"
|
|
195
|
+
fi
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
cmd_note() {
|
|
199
|
+
local body
|
|
200
|
+
if [ "$#" -eq 0 ]; then
|
|
201
|
+
die "usage: fm-inbox.sh note <text>... (or: note - to read stdin)"
|
|
202
|
+
elif [ "$1" = "-" ]; then
|
|
203
|
+
body=$(cat)
|
|
204
|
+
else
|
|
205
|
+
body="$*"
|
|
206
|
+
fi
|
|
207
|
+
queue_note text "$body"
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
# ---------------------------------------------------------------- say
|
|
211
|
+
|
|
212
|
+
cmd_say() {
|
|
213
|
+
# Before the tool checks, so an unconfigured home is told what to configure
|
|
214
|
+
# rather than what to install for a call it is not yet allowed to make.
|
|
215
|
+
need_stt_model
|
|
216
|
+
need aws
|
|
217
|
+
need python3
|
|
218
|
+
need base64
|
|
219
|
+
|
|
220
|
+
local src wav raw transcript
|
|
221
|
+
raw=$(mktemp /tmp/fm-inbox-audio-XXXXXX)
|
|
222
|
+
wav=$(mktemp /tmp/fm-inbox-wav-XXXXXX.wav)
|
|
223
|
+
# shellcheck disable=SC2064
|
|
224
|
+
trap "rm -f '$raw' '$wav' '$wav.json'" EXIT
|
|
225
|
+
|
|
226
|
+
if [ "$#" -ge 1 ] && [ "$1" != "-" ]; then
|
|
227
|
+
src=$1
|
|
228
|
+
[ -r "$src" ] || die "cannot read audio file: $src"
|
|
229
|
+
cat "$src" >"$raw"
|
|
230
|
+
else
|
|
231
|
+
cat >"$raw"
|
|
232
|
+
fi
|
|
233
|
+
[ -s "$raw" ] || die "no audio received on stdin"
|
|
234
|
+
|
|
235
|
+
# Accept a real WAV as-is; wrap headerless 16kHz mono s16le PCM if that is
|
|
236
|
+
# what arrived. Anything else is rejected rather than silently mistranscribed.
|
|
237
|
+
python3 - "$raw" "$wav" <<'PY'
|
|
238
|
+
import sys, wave
|
|
239
|
+
src, dst = sys.argv[1], sys.argv[2]
|
|
240
|
+
data = open(src, 'rb').read()
|
|
241
|
+
if data[:4] == b'RIFF':
|
|
242
|
+
open(dst, 'wb').write(data)
|
|
243
|
+
sys.stderr.write("fm-inbox: input is WAV, passing through\n")
|
|
244
|
+
elif data[:4] in (b'OggS', b'fLaC') or data[:3] == b'ID3':
|
|
245
|
+
sys.exit("fm-inbox: got Ogg/FLAC/MP3; re-encode to WAV first")
|
|
246
|
+
else:
|
|
247
|
+
if len(data) % 2:
|
|
248
|
+
data = data[:-1]
|
|
249
|
+
w = wave.open(dst, 'wb')
|
|
250
|
+
w.setnchannels(1); w.setsampwidth(2); w.setframerate(16000)
|
|
251
|
+
w.writeframes(data); w.close()
|
|
252
|
+
sys.stderr.write("fm-inbox: input looked like raw PCM, wrapped as 16kHz mono WAV\n")
|
|
253
|
+
PY
|
|
254
|
+
|
|
255
|
+
local secs
|
|
256
|
+
secs=$(python3 -c "
|
|
257
|
+
import wave,sys
|
|
258
|
+
w=wave.open('$wav'); print(round(w.getnframes()/w.getframerate(),2))")
|
|
259
|
+
printf 'fm-inbox: %ss of audio, transcribing with %s in %s\n' "$secs" "$STT_MODEL" "$REGION" >&2
|
|
260
|
+
|
|
261
|
+
python3 - "$wav" "$wav.json" <<'PY'
|
|
262
|
+
import base64, json, sys
|
|
263
|
+
b = base64.b64encode(open(sys.argv[1], 'rb').read()).decode()
|
|
264
|
+
json.dump([{"role": "user", "content": [
|
|
265
|
+
{"audio": {"format": "wav", "source": {"bytes": b}}},
|
|
266
|
+
{"text": "Transcribe the speech exactly. Output only the transcript, nothing else."},
|
|
267
|
+
]}], open(sys.argv[2], 'w'))
|
|
268
|
+
PY
|
|
269
|
+
|
|
270
|
+
transcript=$(aws_call bedrock-runtime converse \
|
|
271
|
+
--model-id "$STT_MODEL" \
|
|
272
|
+
--messages "file://$wav.json" \
|
|
273
|
+
--inference-config '{"maxTokens":600,"temperature":0}' \
|
|
274
|
+
--query 'output.message.content[0].text' --output text) \
|
|
275
|
+
|| die "transcription failed"
|
|
276
|
+
|
|
277
|
+
[ -n "${transcript//[[:space:]]/}" ] || die "transcription came back empty"
|
|
278
|
+
printf 'fm-inbox: heard: %s\n' "$transcript" >&2
|
|
279
|
+
queue_note voice "$transcript" "transcript_model=$STT_MODEL
|
|
280
|
+
audio_seconds=$secs"
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
# ---------------------------------------------------------------- status
|
|
284
|
+
|
|
285
|
+
cmd_status() {
|
|
286
|
+
local pending=0
|
|
287
|
+
[ -d "$INBOX" ] && pending=$(find "$INBOX" -maxdepth 1 -name '*.note' 2>/dev/null | wc -l | tr -d ' ')
|
|
288
|
+
|
|
289
|
+
printf '=== firstmate status (read-only, no wake sent) ===\n'
|
|
290
|
+
printf 'home %s\n' "$FM_HOME"
|
|
291
|
+
printf 'time %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
292
|
+
printf 'inbox %s note(s) waiting for firstmate\n' "$pending"
|
|
293
|
+
|
|
294
|
+
if [ -f "$DATA/backlog.md" ]; then
|
|
295
|
+
printf '\n--- in flight ---\n'
|
|
296
|
+
awk '/^## In flight/{f=1;next} /^## /{f=0} f && /^- \[/{print}' \
|
|
297
|
+
"$DATA/backlog.md" | sed 's/^- \[ \] / /' | cut -c1-150
|
|
298
|
+
else
|
|
299
|
+
printf '\n(no backlog at %s)\n' "$DATA/backlog.md"
|
|
300
|
+
fi
|
|
301
|
+
|
|
302
|
+
local any=0
|
|
303
|
+
for m in "$STATE"/*.meta; do
|
|
304
|
+
[ -e "$m" ] || break
|
|
305
|
+
if [ "$any" -eq 0 ]; then printf '\n--- workers ---\n'; any=1; fi
|
|
306
|
+
local id kind mode last
|
|
307
|
+
id=$(basename "$m" .meta)
|
|
308
|
+
kind=$(sed -n 's/^kind=//p' "$m" | head -1)
|
|
309
|
+
mode=$(sed -n 's/^mode=//p' "$m" | head -1)
|
|
310
|
+
last=""
|
|
311
|
+
[ -f "$STATE/$id.status" ] && last=$(tail -1 "$STATE/$id.status" 2>/dev/null | cut -c1-100)
|
|
312
|
+
printf ' %-42s %-6s %-10s %s\n' "$id" "${kind:-?}" "${mode:--}" "${last:-(no events yet)}"
|
|
313
|
+
done
|
|
314
|
+
[ "$any" -eq 1 ] || printf '\n(no workers on deck)\n'
|
|
315
|
+
|
|
316
|
+
printf '\nNote: the last event line is history, not current state.\n'
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
# ---------------------------------------------------------------- ask
|
|
320
|
+
|
|
321
|
+
cmd_ask() {
|
|
322
|
+
[ "$#" -gt 0 ] || die "usage: fm-inbox.sh ask <question>..."
|
|
323
|
+
need_ask_model
|
|
324
|
+
need aws
|
|
325
|
+
need python3
|
|
326
|
+
local q="$*" msg
|
|
327
|
+
msg=$(mktemp /tmp/fm-inbox-ask-XXXXXX.json)
|
|
328
|
+
# shellcheck disable=SC2064
|
|
329
|
+
trap "rm -f '$msg'" EXIT
|
|
330
|
+
|
|
331
|
+
Q="$q" python3 - "$msg" <<'PY'
|
|
332
|
+
import json, os, sys
|
|
333
|
+
json.dump([{"role": "user", "content": [{"text": os.environ["Q"]}]}],
|
|
334
|
+
open(sys.argv[1], 'w'))
|
|
335
|
+
PY
|
|
336
|
+
|
|
337
|
+
aws_call bedrock-runtime converse \
|
|
338
|
+
--model-id "$ASK_MODEL" \
|
|
339
|
+
--messages "file://$msg" \
|
|
340
|
+
--system '[{"text":"You are a terse engineering assistant answering a side question. Be direct and concrete. No preamble. If you are not sure, say so."}]' \
|
|
341
|
+
--inference-config '{"maxTokens":700,"temperature":0.2}' \
|
|
342
|
+
--query 'output.message.content[0].text' --output text \
|
|
343
|
+
|| die "ask failed"
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
# ---------------------------------------------------------------- list / drain
|
|
347
|
+
|
|
348
|
+
cmd_list() {
|
|
349
|
+
[ -d "$INBOX" ] || { printf '(inbox empty)\n'; return 0; }
|
|
350
|
+
local any=0
|
|
351
|
+
for f in "$INBOX"/*.note; do
|
|
352
|
+
[ -e "$f" ] || break
|
|
353
|
+
any=1
|
|
354
|
+
printf '%s\n' "$(basename "$f" .note)"
|
|
355
|
+
sed -n '/^--$/,$p' "$f" | tail -n +2 | sed 's/^/ /'
|
|
356
|
+
done
|
|
357
|
+
[ "$any" -eq 1 ] || printf '(inbox empty)\n'
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
cmd_drain() {
|
|
361
|
+
if [ "${1:-}" = "--ack" ]; then
|
|
362
|
+
shift
|
|
363
|
+
[ "$#" -gt 0 ] || die "usage: fm-inbox.sh drain --ack <id>..."
|
|
364
|
+
mkdir -p "$INBOX/handled"
|
|
365
|
+
local id
|
|
366
|
+
for id in "$@"; do
|
|
367
|
+
if [ -f "$INBOX/$id.note" ]; then
|
|
368
|
+
mv "$INBOX/$id.note" "$INBOX/handled/$id.note"
|
|
369
|
+
printf 'acked %s\n' "$id"
|
|
370
|
+
else
|
|
371
|
+
printf 'already-acked %s\n' "$id"
|
|
372
|
+
fi
|
|
373
|
+
done
|
|
374
|
+
return 0
|
|
375
|
+
fi
|
|
376
|
+
cmd_list
|
|
377
|
+
printf '\nAck with: fm-inbox.sh drain --ack <id>...\n'
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
# ---------------------------------------------------------------- dispatch
|
|
381
|
+
|
|
382
|
+
case "${1:-}" in
|
|
383
|
+
note) shift; cmd_note "$@" ;;
|
|
384
|
+
say) shift; cmd_say "$@" ;;
|
|
385
|
+
status) shift; cmd_status ;;
|
|
386
|
+
ask) shift; cmd_ask "$@" ;;
|
|
387
|
+
list) shift; cmd_list ;;
|
|
388
|
+
drain) shift; cmd_drain "$@" ;;
|
|
389
|
+
''|-h|--help|help)
|
|
390
|
+
# The whole header block, found rather than counted: everything after the
|
|
391
|
+
# shebang up to the first line that is not a comment. A fixed line range
|
|
392
|
+
# silently truncates this help the next time the header grows, and the last
|
|
393
|
+
# thing to fall off the end is the PRIVACY paragraph, which is the one place
|
|
394
|
+
# a new operator is told which subcommands send anything off this host.
|
|
395
|
+
awk 'NR == 1 { next }
|
|
396
|
+
/^#/ { sub(/^# ?/, ""); print; next }
|
|
397
|
+
{ exit }' "${BASH_SOURCE[0]}" ;;
|
|
398
|
+
*) die "unknown subcommand: $1 (try --help)" ;;
|
|
399
|
+
esac
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-install-actionlint.sh - install CI's pinned, verified actionlint build.
|
|
3
|
+
#
|
|
4
|
+
# Downloads the official GitHub release archive for the host OS/arch, verifies
|
|
5
|
+
# its per-archive SHA-256 pin, and installs the binary into the destination
|
|
6
|
+
# directory. Supported platforms: linux amd64/x86_64, linux arm64/aarch64,
|
|
7
|
+
# darwin amd64/x86_64, darwin arm64/aarch64. Pins come from the official
|
|
8
|
+
# actionlint release checksums file. Verification uses sha256sum when present,
|
|
9
|
+
# otherwise shasum -a 256. An unsupported OS/arch or a missing pin fails
|
|
10
|
+
# without downloading.
|
|
11
|
+
#
|
|
12
|
+
# Usage:
|
|
13
|
+
# fm-install-actionlint.sh <destination-directory>
|
|
14
|
+
set -eu
|
|
15
|
+
|
|
16
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
17
|
+
VERSION="$("$ROOT/bin/fm-lint-workflows.sh" --required-version)"
|
|
18
|
+
|
|
19
|
+
die() {
|
|
20
|
+
printf 'fm-install-actionlint.sh: %s\n' "$*" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
DESTINATION=${1:?usage: fm-install-actionlint.sh <destination-directory>}
|
|
25
|
+
|
|
26
|
+
os=$(uname -s)
|
|
27
|
+
arch=$(uname -m)
|
|
28
|
+
# SHA-256 pins are from actionlint_1.7.12_checksums.txt on the official
|
|
29
|
+
# v1.7.12 release (https://github.com/rhysd/actionlint/releases/tag/v1.7.12).
|
|
30
|
+
case "${os}-${arch}" in
|
|
31
|
+
Linux-x86_64|Linux-amd64)
|
|
32
|
+
ARCHIVE="actionlint_${VERSION}_linux_amd64.tar.gz"
|
|
33
|
+
SHA256=8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc387b349a3d8
|
|
34
|
+
;;
|
|
35
|
+
Linux-aarch64|Linux-arm64)
|
|
36
|
+
ARCHIVE="actionlint_${VERSION}_linux_arm64.tar.gz"
|
|
37
|
+
SHA256=325e971b6ba9bfa504672e29be93c24981eeb1c07576d730e9f7c8805afff0c6
|
|
38
|
+
;;
|
|
39
|
+
Darwin-x86_64|Darwin-amd64)
|
|
40
|
+
ARCHIVE="actionlint_${VERSION}_darwin_amd64.tar.gz"
|
|
41
|
+
SHA256=5b44c3bc2255115c9b69e30efc0fecdf498fdb63c5d58e17084fd5f16324c644
|
|
42
|
+
;;
|
|
43
|
+
Darwin-arm64|Darwin-aarch64)
|
|
44
|
+
ARCHIVE="actionlint_${VERSION}_darwin_arm64.tar.gz"
|
|
45
|
+
SHA256=aba9ced2dee8d27fecca3dc7feb1a7f9a52caefa1eb46f3271ea66b6e0e6953f
|
|
46
|
+
;;
|
|
47
|
+
*)
|
|
48
|
+
die "unsupported platform ${os}-${arch}; need linux or darwin on amd64/x86_64 or arm64/aarch64"
|
|
49
|
+
;;
|
|
50
|
+
esac
|
|
51
|
+
[ -n "$SHA256" ] || die "no pinned checksum for ${os}-${arch}"
|
|
52
|
+
|
|
53
|
+
URL="https://github.com/rhysd/actionlint/releases/download/v${VERSION}/${ARCHIVE}"
|
|
54
|
+
TMP=$(mktemp -d "${RUNNER_TEMP:-${TMPDIR:-/tmp}}/fm-actionlint.XXXXXX")
|
|
55
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
56
|
+
|
|
57
|
+
DOWNLOAD_ATTEMPTS=6
|
|
58
|
+
download_attempt=1
|
|
59
|
+
while ! curl -fsSL "$URL" -o "$TMP/$ARCHIVE"; do
|
|
60
|
+
[ "$download_attempt" -lt "$DOWNLOAD_ATTEMPTS" ] || {
|
|
61
|
+
printf 'fm-install-actionlint.sh: download failed after %s attempts\n' "$DOWNLOAD_ATTEMPTS" >&2
|
|
62
|
+
exit 1
|
|
63
|
+
}
|
|
64
|
+
printf 'fm-install-actionlint.sh: download attempt %s failed; retrying\n' "$download_attempt" >&2
|
|
65
|
+
sleep $((1 << (download_attempt - 1)))
|
|
66
|
+
download_attempt=$((download_attempt + 1))
|
|
67
|
+
done
|
|
68
|
+
|
|
69
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
70
|
+
ACTUAL_SHA256=$(sha256sum "$TMP/$ARCHIVE" | awk '{print $1}')
|
|
71
|
+
elif command -v shasum >/dev/null 2>&1; then
|
|
72
|
+
ACTUAL_SHA256=$(shasum -a 256 "$TMP/$ARCHIVE" | awk '{print $1}')
|
|
73
|
+
else
|
|
74
|
+
die "need sha256sum or shasum to verify the actionlint archive"
|
|
75
|
+
fi
|
|
76
|
+
[ "$ACTUAL_SHA256" = "$SHA256" ] || {
|
|
77
|
+
printf 'fm-install-actionlint.sh: checksum mismatch for %s (expected %s, got %s)\n' \
|
|
78
|
+
"$ARCHIVE" "$SHA256" "$ACTUAL_SHA256" >&2
|
|
79
|
+
exit 1
|
|
80
|
+
}
|
|
81
|
+
tar -xzf "$TMP/$ARCHIVE" -C "$TMP"
|
|
82
|
+
mkdir -p "$DESTINATION"
|
|
83
|
+
install -m 0755 "$TMP/actionlint" "$DESTINATION/actionlint"
|
|
84
|
+
"$DESTINATION/actionlint" -version
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-install-herdr.sh - install CI's pinned, verified Herdr build.
|
|
3
|
+
#
|
|
4
|
+
# Single owner of the exact Herdr version, official release asset URL, and
|
|
5
|
+
# SHA-256 pin used by the required real-Herdr CI lane. Never installs a
|
|
6
|
+
# floating package-manager latest.
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# fm-install-herdr.sh <destination-directory>
|
|
10
|
+
#
|
|
11
|
+
# Pins Herdr v0.7.4 (protocol 16), the suite-verified protocol-16 release.
|
|
12
|
+
# Selects the official GitHub Releases asset for the host OS/arch, downloads
|
|
13
|
+
# with a bounded max size, verifies SHA-256 before install, then refuses to
|
|
14
|
+
# finish unless the binary reports the exact pin version and a client protocol
|
|
15
|
+
# at or above the required floor (16 for the real-Herdr family).
|
|
16
|
+
set -eu
|
|
17
|
+
|
|
18
|
+
# Exact pin - change only with a re-verified real-Herdr matrix.
|
|
19
|
+
FM_HERDR_CI_VERSION=0.7.4
|
|
20
|
+
FM_HERDR_CI_TAG="v${FM_HERDR_CI_VERSION}"
|
|
21
|
+
FM_HERDR_CI_MIN_PROTOCOL=16
|
|
22
|
+
# Bounded download ceiling (bytes). The largest official 0.7.4 asset is under 20 MiB.
|
|
23
|
+
FM_HERDR_CI_MAX_BYTES=25000000
|
|
24
|
+
FM_HERDR_CI_REPO=ogulcancelik/herdr
|
|
25
|
+
|
|
26
|
+
die() {
|
|
27
|
+
printf 'fm-install-herdr.sh: %s\n' "$*" >&2
|
|
28
|
+
exit 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
DESTINATION=${1:?usage: fm-install-herdr.sh <destination-directory>}
|
|
32
|
+
|
|
33
|
+
os=$(uname -s)
|
|
34
|
+
arch=$(uname -m)
|
|
35
|
+
case "${os}-${arch}" in
|
|
36
|
+
Linux-x86_64)
|
|
37
|
+
ASSET=herdr-linux-x86_64
|
|
38
|
+
SHA256=bc0fc02d4ba500f9cac2353a43e67fe036785ecca6eb55378e050fac3c103059
|
|
39
|
+
;;
|
|
40
|
+
Linux-aarch64|Linux-arm64)
|
|
41
|
+
ASSET=herdr-linux-aarch64
|
|
42
|
+
SHA256=544e0002de42806d1ab64ccdef3a7e7414f24717b0b6b022bc9e57d2eefd26a2
|
|
43
|
+
;;
|
|
44
|
+
Darwin-arm64)
|
|
45
|
+
ASSET=herdr-macos-aarch64
|
|
46
|
+
SHA256=24992e1625dbdcb18354a59e299e4b263c312400b31396cdc07cd46ed57f24a7
|
|
47
|
+
;;
|
|
48
|
+
Darwin-x86_64)
|
|
49
|
+
ASSET=herdr-macos-x86_64
|
|
50
|
+
SHA256=ddf430133352e1712413d5d865b34a485546f4658893fc89986257d65a7585a8
|
|
51
|
+
;;
|
|
52
|
+
*)
|
|
53
|
+
die "unsupported platform ${os}-${arch}; official Herdr assets are linux/macos x86_64 and aarch64"
|
|
54
|
+
;;
|
|
55
|
+
esac
|
|
56
|
+
|
|
57
|
+
URL="https://github.com/${FM_HERDR_CI_REPO}/releases/download/${FM_HERDR_CI_TAG}/${ASSET}"
|
|
58
|
+
TMP=$(mktemp -d "${RUNNER_TEMP:-${TMPDIR:-/tmp}}/fm-herdr.XXXXXX")
|
|
59
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
60
|
+
|
|
61
|
+
printf 'fm-install-herdr.sh: downloading %s from %s\n' "$ASSET" "$URL" >&2
|
|
62
|
+
# --fail: HTTP errors; --location: follow redirects; --max-filesize: bound.
|
|
63
|
+
curl -fsSL --max-filesize "$FM_HERDR_CI_MAX_BYTES" "$URL" -o "$TMP/$ASSET" \
|
|
64
|
+
|| die "download failed for $URL (bounded at $FM_HERDR_CI_MAX_BYTES bytes)"
|
|
65
|
+
|
|
66
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
67
|
+
ACTUAL_SHA256=$(sha256sum "$TMP/$ASSET" | awk '{print $1}')
|
|
68
|
+
elif command -v shasum >/dev/null 2>&1; then
|
|
69
|
+
ACTUAL_SHA256=$(shasum -a 256 "$TMP/$ASSET" | awk '{print $1}')
|
|
70
|
+
else
|
|
71
|
+
die "need sha256sum or shasum to verify the Herdr asset"
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
[ "$ACTUAL_SHA256" = "$SHA256" ] || die "checksum mismatch for $ASSET (expected $SHA256, got $ACTUAL_SHA256)"
|
|
75
|
+
|
|
76
|
+
mkdir -p "$DESTINATION"
|
|
77
|
+
install -m 0755 "$TMP/$ASSET" "$DESTINATION/herdr"
|
|
78
|
+
|
|
79
|
+
# Post-install version and protocol gates (no floating latest).
|
|
80
|
+
installed_version=$("$DESTINATION/herdr" --version 2>/dev/null | awk '{print $2; exit}')
|
|
81
|
+
[ "$installed_version" = "$FM_HERDR_CI_VERSION" ] \
|
|
82
|
+
|| die "installed herdr version is '${installed_version:-<empty>}', expected exact pin $FM_HERDR_CI_VERSION"
|
|
83
|
+
|
|
84
|
+
status=$("$DESTINATION/herdr" status --json 2>/dev/null) \
|
|
85
|
+
|| die "could not run 'herdr status --json' after install"
|
|
86
|
+
protocol=$(printf '%s' "$status" | jq -r '.client.protocol // empty' 2>/dev/null) \
|
|
87
|
+
|| die "jq is required to parse herdr status after install"
|
|
88
|
+
case "$protocol" in
|
|
89
|
+
''|*[!0-9]*) die "could not read herdr client protocol from status --json" ;;
|
|
90
|
+
esac
|
|
91
|
+
[ "$protocol" -ge "$FM_HERDR_CI_MIN_PROTOCOL" ] \
|
|
92
|
+
|| die "herdr protocol $protocol is below the required floor $FM_HERDR_CI_MIN_PROTOCOL"
|
|
93
|
+
|
|
94
|
+
printf 'fm-install-herdr.sh: installed herdr %s (protocol %s) to %s\n' \
|
|
95
|
+
"$installed_version" "$protocol" "$DESTINATION/herdr" >&2
|
|
96
|
+
"$DESTINATION/herdr" --version
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-install-shellcheck.sh - install CI's pinned, verified ShellCheck build.
|
|
3
|
+
#
|
|
4
|
+
# Downloads the official GitHub release archive for the host OS/arch, verifies
|
|
5
|
+
# its per-archive SHA-256 pin, and installs the binary into the destination
|
|
6
|
+
# directory. Supported platforms: linux amd64/x86_64, linux arm64/aarch64,
|
|
7
|
+
# darwin amd64/x86_64, darwin arm64/aarch64. Pins come from the official
|
|
8
|
+
# ShellCheck release asset digests. Verification uses sha256sum when present,
|
|
9
|
+
# otherwise shasum -a 256. An unsupported OS/arch or a missing pin fails
|
|
10
|
+
# without downloading.
|
|
11
|
+
#
|
|
12
|
+
# Usage:
|
|
13
|
+
# fm-install-shellcheck.sh <destination-directory>
|
|
14
|
+
set -eu
|
|
15
|
+
|
|
16
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
17
|
+
VERSION="$("$ROOT/bin/fm-lint.sh" --required-version)"
|
|
18
|
+
|
|
19
|
+
die() {
|
|
20
|
+
printf 'fm-install-shellcheck.sh: %s\n' "$*" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
DESTINATION=${1:?usage: fm-install-shellcheck.sh <destination-directory>}
|
|
25
|
+
|
|
26
|
+
os=$(uname -s)
|
|
27
|
+
arch=$(uname -m)
|
|
28
|
+
# SHA-256 pins are the GitHub release asset digests for shellcheck v0.11.0
|
|
29
|
+
# .tar.xz archives (https://github.com/koalaman/shellcheck/releases/tag/v0.11.0).
|
|
30
|
+
case "${os}-${arch}" in
|
|
31
|
+
Linux-x86_64|Linux-amd64)
|
|
32
|
+
ARCHIVE="shellcheck-v${VERSION}.linux.x86_64.tar.xz"
|
|
33
|
+
SHA256=8c3be12b05d5c177a04c29e3c78ce89ac86f1595681cab149b65b97c4e227198
|
|
34
|
+
;;
|
|
35
|
+
Linux-aarch64|Linux-arm64)
|
|
36
|
+
ARCHIVE="shellcheck-v${VERSION}.linux.aarch64.tar.xz"
|
|
37
|
+
SHA256=12b331c1d2db6b9eb13cfca64306b1b157a86eb69db83023e261eaa7e7c14588
|
|
38
|
+
;;
|
|
39
|
+
Darwin-x86_64|Darwin-amd64)
|
|
40
|
+
ARCHIVE="shellcheck-v${VERSION}.darwin.x86_64.tar.xz"
|
|
41
|
+
SHA256=3c89db4edcab7cf1c27bff178882e0f6f27f7afdf54e859fa041fca10febe4c6
|
|
42
|
+
;;
|
|
43
|
+
Darwin-arm64|Darwin-aarch64)
|
|
44
|
+
ARCHIVE="shellcheck-v${VERSION}.darwin.aarch64.tar.xz"
|
|
45
|
+
SHA256=56affdd8de5527894dca6dc3d7e0a99a873b0f004d7aabc30ae407d3f48b0a79
|
|
46
|
+
;;
|
|
47
|
+
*)
|
|
48
|
+
die "unsupported platform ${os}-${arch}; need linux or darwin on amd64/x86_64 or arm64/aarch64"
|
|
49
|
+
;;
|
|
50
|
+
esac
|
|
51
|
+
[ -n "$SHA256" ] || die "no pinned checksum for ${os}-${arch}"
|
|
52
|
+
|
|
53
|
+
URL="https://github.com/koalaman/shellcheck/releases/download/v${VERSION}/${ARCHIVE}"
|
|
54
|
+
TMP=$(mktemp -d "${RUNNER_TEMP:-${TMPDIR:-/tmp}}/fm-shellcheck.XXXXXX")
|
|
55
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
56
|
+
|
|
57
|
+
DOWNLOAD_ATTEMPTS=6
|
|
58
|
+
download_attempt=1
|
|
59
|
+
while ! curl -fsSL "$URL" -o "$TMP/$ARCHIVE"; do
|
|
60
|
+
[ "$download_attempt" -lt "$DOWNLOAD_ATTEMPTS" ] || {
|
|
61
|
+
printf 'fm-install-shellcheck.sh: download failed after %s attempts\n' "$DOWNLOAD_ATTEMPTS" >&2
|
|
62
|
+
exit 1
|
|
63
|
+
}
|
|
64
|
+
printf 'fm-install-shellcheck.sh: download attempt %s failed; retrying\n' "$download_attempt" >&2
|
|
65
|
+
sleep $((1 << (download_attempt - 1)))
|
|
66
|
+
download_attempt=$((download_attempt + 1))
|
|
67
|
+
done
|
|
68
|
+
|
|
69
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
70
|
+
ACTUAL_SHA256=$(sha256sum "$TMP/$ARCHIVE" | awk '{print $1}')
|
|
71
|
+
elif command -v shasum >/dev/null 2>&1; then
|
|
72
|
+
ACTUAL_SHA256=$(shasum -a 256 "$TMP/$ARCHIVE" | awk '{print $1}')
|
|
73
|
+
else
|
|
74
|
+
die "need sha256sum or shasum to verify the ShellCheck archive"
|
|
75
|
+
fi
|
|
76
|
+
[ "$ACTUAL_SHA256" = "$SHA256" ] || {
|
|
77
|
+
printf 'fm-install-shellcheck.sh: checksum mismatch for %s (expected %s, got %s)\n' \
|
|
78
|
+
"$ARCHIVE" "$SHA256" "$ACTUAL_SHA256" >&2
|
|
79
|
+
exit 1
|
|
80
|
+
}
|
|
81
|
+
tar -xJf "$TMP/$ARCHIVE" -C "$TMP"
|
|
82
|
+
mkdir -p "$DESTINATION"
|
|
83
|
+
install -m 0755 "$TMP/shellcheck-v${VERSION}/shellcheck" "$DESTINATION/shellcheck"
|
|
84
|
+
"$DESTINATION/shellcheck" --version
|