@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,625 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tests/fm-remote-doctor.test.sh - the remote second-mate readiness gate.
|
|
3
|
+
#
|
|
4
|
+
# Drives the real bin/fm-remote-doctor.sh against a controlled account fixture:
|
|
5
|
+
# a private HOME, a fake launchctl backed by state files, a fake herdr CLI, and
|
|
6
|
+
# a fake uname that selects the platform under test. Nothing here touches the
|
|
7
|
+
# runner's own launch agents, login session, or herdr server.
|
|
8
|
+
set -u
|
|
9
|
+
|
|
10
|
+
# shellcheck source=tests/lib.sh
|
|
11
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
12
|
+
|
|
13
|
+
command -v jq >/dev/null 2>&1 || { echo "skip: jq not found (the herdr adapter parses its JSON)"; exit 0; }
|
|
14
|
+
|
|
15
|
+
TMP_ROOT=$(fm_test_tmproot fm-remote-doctor)
|
|
16
|
+
LABEL=dev.firstmate.herdr.fm-remote
|
|
17
|
+
INTERACTIVE_LABEL=dev.firstmate.herdr
|
|
18
|
+
mkdir -p "$TMP_ROOT"
|
|
19
|
+
TMP_ROOT=$(cd "$TMP_ROOT" && pwd -P)
|
|
20
|
+
JOB_LABEL=dev.firstmate.remote-job
|
|
21
|
+
CASE_N=0
|
|
22
|
+
DOCTOR_WORKER_PID=
|
|
23
|
+
trap 'if [ -n "$DOCTOR_WORKER_PID" ]; then kill "$DOCTOR_WORKER_PID" 2>/dev/null || true; fi; fm_test_cleanup || true' EXIT
|
|
24
|
+
|
|
25
|
+
# A fixture must be able to present a host with NO herdr, so the doctor never
|
|
26
|
+
# sees the runner's own PATH. Only the two required tools are re-exposed, by
|
|
27
|
+
# symlink, alongside the system directories the doctor's own helpers need.
|
|
28
|
+
TOOLS="$TMP_ROOT/tools"
|
|
29
|
+
mkdir -p "$TOOLS"
|
|
30
|
+
ln -sf "$(command -v git)" "$TOOLS/git"
|
|
31
|
+
ln -sf "$(command -v jq)" "$TOOLS/jq"
|
|
32
|
+
BASE_PATH="$TOOLS:/usr/bin:/bin:/usr/sbin:/sbin"
|
|
33
|
+
|
|
34
|
+
# new_case <Darwin|Linux> [with-herdr] [gui]
|
|
35
|
+
# Builds one isolated account fixture and points the module-level CASE_*
|
|
36
|
+
# variables at it. "with-herdr" installs the fake herdr CLI; "gui" makes the
|
|
37
|
+
# fake launchctl report an existing Aqua login session.
|
|
38
|
+
new_case() {
|
|
39
|
+
local platform=$1 want_herdr=${2:-with-herdr} want_gui=${3:-gui}
|
|
40
|
+
unset CASE_REMOTE_JOB_ACTIVE
|
|
41
|
+
unset CASE_PLATFORM_OVERRIDE
|
|
42
|
+
CASE_N=$((CASE_N + 1))
|
|
43
|
+
CASE_DIR="$TMP_ROOT/case$CASE_N"
|
|
44
|
+
CASE_BIN="$CASE_DIR/bin"
|
|
45
|
+
CASE_HOME="$CASE_DIR/home"
|
|
46
|
+
CASE_PROJECT_HOME="$CASE_DIR/project-home"
|
|
47
|
+
CASE_STATE="$CASE_DIR/state"
|
|
48
|
+
CASE_LAUNCHCTL_LOG="$CASE_STATE/launchctl.log"
|
|
49
|
+
CASE_FORBIDDEN_LOG="$CASE_STATE/forbidden.log"
|
|
50
|
+
CASE_HERDR_RUNNING="$CASE_STATE/herdr.running"
|
|
51
|
+
CASE_PLIST="$CASE_HOME/Library/LaunchAgents/$LABEL.plist"
|
|
52
|
+
CASE_INTERACTIVE_PLIST="$CASE_HOME/Library/LaunchAgents/$INTERACTIVE_LABEL.plist"
|
|
53
|
+
CASE_JOB_PLIST="$CASE_HOME/Library/LaunchAgents/$JOB_LABEL.plist"
|
|
54
|
+
mkdir -p "$CASE_BIN" "$CASE_HOME" "$CASE_PROJECT_HOME" "$CASE_STATE"
|
|
55
|
+
printf 'false\n' > "$CASE_HERDR_RUNNING"
|
|
56
|
+
: > "$CASE_LAUNCHCTL_LOG"
|
|
57
|
+
: > "$CASE_FORBIDDEN_LOG"
|
|
58
|
+
[ "$want_gui" != gui ] || touch "$CASE_STATE/gui-session"
|
|
59
|
+
|
|
60
|
+
cat > "$CASE_BIN/uname" <<SH
|
|
61
|
+
#!/usr/bin/env bash
|
|
62
|
+
printf '%s\n' '$platform'
|
|
63
|
+
SH
|
|
64
|
+
|
|
65
|
+
cat > "$CASE_BIN/launchctl" <<'SH'
|
|
66
|
+
#!/usr/bin/env bash
|
|
67
|
+
set -u
|
|
68
|
+
printf '%s\n' "$*" >> "$FM_FAKE_LAUNCHCTL_LOG"
|
|
69
|
+
domain=${2:-}
|
|
70
|
+
label=${domain##*/}
|
|
71
|
+
loaded="$FM_FAKE_STATE/loaded-$label"
|
|
72
|
+
case "${1:-}" in
|
|
73
|
+
print)
|
|
74
|
+
case "$domain" in
|
|
75
|
+
*/dev.firstmate.herdr.fm-remote)
|
|
76
|
+
[ -f "$loaded" ] || exit 113
|
|
77
|
+
cat "$loaded"
|
|
78
|
+
;;
|
|
79
|
+
*/dev.firstmate.herdr)
|
|
80
|
+
[ -f "$FM_FAKE_STATE/interactive-loaded" ] || exit 113
|
|
81
|
+
printf 'interactive default job\n'
|
|
82
|
+
;;
|
|
83
|
+
*/*/*) [ -f "$loaded" ] || exit 113; cat "$loaded" ;;
|
|
84
|
+
*) [ -f "$FM_FAKE_STATE/gui-session" ] || exit 113 ;;
|
|
85
|
+
esac
|
|
86
|
+
exit 0
|
|
87
|
+
;;
|
|
88
|
+
bootout)
|
|
89
|
+
[ ! -f "$FM_FAKE_STATE/bootout-fail" ] || { printf 'Boot-out failed: operation not permitted\n' >&2; exit 6; }
|
|
90
|
+
case "$domain" in
|
|
91
|
+
*/dev.firstmate.herdr.fm-remote) rm -f "$loaded" ;;
|
|
92
|
+
*/dev.firstmate.herdr) rm -f "$FM_FAKE_STATE/interactive-loaded" ;;
|
|
93
|
+
*) rm -f "$loaded" ;;
|
|
94
|
+
esac
|
|
95
|
+
exit 0
|
|
96
|
+
;;
|
|
97
|
+
bootstrap)
|
|
98
|
+
# launchd refuses a gui/<uid> domain that has no login session.
|
|
99
|
+
[ -f "$FM_FAKE_STATE/gui-session" ] || { printf 'Bootstrap failed: 5: Input/output error\n' >&2; exit 5; }
|
|
100
|
+
[ ! -f "$loaded" ] || { printf 'Bootstrap failed: service already loaded\n' >&2; exit 5; }
|
|
101
|
+
plist=${3:-}
|
|
102
|
+
label=${plist##*/}
|
|
103
|
+
label=${label%.plist}
|
|
104
|
+
loaded="$FM_FAKE_STATE/loaded-$label"
|
|
105
|
+
[ ! -f "$loaded" ] || { printf 'Bootstrap failed: service already loaded\n' >&2; exit 5; }
|
|
106
|
+
case "$label" in
|
|
107
|
+
dev.firstmate.remote-job)
|
|
108
|
+
cat > "$loaded" <<EOF
|
|
109
|
+
path = $FM_FAKE_JOB_PLIST
|
|
110
|
+
program = $FM_FAKE_JOB_WORKER
|
|
111
|
+
properties = keepalive | runatload | inferred program
|
|
112
|
+
EOF
|
|
113
|
+
;;
|
|
114
|
+
*)
|
|
115
|
+
cat > "$loaded" <<EOF
|
|
116
|
+
path = $FM_FAKE_PLIST
|
|
117
|
+
program = $FM_FAKE_HERDR_BIN
|
|
118
|
+
arguments = {
|
|
119
|
+
$FM_FAKE_HERDR_BIN
|
|
120
|
+
server
|
|
121
|
+
--session
|
|
122
|
+
fm-remote
|
|
123
|
+
}
|
|
124
|
+
stdout path = $FM_FAKE_LAUNCH_AGENT_LOG
|
|
125
|
+
stderr path = $FM_FAKE_LAUNCH_AGENT_LOG
|
|
126
|
+
properties = keepalive | runatload | inferred program
|
|
127
|
+
EOF
|
|
128
|
+
[ -f "$FM_FAKE_STATE/bootstrap-does-not-start" ] || printf 'true\n' > "$FM_FAKE_HERDR_RUNNING"
|
|
129
|
+
;;
|
|
130
|
+
esac
|
|
131
|
+
exit 0
|
|
132
|
+
;;
|
|
133
|
+
kickstart)
|
|
134
|
+
[ ! -f "$FM_FAKE_STATE/kickstart-fail" ] || { printf 'Kickstart failed: service unavailable\n' >&2; exit 6; }
|
|
135
|
+
case "$label" in
|
|
136
|
+
dev.firstmate.remote-job) : ;;
|
|
137
|
+
*)
|
|
138
|
+
if [ -f "$FM_FAKE_STATE/kickstart-delay" ]; then
|
|
139
|
+
cp "$FM_FAKE_STATE/kickstart-delay" "$FM_FAKE_STATE/herdr-delay"
|
|
140
|
+
else
|
|
141
|
+
printf 'true\n' > "$FM_FAKE_HERDR_RUNNING"
|
|
142
|
+
fi
|
|
143
|
+
;;
|
|
144
|
+
esac
|
|
145
|
+
exit 0
|
|
146
|
+
;;
|
|
147
|
+
esac
|
|
148
|
+
exit 0
|
|
149
|
+
SH
|
|
150
|
+
|
|
151
|
+
# Any attempt to reach for auto-login, FileVault, or the keychain records
|
|
152
|
+
# itself here so the test can prove the doctor never goes near them.
|
|
153
|
+
local forbidden
|
|
154
|
+
for forbidden in fdesetup security defaults; do
|
|
155
|
+
cat > "$CASE_BIN/$forbidden" <<SH
|
|
156
|
+
#!/usr/bin/env bash
|
|
157
|
+
printf '$forbidden %s\n' "\$*" >> "\$FM_FAKE_FORBIDDEN_LOG"
|
|
158
|
+
exit 0
|
|
159
|
+
SH
|
|
160
|
+
chmod +x "$CASE_BIN/$forbidden"
|
|
161
|
+
done
|
|
162
|
+
|
|
163
|
+
if [ "$want_herdr" = with-herdr ]; then
|
|
164
|
+
cat > "$CASE_BIN/herdr" <<'SH'
|
|
165
|
+
#!/usr/bin/env bash
|
|
166
|
+
set -u
|
|
167
|
+
running=$(cat "$FM_FAKE_HERDR_RUNNING" 2>/dev/null || printf 'false')
|
|
168
|
+
case "${1:-} ${2:-}" in
|
|
169
|
+
"status --json")
|
|
170
|
+
if [ -f "$FM_FAKE_STATE/herdr-delay" ]; then
|
|
171
|
+
delay=$(cat "$FM_FAKE_STATE/herdr-delay")
|
|
172
|
+
if [ "$delay" -gt 0 ]; then
|
|
173
|
+
printf '%s\n' "$((delay - 1))" > "$FM_FAKE_STATE/herdr-delay"
|
|
174
|
+
running=false
|
|
175
|
+
else
|
|
176
|
+
rm -f "$FM_FAKE_STATE/herdr-delay"
|
|
177
|
+
printf 'true\n' > "$FM_FAKE_HERDR_RUNNING"
|
|
178
|
+
running=true
|
|
179
|
+
fi
|
|
180
|
+
fi
|
|
181
|
+
printf '{"client":{"version":"0.7.5","protocol":16},"server":{"running":%s}}\n' "$running"
|
|
182
|
+
;;
|
|
183
|
+
"server "*|"server ")
|
|
184
|
+
printf 'true\n' > "$FM_FAKE_HERDR_RUNNING"
|
|
185
|
+
;;
|
|
186
|
+
esac
|
|
187
|
+
exit 0
|
|
188
|
+
SH
|
|
189
|
+
chmod +x "$CASE_BIN/herdr"
|
|
190
|
+
fi
|
|
191
|
+
cat > "$CASE_BIN/tasks-axi" <<'SH'
|
|
192
|
+
#!/usr/bin/env bash
|
|
193
|
+
case "${1:-}:${2:-}" in
|
|
194
|
+
--version:*) printf '0.2.4\n' ;;
|
|
195
|
+
update:--help) printf '%s\n' --archive-body ;;
|
|
196
|
+
mv:--help) printf '%s\n' 'usage: tasks-axi mv <id> [<id>...]' ;;
|
|
197
|
+
esac
|
|
198
|
+
SH
|
|
199
|
+
cat > "$CASE_BIN/treehouse" <<'SH'
|
|
200
|
+
#!/usr/bin/env bash
|
|
201
|
+
exit 0
|
|
202
|
+
SH
|
|
203
|
+
cat > "$CASE_BIN/claude" <<'SH'
|
|
204
|
+
#!/usr/bin/env bash
|
|
205
|
+
exit 0
|
|
206
|
+
SH
|
|
207
|
+
chmod +x "$CASE_BIN/uname" "$CASE_BIN/launchctl" "$CASE_BIN/tasks-axi" "$CASE_BIN/treehouse" "$CASE_BIN/claude"
|
|
208
|
+
cat > "$CASE_BIN/sleep" <<'SH'
|
|
209
|
+
#!/usr/bin/env bash
|
|
210
|
+
exit 0
|
|
211
|
+
SH
|
|
212
|
+
chmod +x "$CASE_BIN/sleep"
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
# doctor [args...] -> runs the real doctor against the current fixture,
|
|
216
|
+
# capturing merged output in DOCTOR_OUT and its status in DOCTOR_RC.
|
|
217
|
+
doctor() {
|
|
218
|
+
set +e
|
|
219
|
+
DOCTOR_OUT=$(
|
|
220
|
+
HOME="$CASE_HOME" \
|
|
221
|
+
FM_HOME="$CASE_PROJECT_HOME" \
|
|
222
|
+
PATH="$CASE_HOME/.local/bin:$CASE_BIN:$BASE_PATH" \
|
|
223
|
+
FM_FAKE_STATE="$CASE_STATE" \
|
|
224
|
+
FM_FAKE_LAUNCHCTL_LOG="$CASE_LAUNCHCTL_LOG" \
|
|
225
|
+
FM_FAKE_FORBIDDEN_LOG="$CASE_FORBIDDEN_LOG" \
|
|
226
|
+
FM_FAKE_HERDR_RUNNING="$CASE_HERDR_RUNNING" \
|
|
227
|
+
FM_FAKE_HERDR_BIN="$CASE_BIN/herdr" \
|
|
228
|
+
FM_FAKE_PLIST="$CASE_PLIST" \
|
|
229
|
+
FM_FAKE_JOB_PLIST="$CASE_JOB_PLIST" \
|
|
230
|
+
FM_FAKE_JOB_WORKER="$ROOT/bin/fm-remote-job-worker.sh" \
|
|
231
|
+
FM_FAKE_LAUNCH_AGENT_LOG="$CASE_HOME/Library/Logs/$LABEL.log" \
|
|
232
|
+
FM_REMOTE_JOB_PLATFORM_OVERRIDE="${CASE_PLATFORM_OVERRIDE-}" \
|
|
233
|
+
FM_REMOTE_JOB_ACTIVE="${CASE_REMOTE_JOB_ACTIVE-1}" \
|
|
234
|
+
"$ROOT/bin/fm-remote-doctor.sh" "$@" 2>&1
|
|
235
|
+
)
|
|
236
|
+
DOCTOR_RC=$?
|
|
237
|
+
set -e
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
write_loaded_contract() { # <herdr-path> [properties]
|
|
241
|
+
local herdr_bin=$1 properties=${2:-'keepalive | runatload | inferred program'}
|
|
242
|
+
cat > "$CASE_STATE/loaded-$LABEL" <<EOF
|
|
243
|
+
path = $CASE_PLIST
|
|
244
|
+
program = $herdr_bin
|
|
245
|
+
arguments = {
|
|
246
|
+
$herdr_bin
|
|
247
|
+
server
|
|
248
|
+
--session
|
|
249
|
+
fm-remote
|
|
250
|
+
}
|
|
251
|
+
stdout path = $CASE_HOME/Library/Logs/$LABEL.log
|
|
252
|
+
stderr path = $CASE_HOME/Library/Logs/$LABEL.log
|
|
253
|
+
properties = $properties
|
|
254
|
+
EOF
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
assert_no_dangerous_calls() { # <msg>
|
|
258
|
+
[ ! -s "$CASE_FORBIDDEN_LOG" ] \
|
|
259
|
+
|| fail "$1"$'\n'"--- attempted ---"$'\n'"$(cat "$CASE_FORBIDDEN_LOG")"
|
|
260
|
+
assert_absent "$CASE_HOME/Library/Preferences/com.apple.loginwindow.plist" \
|
|
261
|
+
"the doctor wrote a loginwindow preference"
|
|
262
|
+
assert_absent "$CASE_HOME/kcpassword" "the doctor wrote an auto-login password"
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
# --- a host with no herdr is never ready, and --fix cannot install one -------
|
|
266
|
+
|
|
267
|
+
new_case Darwin no-herdr gui
|
|
268
|
+
doctor
|
|
269
|
+
expect_code 1 "$DOCTOR_RC" "a host without herdr was reported ready"
|
|
270
|
+
assert_contains "$DOCTOR_OUT" 'check herdr=human:' "a missing herdr CLI was not tagged as a human gap"
|
|
271
|
+
assert_contains "$DOCTOR_OUT" 'action: herdr:' "a missing herdr CLI came with no operator action"
|
|
272
|
+
doctor --fix
|
|
273
|
+
expect_code 1 "$DOCTOR_RC" "--fix reported a host without herdr as ready"
|
|
274
|
+
assert_contains "$DOCTOR_OUT" 'check herdr=human:' "--fix stopped reporting the missing herdr CLI"
|
|
275
|
+
assert_not_contains "$DOCTOR_OUT" 'fix herdr=applied' "--fix claimed to have installed herdr"
|
|
276
|
+
assert_no_dangerous_calls "the doctor reached for auto-login, FileVault, or the keychain"
|
|
277
|
+
pass "a missing herdr CLI is a human gap that --fix never claims to close"
|
|
278
|
+
|
|
279
|
+
# --- an absent launch agent is a fixable gap that --fix installs -------------
|
|
280
|
+
|
|
281
|
+
new_case Darwin with-herdr gui
|
|
282
|
+
mkdir -p "$(dirname "$CASE_INTERACTIVE_PLIST")"
|
|
283
|
+
cat > "$CASE_INTERACTIVE_PLIST" <<XML
|
|
284
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
285
|
+
<plist version="1.0">
|
|
286
|
+
<dict>
|
|
287
|
+
<key>Label</key>
|
|
288
|
+
<string>$INTERACTIVE_LABEL</string>
|
|
289
|
+
<key>ProgramArguments</key>
|
|
290
|
+
<array>
|
|
291
|
+
<string>$CASE_BIN/herdr</string>
|
|
292
|
+
<string>server</string>
|
|
293
|
+
<string>--session</string>
|
|
294
|
+
<string>default</string>
|
|
295
|
+
</array>
|
|
296
|
+
</dict>
|
|
297
|
+
</plist>
|
|
298
|
+
XML
|
|
299
|
+
cp "$CASE_INTERACTIVE_PLIST" "$CASE_STATE/interactive-before.plist"
|
|
300
|
+
touch "$CASE_STATE/interactive-loaded"
|
|
301
|
+
doctor
|
|
302
|
+
expect_code 1 "$DOCTOR_RC" "a host with no launch agent was reported ready"
|
|
303
|
+
assert_contains "$DOCTOR_OUT" 'check herdr=ok:' "the fake herdr CLI was not detected"
|
|
304
|
+
assert_contains "$DOCTOR_OUT" 'check gui-session=ok:' "an existing login session was not detected"
|
|
305
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent=fixable:' "an absent launch agent was not tagged fixable"
|
|
306
|
+
assert_contains "$DOCTOR_OUT" "$LABEL.plist" "the gap did not name the launch agent path"
|
|
307
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=fixable:' "a stopped herdr server was not tagged fixable"
|
|
308
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-worker=fixable:' "an absent remote job worker was not tagged fixable"
|
|
309
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-worker-loaded=fixable:' "an unloaded remote job worker was not tagged fixable"
|
|
310
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-probe=ok:' "the controlled job-worker probe was not reported"
|
|
311
|
+
assert_absent "$CASE_PLIST" "a read-only doctor run installed a launch agent"
|
|
312
|
+
assert_absent "$CASE_JOB_PLIST" "a read-only doctor run installed a remote job worker"
|
|
313
|
+
[ ! -s "$CASE_LAUNCHCTL_LOG" ] || assert_not_contains "$(cat "$CASE_LAUNCHCTL_LOG")" bootstrap \
|
|
314
|
+
"a read-only doctor run loaded a launch agent"
|
|
315
|
+
pass "an absent launch agent is a fixable gap and the read-only run changes nothing"
|
|
316
|
+
|
|
317
|
+
doctor --fix
|
|
318
|
+
expect_code 0 "$DOCTOR_RC" "--fix left a repairable host unready"
|
|
319
|
+
assert_contains "$DOCTOR_OUT" 'fix launchagent=applied:' "--fix did not report installing the launch agent"
|
|
320
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent=ok:' "--fix did not re-check the installed launch agent"
|
|
321
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-scope=ok: LimitLoadToSessionType=Aqua' \
|
|
322
|
+
"the installed launch agent was not Aqua-scoped"
|
|
323
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-loaded=ok:' "--fix did not load the launch agent"
|
|
324
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=ok:' "--fix did not leave the herdr server running"
|
|
325
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-worker=ok:' "--fix did not install the remote job worker contract"
|
|
326
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-worker-loaded=ok:' "--fix did not load the remote job worker"
|
|
327
|
+
assert_present "$CASE_PLIST" "--fix reported success without writing the plist"
|
|
328
|
+
assert_present "$CASE_JOB_PLIST" "--fix reported success without writing the remote job worker plist"
|
|
329
|
+
assert_grep '<string>Aqua</string>' "$CASE_PLIST" "the written plist is not Aqua-scoped"
|
|
330
|
+
assert_grep "<string>$LABEL</string>" "$CASE_PLIST" "the written plist does not carry the Firstmate label"
|
|
331
|
+
assert_grep '<string>server</string>' "$CASE_PLIST" "the written plist does not run a herdr server"
|
|
332
|
+
assert_grep '<string>fm-remote</string>' "$CASE_PLIST" "the written plist does not pin the remote-secondmate session"
|
|
333
|
+
assert_no_grep '<string>default</string>' "$CASE_PLIST" "the written plist pins the interactive default session"
|
|
334
|
+
assert_grep "<string>$JOB_LABEL</string>" "$CASE_JOB_PLIST" "the worker plist does not carry the Firstmate label"
|
|
335
|
+
assert_grep '<string>Aqua</string>' "$CASE_JOB_PLIST" "the worker plist is not Aqua-scoped"
|
|
336
|
+
assert_grep "$ROOT/bin/fm-remote-job-worker.sh" "$CASE_JOB_PLIST" "the worker plist does not use the configured code root"
|
|
337
|
+
assert_grep "gui/$(id -u)" "$CASE_LAUNCHCTL_LOG" "the launch agent was not bootstrapped into the GUI domain"
|
|
338
|
+
cmp -s "$CASE_STATE/interactive-before.plist" "$CASE_INTERACTIVE_PLIST" \
|
|
339
|
+
|| fail "the fm-remote repair rewrote the interactive default launch agent"
|
|
340
|
+
assert_present "$CASE_STATE/interactive-loaded" "the fm-remote repair unloaded the interactive default launch agent"
|
|
341
|
+
assert_no_grep "gui/$(id -u)/$INTERACTIVE_LABEL$" "$CASE_LAUNCHCTL_LOG" \
|
|
342
|
+
"the fm-remote repair inspected or controlled the interactive default launch agent"
|
|
343
|
+
assert_no_dangerous_calls "the repair reached for auto-login, FileVault, or the keychain"
|
|
344
|
+
pass "--fix installs the dedicated fm-remote launch agent without touching default"
|
|
345
|
+
|
|
346
|
+
PLIST_BEFORE=$(cat "$CASE_PLIST")
|
|
347
|
+
: > "$CASE_LAUNCHCTL_LOG"
|
|
348
|
+
doctor --fix
|
|
349
|
+
expect_code 0 "$DOCTOR_RC" "a second --fix on a ready host reported a gap"
|
|
350
|
+
assert_not_contains "$DOCTOR_OUT" 'fix launchagent=applied:' "a second --fix rewrote a healthy launch agent"
|
|
351
|
+
assert_not_contains "$DOCTOR_OUT" 'fix launchagent-loaded=applied:' "a second --fix reloaded a healthy launch agent"
|
|
352
|
+
[ "$(cat "$CASE_PLIST")" = "$PLIST_BEFORE" ] || fail "a second --fix changed the installed plist"
|
|
353
|
+
[ ! -s "$CASE_LAUNCHCTL_LOG" ] || assert_not_contains "$(cat "$CASE_LAUNCHCTL_LOG")" bootstrap \
|
|
354
|
+
"a second --fix re-bootstrapped a loaded launch agent"
|
|
355
|
+
pass "--fix is idempotent once the host is ready"
|
|
356
|
+
|
|
357
|
+
# --- a loaded, running launch agent with contract drift is repaired ----------
|
|
358
|
+
|
|
359
|
+
new_case Darwin with-herdr gui
|
|
360
|
+
mkdir -p "$(dirname "$CASE_PLIST")"
|
|
361
|
+
cat > "$CASE_PLIST" <<XML
|
|
362
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
363
|
+
<plist version="1.0">
|
|
364
|
+
<dict>
|
|
365
|
+
<key>Label</key>
|
|
366
|
+
<string>$LABEL</string>
|
|
367
|
+
<key>ProgramArguments</key>
|
|
368
|
+
<array>
|
|
369
|
+
<string>/obsolete/bin/herdr</string>
|
|
370
|
+
<string>server</string>
|
|
371
|
+
<string>--session</string>
|
|
372
|
+
<string>default</string>
|
|
373
|
+
</array>
|
|
374
|
+
<key>LimitLoadToSessionType</key>
|
|
375
|
+
<string>Aqua</string>
|
|
376
|
+
</dict>
|
|
377
|
+
</plist>
|
|
378
|
+
XML
|
|
379
|
+
write_loaded_contract /obsolete/bin/herdr 'runatload | inferred program'
|
|
380
|
+
printf 'true\n' > "$CASE_HERDR_RUNNING"
|
|
381
|
+
doctor
|
|
382
|
+
expect_code 1 "$DOCTOR_RC" "a stale launch-agent contract was reported ready"
|
|
383
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent=fixable:' "launch-agent contract drift was not tagged fixable"
|
|
384
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-scope=ok:' "the independent Aqua scope was not recognized"
|
|
385
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-loaded=fixable:' "the stale effective launch-agent contract was not tagged fixable"
|
|
386
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=ok:' "the running fixture was not recognized"
|
|
387
|
+
doctor --fix
|
|
388
|
+
expect_code 0 "$DOCTOR_RC" "--fix did not repair launch-agent contract drift"
|
|
389
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent=ok:' "the repaired launch-agent contract was not confirmed"
|
|
390
|
+
assert_grep "<string>$CASE_BIN/herdr</string>" "$CASE_PLIST" "the repaired launch agent does not use the resolved herdr path"
|
|
391
|
+
assert_grep '<key>RunAtLoad</key>' "$CASE_PLIST" "the repaired launch agent does not start at login"
|
|
392
|
+
assert_grep '<key>KeepAlive</key>' "$CASE_PLIST" "the repaired launch agent is not kept alive"
|
|
393
|
+
assert_no_grep '/obsolete/bin/herdr' "$CASE_PLIST" "the obsolete herdr path survived repair"
|
|
394
|
+
pass "a loaded and running launch agent must match the complete owned contract"
|
|
395
|
+
|
|
396
|
+
# --- failed replacement cannot hide a stale loaded launch-agent contract -----
|
|
397
|
+
|
|
398
|
+
new_case Darwin with-herdr gui
|
|
399
|
+
mkdir -p "$(dirname "$CASE_PLIST")"
|
|
400
|
+
cat > "$CASE_PLIST" <<XML
|
|
401
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
402
|
+
<plist version="1.0">
|
|
403
|
+
<dict>
|
|
404
|
+
<key>Label</key>
|
|
405
|
+
<string>$LABEL</string>
|
|
406
|
+
<key>ProgramArguments</key>
|
|
407
|
+
<array>
|
|
408
|
+
<string>/obsolete/bin/herdr</string>
|
|
409
|
+
<string>server</string>
|
|
410
|
+
<string>--session</string>
|
|
411
|
+
<string>default</string>
|
|
412
|
+
</array>
|
|
413
|
+
<key>LimitLoadToSessionType</key>
|
|
414
|
+
<string>Aqua</string>
|
|
415
|
+
</dict>
|
|
416
|
+
</plist>
|
|
417
|
+
XML
|
|
418
|
+
write_loaded_contract /obsolete/bin/herdr 'runatload | inferred program'
|
|
419
|
+
printf 'true\n' > "$CASE_HERDR_RUNNING"
|
|
420
|
+
touch "$CASE_STATE/bootout-fail"
|
|
421
|
+
doctor --fix
|
|
422
|
+
expect_code 1 "$DOCTOR_RC" "a stale loaded job passed after its replacement failed"
|
|
423
|
+
assert_contains "$DOCTOR_OUT" 'fix launchagent-loaded=failed: launchctl bootstrap' "the failed replacement was not reported"
|
|
424
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent=ok:' "the repaired disk contract was not confirmed"
|
|
425
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-loaded=fixable:' "the stale loaded contract did not remain a readiness gap"
|
|
426
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=ok:' "the existing server masking condition was not preserved"
|
|
427
|
+
|
|
428
|
+
rm -f "$CASE_STATE/bootout-fail"
|
|
429
|
+
doctor --fix
|
|
430
|
+
expect_code 0 "$DOCTOR_RC" "--fix did not replace the stale loaded launch-agent contract"
|
|
431
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-loaded=ok:' "the replacement loaded contract was not confirmed"
|
|
432
|
+
assert_no_grep '/obsolete/bin/herdr' "$CASE_STATE/loaded-$LABEL" "the stale effective program survived replacement"
|
|
433
|
+
pass "a failed reload leaves stale effective launch-agent state unready"
|
|
434
|
+
|
|
435
|
+
# --- a launch agent that is not Aqua-scoped is repaired in place -------------
|
|
436
|
+
|
|
437
|
+
new_case Darwin with-herdr gui
|
|
438
|
+
mkdir -p "$(dirname "$CASE_PLIST")"
|
|
439
|
+
cat > "$CASE_PLIST" <<XML
|
|
440
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
441
|
+
<plist version="1.0">
|
|
442
|
+
<dict>
|
|
443
|
+
<key>Label</key>
|
|
444
|
+
<string>$LABEL</string>
|
|
445
|
+
<key>LimitLoadToSessionType</key>
|
|
446
|
+
<string>Background</string>
|
|
447
|
+
</dict>
|
|
448
|
+
</plist>
|
|
449
|
+
XML
|
|
450
|
+
doctor
|
|
451
|
+
expect_code 1 "$DOCTOR_RC" "a Background-scoped launch agent was reported ready"
|
|
452
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent=fixable:' "an incomplete launch agent was not tagged fixable"
|
|
453
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-scope=fixable:' "a non-Aqua session scope was not tagged fixable"
|
|
454
|
+
doctor --fix
|
|
455
|
+
expect_code 0 "$DOCTOR_RC" "--fix could not re-scope an existing launch agent"
|
|
456
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-scope=ok: LimitLoadToSessionType=Aqua' \
|
|
457
|
+
"--fix did not re-scope the launch agent to Aqua"
|
|
458
|
+
assert_no_grep 'Background' "$CASE_PLIST" "the Background session scope survived the repair"
|
|
459
|
+
pass "a launch agent outside the Aqua session scope is rewritten in place"
|
|
460
|
+
|
|
461
|
+
# --- launchd start failures are reported and delayed readiness is awaited ----
|
|
462
|
+
|
|
463
|
+
new_case Darwin with-herdr gui
|
|
464
|
+
doctor --fix
|
|
465
|
+
expect_code 0 "$DOCTOR_RC" "the launch-agent startup fixture could not be initialized"
|
|
466
|
+
printf 'false\n' > "$CASE_HERDR_RUNNING"
|
|
467
|
+
touch "$CASE_STATE/bootstrap-does-not-start" "$CASE_STATE/kickstart-fail"
|
|
468
|
+
doctor --fix
|
|
469
|
+
expect_code 1 "$DOCTOR_RC" "a failed launchctl kickstart was reported ready"
|
|
470
|
+
assert_contains "$DOCTOR_OUT" 'fix herdr-server=failed: launchctl kickstart' "kickstart failure was not reported"
|
|
471
|
+
assert_contains "$DOCTOR_OUT" 'Kickstart failed: service unavailable' "kickstart diagnostic was discarded"
|
|
472
|
+
assert_not_contains "$DOCTOR_OUT" 'fix herdr-server=applied:' "a failed kickstart was reported as applied"
|
|
473
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=fixable:' "the stopped server was not preserved as a readiness gap"
|
|
474
|
+
|
|
475
|
+
rm -f "$CASE_STATE/kickstart-fail"
|
|
476
|
+
printf '2\n' > "$CASE_STATE/kickstart-delay"
|
|
477
|
+
doctor --fix
|
|
478
|
+
expect_code 0 "$DOCTOR_RC" "--fix did not wait for delayed launchd startup"
|
|
479
|
+
assert_contains "$DOCTOR_OUT" 'fix herdr-server=applied:' "delayed launchd startup was not reported as applied"
|
|
480
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=ok:' "delayed launchd startup was not confirmed"
|
|
481
|
+
assert_absent "$CASE_STATE/herdr-delay" "the readiness poll stopped before the delayed server became reachable"
|
|
482
|
+
pass "launchd failures are reported and delayed server readiness is awaited"
|
|
483
|
+
|
|
484
|
+
# --- no GUI login session: every dependent gap stays human -------------------
|
|
485
|
+
|
|
486
|
+
new_case Darwin with-herdr no-gui
|
|
487
|
+
doctor --fix
|
|
488
|
+
expect_code 1 "$DOCTOR_RC" "a host with no login session was reported ready"
|
|
489
|
+
assert_contains "$DOCTOR_OUT" 'check gui-session=human:' "an absent login session was not tagged human"
|
|
490
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent-loaded=human:' "loading without a login session was not tagged human"
|
|
491
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=human:' "starting a server without a login session was not tagged human"
|
|
492
|
+
assert_not_contains "$DOCTOR_OUT" 'fix gui-session=applied' "--fix claimed to have created a login session"
|
|
493
|
+
assert_not_contains "$DOCTOR_OUT" 'fix launchagent-loaded=applied' "--fix claimed to have loaded an unloadable launch agent"
|
|
494
|
+
assert_not_contains "$DOCTOR_OUT" 'fix herdr-server=applied' "--fix claimed to have started an unstartable server"
|
|
495
|
+
assert_contains "$DOCTOR_OUT" 'action: gui-session:' "the login-session gap came with no operator action"
|
|
496
|
+
assert_contains "$DOCTOR_OUT" 'automatic login' "the login-session action did not name the operator step"
|
|
497
|
+
assert_present "$CASE_PLIST" "--fix skipped the automatable launch-agent gap because a human gap existed"
|
|
498
|
+
assert_contains "$DOCTOR_OUT" 'error: this host is not ready for a remote second mate' \
|
|
499
|
+
"a remaining human gap did not fail the readiness verdict"
|
|
500
|
+
assert_no_dangerous_calls "the doctor tried to create a login session by force"
|
|
501
|
+
pass "human gaps are reported with their operator step and never claimed as fixed"
|
|
502
|
+
|
|
503
|
+
# --- linux has no launch agent, and --fix starts the server directly ---------
|
|
504
|
+
|
|
505
|
+
new_case Linux with-herdr no-gui
|
|
506
|
+
doctor
|
|
507
|
+
expect_code 1 "$DOCTOR_RC" "a linux host with a stopped herdr server was reported ready"
|
|
508
|
+
assert_contains "$DOCTOR_OUT" 'platform=linux' "the platform was misreported"
|
|
509
|
+
assert_contains "$DOCTOR_OUT" 'check launchagent=skip:' "launch agents were checked on linux"
|
|
510
|
+
assert_contains "$DOCTOR_OUT" 'check gui-session=skip:' "an Aqua login session was required on linux"
|
|
511
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=fixable:' "a stopped linux herdr server was not tagged fixable"
|
|
512
|
+
doctor --fix
|
|
513
|
+
expect_code 0 "$DOCTOR_RC" "--fix did not start the herdr server on linux"
|
|
514
|
+
assert_contains "$DOCTOR_OUT" 'fix herdr-server=applied:' "--fix did not report starting the server"
|
|
515
|
+
assert_contains "$DOCTOR_OUT" 'check herdr-server=ok:' "the started server was not confirmed by the re-check"
|
|
516
|
+
[ ! -s "$CASE_LAUNCHCTL_LOG" ] || fail "the linux path invoked launchctl"
|
|
517
|
+
pass "a non-darwin host skips launch agents and starts its herdr server directly"
|
|
518
|
+
|
|
519
|
+
# --- --fix may add only owned wrappers for version-manager tools -------------
|
|
520
|
+
|
|
521
|
+
new_case Linux with-herdr no-gui
|
|
522
|
+
MANAGER_BIN="$CASE_HOME/.nvm/versions/node/v24/bin"
|
|
523
|
+
mkdir -p "$MANAGER_BIN"
|
|
524
|
+
printf '#!/usr/bin/env bash\nexit 0\n' > "$MANAGER_BIN/codex"
|
|
525
|
+
printf '#!/usr/bin/env bash\nexit 0\n' > "$MANAGER_BIN/grok"
|
|
526
|
+
chmod +x "$MANAGER_BIN/codex" "$MANAGER_BIN/grok"
|
|
527
|
+
mv "$CASE_BIN/tasks-axi" "$MANAGER_BIN/tasks-axi"
|
|
528
|
+
doctor
|
|
529
|
+
expect_code 1 "$DOCTOR_RC" "a version-manager-only required tool was reported ready"
|
|
530
|
+
assert_contains "$DOCTOR_OUT" 'required tasks-axi=MISSING' "the missing managed tool was not reported"
|
|
531
|
+
assert_contains "$DOCTOR_OUT" 'tools in an unselected nvm version or outside the discovered asdf or mise paths need an absolute wrapper' \
|
|
532
|
+
"the missing-tool diagnostic contradicted filesystem version-manager discovery"
|
|
533
|
+
doctor --fix
|
|
534
|
+
expect_code 0 "$DOCTOR_RC" "--fix did not create a wrapper for the discoverable managed tool"
|
|
535
|
+
assert_contains "$DOCTOR_OUT" 'fix required-tasks-axi=applied:' "--fix did not report the owned wrapper"
|
|
536
|
+
assert_contains "$DOCTOR_OUT" "required tasks-axi=$CASE_HOME/.local/bin/tasks-axi" \
|
|
537
|
+
"the worker PATH did not resolve the generated wrapper"
|
|
538
|
+
assert_grep '# Firstmate remote tool wrapper v1' "$CASE_HOME/.local/bin/tasks-axi" \
|
|
539
|
+
"the generated wrapper is not marked Firstmate-owned"
|
|
540
|
+
assert_grep "$MANAGER_BIN/tasks-axi" "$CASE_HOME/.local/bin/tasks-axi" \
|
|
541
|
+
"the generated wrapper does not execute the discovered absolute target"
|
|
542
|
+
assert_absent "$CASE_HOME/.local/bin/codex" "--fix wrapped an alternate harness when claude already satisfied readiness"
|
|
543
|
+
assert_absent "$CASE_HOME/.local/bin/grok" "--fix wrapped an alternate harness when claude already satisfied readiness"
|
|
544
|
+
|
|
545
|
+
rm -f "$CASE_BIN/claude"
|
|
546
|
+
doctor --fix
|
|
547
|
+
expect_code 0 "$DOCTOR_RC" "--fix did not wrap one discoverable harness when none resolved"
|
|
548
|
+
assert_present "$CASE_HOME/.local/bin/codex" "--fix did not create the first needed harness wrapper"
|
|
549
|
+
assert_absent "$CASE_HOME/.local/bin/grok" "--fix created more harness wrappers than readiness requires"
|
|
550
|
+
|
|
551
|
+
mv "$CASE_BIN/treehouse" "$MANAGER_BIN/treehouse"
|
|
552
|
+
mkdir -p "$CASE_HOME/.local/bin"
|
|
553
|
+
printf 'operator wrapper\n' > "$CASE_HOME/.local/bin/treehouse"
|
|
554
|
+
doctor --fix
|
|
555
|
+
expect_code 1 "$DOCTOR_RC" "--fix overwrote an operator-owned reserved wrapper"
|
|
556
|
+
assert_contains "$DOCTOR_OUT" 'fix required-treehouse=failed:' \
|
|
557
|
+
"the non-Firstmate wrapper refusal was not reported"
|
|
558
|
+
[ "$(cat "$CASE_HOME/.local/bin/treehouse")" = 'operator wrapper' ] \
|
|
559
|
+
|| fail "--fix overwrote an operator-owned wrapper"
|
|
560
|
+
pass "--fix creates only owned version-manager wrappers and never clobbers an operator file"
|
|
561
|
+
|
|
562
|
+
new_case Linux with-herdr no-gui
|
|
563
|
+
CASE_REMOTE_JOB_ACTIVE=
|
|
564
|
+
CASE_PLATFORM_OVERRIDE=Linux
|
|
565
|
+
rm -f "$CASE_BIN/sleep" "$CASE_BIN/uname"
|
|
566
|
+
mkdir -p "$CASE_HOME/.local/bin"
|
|
567
|
+
for tool in herdr tasks-axi treehouse claude; do
|
|
568
|
+
ln -s "$CASE_BIN/$tool" "$CASE_HOME/.local/bin/$tool"
|
|
569
|
+
done
|
|
570
|
+
HOME="$CASE_HOME" FM_ROOT_OVERRIDE="$ROOT" FM_REMOTE_JOB_PLATFORM_OVERRIDE=Linux \
|
|
571
|
+
"$ROOT/bin/fm-remote-job-worker.sh" > "$CASE_STATE/worker.out" 2> "$CASE_STATE/worker.err" &
|
|
572
|
+
DOCTOR_WORKER_PID=$!
|
|
573
|
+
for _ in $(seq 1 100); do
|
|
574
|
+
[ -f "$CASE_HOME/.firstmate/remote-job/worker.ready" ] && break
|
|
575
|
+
sleep 0.05
|
|
576
|
+
done
|
|
577
|
+
assert_present "$CASE_HOME/.firstmate/remote-job/worker.ready" "the stale-identity fixture worker did not start"
|
|
578
|
+
printf 'stale-worker-identity\n' > "$CASE_HOME/.firstmate/remote-job/worker.identity"
|
|
579
|
+
doctor
|
|
580
|
+
expect_code 1 "$DOCTOR_RC" "doctor accepted a live worker with stale code identity"
|
|
581
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-worker=fixable: the running remote job worker does not match the current Firstmate code' \
|
|
582
|
+
"doctor did not classify stale worker identity as fixable"
|
|
583
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-probe=fixable: the remote job worker identity is stale' \
|
|
584
|
+
"doctor probed through stale worker code"
|
|
585
|
+
doctor --fix
|
|
586
|
+
expect_code 0 "$DOCTOR_RC" "--fix did not replace the stale worker identity"
|
|
587
|
+
assert_contains "$DOCTOR_OUT" 'fix remote-job-worker=applied:' "--fix did not report refreshing the stale worker"
|
|
588
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-worker=ok:' "the refreshed worker was not confirmed ready"
|
|
589
|
+
assert_contains "$DOCTOR_OUT" 'check remote-job-probe=ok: the remote job worker completed the required-tool probe' \
|
|
590
|
+
"doctor did not probe tools through the refreshed worker"
|
|
591
|
+
DOCTOR_WORKER_PID=$(cat "$CASE_HOME/.firstmate/remote-job/worker.pid")
|
|
592
|
+
kill -TERM "$DOCTOR_WORKER_PID"
|
|
593
|
+
for _ in $(seq 1 100); do
|
|
594
|
+
kill -0 "$DOCTOR_WORKER_PID" 2>/dev/null || break
|
|
595
|
+
sleep 0.05
|
|
596
|
+
done
|
|
597
|
+
if kill -0 "$DOCTOR_WORKER_PID" 2>/dev/null; then
|
|
598
|
+
kill -KILL "$DOCTOR_WORKER_PID" 2>/dev/null || true
|
|
599
|
+
fi
|
|
600
|
+
DOCTOR_WORKER_PID=
|
|
601
|
+
pass "doctor refreshes stale worker identity before probing tools"
|
|
602
|
+
|
|
603
|
+
# --- the entrypoint symlink is recreated when it is missing ------------------
|
|
604
|
+
|
|
605
|
+
new_case Linux with-herdr no-gui
|
|
606
|
+
REMOTE_ROOT="$CASE_DIR/remote-root"
|
|
607
|
+
mkdir -p "$REMOTE_ROOT/bin"
|
|
608
|
+
printf '#!/usr/bin/env bash\n' > "$REMOTE_ROOT/bin/fm-remote-entrypoint.sh"
|
|
609
|
+
export FM_ROOT_OVERRIDE="$REMOTE_ROOT"
|
|
610
|
+
doctor
|
|
611
|
+
assert_contains "$DOCTOR_OUT" 'check entrypoint-link=fixable:' "a missing entrypoint symlink was not tagged fixable"
|
|
612
|
+
doctor --fix
|
|
613
|
+
assert_contains "$DOCTOR_OUT" 'fix entrypoint-link=applied:' "--fix did not report linking the entrypoint"
|
|
614
|
+
assert_contains "$DOCTOR_OUT" 'check entrypoint-link=ok:' "the recreated entrypoint symlink was not confirmed"
|
|
615
|
+
[ "$(readlink "$CASE_HOME/.local/bin/fm-remote-entrypoint.sh")" = "$REMOTE_ROOT/bin/fm-remote-entrypoint.sh" ] \
|
|
616
|
+
|| fail "the entrypoint symlink does not point at this code root"
|
|
617
|
+
printf 'not a symlink\n' > "$CASE_HOME/.local/bin/other"
|
|
618
|
+
rm -f "$CASE_HOME/.local/bin/fm-remote-entrypoint.sh"
|
|
619
|
+
printf 'operator wrapper\n' > "$CASE_HOME/.local/bin/fm-remote-entrypoint.sh"
|
|
620
|
+
doctor --fix
|
|
621
|
+
assert_contains "$DOCTOR_OUT" 'check entrypoint-link=human:' "an operator-owned entrypoint file was not left to the operator"
|
|
622
|
+
[ "$(cat "$CASE_HOME/.local/bin/fm-remote-entrypoint.sh")" = 'operator wrapper' ] \
|
|
623
|
+
|| fail "--fix overwrote a file it did not create"
|
|
624
|
+
unset FM_ROOT_OVERRIDE
|
|
625
|
+
pass "the entrypoint symlink is recreated when absent and never overwritten when operator-owned"
|