@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,269 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-doc-audience-check.sh - validate the tracked documentation audience inventory.
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# bin/fm-doc-audience-check.sh
|
|
6
|
+
# bin/fm-doc-audience-check.sh --root <repo> [--inventory <path>]
|
|
7
|
+
#
|
|
8
|
+
# The inventory owns classification and setup routing.
|
|
9
|
+
# This check validates structure only and does not keyword-lint prose.
|
|
10
|
+
set -eu
|
|
11
|
+
|
|
12
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
13
|
+
cd "$ROOT"
|
|
14
|
+
exec python3 - "$@" <<'PY'
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import json
|
|
19
|
+
import os
|
|
20
|
+
import re
|
|
21
|
+
import subprocess
|
|
22
|
+
import sys
|
|
23
|
+
from collections import Counter
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from urllib.parse import unquote, urlsplit
|
|
26
|
+
|
|
27
|
+
MARKDOWN_LINK_RE = re.compile(r"!?\[[^\]]*\]\(([^)]+)\)")
|
|
28
|
+
HTML_LINK_RE = re.compile(r"\b(?:href|src)=[\"']([^\"']+)[\"']", re.IGNORECASE)
|
|
29
|
+
REQUIRED_TRACKED_PATTERNS = ["*.md", "*.mdx", "*.rst", "*.txt", "docs/examples/*"]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class CheckError(Exception):
|
|
33
|
+
"""One deterministic audience-check failure."""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def fail(message: str) -> None:
|
|
37
|
+
raise CheckError(message)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def git_tracked(root: Path, patterns: list[str]) -> list[str]:
|
|
41
|
+
proc = subprocess.run(
|
|
42
|
+
["git", "-C", str(root), "ls-files", "-z", "--", *patterns],
|
|
43
|
+
check=False,
|
|
44
|
+
stdout=subprocess.PIPE,
|
|
45
|
+
stderr=subprocess.PIPE,
|
|
46
|
+
)
|
|
47
|
+
if proc.returncode != 0:
|
|
48
|
+
detail = proc.stderr.decode("utf-8", "replace").strip()
|
|
49
|
+
fail(f"git ls-files failed: {detail or 'unknown error'}")
|
|
50
|
+
return sorted(p for p in proc.stdout.decode("utf-8").split("\0") if p)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def load_inventory(path: Path) -> dict:
|
|
54
|
+
try:
|
|
55
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
56
|
+
except FileNotFoundError:
|
|
57
|
+
fail(f"inventory is missing: {path}")
|
|
58
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
59
|
+
fail(f"inventory is unreadable: {exc}")
|
|
60
|
+
if not isinstance(data, dict):
|
|
61
|
+
fail("inventory root must be an object")
|
|
62
|
+
if data.get("version") != 1:
|
|
63
|
+
fail("inventory version must be 1")
|
|
64
|
+
return data
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def list_of_strings(value: object, label: str) -> list[str]:
|
|
68
|
+
if not isinstance(value, list) or not value or not all(isinstance(v, str) and v for v in value):
|
|
69
|
+
fail(f"{label} must be a non-empty string array")
|
|
70
|
+
return value
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def normalized_link_value(raw: str) -> str:
|
|
74
|
+
value = raw.strip()
|
|
75
|
+
if value.startswith("<") and value.endswith(">"):
|
|
76
|
+
value = value[1:-1].strip()
|
|
77
|
+
if " " in value:
|
|
78
|
+
value = value.split()[0]
|
|
79
|
+
return value
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def resolve_local_target(root: Path, source: Path, raw: str) -> Path | None:
|
|
83
|
+
split = urlsplit(normalized_link_value(raw))
|
|
84
|
+
if split.scheme or split.netloc:
|
|
85
|
+
return None
|
|
86
|
+
if not split.path:
|
|
87
|
+
return source.resolve(strict=False) if split.fragment else None
|
|
88
|
+
decoded = unquote(split.path)
|
|
89
|
+
if decoded.startswith("/"):
|
|
90
|
+
fail(f"absolute local link in {source.relative_to(root)}: {raw}")
|
|
91
|
+
target = (source.parent / decoded).resolve(strict=False)
|
|
92
|
+
try:
|
|
93
|
+
target.relative_to(root.resolve())
|
|
94
|
+
except ValueError:
|
|
95
|
+
fail(f"local link escapes repository in {source.relative_to(root)}: {raw}")
|
|
96
|
+
return target
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def markdown_local_links(root: Path, source: Path) -> list[tuple[str, Path]]:
|
|
100
|
+
try:
|
|
101
|
+
text = source.read_text(encoding="utf-8")
|
|
102
|
+
except (OSError, UnicodeDecodeError) as exc:
|
|
103
|
+
fail(f"cannot read prose surface {source.relative_to(root)}: {exc}")
|
|
104
|
+
raw_links = MARKDOWN_LINK_RE.findall(text) + HTML_LINK_RE.findall(text)
|
|
105
|
+
result: list[tuple[str, Path]] = []
|
|
106
|
+
for raw in raw_links:
|
|
107
|
+
target = resolve_local_target(root, source, raw)
|
|
108
|
+
if target is not None:
|
|
109
|
+
result.append((raw, target))
|
|
110
|
+
return result
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def github_heading_slug(value: str) -> str:
|
|
114
|
+
value = re.sub(r"<[^>]+>", "", value)
|
|
115
|
+
value = value.replace("`", "").strip().lower()
|
|
116
|
+
value = re.sub(r"[^\w\- ]", "", value, flags=re.UNICODE)
|
|
117
|
+
return re.sub(r"\s", "-", value)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def markdown_anchors(path: Path) -> set[str]:
|
|
121
|
+
anchors: set[str] = set()
|
|
122
|
+
counts: Counter[str] = Counter()
|
|
123
|
+
try:
|
|
124
|
+
lines = path.read_text(encoding="utf-8").splitlines()
|
|
125
|
+
except (OSError, UnicodeDecodeError) as exc:
|
|
126
|
+
fail(f"cannot read link target {path}: {exc}")
|
|
127
|
+
for line in lines:
|
|
128
|
+
match = re.match(r"^#{1,6}\s+(.+?)\s*#*\s*$", line)
|
|
129
|
+
if match:
|
|
130
|
+
base = github_heading_slug(match.group(1))
|
|
131
|
+
if base:
|
|
132
|
+
count = counts[base]
|
|
133
|
+
anchors.add(base if count == 0 else f"{base}-{count}")
|
|
134
|
+
counts[base] += 1
|
|
135
|
+
for explicit in re.findall(r"<(?:a|span)\s+(?:name|id)=[\"']([^\"']+)[\"']", line, re.IGNORECASE):
|
|
136
|
+
anchors.add(explicit)
|
|
137
|
+
return anchors
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def validate(root: Path, inventory_path: Path) -> tuple[int, int]:
|
|
141
|
+
data = load_inventory(inventory_path)
|
|
142
|
+
scope = data.get("scope")
|
|
143
|
+
if not isinstance(scope, dict):
|
|
144
|
+
fail("scope must be an object")
|
|
145
|
+
patterns = list_of_strings(scope.get("trackedPatterns"), "scope.trackedPatterns")
|
|
146
|
+
if patterns != REQUIRED_TRACKED_PATTERNS:
|
|
147
|
+
fail("scope.trackedPatterns must match the fixed maintained-prose scope")
|
|
148
|
+
audiences = set(list_of_strings(data.get("allowedAudiences"), "allowedAudiences"))
|
|
149
|
+
setup_audiences = set(list_of_strings(data.get("setupAudiences"), "setupAudiences"))
|
|
150
|
+
if not setup_audiences <= audiences:
|
|
151
|
+
fail("setupAudiences contains an audience outside allowedAudiences")
|
|
152
|
+
|
|
153
|
+
surfaces = data.get("surfaces")
|
|
154
|
+
if not isinstance(surfaces, list):
|
|
155
|
+
fail("surfaces must be an array")
|
|
156
|
+
paths: list[str] = []
|
|
157
|
+
classifications: dict[str, str] = {}
|
|
158
|
+
for index, entry in enumerate(surfaces):
|
|
159
|
+
if not isinstance(entry, dict):
|
|
160
|
+
fail(f"surfaces[{index}] must be an object")
|
|
161
|
+
path = entry.get("path")
|
|
162
|
+
audience = entry.get("audience")
|
|
163
|
+
if not isinstance(path, str) or not path:
|
|
164
|
+
fail(f"surfaces[{index}].path must be a non-empty string")
|
|
165
|
+
if audience not in audiences:
|
|
166
|
+
fail(f"{path}: unsupported audience {audience!r}")
|
|
167
|
+
paths.append(path)
|
|
168
|
+
classifications[path] = audience
|
|
169
|
+
|
|
170
|
+
duplicates = sorted(path for path, count in Counter(paths).items() if count != 1)
|
|
171
|
+
if duplicates:
|
|
172
|
+
fail("surfaces classified more than once: " + ", ".join(duplicates))
|
|
173
|
+
|
|
174
|
+
tracked = set(git_tracked(root, patterns))
|
|
175
|
+
classified = set(paths)
|
|
176
|
+
missing = sorted(tracked - classified)
|
|
177
|
+
extra = sorted(classified - tracked)
|
|
178
|
+
if missing or extra:
|
|
179
|
+
details = []
|
|
180
|
+
if missing:
|
|
181
|
+
details.append("unclassified: " + ", ".join(missing))
|
|
182
|
+
if extra:
|
|
183
|
+
details.append("not tracked/in scope: " + ", ".join(extra))
|
|
184
|
+
fail("; ".join(details))
|
|
185
|
+
|
|
186
|
+
readme_path = root / "README.md"
|
|
187
|
+
readme_targets = {
|
|
188
|
+
os.path.relpath(target, root).replace(os.sep, "/")
|
|
189
|
+
for _, target in markdown_local_links(root, readme_path)
|
|
190
|
+
}
|
|
191
|
+
setup_targets = list_of_strings(data.get("readmeSetupTargets"), "readmeSetupTargets")
|
|
192
|
+
for target in setup_targets:
|
|
193
|
+
if target not in readme_targets:
|
|
194
|
+
fail(f"README setup target is not linked from README.md: {target}")
|
|
195
|
+
if classifications.get(target) not in setup_audiences:
|
|
196
|
+
fail(
|
|
197
|
+
f"README setup target {target} has disallowed audience "
|
|
198
|
+
f"{classifications.get(target)!r}"
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
pointers = data.get("requiredOwnerPointers")
|
|
202
|
+
if not isinstance(pointers, list) or not pointers:
|
|
203
|
+
fail("requiredOwnerPointers must be a non-empty array")
|
|
204
|
+
for index, pointer in enumerate(pointers):
|
|
205
|
+
if not isinstance(pointer, dict):
|
|
206
|
+
fail(f"requiredOwnerPointers[{index}] must be an object")
|
|
207
|
+
source = pointer.get("source")
|
|
208
|
+
target = pointer.get("target")
|
|
209
|
+
if not isinstance(source, str) or not isinstance(target, str) or not source or not target:
|
|
210
|
+
fail(f"requiredOwnerPointers[{index}] needs non-empty source and target")
|
|
211
|
+
source_path = root / source
|
|
212
|
+
target_path = root / target
|
|
213
|
+
if not source_path.exists():
|
|
214
|
+
fail(f"owner-pointer source is missing: {source}")
|
|
215
|
+
if not target_path.exists():
|
|
216
|
+
fail(f"owner-pointer target is missing: {target}")
|
|
217
|
+
try:
|
|
218
|
+
source_text = source_path.read_text(encoding="utf-8")
|
|
219
|
+
except (OSError, UnicodeDecodeError) as exc:
|
|
220
|
+
fail(f"owner-pointer source is unreadable {source}: {exc}")
|
|
221
|
+
linked_targets: set[str] = set()
|
|
222
|
+
if source_path.suffix.lower() in {".md", ".mdx"}:
|
|
223
|
+
linked_targets = {
|
|
224
|
+
os.path.relpath(linked, root).replace(os.sep, "/")
|
|
225
|
+
for _, linked in markdown_local_links(root, source_path)
|
|
226
|
+
}
|
|
227
|
+
if target not in source_text and target not in linked_targets:
|
|
228
|
+
fail(f"required owner pointer missing: {source} -> {target}")
|
|
229
|
+
|
|
230
|
+
checked_links = 0
|
|
231
|
+
anchor_cache: dict[Path, set[str]] = {}
|
|
232
|
+
for path in sorted(tracked):
|
|
233
|
+
if Path(path).suffix.lower() not in {".md", ".mdx"}:
|
|
234
|
+
continue
|
|
235
|
+
source = root / path
|
|
236
|
+
for raw, target in markdown_local_links(root, source):
|
|
237
|
+
checked_links += 1
|
|
238
|
+
if not target.exists():
|
|
239
|
+
fail(f"unresolved local link in {path}: {raw}")
|
|
240
|
+
fragment = unquote(urlsplit(normalized_link_value(raw)).fragment)
|
|
241
|
+
if fragment and target.is_file() and target.suffix.lower() in {".md", ".mdx"}:
|
|
242
|
+
anchors = anchor_cache.setdefault(target, markdown_anchors(target))
|
|
243
|
+
if fragment not in anchors:
|
|
244
|
+
fail(f"unresolved local anchor in {path}: {raw}")
|
|
245
|
+
|
|
246
|
+
return len(tracked), checked_links
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def main() -> int:
|
|
250
|
+
parser = argparse.ArgumentParser(description="Validate Firstmate documentation audiences and local links.")
|
|
251
|
+
parser.add_argument("--root", type=Path, default=Path.cwd())
|
|
252
|
+
parser.add_argument("--inventory", type=Path)
|
|
253
|
+
args = parser.parse_args()
|
|
254
|
+
root = args.root.resolve()
|
|
255
|
+
inventory_path = args.inventory or (root / "docs/documentation-audiences.json")
|
|
256
|
+
if not inventory_path.is_absolute():
|
|
257
|
+
inventory_path = root / inventory_path
|
|
258
|
+
try:
|
|
259
|
+
surfaces, links = validate(root, inventory_path)
|
|
260
|
+
except CheckError as exc:
|
|
261
|
+
print(f"fm-doc-audience-check: {exc}", file=sys.stderr)
|
|
262
|
+
return 1
|
|
263
|
+
print(f"fm-doc-audience-check: ok surfaces={surfaces} local_links={links}")
|
|
264
|
+
return 0
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
if __name__ == "__main__":
|
|
268
|
+
sys.exit(main())
|
|
269
|
+
PY
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Single owner of a ship task's mode-specific "Definition of done" block.
|
|
3
|
+
# Sourced by bin/fm-brief.sh, which renders it into a generated ship brief, and by
|
|
4
|
+
# bin/fm-promote.sh, which renders it into the ship instructions a promoted scout
|
|
5
|
+
# receives. Both paths must hand the worker the same contract: a promoted
|
|
6
|
+
# no-mistakes worker that never received the ask-user escalation rule or the
|
|
7
|
+
# `--yes` ban is the exact delivery hole this single owner exists to close.
|
|
8
|
+
# fm_dod_block <no-mistakes|direct-PR|local-only> <task-id> prints the block on
|
|
9
|
+
# stdout with no trailing blank line. The caller validates the mode; an unknown
|
|
10
|
+
# mode is refused rather than silently rendered as the pipeline contract.
|
|
11
|
+
# The block opens with the fixed machine-readable "Delivery contract: mode=<mode>"
|
|
12
|
+
# line that bin/fm-spawn.sh checks a ship brief against.
|
|
13
|
+
# Every heredoc here stays outside a command substitution: `VAR=$(cat <<EOF ...)`
|
|
14
|
+
# breaks parsing of the whole file on Bash 3.2 (tests/fm-brief.test.sh).
|
|
15
|
+
|
|
16
|
+
fm_dod_block() { # <mode> <task-id>
|
|
17
|
+
local mode=$1 id=$2
|
|
18
|
+
case "$mode" in
|
|
19
|
+
direct-PR)
|
|
20
|
+
cat <<EOF
|
|
21
|
+
# Definition of done
|
|
22
|
+
Delivery contract: mode=direct-PR
|
|
23
|
+
This task ships **direct-PR**: you raise the PR yourself, without the no-mistakes pipeline.
|
|
24
|
+
The task is complete only when committed on your branch.
|
|
25
|
+
When it is implemented and committed, push your branch and open a PR with \`gh-axi\`, then append \`done: PR {url}\` to the status file and stop.
|
|
26
|
+
Do NOT run /no-mistakes. The configured merge authority decides whether to merge the PR; firstmate relays the outcome.
|
|
27
|
+
EOF
|
|
28
|
+
;;
|
|
29
|
+
local-only)
|
|
30
|
+
cat <<EOF
|
|
31
|
+
# Definition of done
|
|
32
|
+
Delivery contract: mode=local-only
|
|
33
|
+
This task ships **local-only**: no remote, no PR, no pipeline.
|
|
34
|
+
The task is complete only when committed on your branch \`fm/$id\`. Do NOT push, do NOT open a PR, do NOT merge.
|
|
35
|
+
Keep your branch a clean fast-forward onto the current default branch - if \`main\` has advanced, rebase onto it so the eventual merge stays a fast-forward.
|
|
36
|
+
When it is implemented and committed, append \`done: ready in branch fm/$id\` to the status file and stop.
|
|
37
|
+
The configured merge authority approves the ready branch, then firstmate merges it into local \`main\` through the guarded fast-forward path.
|
|
38
|
+
EOF
|
|
39
|
+
;;
|
|
40
|
+
no-mistakes)
|
|
41
|
+
cat <<EOF
|
|
42
|
+
# Definition of done
|
|
43
|
+
Delivery contract: mode=no-mistakes
|
|
44
|
+
The task is complete only when committed on your branch.
|
|
45
|
+
When you believe it is complete, append \`done: {summary}\` to the status file and stop.
|
|
46
|
+
Firstmate will then instruct you to run /no-mistakes to validate and ship a PR.
|
|
47
|
+
|
|
48
|
+
You drive no-mistakes by responding to its gates, not by implementing fixes.
|
|
49
|
+
Follow the guidance no-mistakes itself provides for the mechanics: it loads when you invoke /no-mistakes, and \`no-mistakes axi run --help\` plus the \`help\` lines in each \`axi\` response are authoritative and version-matched to the installed binary.
|
|
50
|
+
When starting no-mistakes, make \`--intent\` preserve all relevant content from this brief's \`# Task\` section plus every later accepted Firstmate requirement, clarification, constraint, exclusion, and supersession, carrying only each requirement's current accepted form; retain direct requirements instead of substituting a diff summary, and exclude generic operational, status, delivery, and other scaffold boilerplate unless it is task-specific.
|
|
51
|
+
Do not hand-edit, commit, or fix findings yourself while a run is active - the pipeline applies every fix.
|
|
52
|
+
|
|
53
|
+
Two firstmate-specific rules layer on top of that guidance:
|
|
54
|
+
- ask-user findings are never yours to answer: escalate to firstmate (rule 6) and stop.
|
|
55
|
+
Firstmate applies \`ask-user-authority\` and obtains any required captain decision.
|
|
56
|
+
When the decision comes back, feed it to the gate with \`no-mistakes axi respond\` and let the pipeline apply it - do not route the question to "the user" or implement the fix yourself.
|
|
57
|
+
- NEVER pass \`--yes\` (or \`-y\`) to \`no-mistakes axi run\` or \`no-mistakes axi respond\`. It is banned fleet-wide.
|
|
58
|
+
It auto-resolves every gate including ask-user findings with no escalation, and answering your own ask-user finding is a hard rule violation.
|
|
59
|
+
|
|
60
|
+
After /no-mistakes reports CI green (the CI-ready return point - do not wait for it to keep monitoring in the background until merge), append \`done: PR {url} checks green\` and stop. You are finished.
|
|
61
|
+
EOF
|
|
62
|
+
;;
|
|
63
|
+
*)
|
|
64
|
+
echo "error: fm_dod_block: unknown delivery mode '$mode'" >&2
|
|
65
|
+
return 1 ;;
|
|
66
|
+
esac
|
|
67
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Ensure a project worktree follows the agent-memory file convention.
|
|
3
|
+
# AGENTS.md is the real project-intrinsic knowledge file; CLAUDE.md is a
|
|
4
|
+
# real regular file whose canonical content is the two-line @AGENTS.md pointer
|
|
5
|
+
# that Claude Code inlines at load time. Creates a minimal AGENTS.md skeleton
|
|
6
|
+
# when neither file exists, promotes a real CLAUDE.md file when it is the only
|
|
7
|
+
# file present (unless it is already the canonical pointer), converts a correct
|
|
8
|
+
# CLAUDE.md -> AGENTS.md symlink into the pointer file, and refuses to clobber
|
|
9
|
+
# distinct real files or wrong symlinks.
|
|
10
|
+
# Owns the canonical "## Maintaining this file" self-governance wording for
|
|
11
|
+
# project AGENTS.md files, injecting it idempotently into created skeletons,
|
|
12
|
+
# promoted CLAUDE.md files, and any existing AGENTS.md that still lacks it.
|
|
13
|
+
# Owns the canonical CLAUDE.md pointer content (the exact two-line @AGENTS.md
|
|
14
|
+
# form). A real-file pointer cannot follow a write into AGENTS.md, which is why
|
|
15
|
+
# the installer never creates a CLAUDE.md symlink.
|
|
16
|
+
# Refuses a case-variant real memory file such as a lowercase agents.md, so the
|
|
17
|
+
# pointer's @AGENTS.md import resolves to a real AGENTS.md on a case-sensitive
|
|
18
|
+
# filesystem (issue #389). The real-file pointer also eliminates the old
|
|
19
|
+
# uppercase-literal-target dangling-symlink hazard that a CLAUDE.md -> AGENTS.md
|
|
20
|
+
# link would have carried for that same mismatch.
|
|
21
|
+
# This is a worktree utility for crewmates, not a supervision script, so it does
|
|
22
|
+
# not call fm-guard.sh.
|
|
23
|
+
# Usage: fm-ensure-agents-md.sh [repo-or-worktree-dir]
|
|
24
|
+
set -eu
|
|
25
|
+
|
|
26
|
+
usage() {
|
|
27
|
+
echo "usage: fm-ensure-agents-md.sh [repo-or-worktree-dir]" >&2
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
case "${1:-}" in
|
|
31
|
+
-h|--help)
|
|
32
|
+
usage
|
|
33
|
+
exit 0
|
|
34
|
+
;;
|
|
35
|
+
esac
|
|
36
|
+
[ "$#" -le 1 ] || { usage; exit 1; }
|
|
37
|
+
|
|
38
|
+
DIR=${1:-.}
|
|
39
|
+
[ -d "$DIR" ] || { echo "error: not a directory: $DIR" >&2; exit 1; }
|
|
40
|
+
DIR=$(cd "$DIR" && pwd -P)
|
|
41
|
+
cd "$DIR"
|
|
42
|
+
|
|
43
|
+
AGENTS=AGENTS.md
|
|
44
|
+
CLAUDE=CLAUDE.md
|
|
45
|
+
|
|
46
|
+
write_maintenance_section() {
|
|
47
|
+
cat <<'EOF'
|
|
48
|
+
## Maintaining this file
|
|
49
|
+
|
|
50
|
+
Keep this file for knowledge useful to almost every future agent session in this project.
|
|
51
|
+
Do not repeat what the codebase already shows; point to the authoritative file or command instead.
|
|
52
|
+
Prefer rewriting or pruning existing entries over appending new ones.
|
|
53
|
+
When updating this file, preserve this bar for all agents and keep entries concise.
|
|
54
|
+
EOF
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
write_maintenance_section_with_eol() {
|
|
58
|
+
local eol=$1 line
|
|
59
|
+
while IFS= read -r line; do
|
|
60
|
+
printf '%s%s' "$line" "$eol"
|
|
61
|
+
done < <(write_maintenance_section)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Idempotently append the canonical self-governance section to AGENTS.md when it
|
|
65
|
+
# is absent. Sets MAINT_INJECTED=1 when it appends and 0 when the section is
|
|
66
|
+
# already present, so callers can report whether the file changed.
|
|
67
|
+
MAINT_INJECTED=0
|
|
68
|
+
ensure_maintenance_section() {
|
|
69
|
+
MAINT_INJECTED=0
|
|
70
|
+
if grep -Fqx '## Maintaining this file' "$AGENTS" ||
|
|
71
|
+
grep -Fqx $'## Maintaining this file\r' "$AGENTS"; then
|
|
72
|
+
return 0
|
|
73
|
+
fi
|
|
74
|
+
local eol=$'\n' sep=''
|
|
75
|
+
if LC_ALL=C grep -q $'\r$' "$AGENTS"; then
|
|
76
|
+
eol=$'\r\n'
|
|
77
|
+
fi
|
|
78
|
+
if [ -s "$AGENTS" ]; then
|
|
79
|
+
if [ -n "$(tail -c 1 "$AGENTS")" ]; then
|
|
80
|
+
sep="${eol}${eol}"
|
|
81
|
+
else
|
|
82
|
+
sep=$eol
|
|
83
|
+
fi
|
|
84
|
+
fi
|
|
85
|
+
{
|
|
86
|
+
printf '%s' "$sep"
|
|
87
|
+
write_maintenance_section_with_eol "$eol"
|
|
88
|
+
} >> "$AGENTS"
|
|
89
|
+
MAINT_INJECTED=1
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
write_skeleton() {
|
|
93
|
+
cat > "$AGENTS" <<'EOF'
|
|
94
|
+
# Project agent memory
|
|
95
|
+
|
|
96
|
+
This file is the project's committed home for project-intrinsic agent knowledge: build, test, release, architecture, and sharp-edge notes that should travel with the code.
|
|
97
|
+
|
|
98
|
+
- Add durable project-specific notes here as they are discovered through real work.
|
|
99
|
+
EOF
|
|
100
|
+
ensure_maintenance_section
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# Canonical CLAUDE.md pointer: a real file, never a symlink. Byte-identical
|
|
104
|
+
# two-line form so a stray write clobbers only this recoverable pointer.
|
|
105
|
+
claude_pointer_content() {
|
|
106
|
+
cat <<'EOF'
|
|
107
|
+
<!-- Points Claude at AGENTS.md via import; edit AGENTS.md, not this file. -->
|
|
108
|
+
@AGENTS.md
|
|
109
|
+
EOF
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
is_canonical_claude_pointer() {
|
|
113
|
+
[ -f "$CLAUDE" ] && [ ! -L "$CLAUDE" ] || return 1
|
|
114
|
+
claude_pointer_content | cmp -s - "$CLAUDE"
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
# Write the canonical pointer as a regular file. Unlink a symlink first so the
|
|
118
|
+
# write cannot follow it and destroy AGENTS.md. Never overwrite a distinct real
|
|
119
|
+
# file; callers classify that as a conflict before invoking this.
|
|
120
|
+
install_claude_pointer() {
|
|
121
|
+
if is_canonical_claude_pointer; then
|
|
122
|
+
return 0
|
|
123
|
+
fi
|
|
124
|
+
if [ -L "$CLAUDE" ]; then
|
|
125
|
+
rm -- "$CLAUDE"
|
|
126
|
+
elif [ -e "$CLAUDE" ]; then
|
|
127
|
+
echo "error: internal: refuse to overwrite existing CLAUDE.md" >&2
|
|
128
|
+
exit 1
|
|
129
|
+
fi
|
|
130
|
+
claude_pointer_content > "$CLAUDE"
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
is_correct_claude_symlink() {
|
|
134
|
+
[ -L "$CLAUDE" ] || return 1
|
|
135
|
+
target=$(readlink "$CLAUDE")
|
|
136
|
+
case "$target" in
|
|
137
|
+
"$AGENTS"|"./$AGENTS") return 0 ;;
|
|
138
|
+
esac
|
|
139
|
+
[ -e "$AGENTS" ] || return 1
|
|
140
|
+
if command -v python3 >/dev/null 2>&1; then
|
|
141
|
+
python3 - "$CLAUDE" "$AGENTS" <<'PY'
|
|
142
|
+
import os
|
|
143
|
+
import sys
|
|
144
|
+
sys.exit(0 if os.path.realpath(sys.argv[1]) == os.path.realpath(sys.argv[2]) else 1)
|
|
145
|
+
PY
|
|
146
|
+
return $?
|
|
147
|
+
fi
|
|
148
|
+
return 1
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
# Refuse a case-variant real memory file (issue #389). On a case-insensitive
|
|
152
|
+
# filesystem an existing lowercase agents.md satisfies every [ -e AGENTS.md ]
|
|
153
|
+
# test below, so the script would emit a CLAUDE.md pointer whose @AGENTS.md
|
|
154
|
+
# import dangles once the tree is checked out on a case-sensitive filesystem.
|
|
155
|
+
# Reading the real directory entries catches the mismatch on both filesystem
|
|
156
|
+
# kinds; surface it for manual reconciliation instead of writing the pointer
|
|
157
|
+
# against the wrong name.
|
|
158
|
+
for entry in *; do
|
|
159
|
+
if [ ! -e "$entry" ] && [ ! -L "$entry" ]; then
|
|
160
|
+
continue
|
|
161
|
+
fi
|
|
162
|
+
if [ "$entry" != "$AGENTS" ]; then
|
|
163
|
+
case "$entry" in
|
|
164
|
+
[Aa][Gg][Ee][Nn][Tt][Ss].[Mm][Dd])
|
|
165
|
+
echo "conflict: memory file is named $entry in $DIR but the convention is AGENTS.md; rename it to AGENTS.md so CLAUDE.md's @AGENTS.md pointer resolves portably" >&2
|
|
166
|
+
exit 1
|
|
167
|
+
;;
|
|
168
|
+
esac
|
|
169
|
+
fi
|
|
170
|
+
done
|
|
171
|
+
|
|
172
|
+
if [ -L "$AGENTS" ]; then
|
|
173
|
+
echo "conflict: AGENTS.md is a symlink in $DIR; expected AGENTS.md to be the real file" >&2
|
|
174
|
+
exit 1
|
|
175
|
+
fi
|
|
176
|
+
if [ -e "$AGENTS" ] && [ ! -f "$AGENTS" ]; then
|
|
177
|
+
echo "conflict: AGENTS.md exists in $DIR but is not a regular file" >&2
|
|
178
|
+
exit 1
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
if [ -e "$AGENTS" ]; then
|
|
182
|
+
if [ -L "$CLAUDE" ]; then
|
|
183
|
+
if is_correct_claude_symlink; then
|
|
184
|
+
ensure_maintenance_section
|
|
185
|
+
install_claude_pointer
|
|
186
|
+
if [ "$MAINT_INJECTED" -eq 1 ]; then
|
|
187
|
+
echo "updated: added ## Maintaining this file to AGENTS.md and wrote CLAUDE.md @AGENTS.md pointer in $DIR"
|
|
188
|
+
else
|
|
189
|
+
echo "updated: replaced CLAUDE.md symlink with @AGENTS.md pointer in $DIR"
|
|
190
|
+
fi
|
|
191
|
+
exit 0
|
|
192
|
+
fi
|
|
193
|
+
echo "conflict: CLAUDE.md is a symlink in $DIR but does not point to AGENTS.md" >&2
|
|
194
|
+
exit 1
|
|
195
|
+
fi
|
|
196
|
+
if [ ! -e "$CLAUDE" ]; then
|
|
197
|
+
ensure_maintenance_section
|
|
198
|
+
install_claude_pointer
|
|
199
|
+
if [ "$MAINT_INJECTED" -eq 1 ]; then
|
|
200
|
+
echo "updated: added ## Maintaining this file to AGENTS.md and wrote CLAUDE.md @AGENTS.md pointer in $DIR"
|
|
201
|
+
else
|
|
202
|
+
echo "wrote: CLAUDE.md @AGENTS.md pointer in $DIR"
|
|
203
|
+
fi
|
|
204
|
+
exit 0
|
|
205
|
+
fi
|
|
206
|
+
if [ -f "$CLAUDE" ]; then
|
|
207
|
+
if is_canonical_claude_pointer; then
|
|
208
|
+
ensure_maintenance_section
|
|
209
|
+
if [ "$MAINT_INJECTED" -eq 1 ]; then
|
|
210
|
+
echo "updated: added ## Maintaining this file to AGENTS.md in $DIR"
|
|
211
|
+
else
|
|
212
|
+
echo "unchanged: AGENTS.md with CLAUDE.md @AGENTS.md pointer in $DIR"
|
|
213
|
+
fi
|
|
214
|
+
exit 0
|
|
215
|
+
fi
|
|
216
|
+
echo "conflict: both AGENTS.md and CLAUDE.md are real files in $DIR; reconcile them manually" >&2
|
|
217
|
+
exit 1
|
|
218
|
+
fi
|
|
219
|
+
echo "conflict: CLAUDE.md exists in $DIR but is not a regular file or symlink" >&2
|
|
220
|
+
exit 1
|
|
221
|
+
fi
|
|
222
|
+
|
|
223
|
+
if [ -L "$CLAUDE" ]; then
|
|
224
|
+
if is_correct_claude_symlink; then
|
|
225
|
+
write_skeleton
|
|
226
|
+
install_claude_pointer
|
|
227
|
+
echo "created: AGENTS.md and wrote CLAUDE.md @AGENTS.md pointer in $DIR"
|
|
228
|
+
exit 0
|
|
229
|
+
fi
|
|
230
|
+
echo "conflict: CLAUDE.md is a symlink in $DIR but AGENTS.md is missing and the link does not point to AGENTS.md" >&2
|
|
231
|
+
exit 1
|
|
232
|
+
fi
|
|
233
|
+
|
|
234
|
+
if [ -e "$CLAUDE" ]; then
|
|
235
|
+
if [ -f "$CLAUDE" ]; then
|
|
236
|
+
if is_canonical_claude_pointer; then
|
|
237
|
+
write_skeleton
|
|
238
|
+
echo "created: AGENTS.md and kept CLAUDE.md @AGENTS.md pointer in $DIR"
|
|
239
|
+
exit 0
|
|
240
|
+
fi
|
|
241
|
+
mv "$CLAUDE" "$AGENTS"
|
|
242
|
+
ensure_maintenance_section
|
|
243
|
+
install_claude_pointer
|
|
244
|
+
echo "promoted: moved CLAUDE.md to AGENTS.md and wrote CLAUDE.md @AGENTS.md pointer in $DIR"
|
|
245
|
+
exit 0
|
|
246
|
+
fi
|
|
247
|
+
echo "conflict: CLAUDE.md exists in $DIR but is not a regular file or symlink" >&2
|
|
248
|
+
exit 1
|
|
249
|
+
fi
|
|
250
|
+
|
|
251
|
+
write_skeleton
|
|
252
|
+
install_claude_pointer
|
|
253
|
+
echo "created: AGENTS.md and CLAUDE.md @AGENTS.md pointer in $DIR"
|