@zerwiz/ymir 0.1.3 โ 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +290 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml +50 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +9 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/config/tailscale-sync.yaml +27 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/kaia.engram +0 -0
- package/.agents/memory/kaia.engram-shm +0 -0
- package/.agents/memory/kaia.engram-wal +0 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/memory/well/episodes.jsonl +367 -0
- package/.agents/memory/well/workspace.jsonl +27 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +111 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +70 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +52 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +34 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +454 -0
- package/CHANGELOG.md +881 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +113 -39
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +65 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +58 -0
- package/RULES/07-config.md +45 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/README.md +20 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +98 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +233 -0
- package/bin/apodex-smoke-test.sh +92 -0
- package/bin/bifrost-bridge.sh +112 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +107 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +38 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-guard.sh +165 -0
- package/bin/crash-sense.sh +160 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +207 -0
- package/bin/eindri-acclaim.sh +34 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seen.sh +41 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +85 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +112 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/fleet-apply.sh +68 -0
- package/bin/github-deploy.sh +81 -0
- package/bin/gjallarhorn-expose.sh +102 -0
- package/bin/gjallarhorn-notify.sh +58 -0
- package/bin/gjallarhorn-purge.sh +54 -0
- package/bin/gjallarhorn-tunnel.sh +72 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +122 -0
- package/bin/hall-snapshot.sh +92 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +431 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hoard-lib.sh +25 -0
- package/bin/hodd.sh +78 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +108 -0
- package/bin/local-model-lock.sh +51 -0
- package/bin/mimir-bridge.py +226 -0
- package/bin/mimir-bridge.sh +87 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +59 -0
- package/bin/mjollnir.sh +85 -0
- package/bin/model-hardware.sh +82 -0
- package/bin/model-resolve.sh +147 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +148 -0
- package/bin/omarchy-plugins.sh +174 -0
- package/bin/omarchy-sense.sh +149 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +38 -0
- package/bin/project-git.sh +55 -0
- package/bin/public-guard.sh +70 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +91 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +90 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +76 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +190 -0
- package/bin/telegram-bot.sh +69 -0
- package/bin/toolchain.sh +74 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +260 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +47 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +150 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +641 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +97 -0
- package/bin/ymir-setup-auth.sh +108 -0
- package/bin/ymir-validate.sh +173 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1056 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +44 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +210 -0
- package/scripts/start.sh +167 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Behavior tests for the semantic busy-state contract (bin/fm-busy-lib.sh and
|
|
3
|
+
# its only writer bin/fm-busy-event.sh).
|
|
4
|
+
#
|
|
5
|
+
# Covers the captain-approved redesign invariants: busy/idle/unknown/dead with
|
|
6
|
+
# explicit source attribution; missing, malformed, stale (gen-mismatch), and
|
|
7
|
+
# untrusted (source-mismatch) semantic data classify unknown - never idle;
|
|
8
|
+
# adapter isolation (one adapter's writer or Grok's regex can never classify
|
|
9
|
+
# another adapter); endpoint death is the only process-level override and
|
|
10
|
+
# yields dead, never busy; converted adapters never classify from rendered
|
|
11
|
+
# footer text. All hermetic over temp dirs; no real agent session is invoked.
|
|
12
|
+
set -u
|
|
13
|
+
|
|
14
|
+
# shellcheck source=tests/lib.sh
|
|
15
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
16
|
+
|
|
17
|
+
# shellcheck source=/dev/null
|
|
18
|
+
. "$ROOT/bin/fm-busy-lib.sh"
|
|
19
|
+
|
|
20
|
+
TMP_ROOT=$(fm_test_tmproot fm-busy-state)
|
|
21
|
+
EV="$ROOT/bin/fm-busy-event.sh"
|
|
22
|
+
|
|
23
|
+
new_state_dir() { # <name>
|
|
24
|
+
local d="$TMP_ROOT/$1/state"
|
|
25
|
+
mkdir -p "$d"
|
|
26
|
+
printf '%s' "$d"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# --- writer: arm and apply ---------------------------------------------------
|
|
30
|
+
|
|
31
|
+
test_arm_seeds_busy_spawn() {
|
|
32
|
+
local state gen out
|
|
33
|
+
state=$(new_state_dir arm-seed)
|
|
34
|
+
gen=$("$EV" arm "$state" t1) || fail "arm failed"
|
|
35
|
+
[ -f "$state/t1.busy-gen" ] || fail "arm did not write the gen sidecar"
|
|
36
|
+
[ "$(cat "$state/t1.busy-gen")" = "$gen" ] || fail "sidecar gen does not match printed gen"
|
|
37
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
38
|
+
[ "$out" = "busy fm-spawn" ] || fail "seed should classify 'busy fm-spawn', got '$out'"
|
|
39
|
+
pass "arm mints a gen sidecar and seeds busy fm-spawn at seq=1"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
test_apply_advances_seq_and_source() {
|
|
43
|
+
local state gen out seq
|
|
44
|
+
state=$(new_state_dir apply-seq)
|
|
45
|
+
gen=$("$EV" arm "$state" t1)
|
|
46
|
+
"$EV" apply "$state" t1 idle --gen "$gen" --source claude-hook --event stop \
|
|
47
|
+
|| fail "apply idle failed"
|
|
48
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
49
|
+
[ "$out" = "idle claude-hook" ] || fail "expected 'idle claude-hook', got '$out'"
|
|
50
|
+
"$EV" apply "$state" t1 busy --gen "$gen" --source claude-hook --event user-prompt-submit \
|
|
51
|
+
|| fail "apply busy failed"
|
|
52
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
53
|
+
[ "$out" = "busy claude-hook" ] || fail "expected 'busy claude-hook', got '$out'"
|
|
54
|
+
seq=$(fm_busy_record_read "$state" t1 | awk '{print $4}')
|
|
55
|
+
[ "$seq" = 3 ] || fail "expected seq 3 after seed + two applies, got '$seq'"
|
|
56
|
+
pass "apply advances seq under the armed gen and attributes the writing source"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
test_apply_current_gen_reset() {
|
|
60
|
+
local state out
|
|
61
|
+
state=$(new_state_dir apply-current)
|
|
62
|
+
"$EV" arm "$state" t1 >/dev/null
|
|
63
|
+
"$EV" apply "$state" t1 idle --current-gen --source fm-interrupt --event interrupt \
|
|
64
|
+
|| fail "apply --current-gen failed"
|
|
65
|
+
out=$(fm_busy_classify tmux w1 pi t1 "$state")
|
|
66
|
+
[ "$out" = "idle fm-interrupt" ] || fail "expected 'idle fm-interrupt', got '$out'"
|
|
67
|
+
"$EV" apply "$state" t1 unknown --current-gen --source fm-recovery --event relaunch \
|
|
68
|
+
|| fail "apply unknown failed"
|
|
69
|
+
out=$(fm_busy_classify tmux w1 pi t1 "$state")
|
|
70
|
+
[ "$out" = "unknown fm-recovery" ] || fail "expected 'unknown fm-recovery', got '$out'"
|
|
71
|
+
pass "firstmate-owned interrupt and recovery events bind to the current gen"
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
test_apply_unarmed_refused() {
|
|
75
|
+
local state
|
|
76
|
+
state=$(new_state_dir apply-unarmed)
|
|
77
|
+
if "$EV" apply "$state" t1 busy --gen g1.2.3 --source claude-hook --event x 2>/dev/null; then
|
|
78
|
+
fail "apply against an unarmed task must be refused"
|
|
79
|
+
fi
|
|
80
|
+
[ ! -f "$state/t1.busy-state" ] || fail "refused apply must not write a record"
|
|
81
|
+
pass "apply is refused for a task whose busy contract was never armed"
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
test_retire_serializes_and_rejects_stale_gen() {
|
|
85
|
+
local state old_gen new_gen out retire_pid i=0
|
|
86
|
+
state=$(new_state_dir retire)
|
|
87
|
+
old_gen=$("$EV" arm "$state" t1)
|
|
88
|
+
mkdir "$state/t1.busy-state.lock"
|
|
89
|
+
"$EV" retire "$state" t1 --gen "$old_gen" >/dev/null 2>&1 &
|
|
90
|
+
retire_pid=$!
|
|
91
|
+
while [ "$i" -lt 20 ] && ! kill -0 "$retire_pid" 2>/dev/null; do
|
|
92
|
+
i=$((i + 1))
|
|
93
|
+
done
|
|
94
|
+
[ -e "$state/t1.busy-state" ] || fail "retire bypassed the writer lock"
|
|
95
|
+
rmdir "$state/t1.busy-state.lock"
|
|
96
|
+
wait "$retire_pid" || fail "retire failed after acquiring the writer lock"
|
|
97
|
+
[ ! -e "$state/t1.busy-state" ] || fail "retire left the record behind"
|
|
98
|
+
[ ! -e "$state/t1.busy-gen" ] || fail "retire left the gen sidecar behind"
|
|
99
|
+
|
|
100
|
+
new_gen=$("$EV" arm "$state" t1)
|
|
101
|
+
if "$EV" retire "$state" t1 --gen "$old_gen" 2>/dev/null; then
|
|
102
|
+
fail "retire accepted a superseded incarnation"
|
|
103
|
+
fi
|
|
104
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
105
|
+
[ "$out" = "busy fm-spawn" ] || fail "stale retirement changed the new incarnation, got '$out'"
|
|
106
|
+
[ "$(cat "$state/t1.busy-gen")" = "$new_gen" ] || fail "stale retirement changed the new gen"
|
|
107
|
+
pass "retire waits for the writer lock and cannot remove a new incarnation"
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# Regression for issue #2625: the writer lock's stale-lock branch resolved the
|
|
111
|
+
# lock's mtime with `stat -f %m ... || stat -c %Y ...`. On GNU coreutils `-f` is
|
|
112
|
+
# *filesystem* stat, so it consumes the format string as a path, complains on
|
|
113
|
+
# stderr, prints " File: ..." on stdout, and still exits 0 - the GNU form in the
|
|
114
|
+
# fallback never ran. The following `$((now - mtime))` then evaluated the word
|
|
115
|
+
# `File`, which under `set -u` aborted the writer with "File: unbound variable".
|
|
116
|
+
# fm-teardown.sh died there after returning the worktree, leaving state/<id>.meta
|
|
117
|
+
# and friends behind to generate stale wakes forever, and every re-run died
|
|
118
|
+
# identically because the abandoned lock directory was never broken.
|
|
119
|
+
#
|
|
120
|
+
# The stat and uname stubs make this deterministic on any host: the writer must
|
|
121
|
+
# take the Linux path and still break a provably stale lock.
|
|
122
|
+
test_stale_lock_broken_under_gnu_stat() {
|
|
123
|
+
local state gen fakebin real_uname out status
|
|
124
|
+
state=$(new_state_dir gnu-stat-lock)
|
|
125
|
+
gen=$("$EV" arm "$state" t1)
|
|
126
|
+
fakebin=$(fm_fakebin "$TMP_ROOT/gnu-stat-lock")
|
|
127
|
+
real_uname=$(command -v uname)
|
|
128
|
+
|
|
129
|
+
# GNU coreutils semantics, self-contained so no real stat is consulted.
|
|
130
|
+
cat > "$fakebin/stat" <<'SH'
|
|
131
|
+
#!/usr/bin/env bash
|
|
132
|
+
if [ "${1:-}" = -c ] && [ "${2:-}" = %Y ]; then
|
|
133
|
+
printf '%s\n' 1000000000 # long-abandoned lock
|
|
134
|
+
exit 0
|
|
135
|
+
fi
|
|
136
|
+
if [ "${1:-}" = -f ]; then
|
|
137
|
+
echo "stat: cannot read file system information for '$2': No such file or directory" >&2
|
|
138
|
+
shift 2
|
|
139
|
+
printf ' File: "%s"\n' "${1:-}"
|
|
140
|
+
exit 0
|
|
141
|
+
fi
|
|
142
|
+
exit 1
|
|
143
|
+
SH
|
|
144
|
+
chmod +x "$fakebin/stat"
|
|
145
|
+
cat > "$fakebin/uname" <<SH
|
|
146
|
+
#!/usr/bin/env bash
|
|
147
|
+
if [ \$# -eq 0 ]; then printf 'Linux\n'; exit 0; fi
|
|
148
|
+
exec "$real_uname" "\$@"
|
|
149
|
+
SH
|
|
150
|
+
chmod +x "$fakebin/uname"
|
|
151
|
+
|
|
152
|
+
mkdir "$state/t1.busy-state.lock"
|
|
153
|
+
out=$(PATH="$fakebin:$PATH" "$EV" retire "$state" t1 --gen "$gen" 2>&1) && status=0 || status=$?
|
|
154
|
+
case "$out" in
|
|
155
|
+
*'unbound variable'*) fail "the writer still dies on GNU stat output: $out" ;;
|
|
156
|
+
esac
|
|
157
|
+
[ "$status" = 0 ] || fail "retire did not break a provably stale writer lock: $out"
|
|
158
|
+
[ ! -e "$state/t1.busy-state" ] || fail "retire left the record behind"
|
|
159
|
+
[ ! -e "$state/t1.busy-gen" ] || fail "retire left the gen sidecar behind"
|
|
160
|
+
[ ! -e "$state/t1.busy-state.lock" ] || fail "retire left the stale lock behind"
|
|
161
|
+
|
|
162
|
+
# Teardown must be able to run again over the same task without failing.
|
|
163
|
+
PATH="$fakebin:$PATH" "$EV" retire "$state" t1 --current-gen \
|
|
164
|
+
|| fail "a repeated retire over already-cleaned state was not idempotent"
|
|
165
|
+
pass "the writer breaks a stale lock instead of dying on GNU stat output"
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
test_retire_missing_sidecar_is_idempotent() {
|
|
169
|
+
local state gen
|
|
170
|
+
state=$(new_state_dir retire-missing)
|
|
171
|
+
gen=$("$EV" arm "$state" t1)
|
|
172
|
+
rm -f "$state/t1.busy-gen"
|
|
173
|
+
|
|
174
|
+
"$EV" retire "$state" t1 --gen "$gen" || fail "exact-gen retire rejected a missing sidecar"
|
|
175
|
+
[ ! -e "$state/t1.busy-state" ] || fail "retire left an orphan record behind"
|
|
176
|
+
"$EV" retire "$state" t1 --gen "$gen" || fail "repeated exact-gen retire was not idempotent"
|
|
177
|
+
"$EV" retire "$state" t1 --current-gen || fail "current-gen retire was not idempotent"
|
|
178
|
+
|
|
179
|
+
printf 'malformed gen\n' > "$state/t1.busy-gen"
|
|
180
|
+
printf 'orphan\n' > "$state/t1.busy-state"
|
|
181
|
+
if "$EV" retire "$state" t1 --gen "$gen" 2>/dev/null; then
|
|
182
|
+
fail "retire accepted a malformed existing sidecar"
|
|
183
|
+
fi
|
|
184
|
+
[ -e "$state/t1.busy-state" ] || fail "retire removed the record for a malformed existing sidecar"
|
|
185
|
+
pass "retire treats only an absent sidecar as already retired"
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# --- stale event rejection ----------------------------------------------------
|
|
189
|
+
|
|
190
|
+
test_stale_gen_event_rejected() {
|
|
191
|
+
local state old_gen new_gen out
|
|
192
|
+
state=$(new_state_dir stale-event)
|
|
193
|
+
old_gen=$("$EV" arm "$state" t1)
|
|
194
|
+
new_gen=$("$EV" arm "$state" t1)
|
|
195
|
+
[ "$old_gen" != "$new_gen" ] || fail "re-arm must mint a fresh gen"
|
|
196
|
+
if "$EV" apply "$state" t1 idle --gen "$old_gen" --source claude-hook --event stop 2>/dev/null; then
|
|
197
|
+
fail "an event carrying a stale gen must be rejected"
|
|
198
|
+
fi
|
|
199
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
200
|
+
[ "$out" = "busy fm-spawn" ] || fail "stale event must not change the record, got '$out'"
|
|
201
|
+
pass "a late event from a previous incarnation is rejected, record unchanged"
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
test_stale_gen_record_unknown() {
|
|
205
|
+
local state gen out
|
|
206
|
+
state=$(new_state_dir stale-record)
|
|
207
|
+
gen=$("$EV" arm "$state" t1)
|
|
208
|
+
# Simulate a record left behind by a superseded incarnation.
|
|
209
|
+
printf 'g-superseded.1.1\n' > "$state/t1.busy-gen.new"
|
|
210
|
+
mv "$state/t1.busy-gen.new" "$state/t1.busy-gen"
|
|
211
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
212
|
+
[ "$out" = "unknown gen-mismatch" ] || fail "stale record must classify 'unknown gen-mismatch', got '$out'"
|
|
213
|
+
pass "a record from a stale incarnation classifies unknown, never idle"
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
# --- missing and malformed semantic data --------------------------------------
|
|
217
|
+
|
|
218
|
+
test_missing_record_unknown_not_idle() {
|
|
219
|
+
local state out h
|
|
220
|
+
state=$(new_state_dir missing)
|
|
221
|
+
for h in claude opencode pi pi-signed; do
|
|
222
|
+
out=$(fm_busy_classify tmux w1 "$h" t1 "$state")
|
|
223
|
+
[ "$out" = "unknown missing" ] || fail "$h with no record must be 'unknown missing', got '$out'"
|
|
224
|
+
done
|
|
225
|
+
out=$(fm_busy_classify tmux w1 codex t1 "$state")
|
|
226
|
+
[ "$out" = "unknown codex-unverified" ] || fail "codex with no verified source must be 'unknown codex-unverified', got '$out'"
|
|
227
|
+
pass "a converted adapter with no record classifies unknown, never idle"
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
test_malformed_record_unknown() {
|
|
231
|
+
local state gen out
|
|
232
|
+
state=$(new_state_dir malformed)
|
|
233
|
+
gen=$("$EV" arm "$state" t1)
|
|
234
|
+
for bad in \
|
|
235
|
+
'garbage' \
|
|
236
|
+
"v0 gen=$gen seq=1 state=busy source=claude-hook event=x ts=1" \
|
|
237
|
+
"v1 gen=$gen seq=NaN state=busy source=claude-hook event=x ts=1" \
|
|
238
|
+
"v1 gen=$gen seq=1 state=frobbing source=claude-hook event=x ts=1" \
|
|
239
|
+
"v1 gen=$gen seq=1 state=busy source=bad source event=x ts=1" \
|
|
240
|
+
"v1 gen=$gen seq=1 state=busy source=claude-hook event=x ts=1 rogue=1"; do
|
|
241
|
+
printf '%s\n' "$bad" > "$state/t1.busy-state"
|
|
242
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
243
|
+
[ "$out" = "unknown malformed" ] || fail "malformed record '$bad' must be 'unknown malformed', got '$out'"
|
|
244
|
+
done
|
|
245
|
+
printf 'v1 gen=%s seq=1 state=busy source=claude-hook event=x ts=1\nsecond line\n' "$gen" > "$state/t1.busy-state"
|
|
246
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
247
|
+
[ "$out" = "unknown malformed" ] || fail "multi-line record must be 'unknown malformed', got '$out'"
|
|
248
|
+
pass "malformed records classify unknown malformed, never busy or idle"
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
test_record_without_sidecar_unknown() {
|
|
252
|
+
local state out
|
|
253
|
+
state=$(new_state_dir orphan-record)
|
|
254
|
+
printf 'v1 gen=g1.1.1 seq=1 state=busy source=claude-hook event=x ts=1\n' > "$state/t1.busy-state"
|
|
255
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
256
|
+
[ "$out" = "unknown malformed" ] || fail "record without an armed gen must be unknown, got '$out'"
|
|
257
|
+
pass "a record with no armed gen sidecar classifies unknown"
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
# --- adapter isolation ---------------------------------------------------------
|
|
261
|
+
|
|
262
|
+
test_source_mismatch_cross_adapter() {
|
|
263
|
+
local state gen out
|
|
264
|
+
state=$(new_state_dir cross-adapter)
|
|
265
|
+
gen=$("$EV" arm "$state" t1)
|
|
266
|
+
"$EV" apply "$state" t1 busy --gen "$gen" --source pi-ext --event agent-start
|
|
267
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
268
|
+
[ "$out" = "unknown source-mismatch" ] || fail "pi-ext record on a claude task must be untrusted, got '$out'"
|
|
269
|
+
out=$(fm_busy_classify tmux w1 pi t1 "$state")
|
|
270
|
+
[ "$out" = "busy pi-ext" ] || fail "pi-ext record on a pi task must classify, got '$out'"
|
|
271
|
+
out=$(fm_busy_classify tmux w1 grok t1 "$state")
|
|
272
|
+
[ "$out" = "unknown source-mismatch" ] || fail "grok trusts no semantic source, got '$out'"
|
|
273
|
+
pass "a record is trusted only by the adapter whose source wrote it"
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
test_converted_adapters_ignore_footer_text() {
|
|
277
|
+
local state out h
|
|
278
|
+
state=$(new_state_dir no-footer)
|
|
279
|
+
local tail='โข Working (6s โข esc to interrupt)
|
|
280
|
+
โ โ โ โ โฌโฌโฌโฌ esc interrupt
|
|
281
|
+
Working...
|
|
282
|
+
Ctrl+c:cancel'
|
|
283
|
+
for h in claude opencode pi pi-signed; do
|
|
284
|
+
out=$(fm_busy_classify tmux w1 "$h" t1 "$state" "$tail")
|
|
285
|
+
[ "$out" = "unknown missing" ] || fail "$h must never classify from footer text, got '$out'"
|
|
286
|
+
done
|
|
287
|
+
out=$(fm_busy_classify tmux w1 codex t1 "$state" "$tail")
|
|
288
|
+
[ "$out" = "unknown codex-unverified" ] || fail "codex must never classify from footer text, got '$out'"
|
|
289
|
+
pass "converted adapters never classify busy from rendered footer text"
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
test_grok_regex_isolated() {
|
|
293
|
+
local state out
|
|
294
|
+
state=$(new_state_dir grok-arm)
|
|
295
|
+
out=$(fm_busy_classify tmux w1 grok t1 "$state" 'thinking hard
|
|
296
|
+
Ctrl+c:cancel')
|
|
297
|
+
[ "$out" = "busy grok-regex" ] || fail "grok busy tail must classify 'busy grok-regex', got '$out'"
|
|
298
|
+
out=$(fm_busy_classify tmux w1 grok t1 "$state" 'done.
|
|
299
|
+
> ')
|
|
300
|
+
[ "$out" = "idle grok-regex" ] || fail "grok idle tail must classify 'idle grok-regex', got '$out'"
|
|
301
|
+
# Another adapter's footer never makes grok busy either.
|
|
302
|
+
out=$(fm_busy_classify tmux w1 grok t1 "$state" 'โข Working (6s โข esc to interrupt)')
|
|
303
|
+
[ "$out" = "idle grok-regex" ] || fail "a claude footer must not classify grok busy, got '$out'"
|
|
304
|
+
pass "the grok fallback is regex-scoped to grok and classifies only grok tasks"
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
# --- kimi verification gate -----------------------------------------------------
|
|
308
|
+
|
|
309
|
+
test_codex_unverified_gate() {
|
|
310
|
+
local state gen out
|
|
311
|
+
state=$(new_state_dir codex-gate)
|
|
312
|
+
gen=$("$EV" arm "$state" t1)
|
|
313
|
+
"$EV" apply "$state" t1 busy --gen "$gen" --source codex-hook --event user-prompt-submit
|
|
314
|
+
out=$(fm_busy_classify tmux w1 codex t1 "$state")
|
|
315
|
+
[ "$out" = "unknown codex-unverified" ] || fail "unverified codex must classify unknown, got '$out'"
|
|
316
|
+
[ -z "$(fm_busy_sources_for_harness codex)" ] \
|
|
317
|
+
|| fail "codex must trust no semantic source until one is verified"
|
|
318
|
+
pass "codex classifies unknown until a semantic source passes its verification gate"
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
test_kimi_unverified_gate() {
|
|
322
|
+
local state gen out
|
|
323
|
+
state=$(new_state_dir kimi-gate)
|
|
324
|
+
gen=$("$EV" arm "$state" t1)
|
|
325
|
+
"$EV" apply "$state" t1 busy --gen "$gen" --source kimi-hook --event user-prompt-submit
|
|
326
|
+
out=$(fm_busy_classify tmux w1 kimi t1 "$state")
|
|
327
|
+
[ "$out" = "unknown kimi-unverified" ] || fail "unverified kimi must classify unknown, got '$out'"
|
|
328
|
+
out=$(fm_busy_classify tmux w1 kimi t1 "$state" '๐ ยท thinking')
|
|
329
|
+
[ "$out" = "unknown kimi-unverified" ] || fail "kimi must not classify from footer text, got '$out'"
|
|
330
|
+
pass "standalone kimi classifies unknown until the live verification gate opens"
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
test_cursor_ignores_rendered_and_native_signals() {
|
|
334
|
+
local state out
|
|
335
|
+
state=$(new_state_dir cursor-gate)
|
|
336
|
+
# Cursor's verdict comes from its own transcript, never from rendered text.
|
|
337
|
+
# With no binding to fold, the honest answer is unknown - and a rendered
|
|
338
|
+
# busy-looking footer must not change that.
|
|
339
|
+
out=$(fm_busy_classify tmux w1 cursor t1 "$state" 'Working')
|
|
340
|
+
[ "$out" = "unknown cursor-transcript" ] \
|
|
341
|
+
|| fail "cursor must not classify from its rendered footer, got '$out'"
|
|
342
|
+
out=$(fm_busy_classify tmux w1 cursor t1 "$state" 'ctrl+c to stop')
|
|
343
|
+
[ "$out" = "unknown cursor-transcript" ] \
|
|
344
|
+
|| fail "cursor must not classify from the ctrl+c busy token either, got '$out'"
|
|
345
|
+
# Herdr's narrower native streaming state is not cursor's turn lifecycle.
|
|
346
|
+
# shellcheck disable=SC2329 # invoked indirectly through fm_busy_classify
|
|
347
|
+
fm_backend_busy_state() { printf '%s' busy; }
|
|
348
|
+
out=$(fm_busy_classify herdr s:p cursor t1 "$state")
|
|
349
|
+
[ "$out" = "unknown cursor-transcript" ] \
|
|
350
|
+
|| fail "cursor must not borrow herdr's native busy verdict, got '$out'"
|
|
351
|
+
unset -f fm_backend_busy_state
|
|
352
|
+
# The fold is a PULL source: nothing is armed, so no stored record is trusted.
|
|
353
|
+
[ -z "$(fm_busy_sources_for_harness cursor)" ] \
|
|
354
|
+
|| fail "cursor must trust no stored record source; its fold has no writer"
|
|
355
|
+
pass "cursor classifies only from its transcript fold, never rendered text or native state"
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
# --- endpoint death and native fallbacks ----------------------------------------
|
|
359
|
+
|
|
360
|
+
test_dead_endpoint_overrides() {
|
|
361
|
+
local state gen out
|
|
362
|
+
state=$(new_state_dir dead)
|
|
363
|
+
gen=$("$EV" arm "$state" t1)
|
|
364
|
+
# shellcheck disable=SC2329 # invoked indirectly through fm_busy_classify_live
|
|
365
|
+
fm_backend_target_exists() { return 1; }
|
|
366
|
+
out=$(fm_busy_classify_live tmux w1 claude t1 "$state")
|
|
367
|
+
[ "$out" = "dead endpoint-gone" ] || fail "gone endpoint must classify dead, got '$out'"
|
|
368
|
+
# shellcheck disable=SC2329 # invoked indirectly through fm_busy_classify_live
|
|
369
|
+
fm_backend_target_exists() { return 0; }
|
|
370
|
+
out=$(fm_busy_classify_live tmux w1 claude t1 "$state")
|
|
371
|
+
[ "$out" = "busy fm-spawn" ] || fail "live endpoint must fall through to the record, got '$out'"
|
|
372
|
+
out=$(fm_busy_classify_live tmux '' claude t1 "$state")
|
|
373
|
+
[ "$out" = "unknown no-target" ] || fail "empty target must classify unknown, got '$out'"
|
|
374
|
+
unset -f fm_backend_target_exists
|
|
375
|
+
pass "endpoint death is the only process-level override and yields dead, never busy"
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
test_herdr_native_busy_only() {
|
|
379
|
+
local state out
|
|
380
|
+
state=$(new_state_dir herdr-native)
|
|
381
|
+
# shellcheck disable=SC2329 # invoked indirectly through fm_busy_classify
|
|
382
|
+
fm_backend_busy_state() { printf '%s' "$FAKE_NATIVE"; }
|
|
383
|
+
FAKE_NATIVE=busy
|
|
384
|
+
out=$(fm_busy_classify herdr s:p claude t1 "$state")
|
|
385
|
+
[ "$out" = "busy herdr-native" ] || fail "native busy with no record must classify busy, got '$out'"
|
|
386
|
+
FAKE_NATIVE=idle
|
|
387
|
+
out=$(fm_busy_classify herdr s:p claude t1 "$state")
|
|
388
|
+
[ "$out" = "unknown missing" ] || fail "native idle must NOT classify idle, got '$out'"
|
|
389
|
+
# A valid record outranks the native verdict.
|
|
390
|
+
local gen
|
|
391
|
+
gen=$("$EV" arm "$state" t1)
|
|
392
|
+
"$EV" apply "$state" t1 idle --gen "$gen" --source claude-hook --event stop
|
|
393
|
+
FAKE_NATIVE=busy
|
|
394
|
+
out=$(fm_busy_classify herdr s:p claude t1 "$state")
|
|
395
|
+
[ "$out" = "idle claude-hook" ] || fail "the adapter record must outrank herdr's native verdict, got '$out'"
|
|
396
|
+
unset -f fm_backend_busy_state
|
|
397
|
+
pass "herdr's native verdict is trusted for busy only, and records outrank it"
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
# The record parser runs inside sourcing callers (the watcher, the daemon, the
|
|
401
|
+
# crew-state reader), so it must not disturb their shell: no clobbered
|
|
402
|
+
# positional parameters and no changed glob setting.
|
|
403
|
+
test_record_read_leaves_caller_shell_intact() {
|
|
404
|
+
local state out
|
|
405
|
+
state=$(new_state_dir parser-isolation)
|
|
406
|
+
"$EV" arm "$state" t1 >/dev/null
|
|
407
|
+
out=$(bash -c '
|
|
408
|
+
set -f
|
|
409
|
+
. "$1/bin/fm-busy-lib.sh"
|
|
410
|
+
set -- keepme second
|
|
411
|
+
fm_busy_record_read "$2" t1 >/dev/null
|
|
412
|
+
printf "%s|%s|%s" "$1" "$#" "$-"
|
|
413
|
+
' _ "$ROOT" "$state")
|
|
414
|
+
case "$out" in
|
|
415
|
+
keepme\|2\|*f*) : ;;
|
|
416
|
+
*) fail "record parsing disturbed the caller's shell: $out" ;;
|
|
417
|
+
esac
|
|
418
|
+
# A glob-shaped field must survive parsing literally rather than expanding.
|
|
419
|
+
printf 'v1 gen=%s seq=1 state=busy source=* event=x ts=1\n' "$(cat "$state/t1.busy-gen")" \
|
|
420
|
+
> "$state/t1.busy-state"
|
|
421
|
+
out=$(fm_busy_classify tmux w1 claude t1 "$state")
|
|
422
|
+
[ "$out" = "unknown malformed" ] || fail "a glob-shaped source must be rejected, not expanded, got '$out'"
|
|
423
|
+
pass "record parsing never clobbers the caller's positional parameters, glob setting, or fields"
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
test_boolean_view_never_promotes_unknown() {
|
|
427
|
+
local state gen
|
|
428
|
+
state=$(new_state_dir boolean)
|
|
429
|
+
gen=$("$EV" arm "$state" t1)
|
|
430
|
+
fm_busy_is_busy tmux w1 claude t1 "$state" || fail "busy record must read busy"
|
|
431
|
+
"$EV" apply "$state" t1 idle --gen "$gen" --source claude-hook --event stop
|
|
432
|
+
if fm_busy_is_busy tmux w1 claude t1 "$state"; then
|
|
433
|
+
fail "idle record must not read busy"
|
|
434
|
+
fi
|
|
435
|
+
printf 'garbage\n' > "$state/t1.busy-state"
|
|
436
|
+
if fm_busy_is_busy tmux w1 claude t1 "$state"; then
|
|
437
|
+
fail "malformed record must not read busy"
|
|
438
|
+
fi
|
|
439
|
+
pass "the boolean view reports busy only on an exact busy verdict"
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
test_arm_seeds_busy_spawn
|
|
443
|
+
test_apply_advances_seq_and_source
|
|
444
|
+
test_apply_current_gen_reset
|
|
445
|
+
test_apply_unarmed_refused
|
|
446
|
+
test_retire_serializes_and_rejects_stale_gen
|
|
447
|
+
test_retire_missing_sidecar_is_idempotent
|
|
448
|
+
test_stale_lock_broken_under_gnu_stat
|
|
449
|
+
test_stale_gen_event_rejected
|
|
450
|
+
test_stale_gen_record_unknown
|
|
451
|
+
test_missing_record_unknown_not_idle
|
|
452
|
+
test_malformed_record_unknown
|
|
453
|
+
test_record_without_sidecar_unknown
|
|
454
|
+
test_source_mismatch_cross_adapter
|
|
455
|
+
test_converted_adapters_ignore_footer_text
|
|
456
|
+
test_grok_regex_isolated
|
|
457
|
+
test_codex_unverified_gate
|
|
458
|
+
test_kimi_unverified_gate
|
|
459
|
+
test_cursor_ignores_rendered_and_native_signals
|
|
460
|
+
test_dead_endpoint_overrides
|
|
461
|
+
test_herdr_native_busy_only
|
|
462
|
+
test_record_read_leaves_caller_shell_intact
|
|
463
|
+
test_boolean_view_never_promotes_unknown
|
|
464
|
+
|
|
465
|
+
echo "all fm-busy-state tests passed"
|