@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,141 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Structural regression tests for the tracked documentation audience inventory.
|
|
3
|
+
set -u
|
|
4
|
+
|
|
5
|
+
# shellcheck source=tests/lib.sh
|
|
6
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
7
|
+
|
|
8
|
+
CHECK="$ROOT/bin/fm-doc-audience-check.sh"
|
|
9
|
+
INVENTORY="$ROOT/docs/documentation-audiences.json"
|
|
10
|
+
TMP_ROOT=$(mktemp -d "${TMPDIR:-/tmp}/fm-doc-audiences.XXXXXX")
|
|
11
|
+
trap 'rm -rf "$TMP_ROOT"' EXIT
|
|
12
|
+
|
|
13
|
+
run_expect_failure() {
|
|
14
|
+
local expected=$1
|
|
15
|
+
shift
|
|
16
|
+
local out rc
|
|
17
|
+
set +e
|
|
18
|
+
out=$("$@" 2>&1)
|
|
19
|
+
rc=$?
|
|
20
|
+
set -e
|
|
21
|
+
[ "$rc" -ne 0 ] || fail "expected failure containing '$expected'"
|
|
22
|
+
assert_contains "$out" "$expected" "failure did not explain '$expected'"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
mutate_inventory() {
|
|
26
|
+
local source=$1 destination=$2 mode=$3
|
|
27
|
+
python3 - "$source" "$destination" "$mode" <<'PY'
|
|
28
|
+
import json
|
|
29
|
+
import sys
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
source, destination, mode = map(Path, sys.argv[1:])
|
|
33
|
+
data = json.loads(source.read_text(encoding="utf-8"))
|
|
34
|
+
if mode.name == "duplicate":
|
|
35
|
+
data["surfaces"].append(dict(data["surfaces"][0]))
|
|
36
|
+
elif mode.name == "bad-setup-audience":
|
|
37
|
+
for entry in data["surfaces"]:
|
|
38
|
+
if entry["path"] == "docs/tmux-backend.md":
|
|
39
|
+
entry["audience"] = "maintainer-verification"
|
|
40
|
+
break
|
|
41
|
+
elif mode.name == "missing-owner-pointer":
|
|
42
|
+
data["requiredOwnerPointers"][0] = {
|
|
43
|
+
"source": "README.md",
|
|
44
|
+
"target": "docs/sessionstart-nudge.md",
|
|
45
|
+
}
|
|
46
|
+
elif mode.name == "shrink-scope":
|
|
47
|
+
data["scope"]["trackedPatterns"] = ["README.md"]
|
|
48
|
+
else:
|
|
49
|
+
raise SystemExit(f"unknown mode: {mode.name}")
|
|
50
|
+
destination.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
|
|
51
|
+
PY
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
test_repository_inventory_passes() {
|
|
55
|
+
local out
|
|
56
|
+
out=$("$CHECK") || fail "repository documentation audience check failed"
|
|
57
|
+
assert_contains "$out" "fm-doc-audience-check: ok surfaces=" \
|
|
58
|
+
"audience check did not report exact surface coverage"
|
|
59
|
+
assert_contains "$out" "local_links=" \
|
|
60
|
+
"audience check did not report local-link validation"
|
|
61
|
+
pass "documentation inventory classifies every maintained prose surface exactly once"
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
test_duplicate_and_setup_classification_fail() {
|
|
65
|
+
local duplicate="$TMP_ROOT/duplicate.json"
|
|
66
|
+
local bad_setup="$TMP_ROOT/bad-setup.json"
|
|
67
|
+
local shrink_scope="$TMP_ROOT/shrink-scope.json"
|
|
68
|
+
mutate_inventory "$INVENTORY" "$duplicate" duplicate
|
|
69
|
+
mutate_inventory "$INVENTORY" "$bad_setup" bad-setup-audience
|
|
70
|
+
mutate_inventory "$INVENTORY" "$shrink_scope" shrink-scope
|
|
71
|
+
run_expect_failure "surfaces classified more than once" \
|
|
72
|
+
"$CHECK" --inventory "$duplicate"
|
|
73
|
+
run_expect_failure "README setup target docs/tmux-backend.md has disallowed audience" \
|
|
74
|
+
"$CHECK" --inventory "$bad_setup"
|
|
75
|
+
run_expect_failure "scope.trackedPatterns must match the fixed maintained-prose scope" \
|
|
76
|
+
"$CHECK" --inventory "$shrink_scope"
|
|
77
|
+
pass "classification, setup routing, and maintained-prose scope fail safely"
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
test_required_pointer_fails() {
|
|
81
|
+
local missing_pointer="$TMP_ROOT/missing-pointer.json"
|
|
82
|
+
mutate_inventory "$INVENTORY" "$missing_pointer" missing-owner-pointer
|
|
83
|
+
run_expect_failure "required owner pointer missing" \
|
|
84
|
+
"$CHECK" --inventory "$missing_pointer"
|
|
85
|
+
pass "required documentation owner pointers cannot silently disappear"
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
write_fixture_inventory() {
|
|
89
|
+
local repo=$1
|
|
90
|
+
cat > "$repo/docs/documentation-audiences.json" <<'JSON'
|
|
91
|
+
{
|
|
92
|
+
"version": 1,
|
|
93
|
+
"scope": {"trackedPatterns": ["*.md", "*.mdx", "*.rst", "*.txt", "docs/examples/*"]},
|
|
94
|
+
"allowedAudiences": ["public-product", "operator-current", "maintainer-verification"],
|
|
95
|
+
"setupAudiences": ["public-product", "operator-current"],
|
|
96
|
+
"readmeSetupTargets": ["docs/setup.md"],
|
|
97
|
+
"requiredOwnerPointers": [
|
|
98
|
+
{"source": "README.md", "target": "docs/policy.md"}
|
|
99
|
+
],
|
|
100
|
+
"surfaces": [
|
|
101
|
+
{"path": "README.md", "audience": "public-product"},
|
|
102
|
+
{"path": "docs/evidence.md", "audience": "maintainer-verification"},
|
|
103
|
+
{"path": "docs/policy.md", "audience": "operator-current"},
|
|
104
|
+
{"path": "docs/setup.md", "audience": "operator-current"}
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
JSON
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
test_local_links_and_no_keyword_heuristic() {
|
|
111
|
+
local repo="$TMP_ROOT/fixture"
|
|
112
|
+
mkdir -p "$repo/docs"
|
|
113
|
+
git -C "$repo" init -q
|
|
114
|
+
printf '%s\n' '[Setup](docs/setup.md) [Policy](docs/policy.md)' > "$repo/README.md"
|
|
115
|
+
printf '%s\n' '# Setup' > "$repo/docs/setup.md"
|
|
116
|
+
printf '%s\n' '# Policy' > "$repo/docs/policy.md"
|
|
117
|
+
cat > "$repo/docs/evidence.md" <<'MD'
|
|
118
|
+
# Incident verification on 2026-07-23
|
|
119
|
+
|
|
120
|
+
```sh
|
|
121
|
+
./task-worktree/bin/tool --version
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Observed version 1.2.3 on branch `fm/example`.
|
|
125
|
+
MD
|
|
126
|
+
write_fixture_inventory "$repo"
|
|
127
|
+
git -C "$repo" add README.md docs
|
|
128
|
+
"$CHECK" --root "$repo" >/dev/null \
|
|
129
|
+
|| fail "structural checker rejected legitimate maintainer evidence prose"
|
|
130
|
+
|
|
131
|
+
printf '%s\n' '[Setup](docs/setup.md) [Policy](docs/policy.md) [Broken](docs/missing.bin)' \
|
|
132
|
+
> "$repo/README.md"
|
|
133
|
+
git -C "$repo" add README.md
|
|
134
|
+
run_expect_failure "unresolved local link" "$CHECK" --root "$repo"
|
|
135
|
+
pass "local links resolve while dates, versions, commands, and incident prose remain semantically reviewed"
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
test_repository_inventory_passes
|
|
139
|
+
test_duplicate_and_setup_classification_fail
|
|
140
|
+
test_required_pointer_fails
|
|
141
|
+
test_local_links_and_no_keyword_heuristic
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Behavior tests for bin/fm-ensure-agents-md.sh.
|
|
3
|
+
set -u
|
|
4
|
+
|
|
5
|
+
# shellcheck source=tests/lib.sh
|
|
6
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
7
|
+
|
|
8
|
+
TMP_ROOT=$(fm_test_tmproot fm-ensure-agents-md)
|
|
9
|
+
|
|
10
|
+
# Public contract: CLAUDE.md is this exact two-line pointer, never a symlink.
|
|
11
|
+
assert_claude_pointer() {
|
|
12
|
+
local path=$1
|
|
13
|
+
[ -e "$path" ] || fail "CLAUDE.md is missing"
|
|
14
|
+
[ ! -L "$path" ] || fail "CLAUDE.md is a symlink; expected a real @AGENTS.md pointer file"
|
|
15
|
+
[ -f "$path" ] || fail "CLAUDE.md is not a regular file"
|
|
16
|
+
cmp -s "$path" - <<'EOF' || fail "CLAUDE.md is not the canonical @AGENTS.md pointer"
|
|
17
|
+
<!-- Points Claude at AGENTS.md via import; edit AGENTS.md, not this file. -->
|
|
18
|
+
@AGENTS.md
|
|
19
|
+
EOF
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
write_fixture_claude_pointer() {
|
|
23
|
+
cat > "$1/CLAUDE.md" <<'EOF'
|
|
24
|
+
<!-- Points Claude at AGENTS.md via import; edit AGENTS.md, not this file. -->
|
|
25
|
+
@AGENTS.md
|
|
26
|
+
EOF
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
test_created_agents_md_includes_self_governance() {
|
|
30
|
+
local repo agents
|
|
31
|
+
repo="$TMP_ROOT/new-project"
|
|
32
|
+
mkdir -p "$repo"
|
|
33
|
+
"$ROOT/bin/fm-ensure-agents-md.sh" "$repo" >/dev/null 2>&1 || fail "fm-ensure-agents-md.sh failed for empty project"
|
|
34
|
+
agents="$repo/AGENTS.md"
|
|
35
|
+
assert_present "$agents" "AGENTS.md was not created"
|
|
36
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
37
|
+
assert_grep "## Maintaining this file" "$agents" "self-governance section heading missing"
|
|
38
|
+
assert_grep "Keep this file for knowledge useful to almost every future agent session in this project." "$agents" \
|
|
39
|
+
"self-governance section lost the future-session bar"
|
|
40
|
+
assert_grep "Do not repeat what the codebase already shows; point to the authoritative file or command instead." "$agents" \
|
|
41
|
+
"self-governance section lost pointer-over-copy guidance"
|
|
42
|
+
assert_grep "Prefer rewriting or pruning existing entries over appending new ones." "$agents" \
|
|
43
|
+
"self-governance section lost rewrite-or-prune guidance"
|
|
44
|
+
assert_grep "When updating this file, preserve this bar for all agents and keep entries concise." "$agents" \
|
|
45
|
+
"self-governance section lost all-agents maintenance guidance"
|
|
46
|
+
pass "fm-ensure-agents-md.sh: created AGENTS.md includes self-governance section"
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
test_fresh_setup_writes_real_claude_pointer() {
|
|
50
|
+
local repo out
|
|
51
|
+
repo="$TMP_ROOT/fresh-pointer-project"
|
|
52
|
+
mkdir -p "$repo"
|
|
53
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
54
|
+
|| fail "fm-ensure-agents-md.sh failed creating a fresh pointer"
|
|
55
|
+
assert_contains "$out" "created:" "fresh setup did not report created"
|
|
56
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
57
|
+
[ ! -L "$repo/CLAUDE.md" ] || fail "fresh setup created a CLAUDE.md symlink"
|
|
58
|
+
pass "fm-ensure-agents-md.sh: fresh setup writes a real @AGENTS.md pointer"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
test_promoted_claude_md_includes_self_governance() {
|
|
62
|
+
local repo agents count
|
|
63
|
+
repo="$TMP_ROOT/claude-project"
|
|
64
|
+
mkdir -p "$repo"
|
|
65
|
+
cat > "$repo/CLAUDE.md" <<'EOF'
|
|
66
|
+
# Existing agent memory
|
|
67
|
+
|
|
68
|
+
Run tests with `make test`.
|
|
69
|
+
EOF
|
|
70
|
+
"$ROOT/bin/fm-ensure-agents-md.sh" "$repo" >/dev/null 2>&1 || fail "fm-ensure-agents-md.sh failed for CLAUDE.md promotion"
|
|
71
|
+
agents="$repo/AGENTS.md"
|
|
72
|
+
assert_present "$agents" "AGENTS.md was not created during promotion"
|
|
73
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
74
|
+
assert_grep "Run tests with \`make test\`." "$agents" \
|
|
75
|
+
"promotion lost existing CLAUDE.md content"
|
|
76
|
+
count=$(grep -Fc "## Maintaining this file" "$agents")
|
|
77
|
+
[ "$count" -eq 1 ] || fail "promotion wrote $count self-governance sections"
|
|
78
|
+
assert_grep "Keep this file for knowledge useful to almost every future agent session in this project." "$agents" \
|
|
79
|
+
"promoted AGENTS.md missing self-governance wording"
|
|
80
|
+
pass "fm-ensure-agents-md.sh: promoted CLAUDE.md includes self-governance section"
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
test_promoted_claude_md_without_trailing_newline_keeps_blank_separator() {
|
|
84
|
+
local repo agents before
|
|
85
|
+
repo="$TMP_ROOT/no-trailing-newline-project"
|
|
86
|
+
mkdir -p "$repo"
|
|
87
|
+
printf '# Existing agent memory\n\nRun tests with make test.' > "$repo/CLAUDE.md"
|
|
88
|
+
"$ROOT/bin/fm-ensure-agents-md.sh" "$repo" >/dev/null 2>&1 || fail "fm-ensure-agents-md.sh failed for newline-less CLAUDE.md promotion"
|
|
89
|
+
agents="$repo/AGENTS.md"
|
|
90
|
+
assert_grep "Run tests with make test." "$agents" \
|
|
91
|
+
"newline-less promotion lost or mangled the last content line"
|
|
92
|
+
assert_grep "## Maintaining this file" "$agents" \
|
|
93
|
+
"newline-less promotion did not append the self-governance section"
|
|
94
|
+
before=$(grep -B1 -Fx '## Maintaining this file' "$agents" | head -n 1)
|
|
95
|
+
[ -z "$before" ] || fail "self-governance heading not preceded by a blank line (got: $before)"
|
|
96
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
97
|
+
pass "fm-ensure-agents-md.sh: newline-less promotion keeps a blank separator line"
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
test_existing_agents_md_with_symlink_gains_self_governance() {
|
|
101
|
+
local repo agents out count
|
|
102
|
+
repo="$TMP_ROOT/existing-symlinked-project"
|
|
103
|
+
mkdir -p "$repo"
|
|
104
|
+
printf '# Existing agent memory\n\nBuild with make.\n' > "$repo/AGENTS.md"
|
|
105
|
+
ln -s AGENTS.md "$repo/CLAUDE.md"
|
|
106
|
+
agents="$repo/AGENTS.md"
|
|
107
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
108
|
+
|| fail "fm-ensure-agents-md.sh failed for existing AGENTS.md with symlink"
|
|
109
|
+
assert_contains "$out" "updated:" "injection into existing AGENTS.md did not report an update"
|
|
110
|
+
assert_grep "Build with make." "$agents" "injection dropped existing AGENTS.md content"
|
|
111
|
+
assert_grep "## Maintaining this file" "$agents" "existing AGENTS.md did not gain the self-governance section"
|
|
112
|
+
count=$(grep -Fc "## Maintaining this file" "$agents")
|
|
113
|
+
[ "$count" -eq 1 ] || fail "injection wrote $count self-governance sections"
|
|
114
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
115
|
+
# Re-run must be a byte-exact no-op reporting unchanged.
|
|
116
|
+
cp "$agents" "$repo/.after-first"
|
|
117
|
+
cp "$repo/CLAUDE.md" "$repo/.claude-after-first"
|
|
118
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
119
|
+
|| fail "fm-ensure-agents-md.sh failed on idempotent re-run"
|
|
120
|
+
assert_contains "$out" "unchanged:" "idempotent re-run did not report unchanged"
|
|
121
|
+
diff "$repo/.after-first" "$agents" >/dev/null \
|
|
122
|
+
|| fail "idempotent re-run modified AGENTS.md"
|
|
123
|
+
cmp -s "$repo/.claude-after-first" "$repo/CLAUDE.md" \
|
|
124
|
+
|| fail "idempotent re-run modified CLAUDE.md"
|
|
125
|
+
pass "fm-ensure-agents-md.sh: existing symlinked AGENTS.md gains the section idempotently"
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
test_correct_symlink_migrates_to_pointer_without_clobbering_agents() {
|
|
129
|
+
local repo agents out
|
|
130
|
+
repo="$TMP_ROOT/symlink-migrate-project"
|
|
131
|
+
mkdir -p "$repo"
|
|
132
|
+
printf '# Unique agent memory\n\nDo not clobber this payload.\n\n## Maintaining this file\n\nKeep this file for knowledge useful to almost every future agent session in this project.\nDo not repeat what the codebase already shows; point to the authoritative file or command instead.\nPrefer rewriting or pruning existing entries over appending new ones.\nWhen updating this file, preserve this bar for all agents and keep entries concise.\n' > "$repo/AGENTS.md"
|
|
133
|
+
ln -s AGENTS.md "$repo/CLAUDE.md"
|
|
134
|
+
agents="$repo/AGENTS.md"
|
|
135
|
+
cp "$agents" "$repo/.before"
|
|
136
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
137
|
+
|| fail "fm-ensure-agents-md.sh failed migrating a correct CLAUDE.md symlink"
|
|
138
|
+
assert_contains "$out" "updated:" "symlink migration did not report an update"
|
|
139
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
140
|
+
cmp -s "$repo/.before" "$agents" \
|
|
141
|
+
|| fail "symlink migration clobbered AGENTS.md"
|
|
142
|
+
assert_grep "Do not clobber this payload." "$agents" \
|
|
143
|
+
"symlink migration lost unique AGENTS.md content"
|
|
144
|
+
cp "$agents" "$repo/.after-first"
|
|
145
|
+
cp "$repo/CLAUDE.md" "$repo/.claude-after-first"
|
|
146
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
147
|
+
|| fail "fm-ensure-agents-md.sh failed on post-migration re-run"
|
|
148
|
+
assert_contains "$out" "unchanged:" "post-migration re-run did not report unchanged"
|
|
149
|
+
cmp -s "$repo/.after-first" "$agents" \
|
|
150
|
+
|| fail "post-migration re-run modified AGENTS.md"
|
|
151
|
+
cmp -s "$repo/.claude-after-first" "$repo/CLAUDE.md" \
|
|
152
|
+
|| fail "post-migration re-run modified CLAUDE.md"
|
|
153
|
+
pass "fm-ensure-agents-md.sh: correct symlink migrates to pointer without clobbering AGENTS.md"
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
test_existing_agents_md_without_claude_gains_section_and_pointer() {
|
|
157
|
+
local repo agents out count
|
|
158
|
+
repo="$TMP_ROOT/existing-bare-project"
|
|
159
|
+
mkdir -p "$repo"
|
|
160
|
+
printf '# Existing agent memory\n\nDeploy with kubectl.\n' > "$repo/AGENTS.md"
|
|
161
|
+
agents="$repo/AGENTS.md"
|
|
162
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
163
|
+
|| fail "fm-ensure-agents-md.sh failed for existing AGENTS.md without CLAUDE.md"
|
|
164
|
+
assert_contains "$out" "updated:" "injection without CLAUDE.md did not report an update"
|
|
165
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
166
|
+
assert_grep "Deploy with kubectl." "$agents" "injection dropped existing AGENTS.md content"
|
|
167
|
+
count=$(grep -Fc "## Maintaining this file" "$agents")
|
|
168
|
+
[ "$count" -eq 1 ] || fail "injection wrote $count self-governance sections"
|
|
169
|
+
pass "fm-ensure-agents-md.sh: existing AGENTS.md without CLAUDE.md gains section and pointer"
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
test_existing_agents_md_with_section_reports_unchanged() {
|
|
173
|
+
local repo agents out
|
|
174
|
+
repo="$TMP_ROOT/fully-formed-project"
|
|
175
|
+
mkdir -p "$repo"
|
|
176
|
+
# Build a fully-formed project (AGENTS.md with the section + canonical pointer).
|
|
177
|
+
"$ROOT/bin/fm-ensure-agents-md.sh" "$repo" >/dev/null 2>&1 \
|
|
178
|
+
|| fail "fm-ensure-agents-md.sh failed building the fully-formed fixture"
|
|
179
|
+
agents="$repo/AGENTS.md"
|
|
180
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
181
|
+
cp "$agents" "$repo/.before"
|
|
182
|
+
cp "$repo/CLAUDE.md" "$repo/.claude-before"
|
|
183
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
184
|
+
|| fail "fm-ensure-agents-md.sh failed on already-formed project"
|
|
185
|
+
assert_contains "$out" "unchanged:" "already-formed project was not reported unchanged"
|
|
186
|
+
diff "$repo/.before" "$agents" >/dev/null \
|
|
187
|
+
|| fail "already-formed AGENTS.md was modified"
|
|
188
|
+
cmp -s "$repo/.claude-before" "$repo/CLAUDE.md" \
|
|
189
|
+
|| fail "already-formed CLAUDE.md was modified"
|
|
190
|
+
pass "fm-ensure-agents-md.sh: AGENTS.md that already has the section stays unchanged"
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
test_existing_crlf_agents_md_with_section_stays_unchanged() {
|
|
194
|
+
local repo agents out count
|
|
195
|
+
repo="$TMP_ROOT/crlf-formed-project"
|
|
196
|
+
mkdir -p "$repo"
|
|
197
|
+
printf '%s\r\n' \
|
|
198
|
+
'# Existing agent memory' \
|
|
199
|
+
'' \
|
|
200
|
+
'## Maintaining this file' \
|
|
201
|
+
'' \
|
|
202
|
+
'Keep this file for knowledge useful to almost every future agent session in this project.' \
|
|
203
|
+
'Do not repeat what the codebase already shows; point to the authoritative file or command instead.' \
|
|
204
|
+
'Prefer rewriting or pruning existing entries over appending new ones.' \
|
|
205
|
+
'When updating this file, preserve this bar for all agents and keep entries concise.' > "$repo/AGENTS.md"
|
|
206
|
+
write_fixture_claude_pointer "$repo"
|
|
207
|
+
agents="$repo/AGENTS.md"
|
|
208
|
+
cp "$agents" "$repo/.before"
|
|
209
|
+
cp "$repo/CLAUDE.md" "$repo/.claude-before"
|
|
210
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
211
|
+
|| fail "fm-ensure-agents-md.sh failed on CRLF AGENTS.md with the section"
|
|
212
|
+
assert_contains "$out" "unchanged:" "complete CRLF AGENTS.md was not reported unchanged"
|
|
213
|
+
cmp -s "$repo/.before" "$agents" \
|
|
214
|
+
|| fail "complete CRLF AGENTS.md was modified"
|
|
215
|
+
cmp -s "$repo/.claude-before" "$repo/CLAUDE.md" \
|
|
216
|
+
|| fail "complete CRLF project's CLAUDE.md was modified"
|
|
217
|
+
count=$(LC_ALL=C grep -a -c '## Maintaining this file' "$agents")
|
|
218
|
+
[ "$count" -eq 1 ] || fail "complete CRLF AGENTS.md has $count self-governance sections"
|
|
219
|
+
pass "fm-ensure-agents-md.sh: CRLF AGENTS.md with the section stays unchanged"
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
test_existing_crlf_agents_md_without_section_preserves_crlf() {
|
|
223
|
+
local repo agents out
|
|
224
|
+
repo="$TMP_ROOT/crlf-injected-project"
|
|
225
|
+
mkdir -p "$repo"
|
|
226
|
+
printf '%s\r\n' \
|
|
227
|
+
'# Existing agent memory' \
|
|
228
|
+
'' \
|
|
229
|
+
'Run tests with make test.' > "$repo/AGENTS.md"
|
|
230
|
+
ln -s AGENTS.md "$repo/CLAUDE.md"
|
|
231
|
+
agents="$repo/AGENTS.md"
|
|
232
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
233
|
+
|| fail "fm-ensure-agents-md.sh failed injecting into CRLF AGENTS.md"
|
|
234
|
+
assert_contains "$out" "updated:" "CRLF AGENTS.md injection did not report an update"
|
|
235
|
+
printf '%s\r\n' \
|
|
236
|
+
'# Existing agent memory' \
|
|
237
|
+
'' \
|
|
238
|
+
'Run tests with make test.' \
|
|
239
|
+
'' \
|
|
240
|
+
'## Maintaining this file' \
|
|
241
|
+
'' \
|
|
242
|
+
'Keep this file for knowledge useful to almost every future agent session in this project.' \
|
|
243
|
+
'Do not repeat what the codebase already shows; point to the authoritative file or command instead.' \
|
|
244
|
+
'Prefer rewriting or pruning existing entries over appending new ones.' \
|
|
245
|
+
'When updating this file, preserve this bar for all agents and keep entries concise.' > "$repo/.expected"
|
|
246
|
+
cmp -s "$repo/.expected" "$agents" \
|
|
247
|
+
|| fail "CRLF AGENTS.md injection did not preserve CRLF line endings"
|
|
248
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
249
|
+
cp "$agents" "$repo/.after-first"
|
|
250
|
+
cp "$repo/CLAUDE.md" "$repo/.claude-after-first"
|
|
251
|
+
"$ROOT/bin/fm-ensure-agents-md.sh" "$repo" >/dev/null 2>&1 \
|
|
252
|
+
|| fail "fm-ensure-agents-md.sh failed on idempotent CRLF re-run"
|
|
253
|
+
cmp -s "$repo/.after-first" "$agents" \
|
|
254
|
+
|| fail "idempotent CRLF re-run modified AGENTS.md"
|
|
255
|
+
cmp -s "$repo/.claude-after-first" "$repo/CLAUDE.md" \
|
|
256
|
+
|| fail "idempotent CRLF re-run modified CLAUDE.md"
|
|
257
|
+
pass "fm-ensure-agents-md.sh: CRLF injection preserves line endings idempotently"
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
test_canonical_pointer_is_accepted_when_both_are_real_files() {
|
|
261
|
+
local repo out
|
|
262
|
+
repo="$TMP_ROOT/both-real-pointer-project"
|
|
263
|
+
mkdir -p "$repo"
|
|
264
|
+
printf '# Existing agent memory\n\n## Maintaining this file\n\nKeep this file for knowledge useful to almost every future agent session in this project.\nDo not repeat what the codebase already shows; point to the authoritative file or command instead.\nPrefer rewriting or pruning existing entries over appending new ones.\nWhen updating this file, preserve this bar for all agents and keep entries concise.\n' > "$repo/AGENTS.md"
|
|
265
|
+
write_fixture_claude_pointer "$repo"
|
|
266
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1) \
|
|
267
|
+
|| fail "fm-ensure-agents-md.sh refused a canonical real CLAUDE.md pointer"
|
|
268
|
+
assert_contains "$out" "unchanged:" "canonical pointer plus AGENTS.md was not reported unchanged"
|
|
269
|
+
assert_claude_pointer "$repo/CLAUDE.md"
|
|
270
|
+
pass "fm-ensure-agents-md.sh: canonical real CLAUDE.md pointer is not a conflict"
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
test_distinct_real_files_are_refused() {
|
|
274
|
+
local repo out rc
|
|
275
|
+
repo="$TMP_ROOT/distinct-real-files-project"
|
|
276
|
+
mkdir -p "$repo"
|
|
277
|
+
printf '# Agents memory\n' > "$repo/AGENTS.md"
|
|
278
|
+
printf '# Claude memory\n' > "$repo/CLAUDE.md"
|
|
279
|
+
cp "$repo/AGENTS.md" "$repo/.agents-before"
|
|
280
|
+
cp "$repo/CLAUDE.md" "$repo/.claude-before"
|
|
281
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1)
|
|
282
|
+
rc=$?
|
|
283
|
+
[ "$rc" -ne 0 ] || fail "expected a non-zero exit for distinct real AGENTS.md and CLAUDE.md"
|
|
284
|
+
assert_contains "$out" "conflict:" "distinct real files did not report a conflict"
|
|
285
|
+
cmp -s "$repo/.agents-before" "$repo/AGENTS.md" \
|
|
286
|
+
|| fail "distinct-real-files refusal modified AGENTS.md"
|
|
287
|
+
cmp -s "$repo/.claude-before" "$repo/CLAUDE.md" \
|
|
288
|
+
|| fail "distinct-real-files refusal modified CLAUDE.md"
|
|
289
|
+
[ ! -L "$repo/CLAUDE.md" ] || fail "distinct-real-files refusal turned CLAUDE.md into a symlink"
|
|
290
|
+
pass "fm-ensure-agents-md.sh: refuses distinct real AGENTS.md and CLAUDE.md"
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
test_agents_md_symlink_is_refused() {
|
|
294
|
+
local repo out rc
|
|
295
|
+
repo="$TMP_ROOT/agents-symlink-project"
|
|
296
|
+
mkdir -p "$repo"
|
|
297
|
+
printf '# payload\n' > "$repo/payload.md"
|
|
298
|
+
ln -s payload.md "$repo/AGENTS.md"
|
|
299
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1)
|
|
300
|
+
rc=$?
|
|
301
|
+
[ "$rc" -ne 0 ] || fail "expected a non-zero exit when AGENTS.md is a symlink"
|
|
302
|
+
assert_contains "$out" "conflict:" "AGENTS.md symlink did not report a conflict"
|
|
303
|
+
[ -L "$repo/AGENTS.md" ] || fail "AGENTS.md symlink refusal disturbed the symlink"
|
|
304
|
+
assert_absent "$repo/CLAUDE.md" "AGENTS.md symlink refusal created CLAUDE.md"
|
|
305
|
+
pass "fm-ensure-agents-md.sh: refuses AGENTS.md when it is a symlink"
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
test_wrong_target_symlink_is_refused() {
|
|
309
|
+
local repo out rc
|
|
310
|
+
repo="$TMP_ROOT/wrong-target-project"
|
|
311
|
+
mkdir -p "$repo"
|
|
312
|
+
printf '# Agents memory\n' > "$repo/AGENTS.md"
|
|
313
|
+
printf '# other\n' > "$repo/OTHER.md"
|
|
314
|
+
ln -s OTHER.md "$repo/CLAUDE.md"
|
|
315
|
+
cp "$repo/AGENTS.md" "$repo/.agents-before"
|
|
316
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1)
|
|
317
|
+
rc=$?
|
|
318
|
+
[ "$rc" -ne 0 ] || fail "expected a non-zero exit for a CLAUDE.md symlink that does not point to AGENTS.md"
|
|
319
|
+
assert_contains "$out" "conflict:" "wrong-target CLAUDE.md symlink did not report a conflict"
|
|
320
|
+
[ -L "$repo/CLAUDE.md" ] || fail "wrong-target refusal removed the CLAUDE.md symlink"
|
|
321
|
+
[ "$(readlink "$repo/CLAUDE.md")" = "OTHER.md" ] || fail "wrong-target refusal retargeted CLAUDE.md"
|
|
322
|
+
cmp -s "$repo/.agents-before" "$repo/AGENTS.md" \
|
|
323
|
+
|| fail "wrong-target refusal modified AGENTS.md"
|
|
324
|
+
pass "fm-ensure-agents-md.sh: refuses a CLAUDE.md symlink that does not point to AGENTS.md"
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
test_non_regular_claude_md_is_refused() {
|
|
328
|
+
local repo out rc
|
|
329
|
+
repo="$TMP_ROOT/non-regular-claude-project"
|
|
330
|
+
mkdir -p "$repo" "$repo/CLAUDE.md"
|
|
331
|
+
printf '# Agents memory\n' > "$repo/AGENTS.md"
|
|
332
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1)
|
|
333
|
+
rc=$?
|
|
334
|
+
[ "$rc" -ne 0 ] || fail "expected a non-zero exit when CLAUDE.md is a directory"
|
|
335
|
+
assert_contains "$out" "conflict:" "non-regular CLAUDE.md did not report a conflict"
|
|
336
|
+
[ -d "$repo/CLAUDE.md" ] || fail "non-regular CLAUDE.md refusal disturbed the directory"
|
|
337
|
+
pass "fm-ensure-agents-md.sh: refuses a non-regular CLAUDE.md"
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
test_lowercase_agents_md_refuses_case_fragile_pointer() {
|
|
341
|
+
local repo out rc
|
|
342
|
+
repo="$TMP_ROOT/lowercase-project"
|
|
343
|
+
mkdir -p "$repo"
|
|
344
|
+
printf '# project memory\n' > "$repo/agents.md"
|
|
345
|
+
out=$("$ROOT/bin/fm-ensure-agents-md.sh" "$repo" 2>&1)
|
|
346
|
+
rc=$?
|
|
347
|
+
[ "$rc" -ne 0 ] || fail "expected a non-zero exit for a lowercase agents.md"
|
|
348
|
+
assert_contains "$out" "conflict:" "lowercase agents.md did not report a conflict"
|
|
349
|
+
assert_contains "$out" "agents.md" "conflict message did not name the offending file"
|
|
350
|
+
assert_absent "$repo/CLAUDE.md" "a case-fragile CLAUDE.md pointer was created for lowercase agents.md"
|
|
351
|
+
[ ! -L "$repo/CLAUDE.md" ] || fail "a case-fragile CLAUDE.md symlink was created for lowercase agents.md"
|
|
352
|
+
assert_present "$repo/agents.md" "the real lowercase agents.md was disturbed"
|
|
353
|
+
pass "fm-ensure-agents-md.sh: refuses a case-variant lowercase agents.md (issue #389)"
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
test_created_agents_md_includes_self_governance
|
|
357
|
+
test_fresh_setup_writes_real_claude_pointer
|
|
358
|
+
test_promoted_claude_md_includes_self_governance
|
|
359
|
+
test_promoted_claude_md_without_trailing_newline_keeps_blank_separator
|
|
360
|
+
test_existing_agents_md_with_symlink_gains_self_governance
|
|
361
|
+
test_correct_symlink_migrates_to_pointer_without_clobbering_agents
|
|
362
|
+
test_existing_agents_md_without_claude_gains_section_and_pointer
|
|
363
|
+
test_existing_agents_md_with_section_reports_unchanged
|
|
364
|
+
test_existing_crlf_agents_md_with_section_stays_unchanged
|
|
365
|
+
test_existing_crlf_agents_md_without_section_preserves_crlf
|
|
366
|
+
test_canonical_pointer_is_accepted_when_both_are_real_files
|
|
367
|
+
test_distinct_real_files_are_refused
|
|
368
|
+
test_agents_md_symlink_is_refused
|
|
369
|
+
test_wrong_target_symlink_is_refused
|
|
370
|
+
test_non_regular_claude_md_is_refused
|
|
371
|
+
test_lowercase_agents_md_refuses_case_fragile_pointer
|