@zerwiz/ymir 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +290 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml +50 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +9 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/config/tailscale-sync.yaml +27 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/kaia.engram +0 -0
- package/.agents/memory/kaia.engram-shm +0 -0
- package/.agents/memory/kaia.engram-wal +0 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/memory/well/episodes.jsonl +367 -0
- package/.agents/memory/well/workspace.jsonl +27 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +111 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +70 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +52 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +34 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +454 -0
- package/CHANGELOG.md +881 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +113 -59
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +65 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +58 -0
- package/RULES/07-config.md +45 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/README.md +20 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +98 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +233 -0
- package/bin/apodex-smoke-test.sh +92 -0
- package/bin/bifrost-bridge.sh +112 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +107 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +38 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-guard.sh +165 -0
- package/bin/crash-sense.sh +160 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +207 -0
- package/bin/eindri-acclaim.sh +34 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seen.sh +41 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +85 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +112 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/fleet-apply.sh +68 -0
- package/bin/github-deploy.sh +81 -0
- package/bin/gjallarhorn-expose.sh +102 -0
- package/bin/gjallarhorn-notify.sh +58 -0
- package/bin/gjallarhorn-purge.sh +54 -0
- package/bin/gjallarhorn-tunnel.sh +72 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +122 -0
- package/bin/hall-snapshot.sh +92 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +431 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hoard-lib.sh +25 -0
- package/bin/hodd.sh +78 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +108 -0
- package/bin/local-model-lock.sh +51 -0
- package/bin/mimir-bridge.py +226 -0
- package/bin/mimir-bridge.sh +87 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +59 -0
- package/bin/mjollnir.sh +85 -0
- package/bin/model-hardware.sh +82 -0
- package/bin/model-resolve.sh +147 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +148 -0
- package/bin/omarchy-plugins.sh +174 -0
- package/bin/omarchy-sense.sh +149 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +38 -0
- package/bin/project-git.sh +55 -0
- package/bin/public-guard.sh +70 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +91 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +90 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +76 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +190 -0
- package/bin/telegram-bot.sh +69 -0
- package/bin/toolchain.sh +74 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +260 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +47 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +150 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +641 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +97 -0
- package/bin/ymir-setup-auth.sh +108 -0
- package/bin/ymir-validate.sh +173 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1056 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +44 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +210 -0
- package/scripts/start.sh +167 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-task-inbox-lib.sh - the per-task steering inbox: durable records plus a
|
|
3
|
+
# constant doorbell.
|
|
4
|
+
#
|
|
5
|
+
# ONE owner of the steering-inbox contract: the record format, sequence
|
|
6
|
+
# allocation, the idempotent re-enqueue dedup, the handled/ acknowledgement,
|
|
7
|
+
# the self-describing doorbell line, and the watcher's re-ring ladder policy.
|
|
8
|
+
# bin/fm-send.sh writes and rings locally, the host-local remote steer leg
|
|
9
|
+
# (bin/fm-remote-secondmate-control.sh cmd_send) writes idempotently and rings
|
|
10
|
+
# on the remote host, bin/fm-watch.sh polls and re-rings, and the brief
|
|
11
|
+
# scaffold (bin/fm-brief.sh) tells the worker how to read and acknowledge;
|
|
12
|
+
# none of them restates the format.
|
|
13
|
+
#
|
|
14
|
+
# Design (captain-adopted, data/fm-send-reliability-reframe-s1/report.md): the
|
|
15
|
+
# payload moves to the filesystem, which is reliable; the terminal carries only
|
|
16
|
+
# a short constant doorbell line, which does not need to be reliable because
|
|
17
|
+
# ringing it again is free. A duplicated doorbell is a no-op by construction
|
|
18
|
+
# (the worker finds the inbox empty or already handled), a swallowed doorbell
|
|
19
|
+
# is detected by the absence of the worker's acknowledgement and re-rung on a
|
|
20
|
+
# bounded schedule, and a worker that never acknowledges surfaces through the
|
|
21
|
+
# ordinary stale wake into stuck-crewmate-recovery.
|
|
22
|
+
#
|
|
23
|
+
# Layout under <state-dir>:
|
|
24
|
+
# <task>.inbox/NNN.msg one durable steer, numeric sequence, atomic rename
|
|
25
|
+
# <task>.inbox/handled/ the worker's `mv` here IS the acknowledgement
|
|
26
|
+
# <task>.inbox/.seq.lock serializes sequence allocation across writers
|
|
27
|
+
# (the session and the away daemon)
|
|
28
|
+
# <task>.inbox/.ring-state watcher re-ring ladder: "<msg>\t<count>\t<epoch>"
|
|
29
|
+
# <task>.inbox/.escalated oldest-message name already surfaced as stale,
|
|
30
|
+
# so later polls suppress another escalation
|
|
31
|
+
#
|
|
32
|
+
# Record format (fm_task_inbox_write / fm_task_inbox_body):
|
|
33
|
+
# schema=fm-task-inbox.v1
|
|
34
|
+
# at=<utc timestamp>
|
|
35
|
+
# delivery=fire-and-forget present only when the re-ring ladder must ignore it
|
|
36
|
+
# --
|
|
37
|
+
# <exact message text; newlines are legal; a marked secondmate request keeps
|
|
38
|
+
# its from-firstmate marker and corr token verbatim in this body>
|
|
39
|
+
#
|
|
40
|
+
# Sequence numbers are never reused within a task: allocation scans both the
|
|
41
|
+
# inbox root and handled/, so a message is processed at most once per worker
|
|
42
|
+
# lifetime even if every doorbell is duplicated. Concurrent writers serialize
|
|
43
|
+
# on .seq.lock; the worst racing outcome is ordering, never loss.
|
|
44
|
+
#
|
|
45
|
+
# Re-ring ladder (fm_task_inbox_due_action): an unhandled message older than
|
|
46
|
+
# FM_TASK_INBOX_GRACE_SECS is due one delivery attempt per grace period; an
|
|
47
|
+
# attempt may ring or be skipped to protect proven pending composer text. After
|
|
48
|
+
# FM_TASK_INBOX_RING_MAX attempts without an acknowledgement it escalates. The
|
|
49
|
+
# caller owns the busy check (a busy pane just waits - the record is durable and
|
|
50
|
+
# the worker reaches a turn boundary) and the wake emission; this library owns
|
|
51
|
+
# only the schedule. If attempt bookkeeping cannot be persisted while the record
|
|
52
|
+
# remains unhandled, the caller surfaces that failure instead of retrying
|
|
53
|
+
# silently; a concurrently removed inbox is a quiet no-op. Escalation
|
|
54
|
+
# deliberately queues the wake before writing the
|
|
55
|
+
# deduplication marker: normal polls surface a message once, while a crash or
|
|
56
|
+
# marker failure may produce a rare duplicate rather than silently lose a wake.
|
|
57
|
+
#
|
|
58
|
+
# fm_task_inbox_ring requires bin/fm-backend.sh's dispatch (sourced below); the
|
|
59
|
+
# other helpers are dependency-light. Sourced by bin/fm-send.sh, bin/fm-watch.sh,
|
|
60
|
+
# and tests. No side effects on source beyond its sourced libraries.
|
|
61
|
+
#
|
|
62
|
+
# Tunables (env):
|
|
63
|
+
# FM_TASK_INBOX_GRACE_SECS default 90; delivery-attempt grace and spacing
|
|
64
|
+
# FM_TASK_INBOX_RING_MAX default 3; delivery attempts before escalation
|
|
65
|
+
|
|
66
|
+
_FM_TASK_INBOX_LIB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
67
|
+
# Both dependencies are canonical lint roots in their own right. Keep them as
|
|
68
|
+
# analysis boundaries here so ShellCheck's external-source traversal does not
|
|
69
|
+
# recursively duplicate the full backend graph for every inbox consumer.
|
|
70
|
+
# shellcheck source=/dev/null
|
|
71
|
+
. "$_FM_TASK_INBOX_LIB_DIR/fm-wake-lib.sh"
|
|
72
|
+
# shellcheck source=/dev/null
|
|
73
|
+
. "$_FM_TASK_INBOX_LIB_DIR/fm-backend.sh"
|
|
74
|
+
|
|
75
|
+
FM_TASK_INBOX_SCHEMA='fm-task-inbox.v1'
|
|
76
|
+
FM_TASK_INBOX_GRACE_DEFAULT=90
|
|
77
|
+
FM_TASK_INBOX_RING_MAX_DEFAULT=3
|
|
78
|
+
FM_TASK_INBOX_LOCK_WAIT_DEFAULT=5
|
|
79
|
+
|
|
80
|
+
fm_task_inbox_grace_secs() {
|
|
81
|
+
local g=${FM_TASK_INBOX_GRACE_SECS:-$FM_TASK_INBOX_GRACE_DEFAULT}
|
|
82
|
+
case "$g" in ''|*[!0-9]*) g=$FM_TASK_INBOX_GRACE_DEFAULT ;; esac
|
|
83
|
+
printf '%s' "$g"
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fm_task_inbox_ring_max() {
|
|
87
|
+
local m=${FM_TASK_INBOX_RING_MAX:-$FM_TASK_INBOX_RING_MAX_DEFAULT}
|
|
88
|
+
case "$m" in ''|*[!0-9]*) m=$FM_TASK_INBOX_RING_MAX_DEFAULT ;; esac
|
|
89
|
+
printf '%s' "$m"
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
fm_task_inbox_dir() { # <state-dir> <task-id>
|
|
93
|
+
printf '%s/%s.inbox' "$1" "$2"
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
fm_task_inbox_handled_dir() { # <state-dir> <task-id>
|
|
97
|
+
printf '%s/%s.inbox/handled' "$1" "$2"
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
# Numeric sequence of one record basename, or fail for a non-record name.
|
|
101
|
+
fm_task_inbox_seq_of() { # <basename>
|
|
102
|
+
local n=${1%.msg}
|
|
103
|
+
[ "$n" != "$1" ] || return 1
|
|
104
|
+
case "$n" in ''|*[!0-9]*) return 1 ;; esac
|
|
105
|
+
printf '%s' "$((10#$n))"
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
# Next unused sequence, scanning the inbox root AND handled/ so an
|
|
109
|
+
# acknowledged sequence is never reissued. Caller must hold .seq.lock.
|
|
110
|
+
fm_task_inbox_next_seq() { # <inbox-dir>
|
|
111
|
+
local dir=$1 max=0 d f n
|
|
112
|
+
for d in "$dir" "$dir/handled"; do
|
|
113
|
+
for f in "$d"/*.msg; do
|
|
114
|
+
[ -e "$f" ] || continue
|
|
115
|
+
n=$(fm_task_inbox_seq_of "${f##*/}") || continue
|
|
116
|
+
[ "$n" -le "$max" ] || max=$n
|
|
117
|
+
done
|
|
118
|
+
done
|
|
119
|
+
printf '%03d' "$((max + 1))"
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
fm_task_inbox_lock_acquire() { # <lock-path>
|
|
123
|
+
local lock=$1 wait=${FM_TASK_INBOX_LOCK_WAIT_SECS:-$FM_TASK_INBOX_LOCK_WAIT_DEFAULT}
|
|
124
|
+
local deadline probe
|
|
125
|
+
case "$wait" in ''|*[!0-9]*) wait=$FM_TASK_INBOX_LOCK_WAIT_DEFAULT ;; esac
|
|
126
|
+
probe=$(mktemp "${lock%/*}/.lock-probe.XXXXXX") || return 1
|
|
127
|
+
rm -f "$probe" || return 1
|
|
128
|
+
if [ ! -e "$lock" ] && [ ! -L "$lock" ]; then
|
|
129
|
+
fm_lock_try_create "$lock" && return 0
|
|
130
|
+
[ -e "$lock" ] || [ -L "$lock" ] || return 1
|
|
131
|
+
fi
|
|
132
|
+
deadline=$(( $(date +%s) + wait ))
|
|
133
|
+
while ! fm_lock_try_acquire "$lock"; do
|
|
134
|
+
[ "$(date +%s)" -lt "$deadline" ] || return 1
|
|
135
|
+
sleep 0.1
|
|
136
|
+
done
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# Write one record into the next sequence slot: temp-write, then atomic
|
|
140
|
+
# rename. Prints the record path. Caller must hold .seq.lock.
|
|
141
|
+
_fm_task_inbox_write_record_locked() { # <inbox-dir> <text> [delivery-mode]
|
|
142
|
+
local dir=$1 text=$2 delivery_mode=${3:-} seq tmp rec status=0
|
|
143
|
+
seq=$(fm_task_inbox_next_seq "$dir")
|
|
144
|
+
rec="$dir/$seq.msg"
|
|
145
|
+
tmp=$(mktemp "$dir/.staging.XXXXXX") || return 1
|
|
146
|
+
{
|
|
147
|
+
printf 'schema=%s\n' "$FM_TASK_INBOX_SCHEMA"
|
|
148
|
+
printf 'at=%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
149
|
+
[ "$delivery_mode" != fire-and-forget ] || printf 'delivery=fire-and-forget\n'
|
|
150
|
+
printf -- '--\n'
|
|
151
|
+
printf '%s' "$text"
|
|
152
|
+
} > "$tmp" && mv "$tmp" "$rec" || status=1
|
|
153
|
+
[ "$status" -eq 0 ] || { rm -f "$tmp"; return 1; }
|
|
154
|
+
printf '%s' "$rec"
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
# Durably enqueue one steer: temp-write, then atomic rename into the next
|
|
158
|
+
# sequence slot. Prints the record path. Fails without a partial record.
|
|
159
|
+
fm_task_inbox_write() { # <state-dir> <task-id> <text> [delivery-mode]
|
|
160
|
+
local state=$1 task=$2 text=$3 delivery_mode=${4:-} dir lock rec status=0
|
|
161
|
+
dir=$(fm_task_inbox_dir "$state" "$task")
|
|
162
|
+
mkdir -p "$dir/handled" || return 1
|
|
163
|
+
lock="$dir/.seq.lock"
|
|
164
|
+
fm_task_inbox_lock_acquire "$lock" || return 1
|
|
165
|
+
rec=$(_fm_task_inbox_write_record_locked "$dir" "$text" "$delivery_mode") || status=1
|
|
166
|
+
fm_lock_release "$lock"
|
|
167
|
+
[ "$status" -eq 0 ] || return 1
|
|
168
|
+
printf '%s' "$rec"
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
# Durably enqueue one steer at most once: when a record with the exact same
|
|
172
|
+
# body already exists - unhandled or already acknowledged in handled/ - no new
|
|
173
|
+
# record is written and the existing record's path is printed instead.
|
|
174
|
+
# This is the enqueue primitive for a transport that can fail with completion
|
|
175
|
+
# unknown (the remote steer leg over ssh): the caller's safe recovery is to run
|
|
176
|
+
# the same enqueue again, and this dedup is what makes the re-run land on the
|
|
177
|
+
# same record instead of a duplicate the worker would act on twice. Two
|
|
178
|
+
# distinct logical requests never collapse in practice because a marked
|
|
179
|
+
# secondmate request embeds a per-request correlation token in its body. The
|
|
180
|
+
# local plane keeps plain fm_task_inbox_write: its outcome is synchronous, so
|
|
181
|
+
# a repeated identical local steer is a deliberate new instruction.
|
|
182
|
+
fm_task_inbox_write_idempotent() { # <state-dir> <task-id> <text> [delivery-mode]
|
|
183
|
+
local state=$1 task=$2 text=$3 delivery_mode=${4:-} dir lock want have f rec='' status=0
|
|
184
|
+
dir=$(fm_task_inbox_dir "$state" "$task")
|
|
185
|
+
mkdir -p "$dir/handled" || return 1
|
|
186
|
+
lock="$dir/.seq.lock"
|
|
187
|
+
fm_task_inbox_lock_acquire "$lock" || return 1
|
|
188
|
+
if want=$(mktemp "$dir/.dedup.XXXXXX") && have=$(mktemp "$dir/.dedup.XXXXXX"); then
|
|
189
|
+
if printf '%s' "$text" > "$want"; then
|
|
190
|
+
for f in "$dir"/*.msg "$dir/handled"/*.msg; do
|
|
191
|
+
if [ ! -e "$f" ]; then
|
|
192
|
+
case "$f" in
|
|
193
|
+
"$dir"/*.msg)
|
|
194
|
+
f="$dir/handled/${f##*/}"
|
|
195
|
+
[ -e "$f" ] || continue
|
|
196
|
+
;;
|
|
197
|
+
*) continue ;;
|
|
198
|
+
esac
|
|
199
|
+
fi
|
|
200
|
+
if [ "$delivery_mode" = fire-and-forget ]; then
|
|
201
|
+
fm_task_inbox_is_fire_and_forget "$f" || continue
|
|
202
|
+
elif fm_task_inbox_is_fire_and_forget "$f"; then
|
|
203
|
+
continue
|
|
204
|
+
fi
|
|
205
|
+
if ! fm_task_inbox_body "$f" > "$have" 2>/dev/null; then
|
|
206
|
+
case "$f" in
|
|
207
|
+
"$dir"/*.msg)
|
|
208
|
+
f="$dir/handled/${f##*/}"
|
|
209
|
+
fm_task_inbox_body "$f" > "$have" 2>/dev/null || continue
|
|
210
|
+
;;
|
|
211
|
+
*) continue ;;
|
|
212
|
+
esac
|
|
213
|
+
fi
|
|
214
|
+
cmp -s "$want" "$have" || continue
|
|
215
|
+
[ ! -e "$dir/handled/${f##*/}" ] || f="$dir/handled/${f##*/}"
|
|
216
|
+
rec=$f
|
|
217
|
+
break
|
|
218
|
+
done
|
|
219
|
+
else
|
|
220
|
+
status=1
|
|
221
|
+
fi
|
|
222
|
+
rm -f "$want" "$have"
|
|
223
|
+
else
|
|
224
|
+
rm -f "${want:-}" 2>/dev/null || true
|
|
225
|
+
status=1
|
|
226
|
+
fi
|
|
227
|
+
if [ "$status" -eq 0 ] && [ -z "$rec" ]; then
|
|
228
|
+
rec=$(_fm_task_inbox_write_record_locked "$dir" "$text" "$delivery_mode") || status=1
|
|
229
|
+
fi
|
|
230
|
+
fm_lock_release "$lock"
|
|
231
|
+
[ "$status" -eq 0 ] || return 1
|
|
232
|
+
printf '%s' "$rec"
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
# The exact enqueued text back out of a record.
|
|
236
|
+
fm_task_inbox_body() { # <record-path>
|
|
237
|
+
local line
|
|
238
|
+
[ -f "$1" ] || return 1
|
|
239
|
+
while IFS= read -r line; do
|
|
240
|
+
if [ "$line" = -- ]; then
|
|
241
|
+
cat
|
|
242
|
+
return 0
|
|
243
|
+
fi
|
|
244
|
+
done < "$1"
|
|
245
|
+
return 1
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
# The constant self-describing doorbell line for the inbox containing a record.
|
|
249
|
+
# Self-describing on purpose: a worker whose brief predates the inbox contract
|
|
250
|
+
# still receives the complete instruction in the line itself.
|
|
251
|
+
fm_task_inbox_doorbell_line() { # <record-path>
|
|
252
|
+
local dir=${1%/*} abs
|
|
253
|
+
abs=$(cd "$dir" 2>/dev/null && pwd) || abs=$dir
|
|
254
|
+
printf 'Firstmate instruction waiting: list %s/*.msg and, in numeric order, read and act on each, then mv each handled file to %s/handled/.' \
|
|
255
|
+
"$abs" "$abs"
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
# Ring the doorbell, best-effort: one advisory composer pre-check, then the
|
|
259
|
+
# backend's submit machinery with a minimal retry budget, verdict discarded.
|
|
260
|
+
# Returns 0 rang, 1 skipped because the composer PROVENLY holds pending text
|
|
261
|
+
# (the watcher re-rings later), 2 the backend send failed. No return value is
|
|
262
|
+
# delivery proof; the acknowledgement move is the only delivery signal.
|
|
263
|
+
# The skip is deliberately narrow: only an exact `pending` verdict defers,
|
|
264
|
+
# because there our Enter could submit someone's real half-typed content.
|
|
265
|
+
# `pending-unproven` and `unknown` still ring - the worst outcome is a garbled
|
|
266
|
+
# CONSTANT line the worker recovers semantically, while skipping on ambiguous
|
|
267
|
+
# verdicts would starve a harness whose idle screen the classifier cannot
|
|
268
|
+
# positively identify (that classifier is advisory here by design).
|
|
269
|
+
fm_task_inbox_ring() { # <backend> <target> <record-path> [expected-label]
|
|
270
|
+
local backend=$1 target=$2 rec=$3 label=${4:-} line cstate verdict
|
|
271
|
+
line=$(fm_task_inbox_doorbell_line "$rec")
|
|
272
|
+
cstate=$(fm_backend_composer_state "$backend" "$target" "$label" 2>/dev/null) || cstate=unknown
|
|
273
|
+
case "$cstate" in
|
|
274
|
+
pending) return 1 ;;
|
|
275
|
+
esac
|
|
276
|
+
if ! verdict=$(fm_backend_send_text_submit "$backend" "$target" "$line" 1 0.4 0.3 "$label" 2>/dev/null); then
|
|
277
|
+
return 2
|
|
278
|
+
fi
|
|
279
|
+
# The verdict is read only to report a failed keystroke; every other value
|
|
280
|
+
# (empty, pending, unknown, ...) is deliberately ignored, never proof.
|
|
281
|
+
[ "$verdict" != send-failed ] || return 2
|
|
282
|
+
return 0
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
fm_task_inbox_is_fire_and_forget() { # <record-path>
|
|
286
|
+
local rec=$1
|
|
287
|
+
if [ ! -f "$rec" ]; then
|
|
288
|
+
rec="${rec%/*}/handled/${rec##*/}"
|
|
289
|
+
[ -f "$rec" ] || return 1
|
|
290
|
+
fi
|
|
291
|
+
awk '
|
|
292
|
+
$0 == "--" { exit }
|
|
293
|
+
$0 == "delivery=fire-and-forget" { found=1 }
|
|
294
|
+
END { exit(found ? 0 : 1) }
|
|
295
|
+
' "$rec"
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
# Oldest escalation-tracked unhandled record, or fail when none is due.
|
|
299
|
+
fm_task_inbox_oldest_unhandled() { # <state-dir> <task-id>
|
|
300
|
+
local dir best='' best_n=0 f n
|
|
301
|
+
dir=$(fm_task_inbox_dir "$1" "$2")
|
|
302
|
+
for f in "$dir"/*.msg; do
|
|
303
|
+
[ -e "$f" ] || continue
|
|
304
|
+
fm_task_inbox_is_fire_and_forget "$f" && continue
|
|
305
|
+
n=$(fm_task_inbox_seq_of "${f##*/}") || continue
|
|
306
|
+
if [ -z "$best" ] || [ "$n" -lt "$best_n" ]; then
|
|
307
|
+
best=$f
|
|
308
|
+
best_n=$n
|
|
309
|
+
fi
|
|
310
|
+
done
|
|
311
|
+
[ -n "$best" ] || return 1
|
|
312
|
+
printf '%s' "$best"
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
# The re-ring ladder decision for one task. Prints exactly one of:
|
|
316
|
+
# quiet nothing due (healthy, within grace or spacing,
|
|
317
|
+
# or already escalated for the current oldest)
|
|
318
|
+
# ring <record-path> one doorbell re-ring is due
|
|
319
|
+
# escalate <record-path> <count> attempt budget spent; surface as stale
|
|
320
|
+
# An empty inbox also resets the ladder bookkeeping so the next message starts
|
|
321
|
+
# a fresh ladder.
|
|
322
|
+
fm_task_inbox_due_action() { # <state-dir> <task-id>
|
|
323
|
+
local dir oldest base now grace max ladder rec_base count last
|
|
324
|
+
dir=$(fm_task_inbox_dir "$1" "$2")
|
|
325
|
+
if ! oldest=$(fm_task_inbox_oldest_unhandled "$1" "$2"); then
|
|
326
|
+
rm -f "$dir/.ring-state" "$dir/.escalated" 2>/dev/null || true
|
|
327
|
+
printf 'quiet'
|
|
328
|
+
return 0
|
|
329
|
+
fi
|
|
330
|
+
base=${oldest##*/}
|
|
331
|
+
grace=$(fm_task_inbox_grace_secs)
|
|
332
|
+
if [ "$(fm_path_age "$oldest")" -lt "$grace" ]; then
|
|
333
|
+
printf 'quiet'
|
|
334
|
+
return 0
|
|
335
|
+
fi
|
|
336
|
+
count=0
|
|
337
|
+
last=0
|
|
338
|
+
ladder=$(cat "$dir/.ring-state" 2>/dev/null || true)
|
|
339
|
+
IFS=$(printf '\t') read -r rec_base count last <<EOF
|
|
340
|
+
$ladder
|
|
341
|
+
EOF
|
|
342
|
+
if [ "$rec_base" != "$base" ]; then
|
|
343
|
+
# A different (or first) oldest message: the previous ladder is stale.
|
|
344
|
+
count=0
|
|
345
|
+
last=0
|
|
346
|
+
rm -f "$dir/.escalated" 2>/dev/null || true
|
|
347
|
+
fi
|
|
348
|
+
case "$count" in ''|*[!0-9]*) count=0 ;; esac
|
|
349
|
+
case "$last" in ''|*[!0-9]*) last=0 ;; esac
|
|
350
|
+
if [ "$(cat "$dir/.escalated" 2>/dev/null || true)" = "$base" ]; then
|
|
351
|
+
printf 'quiet'
|
|
352
|
+
return 0
|
|
353
|
+
fi
|
|
354
|
+
max=$(fm_task_inbox_ring_max)
|
|
355
|
+
if [ "$count" -ge "$max" ]; then
|
|
356
|
+
printf 'escalate %s %s' "$oldest" "$count"
|
|
357
|
+
return 0
|
|
358
|
+
fi
|
|
359
|
+
now=$(date +%s)
|
|
360
|
+
if [ "$((now - last))" -lt "$grace" ]; then
|
|
361
|
+
printf 'quiet'
|
|
362
|
+
return 0
|
|
363
|
+
fi
|
|
364
|
+
printf 'ring %s' "$oldest"
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
# Advance the ladder after a delivery attempt. A failed ring or a composer-
|
|
368
|
+
# protected skip still consumes budget so neither a dead pane nor permanently
|
|
369
|
+
# blocked composer can retry silently forever. A concurrently removed inbox is
|
|
370
|
+
# a successful no-op; otherwise failure means the caller must surface the
|
|
371
|
+
# unwritable ladder while the record remains unhandled.
|
|
372
|
+
fm_task_inbox_record_ring() { # <state-dir> <task-id> <record-path>
|
|
373
|
+
local dir base ladder rec_base count last
|
|
374
|
+
dir=$(fm_task_inbox_dir "$1" "$2")
|
|
375
|
+
base=${3##*/}
|
|
376
|
+
count=0
|
|
377
|
+
ladder=$(cat "$dir/.ring-state" 2>/dev/null || true)
|
|
378
|
+
IFS=$(printf '\t') read -r rec_base count last <<EOF
|
|
379
|
+
$ladder
|
|
380
|
+
EOF
|
|
381
|
+
[ "$rec_base" = "$base" ] || count=0
|
|
382
|
+
case "$count" in ''|*[!0-9]*) count=0 ;; esac
|
|
383
|
+
[ -d "$dir" ] || return 0
|
|
384
|
+
if ! { printf '%s\t%s\t%s\n' "$base" "$((count + 1))" "$(date +%s)" > "$dir/.ring-state"; } 2>/dev/null; then
|
|
385
|
+
[ -d "$dir" ] || return 0
|
|
386
|
+
return 1
|
|
387
|
+
fi
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
# Mark the current oldest as escalated after its stale wake is durably queued,
|
|
391
|
+
# suppressing another wake on later polls. Wake-before-marker ordering favors
|
|
392
|
+
# at-least-once recovery: a crash or marker failure can cause a rare duplicate;
|
|
393
|
+
# stuck-crewmate-recovery owns the message from here.
|
|
394
|
+
fm_task_inbox_record_escalated() { # <state-dir> <task-id> <record-path>
|
|
395
|
+
local dir
|
|
396
|
+
dir=$(fm_task_inbox_dir "$1" "$2")
|
|
397
|
+
[ -d "$dir" ] || return 0
|
|
398
|
+
if ! { printf '%s\n' "${3##*/}" > "$dir/.escalated"; } 2>/dev/null; then
|
|
399
|
+
[ -d "$dir" ] || return 0
|
|
400
|
+
return 1
|
|
401
|
+
fi
|
|
402
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# shellcheck shell=bash
|
|
2
|
+
# Shared tasks-axi backend selection and compatibility probe for bootstrap,
|
|
3
|
+
# teardown, and secondmate backlog handoff.
|
|
4
|
+
# Usage: . bin/fm-tasks-axi-lib.sh
|
|
5
|
+
#
|
|
6
|
+
# Compatible means tasks-axi --version reports FM_TASKS_AXI_MIN or newer,
|
|
7
|
+
# `tasks-axi update --help` exposes --archive-body for recoverable note rewrites,
|
|
8
|
+
# and `tasks-axi mv --help` exposes [<id>...] for atomic multi-ID moves required
|
|
9
|
+
# by secondmate handoffs.
|
|
10
|
+
# FM_TASKS_AXI_MIN follows the axi-family floor policy owned beside the floor
|
|
11
|
+
# constants in bin/fm-bootstrap.sh.
|
|
12
|
+
# The feature probes are a separate concern and stay as defense in depth for
|
|
13
|
+
# stripped or forked builds that advertise a current version without those flags.
|
|
14
|
+
# `config/backlog-backend=manual` opts out of tasks-axi for routine firstmate
|
|
15
|
+
# backlog mutations, but validated secondmate handoffs always use `tasks-axi mv`.
|
|
16
|
+
# Absent or any other value keeps the default tasks-axi backend path, falling
|
|
17
|
+
# back to manual mutation when the tool is not compatible.
|
|
18
|
+
#
|
|
19
|
+
# This file is the single owner of FM_TASKS_AXI_MIN. bin/fm-bootstrap.sh turns a
|
|
20
|
+
# failing check into the operator-facing MISSING diagnostic.
|
|
21
|
+
#
|
|
22
|
+
# COMPATIBILITY VERDICT REUSE. fm_tasks_axi_compatible costs three tasks-axi
|
|
23
|
+
# subprocesses, and one session start needs the same verdict twice: once in
|
|
24
|
+
# bin/fm-session-start.sh's backlog listing and once in the bin/fm-bootstrap.sh
|
|
25
|
+
# child it runs. Two reuse layers collapse that to a single probe:
|
|
26
|
+
# - Within a process the first probe's answer is memoised.
|
|
27
|
+
# - Across ONE process hop, a parent that already holds the verdict passes it
|
|
28
|
+
# in FM_TASKS_AXI_COMPATIBLE=0|1. Sourcing this file CONSUMES that variable
|
|
29
|
+
# (it is unset from the environment and kept only as a private shell
|
|
30
|
+
# variable), so the verdict reaches the child that needs it and never leaks
|
|
31
|
+
# onward into a spawned agent's environment, where it could outlive a
|
|
32
|
+
# tasks-axi upgrade. Any value other than exactly 0 or 1 is ignored and the
|
|
33
|
+
# probe runs normally.
|
|
34
|
+
# Both layers are bounded by process lifetime, so a tasks-axi install or upgrade
|
|
35
|
+
# is picked up by the next process rather than being cached to disk.
|
|
36
|
+
|
|
37
|
+
FM_TASKS_AXI_MIN=0.2.4
|
|
38
|
+
|
|
39
|
+
FM_TASKS_AXI_COMPATIBLE_MEMO=${FM_TASKS_AXI_COMPATIBLE:-}
|
|
40
|
+
unset FM_TASKS_AXI_COMPATIBLE
|
|
41
|
+
case "$FM_TASKS_AXI_COMPATIBLE_MEMO" in
|
|
42
|
+
0|1) ;;
|
|
43
|
+
*) FM_TASKS_AXI_COMPATIBLE_MEMO= ;;
|
|
44
|
+
esac
|
|
45
|
+
|
|
46
|
+
fm_tasks_axi_version_parts() {
|
|
47
|
+
local output
|
|
48
|
+
command -v tasks-axi >/dev/null 2>&1 || return 1
|
|
49
|
+
output=$(tasks-axi --version 2>/dev/null) || return 1
|
|
50
|
+
printf '%s\n' "$output" |
|
|
51
|
+
sed -n 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1 \2 \3/p' |
|
|
52
|
+
head -1
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
fm_tasks_axi_compatible() {
|
|
56
|
+
case "$FM_TASKS_AXI_COMPATIBLE_MEMO" in
|
|
57
|
+
1) return 0 ;;
|
|
58
|
+
0) return 1 ;;
|
|
59
|
+
esac
|
|
60
|
+
if fm_tasks_axi_compatible_probe; then
|
|
61
|
+
FM_TASKS_AXI_COMPATIBLE_MEMO=1
|
|
62
|
+
return 0
|
|
63
|
+
fi
|
|
64
|
+
FM_TASKS_AXI_COMPATIBLE_MEMO=0
|
|
65
|
+
return 1
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fm_tasks_axi_compatible_probe() {
|
|
69
|
+
local parts major minor patch extra
|
|
70
|
+
local min_major min_minor min_patch min_extra
|
|
71
|
+
parts=$(fm_tasks_axi_version_parts) || return 1
|
|
72
|
+
[ -n "$parts" ] || return 1
|
|
73
|
+
IFS=' ' read -r major minor patch extra <<< "$parts"
|
|
74
|
+
# An unparseable version is incompatible, never assumed current, so a
|
|
75
|
+
# development or vendored build cannot pass a floor it was never checked against.
|
|
76
|
+
[ -n "$major" ] && [ -n "$minor" ] && [ -n "$patch" ] && [ -z "$extra" ] || return 1
|
|
77
|
+
IFS='.' read -r min_major min_minor min_patch min_extra <<< "$FM_TASKS_AXI_MIN"
|
|
78
|
+
[ -n "$min_major" ] && [ -n "$min_minor" ] && [ -n "$min_patch" ] && [ -z "$min_extra" ] || return 1
|
|
79
|
+
if [ "$major" -gt "$min_major" ] ||
|
|
80
|
+
{ [ "$major" -eq "$min_major" ] && [ "$minor" -gt "$min_minor" ]; } ||
|
|
81
|
+
{ [ "$major" -eq "$min_major" ] && [ "$minor" -eq "$min_minor" ] && [ "$patch" -ge "$min_patch" ]; }; then
|
|
82
|
+
fm_tasks_axi_update_has_archive_body && fm_tasks_axi_mv_has_multi_id
|
|
83
|
+
return $?
|
|
84
|
+
fi
|
|
85
|
+
return 1
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
fm_tasks_axi_update_has_archive_body() {
|
|
89
|
+
local output
|
|
90
|
+
command -v tasks-axi >/dev/null 2>&1 || return 1
|
|
91
|
+
output=$(tasks-axi update --help 2>&1) || return 1
|
|
92
|
+
printf '%s\n' "$output" | grep -F -- '--archive-body' >/dev/null
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
fm_tasks_axi_mv_has_multi_id() {
|
|
96
|
+
local output
|
|
97
|
+
command -v tasks-axi >/dev/null 2>&1 || return 1
|
|
98
|
+
output=$(tasks-axi mv --help 2>&1) || return 1
|
|
99
|
+
printf '%s\n' "$output" | grep -F -- '[<id>...]' >/dev/null
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
fm_backlog_backend_value() {
|
|
103
|
+
local config_dir=$1 backend_file value
|
|
104
|
+
backend_file="$config_dir/backlog-backend"
|
|
105
|
+
if [ -f "$backend_file" ]; then
|
|
106
|
+
value=$(tr -d '[:space:]' < "$backend_file" 2>/dev/null || true)
|
|
107
|
+
[ -n "$value" ] || value=tasks-axi
|
|
108
|
+
printf '%s\n' "$value"
|
|
109
|
+
return 0
|
|
110
|
+
fi
|
|
111
|
+
printf '%s\n' tasks-axi
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fm_backlog_backend_manual() {
|
|
115
|
+
local config_dir=$1
|
|
116
|
+
[ "$(fm_backlog_backend_value "$config_dir")" = manual ]
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
fm_tasks_axi_backend_available() {
|
|
120
|
+
local config_dir=$1
|
|
121
|
+
fm_backlog_backend_manual "$config_dir" && return 1
|
|
122
|
+
fm_tasks_axi_compatible
|
|
123
|
+
}
|