Run a hook command, piping input as JSON to its stdin, and report the exit
code + parsed decision. Synchronous (so it can be used inside an eval's
measure too). command is run through a shell, so the same command string a
plugin ships (with args / env refs) works verbatim. Mark a hook you didn't
write with trusted: false and it is confined by default (or pass sandbox: "auto" directly) — see RunHookOptions.trusted.
vigiles/testing— Pillar 2 entry point: the harness-testing API. Re-exports the three tiers —runHook(unit),runHarnessTest(deterministic),runEval(eval) — plus the runner-agnostic predicates/assertions. Kept deliberately separate fromvigiles/claude-codeso this surface can stay harness-agnostic as more harnesses are added. Granular paths (vigiles/run-hook, etc.) still work.It re-exports the composition-root runner modules (which do the Claude-Code default-wiring), never an adapter directly — the
agnostic-surfaceeslint boundary forbids importingsrc/adapters/*from here. Seeresearch/adapter-api-design.md.