@zerwiz/ymir 0.1.4 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/README.md +74 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +360 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +11 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +121 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +159 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +736 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +539 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +101 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +180 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +503 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +90 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +57 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +35 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/install.md +69 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +498 -0
- package/CHANGELOG.md +1913 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +114 -60
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +97 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +108 -0
- package/RULES/07-config.md +101 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/09-electron.md +58 -0
- package/RULES/README.md +22 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +133 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +256 -0
- package/bin/apodex-smoke-test.sh +105 -0
- package/bin/bifrost-bridge.sh +131 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +112 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +51 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-assemble.sh +154 -0
- package/bin/changelog-guard.sh +197 -0
- package/bin/crash-sense.sh +173 -0
- package/bin/design-check.sh +80 -0
- package/bin/design-icon.sh +153 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +225 -0
- package/bin/eindri-acclaim.sh +47 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seat.sh +83 -0
- package/bin/eindri-seen.sh +54 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +98 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +158 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/feature-inventory.sh +73 -0
- package/bin/fleet-apply.sh +81 -0
- package/bin/github-deploy.sh +94 -0
- package/bin/gjallarhorn-expose.sh +136 -0
- package/bin/gjallarhorn-notify.sh +71 -0
- package/bin/gjallarhorn-purge.sh +67 -0
- package/bin/gjallarhorn-tunnel.sh +85 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +130 -0
- package/bin/hall-snapshot.sh +111 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +452 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hlidskjalf-agents.sh +172 -0
- package/bin/hlidskjalf-usage.sh +196 -0
- package/bin/hoard-guard.sh +135 -0
- package/bin/hoard-lib.sh +105 -0
- package/bin/hodd.sh +102 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +121 -0
- package/bin/local-model-lock.sh +70 -0
- package/bin/mimir-bridge.py +259 -0
- package/bin/mimir-bridge.sh +100 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir-reflect.sh +27 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +72 -0
- package/bin/mjollnir.sh +104 -0
- package/bin/model-hardware.sh +96 -0
- package/bin/model-resolve.sh +160 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-hall-snapshot.sh +28 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-nsr-compliance.sh +54 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/npm-publish.sh +136 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +161 -0
- package/bin/omarchy-plugins.sh +187 -0
- package/bin/omarchy-sense.sh +162 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-model-agnostic.sh +71 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +58 -0
- package/bin/project-git.sh +69 -0
- package/bin/public-guard.sh +71 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +104 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +94 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +89 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-spawn-pretool-check.sh +58 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +203 -0
- package/bin/telegram-bot.sh +82 -0
- package/bin/toolchain.sh +74 -0
- package/bin/ui-truth-check.sh +75 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +298 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +60 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +163 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +806 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-plan.sh +356 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +110 -0
- package/bin/ymir-setup-auth.sh +119 -0
- package/bin/ymir-validate.sh +193 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1060 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +54 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +269 -0
- package/scripts/lower.sh +34 -0
- package/scripts/raise.sh +42 -0
- package/scripts/start.sh +217 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Watcher liveness and worktree-tangle guard, called by supervision scripts, by
|
|
3
|
+
# fm-wake-drain.sh after it empties queued wakes, and by fm-session-start.sh in
|
|
4
|
+
# read-only advisory mode whenever session-lock ownership was not verified.
|
|
5
|
+
# First, always warn if the firstmate primary checkout (FM_ROOT) is on a named
|
|
6
|
+
# non-default branch, because that means firstmate-on-itself work landed in the
|
|
7
|
+
# primary instead of an isolated worktree.
|
|
8
|
+
# Then, if a task is in flight (a state/<id>.meta exists) or X-mode relay
|
|
9
|
+
# polling is active (state/x-watch.check.sh exists) and supervision is not
|
|
10
|
+
# healthy, prints a loud, clearly delimited banner so the agent cannot skim past
|
|
11
|
+
# it in the tool output of whatever it was doing - the one channel every harness
|
|
12
|
+
# has. Supervision health is MODEL-AWARE (fm_watcher_supervision_verdict in
|
|
13
|
+
# bin/fm-wake-lib.sh): under the Claude Stop auto-arm model the watcher runs only
|
|
14
|
+
# between turns, so mid-turn a fresh beacon with no live watcher is healthy and
|
|
15
|
+
# only a stale beacon (beyond FM_GUARD_GRACE) is a genuine lapse; under the Pi
|
|
16
|
+
# extension model the extension tears the watcher down and respawns it on every
|
|
17
|
+
# actionable wake, so a fresh beacon with a genuinely unheld lock is healthy
|
|
18
|
+
# while that live Pi session provably owns continuity; any held but unhealthy
|
|
19
|
+
# lock is down; under every
|
|
20
|
+
# persistent-watcher harness a live identity-matched watcher with a fresh beacon
|
|
21
|
+
# is required. The banner names the true failing condition (a missing live
|
|
22
|
+
# watcher process vs a genuinely stale beacon). The full banner is emitted once
|
|
23
|
+
# per distinct down-episode in this FM_HOME (keyed to the failing condition, not
|
|
24
|
+
# the beacon mtime, which a healthy between-turns watcher advances every poll);
|
|
25
|
+
# later guarded commands in the same episode print a one-line reminder instead.
|
|
26
|
+
# Episode state lives only under state/.guard-watcher-stale-banner (volatile,
|
|
27
|
+
# bounded). Independent alarms (queued wakes, worktree tangle) are never
|
|
28
|
+
# suppressed by that dedup. Normal wake handling (watcher briefly down between a
|
|
29
|
+
# wake and the next supervision resume) stays inside the grace window and stays
|
|
30
|
+
# silent. Always exits 0: the guard warns, it never blocks.
|
|
31
|
+
set -u
|
|
32
|
+
|
|
33
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
34
|
+
FM_ROOT="${FM_ROOT_OVERRIDE:-$(cd "$SCRIPT_DIR/.." && pwd)}"
|
|
35
|
+
FM_HOME="${FM_HOME:-${FM_ROOT_OVERRIDE:-$FM_ROOT}}"
|
|
36
|
+
STATE="${FM_STATE_OVERRIDE:-$FM_HOME/state}"
|
|
37
|
+
CONFIG="${FM_CONFIG_OVERRIDE:-$FM_HOME/config}"
|
|
38
|
+
WATCH="$SCRIPT_DIR/fm-watch.sh"
|
|
39
|
+
GRACE=${FM_GUARD_GRACE:-300}
|
|
40
|
+
queue_pending=false
|
|
41
|
+
READ_ONLY=${FM_GUARD_READ_ONLY:-0}
|
|
42
|
+
case "$READ_ONLY" in 1|true|TRUE|yes|YES) READ_ONLY=1 ;; *) READ_ONLY=0 ;; esac
|
|
43
|
+
CONTINUE_LINE=${FM_GUARD_CONTINUE_LINE:-This is a supervision warning only; the guarded operation WILL still run.}
|
|
44
|
+
|
|
45
|
+
# Volatile, home-scoped episode marker: one line = the current stale-episode key.
|
|
46
|
+
# Cleared when the home leaves the unhealthy state so a later episode re-arms.
|
|
47
|
+
STALE_BANNER_MARKER="$STATE/.guard-watcher-stale-banner"
|
|
48
|
+
|
|
49
|
+
# shellcheck source=bin/fm-wake-lib.sh
|
|
50
|
+
. "$SCRIPT_DIR/fm-wake-lib.sh"
|
|
51
|
+
# shellcheck source=bin/fm-tangle-lib.sh
|
|
52
|
+
. "$SCRIPT_DIR/fm-tangle-lib.sh"
|
|
53
|
+
# shellcheck source=bin/fm-supervision-lib.sh
|
|
54
|
+
. "$SCRIPT_DIR/fm-supervision-lib.sh"
|
|
55
|
+
|
|
56
|
+
# Deterministic episode key from the qualitative down-state (the failing
|
|
57
|
+
# condition), NOT the beacon mtime: under the auto-arm model a healthy
|
|
58
|
+
# between-turns watcher advances that mtime every poll, which made the "same
|
|
59
|
+
# episode" key change every turn and re-print the full banner. Keying on the
|
|
60
|
+
# failing condition keeps one continuous down-episode stable, while positive
|
|
61
|
+
# recovery clears the marker (below) and re-arms the next episode.
|
|
62
|
+
fm_guard_stale_episode_key() {
|
|
63
|
+
printf '%s\n' "$1"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# Claim the full banner for this episode. Exit 0 = print full banner (this call
|
|
67
|
+
# owns the first announcement). Exit 1 = same episode already announced (print
|
|
68
|
+
# reminder). The shared wake lock helper owns the race-safety mechanics; the
|
|
69
|
+
# re-check under the lock makes concurrent claims idempotent.
|
|
70
|
+
fm_guard_claim_stale_banner() {
|
|
71
|
+
local state=$1 key=$2
|
|
72
|
+
local marker="$state/.guard-watcher-stale-banner"
|
|
73
|
+
local lock="$state/.guard-watcher-stale-banner.lock"
|
|
74
|
+
local seen i
|
|
75
|
+
|
|
76
|
+
seen=$(cat "$marker" 2>/dev/null || true)
|
|
77
|
+
# Strip a single trailing newline so key comparison is line-content based.
|
|
78
|
+
seen=${seen%$'\n'}
|
|
79
|
+
if [ "$seen" = "$key" ]; then
|
|
80
|
+
return 1
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
i=0
|
|
84
|
+
while [ "$i" -lt 50 ]; do
|
|
85
|
+
if fm_lock_try_acquire "$lock"; then
|
|
86
|
+
seen=$(cat "$marker" 2>/dev/null || true)
|
|
87
|
+
seen=${seen%$'\n'}
|
|
88
|
+
if [ "$seen" = "$key" ]; then
|
|
89
|
+
fm_lock_release "$lock" 2>/dev/null || true
|
|
90
|
+
return 1
|
|
91
|
+
fi
|
|
92
|
+
# Bounded write: one line, no growth across episodes (overwrite).
|
|
93
|
+
printf '%s\n' "$key" > "$marker" || true
|
|
94
|
+
fm_lock_release "$lock" 2>/dev/null || true
|
|
95
|
+
return 0
|
|
96
|
+
fi
|
|
97
|
+
seen=$(cat "$marker" 2>/dev/null || true)
|
|
98
|
+
seen=${seen%$'\n'}
|
|
99
|
+
if [ "$seen" = "$key" ]; then
|
|
100
|
+
return 1
|
|
101
|
+
fi
|
|
102
|
+
# Brief yield; 0.02s is fine on macOS/Linux sleep, fall back to 1s.
|
|
103
|
+
sleep 0.02 2>/dev/null || sleep 1
|
|
104
|
+
i=$((i + 1))
|
|
105
|
+
done
|
|
106
|
+
# Contended past the spin budget: stay loud rather than dropping the alarm.
|
|
107
|
+
return 0
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
fm_guard_stale_banner_seen() {
|
|
111
|
+
local state=$1 key=$2
|
|
112
|
+
local marker="$state/.guard-watcher-stale-banner"
|
|
113
|
+
local seen
|
|
114
|
+
|
|
115
|
+
seen=$(cat "$marker" 2>/dev/null || true)
|
|
116
|
+
seen=${seen%$'\n'}
|
|
117
|
+
[ "$seen" = "$key" ]
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
fm_guard_clear_stale_banner() {
|
|
121
|
+
rm -f "$STALE_BANNER_MARKER" 2>/dev/null || true
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
# Worktree-tangle alarm, checked FIRST and independent of in-flight tasks: the
|
|
125
|
+
# firstmate PRIMARY checkout (FM_ROOT) must stay on its default branch. If a
|
|
126
|
+
# crewmate's branch/commits landed here instead of in its own isolated worktree,
|
|
127
|
+
# the primary is stranded on a feature branch - surface it loudly on the very next
|
|
128
|
+
# fleet action, the same way the watcher-down banner does. Scoped to the primary
|
|
129
|
+
# only: detached HEAD (linked worktrees, secondmate homes) never trips this.
|
|
130
|
+
tangle_branch=$(fm_primary_tangle_branch "$FM_ROOT" || true)
|
|
131
|
+
if [ -n "$tangle_branch" ]; then
|
|
132
|
+
tangle_default=$(fm_default_branch "$FM_ROOT" 2>/dev/null || echo main)
|
|
133
|
+
trule='━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'
|
|
134
|
+
{
|
|
135
|
+
printf '●%s\n' "$trule"
|
|
136
|
+
printf '● WORKTREE TANGLE - PRIMARY CHECKOUT IS ON A FEATURE BRANCH\n'
|
|
137
|
+
printf "● %s is on '%s', not its default branch '%s'.\n" "$FM_ROOT" "$tangle_branch" "$tangle_default"
|
|
138
|
+
printf '● A crewmate likely branched/committed in the primary instead of its own worktree.\n'
|
|
139
|
+
printf "● The work is SAFE on the '%s' ref.\n" "$tangle_branch"
|
|
140
|
+
if [ "$READ_ONLY" -eq 1 ]; then
|
|
141
|
+
printf '● This read-only session must leave restore work to a session with verified fleet-lock ownership.\n'
|
|
142
|
+
else
|
|
143
|
+
printf "● Restore the primary to '%s':\n" "$tangle_default"
|
|
144
|
+
printf '● git -C %s checkout %s\n' "$FM_ROOT" "$tangle_default"
|
|
145
|
+
printf "● then re-validate '%s' in a proper isolated worktree.\n" "$tangle_branch"
|
|
146
|
+
fi
|
|
147
|
+
printf '●%s\n' "$trule"
|
|
148
|
+
} >&2
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
# Compute supervision need and watcher-beacon freshness via the shared
|
|
152
|
+
# grace-based predicate (bin/fm-supervision-lib.sh). Act when work, an event
|
|
153
|
+
# source, or an X-mode relay poll needs supervision.
|
|
154
|
+
fm_supervision_status "$STATE" "$GRACE"
|
|
155
|
+
in_flight=$FM_SUP_IN_FLIGHT
|
|
156
|
+
sources=$FM_SUP_SOURCES
|
|
157
|
+
needed=$FM_SUP_NEEDED
|
|
158
|
+
beacon_desc=$FM_SUP_BEACON_DESC
|
|
159
|
+
fm_watcher_supervision_verdict "$STATE" "$WATCH" "$GRACE" "$FM_HOME" "$FM_ROOT"
|
|
160
|
+
watcher_healthy=$FM_WATCHER_VERDICT_OK
|
|
161
|
+
watcher_down_reason=$FM_WATCHER_VERDICT_REASON
|
|
162
|
+
if [ "$needed" = false ]; then
|
|
163
|
+
# Leave the unhealthy state (nothing riding on the watcher): clear so a later
|
|
164
|
+
# work or X-mode need + stale combination is a fresh episode even if the
|
|
165
|
+
# beacon is still absent with the same key string.
|
|
166
|
+
[ "$READ_ONLY" -eq 1 ] || fm_guard_clear_stale_banner
|
|
167
|
+
exit 0
|
|
168
|
+
fi
|
|
169
|
+
|
|
170
|
+
[ -s "$FM_WAKE_QUEUE" ] && queue_pending=true
|
|
171
|
+
|
|
172
|
+
# No fresh watcher with tasks in flight is the dangerous state: emit a prominent,
|
|
173
|
+
# bordered banner FIRST so it reads as an alarm, not a buried stderr line. Later
|
|
174
|
+
# calls in the same episode get a one-line reminder only.
|
|
175
|
+
if [ "$watcher_healthy" = false ]; then
|
|
176
|
+
episode_key=$(fm_guard_stale_episode_key "$watcher_down_reason")
|
|
177
|
+
episode_key=${episode_key%$'\n'}
|
|
178
|
+
print_full_banner=0
|
|
179
|
+
if [ "$READ_ONLY" -eq 1 ]; then
|
|
180
|
+
fm_guard_stale_banner_seen "$STATE" "$episode_key" || print_full_banner=1
|
|
181
|
+
elif fm_guard_claim_stale_banner "$STATE" "$episode_key"; then
|
|
182
|
+
print_full_banner=1
|
|
183
|
+
fi
|
|
184
|
+
if [ "$print_full_banner" -eq 1 ]; then
|
|
185
|
+
afk=0
|
|
186
|
+
[ -e "$STATE/.afk" ] && afk=1
|
|
187
|
+
queue_arg=0
|
|
188
|
+
"$queue_pending" && queue_arg=1
|
|
189
|
+
x_mode=0
|
|
190
|
+
[ -f "$CONFIG/x-mode.env" ] && x_mode=1
|
|
191
|
+
fix=$("$SCRIPT_DIR/fm-supervision-instructions.sh" \
|
|
192
|
+
--read-only "$READ_ONLY" \
|
|
193
|
+
--afk "$afk" \
|
|
194
|
+
--x-mode "$x_mode" \
|
|
195
|
+
--queue-pending "$queue_arg" \
|
|
196
|
+
--repair-line 2>/dev/null || printf '%s\n' 'Repair missing watcher supervision according to the session-start operating block.')
|
|
197
|
+
rule='━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'
|
|
198
|
+
{
|
|
199
|
+
printf '●%s\n' "$rule"
|
|
200
|
+
printf '● WATCHER DOWN - SUPERVISION IS OFF\n'
|
|
201
|
+
if [ "$watcher_down_reason" = no-watcher ]; then
|
|
202
|
+
watcher_cause=$(printf 'no live watcher process holds this home lock (last beat: %s)' "$beacon_desc")
|
|
203
|
+
else
|
|
204
|
+
watcher_cause=$(printf 'no watcher has a fresh beacon (last beat: %s, grace %ss)' "$beacon_desc" "$GRACE")
|
|
205
|
+
fi
|
|
206
|
+
if [ "$in_flight" -gt 0 ]; then
|
|
207
|
+
printf '● %s task(s) in flight, but %s.\n' "$in_flight" "$watcher_cause"
|
|
208
|
+
elif [ "$sources" -gt 0 ]; then
|
|
209
|
+
printf '● %s process-event source(s) registered, but %s.\n' "$sources" "$watcher_cause"
|
|
210
|
+
else
|
|
211
|
+
printf '● X-mode relay polling needs supervision, but %s.\n' "$watcher_cause"
|
|
212
|
+
fi
|
|
213
|
+
if [ "$READ_ONLY" -eq 1 ]; then
|
|
214
|
+
printf '● This read-only session should report the lapse, not repair it.\n'
|
|
215
|
+
else
|
|
216
|
+
printf '● Trust the emitted supervision protocol for this harness; do not use shell & for watcher repair.\n'
|
|
217
|
+
fi
|
|
218
|
+
printf '● %s\n' "$CONTINUE_LINE"
|
|
219
|
+
printf '● %s\n' "$fix"
|
|
220
|
+
printf '●%s\n' "$rule"
|
|
221
|
+
} >&2
|
|
222
|
+
else
|
|
223
|
+
printf 'WARNING: watcher still down (same stale episode; last beat: %s, grace %ss) - full banner already printed this episode.\n' \
|
|
224
|
+
"$beacon_desc" "$GRACE" >&2
|
|
225
|
+
fi
|
|
226
|
+
else
|
|
227
|
+
# Healthy again while work is still in flight: end the episode so a later
|
|
228
|
+
# restale re-prints the full banner.
|
|
229
|
+
[ "$READ_ONLY" -eq 1 ] || fm_guard_clear_stale_banner
|
|
230
|
+
fi
|
|
231
|
+
|
|
232
|
+
# Queued wakes are an independent hazard; warn whenever they are pending, even if
|
|
233
|
+
# a watcher is alive. Kept after the banner so the no-watcher alarm reads first.
|
|
234
|
+
# Dedup of the watcher-down banner never suppresses this warning.
|
|
235
|
+
if "$queue_pending"; then
|
|
236
|
+
if [ "$READ_ONLY" -eq 1 ]; then
|
|
237
|
+
echo "WARNING: queued wakes pending - left untouched because this session lacks verified fleet-lock ownership." >&2
|
|
238
|
+
else
|
|
239
|
+
echo "WARNING: queued wakes pending - drain them with bin/fm-wake-drain.sh before anything else." >&2
|
|
240
|
+
fi
|
|
241
|
+
fi
|
|
242
|
+
exit 0
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Detect the agent harness this process tree runs on.
|
|
3
|
+
# Usage: fm-harness.sh print own harness: claude|codex|opencode|pi|pi-signed|grok|kimi|cursor|muse|unknown
|
|
4
|
+
# fm-harness.sh crew print the effective CREWMATE harness
|
|
5
|
+
# (config/crew-harness; "default" resolves to own)
|
|
6
|
+
# fm-harness.sh secondmate print the harness the PRIMARY uses to launch
|
|
7
|
+
# SECONDMATE agents: config/secondmate-harness ->
|
|
8
|
+
# config/crew-harness -> own. "default" or absent
|
|
9
|
+
# defers to the crew resolution, so an unset
|
|
10
|
+
# secondmate-harness behaves exactly as the crew
|
|
11
|
+
# harness did before this knob existed.
|
|
12
|
+
# fm-harness.sh secondmate-model print the optional MODEL token from
|
|
13
|
+
# config/secondmate-harness, or empty when absent.
|
|
14
|
+
# fm-harness.sh secondmate-effort print the optional EFFORT token from
|
|
15
|
+
# config/secondmate-harness, or empty when absent.
|
|
16
|
+
# config/secondmate-harness format: a single line "<harness> [<model>] [<effort>]",
|
|
17
|
+
# whitespace-separated. A bare "<harness>" (today's format) behaves exactly as before:
|
|
18
|
+
# harness only, no model/effort. Only the first non-empty, non-comment line is parsed.
|
|
19
|
+
# Model/effort come ONLY from this file - config/crew-harness stays a bare adapter
|
|
20
|
+
# name and is never parsed for a model.
|
|
21
|
+
# Detection layers: verified environment markers first, then process ancestry.
|
|
22
|
+
# Record each newly verified env marker here.
|
|
23
|
+
set -u
|
|
24
|
+
|
|
25
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
26
|
+
FM_ROOT="${FM_ROOT_OVERRIDE:-$(cd "$SCRIPT_DIR/.." && pwd)}"
|
|
27
|
+
FM_HOME="${FM_HOME:-${FM_ROOT_OVERRIDE:-$FM_ROOT}}"
|
|
28
|
+
CONFIG="${FM_CONFIG_OVERRIDE:-$FM_HOME/config}"
|
|
29
|
+
|
|
30
|
+
# shellcheck source=bin/fm-cursor-lib.sh
|
|
31
|
+
. "$SCRIPT_DIR/fm-cursor-lib.sh"
|
|
32
|
+
|
|
33
|
+
detect_own() {
|
|
34
|
+
# Layer 1: environment markers for verified harnesses.
|
|
35
|
+
# Keep marker detection before ancestry detection as an explicit precedence rule.
|
|
36
|
+
# Claude, Pi, Grok, and Cursor set verified markers of their own; codex,
|
|
37
|
+
# opencode, Kimi, and Muse are markerless, so a foreign marker retained in a terminal
|
|
38
|
+
# multiplexer's stored environment can silently misidentify one of them before
|
|
39
|
+
# ancestry is consulted. This is a precedence hazard, not evidence that
|
|
40
|
+
# CLAUDECODE inheritance into a kimi child was observed; it was not observed.
|
|
41
|
+
# Cursor is checked BEFORE claude, deliberately. cursor-agent does NOT clear
|
|
42
|
+
# an inherited CLAUDECODE, so a cursor worker launched from a claude primary
|
|
43
|
+
# carries BOTH markers and whichever is tested first wins. Cursor's own
|
|
44
|
+
# markers are unambiguous when present, so ordering them first is what makes
|
|
45
|
+
# the verdict correct; bin/fm-spawn.sh additionally clears the foreign markers
|
|
46
|
+
# at the launch boundary. Both are kept: the launch sanitization only covers
|
|
47
|
+
# sessions fm-spawn started, while this ordering also covers a cursor session
|
|
48
|
+
# a human started by hand. Verified live on cursor-agent 2026.08.11-e8db854:
|
|
49
|
+
# CURSOR_INVOKED_AS=cursor-agent is set on the agent process itself, and
|
|
50
|
+
# CURSOR_AGENT=1 is set for the child/tool processes this script runs as.
|
|
51
|
+
[ "${CURSOR_AGENT:-}" = "1" ] && { echo cursor; return; }
|
|
52
|
+
[ "${CURSOR_INVOKED_AS:-}" = "cursor-agent" ] && { echo cursor; return; }
|
|
53
|
+
[ "${CLAUDECODE:-}" = "1" ] && { echo claude; return; }
|
|
54
|
+
if [ "${PI_CODING_AGENT:-}" = "true" ]; then
|
|
55
|
+
if [ "${FM_PI_HARNESS:-}" = pi-signed ]; then echo pi-signed; else echo pi; fi
|
|
56
|
+
return
|
|
57
|
+
fi
|
|
58
|
+
# grok set GROK_AGENT=1 for its child/tool processes (verified, grok 0.2.73).
|
|
59
|
+
# It does NOT set CLAUDECODE despite being Claude-Code-compatible, so the marker
|
|
60
|
+
# is unambiguous WHEN PRESENT - but it is not guaranteed present. A grok 1.0.0
|
|
61
|
+
# hook process carries GROK_HOOK_EVENT, GROK_HOOK_NAME, GROK_SESSION_ID, and
|
|
62
|
+
# GROK_WORKSPACE_ROOT with no GROK_AGENT at all (verified from the live process
|
|
63
|
+
# environment of a wedged grok 1.0.0 Stop hook, 2026-08-07). Treat this marker as
|
|
64
|
+
# a fast path only; the ancestry walk below is what actually guarantees grok is
|
|
65
|
+
# identified, and any rule that must be RELIABLE under grok has to test the hook
|
|
66
|
+
# markers too (see .claude/settings.json Stop entries, docs/turnend-guard.md).
|
|
67
|
+
[ "${GROK_AGENT:-}" = "1" ] && { echo grok; return; }
|
|
68
|
+
# muse (Muse Code) publishes no harness-identity marker of its own. The only
|
|
69
|
+
# MUSE_* variable it is documented to hand a child is MUSE_CURRENT_SESSION_LOG,
|
|
70
|
+
# a per-session log PATH rather than an identity, and its export to tool
|
|
71
|
+
# subprocesses is unverified (verified: muse 0.1.0-R708.1), so muse is detected
|
|
72
|
+
# by ancestry alone below. Do NOT promote MUSE_CURRENT_SESSION_LOG to a marker
|
|
73
|
+
# without verifying it reaches children AND that it cannot survive in a
|
|
74
|
+
# multiplexer's stored environment, which is the precedence hazard above.
|
|
75
|
+
# Layer 2: walk the parent chain and match the command name.
|
|
76
|
+
local pid=$$ comm args argv0
|
|
77
|
+
for _ in 1 2 3 4 5 6 7 8; do
|
|
78
|
+
comm=$(ps -o comm= -p "$pid" 2>/dev/null) || break
|
|
79
|
+
argv0=$(fm_cursor_argv0_for_pid "$pid" "$comm" 2>/dev/null || true)
|
|
80
|
+
if fm_cursor_process_matches "$comm" '' "$argv0"; then
|
|
81
|
+
echo cursor
|
|
82
|
+
return
|
|
83
|
+
fi
|
|
84
|
+
case "$(basename -- "$comm")" in
|
|
85
|
+
*claude*) echo claude; return ;;
|
|
86
|
+
*codex*) echo codex; return ;;
|
|
87
|
+
*opencode*) echo opencode; return ;;
|
|
88
|
+
*grok*) echo grok; return ;;
|
|
89
|
+
kimi) echo kimi; return ;;
|
|
90
|
+
# muse's installed launcher ~/.local/bin/muse execs ~/.local/bin/muse-bin-<version>
|
|
91
|
+
# (verified in the published launcher, muse 0.1.0-R708.1), so the live process
|
|
92
|
+
# name carries the version and CHANGES on every auto-update. Match the stable
|
|
93
|
+
# prefix rather than any exact name. Deliberately anchored, never *muse*, so
|
|
94
|
+
# unrelated commands (musescore, amuse) cannot be misread as this harness.
|
|
95
|
+
muse|muse-bin-*) echo muse; return ;;
|
|
96
|
+
pi-signed) echo pi; return ;;
|
|
97
|
+
pi) echo pi; return ;;
|
|
98
|
+
node*|python*)
|
|
99
|
+
# Bare interpreter: match the harness name in its script path.
|
|
100
|
+
args=$(ps -o args= -p "$pid" 2>/dev/null)
|
|
101
|
+
case "$args" in
|
|
102
|
+
*claude*) echo claude; return ;;
|
|
103
|
+
*codex*) echo codex; return ;;
|
|
104
|
+
*opencode*) echo opencode; return ;;
|
|
105
|
+
*grok*) echo grok; return ;;
|
|
106
|
+
*" pi "*|*/pi) echo pi; return ;;
|
|
107
|
+
esac ;;
|
|
108
|
+
esac
|
|
109
|
+
pid=$(ps -o ppid= -p "$pid" 2>/dev/null | tr -d ' ')
|
|
110
|
+
if [ -z "$pid" ] || [ "$pid" -le 1 ]; then
|
|
111
|
+
break
|
|
112
|
+
fi
|
|
113
|
+
done
|
|
114
|
+
echo unknown
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
# Resolve the effective crewmate harness: config/crew-harness (a bare adapter
|
|
118
|
+
# name) wins; absent or "default" mirrors firstmate's own harness.
|
|
119
|
+
resolve_crew() {
|
|
120
|
+
local crew=
|
|
121
|
+
[ -f "$CONFIG/crew-harness" ] && crew=$(tr -d '[:space:]' < "$CONFIG/crew-harness" || true)
|
|
122
|
+
if [ -z "$crew" ] || [ "$crew" = "default" ]; then detect_own; else echo "$crew"; fi
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# Print the first non-empty, non-comment line of config/secondmate-harness
|
|
126
|
+
# (leading/trailing whitespace trimmed), or nothing when the file is absent or
|
|
127
|
+
# holds only blank/comment lines.
|
|
128
|
+
secondmate_line() {
|
|
129
|
+
local line
|
|
130
|
+
[ -f "$CONFIG/secondmate-harness" ] || return 0
|
|
131
|
+
while IFS= read -r line || [ -n "$line" ]; do
|
|
132
|
+
line="${line#"${line%%[![:space:]]*}"}"
|
|
133
|
+
line="${line%"${line##*[![:space:]]}"}"
|
|
134
|
+
[ -n "$line" ] || continue
|
|
135
|
+
case "$line" in
|
|
136
|
+
'#'*) continue ;;
|
|
137
|
+
esac
|
|
138
|
+
printf '%s\n' "$line"
|
|
139
|
+
return 0
|
|
140
|
+
done < "$CONFIG/secondmate-harness"
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
# Print the 1-based whitespace-separated token (1=harness, 2=model, 3=effort) of
|
|
144
|
+
# the resolved secondmate_line, or nothing if the line or that field is absent.
|
|
145
|
+
secondmate_field() {
|
|
146
|
+
local idx=$1 line
|
|
147
|
+
line=$(secondmate_line)
|
|
148
|
+
[ -n "$line" ] || return 0
|
|
149
|
+
# shellcheck disable=SC2086 # deliberate word-splitting: tokenizing the line into fields
|
|
150
|
+
set -- $line
|
|
151
|
+
case "$idx" in
|
|
152
|
+
1) printf '%s\n' "${1:-}" ;;
|
|
153
|
+
2) printf '%s\n' "${2:-}" ;;
|
|
154
|
+
3) printf '%s\n' "${3:-}" ;;
|
|
155
|
+
esac
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Resolve the harness the PRIMARY uses to launch SECONDMATE agents: a fallback
|
|
159
|
+
# chain config/secondmate-harness -> config/crew-harness -> own. An absent or
|
|
160
|
+
# "default" secondmate-harness token defers to the crew resolution, so an unset
|
|
161
|
+
# secondmate-harness behaves exactly as before this knob existed (a secondmate
|
|
162
|
+
# launched on the crew harness). config/secondmate-harness is the PRIMARY's own
|
|
163
|
+
# setting and is never inherited downstream - secondmates do not spawn secondmates.
|
|
164
|
+
resolve_secondmate() {
|
|
165
|
+
local sm
|
|
166
|
+
sm=$(secondmate_field 1)
|
|
167
|
+
if [ -z "$sm" ] || [ "$sm" = "default" ]; then resolve_crew; else echo "$sm"; fi
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
# Print the optional model token (2nd field) from config/secondmate-harness, or
|
|
171
|
+
# empty when the harness token is absent/"default" (harness-only file, same as
|
|
172
|
+
# today) or when no model token is present.
|
|
173
|
+
resolve_secondmate_model() {
|
|
174
|
+
local sm
|
|
175
|
+
sm=$(secondmate_field 1)
|
|
176
|
+
[ -n "$sm" ] && [ "$sm" != "default" ] || return 0
|
|
177
|
+
secondmate_field 2
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
# Print the optional effort token (3rd field) from config/secondmate-harness,
|
|
181
|
+
# the same way.
|
|
182
|
+
resolve_secondmate_effort() {
|
|
183
|
+
local sm
|
|
184
|
+
sm=$(secondmate_field 1)
|
|
185
|
+
[ -n "$sm" ] && [ "$sm" != "default" ] || return 0
|
|
186
|
+
secondmate_field 3
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
case "${1:-}" in
|
|
190
|
+
crew) resolve_crew ;;
|
|
191
|
+
secondmate) resolve_secondmate ;;
|
|
192
|
+
secondmate-model) resolve_secondmate_model ;;
|
|
193
|
+
secondmate-effort) resolve_secondmate_effort ;;
|
|
194
|
+
*) detect_own ;;
|
|
195
|
+
esac
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-herdr-ci-cleanup.sh - bounded cleanup of CI-owned Herdr lab sessions.
|
|
3
|
+
#
|
|
4
|
+
# Snapshot the session list before the real-Herdr suite, then at job end only
|
|
5
|
+
# stop/delete sessions that:
|
|
6
|
+
# 1. match the guarded fm-lab-* name pattern,
|
|
7
|
+
# 2. were not present in the pre-suite snapshot (job-proven ownership),
|
|
8
|
+
# 3. report default:false on a fresh session list.
|
|
9
|
+
#
|
|
10
|
+
# Never touches the default session. Never adopts or force-deletes non-lab
|
|
11
|
+
# names. Missing herdr is a no-op (exit 0) so portable jobs can call this
|
|
12
|
+
# harmlessly; destructive failures for known lab leftovers exit non-zero.
|
|
13
|
+
#
|
|
14
|
+
# Usage:
|
|
15
|
+
# fm-herdr-ci-cleanup.sh snapshot <path>
|
|
16
|
+
# fm-herdr-ci-cleanup.sh teardown <snapshot-path>
|
|
17
|
+
set -eu
|
|
18
|
+
|
|
19
|
+
die() {
|
|
20
|
+
printf 'fm-herdr-ci-cleanup.sh: %s\n' "$*" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
log() {
|
|
25
|
+
printf 'fm-herdr-ci-cleanup.sh: %s\n' "$*" >&2
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
cmd=${1:-}
|
|
29
|
+
path=${2:-}
|
|
30
|
+
[ -n "$cmd" ] && [ -n "$path" ] || die "usage: fm-herdr-ci-cleanup.sh snapshot|teardown <path>"
|
|
31
|
+
|
|
32
|
+
if ! command -v herdr >/dev/null 2>&1; then
|
|
33
|
+
log "herdr not on PATH; nothing to $cmd"
|
|
34
|
+
exit 0
|
|
35
|
+
fi
|
|
36
|
+
command -v jq >/dev/null 2>&1 || die "jq is required"
|
|
37
|
+
|
|
38
|
+
list_sessions_json() {
|
|
39
|
+
herdr session list --json 2>/dev/null \
|
|
40
|
+
|| die "could not list Herdr sessions"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
is_lab_name() {
|
|
44
|
+
local name=$1
|
|
45
|
+
[[ "$name" =~ ^fm-lab-[a-zA-Z0-9][a-zA-Z0-9_-]*$ ]]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
case "$cmd" in
|
|
49
|
+
snapshot)
|
|
50
|
+
list_sessions_json | jq -c '[.sessions[]? | .name] | unique | sort' >"$path" \
|
|
51
|
+
|| die "failed to write session snapshot to $path"
|
|
52
|
+
log "wrote session snapshot to $path ($(jq -r 'length' "$path") names)"
|
|
53
|
+
;;
|
|
54
|
+
teardown)
|
|
55
|
+
[ -f "$path" ] || die "snapshot file not found: $path"
|
|
56
|
+
before=$(cat "$path")
|
|
57
|
+
after_json=$(list_sessions_json)
|
|
58
|
+
# Candidates: lab-named, default:false, not in the pre-suite snapshot.
|
|
59
|
+
candidates=$(printf '%s' "$after_json" | jq -r --argjson before "$before" '
|
|
60
|
+
.sessions[]?
|
|
61
|
+
| select(.default == false)
|
|
62
|
+
| select(.name | test("^fm-lab-[a-zA-Z0-9][a-zA-Z0-9_-]*$"))
|
|
63
|
+
| select((.name as $n | $before | index($n) | not))
|
|
64
|
+
| .name
|
|
65
|
+
')
|
|
66
|
+
failed=0
|
|
67
|
+
if [ -z "$candidates" ]; then
|
|
68
|
+
log "no job-owned fm-lab-* sessions to clean"
|
|
69
|
+
exit 0
|
|
70
|
+
fi
|
|
71
|
+
while IFS= read -r name; do
|
|
72
|
+
[ -n "$name" ] || continue
|
|
73
|
+
is_lab_name "$name" || {
|
|
74
|
+
log "refusing non-lab name from candidate set: $name"
|
|
75
|
+
failed=1
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
# Fresh refuse-default check immediately before each destructive call.
|
|
79
|
+
flag=$(herdr session list --json 2>/dev/null \
|
|
80
|
+
| jq -r --arg n "$name" '.sessions[]? | select(.name == $n) | .default' 2>/dev/null || true)
|
|
81
|
+
if [ "$flag" != "false" ]; then
|
|
82
|
+
log "refusing cleanup of '$name' (default=${flag:-<not found>})"
|
|
83
|
+
failed=1
|
|
84
|
+
continue
|
|
85
|
+
fi
|
|
86
|
+
log "stopping job-owned lab session $name"
|
|
87
|
+
herdr session stop "$name" --json >/dev/null 2>&1 || true
|
|
88
|
+
sleep 0.3
|
|
89
|
+
flag=$(herdr session list --json 2>/dev/null \
|
|
90
|
+
| jq -r --arg n "$name" '.sessions[]? | select(.name == $n) | .default' 2>/dev/null || true)
|
|
91
|
+
if [ "$flag" != "false" ]; then
|
|
92
|
+
log "refusing delete of '$name' after stop (default=${flag:-<not found>})"
|
|
93
|
+
failed=1
|
|
94
|
+
continue
|
|
95
|
+
fi
|
|
96
|
+
if herdr session delete "$name" --json >/dev/null 2>&1; then
|
|
97
|
+
log "deleted job-owned lab session $name"
|
|
98
|
+
else
|
|
99
|
+
# Already gone is success; still present is failure.
|
|
100
|
+
still=$(herdr session list --json 2>/dev/null \
|
|
101
|
+
| jq -r --arg n "$name" '.sessions[]? | select(.name == $n) | .name' 2>/dev/null || true)
|
|
102
|
+
if [ -n "$still" ]; then
|
|
103
|
+
log "failed to delete lab session $name"
|
|
104
|
+
failed=1
|
|
105
|
+
else
|
|
106
|
+
log "lab session $name already absent after stop"
|
|
107
|
+
fi
|
|
108
|
+
fi
|
|
109
|
+
done <<<"$candidates"
|
|
110
|
+
[ "$failed" -eq 0 ] || die "one or more job-owned lab sessions could not be cleaned"
|
|
111
|
+
;;
|
|
112
|
+
*)
|
|
113
|
+
die "unknown command: $cmd (use snapshot or teardown)"
|
|
114
|
+
;;
|
|
115
|
+
esac
|