@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,707 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Merge a task's PR or MR after recording pr= and any available pr_head= through
|
|
3
|
+
# bin/fm-pr-check.sh, so teardown can verify landed work after squash merges.
|
|
4
|
+
# The full canonical URL is parsed by bin/fm-pr-lib.sh. A GitHub pull request is
|
|
5
|
+
# addressed through gh-axi by the derived owner and repository; a GitLab merge
|
|
6
|
+
# request is addressed through glab by the project URL rebuilt from the parsed
|
|
7
|
+
# host and path, so any instance works and no host is hardcoded.
|
|
8
|
+
#
|
|
9
|
+
# Merge method on GitHub defaults to --squash when the caller passes none of
|
|
10
|
+
# --squash, --merge, --rebase, or --method after the optional -- separator.
|
|
11
|
+
# The gh-axi merge abstraction always performs the merge; the outcome read that
|
|
12
|
+
# follows it never becomes a prerequisite for reaching that abstraction. After
|
|
13
|
+
# gh-axi returns success, GitHub's live state is read back and accepted only
|
|
14
|
+
# when the pull request is merged or in the merge queue. gh's GraphQL API
|
|
15
|
+
# supplies that queue-aware read when gh is on PATH; when gh is absent or its
|
|
16
|
+
# read fails, gh-axi's own view still proves a landed merge, and every outcome
|
|
17
|
+
# it cannot prove refuses, reporting the single failed read when gh is absent
|
|
18
|
+
# and naming both failed reads when gh is present and its own read failed.
|
|
19
|
+
# If the pull request remains open and the base branch has an effective
|
|
20
|
+
# merge_queue rule, the refusal names the queue's configured merge method and
|
|
21
|
+
# the exact -- --auto --<method> retry flags, unless the caller already passed
|
|
22
|
+
# that method with --auto to a merge command that returned success, in which
|
|
23
|
+
# case it reports instead that the accepted request has not entered the queue
|
|
24
|
+
# and the queue state has to be re-checked.
|
|
25
|
+
# No method is selected for the caller in any case. A rules response that names
|
|
26
|
+
# no queue rule, one that could not be read, rules that disagree, and a method
|
|
27
|
+
# this script does not recognise are four distinct outcomes and are reported
|
|
28
|
+
# apart, because each one leaves the operator somewhere different.
|
|
29
|
+
# A caller-requested --auto that leaves the pull request neither merged nor
|
|
30
|
+
# queued is refused the same way and says auto-merge was armed with nothing
|
|
31
|
+
# landed or queued yet, or, when the merge command itself failed, that auto-merge
|
|
32
|
+
# was only requested; both are read from the caller's own arguments rather than
|
|
33
|
+
# from the forge's prose. The observed state is judged the same way whichever
|
|
34
|
+
# read produced it, and a refusal built on the gh-axi view says the merge queue
|
|
35
|
+
# could not be observed at all rather than implying an unqueued pull request.
|
|
36
|
+
# Every refusal that follows a merge command which returned success quotes that
|
|
37
|
+
# command's own output, marked as the forge's text and kept apart from this
|
|
38
|
+
# script's verdict, including the refusal for an outcome that cannot be read;
|
|
39
|
+
# a merge command that failed keeps its original error surfaced raw and first.
|
|
40
|
+
# GitLab adds no method flag at all: its merge method is the project's own
|
|
41
|
+
# setting, which the merge API applies, and imposing squash there would override
|
|
42
|
+
# that convention rather than mirror the GitHub default.
|
|
43
|
+
#
|
|
44
|
+
# A GitLab merge is refused unless every pre-merge condition holds, each read
|
|
45
|
+
# live at merge time rather than taken from recorded metadata: the merge request
|
|
46
|
+
# is open, detailed_merge_status is mergeable, has_conflicts is false,
|
|
47
|
+
# blocking_discussions_resolved is true, and the head pipeline succeeded at the
|
|
48
|
+
# exact current head commit. Every failing condition is reported, not just the
|
|
49
|
+
# first. The verified head is then passed to glab as --sha, so a push that lands
|
|
50
|
+
# between that read and the merge fails the merge instead of landing commits
|
|
51
|
+
# nothing verified. A recorded pr_head that disagrees with the live head is
|
|
52
|
+
# reported rather than trusted, because a rebase moves the head and leaves the
|
|
53
|
+
# recorded value stale. Reading that state needs glab and jq, and either one
|
|
54
|
+
# absent stops the merge before any state is recorded.
|
|
55
|
+
#
|
|
56
|
+
# Extra args must not include --repo or -R in any form, including a bundled
|
|
57
|
+
# short-option cluster such as -yR, because the repository comes only from the
|
|
58
|
+
# URL, nor --sha on GitLab because the head comes only from the live read.
|
|
59
|
+
#
|
|
60
|
+
# On GitLab, this script confirms the MR is actually merged before reporting it;
|
|
61
|
+
# an auto-merge-queued or unconfirmed request leaves the poll armed and records
|
|
62
|
+
# no landed outcome. bin/fm-merge-outcome-lib.sh owns a confirmed merge's
|
|
63
|
+
# destination, normal-case deduplication, and at-least-once recovery.
|
|
64
|
+
# A landed merge whose outcome cannot be written is reported loudly rather than
|
|
65
|
+
# misreported as a failed merge.
|
|
66
|
+
# Usage: fm-pr-merge.sh <task-id> <pr-url> [-- <extra forge merge args>]
|
|
67
|
+
set -eu
|
|
68
|
+
|
|
69
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
70
|
+
FM_ROOT="${FM_ROOT_OVERRIDE:-$(cd "$SCRIPT_DIR/.." && pwd)}"
|
|
71
|
+
FM_HOME="${FM_HOME:-${FM_ROOT_OVERRIDE:-$FM_ROOT}}"
|
|
72
|
+
STATE="${FM_STATE_OVERRIDE:-$FM_HOME/state}"
|
|
73
|
+
|
|
74
|
+
# shellcheck source=bin/fm-pr-lib.sh
|
|
75
|
+
. "$SCRIPT_DIR/fm-pr-lib.sh"
|
|
76
|
+
# shellcheck source=bin/fm-merge-outcome-lib.sh
|
|
77
|
+
. "$SCRIPT_DIR/fm-merge-outcome-lib.sh"
|
|
78
|
+
# Role partition: merging is MAIN-owned; the Pi supervision branch reports the
|
|
79
|
+
# green PR and never merges (contract: bin/fm-lease-lib.sh; no-op in homes
|
|
80
|
+
# without a branch actor).
|
|
81
|
+
# shellcheck source=bin/fm-lease-lib.sh
|
|
82
|
+
. "$SCRIPT_DIR/fm-lease-lib.sh"
|
|
83
|
+
fm_lease_forbid_branch "PR merge (fm-pr-merge)"
|
|
84
|
+
|
|
85
|
+
if [ "$#" -lt 2 ]; then
|
|
86
|
+
echo "error: invalid PR merge request" >&2
|
|
87
|
+
exit 2
|
|
88
|
+
fi
|
|
89
|
+
ID=$1
|
|
90
|
+
RAW_URL=$2
|
|
91
|
+
if ! fm_pr_task_id_valid "$ID" || ! fm_pr_url_parse "$RAW_URL"; then
|
|
92
|
+
echo "error: invalid PR merge request" >&2
|
|
93
|
+
exit 2
|
|
94
|
+
fi
|
|
95
|
+
URL=$FM_PR_URL
|
|
96
|
+
PROVIDER=$FM_PR_PROVIDER
|
|
97
|
+
PR_OWNER=$FM_PR_OWNER
|
|
98
|
+
PR_REPO=$FM_PR_REPO
|
|
99
|
+
PR_NUMBER=$FM_PR_NUMBER
|
|
100
|
+
# glab resolves the instance from the project URL passed to -R, so the host is
|
|
101
|
+
# rebuilt from the parsed identity rather than read from any ambient default.
|
|
102
|
+
PROJECT_URL="https://$FM_PR_HOST/$FM_PR_PATH"
|
|
103
|
+
shift 2
|
|
104
|
+
[ "${1:-}" = "--" ] && shift
|
|
105
|
+
|
|
106
|
+
caller_has_merge_method() {
|
|
107
|
+
local arg
|
|
108
|
+
for arg in "$@"; do
|
|
109
|
+
case "$arg" in
|
|
110
|
+
--squash|--merge|--rebase|--method|--method=*) return 0 ;;
|
|
111
|
+
esac
|
|
112
|
+
done
|
|
113
|
+
return 1
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
# The merge method the caller's own extra arguments named, in the --flag,
|
|
117
|
+
# --method <value> and --method=<value> forms caller_has_merge_method accepts.
|
|
118
|
+
caller_merge_method() {
|
|
119
|
+
local arg method='' pending=false
|
|
120
|
+
for arg in "$@"; do
|
|
121
|
+
if [ "$pending" = true ]; then
|
|
122
|
+
method=$arg
|
|
123
|
+
pending=false
|
|
124
|
+
continue
|
|
125
|
+
fi
|
|
126
|
+
case "$arg" in
|
|
127
|
+
--squash) method=squash ;;
|
|
128
|
+
--merge) method=merge ;;
|
|
129
|
+
--rebase) method=rebase ;;
|
|
130
|
+
--method) pending=true ;;
|
|
131
|
+
--method=*) method=${arg#--method=} ;;
|
|
132
|
+
esac
|
|
133
|
+
done
|
|
134
|
+
printf '%s' "$method"
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
# Whether the caller's own extra arguments asked for auto-merge, including the
|
|
138
|
+
# --flag=value spelling the forge's flag parser accepts. --disable-auto cancels
|
|
139
|
+
# the request, and gh exposes no short option that could bundle either flag.
|
|
140
|
+
caller_requested_auto_merge() {
|
|
141
|
+
local arg requested=1
|
|
142
|
+
for arg in "$@"; do
|
|
143
|
+
case "$arg" in
|
|
144
|
+
--auto) requested=0 ;;
|
|
145
|
+
--auto=*)
|
|
146
|
+
case "${arg#--auto=}" in
|
|
147
|
+
[tT]|[tT][rR][uU][eE]|1) requested=0 ;;
|
|
148
|
+
*) requested=1 ;;
|
|
149
|
+
esac
|
|
150
|
+
;;
|
|
151
|
+
--disable-auto) requested=1 ;;
|
|
152
|
+
esac
|
|
153
|
+
done
|
|
154
|
+
return "$requested"
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
reject_repo_overrides() {
|
|
158
|
+
local arg
|
|
159
|
+
for arg in "$@"; do
|
|
160
|
+
case "$arg" in
|
|
161
|
+
--repo|--repo=*)
|
|
162
|
+
echo "error: extra merge arguments must not override the repository" >&2
|
|
163
|
+
return 1
|
|
164
|
+
;;
|
|
165
|
+
--*) ;;
|
|
166
|
+
# A single-dash argument is a short-option cluster, which both CLIs expand
|
|
167
|
+
# one character at a time, so -yR carries --repo exactly as a bare -R does.
|
|
168
|
+
-*R*)
|
|
169
|
+
echo "error: extra merge arguments must not override the repository" >&2
|
|
170
|
+
return 1
|
|
171
|
+
;;
|
|
172
|
+
esac
|
|
173
|
+
done
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
reject_head_overrides() {
|
|
177
|
+
local arg
|
|
178
|
+
for arg in "$@"; do
|
|
179
|
+
case "$arg" in
|
|
180
|
+
--sha|--sha=*)
|
|
181
|
+
echo "error: extra merge arguments must not override the head commit" >&2
|
|
182
|
+
return 1
|
|
183
|
+
;;
|
|
184
|
+
esac
|
|
185
|
+
done
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
reject_repo_overrides "$@" || exit 1
|
|
189
|
+
[ "$PROVIDER" != gitlab ] || reject_head_overrides "$@" || exit 1
|
|
190
|
+
|
|
191
|
+
# Task-derived paths are constructed only after the canonical ID validation.
|
|
192
|
+
META="$STATE/$ID.meta"
|
|
193
|
+
if [ ! -f "$META" ] || [ -L "$META" ]; then
|
|
194
|
+
echo "error: task metadata is unavailable" >&2
|
|
195
|
+
exit 1
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
# Reading the merge request state needs both tools. Report them together and
|
|
199
|
+
# before anything is recorded, so a missing tool is a named prerequisite rather
|
|
200
|
+
# than a merge that is armed and then refused for an unexplained reason.
|
|
201
|
+
GITLAB_MISSING=
|
|
202
|
+
if [ "$PROVIDER" = gitlab ]; then
|
|
203
|
+
command -v glab >/dev/null 2>&1 || GITLAB_MISSING="glab"
|
|
204
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
205
|
+
GITLAB_MISSING="${GITLAB_MISSING:+$GITLAB_MISSING and }jq"
|
|
206
|
+
fi
|
|
207
|
+
if [ -n "$GITLAB_MISSING" ]; then
|
|
208
|
+
echo "error: merging a GitLab merge request requires $GITLAB_MISSING on PATH" >&2
|
|
209
|
+
exit 1
|
|
210
|
+
fi
|
|
211
|
+
fi
|
|
212
|
+
|
|
213
|
+
# The recorded head is read before bin/fm-pr-check.sh rewrites the metadata,
|
|
214
|
+
# because that script re-records pr= and drops a pr_head= it cannot resolve.
|
|
215
|
+
RECORDED_HEAD=
|
|
216
|
+
if [ "$PROVIDER" = gitlab ]; then
|
|
217
|
+
RECORDED_HEAD=$(grep '^pr_head=' "$META" | tail -1 | cut -d= -f2- || true)
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
# Pre-merge conditions for a GitLab merge request, read from one live view of
|
|
221
|
+
# the merge request. Sets FM_PR_MERGE_HEAD to the verified head on success and
|
|
222
|
+
# returns non-zero after reporting every condition that failed.
|
|
223
|
+
FM_PR_MERGE_HEAD=
|
|
224
|
+
gitlab_verify_mergeable() {
|
|
225
|
+
local json fields line
|
|
226
|
+
local total=0 named=0 refusals=''
|
|
227
|
+
local state='' detail='' conflicts='' discussions=''
|
|
228
|
+
local live_head='' pipeline_sha='' pipeline_status=''
|
|
229
|
+
|
|
230
|
+
# GITLAB_HOST is set to the same host the project URL already carries, so the
|
|
231
|
+
# instance is taken from the parsed URL by both signals and never from the
|
|
232
|
+
# operator's configured default.
|
|
233
|
+
if ! json=$(GITLAB_HOST="$FM_PR_HOST" glab mr view "$PR_NUMBER" -R "$PROJECT_URL" -F json 2>/dev/null) \
|
|
234
|
+
|| [ -z "$json" ]; then
|
|
235
|
+
echo "error: could not read the GitLab merge request state before merging" >&2
|
|
236
|
+
return 1
|
|
237
|
+
fi
|
|
238
|
+
# One named field per line. The names keep a trailing empty value readable
|
|
239
|
+
# after command substitution strips blank lines, and an absent or null field
|
|
240
|
+
# becomes an empty string or the literal "null", neither of which satisfies any
|
|
241
|
+
# check below, so an unreadable field refuses the merge instead of passing it.
|
|
242
|
+
if ! fields=$(printf '%s' "$json" | jq -r '
|
|
243
|
+
if type == "object" then
|
|
244
|
+
"state=" + ((.state // "") | tostring),
|
|
245
|
+
"detail=" + ((.detailed_merge_status // "") | tostring),
|
|
246
|
+
"conflicts=" + (.has_conflicts | tostring),
|
|
247
|
+
"discussions=" + (.blocking_discussions_resolved | tostring),
|
|
248
|
+
"head=" + ((.sha // "") | tostring),
|
|
249
|
+
"pipeline_sha=" + ((.head_pipeline.sha // "") | tostring),
|
|
250
|
+
"pipeline_status=" + ((.head_pipeline.status // "") | tostring)
|
|
251
|
+
else
|
|
252
|
+
error("merge request payload is not an object")
|
|
253
|
+
end' 2>/dev/null); then
|
|
254
|
+
echo "error: could not read the GitLab merge request state before merging" >&2
|
|
255
|
+
return 1
|
|
256
|
+
fi
|
|
257
|
+
while IFS= read -r line; do
|
|
258
|
+
total=$((total + 1))
|
|
259
|
+
case "$line" in
|
|
260
|
+
state=*) state=${line#state=} ;;
|
|
261
|
+
detail=*) detail=${line#detail=} ;;
|
|
262
|
+
conflicts=*) conflicts=${line#conflicts=} ;;
|
|
263
|
+
discussions=*) discussions=${line#discussions=} ;;
|
|
264
|
+
head=*) live_head=${line#head=} ;;
|
|
265
|
+
pipeline_sha=*) pipeline_sha=${line#pipeline_sha=} ;;
|
|
266
|
+
pipeline_status=*) pipeline_status=${line#pipeline_status=} ;;
|
|
267
|
+
*) continue ;;
|
|
268
|
+
esac
|
|
269
|
+
named=$((named + 1))
|
|
270
|
+
done <<FIELDS
|
|
271
|
+
$fields
|
|
272
|
+
FIELDS
|
|
273
|
+
# Every field named exactly once and no unnamed line: a value carrying a
|
|
274
|
+
# newline would split into a line no name matches, so it is refused here
|
|
275
|
+
# rather than silently truncated into a value a check could accept.
|
|
276
|
+
if [ "$named" -ne 7 ] || [ "$total" -ne 7 ]; then
|
|
277
|
+
echo "error: could not read the GitLab merge request state before merging" >&2
|
|
278
|
+
return 1
|
|
279
|
+
fi
|
|
280
|
+
|
|
281
|
+
if ! fm_pr_head_valid "$live_head"; then
|
|
282
|
+
echo "error: could not read the GitLab merge request head commit before merging" >&2
|
|
283
|
+
return 1
|
|
284
|
+
fi
|
|
285
|
+
# A rebase moves the head and leaves the recorded value behind, so the
|
|
286
|
+
# disagreement is reported and the live head is what gets verified and merged.
|
|
287
|
+
if [ -n "$RECORDED_HEAD" ] && [ "$RECORDED_HEAD" != "$live_head" ]; then
|
|
288
|
+
printf 'notice: recorded head %s disagrees with the live head %s; verifying the live head\n' \
|
|
289
|
+
"$RECORDED_HEAD" "$live_head" >&2
|
|
290
|
+
fi
|
|
291
|
+
|
|
292
|
+
[ "$state" = opened ] \
|
|
293
|
+
|| refusals="$refusals - state is \"${state:-unreadable}\", not open
|
|
294
|
+
"
|
|
295
|
+
[ "$detail" = mergeable ] \
|
|
296
|
+
|| refusals="$refusals - detailed_merge_status is \"${detail:-unreadable}\", not mergeable
|
|
297
|
+
"
|
|
298
|
+
[ "$conflicts" = false ] \
|
|
299
|
+
|| refusals="$refusals - has_conflicts is \"${conflicts:-unreadable}\", not false
|
|
300
|
+
"
|
|
301
|
+
[ "$discussions" = true ] \
|
|
302
|
+
|| refusals="$refusals - blocking_discussions_resolved is \"${discussions:-unreadable}\", not true
|
|
303
|
+
"
|
|
304
|
+
[ "$pipeline_status" = success ] \
|
|
305
|
+
|| refusals="$refusals - the head pipeline status is \"${pipeline_status:-none}\", not success
|
|
306
|
+
"
|
|
307
|
+
[ "$pipeline_sha" = "$live_head" ] \
|
|
308
|
+
|| refusals="$refusals - the head pipeline ran at \"${pipeline_sha:-none}\", not at the current head $live_head
|
|
309
|
+
"
|
|
310
|
+
|
|
311
|
+
if [ -n "$refusals" ]; then
|
|
312
|
+
printf 'error: refusing to merge %s\n' "$URL" >&2
|
|
313
|
+
printf '%s' "$refusals" >&2
|
|
314
|
+
return 1
|
|
315
|
+
fi
|
|
316
|
+
printf 'verified: %s is open and mergeable, with a successful pipeline at head %s\n' \
|
|
317
|
+
"$URL" "$live_head" >&2
|
|
318
|
+
FM_PR_MERGE_HEAD=$live_head
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
# Read one live GitHub pull request view after gh-axi returns. The selected
|
|
322
|
+
# fields distinguish a landed pull request from a merge-queue entry and retain
|
|
323
|
+
# the concrete state needed for a refusal. gh supplies the complete queue-aware
|
|
324
|
+
# view when available; gh-axi remains the degradation path that can prove a
|
|
325
|
+
# landed merge without making gh a prerequisite for the merge abstraction.
|
|
326
|
+
FM_PR_GITHUB_STATE=
|
|
327
|
+
FM_PR_GITHUB_MERGED=
|
|
328
|
+
FM_PR_GITHUB_QUEUED=
|
|
329
|
+
FM_PR_GITHUB_BASE=
|
|
330
|
+
FM_PR_GITHUB_QUEUE_OBSERVED=false
|
|
331
|
+
github_read_outcome_with_gh() {
|
|
332
|
+
local fields line
|
|
333
|
+
local total=0 named=0
|
|
334
|
+
local state='' merged='' queued='' base=''
|
|
335
|
+
|
|
336
|
+
# shellcheck disable=SC2016 # GraphQL variables are literal query syntax.
|
|
337
|
+
if ! fields=$(gh api graphql \
|
|
338
|
+
-f query='query($owner:String!,$repo:String!,$number:Int!){repository(owner:$owner,name:$repo){pullRequest(number:$number){state merged isInMergeQueue baseRefName}}}' \
|
|
339
|
+
-F "owner=$PR_OWNER" -F "repo=$PR_REPO" -F "number=$PR_NUMBER" \
|
|
340
|
+
--jq '.data.repository.pullRequest | "state=" + (.state // ""), "merged=" + (.merged | tostring), "queued=" + (.isInMergeQueue | tostring), "base=" + (.baseRefName // "")' \
|
|
341
|
+
2>/dev/null) || [ -z "$fields" ]; then
|
|
342
|
+
return 1
|
|
343
|
+
fi
|
|
344
|
+
while IFS= read -r line; do
|
|
345
|
+
total=$((total + 1))
|
|
346
|
+
case "$line" in
|
|
347
|
+
state=*) state=${line#state=} ;;
|
|
348
|
+
merged=*) merged=${line#merged=} ;;
|
|
349
|
+
queued=*) queued=${line#queued=} ;;
|
|
350
|
+
base=*) base=${line#base=} ;;
|
|
351
|
+
*) continue ;;
|
|
352
|
+
esac
|
|
353
|
+
named=$((named + 1))
|
|
354
|
+
done <<FIELDS
|
|
355
|
+
$fields
|
|
356
|
+
FIELDS
|
|
357
|
+
if [ "$named" -ne 4 ] || [ "$total" -ne 4 ] || [ -z "$state" ] \
|
|
358
|
+
|| { [ "$merged" != true ] && [ "$merged" != false ]; } \
|
|
359
|
+
|| { [ "$queued" != true ] && [ "$queued" != false ]; } \
|
|
360
|
+
|| [ -z "$base" ]; then
|
|
361
|
+
return 1
|
|
362
|
+
fi
|
|
363
|
+
|
|
364
|
+
FM_PR_GITHUB_STATE=$state
|
|
365
|
+
FM_PR_GITHUB_MERGED=$merged
|
|
366
|
+
FM_PR_GITHUB_QUEUED=$queued
|
|
367
|
+
FM_PR_GITHUB_BASE=$base
|
|
368
|
+
FM_PR_GITHUB_QUEUE_OBSERVED=true
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
github_read_outcome_with_gh_axi() {
|
|
372
|
+
local output state
|
|
373
|
+
if ! output=$(gh-axi pr view "$PR_NUMBER" --repo "$PR_OWNER/$PR_REPO" 2>/dev/null); then
|
|
374
|
+
return 1
|
|
375
|
+
fi
|
|
376
|
+
if ! state=$(printf '%s\n' "$output" | awk '
|
|
377
|
+
$1 == "state:" { count++; value=$2 }
|
|
378
|
+
END { if (count == 1 && value != "") print value; else exit 1 }
|
|
379
|
+
'); then
|
|
380
|
+
return 1
|
|
381
|
+
fi
|
|
382
|
+
case "$state" in
|
|
383
|
+
merged)
|
|
384
|
+
FM_PR_GITHUB_STATE=MERGED
|
|
385
|
+
FM_PR_GITHUB_MERGED=true
|
|
386
|
+
FM_PR_GITHUB_QUEUED=false
|
|
387
|
+
;;
|
|
388
|
+
*)
|
|
389
|
+
FM_PR_GITHUB_STATE=$state
|
|
390
|
+
FM_PR_GITHUB_MERGED=false
|
|
391
|
+
FM_PR_GITHUB_QUEUED=unknown
|
|
392
|
+
;;
|
|
393
|
+
esac
|
|
394
|
+
FM_PR_GITHUB_BASE=
|
|
395
|
+
FM_PR_GITHUB_QUEUE_OBSERVED=false
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
github_read_outcome() {
|
|
399
|
+
if ! command -v gh >/dev/null 2>&1; then
|
|
400
|
+
github_read_outcome_with_gh_axi && return 0
|
|
401
|
+
echo "error: could not read the GitHub pull request outcome after the merge attempt; PR metadata and merge poll remain recorded" >&2
|
|
402
|
+
return 1
|
|
403
|
+
fi
|
|
404
|
+
# Only a failed gh read falls back. A gh read that completes and reports the
|
|
405
|
+
# pull request as neither merged nor queued is a concrete outcome, not a
|
|
406
|
+
# missing one, so it keeps its own refusal. The gh-axi view cannot observe the
|
|
407
|
+
# merge queue, so it can only turn this into a proved merge or into a refusal.
|
|
408
|
+
github_read_outcome_with_gh && return 0
|
|
409
|
+
if github_read_outcome_with_gh_axi && [ "$FM_PR_GITHUB_MERGED" = true ]; then
|
|
410
|
+
return 0
|
|
411
|
+
fi
|
|
412
|
+
echo "error: could not read the GitHub pull request outcome after the merge attempt: the gh read failed and the gh-axi view could not prove the outcome either; PR metadata and merge poll remain recorded" >&2
|
|
413
|
+
return 1
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
github_urlencode_path_segment() {
|
|
417
|
+
local LC_ALL=C input=$1 encoded='' char octet hex
|
|
418
|
+
while [ -n "$input" ]; do
|
|
419
|
+
char=${input%"${input#?}"}
|
|
420
|
+
input=${input#?}
|
|
421
|
+
case "$char" in
|
|
422
|
+
[-._~a-zA-Z0-9]) encoded=$encoded$char ;;
|
|
423
|
+
*)
|
|
424
|
+
printf -v octet '%d' "'$char"
|
|
425
|
+
[ "$octet" -ge 0 ] || octet=$((octet + 256))
|
|
426
|
+
printf -v hex '%02X' "$octet"
|
|
427
|
+
encoded=$encoded%$hex
|
|
428
|
+
;;
|
|
429
|
+
esac
|
|
430
|
+
done
|
|
431
|
+
printf '%s' "$encoded"
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
# Read the effective merge-queue method for the observed base branch. The four
|
|
435
|
+
# situations the refusal has to keep apart - no queue rule, a rules response
|
|
436
|
+
# that could not be read, several rules that disagree, and a rule whose method
|
|
437
|
+
# this script does not recognise - are reported as a status rather than folded
|
|
438
|
+
# into one failure, because each one means something different to the operator.
|
|
439
|
+
FM_PR_GITHUB_QUEUE_METHOD=
|
|
440
|
+
FM_PR_GITHUB_QUEUE_METHODS=
|
|
441
|
+
FM_PR_GITHUB_QUEUE_STATUS=unreadable
|
|
442
|
+
github_read_queue_method() {
|
|
443
|
+
local methods line candidate method='' count=0 branch_path
|
|
444
|
+
local unrecognised=false conflicting=false
|
|
445
|
+
FM_PR_GITHUB_QUEUE_METHOD=
|
|
446
|
+
FM_PR_GITHUB_QUEUE_METHODS=
|
|
447
|
+
FM_PR_GITHUB_QUEUE_STATUS=unreadable
|
|
448
|
+
command -v gh >/dev/null 2>&1 || return 0
|
|
449
|
+
[ -n "$FM_PR_GITHUB_BASE" ] || return 0
|
|
450
|
+
branch_path=$(github_urlencode_path_segment "$FM_PR_GITHUB_BASE")
|
|
451
|
+
if ! methods=$(gh api \
|
|
452
|
+
--paginate "repos/$PR_OWNER/$PR_REPO/rules/branches/$branch_path" \
|
|
453
|
+
--jq '.[] | select(.type == "merge_queue") | "merge_method=" + (.parameters.merge_method // "")' \
|
|
454
|
+
2>/dev/null); then
|
|
455
|
+
return 0
|
|
456
|
+
fi
|
|
457
|
+
while IFS= read -r line; do
|
|
458
|
+
[ -n "$line" ] || continue
|
|
459
|
+
case "$line" in
|
|
460
|
+
merge_method=*) candidate=${line#merge_method=} ;;
|
|
461
|
+
*) return 0 ;;
|
|
462
|
+
esac
|
|
463
|
+
count=$((count + 1))
|
|
464
|
+
case "$candidate" in
|
|
465
|
+
MERGE|SQUASH|REBASE) ;;
|
|
466
|
+
*) unrecognised=true ;;
|
|
467
|
+
esac
|
|
468
|
+
if [ -z "$FM_PR_GITHUB_QUEUE_METHODS" ] && [ "$count" -eq 1 ]; then
|
|
469
|
+
FM_PR_GITHUB_QUEUE_METHODS=$candidate
|
|
470
|
+
else
|
|
471
|
+
case ",$FM_PR_GITHUB_QUEUE_METHODS," in
|
|
472
|
+
*",$candidate,"*) ;;
|
|
473
|
+
*)
|
|
474
|
+
FM_PR_GITHUB_QUEUE_METHODS="$FM_PR_GITHUB_QUEUE_METHODS,$candidate"
|
|
475
|
+
conflicting=true
|
|
476
|
+
;;
|
|
477
|
+
esac
|
|
478
|
+
fi
|
|
479
|
+
method=$candidate
|
|
480
|
+
done <<METHODS
|
|
481
|
+
$methods
|
|
482
|
+
METHODS
|
|
483
|
+
if [ "$count" -eq 0 ]; then
|
|
484
|
+
FM_PR_GITHUB_QUEUE_STATUS=none
|
|
485
|
+
elif [ "$conflicting" = true ]; then
|
|
486
|
+
FM_PR_GITHUB_QUEUE_STATUS=conflicting
|
|
487
|
+
elif [ "$unrecognised" = true ]; then
|
|
488
|
+
FM_PR_GITHUB_QUEUE_STATUS=unrecognised
|
|
489
|
+
else
|
|
490
|
+
FM_PR_GITHUB_QUEUE_STATUS=single
|
|
491
|
+
FM_PR_GITHUB_QUEUE_METHOD=$method
|
|
492
|
+
fi
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
record_pr_metadata() {
|
|
496
|
+
if ! "$SCRIPT_DIR/fm-pr-check.sh" "$ID" "$URL"; then
|
|
497
|
+
return 1
|
|
498
|
+
fi
|
|
499
|
+
grep -qxF "pr=$URL" "$META" || {
|
|
500
|
+
echo "error: PR metadata recording failed" >&2
|
|
501
|
+
return 1
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
FM_PR_GITHUB_AUTO_REQUESTED=false
|
|
506
|
+
FM_PR_GITHUB_MERGE_ACCEPTED=false
|
|
507
|
+
FM_PR_GITHUB_CALLER_METHOD=
|
|
508
|
+
|
|
509
|
+
# The single gate every statement about what the forge accepted, armed, or
|
|
510
|
+
# reported has to pass. A merge command that failed accepted nothing, so no
|
|
511
|
+
# such statement may be made on its path, and routing them all through one
|
|
512
|
+
# predicate keeps a later one from being written without the gate.
|
|
513
|
+
github_merge_command_succeeded() {
|
|
514
|
+
[ "$FM_PR_GITHUB_MERGE_ACCEPTED" = true ]
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
github_report_forge_output() {
|
|
518
|
+
local output=$1 line
|
|
519
|
+
github_merge_command_succeeded || return 0
|
|
520
|
+
[ -n "$output" ] || return 0
|
|
521
|
+
echo "error: the merge command's own output follows, quoted; it is the forge CLI's report, not this script's verdict:" >&2
|
|
522
|
+
while IFS= read -r line; do
|
|
523
|
+
printf 'error: > %s\n' "$line" >&2
|
|
524
|
+
done <<OUTPUT
|
|
525
|
+
$output
|
|
526
|
+
OUTPUT
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
github_state_is_open() {
|
|
530
|
+
case "$FM_PR_GITHUB_STATE" in
|
|
531
|
+
[oO][pP][eE][nN]) return 0 ;;
|
|
532
|
+
*) return 1 ;;
|
|
533
|
+
esac
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
# Whether the caller's own named method is the one the queue is configured for,
|
|
537
|
+
# compared without regard to the spelling either side happens to use.
|
|
538
|
+
github_caller_method_is() {
|
|
539
|
+
case "$FM_PR_GITHUB_CALLER_METHOD" in
|
|
540
|
+
[mM][eE][rR][gG][eE]) [ "$1" = merge ] ;;
|
|
541
|
+
[sS][qQ][uU][aA][sS][hH]) [ "$1" = squash ] ;;
|
|
542
|
+
[rR][eE][bB][aA][sS][eE]) [ "$1" = rebase ] ;;
|
|
543
|
+
*) return 1 ;;
|
|
544
|
+
esac
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
github_report_queue_rules() {
|
|
548
|
+
local queue_method methods_display
|
|
549
|
+
github_read_queue_method
|
|
550
|
+
case "$FM_PR_GITHUB_QUEUE_STATUS" in
|
|
551
|
+
single)
|
|
552
|
+
case "$FM_PR_GITHUB_QUEUE_METHOD" in
|
|
553
|
+
MERGE) queue_method=merge ;;
|
|
554
|
+
SQUASH) queue_method=squash ;;
|
|
555
|
+
REBASE) queue_method=rebase ;;
|
|
556
|
+
esac
|
|
557
|
+
if github_merge_command_succeeded \
|
|
558
|
+
&& [ "$FM_PR_GITHUB_AUTO_REQUESTED" = true ] \
|
|
559
|
+
&& github_caller_method_is "$queue_method"; then
|
|
560
|
+
printf 'error: this run refuses even though the request for %s was accepted with the exact flags base branch %s requires (--auto --%s): the pull request has still not entered the merge queue, so no landed or queued outcome is proven; re-check the pull request'"'"'s merge queue state before retrying\n' \
|
|
561
|
+
"$URL" "$FM_PR_GITHUB_BASE" "$queue_method" >&2
|
|
562
|
+
else
|
|
563
|
+
printf 'error: base branch %s requires the merge queue; retry with: %s %s %s -- --auto --%s\n' \
|
|
564
|
+
"$FM_PR_GITHUB_BASE" "$0" "$ID" "$URL" "$queue_method" >&2
|
|
565
|
+
fi
|
|
566
|
+
;;
|
|
567
|
+
conflicting)
|
|
568
|
+
printf 'error: base branch %s has conflicting merge queue methods (%s); exact retry flags are ambiguous\n' \
|
|
569
|
+
"$FM_PR_GITHUB_BASE" "${FM_PR_GITHUB_QUEUE_METHODS//,/, }" >&2
|
|
570
|
+
;;
|
|
571
|
+
unrecognised)
|
|
572
|
+
methods_display=${FM_PR_GITHUB_QUEUE_METHODS//,/, }
|
|
573
|
+
[ -n "$methods_display" ] || methods_display='<none reported>'
|
|
574
|
+
printf 'error: base branch %s requires the merge queue, but its configured merge method (%s) is not one this script recognises, so exact retry flags cannot be named\n' \
|
|
575
|
+
"$FM_PR_GITHUB_BASE" "$methods_display" >&2
|
|
576
|
+
;;
|
|
577
|
+
unreadable)
|
|
578
|
+
printf 'error: the branch rules for base branch %s could not be read, so a merge queue requirement can be neither confirmed nor ruled out here\n' \
|
|
579
|
+
"${FM_PR_GITHUB_BASE:-<unknown>}" >&2
|
|
580
|
+
;;
|
|
581
|
+
esac
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
github_report_unmerged_outcome() {
|
|
585
|
+
printf 'error: GitHub merge outcome was not successful: state=%s, merged=%s, isInMergeQueue=%s\n' \
|
|
586
|
+
"$FM_PR_GITHUB_STATE" "$FM_PR_GITHUB_MERGED" "$FM_PR_GITHUB_QUEUED" >&2
|
|
587
|
+
if ! github_state_is_open || [ "$FM_PR_GITHUB_MERGED" != false ] \
|
|
588
|
+
|| [ "$FM_PR_GITHUB_QUEUED" = true ]; then
|
|
589
|
+
return 0
|
|
590
|
+
fi
|
|
591
|
+
if [ "$FM_PR_GITHUB_AUTO_REQUESTED" = true ]; then
|
|
592
|
+
if github_merge_command_succeeded; then
|
|
593
|
+
printf 'error: auto-merge was requested and armed for %s, but nothing is merged or in the merge queue yet, so this run refuses instead of reporting an unproved merge\n' \
|
|
594
|
+
"$URL" >&2
|
|
595
|
+
else
|
|
596
|
+
printf 'error: auto-merge was requested for %s, but the merge command itself failed, so nothing was enabled, merged or queued\n' \
|
|
597
|
+
"$URL" >&2
|
|
598
|
+
fi
|
|
599
|
+
fi
|
|
600
|
+
if [ "$FM_PR_GITHUB_QUEUE_OBSERVED" != true ]; then
|
|
601
|
+
printf 'error: the merge queue could not be observed for %s because the queue-aware read was unavailable, so a pull request already in the merge queue cannot be told apart from one that never entered it; re-check the pull request'"'"'s merge queue state before retrying\n' \
|
|
602
|
+
"$URL" >&2
|
|
603
|
+
return 0
|
|
604
|
+
fi
|
|
605
|
+
github_report_queue_rules
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
gitlab_confirm_merged() {
|
|
609
|
+
local json state
|
|
610
|
+
if ! json=$(GITLAB_HOST="$FM_PR_HOST" glab mr view "$PR_NUMBER" \
|
|
611
|
+
-R "$PROJECT_URL" -F json 2>/dev/null) || [ -z "$json" ]; then
|
|
612
|
+
printf 'actionable: GitLab accepted the merge request for %s but its landed state could not be confirmed; the merge poll remains armed\n' \
|
|
613
|
+
"$URL" >&2
|
|
614
|
+
return 2
|
|
615
|
+
fi
|
|
616
|
+
if ! state=$(printf '%s' "$json" | jq -r \
|
|
617
|
+
'if type == "object" and (.state | type == "string") then .state else error("invalid state") end' \
|
|
618
|
+
2>/dev/null); then
|
|
619
|
+
printf 'actionable: GitLab accepted the merge request for %s but its landed state could not be confirmed; the merge poll remains armed\n' \
|
|
620
|
+
"$URL" >&2
|
|
621
|
+
return 2
|
|
622
|
+
fi
|
|
623
|
+
[ "$state" = merged ]
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
# Record before either forge call. This arms the merge poll without claiming a
|
|
627
|
+
# landed outcome, so even a provider read failure after a real merge cannot
|
|
628
|
+
# leave teardown without the PR identity it needs to verify the result.
|
|
629
|
+
record_pr_metadata || exit 1
|
|
630
|
+
|
|
631
|
+
case "$PROVIDER" in
|
|
632
|
+
github)
|
|
633
|
+
merge_output=
|
|
634
|
+
merge_args=()
|
|
635
|
+
if ! caller_has_merge_method "$@"; then
|
|
636
|
+
merge_args=(--squash)
|
|
637
|
+
fi
|
|
638
|
+
if caller_requested_auto_merge "$@"; then
|
|
639
|
+
FM_PR_GITHUB_AUTO_REQUESTED=true
|
|
640
|
+
fi
|
|
641
|
+
FM_PR_GITHUB_CALLER_METHOD=$(caller_merge_method "$@")
|
|
642
|
+
if merge_output=$(gh-axi pr merge "$PR_NUMBER" --repo "$PR_OWNER/$PR_REPO" \
|
|
643
|
+
"${merge_args[@]+"${merge_args[@]}"}" "$@" 2>&1); then
|
|
644
|
+
FM_PR_GITHUB_MERGE_ACCEPTED=true
|
|
645
|
+
else
|
|
646
|
+
merge_status=$?
|
|
647
|
+
[ -z "$merge_output" ] || printf '%s\n' "$merge_output" >&2
|
|
648
|
+
if github_read_outcome; then
|
|
649
|
+
if [ "$FM_PR_GITHUB_MERGED" != true ] && [ "$FM_PR_GITHUB_QUEUED" != true ]; then
|
|
650
|
+
github_report_unmerged_outcome
|
|
651
|
+
else
|
|
652
|
+
printf 'actionable: the merge command for %s failed, but the pull request reads back as state=%s, merged=%s, isInMergeQueue=%s\n' \
|
|
653
|
+
"$URL" "$FM_PR_GITHUB_STATE" "$FM_PR_GITHUB_MERGED" "$FM_PR_GITHUB_QUEUED" >&2
|
|
654
|
+
fi
|
|
655
|
+
fi
|
|
656
|
+
exit "$merge_status"
|
|
657
|
+
fi
|
|
658
|
+
if ! github_read_outcome; then
|
|
659
|
+
github_report_forge_output "$merge_output"
|
|
660
|
+
exit 1
|
|
661
|
+
fi
|
|
662
|
+
if [ "$FM_PR_GITHUB_MERGED" = true ]; then
|
|
663
|
+
printf 'verified: %s is merged (state=%s, merged=%s, isInMergeQueue=%s)\n' \
|
|
664
|
+
"$URL" "$FM_PR_GITHUB_STATE" "$FM_PR_GITHUB_MERGED" "$FM_PR_GITHUB_QUEUED"
|
|
665
|
+
elif [ "$FM_PR_GITHUB_QUEUED" = true ]; then
|
|
666
|
+
printf 'verified: %s is queued (state=%s, merged=%s, isInMergeQueue=%s)\n' \
|
|
667
|
+
"$URL" "$FM_PR_GITHUB_STATE" "$FM_PR_GITHUB_MERGED" "$FM_PR_GITHUB_QUEUED"
|
|
668
|
+
exit 0
|
|
669
|
+
else
|
|
670
|
+
github_report_forge_output "$merge_output"
|
|
671
|
+
github_report_unmerged_outcome
|
|
672
|
+
exit 1
|
|
673
|
+
fi
|
|
674
|
+
;;
|
|
675
|
+
gitlab)
|
|
676
|
+
gitlab_verify_mergeable || exit 1
|
|
677
|
+
# --sha binds the merge to the head this run verified, so a push that lands
|
|
678
|
+
# in between is refused by GitLab instead of merged unverified. --yes only
|
|
679
|
+
# skips the interactive confirmation, which no supervised run can answer;
|
|
680
|
+
# the conditions above are what authorize the merge.
|
|
681
|
+
GITLAB_HOST="$FM_PR_HOST" glab mr merge "$PR_NUMBER" -R "$PROJECT_URL" \
|
|
682
|
+
--sha "$FM_PR_MERGE_HEAD" --yes "$@"
|
|
683
|
+
gitlab_confirm_rc=0
|
|
684
|
+
gitlab_confirm_merged || gitlab_confirm_rc=$?
|
|
685
|
+
[ "$gitlab_confirm_rc" -eq 0 ] || exit 0
|
|
686
|
+
;;
|
|
687
|
+
*)
|
|
688
|
+
echo "error: invalid PR merge request" >&2
|
|
689
|
+
exit 2
|
|
690
|
+
;;
|
|
691
|
+
esac
|
|
692
|
+
|
|
693
|
+
# Reached only after the forge confirmed the merge landed: set -e exits on a
|
|
694
|
+
# refused or failed merge above, and a queued forge merge exits without an
|
|
695
|
+
# outcome while its existing poll remains armed.
|
|
696
|
+
outcome_rc=0
|
|
697
|
+
fm_merge_outcome_report "$FM_HOME" "$STATE" "$ID" "$URL" self || outcome_rc=$?
|
|
698
|
+
case "$outcome_rc" in
|
|
699
|
+
0) ;;
|
|
700
|
+
3)
|
|
701
|
+
printf 'actionable: merged %s but could not report it upward: this home has no readable secondmate identity or parent binding (.fm-secondmate-home, .fm-secondmate-parent)\n' \
|
|
702
|
+
"$URL" >&2
|
|
703
|
+
;;
|
|
704
|
+
*)
|
|
705
|
+
printf 'actionable: merged %s but could not record the outcome for supervision\n' "$URL" >&2
|
|
706
|
+
;;
|
|
707
|
+
esac
|