M2: Dev client CLI for e2e tests, gates and staging smoke (ENG-256) #20

Merged demi.dev
targeting main from stoopkidddd/eng-256-m2-dev-client-cli-for-e2e-tests-gates-and-staging-smoke
Merged opened by and assigned to demi.dev
targeting main from stoopkidddd/eng-256-m2-dev-client-cli-for-e2e-tests-gates-and-staging-smoke

Linear: https://linear.app/engineereddev/issue/ENG-256

What's in this PR:

  • scripts/pneumo-dev.ts + scripts/pneumo-dev/**, run as pnpm dev-client <cmd> (tsx), built only on @pneumo/protocol and @pneumo/crypto: setup, login, pair-uri, claim, send note|link|file, listen, wait-for, download, smoke.
  • Session files are written atomically with mode 600; nothing prints the token or MK except pair-uri's documented URI. Files stream encrypted and decrypted.
  • smoke: setup or login → pair + claim → note → link → 2 MB file byte-equal → delete/push_deleted → revoke/4401, with PASS/FAIL per step.
  • mise run e2e:server now also runs the smoke against the built server + MinIO in direct and proxy modes; check:server also checks, type-checks and tests the dev client.
  • Root package.json: dev-client script.

Verify (lead, rebased on 62b77a1):

  • pnpm install --frozen-lockfile → exit 0
  • mise run check:server → exit 0 (server Tests 229 passed; dev-client Tests 54 passed)
  • mise run e2e:server → exit 0 (Tests 17 passed, including both smoke modes)
  • Implementer's live check against mise run dev: listen printed decrypted note, link and file; wait-for matched (exit 0) and timed out (exit 1); pair-uri printed only the URI.
  • No pneumo-e2e-* containers left.

Deviations:

  • smoke --setup-token uses a documented fixed fake passphrase unless --passphrase is given.
  • mise.toml [env] gains pnpm_config_loglevel = "silent" so pnpm doesn't echo credential-bearing script arguments. This applies to every mise task.

🤖 Generated with Claude Code

Commits 2

M2: Scope dev-client silence and share CI checks (ENG-256)
M2: Add encrypted dev client CLI and smoke gates (ENG-256)