@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,197 @@
|
|
|
1
|
+
# Claude Code Harness Adapter
|
|
2
|
+
|
|
3
|
+
> **Purpose:** Rebuild, verify, or extend the Claude Code adapter — the `.claude/settings.json` `SessionStart` and `Stop` hooks that run the Sága digest at session open and re-arm **Sýn** + guard the turn end at Stop.
|
|
4
|
+
|
|
5
|
+
Claude Code is a **run-tier** harness: `SessionStart` hook stdout is injected into the session context, so the digest is seated before the model acts. Claude is **not** an Eindri dispatch target in Ymir (the verified launch set is `opencode pi pi-signed`), but it is a fully wired Brokk surface.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Files
|
|
10
|
+
|
|
11
|
+
| File | Contract parts |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `.claude/settings.json` | Session-open injection + turn-end guard + re-arm |
|
|
14
|
+
|
|
15
|
+
There is **no** PreToolUse seatbelt in Ymir's `.claude/settings.json` (upstream Brokk has them; see §7). There is no `.claude/hooks/` directory and no plugin runtime — Claude's adapter is pure hook JSON.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 2. The hook file (verbatim)
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"hooks": {
|
|
24
|
+
"SessionStart": [
|
|
25
|
+
{
|
|
26
|
+
"hooks": [
|
|
27
|
+
{
|
|
28
|
+
"type": "command",
|
|
29
|
+
"command": "[ -z \"${GROK_AGENT:-}${GROK_HOOK_EVENT:-}\" ] || exit 0; exec \"$CLAUDE_PROJECT_DIR\"/bin/saga-sessionstart-run.sh",
|
|
30
|
+
"timeout": 180
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"Stop": [
|
|
36
|
+
{
|
|
37
|
+
"hooks": [
|
|
38
|
+
{
|
|
39
|
+
"type": "command",
|
|
40
|
+
"command": "[ -z \"${GROK_AGENT:-}${GROK_HOOK_EVENT:-}\" ] || exit 0; exec \"$CLAUDE_PROJECT_DIR\"/bin/syn-turnend-guard.sh --claude"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"type": "command",
|
|
44
|
+
"command": "[ -z \"${GROK_AGENT:-}${GROK_HOOK_EVENT:-}\" ] || exit 0; out=$(exec \"$CLAUDE_PROJECT_DIR\"/bin/syn-watch-arm.sh --restart); rc=$?; case \"$out\" in *signal:*|*stale:*|*check:*|*heartbeat:*) printf '%s\n' \"$out\" >&2; exit 2;; esac; exit $rc",
|
|
45
|
+
"asyncRewake": true,
|
|
46
|
+
"timeout": 28800
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`.claude/settings.json` is 31 lines; the entire adapter is these two hook groups.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 3. SessionStart — run-tier injection
|
|
60
|
+
|
|
61
|
+
### Command anatomy
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
[ -z "${GROK_AGENT:-}${GROK_HOOK_EVENT:-}" ] || exit 0 # (1) skip when a Grok hook process reuses Claude settings
|
|
65
|
+
exec "$CLAUDE_PROJECT_DIR"/bin/saga-sessionstart-run.sh # (2) run the wrapper; stdout is injected
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
1. **The Grok guard.** Claude Code is Claude-compatible and Grok reuses `.claude/settings.json`; a Grok hook process carries `GROK_AGENT` or `GROK_HOOK_EVENT`. If either is set, the hook exits 0 without running, so the digest is not taken twice. (Grok's own adapter is not implemented in Ymir, but this guard is retained from the upstream pattern and is harmless.)
|
|
69
|
+
2. **`$CLAUDE_PROJECT_DIR`** is Claude's project root env var; the runtime root is derived from it directly, not from `pwd`. The runtime must be at `$CLAUDE_PROJECT_DIR/bin/`.
|
|
70
|
+
3. **`exec`** replaces the shell so the hook's exit status is the wrapper's. `timeout: 180` seconds.
|
|
71
|
+
|
|
72
|
+
### Run vs nudge on this hook
|
|
73
|
+
|
|
74
|
+
The wrapper is run-tier here, but it still routes internally:
|
|
75
|
+
|
|
76
|
+
| `source` (from hook stdin JSON) | Wrapper behavior |
|
|
77
|
+
|---|---|
|
|
78
|
+
| `startup`, `new` | run `bin/saga-session-start.sh`; write `state/.session-start-complete` |
|
|
79
|
+
| `clear`, `compact` | if already complete, print a short `CONTEXT RE-EMIT` note; else run the full digest |
|
|
80
|
+
| `resume`, `reload`, `fork` | print the nudge line: `Run \`bash .../bin/saga-session-start.sh\` exactly once now ...` |
|
|
81
|
+
|
|
82
|
+
Claude sends a JSON payload on stdin shaped like `{"source":"startup",...}`; `bin/saga-sessionstart-run.sh` parses it without `jq` (`bin/saga-sessionstart-run.sh:34-44`). If `source` is absent or unrecognized it defaults to `startup` — taking the helm redundantly is cheap; not taking it is the bug.
|
|
83
|
+
|
|
84
|
+
> **Exit-code law.** Claude's `SessionStart` hook exit 2 blocks session initialization. The wrapper therefore **always exits 0 on the transport path** (`bin/saga-sessionstart-run.sh` header comment). A failed session start must arrive as digest text the agent can act on, never as a refusal to open. Do not add a hook that can fail the open.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 4. Stop — turn-end guard + re-arm
|
|
89
|
+
|
|
90
|
+
Stop runs **two independent commands**, in order.
|
|
91
|
+
|
|
92
|
+
### 4.1 Turn-end guard
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
[ -z "${GROK_AGENT:-}${GROK_HOOK_EVENT:-}" ] || exit 0
|
|
96
|
+
exec "$CLAUDE_PROJECT_DIR"/bin/syn-turnend-guard.sh --claude
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
- `--claude` is a compatibility tag. The current guard has **no argument parsing**, so it is ignored; do not rely on it changing behavior. (The peer `--cursor` tags *are* parsed by the seatbelt scripts, which ignore them via a `*)` branch.)
|
|
100
|
+
- stdin receives `{"stop_hook_active":false}`, which the guard drains (`cat >/dev/null`).
|
|
101
|
+
- **exit 0** when supervision is healthy or was never armed.
|
|
102
|
+
- **exit 2** when supervision was armed and the watcher is missing/stale; stderr carries:
|
|
103
|
+
```
|
|
104
|
+
Brokk supervision is off: the watcher cycle is missing, failed, or unhealthy.
|
|
105
|
+
Recovery: re-arm through the harness extension (gna_watch_arm). Do not end the turn blind.
|
|
106
|
+
```
|
|
107
|
+
Claude surfaces the stderr and re-prompts instead of ending the turn.
|
|
108
|
+
|
|
109
|
+
### 4.2 Async re-arm
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
out=$(exec "$CLAUDE_PROJECT_DIR"/bin/syn-watch-arm.sh --restart); rc=$?
|
|
113
|
+
case "$out" in *signal:*|*stale:*|*check:*|*heartbeat:*) printf '%s\n' "$out" >&2; exit 2;; esac
|
|
114
|
+
exit $rc
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- `"asyncRewake": true`, `"timeout": 28800` (8 hours) keeps the arm running out of band at the end of a turn — this is Claude's continuity mechanism in lieu of a plugin-owned child.
|
|
118
|
+
- Any actionable line (`signal:` / `stale:` / `check:` / `heartbeat:`) is printed to stderr and forces exit 2, which rewakes the session.
|
|
119
|
+
- Otherwise the arm's own exit code is passed through.
|
|
120
|
+
|
|
121
|
+
### Why two Stop hooks
|
|
122
|
+
|
|
123
|
+
The guard answers "is supervision healthy right now?"; the arm answers "keep it healthy". They are separate commands so a healthy guard never blocks the re-arm, and an actionable arm always forces a rewake even if the guard's heartbeat window still looked fresh.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 5. Install / enable / verify
|
|
128
|
+
|
|
129
|
+
### Enable
|
|
130
|
+
|
|
131
|
+
`.claude/settings.json` is tracked and project-local; Claude Code reads it automatically. No symlink or registration is needed. The runtime scripts it calls must exist under `$CLAUDE_PROJECT_DIR/bin/`.
|
|
132
|
+
|
|
133
|
+
### Syntax / schema
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
cd "$BROKK_HOME"
|
|
137
|
+
python3 -m json.tool .claude/settings.json >/dev/null && echo "claude settings JSON ok"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Verify SessionStart exactly as the hook runs
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
printf '{"source":"startup"}' | "$BROKK_HOME/bin/saga-sessionstart-run.sh" | head -n 20
|
|
144
|
+
printf '{"source":"startup"}' | "$BROKK_HOME/bin/saga-sessionstart-run.sh" >/dev/null; echo "exit=$? (must be 0)"
|
|
145
|
+
printf '{"source":"resume"}' | "$BROKK_HOME/bin/saga-sessionstart-run.sh" | head -n 2
|
|
146
|
+
# expected: Run `bash .../bin/saga-session-start.sh` exactly once now ...
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Verify Stop
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Guard, inert:
|
|
153
|
+
rm -f state/.supervision-armed
|
|
154
|
+
echo '{"stop_hook_active":false}' | bin/syn-turnend-guard.sh --claude; echo "inert -> $? (expect 0)"
|
|
155
|
+
# Guard, armed + stale:
|
|
156
|
+
touch state/.supervision-armed; rm -f state/.watch.heartbeat
|
|
157
|
+
echo '{"stop_hook_active":false}' | bin/syn-turnend-guard.sh --claude; echo "armed+stale -> $? (expect 2)"
|
|
158
|
+
|
|
159
|
+
# Re-arm command body, emulated (must own the lock):
|
|
160
|
+
state=$(mktemp -d)
|
|
161
|
+
out=$(BROKK_STATE_OVERRIDE="$state" BROKK_HOME="$BROKK_HOME" bin/syn-watch-arm.sh --restart); rc=$?
|
|
162
|
+
case "$out" in *signal:*|*stale:*|*check:*|*heartbeat:*) echo "would rewake";; esac
|
|
163
|
+
echo "arm rc=$rc"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Verify the Grok guard
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# With a Grok marker set, both hooks must no-op with exit 0.
|
|
170
|
+
GROK_AGENT=1 bash -c '[ -z "${GROK_AGENT:-}${GROK_HOOK_EVENT:-}" ] || exit 0; echo "skipped"'
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 6. Gotchas
|
|
176
|
+
|
|
177
|
+
- **Do not let SessionStart exit non-zero.** Exit 2 blocks Claude session initialization. The wrapper is designed to always exit 0; a hook that wraps it must preserve that.
|
|
178
|
+
- **`$CLAUDE_PROJECT_DIR` must point at the runtime root.** Ymir's scripts are rooted at `$CLAUDE_PROJECT_DIR/bin`; if the runtime is installed elsewhere, set the env var or the hooks no-op/err.
|
|
179
|
+
- **The Grok guard is load-bearing, not cosmetic.** Claude-compatible harnesses (Grok) reuse `.claude/settings.json`; without the `GROK_AGENT`/`GROK_HOOK_EVENT` guard the digest would run twice.
|
|
180
|
+
- **`asyncRewake` re-arm is the only continuity on Claude.** There is no long-lived plugin child; if the Stop hook is removed or its timeout shortened, supervision dies at the first turn end.
|
|
181
|
+
- **No PreToolUse seatbelts here.** Ymir's `.claude/settings.json` omits the arm/cd PreToolUse entries that upstream Brokk ships. A model bash call that backgrounds `syn-watch-arm.sh` is therefore not blocked on Claude. Treat this as a known gap (§7) and rely on the guard, not the seatbelt.
|
|
182
|
+
- **The Stop guard and re-arm are independent.** Removing one silently degrades supervision: no guard → blind turn ends; no arm → immediate stale heartbeat.
|
|
183
|
+
- **stdin is consumed.** Hook commands receive JSON on stdin; any wrapper you add must not block reading it. The guard drains stdin itself.
|
|
184
|
+
- **`timeout: 28800` is deliberate.** Shortening the Stop arm timeout causes it to be killed mid-session and the guard to report stale on the next turn.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 7. Known gaps (code-vs-doc)
|
|
189
|
+
|
|
190
|
+
| Plan 29 §7 says | Ymir `.claude/settings.json` truth |
|
|
191
|
+
|---|---|
|
|
192
|
+
| Claude Code is `SessionStart` + `Stop` | correct — those are the only two hook groups present |
|
|
193
|
+
| (implicit: same four contract parts as other harnesses) | **no `PreToolUse`** arm/cd seatbelts are registered |
|
|
194
|
+
|
|
195
|
+
Upstream Brokk registers two `PreToolUse` entries (`Bash` matcher → `fm-arm-pretool-check.sh --claude`, `fm-cd-pretool-check.sh --claude`). To close the gap, add the equivalent `PreToolUse` block calling `bin/syn-arm-pretool-check.sh --claude` and `bin/syn-cd-pretool-check.sh --claude`. Do not assume the seatbelt is active until it is added and smoke-tested.
|
|
196
|
+
|
|
197
|
+
**Skills.** This harness reads project skills from `.claude/skills/`; `bin/valknut-load.sh` binds it to the one tree (`.claude/skills -> ../.agents/skills`). Never copy a `SKILL.md` in — a copy is drift, and a nested `SKILL.md` with frontmatter is loaded as a phantom skill.
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Codex Harness Adapter
|
|
2
|
+
|
|
3
|
+
> **Purpose:** Rebuild, verify, or extend the Codex adapter — the `.codex/hooks.json` `SessionStart`, `PreToolUse`, and `Stop` hooks that run the Sága digest, enforce the seatbelts, and guard the turn end, gated by `[features].hooks = true`.
|
|
4
|
+
|
|
5
|
+
Codex is a **run-tier session-open** harness when the hooks feature is enabled. Each hook is a defensive `bash -lc` one-liner that self-locates with `pwd -P`, self-verifies that it is really registered in the project's `.codex/hooks.json`, and only then calls the runtime.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Files and gate
|
|
10
|
+
|
|
11
|
+
| File | Role |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `.codex/hooks.json` | project hook registrations (SessionStart, PreToolUse, Stop) |
|
|
14
|
+
| `~/.codex/config.toml` | must contain `[features]\nhooks = true` for hooks to load |
|
|
15
|
+
|
|
16
|
+
Codex will not run project hooks unless the feature flag is on. The observed global config on this host:
|
|
17
|
+
|
|
18
|
+
```toml
|
|
19
|
+
[features]
|
|
20
|
+
hooks = true
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
There is no plugin runtime and no per-harness script directory; the adapter is the hook JSON plus the feature flag.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. The hook file (verbatim)
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"hooks": {
|
|
32
|
+
"SessionStart": [
|
|
33
|
+
{
|
|
34
|
+
"hooks": [
|
|
35
|
+
{
|
|
36
|
+
"type": "command",
|
|
37
|
+
"command": "bash -lc 'payload=$(cat 2>/dev/null || true); [ -n \"$payload\" ] || exit 0; command -v jq >/dev/null 2>&1 || exit 0; root=$(pwd -P) || exit 0; [ -x \"$root/bin/saga-sessionstart-run.sh\" ] || exit 0; [ -f \"$root/AGENTS.md\" ] || exit 0; [ -f \"$root/.codex/hooks.json\" ] || exit 0; jq -e \"any(.hooks.SessionStart[]?.hooks[]?.command?; type == \\\"string\\\" and contains(\\\"saga-sessionstart-run.sh\\\"))\" \"$root/.codex/hooks.json\" >/dev/null 2>&1 || exit 0; printf \"%s\" \"$payload\" | \"$root/bin/saga-sessionstart-run.sh\"'",
|
|
38
|
+
"timeout": 180
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"PreToolUse": [
|
|
44
|
+
{
|
|
45
|
+
"matcher": "Bash",
|
|
46
|
+
"hooks": [
|
|
47
|
+
{ "type": "command", "command": "bash -lc '... | \"$root/bin/syn-arm-pretool-check.sh\"'", "timeout": 10 },
|
|
48
|
+
{ "type": "command", "command": "bash -lc '... | \"$root/bin/syn-cd-pretool-check.sh\"'", "timeout": 10 }
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"Stop": [
|
|
53
|
+
{
|
|
54
|
+
"hooks": [
|
|
55
|
+
{ "type": "command", "command": "bash -lc '... | \"$root/bin/syn-turnend-guard.sh\"'", "timeout": 30 }
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
(The PreToolUse/Stop commands are long; their full text is in `.codex/hooks.json:20`, `:25`, `:36`. Each is the same defensive preamble plus the owner script.)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 3. The defensive preamble (shared by every hook)
|
|
68
|
+
|
|
69
|
+
Every hook uses the same `bash -lc` shape. Read it as a fail-closed gate:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
payload=$(cat 2>/dev/null || true) # 1. read the hook JSON payload
|
|
73
|
+
[ -n "$payload" ] || exit 0 # no payload → no-op
|
|
74
|
+
command -v jq >/dev/null 2>&1 || exit 0 # 2. jq is required for payload handling/verification
|
|
75
|
+
root=$(pwd -P) || exit 0 # 3. Codex runs the hook from the project root
|
|
76
|
+
[ -x "$root/bin/<script>" ] || exit 0 # 4. the runtime script must exist and be executable
|
|
77
|
+
[ -f "$root/AGENTS.md" ] || exit 0 # 5. this must look like a Brokk home
|
|
78
|
+
[ -f "$root/.codex/hooks.json" ] || exit 0 # 6. this project's hook file must exist
|
|
79
|
+
jq -e "any(.hooks.<Event>[]?.hooks[]?.command?; type == \"string\" and contains(\"<script>\"))" \
|
|
80
|
+
"$root/.codex/hooks.json" >/dev/null 2>&1 || exit 0 # 7. self-verify registration
|
|
81
|
+
printf "%s" "$payload" | "$root/bin/<script>" # 8. run the owner script
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The **self-verification** step (7) is the distinctive Codex safeguard: the hook refuses to run unless the project's own `.codex/hooks.json` still declares a command containing the target script name. A copy of the hook JSON placed in a foreign home, or a hijacked registration, no-ops instead of running the runtime.
|
|
85
|
+
|
|
86
|
+
`root=$(pwd -P)` resolves symlinks, so a hook launched through a symlinked path still resolves the real project root.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 4. Per-event behavior
|
|
91
|
+
|
|
92
|
+
### 4.1 `SessionStart` → `bin/saga-sessionstart-run.sh`
|
|
93
|
+
|
|
94
|
+
- Pipes the JSON payload into the wrapper; the wrapper parses `source` without `jq` (`bin/saga-sessionstart-run.sh:34-44`).
|
|
95
|
+
- Source routing is the same as Claude: `startup`/`new` run the digest; `clear`/`compact` re-emit after a completed startup; `resume`/`reload`/`fork` nudge.
|
|
96
|
+
- `timeout: 180`.
|
|
97
|
+
- The wrapper always exits 0 on the transport path; a run-tier print of the digest reaches model context.
|
|
98
|
+
|
|
99
|
+
### 4.2 `PreToolUse` (matcher `Bash`) → seatbelts
|
|
100
|
+
|
|
101
|
+
Two hooks, each piping the payload to an owner script:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
... printf "%s" "$payload" | "$root/bin/syn-arm-pretool-check.sh"
|
|
105
|
+
... printf "%s" "$payload" | "$root/bin/syn-cd-pretool-check.sh"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- `timeout: 10`.
|
|
109
|
+
- Exit **2** blocks the Bash call; the reason is on stderr.
|
|
110
|
+
- These scripts normally take `--command <cmd>`; in the Codex flow the command is carried in the payload. The owner scripts are the policy holders either way.
|
|
111
|
+
|
|
112
|
+
### 4.3 `Stop` → `bin/syn-turnend-guard.sh`
|
|
113
|
+
|
|
114
|
+
- Pipes the payload (typically `{"stop_hook_active":false}`) into the guard.
|
|
115
|
+
- Exit **2** surfaces the recovery instruction and re-prompts instead of letting the turn end blind.
|
|
116
|
+
- `timeout: 30`.
|
|
117
|
+
- **No re-arm.** Codex has no async Stop continuation in this adapter, so there is no long-lived arm child. The guard is inert until something else writes `state/.supervision-armed`.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 5. Install / enable / verify
|
|
122
|
+
|
|
123
|
+
### Enable the feature gate
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Codex global config must have:
|
|
127
|
+
grep -A1 '^\[features\]' ~/.codex/config.toml # expect: hooks = true
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
If absent, add:
|
|
131
|
+
|
|
132
|
+
```toml
|
|
133
|
+
[features]
|
|
134
|
+
hooks = true
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Syntax / schema
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
cd "$BROKK_HOME"
|
|
141
|
+
python3 -m json.tool .codex/hooks.json >/dev/null && echo "codex hooks JSON ok"
|
|
142
|
+
command -v jq >/dev/null && echo "jq present" || echo "jq MISSING - adapter will no-op"
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Verify the session-open path
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
printf '{"source":"startup"}' | bin/saga-sessionstart-run.sh | head -n 20; echo "exit=$?"
|
|
149
|
+
printf '{"source":"compact"}' | bin/saga-sessionstart-run.sh | head -n 3
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Verify the self-verification gate
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# The jq expression the SessionStart hook runs; must be true in-tree:
|
|
156
|
+
jq -e 'any(.hooks.SessionStart[]?.hooks[]?.command?; type == "string" and contains("saga-sessionstart-run.sh"))' .codex/hooks.json
|
|
157
|
+
jq -e 'any(.hooks.PreToolUse[]?.hooks[]?.command?; type == "string" and contains("syn-arm-pretool-check.sh"))' .codex/hooks.json
|
|
158
|
+
jq -e 'any(.hooks.Stop[]?.hooks[]?.command?; type == "string" and contains("syn-turnend-guard.sh"))' .codex/hooks.json
|
|
159
|
+
# All three must print true and exit 0.
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Verify Stop
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
rm -f state/.supervision-armed
|
|
166
|
+
printf '{"stop_hook_active":false}' | bin/syn-turnend-guard.sh; echo "inert -> $? (expect 0)"
|
|
167
|
+
touch state/.supervision-armed; rm -f state/.watch.heartbeat
|
|
168
|
+
printf '{"stop_hook_active":false}' | bin/syn-turnend-guard.sh; echo "armed+stale -> $? (expect 2)"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Verify seatbelts
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
bin/syn-arm-pretool-check.sh --command 'bin/syn-watch-arm.sh &'; echo "arm -> $? (expect 2)"
|
|
175
|
+
bin/syn-cd-pretool-check.sh --command 'cd ../..'; echo "cd -> $? (expect 2)"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## 6. Gotchas
|
|
181
|
+
|
|
182
|
+
- **`[features].hooks = true` is mandatory and lives in the global config**, not the project. Without it, `.codex/hooks.json` is ignored entirely.
|
|
183
|
+
- **`jq` is a hard dependency.** Every hook exits 0 if `jq` is missing, disabling injection, seatbelts, and the guard.
|
|
184
|
+
- **The self-verification step can brick the adapter after an edit.** If you rename `saga-sessionstart-run.sh` or `syn-arm-pretool-check.sh`, the `contains(...)` check silently starts returning false and the hooks no-op. Keep script names stable or update the strings in `.codex/hooks.json` in the same change.
|
|
185
|
+
- **`pwd -P` requires Codex to launch hooks from the project root.** If a future Codex version runs hooks from elsewhere, the root resolves wrong and every gate fails closed (silent no-op).
|
|
186
|
+
- **There is no re-arm.** Do not assume Codex owns supervision across turns; the guard is inert until an arm exists.
|
|
187
|
+
- **No `PreToolUse` matcher for non-Bash tools.** Only `Bash` is guarded; other tool calls bypass the seatbelts by design.
|
|
188
|
+
- **Payload shape is assumed JSON.** A hook with empty stdin no-ops (`[ -n "$payload" ]`).
|
|
189
|
+
- **Do not simplify the preamble.** Each guard (`AGENTS.md`, `.codex/hooks.json`, executable bit, registration self-check) exists to keep the adapter from running in a foreign or partially installed home.
|
|
190
|
+
|
|
191
|
+
**Skills.** This harness reads project skills from `.codex/skills/`; `bin/valknut-load.sh` binds it to the one tree (`.codex/skills -> ../.agents/skills`). Never copy a `SKILL.md` in — a copy is drift, and a nested `SKILL.md` with frontmatter is loaded as a phantom skill.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Cursor Harness Adapter
|
|
2
|
+
|
|
3
|
+
> **Purpose:** Rebuild, verify, or extend the Cursor adapter — the `.cursor/hooks.json` project hooks that inject the Sága digest via `additional_context`, emit a turn-end `followup_message`, and run the PreToolUse seatbelts.
|
|
4
|
+
|
|
5
|
+
Cursor is a **run-tier session-open** harness (it injects `additional_context`) and a **turn-end-only** harness (the `stop` hook returns a `followup_message`; there is no long-lived arm child). Cursor is not an Eindri dispatch target in Ymir, but it is a wired Brokk surface.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Files
|
|
10
|
+
|
|
11
|
+
| File | Contract parts |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `.cursor/hooks.json` | Session-open injection + turn-end guard + PreToolUse seatbelts |
|
|
14
|
+
|
|
15
|
+
The adapter is pure hook JSON. There is no plugin runtime and no `.cursor/rules/` dependency.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 2. The hook file (verbatim)
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"version": 1,
|
|
24
|
+
"hooks": {
|
|
25
|
+
"sessionStart": [
|
|
26
|
+
{
|
|
27
|
+
"type": "command",
|
|
28
|
+
"command": "digest=$(\"$CURSOR_PROJECT_DIR\"/bin/saga-sessionstart-run.sh --source startup </dev/null 2>/dev/null); [ -n \"$digest\" ] || exit 0; command -v jq >/dev/null 2>&1 || exit 0; jq -n --arg c \"$digest\" '{additional_context:$c}' 2>/dev/null || true",
|
|
29
|
+
"timeout": 180
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"stop": [
|
|
33
|
+
{
|
|
34
|
+
"type": "command",
|
|
35
|
+
"command": "guard=$(\"$CURSOR_PROJECT_DIR\"/bin/syn-turnend-guard.sh 2>&1 </dev/null); rc=$?; [ \"$rc\" -eq 2 ] || exit 0; command -v jq >/dev/null 2>&1 || exit 0; jq -n --arg m \"$guard\" '{followup_message:$m}' 2>/dev/null || true",
|
|
36
|
+
"timeout": 30
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"preToolUse": [
|
|
40
|
+
{
|
|
41
|
+
"matcher": "Shell",
|
|
42
|
+
"type": "command",
|
|
43
|
+
"command": "\"$CURSOR_PROJECT_DIR\"/bin/syn-arm-pretool-check.sh --cursor",
|
|
44
|
+
"timeout": 10
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"matcher": "Shell",
|
|
48
|
+
"type": "command",
|
|
49
|
+
"command": "\"$CURSOR_PROJECT_DIR\"/bin/syn-cd-pretool-check.sh --cursor",
|
|
50
|
+
"timeout": 10
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`.cursor/hooks.json` is 33 lines. `"version": 1` is Cursor's hook schema version and is required.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 3. `sessionStart` — run-tier injection
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
digest=$("$CURSOR_PROJECT_DIR"/bin/saga-sessionstart-run.sh --source startup </dev/null 2>/dev/null)
|
|
65
|
+
[ -n "$digest" ] || exit 0 # no digest → no-op
|
|
66
|
+
command -v jq >/dev/null 2>&1 || exit 0 # jq is required to shape JSON
|
|
67
|
+
jq -n --arg c "$digest" '{additional_context:$c}' 2>/dev/null || true
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- **Root** comes from `$CURSOR_PROJECT_DIR`.
|
|
71
|
+
- **Source is explicit** (`--source startup`): unlike Claude/Codex, Cursor does not deliver a source-bearing JSON payload here.
|
|
72
|
+
- **stdin is closed** (`</dev/null`) so the wrapper never blocks on a read.
|
|
73
|
+
- **Output shape:** `{"additional_context": "<digest>"}`. Cursor injects that string as session context. This is the run-tier injection.
|
|
74
|
+
- **`|| true`** means a `jq` failure degrades to no context rather than a failed hook. `jq` is a hard dependency for Cursor; without it the whole adapter no-ops.
|
|
75
|
+
- `timeout: 180`.
|
|
76
|
+
|
|
77
|
+
Cursor also loads the tracked Claude settings, so upstream guards against double-running. Ymir's `.cursor/hooks.json` passes an explicit `--source` and does **not** pipe a payload, so the wrapper does not run the foreign-host detection.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 4. `stop` — turn-end guard
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
guard=$("$CURSOR_PROJECT_DIR"/bin/syn-turnend-guard.sh 2>&1 </dev/null); rc=$?
|
|
85
|
+
[ "$rc" -eq 2 ] || exit 0
|
|
86
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
87
|
+
jq -n --arg m "$guard" '{followup_message:$m}' 2>/dev/null || true
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
- Runs the guard with **stderr merged into stdout** (`2>&1`), so the recovery text is captured.
|
|
91
|
+
- Only exit **2** produces output; all other exits are silent (`exit 0`).
|
|
92
|
+
- **Output shape:** `{"followup_message": "<guard text>"}`. Cursor posts that message as a follow-up to the session, which is how the blind-turn-end refusal reaches the model.
|
|
93
|
+
- `timeout: 30`.
|
|
94
|
+
|
|
95
|
+
There is **no re-arm** hook: Cursor has no async/background Stop continuation in this adapter. Supervision is expected to be owned elsewhere (or the session runs with the guard inert until an arm exists). Treat Cursor as the weakest supervision surface.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 5. `preToolUse` — seatbelts
|
|
100
|
+
|
|
101
|
+
Two entries, both `"matcher": "Shell"`:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
"$CURSOR_PROJECT_DIR"/bin/syn-arm-pretool-check.sh --cursor # timeout 10
|
|
105
|
+
"$CURSOR_PROJECT_DIR"/bin/syn-cd-pretool-check.sh --cursor # timeout 10
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- `--cursor` selects Cursor's transport semantics in the owner scripts.
|
|
109
|
+
- Exit **2** blocks the shell call; the reason is on stderr.
|
|
110
|
+
- `syn-arm-pretool-check.sh` denies a command that backgrounds `syn-watch-arm.sh`; `syn-cd-pretool-check.sh` denies `cd .../../`.
|
|
111
|
+
- Both are inert-by-default contracts: they allow everything else.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 6. Trust
|
|
116
|
+
|
|
117
|
+
Cursor project hooks require the workspace to be launched with **`--trust`**. Without it, none of the project hooks load and Brokk is never seated.
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
cursor-agent --trust
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Upstream Brokk also notes a hard limit worth carrying into Ymir: **headless `cursor-agent -p` has no turn-end hook**, so a Cursor primary must be run **interactively** for supervision to work. If Cursor is driven headlessly, only `sessionStart` and `preToolUse` fire.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 7. Install / enable / verify
|
|
128
|
+
|
|
129
|
+
### Enable
|
|
130
|
+
|
|
131
|
+
`.cursor/hooks.json` is tracked and project-local. Cursor reads it when the workspace is trusted. The runtime scripts must exist under `$CURSOR_PROJECT_DIR/bin/`. `jq` must be installed.
|
|
132
|
+
|
|
133
|
+
### Syntax / schema
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
cd "$BROKK_HOME"
|
|
137
|
+
python3 -m json.tool .cursor/hooks.json >/dev/null && echo "cursor hooks JSON ok"
|
|
138
|
+
command -v jq >/dev/null && echo "jq present" || echo "jq MISSING - adapter will no-op"
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Verify sessionStart output shape
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
digest=$("$BROKK_HOME/bin/saga-sessionstart-run.sh" --source startup </dev/null 2>/dev/null)
|
|
145
|
+
echo "digest bytes: ${#digest}"
|
|
146
|
+
jq -n --arg c "$digest" '{additional_context:$c}' | jq -e 'has("additional_context")' && echo "shape ok"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Verify stop output shape
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Inert guard:
|
|
153
|
+
rm -f state/.supervision-armed
|
|
154
|
+
guard=$(bin/syn-turnend-guard.sh 2>&1 </dev/null); rc=$?
|
|
155
|
+
echo "rc=$rc (expect 0; no followup_message emitted)"
|
|
156
|
+
|
|
157
|
+
# Armed + stale → emit followup_message:
|
|
158
|
+
touch state/.supervision-armed; rm -f state/.watch.heartbeat
|
|
159
|
+
guard=$(bin/syn-turnend-guard.sh 2>&1 </dev/null); rc=$?
|
|
160
|
+
echo "rc=$rc (expect 2)"
|
|
161
|
+
[ "$rc" -eq 2 ] && jq -n --arg m "$guard" '{followup_message:$m}' | jq -e 'has("followup_message")' && echo "shape ok"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Verify preToolUse
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
bin/syn-arm-pretool-check.sh --cursor --command 'bin/syn-watch-arm.sh &'; echo "arm -> $? (expect 2)"
|
|
168
|
+
bin/syn-cd-pretool-check.sh --cursor --command 'cd ../..'; echo "cd -> $? (expect 2)"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
> Note: `--command` and `--cursor` are both parsed by the owner scripts; the hook commands above pass only `--cursor` because in the real hook the command text arrives on stdin. For a local smoke test, pass `--command` explicitly.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 8. Gotchas
|
|
176
|
+
|
|
177
|
+
- **`--trust` is mandatory.** No trust → no hooks → no Brokk.
|
|
178
|
+
- **`jq` is a hard dependency.** Both `sessionStart` and `stop` shape JSON with `jq` and exit 0 if it is missing. A missing `jq` silently disables injection and the guard.
|
|
179
|
+
- **Headless Cursor has no turn-end hook.** `cursor-agent -p` fires only `sessionStart`/`preToolUse`; run interactively for supervision.
|
|
180
|
+
- **`stop` is guard-only; there is no arm.** `syn-turnend-guard.sh` is inert until something else arms supervision. With no arm on Cursor, the guard's exit 2 only occurs if an arm exists from another source. Do not claim Cursor has turn-end supervision until an arm path is verified.
|
|
181
|
+
- **stderr is merged into stdout in `stop`.** Do not "clean up" `2>&1`; the guard's recovery text lives on stderr.
|
|
182
|
+
- **Explicit `--source startup` means resume/compact are not differentiated.** Cursor always takes the full digest at session open. Acceptable (redundant but cheap), but it means a resumed Cursor session re-runs the digest rather than nudging.
|
|
183
|
+
- **`|| true` hides `jq` failures.** A malformed digest cannot fail the hook; it just produces no context. Diagnose by running the two commands by hand.
|
|
184
|
+
- **`matcher: "Shell"` is exact.** If Cursor renames the shell tool, both seatbelts stop firing.
|
|
185
|
+
- **PreToolUse timeout is 10s.** A slow `bin/syn-*-pretool-check.sh` call can time out and allow the command; keep the owner scripts fast (they are pure `case` matches).
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 9. Code-vs-doc note
|
|
190
|
+
|
|
191
|
+
Plan 29 §7 describes Cursor as "run interactive only (no headless turn-end)". The code matches that limitation, but it **also** implements a `sessionStart` `additional_context` injection and a `stop` `followup_message`. So Cursor is a full session-open + turn-end surface interactively — not merely a runner.
|
|
192
|
+
|
|
193
|
+
**Skills.** This harness reads project skills from `.cursor/skills/`; `bin/valknut-load.sh` binds it to the one tree (`.cursor/skills -> ../.agents/skills`). Never copy a `SKILL.md` in — a copy is drift, and a nested `SKILL.md` with frontmatter is loaded as a phantom skill.
|