@zerwiz/ymir 0.1.3 → 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 -39
- 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,432 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Turn-end guard for any firstmate PRIMARY session: the main home OR a
|
|
3
|
+
# secondmate's own home. A secondmate runs its own primary firstmate session and
|
|
4
|
+
# is guarded exactly like the main primary; only child crew/scout worktrees are
|
|
5
|
+
# exempt (see the scoping block below and docs/turnend-guard.md).
|
|
6
|
+
#
|
|
7
|
+
# fm-guard.sh (bin/fm-guard.sh) is pull-based: it only warns when some other
|
|
8
|
+
# supervision script happens to run. A primary session that ends a turn without
|
|
9
|
+
# resuming its harness supervision protocol, and then never runs another
|
|
10
|
+
# fleet-touching command itself, can sit blind for hours.
|
|
11
|
+
# This script is push-based: verified harness turn-end hooks invoke it every time
|
|
12
|
+
# the primary is about to end a turn.
|
|
13
|
+
# Claude and codex can block directly by preserving exit status 2 and stderr.
|
|
14
|
+
# OpenCode and pi adapters use the same predicate and force one bounded
|
|
15
|
+
# follow-up because their turn-end events are passive. Grok delegates native
|
|
16
|
+
# blocking when its running Stop payload advertises that capability, with one
|
|
17
|
+
# bounded resume fallback for payloads from pre-native processes. Cursor calls
|
|
18
|
+
# this guard back with --cursor from bin/fm-turnend-guard-cursor.sh and renders
|
|
19
|
+
# exit 2 as one bounded follow-up, because exit 2 is a silent no-op on Cursor's
|
|
20
|
+
# stop step; without that flag a Cursor-shaped payload is the Claude-settings
|
|
21
|
+
# duplicate Cursor also loads, and this guard stands down.
|
|
22
|
+
# See docs/turnend-guard.md for the per-harness mechanics, validation evidence,
|
|
23
|
+
# and fail-open tradeoffs.
|
|
24
|
+
#
|
|
25
|
+
# Ships with TRACKED harness hook files at the repo root, so this file is
|
|
26
|
+
# checked out into every worktree of this repo: the primary checkout, every
|
|
27
|
+
# secondmate home (treehouse-leased or git-cloned), and any crewmate/scout task
|
|
28
|
+
# worktree spawned to work on firstmate itself (the recursive "firstmate
|
|
29
|
+
# improving itself" case). A secondmate home runs its OWN primary firstmate
|
|
30
|
+
# session, so it must be guarded like the main primary; only child crew/scout
|
|
31
|
+
# worktrees are exempt. It must therefore scope itself at runtime to a real
|
|
32
|
+
# primary checkout - the main home or a genuinely marked secondmate home - and
|
|
33
|
+
# stay a silent, fast no-op inside child task worktrees.
|
|
34
|
+
#
|
|
35
|
+
# Loop-guard, codex/Grok (default) mode: never block twice in the same turn.
|
|
36
|
+
# Codex uses stop_hook_active and Grok uses stopHookActive; typed camel-case
|
|
37
|
+
# takes precedence when both spellings are present. A true value means the
|
|
38
|
+
# current stop attempt already follows a block, so this guard always allows it.
|
|
39
|
+
# Passive harness adapters provide their own one-follow-up guard before calling
|
|
40
|
+
# this script.
|
|
41
|
+
# That bounds those harnesses to at most one forced continuation per turn -
|
|
42
|
+
# never a wedged, un-endable session - while still nagging again on a later turn
|
|
43
|
+
# if the problem persists.
|
|
44
|
+
#
|
|
45
|
+
# Loop-guard, --claude mode (Stop-owned auto-arm cooperation): Claude Code
|
|
46
|
+
# marks EVERY stop after ANY stop-hook-driven continuation stop_hook_active=true,
|
|
47
|
+
# including turns started by the asyncRewake auto-arm, so the one-shot allow
|
|
48
|
+
# would re-open the exact blind window this guard exists to close
|
|
49
|
+
# (docs/turnend-guard.md records the 2026-07-21 incident). In --claude mode this
|
|
50
|
+
# guard ignores stop_hook_active and instead cooperates with the Stop-owned
|
|
51
|
+
# auto-arm (bin/fm-claude-stop-autoarm.sh), which fires on the same Stop event:
|
|
52
|
+
# 1. a live identity-matched watcher with a fresh beacon allows immediately;
|
|
53
|
+
# 2. otherwise wait briefly (FM_CLAUDE_AUTOARM_SYNC_WAIT_MS, default 800ms)
|
|
54
|
+
# for the auto-arm to claim this home (a live OPEN generation claim in the
|
|
55
|
+
# state/.claude-autoarm-epoch ledger - fm_autoarm_claim_open - or a legacy
|
|
56
|
+
# build's lock-holding claim under the legacy abandonment proof) or to
|
|
57
|
+
# record a fresh actionable exit-2 outcome
|
|
58
|
+
# (state/.claude-autoarm-epoch) for this event epoch - either proof allows
|
|
59
|
+
# without consuming a continuation, so one event epoch yields exactly one recovery turn;
|
|
60
|
+
# the first fresh exhausted-failure epoch preserves the bounded progression,
|
|
61
|
+
# while later fresh failed epochs consume it instead of resetting it;
|
|
62
|
+
# 3. only when neither materializes is the auto-arm genuinely absent: re-block
|
|
63
|
+
# with the repair banner, bounded to FM_CLAUDE_TURNEND_BLOCK_BUDGET
|
|
64
|
+
# (default 3) consecutive blocks per session - safely below Claude Code's
|
|
65
|
+
# hard 8-consecutive-block override - then allow one loud attended
|
|
66
|
+
# fail-open only for an already verified failure episode.
|
|
67
|
+
set -u
|
|
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
|
+
CONFIG="${FM_CONFIG_OVERRIDE:-$FM_HOME/config}"
|
|
74
|
+
GRACE=${FM_GUARD_GRACE:-300}
|
|
75
|
+
WATCH="$SCRIPT_DIR/fm-watch.sh"
|
|
76
|
+
CLAUDE_MODE=0
|
|
77
|
+
CURSOR_MODE=0
|
|
78
|
+
SYNC_WAIT_MS=${FM_CLAUDE_AUTOARM_SYNC_WAIT_MS:-800}
|
|
79
|
+
EPOCH_FRESH=${FM_CLAUDE_AUTOARM_EPOCH_FRESH:-15}
|
|
80
|
+
BLOCK_BUDGET=${FM_CLAUDE_TURNEND_BLOCK_BUDGET:-3}
|
|
81
|
+
case "$SYNC_WAIT_MS" in ''|*[!0-9]*) SYNC_WAIT_MS=800 ;; esac
|
|
82
|
+
case "$EPOCH_FRESH" in ''|*[!0-9]*|0) EPOCH_FRESH=15 ;; esac
|
|
83
|
+
case "$BLOCK_BUDGET" in ''|*[!0-9]*|0) BLOCK_BUDGET=3 ;; esac
|
|
84
|
+
|
|
85
|
+
for arg in "$@"; do
|
|
86
|
+
case "$arg" in
|
|
87
|
+
--claude) CLAUDE_MODE=1 ;;
|
|
88
|
+
--cursor) CURSOR_MODE=1 ;;
|
|
89
|
+
*) echo "usage: $(basename "$0") [--claude|--cursor]" >&2; exit 2 ;;
|
|
90
|
+
esac
|
|
91
|
+
done
|
|
92
|
+
|
|
93
|
+
# shellcheck source=bin/fm-supervision-lib.sh
|
|
94
|
+
. "$SCRIPT_DIR/fm-supervision-lib.sh"
|
|
95
|
+
# shellcheck source=bin/fm-primary-scope-lib.sh
|
|
96
|
+
. "$SCRIPT_DIR/fm-primary-scope-lib.sh"
|
|
97
|
+
# shellcheck source=bin/fm-hook-host-lib.sh
|
|
98
|
+
. "$SCRIPT_DIR/fm-hook-host-lib.sh"
|
|
99
|
+
|
|
100
|
+
# Read the whole turn-end hook payload once; never block on unreadable/absent
|
|
101
|
+
# stdin.
|
|
102
|
+
PAYLOAD=$(cat 2>/dev/null || true)
|
|
103
|
+
[ -n "$PAYLOAD" ] || exit 0
|
|
104
|
+
|
|
105
|
+
# jq is the repo's established JSON dependency (bin/fm-x-poll.sh uses the same
|
|
106
|
+
# "missing jq -> silent no-op" degrade). Without it we cannot safely read the
|
|
107
|
+
# loop-guard field, so we must never block - fail open, not noisy.
|
|
108
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
109
|
+
|
|
110
|
+
# A Cursor primary also loads the tracked Claude settings, and Cursor's own
|
|
111
|
+
# registration owns its turn boundary through bin/fm-turnend-guard-cursor.sh,
|
|
112
|
+
# which calls this guard back with --cursor. Without that flag a Cursor-delivered
|
|
113
|
+
# payload is the Claude-compatibility duplicate and must not create a second
|
|
114
|
+
# continuation path (docs/turnend-guard.md "Harness integrations").
|
|
115
|
+
if [ "$CURSOR_MODE" -eq 0 ] && fm_hook_payload_is_foreign_host "$PAYLOAD"; then
|
|
116
|
+
exit 0
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
STOP_HOOK_ACTIVE=$(printf '%s' "$PAYLOAD" | jq -r '
|
|
120
|
+
if type != "object" then error("payload")
|
|
121
|
+
elif has("stopHookActive") then
|
|
122
|
+
if ((.stopHookActive | type) == "boolean") then .stopHookActive else error("stopHookActive") end
|
|
123
|
+
elif has("stop_hook_active") then
|
|
124
|
+
if ((.stop_hook_active | type) == "boolean") then .stop_hook_active else error("stop_hook_active") end
|
|
125
|
+
else false
|
|
126
|
+
end
|
|
127
|
+
' 2>/dev/null) || exit 0
|
|
128
|
+
if [ "$CLAUDE_MODE" -eq 0 ] && [ "$STOP_HOOK_ACTIVE" = "true" ]; then
|
|
129
|
+
exit 0
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
# --- scope precisely to a PRIMARY checkout ----------------------------------
|
|
133
|
+
# A genuinely-marked secondmate home runs its OWN primary firstmate session, so
|
|
134
|
+
# force-INCLUDE it as a guarded primary whether treehouse leased it as a linked
|
|
135
|
+
# worktree (git-dir != git-common-dir) or it is a git-cloned plain checkout. This
|
|
136
|
+
# mirrors the cd-guard's intent that a secondmate's own session is a guarded
|
|
137
|
+
# primary. Only an UNMARKED checkout (or one with an invalid marker) falls
|
|
138
|
+
# through to the linked-worktree exemption: firstmate hands out crewmate/scout
|
|
139
|
+
# task worktrees as genuine linked `git worktree`s (bin/fm-spawn.sh aborts
|
|
140
|
+
# otherwise), whose git-dir lives under the parent repo's .git/worktrees/<name>
|
|
141
|
+
# and differs from the common (shared) git-dir, while a main, non-worktree
|
|
142
|
+
# checkout has the two equal. Child worktrees never carry the gitignored marker,
|
|
143
|
+
# so this exempts them while guarding every real secondmate home.
|
|
144
|
+
fm_primary_scope_matches "$FM_ROOT" "$STATE" || exit 0
|
|
145
|
+
|
|
146
|
+
# --- the actual predicate ----------------------------------------------------
|
|
147
|
+
# shellcheck source=bin/fm-wake-lib.sh
|
|
148
|
+
. "$SCRIPT_DIR/fm-wake-lib.sh"
|
|
149
|
+
|
|
150
|
+
BUDGET_FILE="$STATE/.turnend-claude-blocks"
|
|
151
|
+
BUDGET_LOCK="$STATE/.turnend-claude-blocks.lock"
|
|
152
|
+
OWNER_LOCK="$STATE/.claude-autoarm.lock"
|
|
153
|
+
FAILURE_NOTICE="$STATE/.claude-autoarm-failure-notified"
|
|
154
|
+
FAILURE_ALARM="$STATE/.claude-autoarm-failure-alarmed"
|
|
155
|
+
SESSION_ID=$(printf '%s' "$PAYLOAD" | jq -r '.session_id // "unknown"' 2>/dev/null || printf 'unknown')
|
|
156
|
+
budget_reset() {
|
|
157
|
+
[ "$CLAUDE_MODE" -eq 1 ] || return 0
|
|
158
|
+
fm_lock_try_acquire "$BUDGET_LOCK" || return 0
|
|
159
|
+
rm -f "$BUDGET_FILE" 2>/dev/null || true
|
|
160
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
fm_supervision_status "$STATE" "$GRACE"
|
|
164
|
+
if [ "$FM_SUP_NEEDED" = false ]; then
|
|
165
|
+
[ -e "$FAILURE_NOTICE" ] || budget_reset
|
|
166
|
+
exit 0
|
|
167
|
+
fi
|
|
168
|
+
if fm_watcher_healthy "$STATE" "$WATCH" "$GRACE" "$FM_HOME"; then
|
|
169
|
+
[ "$CLAUDE_MODE" -eq 1 ] || exit 0
|
|
170
|
+
fm_failure_episode_reset "$STATE" && exit 0
|
|
171
|
+
exit 2
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
block_stop() {
|
|
175
|
+
local afk x_mode reason rule
|
|
176
|
+
afk=0
|
|
177
|
+
[ -e "$STATE/.afk" ] && afk=1
|
|
178
|
+
x_mode=0
|
|
179
|
+
[ -f "$CONFIG/x-mode.env" ] && x_mode=1
|
|
180
|
+
reason=$("$SCRIPT_DIR/fm-supervision-instructions.sh" --afk "$afk" --x-mode "$x_mode" --repair-line 2>/dev/null \
|
|
181
|
+
|| printf '%s\n' 'tasks in flight, no live watcher - repair missing watcher supervision according to the session-start operating block before ending the turn')
|
|
182
|
+
rule='━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'
|
|
183
|
+
{
|
|
184
|
+
printf '●%s\n' "$rule"
|
|
185
|
+
printf '● TURN WOULD END BLIND - SUPERVISION IS OFF\n'
|
|
186
|
+
if [ "$FM_SUP_IN_FLIGHT" -gt 0 ]; then
|
|
187
|
+
printf '● %s task(s) in flight, but no live watcher holds this home lock (last beat: %s).\n' "$FM_SUP_IN_FLIGHT" "$FM_SUP_BEACON_DESC"
|
|
188
|
+
elif [ "$FM_SUP_SOURCES" -gt 0 ]; then
|
|
189
|
+
printf '● %s process-event source(s) registered, but no live watcher holds this home lock (last beat: %s).\n' "$FM_SUP_SOURCES" "$FM_SUP_BEACON_DESC"
|
|
190
|
+
else
|
|
191
|
+
printf '● X-mode relay polling needs supervision, but no live watcher holds this home lock (last beat: %s).\n' "$FM_SUP_BEACON_DESC"
|
|
192
|
+
fi
|
|
193
|
+
if [ "$CLAUDE_MODE" -eq 1 ]; then
|
|
194
|
+
printf '● The Stop-owned auto-arm did not claim this home either, so recovery is NOT already under way.\n'
|
|
195
|
+
fi
|
|
196
|
+
printf '● %s\n' "$reason"
|
|
197
|
+
printf '●%s\n' "$rule"
|
|
198
|
+
} >&2
|
|
199
|
+
exit 2
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if [ "$CLAUDE_MODE" -eq 0 ]; then
|
|
203
|
+
block_stop
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
# --- --claude cooperative path -----------------------------------------------
|
|
207
|
+
# The Stop-owned auto-arm fires on the same Stop event. Give it a brief bounded
|
|
208
|
+
# window to prove it owns recovery for this event epoch before consuming one of
|
|
209
|
+
# Claude's bounded continuations.
|
|
210
|
+
budget_account_current_epoch() {
|
|
211
|
+
local current_epoch outcome old_session old_count old_epoch tmp initialized
|
|
212
|
+
fm_lock_try_acquire "$BUDGET_LOCK" || return 1
|
|
213
|
+
current_epoch=$(sed -n '1s/^epoch=\([0-9][0-9]*\) .*/\1/p' "$STATE/.claude-autoarm-epoch" 2>/dev/null || true)
|
|
214
|
+
outcome=$(sed -n '1s/^.*outcome=\([a-z][a-z-]*\) .*$/\1/p' "$STATE/.claude-autoarm-epoch" 2>/dev/null || true)
|
|
215
|
+
initialized=0
|
|
216
|
+
COUNT=0
|
|
217
|
+
if [ -f "$BUDGET_FILE" ]; then
|
|
218
|
+
old_session=$(sed -n '1s/^session=//p' "$BUDGET_FILE" 2>/dev/null || true)
|
|
219
|
+
old_count=$(sed -n '2s/^count=//p' "$BUDGET_FILE" 2>/dev/null || true)
|
|
220
|
+
old_epoch=$(sed -n '3s/^epoch=//p' "$BUDGET_FILE" 2>/dev/null || true)
|
|
221
|
+
case "$old_count" in
|
|
222
|
+
''|*[!0-9]*) old_count=0 ;;
|
|
223
|
+
esac
|
|
224
|
+
if [ "$old_session" = "$SESSION_ID" ]; then
|
|
225
|
+
COUNT=$old_count
|
|
226
|
+
if [ -n "$current_epoch" ] && [ "$old_epoch" = "$current_epoch" ]; then
|
|
227
|
+
:
|
|
228
|
+
else
|
|
229
|
+
COUNT=$((COUNT + 1))
|
|
230
|
+
fi
|
|
231
|
+
fi
|
|
232
|
+
fi
|
|
233
|
+
if [ ! -f "$BUDGET_FILE" ] || [ "${old_session:-}" != "$SESSION_ID" ]; then
|
|
234
|
+
case "$outcome" in
|
|
235
|
+
failed|failed-suppressed)
|
|
236
|
+
if [ -e "$FAILURE_NOTICE" ]; then
|
|
237
|
+
initialized=1
|
|
238
|
+
COUNT=0
|
|
239
|
+
else
|
|
240
|
+
COUNT=1
|
|
241
|
+
fi
|
|
242
|
+
;;
|
|
243
|
+
*) COUNT=1 ;;
|
|
244
|
+
esac
|
|
245
|
+
fi
|
|
246
|
+
tmp="$BUDGET_FILE.tmp.$$"
|
|
247
|
+
if ! printf 'session=%s\ncount=%s\nepoch=%s\n' "$SESSION_ID" "$COUNT" "$current_epoch" > "$tmp" 2>/dev/null \
|
|
248
|
+
|| ! mv -f "$tmp" "$BUDGET_FILE" 2>/dev/null; then
|
|
249
|
+
rm -f "$tmp" 2>/dev/null || true
|
|
250
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
251
|
+
return 1
|
|
252
|
+
fi
|
|
253
|
+
rm -f "$tmp" 2>/dev/null || true
|
|
254
|
+
BUDGET_INITIALIZED_FAILURE=$initialized
|
|
255
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
256
|
+
return 0
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
autoarm_owns_recovery() {
|
|
260
|
+
local pid role outcome age
|
|
261
|
+
fm_watcher_healthy "$STATE" "$WATCH" "$GRACE" "$FM_HOME" && return 0
|
|
262
|
+
# A live OPEN generation claim owns recovery: the ledger names a live,
|
|
263
|
+
# identity-matched owner still arming that is not stuck (fm_autoarm_claim_open
|
|
264
|
+
# in bin/fm-wake-lib.sh owns that predicate). A finished, dead,
|
|
265
|
+
# identity-mismatched, or stuck claim deliberately fails it and falls
|
|
266
|
+
# through, because treating such a claim as ownership is what let a dead
|
|
267
|
+
# watcher go unnoticed for turn after turn; the outcome cases below still
|
|
268
|
+
# cover a claim that finished moments ago, so a genuine handoff is not
|
|
269
|
+
# duplicated, while a stale one now reaches the block.
|
|
270
|
+
if fm_autoarm_claim_open "$STATE" "$GRACE"; then
|
|
271
|
+
[ ! -e "$FAILURE_NOTICE" ] || budget_account_current_epoch || true
|
|
272
|
+
return 0
|
|
273
|
+
fi
|
|
274
|
+
# Legacy shim: a pre-generation build's claim holds the owner lock with the
|
|
275
|
+
# autoarm role for its whole cycle; defer to it under the legacy abandonment
|
|
276
|
+
# proof so an upgrade mid-session cannot double-arm.
|
|
277
|
+
pid=$(cat "$OWNER_LOCK/pid" 2>/dev/null || true)
|
|
278
|
+
role=$(fm_lock_role "$OWNER_LOCK" 2>/dev/null || true)
|
|
279
|
+
if fm_pid_alive "$pid" && [ "$role" = autoarm ] \
|
|
280
|
+
&& ! fm_autoarm_claim_abandoned "$STATE" "$GRACE"; then
|
|
281
|
+
[ ! -e "$FAILURE_NOTICE" ] || budget_account_current_epoch || true
|
|
282
|
+
return 0
|
|
283
|
+
fi
|
|
284
|
+
outcome=$(sed -n '1s/^.*outcome=\([a-z][a-z-]*\) .*$/\1/p' "$STATE/.claude-autoarm-epoch" 2>/dev/null || true)
|
|
285
|
+
case "$outcome" in
|
|
286
|
+
rewake)
|
|
287
|
+
age=$(fm_path_age "$STATE/.claude-autoarm-epoch")
|
|
288
|
+
if [ "$age" -lt "$EPOCH_FRESH" ]; then
|
|
289
|
+
[ ! -e "$FAILURE_NOTICE" ] || budget_account_current_epoch || true
|
|
290
|
+
return 0
|
|
291
|
+
fi
|
|
292
|
+
;;
|
|
293
|
+
failed)
|
|
294
|
+
age=$(fm_path_age "$STATE/.claude-autoarm-epoch")
|
|
295
|
+
if [ "$age" -lt "$EPOCH_FRESH" ] && [ -e "$FAILURE_NOTICE" ] \
|
|
296
|
+
&& budget_account_current_epoch; then
|
|
297
|
+
[ "$BUDGET_INITIALIZED_FAILURE" -eq 1 ] && return 0
|
|
298
|
+
fi
|
|
299
|
+
;;
|
|
300
|
+
failed-suppressed)
|
|
301
|
+
age=$(fm_path_age "$STATE/.claude-autoarm-epoch")
|
|
302
|
+
if [ "$age" -lt "$EPOCH_FRESH" ] && [ -e "$FAILURE_NOTICE" ] \
|
|
303
|
+
&& budget_account_current_epoch; then
|
|
304
|
+
:
|
|
305
|
+
fi
|
|
306
|
+
;;
|
|
307
|
+
esac
|
|
308
|
+
return 1
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
terminal_fail_open() {
|
|
312
|
+
local pid role old_session old_count
|
|
313
|
+
[ "$COUNT" -gt "$BLOCK_BUDGET" ] || return 1
|
|
314
|
+
failure_episode_verified || return 1
|
|
315
|
+
[ ! -e "$FAILURE_ALARM" ] || return 1
|
|
316
|
+
# A live open generation claim is a concurrent recovery decision to step
|
|
317
|
+
# aside for, exactly like the legacy live-owner case below.
|
|
318
|
+
fm_autoarm_claim_open "$STATE" "$GRACE" && return 2
|
|
319
|
+
if ! fm_lock_try_acquire "$OWNER_LOCK"; then
|
|
320
|
+
pid=$(cat "$OWNER_LOCK/pid" 2>/dev/null || true)
|
|
321
|
+
role=$(fm_lock_role "$OWNER_LOCK" 2>/dev/null || true)
|
|
322
|
+
# Same legacy abandonment test as autoarm_owns_recovery: a claim whose
|
|
323
|
+
# ledger entry is already terminal, or whose recorded pid-identity no
|
|
324
|
+
# longer matches the live pid, is not a concurrent owner to step aside
|
|
325
|
+
# for. Stepping aside for one here allows the stop silently, and the
|
|
326
|
+
# episode's one attended alarm would never fire, so clear the abandoned
|
|
327
|
+
# claim and let this decision finish instead. Failing to clear it
|
|
328
|
+
# re-blocks rather than allowing.
|
|
329
|
+
if fm_pid_alive "$pid" && [ "$role" = autoarm ] \
|
|
330
|
+
&& ! fm_autoarm_claim_abandoned "$STATE" "$GRACE"; then
|
|
331
|
+
return 2
|
|
332
|
+
fi
|
|
333
|
+
fm_autoarm_release_abandoned "$STATE" "$GRACE" || return 1
|
|
334
|
+
fm_lock_try_acquire "$OWNER_LOCK" || return 1
|
|
335
|
+
fi
|
|
336
|
+
if ! fm_lock_set_role "$OWNER_LOCK" terminal-check; then
|
|
337
|
+
fm_lock_release "$OWNER_LOCK"
|
|
338
|
+
return 1
|
|
339
|
+
fi
|
|
340
|
+
if ! fm_lock_try_acquire "$BUDGET_LOCK"; then
|
|
341
|
+
fm_lock_release "$OWNER_LOCK"
|
|
342
|
+
return 1
|
|
343
|
+
fi
|
|
344
|
+
old_session=$(sed -n '1s/^session=//p' "$BUDGET_FILE" 2>/dev/null || true)
|
|
345
|
+
old_count=$(sed -n '2s/^count=//p' "$BUDGET_FILE" 2>/dev/null || true)
|
|
346
|
+
case "$old_count" in
|
|
347
|
+
''|*[!0-9]*) old_count=0 ;;
|
|
348
|
+
esac
|
|
349
|
+
role=$(fm_lock_role "$OWNER_LOCK" 2>/dev/null || true)
|
|
350
|
+
if [ "$role" != terminal-check ] || [ "$old_session" != "$SESSION_ID" ] \
|
|
351
|
+
|| [ "$old_count" -le "$BLOCK_BUDGET" ] || ! failure_episode_verified \
|
|
352
|
+
|| [ -e "$FAILURE_ALARM" ]; then
|
|
353
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
354
|
+
fm_lock_release "$OWNER_LOCK"
|
|
355
|
+
return 1
|
|
356
|
+
fi
|
|
357
|
+
if fm_watcher_healthy "$STATE" "$WATCH" "$GRACE" "$FM_HOME"; then
|
|
358
|
+
if ! fm_failure_episode_reset "$STATE" held; then
|
|
359
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
360
|
+
fm_lock_release "$OWNER_LOCK"
|
|
361
|
+
return 1
|
|
362
|
+
fi
|
|
363
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
364
|
+
fm_lock_release "$OWNER_LOCK"
|
|
365
|
+
return 2
|
|
366
|
+
fi
|
|
367
|
+
# Re-check for a live open generation claim now that both locks are held: a
|
|
368
|
+
# claimant that published "arming" between the pre-check above and the lock
|
|
369
|
+
# acquisition is active recovery, and alarming over it would fire the
|
|
370
|
+
# episode's one attended fail-open while a continuation is under way.
|
|
371
|
+
if fm_autoarm_claim_open "$STATE" "$GRACE"; then
|
|
372
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
373
|
+
fm_lock_release "$OWNER_LOCK"
|
|
374
|
+
return 2
|
|
375
|
+
fi
|
|
376
|
+
if ! (set -C; : > "$FAILURE_ALARM") 2>/dev/null; then
|
|
377
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
378
|
+
fm_lock_release "$OWNER_LOCK"
|
|
379
|
+
return 1
|
|
380
|
+
fi
|
|
381
|
+
fm_lock_release "$BUDGET_LOCK"
|
|
382
|
+
fm_lock_release "$OWNER_LOCK"
|
|
383
|
+
return 0
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
failure_episode_verified() {
|
|
387
|
+
local outcome
|
|
388
|
+
[ ! -e "$STATE/.afk" ] || return 1
|
|
389
|
+
[ -e "$FAILURE_NOTICE" ] || return 1
|
|
390
|
+
outcome=$(sed -n '1s/^.*outcome=\([a-z][a-z-]*\) .*$/\1/p' "$STATE/.claude-autoarm-epoch" 2>/dev/null || true)
|
|
391
|
+
case "$outcome" in
|
|
392
|
+
failed|failed-suppressed) return 0 ;;
|
|
393
|
+
*) return 1 ;;
|
|
394
|
+
esac
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
i=0
|
|
398
|
+
while [ "$i" -lt $((SYNC_WAIT_MS / 100)) ]; do
|
|
399
|
+
if autoarm_owns_recovery; then
|
|
400
|
+
if fm_watcher_healthy "$STATE" "$WATCH" "$GRACE" "$FM_HOME"; then
|
|
401
|
+
fm_failure_episode_reset "$STATE" || exit 2
|
|
402
|
+
fi
|
|
403
|
+
exit 0
|
|
404
|
+
fi
|
|
405
|
+
sleep 0.1
|
|
406
|
+
i=$((i + 1))
|
|
407
|
+
done
|
|
408
|
+
if autoarm_owns_recovery; then
|
|
409
|
+
if fm_watcher_healthy "$STATE" "$WATCH" "$GRACE" "$FM_HOME"; then
|
|
410
|
+
fm_failure_episode_reset "$STATE" || exit 2
|
|
411
|
+
fi
|
|
412
|
+
exit 0
|
|
413
|
+
fi
|
|
414
|
+
|
|
415
|
+
# The auto-arm genuinely failed to establish: consume the bounded re-block
|
|
416
|
+
# budget before considering the verified one-time attended fail-open.
|
|
417
|
+
budget_account_current_epoch || block_stop
|
|
418
|
+
terminal_fail_open
|
|
419
|
+
terminal_status=$?
|
|
420
|
+
if [ "$terminal_status" -eq 0 ]; then
|
|
421
|
+
if [ "$FM_SUP_IN_FLIGHT" -gt 0 ]; then
|
|
422
|
+
NEED_DESC="$FM_SUP_IN_FLIGHT task(s) in flight"
|
|
423
|
+
elif [ "$FM_SUP_SOURCES" -gt 0 ]; then
|
|
424
|
+
NEED_DESC="$FM_SUP_SOURCES process-event source(s) registered"
|
|
425
|
+
else
|
|
426
|
+
NEED_DESC="X-mode relay polling active"
|
|
427
|
+
fi
|
|
428
|
+
printf '{"systemMessage":"FIRSTMATE SUPERVISION IS GENUINELY DOWN: %s, the Stop-owned auto-arm exhausted its bounded retries and one failure notice, no watcher or automatic continuation exists, and the block budget is exhausted. Keep this session attended and diagnose the automatic Stop-hook and watcher startup before relying on unattended supervision."}\n' "$NEED_DESC"
|
|
429
|
+
exit 0
|
|
430
|
+
fi
|
|
431
|
+
[ "$terminal_status" -eq 2 ] && exit 0
|
|
432
|
+
block_stop
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Self-update a running firstmate and its secondmates to the latest origin.
|
|
3
|
+
#
|
|
4
|
+
# Mechanical half of the /updatefirstmate skill. Fast-forwards the running
|
|
5
|
+
# firstmate repo's default branch from origin, then fast-forwards every
|
|
6
|
+
# registered secondmate home. Local homes are treehouse worktrees or standalone
|
|
7
|
+
# clones; remote routes update their configured code root on that host and then
|
|
8
|
+
# fast-forward the persistent home to that root. FAST-FORWARD ONLY, exactly like
|
|
9
|
+
# fm-fleet-sync.sh: never force, never create a merge commit, never stash;
|
|
10
|
+
# advance a target only when it is a clean fast-forward, otherwise skip and
|
|
11
|
+
# report. A tracked-files fast-forward never touches the gitignored operational
|
|
12
|
+
# dirs (data/, state/, config/, projects/, .no-mistakes/), so a secondmate's
|
|
13
|
+
# in-flight work is never disrupted. Worktrees of this repo share one object
|
|
14
|
+
# store, so a single fetch refreshes them all; standalone-clone homes are
|
|
15
|
+
# fetched on their own. Secondmate homes are leased at a detached HEAD on the
|
|
16
|
+
# default branch, so a fast-forward there advances HEAD only and never touches
|
|
17
|
+
# any other worktree's checkout or the shared `main` branch.
|
|
18
|
+
#
|
|
19
|
+
# The fast-forward mechanics live in bin/fm-ff-lib.sh (base_mode "origin" here);
|
|
20
|
+
# the same library drives the local-HEAD secondmate sync used by fm-spawn.sh and
|
|
21
|
+
# fm-bootstrap.sh, so there is one ff implementation, not several.
|
|
22
|
+
#
|
|
23
|
+
# It does NOT re-read AGENTS.md or nudge secondmates itself - those are LLM /
|
|
24
|
+
# tmux actions the skill performs. The script's job is the safe git mechanics
|
|
25
|
+
# plus a parseable summary telling the caller what to do next:
|
|
26
|
+
# - one status line per target (updated/already current/skipped)
|
|
27
|
+
# - reread-firstmate: yes|no (did the running firstmate's instructions change)
|
|
28
|
+
# - nudge-secondmates: fm-<id>...|none (updated live secondmates to nudge)
|
|
29
|
+
#
|
|
30
|
+
# Usage: fm-update.sh [--help]
|
|
31
|
+
set -eu
|
|
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
|
+
SECONDMATES_MD="$FM_HOME/data/secondmates.md"
|
|
38
|
+
# shellcheck source=bin/fm-ff-lib.sh
|
|
39
|
+
. "$SCRIPT_DIR/fm-ff-lib.sh"
|
|
40
|
+
|
|
41
|
+
"$SCRIPT_DIR/fm-guard.sh" || true
|
|
42
|
+
|
|
43
|
+
usage() { echo "usage: fm-update.sh [--help]" >&2; }
|
|
44
|
+
|
|
45
|
+
if [ "${1:-}" = "--help" ] || [ "${1:-}" = "-h" ]; then
|
|
46
|
+
usage
|
|
47
|
+
exit 0
|
|
48
|
+
fi
|
|
49
|
+
[ $# -eq 0 ] || { usage; exit 1; }
|
|
50
|
+
|
|
51
|
+
# --- main firstmate repo ---------------------------------------------------
|
|
52
|
+
|
|
53
|
+
reread_firstmate="no"
|
|
54
|
+
ff_target "$FM_ROOT" "firstmate" origin no no
|
|
55
|
+
if [ "$FF_STATUS" = "updated" ] && [ -n "$FF_INSTR" ]; then
|
|
56
|
+
reread_firstmate="yes"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# --- secondmates -----------------------------------------------------------
|
|
60
|
+
# An updated live secondmate is nudged whenever it advanced (nudge_requires_instr
|
|
61
|
+
# is "no" here): /updatefirstmate's nudge is a gentle re-read steer, kept on the
|
|
62
|
+
# same condition it has always used.
|
|
63
|
+
|
|
64
|
+
FF_NUDGE_WINDOWS=""
|
|
65
|
+
FF_SEEN_HOMES=""
|
|
66
|
+
|
|
67
|
+
# Live direct reports first: state/<id>.meta with kind=secondmate carries the
|
|
68
|
+
# authoritative home= path.
|
|
69
|
+
sweep_live_secondmate_metas "$STATE" origin no
|
|
70
|
+
|
|
71
|
+
# Registry backstop: a secondmate registered in data/secondmates.md but without
|
|
72
|
+
# a live meta (e.g. between restarts) is still its persistent on-disk home.
|
|
73
|
+
if [ -f "$SECONDMATES_MD" ]; then
|
|
74
|
+
while IFS= read -r line || [ -n "$line" ]; do
|
|
75
|
+
case "$line" in
|
|
76
|
+
"- "*) ;;
|
|
77
|
+
*) continue ;;
|
|
78
|
+
esac
|
|
79
|
+
if ! secondmate_registry_parse_line "$line"; then
|
|
80
|
+
echo "secondmate registry: skipped malformed entry: $line" >&2
|
|
81
|
+
continue
|
|
82
|
+
fi
|
|
83
|
+
id=$SECONDMATE_REGISTRY_ID
|
|
84
|
+
home=$SECONDMATE_REGISTRY_HOME
|
|
85
|
+
if [ "$SECONDMATE_REGISTRY_REMOTE" -eq 1 ]; then
|
|
86
|
+
if remote_out=$("$SCRIPT_DIR/fm-on.sh" "$id" fm-remote-secondmate-control.sh update "$id" < /dev/null 2>&1); then
|
|
87
|
+
remote_result=$(printf '%s\n' "$remote_out" | tail -1)
|
|
88
|
+
case "$remote_result" in
|
|
89
|
+
synced:*)
|
|
90
|
+
echo "remote secondmate $id: updated on $SECONDMATE_REGISTRY_HOST (${remote_result#synced: })"
|
|
91
|
+
if [ -f "$STATE/$id.meta" ] && grep -qx 'kind=secondmate' "$STATE/$id.meta"; then
|
|
92
|
+
FF_NUDGE_WINDOWS="$FF_NUDGE_WINDOWS fm-$id"
|
|
93
|
+
fi
|
|
94
|
+
;;
|
|
95
|
+
current:*) echo "remote secondmate $id: already current on $SECONDMATE_REGISTRY_HOST (${remote_result#current: })" ;;
|
|
96
|
+
*) echo "remote secondmate $id: skipped on $SECONDMATE_REGISTRY_HOST: malformed update result" >&2 ;;
|
|
97
|
+
esac
|
|
98
|
+
else
|
|
99
|
+
echo "remote secondmate $id: skipped on $SECONDMATE_REGISTRY_HOST: ${remote_out%%$'\n'*}" >&2
|
|
100
|
+
fi
|
|
101
|
+
else
|
|
102
|
+
process_secondmate "$id" "$home" "" origin no
|
|
103
|
+
fi
|
|
104
|
+
done < "$SECONDMATES_MD"
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# --- caller action summary -------------------------------------------------
|
|
108
|
+
|
|
109
|
+
echo "reread-firstmate: $reread_firstmate"
|
|
110
|
+
echo "nudge-secondmates:${FF_NUDGE_WINDOWS:- none}"
|