@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,546 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-bearings-snapshot.sh - compact, bounded, TOON-by-default bearings projection.
|
|
3
|
+
#
|
|
4
|
+
# A thin wrapper OVER the canonical bin/fm-fleet-snapshot.sh. It does not parse
|
|
5
|
+
# fleet state itself: it shells out to `fm-fleet-snapshot.sh --json`, projects that
|
|
6
|
+
# complete structured contract down to the small set of fields a "pick up where I
|
|
7
|
+
# left off" read needs, and renders TOON at the output boundary. The internal data
|
|
8
|
+
# model stays JSON (`--json` prints it verbatim); TOON is the default agent-facing
|
|
9
|
+
# format per the AXI standard, and TOON/JSON are parity representations of the same
|
|
10
|
+
# projected model. The projection is view-specific: it DROPS fields from the bearings
|
|
11
|
+
# output, it never removes them from - or otherwise weakens - the canonical snapshot,
|
|
12
|
+
# which stays complete.
|
|
13
|
+
#
|
|
14
|
+
# LOCAL-ONLY by default: a normal invocation makes ZERO GitHub/network/auth calls.
|
|
15
|
+
# It MAY surface PR URLs already recorded locally in task meta (recorded_prs), but it
|
|
16
|
+
# performs no live discovery or checks. Live PR discovery/checks happen ONLY under
|
|
17
|
+
# --include-prs, which is the sole path that touches the network; all gh coupling
|
|
18
|
+
# lives in that branch and never in the canonical snapshot. The default output states
|
|
19
|
+
# explicitly (the prs: line and the omitted[] surfaces) what was not requested, so an
|
|
20
|
+
# absence is never ambiguous.
|
|
21
|
+
#
|
|
22
|
+
# This wrapper consumes canonical status decisions plus canonically normalized
|
|
23
|
+
# backlog roles, unresolved blockers, and captain actionability. It never infers
|
|
24
|
+
# decisions from report or visual-review prose or reimplements snapshot semantics.
|
|
25
|
+
# Captain's Call is captain actionability itself: every due, unblocked task held
|
|
26
|
+
# for the captain, whatever its kind. A captain hold deferred by date
|
|
27
|
+
# (hold-until in the future) is not actionable and renders as a Charted Next
|
|
28
|
+
# gate with its date; a row the canonical snapshot marks prose-deferred
|
|
29
|
+
# (deferred_marker) leaves the default decisions and gates views and is
|
|
30
|
+
# disclosed in omitted[], revealed by --all-decisions / --all-queued.
|
|
31
|
+
#
|
|
32
|
+
# Main-home inventory validity comes from the canonical snapshot's main_inventory
|
|
33
|
+
# object (orphan structured in-flight without meta, unstructured current rows).
|
|
34
|
+
# Bearings never invents Underway rows from backlog-only ids; it discloses those
|
|
35
|
+
# gaps in omitted[] and, when invalid, a Charted Next gate line so the four-section
|
|
36
|
+
# chat cannot claim an empty fleet while main current state is broken.
|
|
37
|
+
#
|
|
38
|
+
# The landed section merges this home's Done with the canonical snapshot's
|
|
39
|
+
# secondmate_landed roll-up (fm-fleet-snapshot.sh), so merges a secondmate managed -
|
|
40
|
+
# recorded in ITS OWN backlog, never the main one - are visible. It stays bounded by
|
|
41
|
+
# a per-home cap and an overall cap, with omitted[] disclosure of both and of any
|
|
42
|
+
# secondmate home whose backlog was unreadable; no GitHub/network call is involved.
|
|
43
|
+
# The default landed baseline is balanced across homes: each home keeps its internal
|
|
44
|
+
# newest-first ordering, homes iterate in deterministic id order, sparse homes do not
|
|
45
|
+
# waste capacity, and --all-landed switches back to the complete global newest-first
|
|
46
|
+
# order.
|
|
47
|
+
#
|
|
48
|
+
# Flags:
|
|
49
|
+
# (default) compact projection, TOON, local-only
|
|
50
|
+
# --json the same projected model as JSON (machine/debug; parity form)
|
|
51
|
+
# --include-prs ALSO do live open-PR discovery + checks (the only network path)
|
|
52
|
+
# --fields <list> opt in to dropped surfaces: bodies,paths,actions,endpoints
|
|
53
|
+
# --all-in-flight include every in-flight task
|
|
54
|
+
# --all-decisions include every open decision
|
|
55
|
+
# --all-secondmates include every aggregated secondmate record
|
|
56
|
+
# --all-landed include every landed record from every home (default: bounded)
|
|
57
|
+
# --all-reports include the full scout-report inventory (default: relevant only)
|
|
58
|
+
# --all-queued include superseded queued items (default: dropped)
|
|
59
|
+
# --all-recorded-prs include every locally recorded PR
|
|
60
|
+
# --all-unhealthy include every unhealthy endpoint
|
|
61
|
+
# --all-pr-repos query every discovered repository under --include-prs
|
|
62
|
+
# -h,--help usage
|
|
63
|
+
#
|
|
64
|
+
# Output contract: `fm-bearings.v1`. Read-only; no locks, no mutation, no reports.
|
|
65
|
+
set -u
|
|
66
|
+
|
|
67
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
68
|
+
FLEET="$SCRIPT_DIR/fm-fleet-snapshot.sh"
|
|
69
|
+
# shellcheck source=bin/fm-timeout-lib.sh
|
|
70
|
+
# shellcheck disable=SC1091
|
|
71
|
+
. "$SCRIPT_DIR/fm-timeout-lib.sh"
|
|
72
|
+
|
|
73
|
+
# Bounds (overridable for tests / large fleets).
|
|
74
|
+
FM_BEARINGS_LANDED=${FM_BEARINGS_LANDED:-6}
|
|
75
|
+
FM_BEARINGS_LANDED_PER_HOME=${FM_BEARINGS_LANDED_PER_HOME:-$FM_BEARINGS_LANDED}
|
|
76
|
+
FM_BEARINGS_IN_FLIGHT=${FM_BEARINGS_IN_FLIGHT:-20}
|
|
77
|
+
FM_BEARINGS_DECISIONS=${FM_BEARINGS_DECISIONS:-20}
|
|
78
|
+
FM_BEARINGS_SECONDMATES=${FM_BEARINGS_SECONDMATES:-20}
|
|
79
|
+
FM_BEARINGS_GATES=${FM_BEARINGS_GATES:-20}
|
|
80
|
+
FM_BEARINGS_REPORTS=${FM_BEARINGS_REPORTS:-20}
|
|
81
|
+
FM_BEARINGS_RECORDED_PRS=${FM_BEARINGS_RECORDED_PRS:-20}
|
|
82
|
+
FM_BEARINGS_UNHEALTHY=${FM_BEARINGS_UNHEALTHY:-20}
|
|
83
|
+
FM_BEARINGS_PR_REPOS=${FM_BEARINGS_PR_REPOS:-10}
|
|
84
|
+
FM_BEARINGS_PR_LIMIT=${FM_BEARINGS_PR_LIMIT:-20}
|
|
85
|
+
FM_BEARINGS_PR_TIMEOUT=${FM_BEARINGS_PR_TIMEOUT:-20}
|
|
86
|
+
case "$FM_BEARINGS_PR_TIMEOUT" in ''|*[!0-9]*|0) FM_BEARINGS_PR_TIMEOUT=20 ;; esac
|
|
87
|
+
validate_bound() { # <name> <value>
|
|
88
|
+
case "$2" in ''|*[!0-9]*|0) echo "fm-bearings-snapshot: $1 must be a positive integer" >&2; exit 2 ;; esac
|
|
89
|
+
}
|
|
90
|
+
validate_bound FM_BEARINGS_LANDED "$FM_BEARINGS_LANDED"
|
|
91
|
+
validate_bound FM_BEARINGS_LANDED_PER_HOME "$FM_BEARINGS_LANDED_PER_HOME"
|
|
92
|
+
validate_bound FM_BEARINGS_IN_FLIGHT "$FM_BEARINGS_IN_FLIGHT"
|
|
93
|
+
validate_bound FM_BEARINGS_DECISIONS "$FM_BEARINGS_DECISIONS"
|
|
94
|
+
validate_bound FM_BEARINGS_SECONDMATES "$FM_BEARINGS_SECONDMATES"
|
|
95
|
+
validate_bound FM_BEARINGS_GATES "$FM_BEARINGS_GATES"
|
|
96
|
+
validate_bound FM_BEARINGS_REPORTS "$FM_BEARINGS_REPORTS"
|
|
97
|
+
validate_bound FM_BEARINGS_RECORDED_PRS "$FM_BEARINGS_RECORDED_PRS"
|
|
98
|
+
validate_bound FM_BEARINGS_UNHEALTHY "$FM_BEARINGS_UNHEALTHY"
|
|
99
|
+
validate_bound FM_BEARINGS_PR_REPOS "$FM_BEARINGS_PR_REPOS"
|
|
100
|
+
validate_bound FM_BEARINGS_PR_LIMIT "$FM_BEARINGS_PR_LIMIT"
|
|
101
|
+
|
|
102
|
+
usage() {
|
|
103
|
+
cat <<'EOF'
|
|
104
|
+
usage: fm-bearings-snapshot.sh [--json] [--include-prs] [--fields <list>]
|
|
105
|
+
[--all-in-flight] [--all-decisions]
|
|
106
|
+
[--all-secondmates] [--all-landed]
|
|
107
|
+
[--all-reports] [--all-queued]
|
|
108
|
+
[--all-recorded-prs] [--all-unhealthy]
|
|
109
|
+
[--all-pr-repos]
|
|
110
|
+
|
|
111
|
+
Compact bearings projection over fm-fleet-snapshot.sh. TOON by default.
|
|
112
|
+
Default is LOCAL-ONLY (no network); --include-prs is the only path that fetches.
|
|
113
|
+
|
|
114
|
+
Default fields: schema, home, generated, prs, in_flight{id,kind,state,doing},
|
|
115
|
+
secondmates{id,state,doing,provenance,freshness,age_seconds,contradiction,reason},
|
|
116
|
+
secondmate_reconcile{id,spawn_gen,host,kind,ids},
|
|
117
|
+
decisions_open{id,key,verb,summary,owner}, landed{id,what,artifact,owner},
|
|
118
|
+
gates{id,title,blocked_by,reason,owner}, reports{id,path}, recorded_prs{id,url},
|
|
119
|
+
unhealthy_endpoints{...} (only when non-empty), omitted{surface,reveal}.
|
|
120
|
+
landed merges this home's Done with registered secondmate homes' Done, bounded by
|
|
121
|
+
a per-home cap (FM_BEARINGS_LANDED_PER_HOME) and an overall cap (FM_BEARINGS_LANDED),
|
|
122
|
+
with omitted[] disclosure. Default selection is balanced across deterministic home
|
|
123
|
+
order while preserving each home's internal newest-first order; sparse homes do
|
|
124
|
+
not waste capacity. --all-landed reveals the full global newest-first set.
|
|
125
|
+
For every registered secondmate, readable structured facts from its own home are
|
|
126
|
+
authoritative, including independently trustworthy surfaces from a partial summary.
|
|
127
|
+
Parent events and bounded terminal reads are labeled fallback or contradiction
|
|
128
|
+
evidence and never become current work.
|
|
129
|
+
Opt-in surfaces: --fields bodies|paths|actions|endpoints, --all-in-flight,
|
|
130
|
+
--all-decisions, --all-secondmates, --all-landed, --all-reports, --all-queued, --all-recorded-prs,
|
|
131
|
+
--all-unhealthy, --all-pr-repos, --include-prs (adds candidate_prs).
|
|
132
|
+
Raise FM_BEARINGS_PR_LIMIT to expand per-repository open-PR results.
|
|
133
|
+
EOF
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
FORMAT=toon
|
|
137
|
+
INCLUDE_PRS=0
|
|
138
|
+
ALL_REPORTS=0
|
|
139
|
+
ALL_QUEUED=0
|
|
140
|
+
ALL_IN_FLIGHT=0
|
|
141
|
+
ALL_DECISIONS=0
|
|
142
|
+
ALL_SECONDMATES=0
|
|
143
|
+
ALL_LANDED=0
|
|
144
|
+
ALL_RECORDED_PRS=0
|
|
145
|
+
ALL_UNHEALTHY=0
|
|
146
|
+
ALL_PR_REPOS=0
|
|
147
|
+
FIELDS=""
|
|
148
|
+
while [ $# -gt 0 ]; do
|
|
149
|
+
case "$1" in
|
|
150
|
+
--json) FORMAT=json ;;
|
|
151
|
+
--include-prs) INCLUDE_PRS=1 ;;
|
|
152
|
+
--all-reports) ALL_REPORTS=1 ;;
|
|
153
|
+
--all-queued) ALL_QUEUED=1 ;;
|
|
154
|
+
--all-in-flight) ALL_IN_FLIGHT=1 ;;
|
|
155
|
+
--all-decisions) ALL_DECISIONS=1 ;;
|
|
156
|
+
--all-secondmates) ALL_SECONDMATES=1 ;;
|
|
157
|
+
--all-landed) ALL_LANDED=1 ;;
|
|
158
|
+
--all-recorded-prs) ALL_RECORDED_PRS=1 ;;
|
|
159
|
+
--all-unhealthy) ALL_UNHEALTHY=1 ;;
|
|
160
|
+
--all-pr-repos) ALL_PR_REPOS=1 ;;
|
|
161
|
+
--fields) shift; FIELDS=${1:-} ;;
|
|
162
|
+
--fields=*) FIELDS=${1#--fields=} ;;
|
|
163
|
+
-h|--help) usage; exit 0 ;;
|
|
164
|
+
*) usage >&2; exit 2 ;;
|
|
165
|
+
esac
|
|
166
|
+
shift
|
|
167
|
+
done
|
|
168
|
+
|
|
169
|
+
command -v jq >/dev/null 2>&1 || { echo "fm-bearings-snapshot: jq not found" >&2; exit 1; }
|
|
170
|
+
|
|
171
|
+
# The deterministic return-catch-up owner must clear before this or any other
|
|
172
|
+
# ordinary captain request proceeds. Bearings does not reproduce that policy;
|
|
173
|
+
# it only consults the shared read-only gate.
|
|
174
|
+
"$SCRIPT_DIR/fm-afk-return.sh" guard || exit $?
|
|
175
|
+
|
|
176
|
+
NOW=${FM_BEARINGS_NOW:-$(date -u +%Y-%m-%dT%H:%M:%SZ)}
|
|
177
|
+
if [ "$ALL_LANDED" = 1 ] || [ "$ALL_SECONDMATES" = 1 ]; then
|
|
178
|
+
if [ "$ALL_LANDED" = 1 ]; then
|
|
179
|
+
SNAP=$(FM_SNAPSHOT_NOW="$NOW" FM_SNAPSHOT_SECONDMATES=0 FM_SNAPSHOT_SECONDMATE_LANDED_PER_HOME=0 "$FLEET" --json) || exit $?
|
|
180
|
+
else
|
|
181
|
+
SNAP=$(FM_SNAPSHOT_NOW="$NOW" FM_SNAPSHOT_SECONDMATES=0 "$FLEET" --json) || exit $?
|
|
182
|
+
fi
|
|
183
|
+
else
|
|
184
|
+
SNAP=$(FM_SNAPSHOT_NOW="$NOW" "$FLEET" --json) || exit $?
|
|
185
|
+
fi
|
|
186
|
+
HOME_LABEL=$(printf '%s' "$SNAP" | jq -er '.fm_home | strings | split("/") | (.[-2:] | join("/"))') \
|
|
187
|
+
|| { echo "fm-bearings-snapshot: invalid canonical snapshot" >&2; exit 1; }
|
|
188
|
+
|
|
189
|
+
# --- optional live PR enrichment (the ONLY network path) --------------------
|
|
190
|
+
PR_STATUS='not_requested (run: /bearings include PRs)'
|
|
191
|
+
CANDIDATE_PRS='[]'
|
|
192
|
+
PR_REPOS_TOTAL=0
|
|
193
|
+
PR_REPOS_SHOWN=0
|
|
194
|
+
PR_ROWS_CAPPED=0
|
|
195
|
+
PR_ROWS_MIN_TOTAL=0
|
|
196
|
+
|
|
197
|
+
# Parse owner/repo from an https or ssh GitHub remote/PR URL; empty if not GitHub.
|
|
198
|
+
repo_slug() { # <url>
|
|
199
|
+
printf '%s' "$1" | sed -n 's#.*github\.com[:/]\([^/]*/[^/]*\)#\1#p' | sed 's#\.git$##; s#/pull/.*$##; s#/$##'
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# Bounded gh call; prints stdout, non-zero on timeout/failure. gh only.
|
|
203
|
+
# bin/fm-timeout-lib.sh owns the bound itself.
|
|
204
|
+
gh_bounded() { # <args...>
|
|
205
|
+
fm_run_timed "$FM_BEARINGS_PR_TIMEOUT" \
|
|
206
|
+
env GH_PROMPT_DISABLED=1 GH_NO_UPDATE_NOTIFIER=1 gh "$@"
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if [ "$INCLUDE_PRS" = 1 ]; then
|
|
210
|
+
if ! command -v gh >/dev/null 2>&1; then
|
|
211
|
+
PR_STATUS='unavailable (gh not found)'
|
|
212
|
+
else
|
|
213
|
+
# Candidate repos: recorded pr= URLs plus live worktree origins. Deduped.
|
|
214
|
+
repos=""
|
|
215
|
+
while IFS= read -r u; do
|
|
216
|
+
[ -n "$u" ] || continue
|
|
217
|
+
s=$(repo_slug "$u"); [ -n "$s" ] || continue
|
|
218
|
+
case " $repos " in *" $s "*) : ;; *) repos="$repos $s" ;; esac
|
|
219
|
+
done <<EOF
|
|
220
|
+
$(printf '%s' "$SNAP" | jq -r '.tasks[].pr.url // empty')
|
|
221
|
+
EOF
|
|
222
|
+
while IFS= read -r wt; do
|
|
223
|
+
[ -n "$wt" ] || continue
|
|
224
|
+
[ -d "$wt" ] || continue
|
|
225
|
+
u=$(git -C "$wt" remote get-url origin 2>/dev/null) || continue
|
|
226
|
+
s=$(repo_slug "$u"); [ -n "$s" ] || continue
|
|
227
|
+
case " $repos " in *" $s "*) : ;; *) repos="$repos $s" ;; esac
|
|
228
|
+
done <<EOF
|
|
229
|
+
$(printf '%s' "$SNAP" | jq -r '.tasks[] | select(.kind != "secondmate") | .paths.worktree.path // empty')
|
|
230
|
+
EOF
|
|
231
|
+
|
|
232
|
+
for repo in $repos; do PR_REPOS_TOTAL=$((PR_REPOS_TOTAL + 1)); done
|
|
233
|
+
nrepos=0; npr=0; nwarn=0; ncapped=0; rows='[]'
|
|
234
|
+
pr_fetch_limit=$((FM_BEARINGS_PR_LIMIT + 1))
|
|
235
|
+
for repo in $repos; do
|
|
236
|
+
if [ "$ALL_PR_REPOS" != 1 ] && [ "$nrepos" -ge "$FM_BEARINGS_PR_REPOS" ]; then break; fi
|
|
237
|
+
nrepos=$((nrepos + 1))
|
|
238
|
+
out=$(gh_bounded pr list --repo "$repo" --state open --limit "$pr_fetch_limit" \
|
|
239
|
+
--json number,title,url,headRefName,reviewDecision,mergeable,statusCheckRollup 2>/dev/null) \
|
|
240
|
+
|| { nwarn=$((nwarn + 1)); continue; }
|
|
241
|
+
[ -n "$out" ] || out='[]'
|
|
242
|
+
repo_result=$(printf '%s' "$out" | jq --arg repo "$repo" --argjson limit "$FM_BEARINGS_PR_LIMIT" '
|
|
243
|
+
[ .[] | {
|
|
244
|
+
num:(.number|tostring),
|
|
245
|
+
repo:$repo,
|
|
246
|
+
task:(if (.headRefName // "" | startswith("fm/")) then (.headRefName | ltrimstr("fm/")) else "-" end),
|
|
247
|
+
url:(.url // "-"),
|
|
248
|
+
review:(.reviewDecision // "none"),
|
|
249
|
+
mergeable:(.mergeable // "UNKNOWN"),
|
|
250
|
+
checks:(
|
|
251
|
+
(.statusCheckRollup // []) as $c
|
|
252
|
+
| if ($c|length) == 0 then "none"
|
|
253
|
+
elif any($c[]; (.conclusion // .state // "") as $s | ($s=="FAILURE" or $s=="ERROR" or $s=="TIMED_OUT" or $s=="CANCELLED" or $s=="ACTION_REQUIRED")) then "failing"
|
|
254
|
+
elif any($c[]; ((.status // "") != "COMPLETED") and ((.state // "") != "SUCCESS")) then "pending"
|
|
255
|
+
else "passing" end)
|
|
256
|
+
} ] as $rows | {returned:($rows | length), rows:$rows[:$limit]}') || { nwarn=$((nwarn + 1)); continue; }
|
|
257
|
+
returned=$(printf '%s' "$repo_result" | jq '.returned')
|
|
258
|
+
repo_rows=$(printf '%s' "$repo_result" | jq '.rows')
|
|
259
|
+
cnt=$(printf '%s' "$repo_rows" | jq 'length')
|
|
260
|
+
[ "$returned" -gt "$FM_BEARINGS_PR_LIMIT" ] && ncapped=$((ncapped + 1))
|
|
261
|
+
npr=$((npr + cnt))
|
|
262
|
+
rows=$(jq -n --argjson a "$rows" --argjson b "$repo_rows" '$a + $b')
|
|
263
|
+
done
|
|
264
|
+
PR_REPOS_SHOWN=$nrepos
|
|
265
|
+
PR_ROWS_CAPPED=$ncapped
|
|
266
|
+
PR_ROWS_MIN_TOTAL=$((npr + ncapped))
|
|
267
|
+
CANDIDATE_PRS=$rows
|
|
268
|
+
warnnote=""
|
|
269
|
+
[ "$nwarn" -gt 0 ] && warnnote="; ${nwarn} repo(s) unavailable"
|
|
270
|
+
cappednote=""
|
|
271
|
+
[ "$ncapped" -gt 0 ] && cappednote="; ${npr} shown, at least ${PR_ROWS_MIN_TOTAL} open; capped in ${ncapped} repo(s)"
|
|
272
|
+
if [ "$ncapped" -gt 0 ]; then
|
|
273
|
+
PR_STATUS="checked (${nrepos} repos${cappednote}${warnnote})"
|
|
274
|
+
else
|
|
275
|
+
PR_STATUS="checked (${nrepos} repos, ${npr} open${warnnote})"
|
|
276
|
+
fi
|
|
277
|
+
fi
|
|
278
|
+
fi
|
|
279
|
+
|
|
280
|
+
# --- projection: canonical snapshot -> fm-bearings.v1 model (JSON) ----------
|
|
281
|
+
BEARINGS_TODAY=${NOW%%T*}
|
|
282
|
+
case "$BEARINGS_TODAY" in
|
|
283
|
+
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]) : ;;
|
|
284
|
+
*) BEARINGS_TODAY=$(date -u +%Y-%m-%d) ;;
|
|
285
|
+
esac
|
|
286
|
+
MODEL=$(printf '%s' "$SNAP" | jq \
|
|
287
|
+
--arg home "$HOME_LABEL" \
|
|
288
|
+
--arg now "$NOW" \
|
|
289
|
+
--arg today "$BEARINGS_TODAY" \
|
|
290
|
+
--arg prs "$PR_STATUS" \
|
|
291
|
+
--arg fields "$FIELDS" \
|
|
292
|
+
--argjson landed_n "$FM_BEARINGS_LANDED" \
|
|
293
|
+
--argjson landed_per_home_n "$FM_BEARINGS_LANDED_PER_HOME" \
|
|
294
|
+
--argjson in_flight_n "$FM_BEARINGS_IN_FLIGHT" \
|
|
295
|
+
--argjson decisions_n "$FM_BEARINGS_DECISIONS" \
|
|
296
|
+
--argjson secondmates_n "$FM_BEARINGS_SECONDMATES" \
|
|
297
|
+
--argjson gates_n "$FM_BEARINGS_GATES" \
|
|
298
|
+
--argjson reports_n "$FM_BEARINGS_REPORTS" \
|
|
299
|
+
--argjson recorded_prs_n "$FM_BEARINGS_RECORDED_PRS" \
|
|
300
|
+
--argjson unhealthy_n "$FM_BEARINGS_UNHEALTHY" \
|
|
301
|
+
--argjson include_prs "$INCLUDE_PRS" \
|
|
302
|
+
--argjson all_in_flight "$ALL_IN_FLIGHT" \
|
|
303
|
+
--argjson all_decisions "$ALL_DECISIONS" \
|
|
304
|
+
--argjson all_secondmates "$ALL_SECONDMATES" \
|
|
305
|
+
--argjson all_landed "$ALL_LANDED" \
|
|
306
|
+
--argjson all_reports "$ALL_REPORTS" \
|
|
307
|
+
--argjson all_queued "$ALL_QUEUED" \
|
|
308
|
+
--argjson all_recorded_prs "$ALL_RECORDED_PRS" \
|
|
309
|
+
--argjson all_unhealthy "$ALL_UNHEALTHY" \
|
|
310
|
+
--argjson pr_repos_total "$PR_REPOS_TOTAL" \
|
|
311
|
+
--argjson pr_repos_shown "$PR_REPOS_SHOWN" \
|
|
312
|
+
--argjson pr_rows_capped "$PR_ROWS_CAPPED" \
|
|
313
|
+
--argjson pr_rows_min_total "$PR_ROWS_MIN_TOTAL" \
|
|
314
|
+
--argjson candidate_prs "$CANDIDATE_PRS" '
|
|
315
|
+
def trunc($n): if . == null then null else
|
|
316
|
+
(tostring | gsub("\\s+"; " ") | if (length > $n) then (.[:$n] + "…") else . end) end;
|
|
317
|
+
def round_robin_landed($n):
|
|
318
|
+
. as $groups
|
|
319
|
+
| [range(0; (($groups | map(length) | max) // 0)) as $i
|
|
320
|
+
| $groups[]
|
|
321
|
+
| select(length > $i)
|
|
322
|
+
| .[$i]][:$n];
|
|
323
|
+
($fields | split(",") | map(gsub("^\\s+|\\s+$"; "")) | map(select(. != ""))) as $fl
|
|
324
|
+
| (($fl | index("bodies")) != null) as $f_bodies
|
|
325
|
+
| (($fl | index("paths")) != null) as $f_paths
|
|
326
|
+
| (($fl | index("actions")) != null) as $f_actions
|
|
327
|
+
| (($fl | index("endpoints")) != null) as $f_endpoints
|
|
328
|
+
| ([ .backlog.records[] | select(.state == "done" and .structured and .hold_kind != "captain")
|
|
329
|
+
| {id, title, pr_url, report_path, local_note, completion, home:"(main)", home_id:"(main)"} ]) as $main_done
|
|
330
|
+
| ((.secondmate_landed.records) // []) as $mate_done
|
|
331
|
+
| ($main_done + $mate_done) as $all_landed_rows
|
|
332
|
+
| ([ $all_landed_rows | group_by(.home_id)[]
|
|
333
|
+
| sort_by([(.completion.date // ""), .id]) | reverse
|
|
334
|
+
| (if $all_landed == 1 then . else .[:$landed_per_home_n] end) ]) as $per_home_groups
|
|
335
|
+
| ($per_home_groups | add // []) as $per_home_capped
|
|
336
|
+
| ([ $all_landed_rows | group_by(.home_id)[] | select(length > $landed_per_home_n) ] | length) as $home_cap_dropped
|
|
337
|
+
| ($per_home_capped | sort_by([(.completion.date // ""), .id]) | reverse) as $landed_sorted
|
|
338
|
+
| (if $all_landed == 1 then $landed_sorted else ($per_home_groups | round_robin_landed($landed_n)) end) as $done
|
|
339
|
+
| ($done | map(.id)) as $done_ids
|
|
340
|
+
| ([.tasks[] | select(.kind != "secondmate") | .id]) as $live_ids
|
|
341
|
+
| ([.tasks[] | select(.kind != "secondmate" and .current_state.state == "working") | .id]) as $working_ids
|
|
342
|
+
| ($live_ids + $done_ids) as $rel_ids
|
|
343
|
+
| ([ .tasks[]
|
|
344
|
+
| select(.endpoint.exists == false or .endpoint.agent_alive == "dead")
|
|
345
|
+
| {id, backend, target:(.endpoint.target // "-"), exists:.endpoint.exists, agent:.endpoint.agent_alive} ]
|
|
346
|
+
+ [ (.secondmate_current.records // [])[] as $m | $m.endpoints[]?
|
|
347
|
+
| select(.endpoint.exists == false or .endpoint.agent_alive == "dead")
|
|
348
|
+
| {id:($m.id + "/" + .id),backend:"secondmate-home",target:(.endpoint.target // "-"),exists:.endpoint.exists,agent:.endpoint.agent_alive} ]) as $unhealthy_all
|
|
349
|
+
| ([ (.secondmate_current.records // [])[]
|
|
350
|
+
| ([.decisions_open[]? | select(.source == "backlog" and .verb == "captain-hold"
|
|
351
|
+
and .deferred_marker != true)]) as $captain_holds
|
|
352
|
+
| ([.holds[]? | select(.source == "backlog")]) as $backlog_holds
|
|
353
|
+
| . + {
|
|
354
|
+
bearings_captain_holds:$captain_holds,
|
|
355
|
+
bearings_holds:(if .current.state == "captain_decision" then $backlog_holds else .holds end),
|
|
356
|
+
bearings_state:(
|
|
357
|
+
if .current.state == "captain_decision" then
|
|
358
|
+
if ($captain_holds | length) > 0 then "captain_decision"
|
|
359
|
+
elif (.active_children | length) > 0 then "active_child_work"
|
|
360
|
+
elif ($backlog_holds | length) > 0 then "externally_held"
|
|
361
|
+
else "unknown" end
|
|
362
|
+
else .current.state end)
|
|
363
|
+
} ]) as $secondmate_views
|
|
364
|
+
| ([ if .secondmate_current.registry.available == false then
|
|
365
|
+
{id:"(registry)",state:"unknown",doing:(.secondmate_current.registry.reason // "Registered secondmate table unavailable"),
|
|
366
|
+
provenance:(.secondmate_current.registry.provenance // "registered-table"),
|
|
367
|
+
freshness:(.secondmate_current.registry.freshness.status // "unavailable"),
|
|
368
|
+
age_seconds:null,contradiction:false,reason:(.secondmate_current.registry.reason // "Registered secondmate table unavailable")}
|
|
369
|
+
else empty end ]
|
|
370
|
+
+ [ $secondmate_views[]
|
|
371
|
+
| {id,state:.bearings_state,
|
|
372
|
+
doing:((if .bearings_state == "active_child_work" then
|
|
373
|
+
([.active_children[] | .id + ": " + (.doing // .state)] | join("; "))
|
|
374
|
+
elif .bearings_state == "captain_decision" then
|
|
375
|
+
([.bearings_captain_holds[] | .summary] | join("; "))
|
|
376
|
+
elif .bearings_state == "externally_held" then
|
|
377
|
+
([.bearings_holds[] | .id + ": " + (.reason // "held")] | join("; "))
|
|
378
|
+
elif .bearings_state == "no_active_work" then "No active child work"
|
|
379
|
+
else (.current.reason // "Current home state unavailable") end) | trunc(120)),
|
|
380
|
+
provenance:.provenance.selected,freshness:.freshness.status,
|
|
381
|
+
age_seconds:.freshness.age_seconds,contradiction:(.contradiction // false),
|
|
382
|
+
reason:(.current.reason // "-")} ]) as $secondmates_all
|
|
383
|
+
| ([ .tasks[]
|
|
384
|
+
| select(.kind != "secondmate")
|
|
385
|
+
| select(.backlog.current_role != "program")
|
|
386
|
+
| select(.backlog.current_role != "held" or .current_state.state == "working")
|
|
387
|
+
| {id, kind,
|
|
388
|
+
state: .current_state.state,
|
|
389
|
+
doing: ((.current_state.detail // "") as $d
|
|
390
|
+
| (if $d != "" then $d else (.hints.last_event_text // "") end) | trunc(90))
|
|
391
|
+
} ]
|
|
392
|
+
+ [ $secondmate_views[]
|
|
393
|
+
| select(.bearings_state == "active_child_work")
|
|
394
|
+
| {id,kind:"secondmate",state:.bearings_state,
|
|
395
|
+
doing:([.active_children[] | .id + ": " + (.doing // .state)] | join("; ") | trunc(90))} ]) as $in_flight_all
|
|
396
|
+
| ([ .backlog.records[]
|
|
397
|
+
| select(.structured and .captain_actionable == true)
|
|
398
|
+
| select(($all_decisions == 1) or (.deferred_marker != true))
|
|
399
|
+
| {id,key:.id,verb:"captain-hold",
|
|
400
|
+
summary:((.title + ": " + .hold_reason) | trunc(90)),owner:"(main)"} ]
|
|
401
|
+
+ [ (.secondmate_current.records // [])[] as $m | $m.decisions_open[]?
|
|
402
|
+
| select(.source == "backlog" and .verb == "captain-hold")
|
|
403
|
+
| select(($all_decisions == 1) or (.deferred_marker != true))
|
|
404
|
+
| {id:($m.id + "/" + .id),key,verb,
|
|
405
|
+
summary:(((.summary // .id) + ": " + (.reason // "captain decision pending")) | trunc(90)),owner:$m.id} ]) as $decisions_all
|
|
406
|
+
| ([ .backlog.records[]
|
|
407
|
+
| select(.structured and .captain_actionable == true and .deferred_marker == true) ]
|
|
408
|
+
+ [ (.secondmate_current.records // [])[] | .decisions_open[]?
|
|
409
|
+
| select(.source == "backlog" and .verb == "captain-hold" and .deferred_marker == true) ]
|
|
410
|
+
| length) as $decisions_marked_deferred
|
|
411
|
+
| ((if (.main_inventory.valid == false) then
|
|
412
|
+
[{id:"(main-inventory)",
|
|
413
|
+
title:((.main_inventory.reason // "main inventory invalid") | trunc(60)),
|
|
414
|
+
blocked_by:"-",
|
|
415
|
+
reason:"main inventory",
|
|
416
|
+
owner:"(main)"}]
|
|
417
|
+
else [] end)
|
|
418
|
+
+ [ .backlog.records[]
|
|
419
|
+
| . as $record
|
|
420
|
+
| select(.structured and
|
|
421
|
+
(.state == "queued" or
|
|
422
|
+
(.state == "in_flight" and .current_role == "held" and ($working_ids | index($record.id) | not))))
|
|
423
|
+
| select(.captain_actionable != true)
|
|
424
|
+
| select(($all_queued == 1) or (.deferred_marker != true)
|
|
425
|
+
or ((.hold_until // null) != null and .hold_until > $today))
|
|
426
|
+
| {id, title:(.title | trunc(60)),
|
|
427
|
+
blocked_by:((.unresolved_blocker_ids // []) | if length > 0 then join(",") else "-" end | trunc(120)),
|
|
428
|
+
reason:((if (.hold_until // null) != null and .hold_until > $today
|
|
429
|
+
then ("until " + .hold_until + ": " + (.hold_reason // .blocked_reason // "-"))
|
|
430
|
+
else (.hold_reason // .blocked_reason // "-") end) | trunc(40)),owner:"(main)"} ]
|
|
431
|
+
+ [ (.secondmate_current.records // [])[] as $m
|
|
432
|
+
| select($m.provenance.selected == "structured-home")
|
|
433
|
+
| $m.queued[]?
|
|
434
|
+
| select(.captain_actionable != true)
|
|
435
|
+
| select(($all_queued == 1) or (.deferred_marker != true)
|
|
436
|
+
or ((.hold_until // null) != null and .hold_until > $today))
|
|
437
|
+
| {id,title:(.title | trunc(60)),
|
|
438
|
+
blocked_by:((.unresolved_blocker_ids // []) | if length > 0 then join(",") else "-" end | trunc(120)),
|
|
439
|
+
reason:((if (.hold_until // null) != null and .hold_until > $today
|
|
440
|
+
then ("until " + .hold_until + ": " + (.hold_reason // .blocked_reason // "-"))
|
|
441
|
+
else (.hold_reason // .blocked_reason // "-") end) | trunc(40)),owner:$m.id} ]) as $gates_all
|
|
442
|
+
| ([ .scout_reports[]
|
|
443
|
+
| . as $r
|
|
444
|
+
| select(($all_reports == 1) or (($rel_ids | index($r.id)) != null))
|
|
445
|
+
| {id, path} ]) as $reports_all
|
|
446
|
+
| ([ .tasks[] | select(.kind != "secondmate" and .pr.url != null and .pr.source == "meta") | {id, url:.pr.url} ]) as $recorded_prs_all
|
|
447
|
+
| . as $snap
|
|
448
|
+
| {
|
|
449
|
+
schema: "fm-bearings.v1",
|
|
450
|
+
home: $home,
|
|
451
|
+
generated: $now,
|
|
452
|
+
prs: $prs,
|
|
453
|
+
in_flight: (if $all_in_flight == 1 then $in_flight_all else $in_flight_all[:$in_flight_n] end),
|
|
454
|
+
secondmates: (if $all_secondmates == 1 then $secondmates_all else $secondmates_all[:$secondmates_n] end),
|
|
455
|
+
secondmate_reconcile: [ (.secondmate_current.records // [])[]
|
|
456
|
+
| select(.reconcile_inventory != null)
|
|
457
|
+
| {id, spawn_gen:(.spawn_gen // null), host:(.host // null), kind:(.reconcile_inventory.kind // null), ids:((.reconcile_inventory.ids // []) | map(select(type == "string")) | sort)} ],
|
|
458
|
+
decisions_open: (if $all_decisions == 1 then $decisions_all else $decisions_all[:$decisions_n] end),
|
|
459
|
+
landed: ($done | map({id, what:(.title | trunc(70)),
|
|
460
|
+
artifact:(.pr_url // .report_path // .local_note // "-"),owner:.home_id})),
|
|
461
|
+
gates: (if $all_queued == 1 then $gates_all else $gates_all[:$gates_n] end),
|
|
462
|
+
reports: (if $all_reports == 1 then $reports_all else $reports_all[:$reports_n] end),
|
|
463
|
+
recorded_prs: (if $all_recorded_prs == 1 then $recorded_prs_all else $recorded_prs_all[:$recorded_prs_n] end)
|
|
464
|
+
}
|
|
465
|
+
| . + (if ($unhealthy_all | length) > 0 then
|
|
466
|
+
{unhealthy_endpoints:(if $all_unhealthy == 1 then $unhealthy_all else $unhealthy_all[:$unhealthy_n] end)}
|
|
467
|
+
else {} end)
|
|
468
|
+
| . + (if $include_prs == 1 then {candidate_prs:$candidate_prs} else {} end)
|
|
469
|
+
| . + (if $f_bodies then {bodies:[ $snap.backlog.records[] | select(.structured and (.state == "queued" or .state == "done")) | {id, body:((.body_excerpt // .raw // "-") | trunc(200))} ]} else {} end)
|
|
470
|
+
| . + (if $f_paths then {paths:[ $snap.tasks[] | {id, worktree:(.paths.worktree.path // "-"), home:(.paths.home.path // "-"), status:.paths.status_log.path, report:.paths.report.path} ]} else {} end)
|
|
471
|
+
| . + (if $f_actions then {actions:[ $snap.tasks[] | {id, watch:(.actions.watch // .actions.send // "-"), steer:(.actions.steer // .actions.send // "-")} ]} else {} end)
|
|
472
|
+
| . + (if $f_endpoints then {endpoints:[ $snap.tasks[] | {id, backend, target:(.endpoint.target // "-"), exists:.endpoint.exists, agent:.endpoint.agent_alive} ]} else {} end)
|
|
473
|
+
| . + {omitted: (
|
|
474
|
+
[ (if $f_bodies then empty else {surface:"backlog item bodies", reveal:"--fields bodies"} end),
|
|
475
|
+
(if $f_paths then empty else {surface:"task paths", reveal:"--fields paths"} end),
|
|
476
|
+
(if $f_actions then empty else {surface:"watch/steer actions", reveal:"--fields actions"} end),
|
|
477
|
+
(if $f_endpoints then empty else {surface:"healthy endpoint detail", reveal:"--fields endpoints"} end),
|
|
478
|
+
(if $all_reports == 1 then empty else {surface:"full scout-report inventory", reveal:"--all-reports"} end),
|
|
479
|
+
(if $all_queued == 1 then empty else {surface:"superseded or prose-deferred queued items", reveal:"--all-queued"} end),
|
|
480
|
+
(if $all_landed == 0 and ($per_home_capped | length) > ($done | length) then {surface:("landed showing \($done | length) of \($per_home_capped | length)" + (($done | map(.home_id) | unique | map(select(. != "(main)")) | length) as $k | if $k > 0 then " (incl. \($k) secondmate home(s))" else "" end)), reveal:"--all-landed"} else empty end),
|
|
481
|
+
(if $all_landed == 0 and $home_cap_dropped > 0 then {surface:("landed per-home capped at \($landed_per_home_n) for \($home_cap_dropped) home(s)"), reveal:"--all-landed"} else empty end),
|
|
482
|
+
(if (($snap.secondmate_landed.unreadable // []) | length) > 0 then {surface:("secondmate home(s) with unreadable backlog: \(($snap.secondmate_landed.unreadable // []) | length)"), reveal:"inspect the listed secondmate home backlogs"} else empty end),
|
|
483
|
+
(if $all_landed == 0 and (($snap.secondmate_landed.truncated // []) | length) > 0 then {surface:("secondmate home Done capped at the snapshot layer for \(($snap.secondmate_landed.truncated // []) | length) home(s)"), reveal:"--all-landed"} else empty end),
|
|
484
|
+
((($snap.main_inventory.orphan_in_flight // []) | length) as $n
|
|
485
|
+
| if $n > 0 then {surface:("main in-flight backlog item(s) have no child metadata: \($n)"), reveal:"inspect main data/backlog.md In flight vs state/*.meta"} else empty end),
|
|
486
|
+
((($snap.main_inventory.unstructured_current_count // 0)) as $n
|
|
487
|
+
| if $n > 0 then {surface:("main unstructured current backlog row(s): \($n)"), reveal:"inspect main data/backlog.md In flight and Queued free-form rows"} else empty end),
|
|
488
|
+
(if $all_in_flight == 0 and ($in_flight_all | length) > $in_flight_n then {surface:("in_flight showing \($in_flight_n) of \($in_flight_all | length)"), reveal:"--all-in-flight"} else empty end),
|
|
489
|
+
(if $all_secondmates == 0 and ($secondmates_all | length) > $secondmates_n then {surface:("secondmates showing \($secondmates_n) of \($secondmates_all | length)"), reveal:"--all-secondmates"} else empty end),
|
|
490
|
+
(if (($snap.secondmate_current.truncated // 0) > 0) then {surface:("registered secondmates omitted by snapshot bound: \($snap.secondmate_current.truncated)"), reveal:"raise FM_SNAPSHOT_SECONDMATES"} else empty end),
|
|
491
|
+
(if $snap.secondmate_current.registry.input_truncated == true then {surface:"secondmate registry input truncated by bounded read", reveal:"raise FM_SNAPSHOT_REGISTRY_LINES or FM_SNAPSHOT_REGISTRY_BYTES"} else empty end),
|
|
492
|
+
(if $snap.secondmate_current.registry.records_truncated == true then {surface:"secondmate registry records omitted by bounded read", reveal:"raise FM_SNAPSHOT_REGISTRY_RECORDS"} else empty end),
|
|
493
|
+
(if $snap.secondmate_current.registry.available == false then {surface:("secondmate registry unavailable: " + ($snap.secondmate_current.registry.reason // "read failed")), reveal:"inspect data/secondmates.md"} else empty end),
|
|
494
|
+
(([($snap.secondmate_current.records // [])[] | select(.parent_event.activity_scan.input_truncated == true or .parent_event.activity_scan.retained_truncated == true)] | length) as $n | if $n > 0 then {surface:("secondmate parent activity evidence truncated for \($n) record(s)"), reveal:"raise FM_SNAPSHOT_PARENT_ACTIVITY_LINES, FM_SNAPSHOT_PARENT_ACTIVITY_BYTES, or FM_SNAPSHOT_PARENT_ACTIVITIES"} else empty end),
|
|
495
|
+
(([($snap.secondmate_current.records // [])[] | select(.parent_event.activity_scan.available == false)] | length) as $n | if $n > 0 then {surface:("secondmate parent activity evidence unavailable for \($n) record(s)"), reveal:"inspect the parent status logs"} else empty end),
|
|
496
|
+
(if $all_decisions == 0 and ($decisions_all | length) > $decisions_n then {surface:("decisions_open showing \($decisions_n) of \($decisions_all | length)"), reveal:"--all-decisions"} else empty end),
|
|
497
|
+
(if $all_decisions == 0 and $decisions_marked_deferred > 0 then {surface:("captain holds marked deferred or superseded: \($decisions_marked_deferred)"), reveal:"--all-decisions"} else empty end),
|
|
498
|
+
(if $all_queued == 0 and ($gates_all | length) > $gates_n then {surface:("gates showing \($gates_n) of \($gates_all | length)"), reveal:"--all-queued"} else empty end),
|
|
499
|
+
(if $all_reports == 0 and ($reports_all | length) > $reports_n then {surface:("reports showing \($reports_n) of \($reports_all | length)"), reveal:"--all-reports"} else empty end),
|
|
500
|
+
(if $all_recorded_prs == 0 and ($recorded_prs_all | length) > $recorded_prs_n then {surface:("recorded_prs showing \($recorded_prs_n) of \($recorded_prs_all | length)"), reveal:"--all-recorded-prs"} else empty end),
|
|
501
|
+
(if $all_unhealthy == 0 and ($unhealthy_all | length) > $unhealthy_n then {surface:("unhealthy_endpoints showing \($unhealthy_n) of \($unhealthy_all | length)"), reveal:"--all-unhealthy"} else empty end),
|
|
502
|
+
(if $include_prs == 1 and $pr_repos_total > $pr_repos_shown then {surface:("PR repositories showing \($pr_repos_shown) of \($pr_repos_total)"), reveal:"--all-pr-repos"} else empty end),
|
|
503
|
+
(if $include_prs == 1 and $pr_rows_capped > 0 then {surface:("candidate_prs showing \($candidate_prs | length) of at least \($pr_rows_min_total); capped in \($pr_rows_capped) repo(s)"), reveal:"raise FM_BEARINGS_PR_LIMIT"} else empty end),
|
|
504
|
+
(if $include_prs == 1 then empty else {surface:"live PR discovery + checks", reveal:"--include-prs"} end) ]) }
|
|
505
|
+
') || { echo "fm-bearings-snapshot: projection failed" >&2; exit 1; }
|
|
506
|
+
|
|
507
|
+
if [ "$FORMAT" = json ]; then
|
|
508
|
+
printf '%s\n' "$MODEL"
|
|
509
|
+
exit 0
|
|
510
|
+
fi
|
|
511
|
+
|
|
512
|
+
# --- TOON renderer (output boundary; parity with the JSON model) ------------
|
|
513
|
+
# The model is a flat object of scalar fields plus arrays of uniform scalar
|
|
514
|
+
# objects, so the encoder only needs object scalars, the tabular array form
|
|
515
|
+
# (key[N]{fields}: + comma rows at +2 indent), and the empty-array form (key: []),
|
|
516
|
+
# per the TOON spec. Quoting follows the spec exactly.
|
|
517
|
+
TOON=$(printf '%s\n' "$MODEL" | jq -r '
|
|
518
|
+
def q:
|
|
519
|
+
tostring
|
|
520
|
+
| if (. == "")
|
|
521
|
+
or test("^\\s|\\s$")
|
|
522
|
+
or (. == "true" or . == "false" or . == "null")
|
|
523
|
+
or test("^-?[0-9]+(\\.[0-9]+)?([eE][+-]?[0-9]+)?$")
|
|
524
|
+
or test("[:\"\\\\\\[\\]{},]")
|
|
525
|
+
or test("[[:cntrl:]]")
|
|
526
|
+
or test("^-")
|
|
527
|
+
then "\"" + (gsub("\\\\"; "\\\\") | gsub("\""; "\\\"") | gsub("\n"; "\\n") | gsub("\r"; "\\r") | gsub("\t"; "\\t")) + "\""
|
|
528
|
+
else . end;
|
|
529
|
+
def scal:
|
|
530
|
+
if . == null then "null"
|
|
531
|
+
elif type == "boolean" then (if . then "true" else "false" end)
|
|
532
|
+
elif type == "number" then tostring
|
|
533
|
+
else q end;
|
|
534
|
+
def emit($k; $v):
|
|
535
|
+
if ($v | type) == "array" then
|
|
536
|
+
if ($v | length) == 0 then "\($k): []"
|
|
537
|
+
else
|
|
538
|
+
($v[0] | keys_unsorted) as $ks
|
|
539
|
+
| ( "\($k)[\($v | length)]{\($ks | map(q) | join(","))}:",
|
|
540
|
+
($v[] as $row | " " + ([ $ks[] as $kk | ($row[$kk] | scal) ] | join(","))) )
|
|
541
|
+
end
|
|
542
|
+
else "\($k): " + ($v | scal)
|
|
543
|
+
end;
|
|
544
|
+
[ to_entries[] | emit(.key; .value) ] | join("\n")
|
|
545
|
+
') || { echo "fm-bearings-snapshot: TOON rendering failed" >&2; exit 1; }
|
|
546
|
+
printf '%s\n' "$TOON"
|