SIGN IN SIGN UP

ci: gate publishes on host e2e behavior suite (#119 follow-up)

Adds e2e-host-opencode and e2e-host-pi jobs to both ci.yml and
release.yml. They run the packages/e2e-tests behavior suite (36
OpenCode + 38 Pi active tests) against the embedded mock provider,
spawning real opencode serve and Pi subprocesses.

Why two e2e layers:
  - Docker e2e (existing): fresh-install smoke. Plugin loads, doctor
    clean, one mock turn produces DB rows with the right harness.
    Catches packaging / install-flow regressions.
  - Host e2e (new):        behavior assertions. Byte-level wire
    diffs, multi-turn cache stability, historian publish behavior,
    tag-owner collision, synthetic todowrite, cross-harness memory,
    subagent isolation, etc. Catches cache-stability and correctness
    regressions the smoke layer cannot see.

Pipeline shape (release.yml):
  unit → docker e2e → host e2e → 3x npm publish → github-release → discord

For CI:
  unit → docker e2e → host e2e

Host jobs gated on Docker e2e — no point exercising deep behavior
if install is broken. Publishes gated on host e2e — a tag that
breaks any of the ~74 host tests will block npm publish.

NODE_ENV is explicitly cleared in the run step so the spawned
opencode subprocess gets normal runtime behavior (project memory:
'For OpenCode e2e subprocesses, unset inherited NODE_ENV').

Pi binary is resolved via createRequire against the
@earendil-works/pi-coding-agent workspace dep, so no separate Pi
install is needed beyond `bun install`.

OpenCode is installed the same way Docker e2e does:
  curl -fsSL https://opencode.ai/install | bash
I
ismeth committed
6c961c217ce0b059e3422bd7fb4a9354f753e3c8
Parent: 85ded9b