| Name | Last commit date | |
|---|---|---|
| .. | ||
| src | ||
| tests | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| record-flow.mjs | ||
| run.mjs | ||
| serve.mjs | ||
testkit (MCP surface) — MVP
Black-box tests through the MCP surface, on the vendored mcporter fork
(vendor/mcporter, with its headless cookieConsentStrategy). Every run emits a
chat-transcript recording (run.json) — the MCP surface is an agent-in-a-chat,
so that's the natural shape.
Write a test
import { mcpTarget, mcpTest, cookieConsentStrategy } from "./src/testkit.mjs";
// the per-host seam: which MCP server + how to consent (headless, CI-safe)
const selfhost = mcpTarget({
name: "selfhost",
server: "http://localhost:5173/mcp",
consent: cookieConsentStrategy({ appBaseUrl: "http://localhost:5173", email, password }),
});
mcpTest("execute runs code", selfhost, async (mcp) => {
mcp.say("Confirm the sandbox evaluates and returns a value"); // → reasoning turn
const r = await mcp.call("execute", { code: "return 6*7;" }); // → tool turn
mcp.expect(r.text).toBe("42"); // → assert turn
});
Run + watch
node run.mjs # runs tests, writes runs/*.run.json, prints chat
node src/render.mjs runs/X.run.json # render a recording in the terminal
node src/render.mjs runs/X.run.json --html out.html # watchable HTML
node serve.mjs # serve runs/ (index + per-run HTML) on :8901
What a recording is
run.json = a chat transcript (turns: user / assistant·reasoning / tool / assert /
error) + asserts + ok/error/durationMs. The HTML renders it as a chat: task
bubble → reasoning → collapsible tool cards (args + result) → inline asserts. Failures
record too — ok:false with the failing turn in place.
Status / next
- Now: scripted brain (deterministic, no LLM). Proven against dev
/mcp. - Next:
agentTest— LLM brain (real model drives via MCP, reasoning captured verbatim); raw JSON-RPCprotocol[]layer linked to tool turns; MCP-apps asappturns. Productionize to TS + Effect Vitest later (see memory: effect-testing-stack-note). - Self-contained ESM JS under
testkit/(not in the bun workspace) — imports the fork's builtdist. Throwaway-grade until productionized; the proof is real.