@zerwiz/ymir 0.1.4 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/README.md +74 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +360 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +11 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +121 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +159 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +736 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +539 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +101 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +180 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +503 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +90 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +57 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +35 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/install.md +69 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +498 -0
- package/CHANGELOG.md +1913 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +114 -60
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +97 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +108 -0
- package/RULES/07-config.md +101 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/09-electron.md +58 -0
- package/RULES/README.md +22 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +133 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +256 -0
- package/bin/apodex-smoke-test.sh +105 -0
- package/bin/bifrost-bridge.sh +131 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +112 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +51 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-assemble.sh +154 -0
- package/bin/changelog-guard.sh +197 -0
- package/bin/crash-sense.sh +173 -0
- package/bin/design-check.sh +80 -0
- package/bin/design-icon.sh +153 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +225 -0
- package/bin/eindri-acclaim.sh +47 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seat.sh +83 -0
- package/bin/eindri-seen.sh +54 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +98 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +158 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/feature-inventory.sh +73 -0
- package/bin/fleet-apply.sh +81 -0
- package/bin/github-deploy.sh +94 -0
- package/bin/gjallarhorn-expose.sh +136 -0
- package/bin/gjallarhorn-notify.sh +71 -0
- package/bin/gjallarhorn-purge.sh +67 -0
- package/bin/gjallarhorn-tunnel.sh +85 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +130 -0
- package/bin/hall-snapshot.sh +111 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +452 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hlidskjalf-agents.sh +172 -0
- package/bin/hlidskjalf-usage.sh +196 -0
- package/bin/hoard-guard.sh +135 -0
- package/bin/hoard-lib.sh +105 -0
- package/bin/hodd.sh +102 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +121 -0
- package/bin/local-model-lock.sh +70 -0
- package/bin/mimir-bridge.py +259 -0
- package/bin/mimir-bridge.sh +100 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir-reflect.sh +27 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +72 -0
- package/bin/mjollnir.sh +104 -0
- package/bin/model-hardware.sh +96 -0
- package/bin/model-resolve.sh +160 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-hall-snapshot.sh +28 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-nsr-compliance.sh +54 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/npm-publish.sh +136 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +161 -0
- package/bin/omarchy-plugins.sh +187 -0
- package/bin/omarchy-sense.sh +162 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-model-agnostic.sh +71 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +58 -0
- package/bin/project-git.sh +69 -0
- package/bin/public-guard.sh +71 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +104 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +94 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +89 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-spawn-pretool-check.sh +58 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +203 -0
- package/bin/telegram-bot.sh +82 -0
- package/bin/toolchain.sh +74 -0
- package/bin/ui-truth-check.sh +75 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +298 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +60 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +163 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +806 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-plan.sh +356 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +110 -0
- package/bin/ymir-setup-auth.sh +119 -0
- package/bin/ymir-validate.sh +193 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1060 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +54 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +269 -0
- package/scripts/lower.sh +34 -0
- package/scripts/raise.sh +42 -0
- package/scripts/start.sh +217 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# compliance-check.sh — Galdr/Tyr compliance gates for the Ymir runtime + skills.
|
|
3
|
+
#
|
|
4
|
+
# Runs the runtime acceptance gates as one command, TOON output on stdout,
|
|
5
|
+
# structured errors, no prompts, idempotent, --version fast path.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# compliance-check.sh [--json] [--quiet]
|
|
9
|
+
# compliance-check.sh --version | -v
|
|
10
|
+
#
|
|
11
|
+
# Gates:
|
|
12
|
+
# toon TOON blocks in galdr SKILL.md + assets + tyr SKILL.md + AGENTS.md
|
|
13
|
+
# naming no imported terms (captain/crewmate; firstmate only in provenance)
|
|
14
|
+
# mocks no mock/stub/placeholder in the shipped runtime (bin/*.sh)
|
|
15
|
+
# syntax bash -n on bin/*.sh; node --check on plugins
|
|
16
|
+
# json every runtime JSON parses
|
|
17
|
+
# sync galdr-ymirsystem/assets mirrors tyr-check/assets
|
|
18
|
+
# surfaces Galdr agent+skill dual-surface
|
|
19
|
+
# harnesses every harness agent dir resolves into .agents/agents (Rule 02);
|
|
20
|
+
# no nested SKILL.md carried as a phantom skill
|
|
21
|
+
# skillindex every real skill is indexed in .agents/skills/README.md, and every
|
|
22
|
+
# .agents/skills/<name> path cited by the assets resolves
|
|
23
|
+
# assets a governed path changed without its owning asset
|
|
24
|
+
# design the two carriers of the cloth (CSS tokens, Sessrumnir seeds) agree
|
|
25
|
+
# duplicates no duplicate asset trees
|
|
26
|
+
# governed every governed path exists
|
|
27
|
+
#
|
|
28
|
+
# Exit: 0 = all pass, 1 = one or more FAIL, 2 = usage error.
|
|
29
|
+
set -u
|
|
30
|
+
|
|
31
|
+
VERSION="1.0.0"
|
|
32
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
33
|
+
ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
|
|
34
|
+
GALDR="$ROOT/.agents/skills/galdr-ymirsystem"
|
|
35
|
+
TYR="$ROOT/.agents/skills/tyr-check"
|
|
36
|
+
TOON_CHECK="$SCRIPT_DIR/toon-check.py"
|
|
37
|
+
|
|
38
|
+
for a in "$@"; do
|
|
39
|
+
case "$a" in
|
|
40
|
+
-v|-V|--version) printf '%s\n' "$VERSION"; exit 0 ;;
|
|
41
|
+
-h|--help) sed -n '2,30p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
|
|
42
|
+
esac
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
QUIET=0
|
|
46
|
+
JSON=0
|
|
47
|
+
for a in "$@"; do
|
|
48
|
+
[ "$a" = "--quiet" ] && QUIET=1
|
|
49
|
+
[ "$a" = "--json" ] && JSON=1
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
declare -a IDS CHECKS STATUS DETAILS
|
|
53
|
+
add() { IDS+=("$1"); CHECKS+=("$2"); STATUS+=("$3"); DETAILS+=("$4"); }
|
|
54
|
+
|
|
55
|
+
say() { [ "$QUIET" = 1 ] || printf '%s\n' "$1"; }
|
|
56
|
+
|
|
57
|
+
# --- toon -------------------------------------------------------------------
|
|
58
|
+
toon_targets=("$GALDR/SKILL.md")
|
|
59
|
+
[ -d "$GALDR/assets" ] && toon_targets+=("$GALDR/assets")
|
|
60
|
+
[ -f "$TYR/SKILL.md" ] && toon_targets+=("$TYR/SKILL.md")
|
|
61
|
+
[ -f "$ROOT/AGENTS.md" ] && toon_targets+=("$ROOT/AGENTS.md")
|
|
62
|
+
if out=$(python3 "$TOON_CHECK" "${toon_targets[@]}" 2>&1); then
|
|
63
|
+
nblocks=$(printf "%s" "$out" | grep -c '^ "' || true)
|
|
64
|
+
add toon "TOON blocks valid" PASS "${nblocks} blocks valid"
|
|
65
|
+
else
|
|
66
|
+
add toon "TOON blocks valid" FAIL "$(printf '%s' "$out" | grep -m1 '^error:' || echo 'violations')"
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
# --- naming -----------------------------------------------------------------
|
|
70
|
+
# Scope: the always-loaded contract and the shipped runtime. Law statements that
|
|
71
|
+
# name a forbidden term ("never captain", "no imported term") are not violations.
|
|
72
|
+
naming_fail=""
|
|
73
|
+
for f in "$ROOT/AGENTS.md" "$ROOT"/bin/*.sh; do
|
|
74
|
+
[ -f "$f" ] || continue
|
|
75
|
+
# The Huginn observer is the read-only bridge to the external distro; it
|
|
76
|
+
# legitimately names that system's tooling and paths.
|
|
77
|
+
[ "${f##*/}" = "nornir-job-observer.sh" ] && continue
|
|
78
|
+
hit=$(grep -nEi 'captain|crewmate' "$f" 2>/dev/null | grep -vEi 'never|imported|\.treehouse' || true)
|
|
79
|
+
[ -n "$hit" ] && naming_fail="$naming_fail ${f##*/}:$(printf '%s' "$hit" | head -n1 | cut -d: -f1)"
|
|
80
|
+
done
|
|
81
|
+
# Note: the upstream project name is permitted in the assets as provenance
|
|
82
|
+
# (paths, env bindings, and the port record); this gate checks the runtime only.
|
|
83
|
+
if [ -z "$naming_fail" ]; then
|
|
84
|
+
add naming "no imported terms" PASS "Allfather + Norse names only"
|
|
85
|
+
else
|
|
86
|
+
add naming "no imported terms" FAIL "imported term at$naming_fail"
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# --- mocks ------------------------------------------------------------------
|
|
90
|
+
# A legitimate filename is not a stub: TODO.md appears in an allowlist in
|
|
91
|
+
# bin/public-guard.sh, so ignore that filename (not the word) here.
|
|
92
|
+
#
|
|
93
|
+
# Comments are excluded: a header that explains WHY a guard exists may use the
|
|
94
|
+
# word ("it was an empty placeholder, but the shape invited the leak"), and that
|
|
95
|
+
# is documentation, not a stub. The gate is about shipped BEHAVIOUR.
|
|
96
|
+
mock_hits=$(grep -rnE '\b(mock|stub|placeholder|todo)\b' "$ROOT/bin" 2>/dev/null \
|
|
97
|
+
| grep -viE '^[^:]+:[0-9]+:[[:space:]]*#' \
|
|
98
|
+
| grep -v 'PUBLIC=' || true)
|
|
99
|
+
if [ -z "$mock_hits" ]; then
|
|
100
|
+
add mocks "no mocks in shipped runtime" PASS "bin/ clean"
|
|
101
|
+
else
|
|
102
|
+
add mocks "no mocks in shipped runtime" FAIL "$(printf '%s' "$mock_hits" | head -n1)"
|
|
103
|
+
fi
|
|
104
|
+
|
|
105
|
+
# --- syntax -----------------------------------------------------------------
|
|
106
|
+
syn_fail=""
|
|
107
|
+
for f in "$ROOT"/bin/*.sh; do
|
|
108
|
+
[ -e "$f" ] || continue
|
|
109
|
+
bash -n "$f" 2>/dev/null || syn_fail="$syn_fail ${f##*/}"
|
|
110
|
+
done
|
|
111
|
+
while IFS= read -r f; do
|
|
112
|
+
node --check "$f" 2>/dev/null || syn_fail="$syn_fail $(basename "$f")"
|
|
113
|
+
done < <(find "$ROOT/.opencode/plugins" -name '*.js' 2>/dev/null)
|
|
114
|
+
if [ -z "$syn_fail" ]; then
|
|
115
|
+
add syntax "shell + plugin syntax" PASS "bash -n + node --check clean"
|
|
116
|
+
else
|
|
117
|
+
add syntax "shell + plugin syntax" FAIL "failed:$syn_fail"
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
# --- json -------------------------------------------------------------------
|
|
121
|
+
json_fail=""
|
|
122
|
+
while IFS= read -r f; do
|
|
123
|
+
python3 -m json.tool "$f" >/dev/null 2>&1 || json_fail="$json_fail ${f##*/}"
|
|
124
|
+
done < <(find "$ROOT/config" "$ROOT/.claude" "$ROOT/.codex" "$ROOT/.cursor" "$ROOT/.agents/skills/galdr-ymirsystem/assets/pi-boot" "$ROOT/.agents/sandbox" \
|
|
125
|
+
-maxdepth 1 -name '*.json' 2>/dev/null; [ -f "$ROOT/opencode.json" ] && echo "$ROOT/opencode.json")
|
|
126
|
+
if [ -z "$json_fail" ]; then
|
|
127
|
+
add json "runtime JSON parses" PASS "all parse"
|
|
128
|
+
else
|
|
129
|
+
add json "runtime JSON parses" FAIL "failed:$json_fail"
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
# --- sync -------------------------------------------------------------------
|
|
133
|
+
if diff -rq "$GALDR/assets" "$TYR/assets" >/dev/null 2>&1; then
|
|
134
|
+
add sync "galdr/tyr assets mirrored" PASS "in sync"
|
|
135
|
+
else
|
|
136
|
+
add sync "galdr/tyr assets mirrored" FAIL "drift detected"
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
# --- surfaces ---------------------------------------------------------------
|
|
140
|
+
# Galdr is dual-surface: the agent must resolve to the canonical skill.
|
|
141
|
+
if [ -L "$ROOT/.agents/agents/galdr.md" ] && [ "$(readlink "$ROOT/.agents/agents/galdr.md")" = "../skills/galdr-ymirsystem/SKILL.md" ]; then
|
|
142
|
+
add surfaces "Galdr agent+skill dual-surface" PASS "agent symlinks the skill"
|
|
143
|
+
elif diff -q "$ROOT/.agents/agents/galdr.md" "$GALDR/SKILL.md" >/dev/null 2>&1; then
|
|
144
|
+
add surfaces "Galdr agent+skill dual-surface" PASS "agent mirrors the skill"
|
|
145
|
+
else
|
|
146
|
+
add surfaces "Galdr agent+skill dual-surface" FAIL "agent and skill differ"
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
# --- harnesses --------------------------------------------------------------
|
|
150
|
+
# Every harness reads agents through its own directory (.claude/agents,
|
|
151
|
+
# .codex/agents, .cursor/agents, .pi/agents, .opencode/agents) and skills through
|
|
152
|
+
# .agents/skills. Two failure classes hide there, and neither is visible from
|
|
153
|
+
# the code: a symlink that no longer resolves (Rule 02 — .agents/agents is
|
|
154
|
+
# canonical, harness dirs are symlinks), and a nested SKILL.md that a recursive
|
|
155
|
+
# scanner loads as a second, phantom skill. Both have bitten this tree: the
|
|
156
|
+
# galdr-cli rename left .agents/agents/galdr.md dangling for days, and three
|
|
157
|
+
# superseded SKILL.md files were being loaded as live skills.
|
|
158
|
+
harness_problems=""; harness_links=0
|
|
159
|
+
for hd in .claude/agents .codex/agents .cursor/agents .pi/agents .opencode/agents; do
|
|
160
|
+
[ -d "$ROOT/$hd" ] || continue
|
|
161
|
+
for entry in "$ROOT/$hd"/*; do
|
|
162
|
+
[ -e "$entry" ] || [ -L "$entry" ] || continue
|
|
163
|
+
if [ ! -L "$entry" ]; then
|
|
164
|
+
harness_problems="$harness_problems ${hd}/$(basename "$entry")(real-file-not-symlink)"
|
|
165
|
+
elif [ ! -e "$entry" ]; then
|
|
166
|
+
harness_problems="$harness_problems ${hd}/$(basename "$entry")(dangling)"
|
|
167
|
+
else
|
|
168
|
+
harness_links=$((harness_links+1))
|
|
169
|
+
# One hop only: the link must land in the canonical tree. It may then be a
|
|
170
|
+
# symlink onward (Galdr's agent IS the skill, by design) — following the
|
|
171
|
+
# whole chain here would wrongly call that off-tree. normpath is textual,
|
|
172
|
+
# so the final symlink is deliberately left unresolved.
|
|
173
|
+
hop_target="$(readlink "$entry")"
|
|
174
|
+
case "$hop_target" in
|
|
175
|
+
/*) hop_abs="$hop_target" ;;
|
|
176
|
+
*) hop_abs="$(dirname "$entry")/$hop_target" ;;
|
|
177
|
+
esac
|
|
178
|
+
hop="$(python3 -c 'import os,sys; print(os.path.normpath(sys.argv[1]))' "$hop_abs" 2>/dev/null || printf '%s' "$hop_abs")"
|
|
179
|
+
case "$hop" in
|
|
180
|
+
"$ROOT/.agents/agents/"*) : ;;
|
|
181
|
+
*) harness_problems="$harness_problems ${hd}/$(basename "$entry")(off-canonical-tree)" ;;
|
|
182
|
+
esac
|
|
183
|
+
fi
|
|
184
|
+
done
|
|
185
|
+
done
|
|
186
|
+
# A nested SKILL.md that carries YAML frontmatter is loaded by every recursive
|
|
187
|
+
# scanner as a phantom skill. A nested SKILL.md WITHOUT frontmatter is an inert
|
|
188
|
+
# template (the NSR scaffolding layer) and is left alone.
|
|
189
|
+
phantom=""
|
|
190
|
+
while IFS= read -r sk; do
|
|
191
|
+
[ -n "$sk" ] || continue
|
|
192
|
+
rel="${sk#"$ROOT"/}"
|
|
193
|
+
[ "$(printf '%s' "$rel" | awk -F/ '{print NF}')" -gt 4 ] || continue
|
|
194
|
+
[ "$(head -1 "$sk")" = "---" ] && phantom="$phantom ${rel#.agents/skills/}"
|
|
195
|
+
done < <(find "$ROOT/.agents/skills" -name SKILL.md 2>/dev/null | sort)
|
|
196
|
+
# The ONE skills tree (`.agents/skills`) must reach EVERY harness, each by its
|
|
197
|
+
# own mechanism — and a harness silently loading nothing is invisible from the
|
|
198
|
+
# code, so it is asserted here:
|
|
199
|
+
# opencode — `skills.paths: [".agents/skills"]` in the tracked example
|
|
200
|
+
# pi — native discovery: it walks up from the cwd to `.agents/skills`
|
|
201
|
+
# (and `~/.agents/skills`), so it needs no link and no config
|
|
202
|
+
# claude · codex · cursor — project scope is their own dir: each gets
|
|
203
|
+
# `<harness>/skills -> ../.agents/skills`
|
|
204
|
+
skills_gaps=""
|
|
205
|
+
grep -q '\.agents/skills' "$ROOT/opencode.json.example" 2>/dev/null \
|
|
206
|
+
|| skills_gaps="$skills_gaps opencode(skills.paths missing from opencode.json.example)"
|
|
207
|
+
[ -d "$ROOT/.agents/skills" ] || skills_gaps="$skills_gaps .agents/skills(missing tree)"
|
|
208
|
+
for hd in .claude .codex .cursor; do
|
|
209
|
+
[ -d "$ROOT/$hd" ] || continue
|
|
210
|
+
if [ ! -L "$ROOT/$hd/skills" ]; then
|
|
211
|
+
skills_gaps="$skills_gaps ${hd}/skills(absent)"
|
|
212
|
+
else
|
|
213
|
+
case "$(readlink "$ROOT/$hd/skills")" in
|
|
214
|
+
../.agents/skills) : ;;
|
|
215
|
+
*) skills_gaps="$skills_gaps ${hd}/skills(wrong target)" ;;
|
|
216
|
+
esac
|
|
217
|
+
fi
|
|
218
|
+
done
|
|
219
|
+
|
|
220
|
+
harness_detail=""
|
|
221
|
+
[ -n "$harness_problems" ] && harness_detail="broken agent links:$harness_problems"
|
|
222
|
+
[ -n "$phantom" ] && harness_detail="$harness_detail phantom skills:$phantom"
|
|
223
|
+
[ -n "$skills_gaps" ] && harness_detail="$harness_detail skills not bound:$skills_gaps"
|
|
224
|
+
if [ -z "$harness_detail" ]; then
|
|
225
|
+
add harnesses "harness surfaces + skill discovery" PASS "$harness_links agent links resolve; skills bound (opencode config · pi native · claude/codex/cursor linked); no phantom skills"
|
|
226
|
+
else
|
|
227
|
+
add harnesses "harness surfaces + skill discovery" FAIL "$harness_detail"
|
|
228
|
+
fi
|
|
229
|
+
|
|
230
|
+
# --- roster -----------------------------------------------------------------
|
|
231
|
+
# The roster (config/agents.yaml.example) and the canonical tree
|
|
232
|
+
# (.agents/agents/*.md) must name the SAME figures. A figure in the tree but not
|
|
233
|
+
# in the roster falls to `default_model` and is never declared to the harness; a
|
|
234
|
+
# figure in the roster with no profile is a phantom the roster promises and the
|
|
235
|
+
# tree cannot seat. This is the check that would have caught the real failure:
|
|
236
|
+
# twenty profiles existed, the roster named ten, and only the hand-declared names
|
|
237
|
+
# in opencode.json ever loaded — so eighteen figures were unreachable while every
|
|
238
|
+
# other gate stayed green.
|
|
239
|
+
roster_gaps=""
|
|
240
|
+
if [ -f "$ROOT/config/agents.yaml.example" ]; then
|
|
241
|
+
# One python block, not shell text-munging: the tree side needs a per-file
|
|
242
|
+
# `name:`, and the roster side needs a real YAML read. Both in shell produced
|
|
243
|
+
# a collapsed single-line list and a mangled heredoc, so the comparison lied.
|
|
244
|
+
roster_report="$(python3 - "$ROOT" <<'PY' 2>/dev/null
|
|
245
|
+
import sys, os, re, glob
|
|
246
|
+
root = sys.argv[1]
|
|
247
|
+
tree = set()
|
|
248
|
+
for f in glob.glob(os.path.join(root, ".agents/agents/*.md")):
|
|
249
|
+
for line in open(f, encoding="utf-8", errors="replace"):
|
|
250
|
+
if line.startswith("name:"):
|
|
251
|
+
n = line.split(":", 1)[1].strip()
|
|
252
|
+
if n:
|
|
253
|
+
tree.add(n)
|
|
254
|
+
break
|
|
255
|
+
roster = set()
|
|
256
|
+
try:
|
|
257
|
+
import yaml
|
|
258
|
+
doc = yaml.safe_load(open(os.path.join(root, "config/agents.yaml.example")))
|
|
259
|
+
roster = set((doc.get("agents") or {}).keys())
|
|
260
|
+
except Exception:
|
|
261
|
+
# yaml may be absent; fall back to a strict two-space-indent scan
|
|
262
|
+
txt = open(os.path.join(root, "config/agents.yaml.example")).read()
|
|
263
|
+
m = re.search(r"^agents:[ \t]*\n((?:[ \t]+.*\n|\n)*)", txt, re.M)
|
|
264
|
+
if m:
|
|
265
|
+
for line in m.group(1).splitlines():
|
|
266
|
+
mm = re.match(r"[ \t]{2}([A-Za-z0-9_-]+)[ \t]*:", line)
|
|
267
|
+
if mm:
|
|
268
|
+
roster.add(mm.group(1))
|
|
269
|
+
unrostered = sorted(tree - roster)
|
|
270
|
+
phantom = sorted(roster - tree)
|
|
271
|
+
print(len(tree))
|
|
272
|
+
print(" ".join(unrostered))
|
|
273
|
+
print(" ".join(phantom))
|
|
274
|
+
PY
|
|
275
|
+
)"
|
|
276
|
+
tree_count="$(printf '%s\n' "$roster_report" | sed -n '1p')"
|
|
277
|
+
unrostered="$(printf '%s\n' "$roster_report" | sed -n '2p')"
|
|
278
|
+
phantom_roster="$(printf '%s\n' "$roster_report" | sed -n '3p')"
|
|
279
|
+
[ -n "$unrostered" ] && roster_gaps="$roster_gaps in-tree-but-not-rostered:$unrostered"
|
|
280
|
+
[ -n "$phantom_roster" ] && roster_gaps="$roster_gaps rostered-but-no-profile:$phantom_roster"
|
|
281
|
+
if [ -z "$roster_gaps" ]; then
|
|
282
|
+
add roster "roster and canonical tree agree" PASS "${tree_count:-0} figures, every one rostered and seated"
|
|
283
|
+
else
|
|
284
|
+
add roster "roster and canonical tree agree" FAIL "$roster_gaps"
|
|
285
|
+
fi
|
|
286
|
+
fi
|
|
287
|
+
|
|
288
|
+
# --- skillindex -------------------------------------------------------------
|
|
289
|
+
# The canonical index is .agents/skills/README.md. Every real skill must be named
|
|
290
|
+
# there, and every skill path the Galdr assets cite must resolve. This is the
|
|
291
|
+
# check that would have caught the drift by hand: three superseded skills stayed
|
|
292
|
+
# "live" in the registry long after their files were gone, and the registry table
|
|
293
|
+
# pointed at a whole layout (smidja/, gunnlod, hamr, saga, ymir, open-design)
|
|
294
|
+
# that no longer existed. A line marked planned/legacy/superseded is exempt by
|
|
295
|
+
# intent — an index may name what is coming or gone, but not what never was.
|
|
296
|
+
real_skills="$(find -L "$ROOT/.agents/skills" -mindepth 2 -maxdepth 2 -name SKILL.md -printf '%h\n' 2>/dev/null | while read -r d; do basename "$d"; done | sort)"
|
|
297
|
+
# An entry marked planned/legacy/superseded/… is exempt by intent, and so is one
|
|
298
|
+
# marked `app-provided`: the smithy's skill lives in its own app repo, cloned by
|
|
299
|
+
# step_apps — absent in a fresh clone or worktree until that step runs, present in
|
|
300
|
+
# a working tree. Exempting the MARKED entry keeps the index honest without
|
|
301
|
+
# demanding a path that only exists after the app clone.
|
|
302
|
+
indexed="$(grep -E '^ "[A-Za-z0-9._-]+"' "$ROOT/.agents/skills/README.md" 2>/dev/null \
|
|
303
|
+
| grep -viE 'planned|legacy|superseded|removed|abandoned|retired|former|app-provided' \
|
|
304
|
+
| grep -oE '^ "[A-Za-z0-9._-]+"' | tr -d ' "' | sort -u)"
|
|
305
|
+
missing_index="$(comm -23 <(printf '%s\n' "$real_skills") <(printf '%s\n' "$indexed") | tr '\n' ' ')"
|
|
306
|
+
extra_index="$(comm -13 <(printf '%s\n' "$real_skills") <(printf '%s\n' "$indexed") | tr '\n' ' ')"
|
|
307
|
+
dead_refs=""
|
|
308
|
+
while IFS= read -r line; do
|
|
309
|
+
case "$line" in
|
|
310
|
+
*planned*|*Planned*|*legacy*|*Legacy*|*superseded*|*Superseded*|*removed*|*Removed*|*abandoned*|*retired*|*former*) continue ;;
|
|
311
|
+
esac
|
|
312
|
+
for ref in $(printf '%s' "$line" | grep -oE '\.agents/skills/[A-Za-z0-9._-]+' | sort -u); do
|
|
313
|
+
case "$ref" in *.md) continue ;; esac # a file in the tree, not a skill dir
|
|
314
|
+
[ -d "$ROOT/$ref" ] || dead_refs="$dead_refs $ref"
|
|
315
|
+
done
|
|
316
|
+
done < <(cat "$GALDR"/assets/*.md "$ROOT/.agents/agents/brokk.md" 2>/dev/null)
|
|
317
|
+
skill_detail=""
|
|
318
|
+
[ -n "$(printf '%s' "$missing_index" | tr -d ' ')" ] && skill_detail="unindexed skills:$missing_index"
|
|
319
|
+
[ -n "$(printf '%s' "$extra_index" | tr -d ' ')" ] && skill_detail="$skill_detail indexed-but-absent:$extra_index"
|
|
320
|
+
[ -n "$(printf '%s' "$dead_refs" | tr -d ' ')" ] && skill_detail="$skill_detail dead skill paths:$dead_refs"
|
|
321
|
+
if [ -z "$skill_detail" ]; then
|
|
322
|
+
add skillindex "skill index + cited skill paths" PASS "$(printf '%s\n' "$real_skills" | grep -c .) skills, all indexed and cited paths resolve"
|
|
323
|
+
else
|
|
324
|
+
add skillindex "skill index + cited skill paths" FAIL "$skill_detail"
|
|
325
|
+
fi
|
|
326
|
+
|
|
327
|
+
# --- assets (governed paths) -------------------------------------------------
|
|
328
|
+
# A governed file changed in the working tree must have its owning asset changed
|
|
329
|
+
# in the same change, or the runtime has drifted from its documentation.
|
|
330
|
+
asset_for() {
|
|
331
|
+
case "$1" in
|
|
332
|
+
*bin/ymir-install.sh) printf '%s' "$GALDR/assets/installation.md" ;;
|
|
333
|
+
*apps/hlidskjalf/*) printf '%s' "$GALDR/assets/hlidskjalf-ui.md" ;;
|
|
334
|
+
*bin/mimir*) printf '%s' "$GALDR/assets/memory-well.md" ;;
|
|
335
|
+
*bin/gleipnir-lock-lib.sh|*bin/saga-session-start.sh|*state/.lock) printf '%s' "$GALDR/assets/brokk-distro-runtime.md" ;;
|
|
336
|
+
*bin/nornir-*|*config/cron.yaml) printf '%s' "$GALDR/assets/nornir-jobs.md" ;;
|
|
337
|
+
*bin/valknut-load.sh|*/.pi/*|*/.opencode/*) printf '%s' "$GALDR/assets/harness-integration/README.md" ;;
|
|
338
|
+
*bin/smidja*|*.agents/skills/smidja-factory/*) printf '%s' "$GALDR/assets/smidja.md" ;;
|
|
339
|
+
*) printf '' ;;
|
|
340
|
+
esac
|
|
341
|
+
}
|
|
342
|
+
if command -v git >/dev/null 2>&1 && git -C "$ROOT" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
343
|
+
changed="$(git -C "$ROOT" diff --name-only HEAD 2>/dev/null || true)"
|
|
344
|
+
stale=""
|
|
345
|
+
for f in $changed; do
|
|
346
|
+
a="$(asset_for "/$f")"
|
|
347
|
+
[ -n "$a" ] || continue
|
|
348
|
+
# Stale only when the asset itself did NOT also change.
|
|
349
|
+
printf '%s\n' "$changed" | grep -qxF "${a#"$ROOT"/}" && continue
|
|
350
|
+
stale="$stale ${f##*/}"
|
|
351
|
+
done
|
|
352
|
+
if [ -z "$stale" ]; then
|
|
353
|
+
add assets "governed assets current" PASS "no stale governed paths"
|
|
354
|
+
else
|
|
355
|
+
add assets "governed assets current" FAIL "stale (asset not updated):$stale"
|
|
356
|
+
fi
|
|
357
|
+
else
|
|
358
|
+
add assets "governed assets current" SKIP "not a git work tree"
|
|
359
|
+
fi
|
|
360
|
+
|
|
361
|
+
# --- design -----------------------------------------------------------------
|
|
362
|
+
# The cloth has TWO carriers on purpose: the CSS tokens every web surface imports
|
|
363
|
+
# (midgard/design-system/tokens.css) and the seven seeds Sessrúmnir derives ~40
|
|
364
|
+
# tokens from (themes/fensalir.json, the reference form). Two carriers of one
|
|
365
|
+
# identity drift the moment someone edits one, so they are checked against each
|
|
366
|
+
# other here: a colour may not change in one place only.
|
|
367
|
+
if [ -x "$ROOT/bin/design-check.sh" ]; then
|
|
368
|
+
if "$ROOT/bin/design-check.sh" >/dev/null 2>&1; then
|
|
369
|
+
add design "one cloth (tokens = seeds)" PASS "the 7 pairs agree — stone, bone, bronze, blood"
|
|
370
|
+
else
|
|
371
|
+
add design "one cloth (tokens = seeds)" FAIL "drifted — run bin/design-check.sh to see which pair"
|
|
372
|
+
fi
|
|
373
|
+
else
|
|
374
|
+
add design "one cloth (tokens = seeds)" SKIP "bin/design-check.sh absent"
|
|
375
|
+
fi
|
|
376
|
+
|
|
377
|
+
# --- duplicates -------------------------------------------------------------
|
|
378
|
+
if [ -d "$ROOT/assets/skills/assets" ]; then
|
|
379
|
+
add duplicates "no duplicate asset trees" FAIL "assets/skills/assets exists"
|
|
380
|
+
else
|
|
381
|
+
add duplicates "no duplicate asset trees" PASS "single canonical tree"
|
|
382
|
+
fi
|
|
383
|
+
|
|
384
|
+
# --- governed paths exist ---------------------------------------------------
|
|
385
|
+
# A governed path that does not exist is worse than a missing rule: the pretool
|
|
386
|
+
# guard stops matching silently, so the protection is gone and nothing fails.
|
|
387
|
+
# (A rename left `smidja-factory-factory` in AGENTS.md and in the guard's own
|
|
388
|
+
# pattern, which disabled the smidja rule without a single error.)
|
|
389
|
+
gov_missing=""
|
|
390
|
+
gov_count=0
|
|
391
|
+
while IFS= read -r spec; do
|
|
392
|
+
[ -n "$spec" ] || continue
|
|
393
|
+
old_ifs="$IFS"; IFS='|'
|
|
394
|
+
for alt in $spec; do
|
|
395
|
+
alt="$(printf '%s' "$alt" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')"
|
|
396
|
+
[ -n "$alt" ] || continue
|
|
397
|
+
gov_count=$((gov_count + 1))
|
|
398
|
+
[ -e "$ROOT/$alt" ] && continue
|
|
399
|
+
case "$alt" in
|
|
400
|
+
*'*'*|*'?'*|*'['*)
|
|
401
|
+
compgen -G "$ROOT/$alt" >/dev/null 2>&1 || gov_missing="$gov_missing $alt" ;;
|
|
402
|
+
*)
|
|
403
|
+
gov_missing="$gov_missing $alt" ;;
|
|
404
|
+
esac
|
|
405
|
+
done
|
|
406
|
+
IFS="$old_ifs"
|
|
407
|
+
done <<EOF
|
|
408
|
+
$(awk '/^governed\[/{f=1;next} f&&/^```/{exit} f{print}' "$ROOT/AGENTS.md" 2>/dev/null | sed -E 's/^ *"([^"]*)".*/\1/')
|
|
409
|
+
EOF
|
|
410
|
+
if [ "$gov_count" = 0 ]; then
|
|
411
|
+
add governed "governed paths resolve" SKIP "no governed table found in AGENTS.md"
|
|
412
|
+
elif [ -z "$gov_missing" ]; then
|
|
413
|
+
add governed "governed paths resolve" PASS "all $gov_count governed paths exist"
|
|
414
|
+
else
|
|
415
|
+
add governed "governed paths resolve" FAIL "missing:$gov_missing"
|
|
416
|
+
fi
|
|
417
|
+
|
|
418
|
+
# --- config (Rule 07) -------------------------------------------------------
|
|
419
|
+
# Two classes of hardcoding that only appear on someone else's machine, and that
|
|
420
|
+
# no other gate catches:
|
|
421
|
+
#
|
|
422
|
+
# models/providers — every user's differ, so a model id or provider name used
|
|
423
|
+
# as a VALUE in shipped code or a tracked config is a claim about a machine
|
|
424
|
+
# the author does not own. The user's own live in $YMIR_HOME/hodd/, read from
|
|
425
|
+
# a YAML file there; the repo ships only a template.
|
|
426
|
+
# absolute paths — a path naming a user (/home/<user>, /Users/<user>,
|
|
427
|
+
# C:\Users\<user>) is not portable. Paths are relative to a resolved root or
|
|
428
|
+
# come from env/config.
|
|
429
|
+
#
|
|
430
|
+
# Exempt by intent: comments (documentation may name an example), templates
|
|
431
|
+
# (*.example — placeholders are the point), CHANGELOG* (the record), and
|
|
432
|
+
# assets/reference/ (provenance — it records what was, not what runs).
|
|
433
|
+
config_bad=""
|
|
434
|
+
config_checked=0
|
|
435
|
+
|
|
436
|
+
# Shipped surfaces: the runtime, the skills' tools, the tracked configs.
|
|
437
|
+
config_files=$(git -C "$ROOT" ls-files -- 'bin/*.sh' 'scripts/*.sh' \
|
|
438
|
+
'.agents/skills/*/scripts/*' 'config/*' '*.json' '*.yaml' '*.yml' 2>/dev/null \
|
|
439
|
+
| grep -vE '(^|/)(CHANGELOG|assets/reference/|node_modules/|\.yggdrasil/)' \
|
|
440
|
+
| grep -vE '\.example$|\.template$' || true)
|
|
441
|
+
|
|
442
|
+
# A model id or provider name as a VALUE. The pattern is deliberately narrow: a
|
|
443
|
+
# known provider prefix followed by a model token, in a VALUE POSITION only —
|
|
444
|
+
# after `:`, `=`, or a JSON/YAML key. Prose that merely mentions
|
|
445
|
+
# "llama.cpp/llama-swap" in a sentence is documentation, not configuration, and
|
|
446
|
+
# must not trip the gate.
|
|
447
|
+
for f in $config_files; do
|
|
448
|
+
[ -f "$ROOT/$f" ] || continue
|
|
449
|
+
config_checked=$((config_checked + 1))
|
|
450
|
+
hits=$(sed -E 's/(^|[[:space:]])#.*$//' "$ROOT/$f" 2>/dev/null \
|
|
451
|
+
| grep -nE '(^|[[:space:]])(model|models|default_model|provider|providers)[[:space:]]*[:=][[:space:]]*"?[A-Za-z0-9._-]+/(llama\.cpp|llamacpp|opencode-go|apodex|openrouter|lmstudio)/|[":=][[:space:]]*"(llama\.cpp|llamacpp|opencode-go|apodex|openrouter|lmstudio)/[A-Za-z0-9._@-]+"' \
|
|
452
|
+
| head -3)
|
|
453
|
+
[ -n "$hits" ] && config_bad="$config_bad ${f}(model)"
|
|
454
|
+
done
|
|
455
|
+
|
|
456
|
+
# An absolute path naming a user.
|
|
457
|
+
for f in $config_files; do
|
|
458
|
+
[ -f "$ROOT/$f" ] || continue
|
|
459
|
+
hits=$(sed -E 's/(^|[[:space:]])#.*$//' "$ROOT/$f" 2>/dev/null \
|
|
460
|
+
| grep -nE '/home/[a-z][a-z0-9_-]+/|/Users/[A-Za-z][A-Za-z0-9_-]+/|[Cc]:\\Users\\' \
|
|
461
|
+
| head -3)
|
|
462
|
+
[ -n "$hits" ] && config_bad="$config_bad ${f}(path)"
|
|
463
|
+
done
|
|
464
|
+
|
|
465
|
+
if [ -z "$config_bad" ]; then
|
|
466
|
+
add config "no hardcoded models, providers, or user paths (Rule 07)" PASS \
|
|
467
|
+
"$config_checked files clean; models/providers resolve from \$YMIR_HOME/hodd/"
|
|
468
|
+
else
|
|
469
|
+
add config "no hardcoded models, providers, or user paths (Rule 07)" FAIL \
|
|
470
|
+
"hardcoded:$config_bad"
|
|
471
|
+
fi
|
|
472
|
+
|
|
473
|
+
# --- output -----------------------------------------------------------------
|
|
474
|
+
if [ "$JSON" = 1 ]; then
|
|
475
|
+
printf '{\n "checks": [\n'
|
|
476
|
+
first=1
|
|
477
|
+
for i in "${!IDS[@]}"; do
|
|
478
|
+
[ $first = 0 ] && printf ',\n'
|
|
479
|
+
first=0
|
|
480
|
+
printf ' {"id":"%s","check":"%s","status":"%s","detail":"%s"}' \
|
|
481
|
+
"${IDS[$i]}" "${CHECKS[$i]}" "${STATUS[$i]}" "${DETAILS[$i]}"
|
|
482
|
+
done
|
|
483
|
+
printf '\n ]\n}\n'
|
|
484
|
+
else
|
|
485
|
+
say "checks[${#IDS[@]}]{id,check,status,detail}:"
|
|
486
|
+
for i in "${!IDS[@]}"; do
|
|
487
|
+
say " \"${IDS[$i]}\",\"${CHECKS[$i]}\",\"${STATUS[$i]}\",\"${DETAILS[$i]}\""
|
|
488
|
+
done
|
|
489
|
+
fi
|
|
490
|
+
|
|
491
|
+
fails=0
|
|
492
|
+
for s in "${STATUS[@]}"; do [ "$s" = FAIL ] && fails=$((fails + 1)); done
|
|
493
|
+
if [ "$fails" -gt 0 ]; then
|
|
494
|
+
if [ "$JSON" = 1 ] || [ "$QUIET" = 1 ]; then
|
|
495
|
+
printf 'error: %s gate(s) failed\n' "$fails" >&2
|
|
496
|
+
printf 'help: fix the FAIL rows; see assets/runtime-compliance.md\n' >&2
|
|
497
|
+
else
|
|
498
|
+
printf '\nerror: %s gate(s) failed\n' "$fails"
|
|
499
|
+
printf 'help: fix the FAIL rows above; see assets/runtime-compliance.md\n'
|
|
500
|
+
fi
|
|
501
|
+
exit 1
|
|
502
|
+
fi
|
|
503
|
+
exit 0
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# gpu-sample.sh — sample GPU utilization + VRAM every N seconds while a test runs.
|
|
3
|
+
#
|
|
4
|
+
# Purpose (skill rule #6): catches CPU-spill / partial-GPU behavior that a single
|
|
5
|
+
# post-run number hides. During prefill you want to see 95-100% GPU util; if you
|
|
6
|
+
# see it drop to ~30% while decode continues, experts/KV are offloading to CPU.
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# gpu-sample.sh [interval] [count] # just samples
|
|
10
|
+
# gpu-sample.sh 2 10 -- curl -s <url> ... # samples WHILE a command runs
|
|
11
|
+
#
|
|
12
|
+
# Examples:
|
|
13
|
+
# gpu-sample.sh 2 8
|
|
14
|
+
# gpu-sample.sh 1 15 -- curl -s http://localhost:8125/v1/chat/completions -d @req.json -o out.json
|
|
15
|
+
set -uo pipefail
|
|
16
|
+
|
|
17
|
+
INTERVAL=${1:-2}; shift 2>/dev/null || true
|
|
18
|
+
COUNT=${1:-10}; shift 2>/dev/null || true
|
|
19
|
+
|
|
20
|
+
# remaining args (after optional interval/count) are a command to run while sampling
|
|
21
|
+
if [ "${1:-}" = "--" ]; then
|
|
22
|
+
shift
|
|
23
|
+
RUNCMD=("$@")
|
|
24
|
+
echo "sampling GPU every ${INTERVAL}s × ${COUNT} while running: $*"
|
|
25
|
+
( for i in $(seq 1 "$COUNT"); do
|
|
26
|
+
nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv,noheader | sed "s/^/t+${INTERVAL}s /"
|
|
27
|
+
sleep "$INTERVAL"
|
|
28
|
+
done ) &
|
|
29
|
+
SAMPLER=$!
|
|
30
|
+
"${RUNCMD[@]}"
|
|
31
|
+
RC=$?
|
|
32
|
+
wait "$SAMPLER" || true
|
|
33
|
+
exit $RC
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# plain sampling (no command)
|
|
37
|
+
echo "sampling GPU every ${INTERVAL}s × ${COUNT}"
|
|
38
|
+
for i in $(seq 1 "$COUNT"); do
|
|
39
|
+
nvidia-smi --query-gpu=utilization.gpu,memory.used,clocks.sm --format=csv,noheader | sed "s/^/t+${INTERVAL}s /"
|
|
40
|
+
sleep "$INTERVAL"
|
|
41
|
+
done
|
|
42
|
+
echo "done"
|
|
43
|
+
echo "NOTE: util≈95-100% during prefill = good; util ~30% while decoding = CPU spill."
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# stop-all.sh — clear anything a bench left behind, and report what holds the GPU.
|
|
3
|
+
#
|
|
4
|
+
# It stops ONLY the throwaway servers this skill started (they live on scratch
|
|
5
|
+
# ports in the 9200-9999 range) and then tells you the truth about the device,
|
|
6
|
+
# without pretending to manage anyone else's service.
|
|
7
|
+
#
|
|
8
|
+
# Usage: stop-all.sh
|
|
9
|
+
set -uo pipefail
|
|
10
|
+
|
|
11
|
+
echo "=== throwaway bench servers ==="
|
|
12
|
+
found=0
|
|
13
|
+
if command -v pgrep >/dev/null 2>&1; then
|
|
14
|
+
for p in $(pgrep -f "llama-server .*--port 9[2-9][0-9][0-9]" 2>/dev/null || true); do
|
|
15
|
+
kill "$p" 2>/dev/null && { echo " asked pid $p to stop"; found=1; }
|
|
16
|
+
done
|
|
17
|
+
fi
|
|
18
|
+
[ "$found" = "0" ] && echo " none running"
|
|
19
|
+
|
|
20
|
+
sleep 1
|
|
21
|
+
echo
|
|
22
|
+
echo "=== GPU ==="
|
|
23
|
+
if command -v nvidia-smi >/dev/null 2>&1; then
|
|
24
|
+
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv 2>/dev/null | sed 's/^/ /'
|
|
25
|
+
echo
|
|
26
|
+
nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu --format=csv,noheader | sed 's/^/ used/total/util: /'
|
|
27
|
+
echo " (a clean test baseline is the device's idle floor — a few MiB, or more on a desktop)"
|
|
28
|
+
elif command -v rocm-smi >/dev/null 2>&1; then
|
|
29
|
+
rocm-smi --showmemuse 2>/dev/null | sed 's/^/ /'
|
|
30
|
+
else
|
|
31
|
+
echo " no nvidia-smi or rocm-smi here."
|
|
32
|
+
echo " Find the holder yourself (lsof / ps) — and note that a model resident in"
|
|
33
|
+
echo " another service will contaminate your next measurement."
|
|
34
|
+
fi
|