@zerwiz/ymir 0.1.4 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/README.md +74 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +360 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +11 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +121 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +159 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +736 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +539 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +101 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +180 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +503 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +90 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +57 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +35 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/install.md +69 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +498 -0
- package/CHANGELOG.md +1913 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +114 -60
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +97 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +108 -0
- package/RULES/07-config.md +101 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/09-electron.md +58 -0
- package/RULES/README.md +22 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +133 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +256 -0
- package/bin/apodex-smoke-test.sh +105 -0
- package/bin/bifrost-bridge.sh +131 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +112 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +51 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-assemble.sh +154 -0
- package/bin/changelog-guard.sh +197 -0
- package/bin/crash-sense.sh +173 -0
- package/bin/design-check.sh +80 -0
- package/bin/design-icon.sh +153 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +225 -0
- package/bin/eindri-acclaim.sh +47 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seat.sh +83 -0
- package/bin/eindri-seen.sh +54 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +98 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +158 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/feature-inventory.sh +73 -0
- package/bin/fleet-apply.sh +81 -0
- package/bin/github-deploy.sh +94 -0
- package/bin/gjallarhorn-expose.sh +136 -0
- package/bin/gjallarhorn-notify.sh +71 -0
- package/bin/gjallarhorn-purge.sh +67 -0
- package/bin/gjallarhorn-tunnel.sh +85 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +130 -0
- package/bin/hall-snapshot.sh +111 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +452 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hlidskjalf-agents.sh +172 -0
- package/bin/hlidskjalf-usage.sh +196 -0
- package/bin/hoard-guard.sh +135 -0
- package/bin/hoard-lib.sh +105 -0
- package/bin/hodd.sh +102 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +121 -0
- package/bin/local-model-lock.sh +70 -0
- package/bin/mimir-bridge.py +259 -0
- package/bin/mimir-bridge.sh +100 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir-reflect.sh +27 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +72 -0
- package/bin/mjollnir.sh +104 -0
- package/bin/model-hardware.sh +96 -0
- package/bin/model-resolve.sh +160 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-hall-snapshot.sh +28 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-nsr-compliance.sh +54 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/npm-publish.sh +136 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +161 -0
- package/bin/omarchy-plugins.sh +187 -0
- package/bin/omarchy-sense.sh +162 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-model-agnostic.sh +71 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +58 -0
- package/bin/project-git.sh +69 -0
- package/bin/public-guard.sh +71 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +104 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +94 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +89 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-spawn-pretool-check.sh +58 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +203 -0
- package/bin/telegram-bot.sh +82 -0
- package/bin/toolchain.sh +74 -0
- package/bin/ui-truth-check.sh +75 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +298 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +60 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +163 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +806 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-plan.sh +356 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +110 -0
- package/bin/ymir-setup-auth.sh +119 -0
- package/bin/ymir-validate.sh +193 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1060 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +54 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +269 -0
- package/scripts/lower.sh +34 -0
- package/scripts/raise.sh +42 -0
- package/scripts/start.sh +217 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Behavior tests for primary-authoritative shared captain-preference inheritance.
|
|
3
|
+
#
|
|
4
|
+
# The narrow shared surface is exactly data/captain-shared.md.
|
|
5
|
+
# data/captain.md and data/learnings.md remain domain-local in every home.
|
|
6
|
+
set -u
|
|
7
|
+
|
|
8
|
+
# shellcheck source=tests/lib.sh
|
|
9
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
10
|
+
|
|
11
|
+
# shellcheck source=/dev/null
|
|
12
|
+
. "$ROOT/bin/fm-config-inherit-lib.sh"
|
|
13
|
+
|
|
14
|
+
BASE_PATH=${FM_TEST_BASE_PATH:-/usr/bin:/bin:/usr/sbin:/sbin}
|
|
15
|
+
TMP_ROOT=$(fm_test_tmproot fm-shared-captain)
|
|
16
|
+
|
|
17
|
+
fm_git_identity fmtest fmtest@example.invalid
|
|
18
|
+
|
|
19
|
+
file_mode() {
|
|
20
|
+
if [ "$(uname)" = Darwin ]; then
|
|
21
|
+
stat -f %Lp "$1" 2>/dev/null
|
|
22
|
+
else
|
|
23
|
+
stat -c %a "$1" 2>/dev/null
|
|
24
|
+
fi
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
shared_header() {
|
|
28
|
+
cat <<'EOF'
|
|
29
|
+
# Shared captain preferences
|
|
30
|
+
|
|
31
|
+
This file is main-authoritative in the main firstmate home.
|
|
32
|
+
In secondmate homes it is read-only in secondmate homes and must not be edited there.
|
|
33
|
+
Route new captain-preference discoveries to the main firstmate through marked status or a document pointer.
|
|
34
|
+
EOF
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
write_shared() {
|
|
38
|
+
local path=$1 body=$2
|
|
39
|
+
shared_header > "$path"
|
|
40
|
+
printf '%s\n' "$body" >> "$path"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
new_home_pair() {
|
|
44
|
+
local name=$1 base primary second
|
|
45
|
+
base="$TMP_ROOT/$name"
|
|
46
|
+
primary="$base/primary"
|
|
47
|
+
second="$base/second"
|
|
48
|
+
mkdir -p "$primary/data" "$primary/config" "$second/data" "$second/config"
|
|
49
|
+
printf '%s\n' "primary local captain" > "$primary/data/captain.md"
|
|
50
|
+
printf '%s\n' "second local captain" > "$second/data/captain.md"
|
|
51
|
+
printf '%s\n' "primary local learning" > "$primary/data/learnings.md"
|
|
52
|
+
printf '%s\n' "second local learning" > "$second/data/learnings.md"
|
|
53
|
+
printf '%s\n' "$primary|$second"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
assert_shared_readonly() {
|
|
57
|
+
local path=$1
|
|
58
|
+
[ "$(file_mode "$path")" = "$FM_SHARED_CAPTAIN_MODE" ] \
|
|
59
|
+
|| fail "$path mode should be $FM_SHARED_CAPTAIN_MODE, got $(file_mode "$path")"
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
assert_secondmate_write_fails() {
|
|
63
|
+
local path=$1
|
|
64
|
+
if ( printf '%s\n' "secondmate edit" >> "$path" ) 2>/dev/null; then
|
|
65
|
+
fail "ordinary write unexpectedly succeeded for read-only shared captain file"
|
|
66
|
+
fi
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
test_first_copy_readonly_and_local_files_preserved() {
|
|
70
|
+
local rec primary second report out
|
|
71
|
+
rec=$(new_home_pair first-copy)
|
|
72
|
+
primary=${rec%%|*}
|
|
73
|
+
second=${rec#*|}
|
|
74
|
+
write_shared "$primary/data/captain-shared.md" "shared v1"
|
|
75
|
+
report="$TMP_ROOT/first-copy.report"
|
|
76
|
+
|
|
77
|
+
out=$(FM_CONFIG_INHERIT_REPORT="$report" propagate_secondmate_inheritance "$primary" "$second")
|
|
78
|
+
|
|
79
|
+
[ -z "$out" ] || fail "first copy should not emit a quarantine diagnostic: $out"
|
|
80
|
+
cmp -s "$primary/data/captain-shared.md" "$second/data/captain-shared.md" \
|
|
81
|
+
|| fail "first copy did not converge secondmate shared preferences"
|
|
82
|
+
assert_shared_readonly "$second/data/captain-shared.md"
|
|
83
|
+
assert_secondmate_write_fails "$second/data/captain-shared.md"
|
|
84
|
+
assert_grep $'data/captain-shared.md\tpushed\t' "$report" "first copy should report pushed"
|
|
85
|
+
assert_grep "second local captain" "$second/data/captain.md" "domain-local captain.md was changed"
|
|
86
|
+
assert_grep "second local learning" "$second/data/learnings.md" "domain-local learnings.md was changed"
|
|
87
|
+
|
|
88
|
+
: > "$report"
|
|
89
|
+
out=$(FM_CONFIG_INHERIT_REPORT="$report" propagate_secondmate_inheritance "$primary" "$second")
|
|
90
|
+
[ -z "$out" ] || fail "unchanged convergence should stay quiet: $out"
|
|
91
|
+
assert_grep $'data/captain-shared.md\tunchanged\t' "$report" "unchanged bytes should report unchanged"
|
|
92
|
+
assert_shared_readonly "$second/data/captain-shared.md"
|
|
93
|
+
pass "shared captain first copy converges, is read-only, and preserves local captain/learnings files"
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
test_drift_quarantine_collision_and_repeated_convergence() {
|
|
97
|
+
local rec primary second fakebin hash collision report out diag qpath qcount
|
|
98
|
+
rec=$(new_home_pair drift)
|
|
99
|
+
primary=${rec%%|*}
|
|
100
|
+
second=${rec#*|}
|
|
101
|
+
write_shared "$primary/data/captain-shared.md" "shared v2"
|
|
102
|
+
write_shared "$second/data/captain-shared.md" "local drift"
|
|
103
|
+
chmod "$FM_SHARED_CAPTAIN_MODE" "$second/data/captain-shared.md"
|
|
104
|
+
hash=$(fm_inherit_sha256 "$second/data/captain-shared.md")
|
|
105
|
+
collision="$second/data/.captain-shared.md.quarantine.20260102T030405Z.$hash"
|
|
106
|
+
printf '%s\n' "preexisting different artifact" > "$collision"
|
|
107
|
+
chmod 0600 "$collision"
|
|
108
|
+
|
|
109
|
+
fakebin="$TMP_ROOT/fake-date"
|
|
110
|
+
mkdir -p "$fakebin"
|
|
111
|
+
cat > "$fakebin/date" <<'SH'
|
|
112
|
+
#!/usr/bin/env bash
|
|
113
|
+
printf '%s\n' 20260102T030405Z
|
|
114
|
+
SH
|
|
115
|
+
chmod +x "$fakebin/date"
|
|
116
|
+
report="$TMP_ROOT/drift.report"
|
|
117
|
+
|
|
118
|
+
out=$(PATH="$fakebin:$BASE_PATH" FM_CONFIG_INHERIT_REPORT="$report" \
|
|
119
|
+
propagate_secondmate_inheritance "$primary" "$second")
|
|
120
|
+
|
|
121
|
+
diag=$(printf '%s\n' "$out" | grep '^SECONDMATE_SYNC: secondmate home ' || true)
|
|
122
|
+
[ -n "$diag" ] || fail "drift quarantine should emit a SECONDMATE_SYNC diagnostic"
|
|
123
|
+
qpath=${diag##* at }
|
|
124
|
+
[ "$qpath" = "$collision.1" ] || fail "collision-safe quarantine name should use .1, got $qpath"
|
|
125
|
+
assert_grep "local drift" "$qpath" "quarantine artifact lost the secondmate-local bytes"
|
|
126
|
+
assert_grep $'data/captain-shared.md\tpushed\tquarantined local drift at '"$qpath" "$report" \
|
|
127
|
+
"drift push should name the quarantine artifact in the report"
|
|
128
|
+
cmp -s "$primary/data/captain-shared.md" "$second/data/captain-shared.md" \
|
|
129
|
+
|| fail "drift convergence did not install primary bytes"
|
|
130
|
+
assert_shared_readonly "$second/data/captain-shared.md"
|
|
131
|
+
|
|
132
|
+
: > "$report"
|
|
133
|
+
out=$(PATH="$fakebin:$BASE_PATH" FM_CONFIG_INHERIT_REPORT="$report" \
|
|
134
|
+
propagate_secondmate_inheritance "$primary" "$second")
|
|
135
|
+
[ -z "$out" ] || fail "repeated convergence should not quarantine again: $out"
|
|
136
|
+
qcount=$(find "$second/data" -name '.captain-shared.md.quarantine.*' | wc -l | tr -d ' ')
|
|
137
|
+
[ "$qcount" -eq 2 ] || fail "repeated convergence created extra quarantine artifacts"
|
|
138
|
+
assert_grep $'data/captain-shared.md\tunchanged\t' "$report" "repeated convergence should report unchanged"
|
|
139
|
+
pass "shared captain drift is quarantined collision-safely and repeated convergence is idempotent"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
test_missing_source_mirrors_absence_without_losing_local_bytes() {
|
|
143
|
+
local rec primary second out diag qpath
|
|
144
|
+
rec=$(new_home_pair missing-source)
|
|
145
|
+
primary=${rec%%|*}
|
|
146
|
+
second=${rec#*|}
|
|
147
|
+
write_shared "$second/data/captain-shared.md" "orphaned local shared file"
|
|
148
|
+
chmod "$FM_SHARED_CAPTAIN_MODE" "$second/data/captain-shared.md"
|
|
149
|
+
|
|
150
|
+
out=$(propagate_secondmate_inheritance "$primary" "$second")
|
|
151
|
+
|
|
152
|
+
diag=$(printf '%s\n' "$out" | grep '^SECONDMATE_SYNC: secondmate home ' || true)
|
|
153
|
+
[ -n "$diag" ] || fail "primary absence with a local copy should quarantine before removal"
|
|
154
|
+
qpath=${diag##* at }
|
|
155
|
+
assert_absent "$second/data/captain-shared.md" "primary absence should converge destination to absence"
|
|
156
|
+
assert_grep "orphaned local shared file" "$qpath" "missing-source quarantine lost local bytes"
|
|
157
|
+
assert_grep "second local captain" "$second/data/captain.md" "missing-source changed local captain.md"
|
|
158
|
+
assert_grep "second local learning" "$second/data/learnings.md" "missing-source changed local learnings.md"
|
|
159
|
+
pass "missing primary shared file mirrors absence only after quarantining a local copy"
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
test_unsafe_artifacts_and_failure_restore_readonly_mode() {
|
|
163
|
+
local rec primary second other err before_mode rc
|
|
164
|
+
rec=$(new_home_pair unsafe)
|
|
165
|
+
primary=${rec%%|*}
|
|
166
|
+
second=${rec#*|}
|
|
167
|
+
|
|
168
|
+
ln -s "$primary/data/captain.md" "$primary/data/captain-shared.md"
|
|
169
|
+
err="$TMP_ROOT/unsafe-source.err"
|
|
170
|
+
propagate_secondmate_inheritance "$primary" "$second" >/dev/null 2>"$err"; rc=$?
|
|
171
|
+
[ "$rc" -ne 0 ] || fail "symlinked primary source should be rejected"
|
|
172
|
+
assert_grep "unsafe primary source" "$err" "unsafe source error should be explicit"
|
|
173
|
+
rm -f "$primary/data/captain-shared.md"
|
|
174
|
+
write_shared "$primary/data/captain-shared.md" "safe source"
|
|
175
|
+
|
|
176
|
+
ln -s "$second/data/captain.md" "$second/data/captain-shared.md"
|
|
177
|
+
err="$TMP_ROOT/unsafe-dest-symlink.err"
|
|
178
|
+
propagate_secondmate_inheritance "$primary" "$second" >/dev/null 2>"$err"; rc=$?
|
|
179
|
+
[ "$rc" -ne 0 ] || fail "symlinked destination should be rejected"
|
|
180
|
+
assert_grep "unsafe destination" "$err" "unsafe destination symlink error should be explicit"
|
|
181
|
+
rm -f "$second/data/captain-shared.md"
|
|
182
|
+
|
|
183
|
+
write_shared "$second/data/captain-shared.md" "hardlinked local drift"
|
|
184
|
+
other="$second/data/hardlink-copy"
|
|
185
|
+
ln "$second/data/captain-shared.md" "$other"
|
|
186
|
+
err="$TMP_ROOT/unsafe-dest-hardlink.err"
|
|
187
|
+
propagate_secondmate_inheritance "$primary" "$second" >/dev/null 2>"$err"; rc=$?
|
|
188
|
+
[ "$rc" -ne 0 ] || fail "hardlinked destination should be rejected"
|
|
189
|
+
assert_grep "unsafe destination" "$err" "unsafe destination hardlink error should be explicit"
|
|
190
|
+
rm -f "$second/data/captain-shared.md" "$other"
|
|
191
|
+
|
|
192
|
+
write_shared "$second/data/captain-shared.md" "permission drift"
|
|
193
|
+
chmod "$FM_SHARED_CAPTAIN_MODE" "$second/data/captain-shared.md"
|
|
194
|
+
before_mode=$(file_mode "$second/data/captain-shared.md")
|
|
195
|
+
chmod 500 "$second/data"
|
|
196
|
+
err="$TMP_ROOT/restore-readonly.err"
|
|
197
|
+
propagate_secondmate_inheritance "$primary" "$second" >/dev/null 2>"$err"; rc=$?
|
|
198
|
+
chmod 700 "$second/data"
|
|
199
|
+
[ "$rc" -ne 0 ] || fail "unwritable destination directory should make quarantine fail"
|
|
200
|
+
[ "$(file_mode "$second/data/captain-shared.md")" = "$before_mode" ] \
|
|
201
|
+
|| fail "failed quarantine did not restore read-only mode"
|
|
202
|
+
assert_grep "failed to quarantine divergent destination" "$err" \
|
|
203
|
+
"recoverable failure should explain quarantine failure"
|
|
204
|
+
pass "unsafe shared captain artifacts are rejected and failure restores read-only mode"
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
make_fake_spawn_toolchain() {
|
|
208
|
+
local dir=$1 fakebin
|
|
209
|
+
fakebin="$dir/fakebin"
|
|
210
|
+
mkdir -p "$fakebin"
|
|
211
|
+
cat > "$fakebin/tmux" <<'SH'
|
|
212
|
+
#!/usr/bin/env bash
|
|
213
|
+
exit 0
|
|
214
|
+
SH
|
|
215
|
+
chmod +x "$fakebin/tmux"
|
|
216
|
+
printf '%s\n' "$fakebin"
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
# Version-aware stubs so bootstrap's tool floors stay quiet in fixture PATH.
|
|
220
|
+
add_bootstrap_compatible_tools() {
|
|
221
|
+
local fakebin=$1
|
|
222
|
+
fm_fake_exit0 "$fakebin" node chrome-devtools-axi gh treehouse
|
|
223
|
+
fm_fake_version_tool "$fakebin" lavish-axi FM_FAKE_LAVISH_AXI_VERSION 0.1.46
|
|
224
|
+
cat > "$fakebin/gh-axi" <<'SH'
|
|
225
|
+
#!/usr/bin/env bash
|
|
226
|
+
if [ "${1:-}" = --version ]; then
|
|
227
|
+
printf '%s\n' '0.1.29'
|
|
228
|
+
exit 0
|
|
229
|
+
fi
|
|
230
|
+
exit 0
|
|
231
|
+
SH
|
|
232
|
+
cat > "$fakebin/no-mistakes" <<'SH'
|
|
233
|
+
#!/usr/bin/env bash
|
|
234
|
+
if [ "${1:-}" = --version ]; then
|
|
235
|
+
printf '%s\n' 'no-mistakes version v1.46.0 (fake)'
|
|
236
|
+
exit 0
|
|
237
|
+
fi
|
|
238
|
+
exit 0
|
|
239
|
+
SH
|
|
240
|
+
cat > "$fakebin/tasks-axi" <<'SH'
|
|
241
|
+
#!/usr/bin/env bash
|
|
242
|
+
case "${1:-} ${2:-}" in
|
|
243
|
+
"--version ") printf '%s\n' '0.2.4' ;;
|
|
244
|
+
"update --help") printf '%s\n' 'usage: tasks-axi update <id> [flags]' ' --archive-body' ;;
|
|
245
|
+
"mv --help") printf '%s\n' 'usage: tasks-axi mv <id> [<id>...] --to <path-or-dir>' ;;
|
|
246
|
+
esac
|
|
247
|
+
exit 0
|
|
248
|
+
SH
|
|
249
|
+
cat > "$fakebin/quota-axi" <<'SH'
|
|
250
|
+
#!/usr/bin/env bash
|
|
251
|
+
if [ "${1:-}" = --version ]; then
|
|
252
|
+
printf '%s\n' '0.1.29'
|
|
253
|
+
exit 0
|
|
254
|
+
fi
|
|
255
|
+
exit 0
|
|
256
|
+
SH
|
|
257
|
+
chmod +x "$fakebin/gh-axi" "$fakebin/no-mistakes" "$fakebin/tasks-axi" "$fakebin/quota-axi"
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
new_git_world() {
|
|
261
|
+
local name=$1 w root home c1
|
|
262
|
+
w="$TMP_ROOT/$name"
|
|
263
|
+
root="$w/root"
|
|
264
|
+
home="$w/home"
|
|
265
|
+
mkdir -p "$home/state" "$home/data" "$home/config" "$home/projects"
|
|
266
|
+
touch "$home/state/.last-watcher-beat"
|
|
267
|
+
git init -q -b main "$root"
|
|
268
|
+
{
|
|
269
|
+
printf '%s\n' '.fm-secondmate-home'
|
|
270
|
+
printf '%s\n' 'data/'
|
|
271
|
+
printf '%s\n' 'state/'
|
|
272
|
+
printf '%s\n' 'config/'
|
|
273
|
+
printf '%s\n' 'projects/'
|
|
274
|
+
} > "$root/.gitignore"
|
|
275
|
+
printf '%s\n' "instructions" > "$root/AGENTS.md"
|
|
276
|
+
mkdir -p "$root/bin" "$root/.agents/skills"
|
|
277
|
+
printf '%s\n' "echo spawn" > "$root/bin/fm-spawn.sh"
|
|
278
|
+
printf '%s\n' "skill" > "$root/.agents/skills/example.md"
|
|
279
|
+
git -C "$root" add -A
|
|
280
|
+
git -C "$root" commit -qm initial
|
|
281
|
+
c1=$(git -C "$root" rev-parse HEAD)
|
|
282
|
+
git -C "$root" worktree add -q --detach "$w/sm" "$c1"
|
|
283
|
+
printf '%s\n' sm > "$w/sm/.fm-secondmate-home"
|
|
284
|
+
mkdir -p "$w/sm/data" "$w/sm/state" "$w/sm/config" "$w/sm/projects"
|
|
285
|
+
printf '%s\n' "charter" > "$w/sm/data/charter.md"
|
|
286
|
+
write_shared "$home/data/captain-shared.md" "shared from primary"
|
|
287
|
+
printf '%s|%s|%s|%s\n' "$w" "$root" "$home" "$w/sm"
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
test_spawn_convergence_point_copies_shared_file() {
|
|
291
|
+
local rec w root home sm fakebin data_override
|
|
292
|
+
rec=$(new_git_world spawn-point)
|
|
293
|
+
IFS='|' read -r w root home sm <<EOF
|
|
294
|
+
$rec
|
|
295
|
+
EOF
|
|
296
|
+
data_override="$w/primary-data-override"
|
|
297
|
+
mkdir -p "$data_override"
|
|
298
|
+
write_shared "$data_override/captain-shared.md" "shared from override"
|
|
299
|
+
fakebin=$(make_fake_spawn_toolchain "$w")
|
|
300
|
+
|
|
301
|
+
PATH="$fakebin:$BASE_PATH" TMUX='' \
|
|
302
|
+
FM_ROOT_OVERRIDE="$root" FM_HOME="$home" \
|
|
303
|
+
FM_STATE_OVERRIDE="$home/state" FM_DATA_OVERRIDE="$data_override" \
|
|
304
|
+
FM_PROJECTS_OVERRIDE="$home/projects" FM_CONFIG_OVERRIDE="$home/config" \
|
|
305
|
+
FM_SPAWN_NO_GUARD=1 \
|
|
306
|
+
"$ROOT/bin/fm-spawn.sh" sm "$sm" codex --secondmate >/dev/null 2>&1 || true
|
|
307
|
+
|
|
308
|
+
cmp -s "$data_override/captain-shared.md" "$sm/data/captain-shared.md" \
|
|
309
|
+
|| fail "spawn convergence point did not copy shared captain preferences from FM_DATA_OVERRIDE"
|
|
310
|
+
assert_shared_readonly "$sm/data/captain-shared.md"
|
|
311
|
+
pass "spawn convergence point propagates data/captain-shared.md from FM_DATA_OVERRIDE"
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
test_bootstrap_convergence_point_copies_shared_file() {
|
|
315
|
+
local rec w root home sm fakebin data_override out
|
|
316
|
+
rec=$(new_git_world bootstrap-point)
|
|
317
|
+
IFS='|' read -r w root home sm <<EOF
|
|
318
|
+
$rec
|
|
319
|
+
EOF
|
|
320
|
+
data_override="$w/primary-data-override"
|
|
321
|
+
mkdir -p "$data_override"
|
|
322
|
+
write_shared "$data_override/captain-shared.md" "shared from bootstrap override"
|
|
323
|
+
{
|
|
324
|
+
printf 'window=firstmate:fm-sm\n'
|
|
325
|
+
printf 'kind=secondmate\n'
|
|
326
|
+
} > "$home/state/sm.meta"
|
|
327
|
+
printf -- '- sm - fixture secondmate (home: %s; scope: fixture; projects: sample; added 2026-07-16)\n' "$sm" \
|
|
328
|
+
> "$data_override/secondmates.md"
|
|
329
|
+
fakebin=$(make_fake_spawn_toolchain "$w")
|
|
330
|
+
add_bootstrap_compatible_tools "$fakebin"
|
|
331
|
+
|
|
332
|
+
out=$(PATH="$fakebin:$BASE_PATH" FM_HOME="$home" FM_ROOT_OVERRIDE="$root" \
|
|
333
|
+
FM_DATA_OVERRIDE="$data_override" \
|
|
334
|
+
"$ROOT/bin/fm-bootstrap.sh" 2>/dev/null)
|
|
335
|
+
|
|
336
|
+
assert_not_contains "$out" "SECONDMATE_SYNC: secondmate sm: skipped: inheritance failed" \
|
|
337
|
+
"bootstrap inheritance should succeed"
|
|
338
|
+
cmp -s "$data_override/captain-shared.md" "$sm/data/captain-shared.md" \
|
|
339
|
+
|| fail "bootstrap convergence point did not copy shared captain preferences from FM_DATA_OVERRIDE"
|
|
340
|
+
assert_shared_readonly "$sm/data/captain-shared.md"
|
|
341
|
+
pass "bootstrap convergence point propagates data/captain-shared.md from FM_DATA_OVERRIDE"
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
test_config_push_convergence_point_updates_changed_source() {
|
|
345
|
+
local rec w root home sm data_override out
|
|
346
|
+
rec=$(new_git_world config-push-point)
|
|
347
|
+
IFS='|' read -r w root home sm <<EOF
|
|
348
|
+
$rec
|
|
349
|
+
EOF
|
|
350
|
+
data_override="$w/primary-data-override"
|
|
351
|
+
mkdir -p "$data_override"
|
|
352
|
+
{
|
|
353
|
+
printf 'window=firstmate:fm-sm\n'
|
|
354
|
+
printf 'kind=secondmate\n'
|
|
355
|
+
printf 'home=%s\n' "$sm"
|
|
356
|
+
} > "$home/state/sm.meta"
|
|
357
|
+
write_shared "$sm/data/captain-shared.md" "old shared bytes"
|
|
358
|
+
chmod "$FM_SHARED_CAPTAIN_MODE" "$sm/data/captain-shared.md"
|
|
359
|
+
write_shared "$data_override/captain-shared.md" "changed override shared bytes"
|
|
360
|
+
|
|
361
|
+
out=$(PATH="$BASE_PATH" FM_HOME="$home" FM_ROOT_OVERRIDE="$root" \
|
|
362
|
+
FM_DATA_OVERRIDE="$data_override" \
|
|
363
|
+
"$ROOT/bin/fm-config-push.sh" 2>/dev/null)
|
|
364
|
+
|
|
365
|
+
assert_contains "$out" "data/captain-shared.md: pushed - quarantined local drift at" \
|
|
366
|
+
"config-push should report the shared file update and quarantine"
|
|
367
|
+
cmp -s "$data_override/captain-shared.md" "$sm/data/captain-shared.md" \
|
|
368
|
+
|| fail "config-push convergence point did not update shared captain preferences from FM_DATA_OVERRIDE"
|
|
369
|
+
assert_shared_readonly "$sm/data/captain-shared.md"
|
|
370
|
+
pass "fm-config-push convergence point updates changed shared captain source bytes from FM_DATA_OVERRIDE"
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
test_session_start_digest_labels_shared_file_and_read_once_rule() {
|
|
374
|
+
local rec w root home _sm fakebin out contract
|
|
375
|
+
rec=$(new_git_world session-start-label)
|
|
376
|
+
IFS='|' read -r w root home _sm <<EOF
|
|
377
|
+
$rec
|
|
378
|
+
EOF
|
|
379
|
+
fakebin=$(make_fake_spawn_toolchain "$w")
|
|
380
|
+
add_bootstrap_compatible_tools "$fakebin"
|
|
381
|
+
fm_fake_exit0 "$fakebin" pgrep
|
|
382
|
+
|
|
383
|
+
out=$(PATH="$fakebin:$BASE_PATH" FM_HOME="$home" FM_ROOT_OVERRIDE="$root" \
|
|
384
|
+
"$ROOT/bin/fm-session-start.sh")
|
|
385
|
+
|
|
386
|
+
assert_contains "$out" "data/captain-shared.md (shared, main-authoritative, read-only in secondmate homes)" \
|
|
387
|
+
"session-start digest should label the shared captain file unmistakably"
|
|
388
|
+
assert_contains "$out" "shared from primary" "session-start digest should render the shared file"
|
|
389
|
+
contract=$(printf '%s\n' "$out" | awk '/^READ-ONCE CONTRACT$/ { f = 1 } /^FLEET STATE$/ { f = 0 } f')
|
|
390
|
+
assert_contains "$contract" "data/captain-shared.md" \
|
|
391
|
+
"read-once contract should name captain-shared.md among the files it covers"
|
|
392
|
+
pass "session-start digest renders data/captain-shared.md with the shared read-only label"
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
test_first_copy_readonly_and_local_files_preserved
|
|
396
|
+
test_drift_quarantine_collision_and_repeated_convergence
|
|
397
|
+
test_missing_source_mirrors_absence_without_losing_local_bytes
|
|
398
|
+
test_unsafe_artifacts_and_failure_restore_readonly_mode
|
|
399
|
+
test_spawn_convergence_point_copies_shared_file
|
|
400
|
+
test_bootstrap_convergence_point_copies_shared_file
|
|
401
|
+
test_config_push_convergence_point_updates_changed_source
|
|
402
|
+
test_session_start_digest_labels_shared_file_and_read_once_rule
|
|
403
|
+
|
|
404
|
+
echo "# all fm-shared-captain-inheritance tests passed"
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Behavior tests for fm-spawn.sh batch dispatch (`id=repo` pairs).
|
|
3
|
+
#
|
|
4
|
+
# These exercise argument routing only: each spawn attempt fails fast at the
|
|
5
|
+
# missing-brief check, which is reached before any tmux/treehouse side effect, so
|
|
6
|
+
# the tests create no windows or worktrees. FM_SPAWN_NO_GUARD=1 keeps them off the
|
|
7
|
+
# live watcher guard / state. Parser and path-scoping cases are table-driven; the
|
|
8
|
+
# only behavior asserted on its own is "a multi-pair batch does not stop after the
|
|
9
|
+
# first failure".
|
|
10
|
+
set -u
|
|
11
|
+
|
|
12
|
+
# shellcheck source=tests/lib.sh
|
|
13
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
14
|
+
|
|
15
|
+
SPAWN="$ROOT/bin/fm-spawn.sh"
|
|
16
|
+
TMP_ROOT=$(fm_test_tmproot fm-spawn-batch)
|
|
17
|
+
export FM_BACKEND=tmux
|
|
18
|
+
|
|
19
|
+
# Clear ambient firstmate overrides so the behavior test owns its environment.
|
|
20
|
+
run_spawn() {
|
|
21
|
+
FM_ROOT_OVERRIDE='' \
|
|
22
|
+
FM_HOME='' \
|
|
23
|
+
FM_STATE_OVERRIDE='' \
|
|
24
|
+
FM_DATA_OVERRIDE='' \
|
|
25
|
+
FM_PROJECTS_OVERRIDE='' \
|
|
26
|
+
FM_CONFIG_OVERRIDE='' \
|
|
27
|
+
FM_SPAWN_NO_GUARD=1 \
|
|
28
|
+
"$SPAWN" "$@" 2>&1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Ship spawns carry an explicit delivery contract (AGENTS.md section 7); the
|
|
32
|
+
# batch path takes one shared pair of flags for every pair.
|
|
33
|
+
run_ship_spawn() {
|
|
34
|
+
run_spawn "$@" --mode no-mistakes --yolo off
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# Every pair in a batch is dispatched even though the first one fails; the loop
|
|
38
|
+
# must not stop early. This is the load-bearing batch guarantee, kept explicit.
|
|
39
|
+
test_batch_dispatches_every_pair() {
|
|
40
|
+
local out status
|
|
41
|
+
out=$(run_ship_spawn nope-batch-a-z1=projects/none-a nope-batch-b-z2=projects/none-b)
|
|
42
|
+
status=$?
|
|
43
|
+
[ "$status" -ne 0 ] || fail "batch with missing briefs should exit non-zero"
|
|
44
|
+
printf '%s\n' "$out" | grep -F 'batch: FAILED to spawn nope-batch-a-z1 (projects/none-a)' >/dev/null \
|
|
45
|
+
|| fail "first pair was not dispatched/reported"
|
|
46
|
+
printf '%s\n' "$out" | grep -F 'batch: FAILED to spawn nope-batch-b-z2 (projects/none-b)' >/dev/null \
|
|
47
|
+
|| fail "second pair was not dispatched/reported (loop stopped early?)"
|
|
48
|
+
pass "batch dispatch re-execs and reports every id=repo pair"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# Boundary cases for batch detection. Each row:
|
|
52
|
+
# <label>|<batch yes/no>|<expect substring>|<args>
|
|
53
|
+
# batch=yes -> a 'batch:' line must appear; batch=no -> it must not.
|
|
54
|
+
test_batch_mode_boundaries() {
|
|
55
|
+
local label batch expect args out status
|
|
56
|
+
while IFS='|' read -r label batch expect args; do
|
|
57
|
+
[ -n "$label" ] || continue
|
|
58
|
+
# shellcheck disable=SC2086 # args is an intentional word-split arg list
|
|
59
|
+
out=$(run_ship_spawn $args)
|
|
60
|
+
status=$?
|
|
61
|
+
[ "$status" -ne 0 ] || fail "$label: expected non-zero exit"
|
|
62
|
+
if [ -n "$expect" ]; then
|
|
63
|
+
printf '%s\n' "$out" | grep -F "$expect" >/dev/null || fail "$label: missing '$expect'"
|
|
64
|
+
fi
|
|
65
|
+
case "$batch" in
|
|
66
|
+
yes) printf '%s\n' "$out" | grep -F 'batch:' >/dev/null || fail "$label: did not enter batch dispatch" ;;
|
|
67
|
+
no) printf '%s\n' "$out" | grep -F 'batch:' >/dev/null && fail "$label: wrongly entered batch dispatch" ;;
|
|
68
|
+
esac
|
|
69
|
+
done <<'ROWS'
|
|
70
|
+
single id=repo pair routes through batch|yes|batch: FAILED to spawn nope-batch-solo-z3 (projects/none-solo)|nope-batch-solo-z3=projects/none-solo
|
|
71
|
+
non-pair arg in batch is rejected|yes|batch dispatch expects every argument as id=repo; got 'bogus-no-equals'|nope-batch-mix-z5=projects/none-mix bogus-no-equals
|
|
72
|
+
plain '<id> <repo>' is single-task|no||nope-single-z4 projects/none-single
|
|
73
|
+
id part containing '/' is not a pair|no||weird/id-z6=projects/none projects/none
|
|
74
|
+
ROWS
|
|
75
|
+
pass "batch detection: single pair batches, non-pair rejected, single-task and slash-id stay single"
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# A projects/ path is resolved through the firstmate home, never the caller cwd,
|
|
79
|
+
# before the missing-brief check. One row per home-scoping override.
|
|
80
|
+
test_projects_path_scoping() {
|
|
81
|
+
local label use_override id home projects out status expected
|
|
82
|
+
while IFS='|' read -r label use_override id; do
|
|
83
|
+
[ -n "$label" ] || continue
|
|
84
|
+
home="$TMP_ROOT/$id home"
|
|
85
|
+
projects="$TMP_ROOT/$id projects"
|
|
86
|
+
mkdir -p "$home/data" "$projects/alpha"
|
|
87
|
+
if [ "$use_override" = yes ]; then
|
|
88
|
+
out=$(FM_ROOT_OVERRIDE='' FM_STATE_OVERRIDE='' FM_DATA_OVERRIDE='' FM_CONFIG_OVERRIDE='' \
|
|
89
|
+
FM_HOME="$home" FM_PROJECTS_OVERRIDE="$projects" FM_SPAWN_NO_GUARD=1 \
|
|
90
|
+
"$SPAWN" "$id" projects/alpha codex --mode no-mistakes --yolo off 2>&1)
|
|
91
|
+
else
|
|
92
|
+
mkdir -p "$home/projects/alpha"
|
|
93
|
+
out=$(FM_ROOT_OVERRIDE='' FM_STATE_OVERRIDE='' FM_DATA_OVERRIDE='' FM_PROJECTS_OVERRIDE='' FM_CONFIG_OVERRIDE='' \
|
|
94
|
+
FM_HOME="$home" FM_SPAWN_NO_GUARD=1 \
|
|
95
|
+
"$SPAWN" "$id" projects/alpha codex --mode no-mistakes --yolo off 2>&1)
|
|
96
|
+
fi
|
|
97
|
+
status=$?
|
|
98
|
+
[ "$status" -ne 0 ] || fail "$label: spawn with missing brief should fail"
|
|
99
|
+
expected="error: task $id has no brief at inaccessible data path $home/data/$id/brief.md"
|
|
100
|
+
printf '%s\n' "$out" | grep -F "$expected" >/dev/null \
|
|
101
|
+
|| fail "$label: projects/alpha was not resolved through the home before the brief check"
|
|
102
|
+
printf '%s\n' "$out" | grep -F 'cd: projects/alpha' >/dev/null \
|
|
103
|
+
&& fail "$label: spawn resolved projects/alpha from the caller cwd"
|
|
104
|
+
done <<'ROWS'
|
|
105
|
+
FM_HOME scopes projects/|no|nope-home-z7
|
|
106
|
+
FM_PROJECTS_OVERRIDE scopes projects/|yes|nope-override-z8
|
|
107
|
+
ROWS
|
|
108
|
+
pass "projects/ paths are scoped through the firstmate home for single-task spawn"
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
# A ship batch carries one shared delivery contract. Missing flags must stop the
|
|
112
|
+
# whole batch before any pair is dispatched, so a batch can never launch workers
|
|
113
|
+
# whose delivery posture was never decided.
|
|
114
|
+
test_batch_requires_the_shared_delivery_contract() {
|
|
115
|
+
local out status
|
|
116
|
+
out=$(run_spawn nope-batch-nomode-z9=projects/none-a nope-batch-nomode-z10=projects/none-b)
|
|
117
|
+
status=$?
|
|
118
|
+
[ "$status" -ne 0 ] || fail "a ship batch without --mode should exit non-zero"
|
|
119
|
+
printf '%s\n' "$out" | grep -F 'ship spawns require --mode' >/dev/null \
|
|
120
|
+
|| fail "batch refusal did not name the missing delivery mode"
|
|
121
|
+
printf '%s\n' "$out" | grep -F 'batch:' >/dev/null \
|
|
122
|
+
&& fail "batch dispatched pairs despite an undecided delivery contract"
|
|
123
|
+
|
|
124
|
+
out=$(run_spawn nope-batch-noyolo-z11=projects/none-a --mode direct-PR)
|
|
125
|
+
status=$?
|
|
126
|
+
[ "$status" -ne 0 ] || fail "a ship batch without --yolo should exit non-zero"
|
|
127
|
+
printf '%s\n' "$out" | grep -F 'ship spawns require --yolo' >/dev/null \
|
|
128
|
+
|| fail "batch refusal did not name the missing merge posture"
|
|
129
|
+
pass "batch dispatch requires the shared ship delivery contract before any pair runs"
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
# A scout batch has no delivery contract to share, so the flags are refused rather
|
|
133
|
+
# than accepted and ignored.
|
|
134
|
+
test_scout_batch_refuses_delivery_flags() {
|
|
135
|
+
local out status
|
|
136
|
+
out=$(run_spawn nope-batch-scout-z12=projects/none-a --scout --mode direct-PR --yolo on)
|
|
137
|
+
status=$?
|
|
138
|
+
[ "$status" -ne 0 ] || fail "a scout batch carrying delivery flags should exit non-zero"
|
|
139
|
+
printf '%s\n' "$out" | grep -F 'applies only to ship spawns' >/dev/null \
|
|
140
|
+
|| fail "scout batch did not refuse the delivery flags"
|
|
141
|
+
pass "scout batch refuses ship delivery flags instead of ignoring them"
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
test_batch_dispatches_every_pair
|
|
145
|
+
test_batch_mode_boundaries
|
|
146
|
+
test_batch_requires_the_shared_delivery_contract
|
|
147
|
+
test_scout_batch_refuses_delivery_flags
|
|
148
|
+
test_projects_path_scoping
|