diff --git a/AGENTS.md b/AGENTS.md
index 916bc2f8..fe1610a6 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -59,7 +59,10 @@ covered without editing anything here:
Shared production modules must not access host-specific APIs or detect the
active runtime. Runtime-named entrypoints and adapters install
host-specific behavior — `packages/cli/src/{deno,node,bun,compiled}.ts` are
- the CLI's.
+ the CLI's. `packages/test-support` is the same boundary for tests: it
+ detects the active runtime to drive `@std/testing/bdd`, `node:test`, or
+ `bun:test` from one BDD surface, and is exempt from this rule. The Oxlint
+ rule tracked by issue #156 carries the same path exemption.
## Writing Guide
diff --git a/bun.lock b/bun.lock
index e784738e..459f8ffe 100644
--- a/bun.lock
+++ b/bun.lock
@@ -31,7 +31,7 @@
},
"devDependencies": {
"@durable-streams/server": "^0.3.8",
- "@effectionx/bdd": "workspace:*",
+ "@executablemd/test-support": "workspace:*",
"@types/node": "^22.0.0",
"expect": "^30.0.0",
"oxfmt": "^0.41.0",
@@ -142,9 +142,11 @@
},
},
"packages/test-support": {
- "name": "@effectionx/bdd",
+ "name": "@executablemd/test-support",
"version": "0.0.0",
"dependencies": {
+ "@effectionx/test-adapter": "0.7.4",
+ "effection": "4.1.0-alpha.10",
"expect": "^30.0.0",
},
},
@@ -180,8 +182,6 @@
"@durable-streams/state": ["@durable-streams/state@0.3.1", "", { "dependencies": { "@durable-streams/client": "0.2.6", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { "@tanstack/db": ">=0.6.0 <1.0.0" }, "optionalPeers": ["@tanstack/db"], "bin": { "intent": "bin/intent.js" } }, "sha512-HYhw520Bfl9+L3MJgWpzLQjByP5y/uNNasOqSSFfyWhFxZeaKHM6Go2P79YFfTJPmXh4ZHEh1jOgIfrumqT6hA=="],
- "@effectionx/bdd": ["@effectionx/bdd@workspace:packages/test-support"],
-
"@effectionx/context-api": ["@effectionx/context-api@0.6.0", "", { "dependencies": { "@effectionx/middleware": "0.1.1" }, "peerDependencies": { "effection": "^3 || ^4" } }, "sha512-t004qvlkJDMB6EhHP1lOQ97PeIn90m7cv4+wsRPnx4YBem+pJzTL+Sm1KWbKMjMeFJz4oqllUWuBJZsCi+nuTw=="],
"@effectionx/converge": ["@effectionx/converge@0.1.4", "", { "dependencies": { "@effectionx/timebox": "0.4.3" }, "peerDependencies": { "effection": "^3 || ^4" } }, "sha512-M11KU7jK3gOFGI4RT+Bf6ITMJntzzoGEO2KPx9r8uBoR+Rgwiyeuq+OeIHkuiHLUC+bB1g93KOj7aKR/G0F1/Q=="],
@@ -272,6 +272,8 @@
"@executablemd/test-agent": ["@executablemd/test-agent@workspace:packages/test-agent"],
+ "@executablemd/test-support": ["@executablemd/test-support@workspace:packages/test-support"],
+
"@executablemd/testing": ["@executablemd/testing@workspace:packages/testing"],
"@harperfast/extended-iterable": ["@harperfast/extended-iterable@1.0.3", "", {}, "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw=="],
diff --git a/deno.json b/deno.json
index 1f4d43bb..d420197a 100644
--- a/deno.json
+++ b/deno.json
@@ -6,8 +6,8 @@
"@types/node": "npm:@types/node@^24.5.2",
"@durable-streams/client": "npm:@durable-streams/client@^0.2.2",
"@durable-streams/server": "npm:@durable-streams/server@^0.3.8",
- "@effectionx/bdd/node": "./packages/test-support/bdd.ts",
- "@effectionx/bdd/expect": "./packages/test-support/expect.ts",
+ "@executablemd/test-support/bdd": "./packages/test-support/bdd.ts",
+ "@executablemd/test-support/expect": "./packages/test-support/expect.ts",
"@effectionx/test-adapter": "npm:@effectionx/test-adapter@0.7.4",
"effection": "npm:effection@4.1.0-alpha.10",
"effection/experimental": "npm:effection@4.1.0-alpha.10/experimental",
diff --git a/deno.lock b/deno.lock
index 478696e0..e796e3a4 100644
--- a/deno.lock
+++ b/deno.lock
@@ -3339,6 +3339,8 @@
"packages/test-support": {
"packageJson": {
"dependencies": [
+ "npm:@effectionx/test-adapter@0.7.4",
+ "npm:effection@4.1.0-alpha.10",
"npm:expect@30"
]
}
diff --git a/package.json b/package.json
index 8b9ccb26..3cc17685 100644
--- a/package.json
+++ b/package.json
@@ -50,7 +50,7 @@
},
"devDependencies": {
"@durable-streams/server": "^0.3.8",
- "@effectionx/bdd": "workspace:*",
+ "@executablemd/test-support": "workspace:*",
"oxlint": "^1",
"oxfmt": "^0.41.0",
"tsx": "^4.19.0",
diff --git a/packages/acp/tests/acceptance.test.ts b/packages/acp/tests/acceptance.test.ts
index 10cd3c59..7d37d2eb 100644
--- a/packages/acp/tests/acceptance.test.ts
+++ b/packages/acp/tests/acceptance.test.ts
@@ -3,8 +3,8 @@
* `rootProvider` seam drives the full Agent → session → prompt → teardown
* lifecycle. Fake ACPX runtime, no subprocess.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, scoped } from "effection";
import { ensureDir, rm, writeTextFile } from "@effectionx/fs";
import { randomUUID } from "node:crypto";
diff --git a/packages/acp/tests/permission-bridge.test.ts b/packages/acp/tests/permission-bridge.test.ts
index 672def43..f077cb6d 100644
--- a/packages/acp/tests/permission-bridge.test.ts
+++ b/packages/acp/tests/permission-bridge.test.ts
@@ -5,8 +5,8 @@
* aborts, and unknown option ids. Promise adaptation exists only at
* the simulated ACPX callback boundary.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import {
createScope,
ensure,
diff --git a/packages/acp/tests/provider.test.ts b/packages/acp/tests/provider.test.ts
index 060d1949..f70b5bb8 100644
--- a/packages/acp/tests/provider.test.ts
+++ b/packages/acp/tests/provider.test.ts
@@ -4,8 +4,8 @@
* Drives the provider through its dependencies with a scriptable fake runtime:
* no agent process ever starts.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped, sleep, spawn, until, withResolvers } from "effection";
import type { Operation } from "effection";
import { Agent, Config } from "@executablemd/core";
diff --git a/packages/acp/tests/serial-queue.test.ts b/packages/acp/tests/serial-queue.test.ts
index 8ff32c24..770796a8 100644
--- a/packages/acp/tests/serial-queue.test.ts
+++ b/packages/acp/tests/serial-queue.test.ts
@@ -3,8 +3,8 @@
* FIFO ordering, and that an active holder failing or halting still
* advances the queue for both `slot()` and `withSlot()`.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped, sleep, spawn } from "effection";
import { useSerialQueues } from "../src/serial-queue.ts";
diff --git a/packages/acp/tests/session-key.test.ts b/packages/acp/tests/session-key.test.ts
index 92b62c4f..abee5ab9 100644
--- a/packages/acp/tests/session-key.test.ts
+++ b/packages/acp/tests/session-key.test.ts
@@ -1,8 +1,8 @@
/**
* Tier SK — session identity tests (specs/acp-client-spec.md §Session).
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { API } from "@executablemd/runtime";
import type { Operation } from "effection";
import {
diff --git a/packages/cli/tests/agent-cli.test.ts b/packages/cli/tests/agent-cli.test.ts
index 4757d921..e4443d59 100644
--- a/packages/cli/tests/agent-cli.test.ts
+++ b/packages/cli/tests/agent-cli.test.ts
@@ -8,8 +8,8 @@
* commands — so availability fails fast and the failure text identifies
* which value was selected.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { timebox } from "@effectionx/timebox";
import { ensure, scoped, spawn, each } from "effection";
import type { Operation } from "effection";
diff --git a/packages/cli/tests/agent-config.test.ts b/packages/cli/tests/agent-config.test.ts
index 0a1c12e0..b07ef992 100644
--- a/packages/cli/tests/agent-config.test.ts
+++ b/packages/cli/tests/agent-config.test.ts
@@ -7,8 +7,8 @@
* play. The environment fallback for the default agent is applied by the
* CLI, not here.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import type { PermissionMode } from "@executablemd/core";
import { resolveAgentConfig } from "../src/agent-config.ts";
import type { AgentFlags } from "../src/agent-config.ts";
diff --git a/packages/cli/tests/cli-help.test.ts b/packages/cli/tests/cli-help.test.ts
index 48a0c05b..0def1e41 100644
--- a/packages/cli/tests/cli-help.test.ts
+++ b/packages/cli/tests/cli-help.test.ts
@@ -7,8 +7,8 @@
* never reached a trailing `--help`, so `xmd run --help` exited 1 with
* `path: Invalid input: expected string, received undefined`.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { exec, type Exec } from "@effectionx/process";
import process from "node:process";
import * as path from "node:path";
diff --git a/packages/cli/tests/command.test.ts b/packages/cli/tests/command.test.ts
index 82741a45..48b6cd3f 100644
--- a/packages/cli/tests/command.test.ts
+++ b/packages/cli/tests/command.test.ts
@@ -6,8 +6,8 @@
* per-host argument order lives inside each entrypoint's own middleware and is
* proven by that relaunch succeeding, not by inspecting an array.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure } from "effection";
import { ensureDir, rm } from "@effectionx/fs";
import { exec } from "@effectionx/process";
diff --git a/packages/cli/tests/props-cli.test.ts b/packages/cli/tests/props-cli.test.ts
index 52f06238..ad327bf3 100644
--- a/packages/cli/tests/props-cli.test.ts
+++ b/packages/cli/tests/props-cli.test.ts
@@ -6,8 +6,8 @@
* asserted TTY-independently, and so environment sources are exercised
* the way a user supplies them.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { exec, type Exec } from "@effectionx/process";
import { ensureDir, rm, writeTextFile } from "@effectionx/fs";
import { ensure, scoped } from "effection";
diff --git a/packages/cli/tests/props-schema.test.ts b/packages/cli/tests/props-schema.test.ts
index 8a926307..8a7879a2 100644
--- a/packages/cli/tests/props-schema.test.ts
+++ b/packages/cli/tests/props-schema.test.ts
@@ -6,8 +6,8 @@
* for whole-object validation; these compare the two only where the
* adapter has to agree with it.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { validateProps } from "@executablemd/core";
import type { PropsSchema } from "@executablemd/core";
import { z } from "zod";
diff --git a/packages/cli/tests/props-sources.test.ts b/packages/cli/tests/props-sources.test.ts
index ef094acb..3e01e209 100644
--- a/packages/cli/tests/props-sources.test.ts
+++ b/packages/cli/tests/props-sources.test.ts
@@ -6,8 +6,8 @@
* boundary: it stores whatever a Standard Schema returns, and it selects
* the last valid source rather than the highest-priority supplied one.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { buildBindings, extractPropsArgs, PropsError, resolveProps } from "../src/props.ts";
import type { Binding } from "../src/props.ts";
diff --git a/packages/code-review-agent/tests/parse-diagnostics.test.ts b/packages/code-review-agent/tests/parse-diagnostics.test.ts
index 0e825b3b..1c091ef8 100644
--- a/packages/code-review-agent/tests/parse-diagnostics.test.ts
+++ b/packages/code-review-agent/tests/parse-diagnostics.test.ts
@@ -2,8 +2,8 @@
* Tests for parseDiagnostics — Oxlint JSON output parser.
* Covers PD1-PD8 from the oxlint-sensor-spec.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { parseDiagnostics } from "../src/parse-diagnostics.ts";
import type { DoctorResult, OxlintDiagnostic, PR } from "../src/types.ts";
diff --git a/packages/code-review-agent/tests/parse-diff.test.ts b/packages/code-review-agent/tests/parse-diff.test.ts
index 14df3bf4..634a0a6b 100644
--- a/packages/code-review-agent/tests/parse-diff.test.ts
+++ b/packages/code-review-agent/tests/parse-diff.test.ts
@@ -1,8 +1,8 @@
/**
* Tests for parseDiff — unified diff parser.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { parseDiff } from "../src/parse-diff.ts";
const META = { title: "Test PR", body: "Test body", number: "42" };
diff --git a/packages/code-review-agent/tests/policy.test.ts b/packages/code-review-agent/tests/policy.test.ts
index 5e411021..f8a14c0d 100644
--- a/packages/code-review-agent/tests/policy.test.ts
+++ b/packages/code-review-agent/tests/policy.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import {
buildCleanupAnalysis,
buildPolicyInput,
diff --git a/packages/core/tests/agent-api.test.ts b/packages/core/tests/agent-api.test.ts
index c4b90bee..3c2589ac 100644
--- a/packages/core/tests/agent-api.test.ts
+++ b/packages/core/tests/agent-api.test.ts
@@ -9,8 +9,8 @@
* operations need, so the message must not point at the registry or a CLI
* flag.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { Agent } from "../src/agent/agent-api.ts";
import type { PermissionRequest } from "../src/agent/agent-api.ts";
diff --git a/packages/core/tests/agent-components.test.ts b/packages/core/tests/agent-components.test.ts
index fde642aa..c893e3ee 100644
--- a/packages/core/tests/agent-components.test.ts
+++ b/packages/core/tests/agent-components.test.ts
@@ -7,8 +7,8 @@
* `installAgentComponents`'s `rootProvider` seam — no real provider,
* subprocess, or provider selection.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { ensure, scoped } from "effection";
import type { Operation, Result, Stream } from "effection";
diff --git a/packages/core/tests/agent-stack.test.ts b/packages/core/tests/agent-stack.test.ts
index 4c1114f9..7a6de86d 100644
--- a/packages/core/tests/agent-stack.test.ts
+++ b/packages/core/tests/agent-stack.test.ts
@@ -6,8 +6,8 @@
* provider factories — no subprocess, no real provider. CLI precedence is
* not established here; it is asserted at the CLI boundary.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, scoped } from "effection";
import type { Operation, Result } from "effection";
import { InMemoryStream } from "@executablemd/durable-streams";
diff --git a/packages/core/tests/capture-errors.test.ts b/packages/core/tests/capture-errors.test.ts
index 5efdfbf7..87bce065 100644
--- a/packages/core/tests/capture-errors.test.ts
+++ b/packages/core/tests/capture-errors.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import type { Operation } from "effection";
import { ephemeral } from "@executablemd/durable-streams";
diff --git a/packages/core/tests/cli-journal.test.ts b/packages/core/tests/cli-journal.test.ts
index a9b3f50a..6c44db12 100644
--- a/packages/core/tests/cli-journal.test.ts
+++ b/packages/core/tests/cli-journal.test.ts
@@ -7,8 +7,8 @@
* Each test shells out to `deno run --allow-all packages/cli/src/deno.ts`
* and uses timebox to prevent hangs from blocking the test suite.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { timebox } from "@effectionx/timebox";
import { exists, readTextFile, rm, writeTextFile } from "@effectionx/fs";
import { ensure, spawn, each, type Operation } from "effection";
diff --git a/packages/core/tests/compiler-boundary.test.ts b/packages/core/tests/compiler-boundary.test.ts
index 585094f7..b132f820 100644
--- a/packages/core/tests/compiler-boundary.test.ts
+++ b/packages/core/tests/compiler-boundary.test.ts
@@ -6,8 +6,8 @@
* no compiler, one with eval blocks says so plainly when none is installed,
* and a compiler the caller installed is the one that runs.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import type { Operation } from "effection";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs } from "@executablemd/runtime/test";
diff --git a/packages/core/tests/component-api.test.ts b/packages/core/tests/component-api.test.ts
index 49df2699..819af658 100644
--- a/packages/core/tests/component-api.test.ts
+++ b/packages/core/tests/component-api.test.ts
@@ -2,8 +2,8 @@
* Component Api tests — default operations, missing-provider diagnostics,
* scoped middleware overrides, and nested provider precedence.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import type { Operation } from "effection";
import {
diff --git a/packages/core/tests/component-schema-conformance.test.ts b/packages/core/tests/component-schema-conformance.test.ts
index 334979aa..85dffc14 100644
--- a/packages/core/tests/component-schema-conformance.test.ts
+++ b/packages/core/tests/component-schema-conformance.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import matter from "gray-matter";
import { readTextFile, walk } from "@effectionx/fs";
import { forEach } from "@effectionx/stream-helpers";
diff --git a/packages/core/tests/config-api.test.ts b/packages/core/tests/config-api.test.ts
index a1b0b18b..a1e8c520 100644
--- a/packages/core/tests/config-api.test.ts
+++ b/packages/core/tests/config-api.test.ts
@@ -6,8 +6,8 @@
* no timeout of its own. Imported through @executablemd/core to exercise
* the core re-export.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import { Config, timeout } from "@executablemd/core";
import { exec, fetch } from "@executablemd/runtime";
diff --git a/packages/core/tests/daemon-integration.test.ts b/packages/core/tests/daemon-integration.test.ts
index b27f2308..11747477 100644
--- a/packages/core/tests/daemon-integration.test.ts
+++ b/packages/core/tests/daemon-integration.test.ts
@@ -14,9 +14,9 @@
* - output shape (empty output from daemon blocks)
* - error propagation via component-scoped daemon + children
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { race, sleep } from "effection";
import { InMemoryStream } from "@executablemd/durable-streams";
import { execute } from "../src/execute.ts";
diff --git a/packages/core/tests/daemon.test.ts b/packages/core/tests/daemon.test.ts
index f9550214..c48b03a8 100644
--- a/packages/core/tests/daemon.test.ts
+++ b/packages/core/tests/daemon.test.ts
@@ -4,8 +4,8 @@
* Verifies daemonFactory satisfies ModifierFactory, ignores next,
* and composes correctly in the modifier chain.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import { daemonFactory } from "../src/modifiers/daemon.ts";
import { combine } from "@effectionx/middleware";
diff --git a/packages/core/tests/document-output-api.test.ts b/packages/core/tests/document-output-api.test.ts
index 2b8b65f9..3b02dba7 100644
--- a/packages/core/tests/document-output-api.test.ts
+++ b/packages/core/tests/document-output-api.test.ts
@@ -6,8 +6,8 @@
* scope.around semantics: first-installed runs first (outermost).
* Its next() delegates to the second-installed, and so on to the core.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { createChannel } from "effection";
import { DocumentOutput } from "../src/api.ts";
import { subscribe } from "../src/subscribe.ts";
diff --git a/packages/core/tests/each.test.ts b/packages/core/tests/each.test.ts
index b5e0cc44..dc42b6c5 100644
--- a/packages/core/tests/each.test.ts
+++ b/packages/core/tests/each.test.ts
@@ -1,6 +1,6 @@
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import type { Operation } from "effection";
import { expandSegments } from "../src/expand.ts";
diff --git a/packages/core/tests/eval-bindings.test.ts b/packages/core/tests/eval-bindings.test.ts
index 5a129bdf..b2e96c88 100644
--- a/packages/core/tests/eval-bindings.test.ts
+++ b/packages/core/tests/eval-bindings.test.ts
@@ -4,9 +4,9 @@
* Tests cross-block binding sharing, shadowing, empty blocks,
* undeclared references, and syntax errors.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs, useEchoExec } from "@executablemd/runtime/test";
import { execute } from "../src/execute.ts";
diff --git a/packages/core/tests/eval-context.test.ts b/packages/core/tests/eval-context.test.ts
index 67f724c0..419f1bf3 100644
--- a/packages/core/tests/eval-context.test.ts
+++ b/packages/core/tests/eval-context.test.ts
@@ -13,8 +13,8 @@
* so they install the temp-file one: it is the only implementation that
* loads on all three runtimes.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { compileBlock } from "../src/eval-context.ts";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
diff --git a/packages/core/tests/eval-durable.test.ts b/packages/core/tests/eval-durable.test.ts
index b8e34c09..8a19f9de 100644
--- a/packages/core/tests/eval-durable.test.ts
+++ b/packages/core/tests/eval-durable.test.ts
@@ -6,9 +6,9 @@
*
* Uses InMemoryStream for journaling and API.Fs/API.Process middleware for I/O stubs.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs, useEchoExec } from "@executablemd/runtime/test";
import { execute } from "../src/execute.ts";
diff --git a/packages/core/tests/eval-interpolate.test.ts b/packages/core/tests/eval-interpolate.test.ts
index 8fe92b29..61a5b3b8 100644
--- a/packages/core/tests/eval-interpolate.test.ts
+++ b/packages/core/tests/eval-interpolate.test.ts
@@ -4,8 +4,8 @@
* Verifies that bare `{name}` references in code block content resolve
* from the eval binding environment (env.values).
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { interpolateEvalBindings } from "../src/eval-interpolate.ts";
describe("Tier P — Eval binding interpolation", () => {
diff --git a/packages/core/tests/eval-middleware.test.ts b/packages/core/tests/eval-middleware.test.ts
index 2d3b01ae..b0e8494d 100644
--- a/packages/core/tests/eval-middleware.test.ts
+++ b/packages/core/tests/eval-middleware.test.ts
@@ -4,8 +4,8 @@
* Verifies that evalFactory, persistFactory, and timeoutFactory
* satisfy the ModifierFactory type and compose correctly via combine().
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { evalFactory } from "../src/eval-handler.ts";
import { persistFactory } from "../src/modifiers/persist.ts";
import { timeoutFactory } from "../src/modifiers/timeout.ts";
diff --git a/packages/core/tests/eval-persist.test.ts b/packages/core/tests/eval-persist.test.ts
index bab55337..32056a85 100644
--- a/packages/core/tests/eval-persist.test.ts
+++ b/packages/core/tests/eval-persist.test.ts
@@ -7,9 +7,9 @@
* Note: In v1, persist delegates directly to next() — actual
* resource retention via evalScope.eval() is deferred to v2.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs, useEchoExec } from "@executablemd/runtime/test";
import { execute } from "../src/execute.ts";
diff --git a/packages/core/tests/eval-return.test.ts b/packages/core/tests/eval-return.test.ts
index c44867dc..38af216c 100644
--- a/packages/core/tests/eval-return.test.ts
+++ b/packages/core/tests/eval-return.test.ts
@@ -5,9 +5,9 @@
* that value becomes the block's rendered output. output() takes
* precedence over return. Null/undefined returns produce no output.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs, useEchoExec } from "@executablemd/runtime/test";
import { execute } from "../src/execute.ts";
diff --git a/packages/core/tests/eval-scope.test.ts b/packages/core/tests/eval-scope.test.ts
index fe2417bb..b272c82f 100644
--- a/packages/core/tests/eval-scope.test.ts
+++ b/packages/core/tests/eval-scope.test.ts
@@ -4,9 +4,9 @@
* Tests that eval scopes are properly scoped to components and
* that child/parent scope relationships work correctly.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs, useEchoExec } from "@executablemd/runtime/test";
import { execute } from "../src/execute.ts";
diff --git a/packages/core/tests/eval-timeout.test.ts b/packages/core/tests/eval-timeout.test.ts
index affe6c67..402a4e64 100644
--- a/packages/core/tests/eval-timeout.test.ts
+++ b/packages/core/tests/eval-timeout.test.ts
@@ -3,9 +3,9 @@
*
* Tests timeout behavior and duration parsing.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { parseDuration } from "../src/modifiers/timeout.ts";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs, useEchoExec } from "@executablemd/runtime/test";
diff --git a/packages/core/tests/eval-transform.test.ts b/packages/core/tests/eval-transform.test.ts
index a555e392..becbbd11 100644
--- a/packages/core/tests/eval-transform.test.ts
+++ b/packages/core/tests/eval-transform.test.ts
@@ -7,8 +7,8 @@
* - Source map and sourceURL generation
* - Execution mode detection (generator, async, sync)
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { transformBlock, isJson, serializeExports } from "../src/eval-transform.ts";
describe("Tier T1 — Source transform", () => {
diff --git a/packages/core/tests/execute.test.ts b/packages/core/tests/execute.test.ts
index 3bac269d..f3817d7d 100644
--- a/packages/core/tests/execute.test.ts
+++ b/packages/core/tests/execute.test.ts
@@ -8,8 +8,8 @@
* Golden run — InMemoryStream() (empty) + useStubFs(files) → assert output + journal
* Replay — reuse same InMemoryStream (has events) + useNoIO() → zero I/O
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs, useFailingExec } from "@executablemd/runtime/test";
import { API } from "@executablemd/runtime";
diff --git a/packages/core/tests/expand-element.test.ts b/packages/core/tests/expand-element.test.ts
index 5941378e..1644568b 100644
--- a/packages/core/tests/expand-element.test.ts
+++ b/packages/core/tests/expand-element.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import type { Operation } from "effection";
import { expandSegments } from "../src/expand.ts";
diff --git a/packages/core/tests/expand-segments-operation.test.ts b/packages/core/tests/expand-segments-operation.test.ts
index aaaa70fb..224208c5 100644
--- a/packages/core/tests/expand-segments-operation.test.ts
+++ b/packages/core/tests/expand-segments-operation.test.ts
@@ -7,8 +7,8 @@
* frame it binds to must carry the interpolation inputs, the cycle-detection
* hide set, and the block counter of the expansion that offered the element.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import type { Operation } from "effection";
import { expandSegments } from "../src/expand.ts";
diff --git a/packages/core/tests/expand.test.ts b/packages/core/tests/expand.test.ts
index f60abd0d..5bef4acc 100644
--- a/packages/core/tests/expand.test.ts
+++ b/packages/core/tests/expand.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import { expandSegments } from "../src/expand.ts";
import { Component } from "../src/component-api.ts";
diff --git a/packages/core/tests/expression-props.test.ts b/packages/core/tests/expression-props.test.ts
index cd3591b8..50ff01cd 100644
--- a/packages/core/tests/expression-props.test.ts
+++ b/packages/core/tests/expression-props.test.ts
@@ -5,9 +5,9 @@
* parseExpressionValue changes, and integration with expansion/validation.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { parseExpressionValue, scanSegments } from "../src/scanner.ts";
import { execute } from "../src/execute.ts";
import { collect } from "../src/collect.ts";
diff --git a/packages/core/tests/find-free-port.test.ts b/packages/core/tests/find-free-port.test.ts
index beeec12b..6efd6520 100644
--- a/packages/core/tests/find-free-port.test.ts
+++ b/packages/core/tests/find-free-port.test.ts
@@ -4,8 +4,8 @@
* Verifies findFreePort returns a usable port and that VM sandbox
* globals are accessible — both standalone and inside eval blocks.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { race } from "effection";
import type { Operation } from "effection";
import { once } from "@effectionx/node";
diff --git a/packages/core/tests/frontmatter.test.ts b/packages/core/tests/frontmatter.test.ts
index 7510b47f..9eabe7d9 100644
--- a/packages/core/tests/frontmatter.test.ts
+++ b/packages/core/tests/frontmatter.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { parseFrontmatter } from "../src/frontmatter.ts";
describe("parseFrontmatter", () => {
diff --git a/packages/core/tests/function-components.test.ts b/packages/core/tests/function-components.test.ts
index b78e5e71..ac2af99e 100644
--- a/packages/core/tests/function-components.test.ts
+++ b/packages/core/tests/function-components.test.ts
@@ -4,8 +4,8 @@
* Tests .ts files as components alongside .md files.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { execute } from "../src/execute.ts";
import { collect } from "../src/collect.ts";
import { InMemoryStream } from "@executablemd/durable-streams";
diff --git a/packages/core/tests/heal.test.ts b/packages/core/tests/heal.test.ts
index 002f5676..7bc731f3 100644
--- a/packages/core/tests/heal.test.ts
+++ b/packages/core/tests/heal.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import { healSegment } from "../src/heal.ts";
import { scanSegments } from "../src/scanner.ts";
diff --git a/packages/core/tests/json.test.ts b/packages/core/tests/json.test.ts
index b50828c9..74e76d90 100644
--- a/packages/core/tests/json.test.ts
+++ b/packages/core/tests/json.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { parseJson, parseJsonObject } from "../src/json.ts";
describe("parseJson", () => {
diff --git a/packages/core/tests/named-slots.test.ts b/packages/core/tests/named-slots.test.ts
index c3e0f594..b61686f6 100644
--- a/packages/core/tests/named-slots.test.ts
+++ b/packages/core/tests/named-slots.test.ts
@@ -6,9 +6,9 @@
* boundary scanner confirmation.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import type { Operation } from "effection";
import { partitionBySlot, stripSlotProp } from "../src/expand.ts";
diff --git a/packages/core/tests/output-normalize.test.ts b/packages/core/tests/output-normalize.test.ts
index 3805d2b4..74b8367e 100644
--- a/packages/core/tests/output-normalize.test.ts
+++ b/packages/core/tests/output-normalize.test.ts
@@ -1,8 +1,8 @@
/**
* Tier WN — Whitespace normalization middleware tests (spec §9.4).
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { createChannel, type Operation } from "effection";
import { DocumentOutput } from "../src/api.ts";
import { useNormalizedOutput } from "../src/output/normalize.ts";
diff --git a/packages/core/tests/output-terminal.test.ts b/packages/core/tests/output-terminal.test.ts
index 2374418f..35f17914 100644
--- a/packages/core/tests/output-terminal.test.ts
+++ b/packages/core/tests/output-terminal.test.ts
@@ -6,8 +6,8 @@
* that the middleware transforms markdown (strips syntax, reformats)
* rather than checking for specific ANSI codes.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { createChannel, type Operation } from "effection";
import { DocumentOutput } from "../src/api.ts";
import { useTerminalOutput } from "../src/output/terminal.ts";
diff --git a/packages/core/tests/provider-integration.test.ts b/packages/core/tests/provider-integration.test.ts
index 951ac01a..ba7a0b8e 100644
--- a/packages/core/tests/provider-integration.test.ts
+++ b/packages/core/tests/provider-integration.test.ts
@@ -11,9 +11,9 @@
* 4. expand with server available
* 5. Component scope closes → daemon terminated
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { execute } from "../src/execute.ts";
import { collect } from "../src/collect.ts";
diff --git a/packages/core/tests/replay-stream.test.ts b/packages/core/tests/replay-stream.test.ts
index 2ca001dd..94ca2732 100644
--- a/packages/core/tests/replay-stream.test.ts
+++ b/packages/core/tests/replay-stream.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped, spawn } from "effection";
import type { Operation, Subscription } from "effection";
import { createReplayStream } from "../src/replay-stream.ts";
diff --git a/packages/core/tests/root-props.test.ts b/packages/core/tests/root-props.test.ts
index 0a5fdf25..3b2455c5 100644
--- a/packages/core/tests/root-props.test.ts
+++ b/packages/core/tests/root-props.test.ts
@@ -5,8 +5,8 @@
* validated and defaulted before any body effect, then available through
* `{props.name}`, bare binding interpolation, and eval blocks.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import type { Json } from "@executablemd/durable-streams";
import { useStubFs } from "@executablemd/runtime/test";
diff --git a/packages/core/tests/root-provider.test.ts b/packages/core/tests/root-provider.test.ts
index 9f556ec0..12a37d97 100644
--- a/packages/core/tests/root-provider.test.ts
+++ b/packages/core/tests/root-provider.test.ts
@@ -7,8 +7,8 @@
* fake provider is an Effection resource whose finalizer is driven by scope
* teardown — never a manual teardown call or a Promise.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, scoped } from "effection";
import type { Operation, Result, Stream } from "effection";
import { InMemoryStream } from "@executablemd/durable-streams";
diff --git a/packages/core/tests/sample-component.test.ts b/packages/core/tests/sample-component.test.ts
index c7c4bb18..bd8d3d18 100644
--- a/packages/core/tests/sample-component.test.ts
+++ b/packages/core/tests/sample-component.test.ts
@@ -12,9 +12,9 @@
* Uses stub providers (Sample.around middleware) to intercept Sample Api
* calls and return canned responses for testing.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs, useEchoExec } from "@executablemd/runtime/test";
import { execute } from "../src/execute.ts";
diff --git a/packages/core/tests/scanner.test.ts b/packages/core/tests/scanner.test.ts
index ab452014..4d0cbc99 100644
--- a/packages/core/tests/scanner.test.ts
+++ b/packages/core/tests/scanner.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import assert from "node:assert/strict";
import { scanSegments, parseInfoString } from "../src/scanner.ts";
import type { ComponentElement, ExecutableCodeBlock, TextSegment } from "../src/types.ts";
diff --git a/packages/core/tests/source-position.test.ts b/packages/core/tests/source-position.test.ts
index 84b32c43..9b68a471 100644
--- a/packages/core/tests/source-position.test.ts
+++ b/packages/core/tests/source-position.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { useStubFs } from "@executablemd/runtime/test";
import { scanSegments } from "../src/scanner.ts";
diff --git a/packages/core/tests/streaming-emission.test.ts b/packages/core/tests/streaming-emission.test.ts
index b7e5011b..6e52ff30 100644
--- a/packages/core/tests/streaming-emission.test.ts
+++ b/packages/core/tests/streaming-emission.test.ts
@@ -4,8 +4,8 @@
* Tests per-segment emission through the document stream returned by
* execute, and blockId stability across per-segment expansion calls.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { forEach } from "@effectionx/stream-helpers";
import { createBlockCounter } from "../src/expand.ts";
diff --git a/packages/core/tests/text-interpolation.test.ts b/packages/core/tests/text-interpolation.test.ts
index 26f2d587..f32b0c9c 100644
--- a/packages/core/tests/text-interpolation.test.ts
+++ b/packages/core/tests/text-interpolation.test.ts
@@ -5,8 +5,8 @@
* the eval binding environment (env.values), matching the test plan
* from the text-interpolation spec §9.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import { expandSegments } from "../src/expand.ts";
import { Component } from "../src/component-api.ts";
diff --git a/packages/core/tests/unused-in-diff.test.ts b/packages/core/tests/unused-in-diff.test.ts
index 01209680..7614e585 100644
--- a/packages/core/tests/unused-in-diff.test.ts
+++ b/packages/core/tests/unused-in-diff.test.ts
@@ -1,6 +1,6 @@
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "../src/temp-file-compiler.ts";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { readTextFile } from "@effectionx/fs";
import type { Operation } from "effection";
import { InMemoryStream } from "@executablemd/durable-streams";
diff --git a/packages/core/tests/validate.test.ts b/packages/core/tests/validate.test.ts
index b42d1977..5893fb5f 100644
--- a/packages/core/tests/validate.test.ts
+++ b/packages/core/tests/validate.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import {
compilePropsSchema,
PropsSchemaError,
diff --git a/packages/core/tests/validation-integration.test.ts b/packages/core/tests/validation-integration.test.ts
index 177fc6ea..34f7d145 100644
--- a/packages/core/tests/validation-integration.test.ts
+++ b/packages/core/tests/validation-integration.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import type { Operation } from "effection";
import { InMemoryStream } from "@executablemd/durable-streams";
diff --git a/packages/durable-streams/specs/DECISIONS.md b/packages/durable-streams/specs/DECISIONS.md
index 8edf5139..b768787d 100644
--- a/packages/durable-streams/specs/DECISIONS.md
+++ b/packages/durable-streams/specs/DECISIONS.md
@@ -80,8 +80,9 @@ Updated before completion of every phase and committed at the end of each phase.
- **Rationale:** JSR is the standard for Deno dependencies. Avoids uncached
URL resolution issues.
- **Consequences:** Added to deno.json imports.
-- **Update:** Tests now use the Node.js test runner (`node --test`) with
- `@effectionx/bdd` for describe/it/beforeEach and `expect` for assertions.
+- **Update:** Tests run under Deno, Node, and Bun. `@executablemd/test-support`
+ supplies BDD integration (describe/it/beforeEach) and assertions, binding each
+ runtime's own test runner to a single test surface.
## DEC-005: Sequential workflows only in initial scope
diff --git a/packages/durable-streams/tests/deterministic-id.test.ts b/packages/durable-streams/tests/deterministic-id.test.ts
index 39e50586..99602528 100644
--- a/packages/durable-streams/tests/deterministic-id.test.ts
+++ b/packages/durable-streams/tests/deterministic-id.test.ts
@@ -6,8 +6,8 @@
* and that the structured concurrency combinators produce consistent IDs.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import {
type DurableEvent,
InMemoryStream,
diff --git a/packages/durable-streams/tests/divergence-api.test.ts b/packages/durable-streams/tests/divergence-api.test.ts
index 0b224495..e267355d 100644
--- a/packages/durable-streams/tests/divergence-api.test.ts
+++ b/packages/durable-streams/tests/divergence-api.test.ts
@@ -10,9 +10,9 @@
* middleware via Api.around(), then yield*s into durableRun.
*/
-import { describe, it } from "@effectionx/bdd/node";
+import { describe, it } from "@executablemd/test-support/bdd";
import { call, run, useScope } from "effection";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import {
ContinuePastCloseDivergenceError,
Divergence,
diff --git a/packages/durable-streams/tests/divergence.test.ts b/packages/durable-streams/tests/divergence.test.ts
index c79ca49e..fdff2c45 100644
--- a/packages/durable-streams/tests/divergence.test.ts
+++ b/packages/durable-streams/tests/divergence.test.ts
@@ -6,8 +6,8 @@
* in ways incompatible with the stored journal.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import {
ContinuePastCloseDivergenceError,
DivergenceError,
diff --git a/packages/durable-streams/tests/durable-each.test.ts b/packages/durable-streams/tests/durable-each.test.ts
index 1c595bfd..5a4c3932 100644
--- a/packages/durable-streams/tests/durable-each.test.ts
+++ b/packages/durable-streams/tests/durable-each.test.ts
@@ -8,9 +8,9 @@
* handles break/cancellation, and integrates with durableCall.
*/
-import { describe, it } from "@effectionx/bdd/node";
+import { describe, it } from "@executablemd/test-support/bdd";
import type { Operation } from "effection";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import {
type DurableEvent,
type DurableSource,
diff --git a/packages/durable-streams/tests/durable-run.test.ts b/packages/durable-streams/tests/durable-run.test.ts
index 579066e2..9b3a3608 100644
--- a/packages/durable-streams/tests/durable-run.test.ts
+++ b/packages/durable-streams/tests/durable-run.test.ts
@@ -6,8 +6,8 @@
* stored events, and handles crash recovery scenarios.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import {
type DurableEvent,
InMemoryStream,
diff --git a/packages/durable-streams/tests/ephemeral.test.ts b/packages/durable-streams/tests/ephemeral.test.ts
index 67eb8248..76f0b812 100644
--- a/packages/durable-streams/tests/ephemeral.test.ts
+++ b/packages/durable-streams/tests/ephemeral.test.ts
@@ -10,10 +10,10 @@
* - the type boundary is enforced (bare Operations rejected by combinators)
*/
-import { describe, it } from "@effectionx/bdd/node";
+import { describe, it } from "@executablemd/test-support/bdd";
import { useScope } from "effection";
import type { Operation } from "effection";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import {
type DurableEvent,
InMemoryStream,
diff --git a/packages/durable-streams/tests/replay-guard.test.ts b/packages/durable-streams/tests/replay-guard.test.ts
index ff7b03c7..4863cb2c 100644
--- a/packages/durable-streams/tests/replay-guard.test.ts
+++ b/packages/durable-streams/tests/replay-guard.test.ts
@@ -10,9 +10,9 @@
* description, outputs belong in the result.
*/
-import { describe, it } from "@effectionx/bdd/node";
+import { describe, it } from "@executablemd/test-support/bdd";
import { run } from "effection";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import {
type DurableEvent,
InMemoryStream,
diff --git a/packages/durable-streams/tests/replay-index.test.ts b/packages/durable-streams/tests/replay-index.test.ts
index 48138bac..f9b15dc3 100644
--- a/packages/durable-streams/tests/replay-index.test.ts
+++ b/packages/durable-streams/tests/replay-index.test.ts
@@ -7,8 +7,8 @@
* No Effection dependency — pure data structure.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ReplayIndex } from "../replay-index.ts";
import type { DurableEvent, Json } from "../types.ts";
diff --git a/packages/durable-streams/tests/smoke.test.ts b/packages/durable-streams/tests/smoke.test.ts
index 232c9763..95a8a18d 100644
--- a/packages/durable-streams/tests/smoke.test.ts
+++ b/packages/durable-streams/tests/smoke.test.ts
@@ -2,8 +2,8 @@
* Smoke test to verify project scaffolding works.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream, ReplayIndex } from "../mod.ts";
import type { DurableEvent } from "../mod.ts";
diff --git a/packages/durable-streams/tests/structured-concurrency.test.ts b/packages/durable-streams/tests/structured-concurrency.test.ts
index 748d3aab..52638c24 100644
--- a/packages/durable-streams/tests/structured-concurrency.test.ts
+++ b/packages/durable-streams/tests/structured-concurrency.test.ts
@@ -6,8 +6,8 @@
* scope lifecycles, Close events, cancellation, and replay.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import {
InMemoryStream,
type Json,
diff --git a/packages/durable-streams/tests/types.test.ts b/packages/durable-streams/tests/types.test.ts
index 56a92d5f..af56ec7a 100644
--- a/packages/durable-streams/tests/types.test.ts
+++ b/packages/durable-streams/tests/types.test.ts
@@ -9,9 +9,9 @@
* Tests are runtime no-ops — they only validate at compile time.
*/
-import { describe, it } from "@effectionx/bdd/node";
+import { describe, it } from "@executablemd/test-support/bdd";
import type { Operation } from "effection";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import type { DurableEffect, EffectionResult, Resolve, Workflow } from "../types.ts";
function testDurableEffect(value: T): DurableEffect {
diff --git a/packages/test-agent/tests/acp-server.test.ts b/packages/test-agent/tests/acp-server.test.ts
index d2bd0bb8..37e8beeb 100644
--- a/packages/test-agent/tests/acp-server.test.ts
+++ b/packages/test-agent/tests/acp-server.test.ts
@@ -6,8 +6,8 @@
* handler — the connection closes on input EOF and its scope teardown halts the
* in-flight op, so nothing is stranded.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, race, sleep, spawn, suspend, withResolvers } from "effection";
import type { Operation } from "effection";
import { serveAcp } from "../src/worker/acp-server.ts";
diff --git a/packages/test-agent/tests/behavior-engine.test.ts b/packages/test-agent/tests/behavior-engine.test.ts
index 9e36c0ba..cf1f17ed 100644
--- a/packages/test-agent/tests/behavior-engine.test.ts
+++ b/packages/test-agent/tests/behavior-engine.test.ts
@@ -5,8 +5,8 @@
* Proves stage advancement, capture exposure, mismatch retention, and
* reaching a second stage through EOF.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, spawn } from "effection";
import type { Operation, Subscription } from "effection";
import { ensureDir, rm, writeTextFile } from "@effectionx/fs";
diff --git a/packages/test-agent/tests/bridge.test.ts b/packages/test-agent/tests/bridge.test.ts
index d2721fe0..7d5c5ae5 100644
--- a/packages/test-agent/tests/bridge.test.ts
+++ b/packages/test-agent/tests/bridge.test.ts
@@ -5,8 +5,8 @@
* cancellation safety in both directions and output-before-terminal
* ordering in collectTurn().
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { createChannel, race, sleep, spawn } from "effection";
import { collectTurn, createTurnBridge } from "../src/worker/bridge.ts";
import type { BridgeEvent } from "../src/worker/bridge.ts";
diff --git a/packages/test-agent/tests/command-lazy.test.ts b/packages/test-agent/tests/command-lazy.test.ts
index a26b5e66..9d97612e 100644
--- a/packages/test-agent/tests/command-lazy.test.ts
+++ b/packages/test-agent/tests/command-lazy.test.ts
@@ -5,8 +5,8 @@
* even where no entrypoint installed a command adapter. These suites install a
* deliberately throwing adapter and assert what does and does not reach it.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, scoped } from "effection";
import type { Operation } from "effection";
import { randomUUID } from "node:crypto";
diff --git a/packages/test-agent/tests/components.test.ts b/packages/test-agent/tests/components.test.ts
index 0b4dd8b0..f05133ae 100644
--- a/packages/test-agent/tests/components.test.ts
+++ b/packages/test-agent/tests/components.test.ts
@@ -5,9 +5,9 @@
* clean suspension at teardown — driven through the component surface
* with real workers.
*/
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "@executablemd/core";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, scoped } from "effection";
import type { Operation, Result } from "effection";
import { ensureDir, rm, writeTextFile } from "@effectionx/fs";
diff --git a/packages/test-agent/tests/controller.test.ts b/packages/test-agent/tests/controller.test.ts
index ec2fd442..d9f05952 100644
--- a/packages/test-agent/tests/controller.test.ts
+++ b/packages/test-agent/tests/controller.test.ts
@@ -5,8 +5,8 @@
* failure marks, scenario isolation, connection revocation on unregister,
* and teardown.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, race, scoped, spawn, suspend, until, withResolvers } from "effection";
import type { Operation } from "effection";
import { once } from "@effectionx/node";
diff --git a/packages/test-agent/tests/net.test.ts b/packages/test-agent/tests/net.test.ts
index c3b52745..bcff1c32 100644
--- a/packages/test-agent/tests/net.test.ts
+++ b/packages/test-agent/tests/net.test.ts
@@ -4,8 +4,8 @@
* a line round-trip, abrupt peer closure settling the client, and server
* teardown closing accepted connections and stopping the listener.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { each, ensure, race, scoped, spawn, suspend, withResolvers } from "effection";
import type { Operation } from "effection";
import { once } from "@effectionx/node";
diff --git a/packages/test-agent/tests/profile.test.ts b/packages/test-agent/tests/profile.test.ts
index fd1648f4..16d1456f 100644
--- a/packages/test-agent/tests/profile.test.ts
+++ b/packages/test-agent/tests/profile.test.ts
@@ -8,8 +8,8 @@
* not reachable from behavior-document surface, so each is invoked directly
* in a scope with the profile installed.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import type { Operation } from "effection";
import { compile, cwd, env, exec, fetch, glob, readTextFile, stat } from "@executablemd/runtime";
import { useTempFileCompiler } from "@executablemd/core";
diff --git a/packages/test-agent/tests/protocol.test.ts b/packages/test-agent/tests/protocol.test.ts
index ce01e1c9..21d00e64 100644
--- a/packages/test-agent/tests/protocol.test.ts
+++ b/packages/test-agent/tests/protocol.test.ts
@@ -2,8 +2,8 @@
* Tier TP — controller/worker protocol tests (specs/test-agent-spec.md
* §Controller and worker).
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import {
createLineSplitter,
encodeMessage,
diff --git a/packages/test-agent/tests/provider.test.ts b/packages/test-agent/tests/provider.test.ts
index 807f5ae7..e93a6205 100644
--- a/packages/test-agent/tests/provider.test.ts
+++ b/packages/test-agent/tests/provider.test.ts
@@ -3,8 +3,8 @@
* §Scenario instances): withSessionRoute pins the pending route for the
* provider's registry-dependent work and releases it otherwise.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { sleep, spawn } from "effection";
import type { Operation } from "effection";
import { Agent } from "@executablemd/core";
diff --git a/packages/test-agent/tests/public-api.test.ts b/packages/test-agent/tests/public-api.test.ts
index 1dc6f034..e0d068b5 100644
--- a/packages/test-agent/tests/public-api.test.ts
+++ b/packages/test-agent/tests/public-api.test.ts
@@ -5,8 +5,8 @@
* merely absent from the published types, and the scenario a harness holds is
* still torn down with the scope that acquired it.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, scoped, withResolvers } from "effection";
import type { Operation } from "effection";
import { connect } from "node:net";
diff --git a/packages/test-agent/tests/route-slot.test.ts b/packages/test-agent/tests/route-slot.test.ts
index 38f77a4f..2b1681bd 100644
--- a/packages/test-agent/tests/route-slot.test.ts
+++ b/packages/test-agent/tests/route-slot.test.ts
@@ -3,8 +3,8 @@
* slot is exclusive and granted in arrival order, and a holder that fails or
* halts still advances the queue rather than stranding the route.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { sleep, spawn } from "effection";
import { useRouteSlot } from "../src/route-slot.ts";
diff --git a/packages/test-agent/tests/smoke.test.ts b/packages/test-agent/tests/smoke.test.ts
index dec13791..484d5514 100644
--- a/packages/test-agent/tests/smoke.test.ts
+++ b/packages/test-agent/tests/smoke.test.ts
@@ -5,8 +5,8 @@
* in process to replay a completed journal — the CLI never loads an
* existing journal, so replay cannot be exercised through it.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { each, scoped, spawn } from "effection";
import type { Operation, Result } from "effection";
import { timebox } from "@effectionx/timebox";
diff --git a/packages/test-agent/tests/template.test.ts b/packages/test-agent/tests/template.test.ts
index 647472cf..a48b7d6d 100644
--- a/packages/test-agent/tests/template.test.ts
+++ b/packages/test-agent/tests/template.test.ts
@@ -2,8 +2,8 @@
* Tier TT — WhenPrompt template tests (specs/test-agent-spec.md
* §WhenPrompt templates).
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { matchPrompt, parseTemplate } from "../src/template.ts";
import type { ParsedTemplate } from "../src/template.ts";
diff --git a/packages/test-agent/tests/worker-lifecycle.test.ts b/packages/test-agent/tests/worker-lifecycle.test.ts
index b6e060fb..102be93a 100644
--- a/packages/test-agent/tests/worker-lifecycle.test.ts
+++ b/packages/test-agent/tests/worker-lifecycle.test.ts
@@ -5,8 +5,8 @@
* rendered text, mismatch diagnostics, and restart-between-turns with
* session/load rehydration.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { createSignal, each, ensure, scoped, sleep, spawn, until, withResolvers } from "effection";
import type { Operation, WithResolvers } from "effection";
import { ensureDir, rm, writeTextFile } from "@effectionx/fs";
diff --git a/packages/test-support/package.json b/packages/test-support/package.json
index de055d3a..8c7f8d9c 100644
--- a/packages/test-support/package.json
+++ b/packages/test-support/package.json
@@ -1,13 +1,15 @@
{
- "name": "@effectionx/bdd",
+ "name": "@executablemd/test-support",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
- "./node": "./bdd.ts",
+ "./bdd": "./bdd.ts",
"./expect": "./expect.ts"
},
"dependencies": {
+ "@effectionx/test-adapter": "0.7.4",
+ "effection": "4.1.0-alpha.10",
"expect": "^30.0.0"
}
}
diff --git a/packages/testing/tests/agent-composition.test.ts b/packages/testing/tests/agent-composition.test.ts
index 0ade2e06..a61edfcf 100644
--- a/packages/testing/tests/agent-composition.test.ts
+++ b/packages/testing/tests/agent-composition.test.ts
@@ -5,8 +5,8 @@
* outside a passing must still surface as the agent aggregate.
* Lives in the testing package because core cannot depend on testing.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import { ensure } from "effection";
import type { Result, Stream } from "effection";
diff --git a/packages/testing/tests/assert-throws.test.ts b/packages/testing/tests/assert-throws.test.ts
index 8c9420ad..48d8ed49 100644
--- a/packages/testing/tests/assert-throws.test.ts
+++ b/packages/testing/tests/assert-throws.test.ts
@@ -1,6 +1,6 @@
-import { describe, it } from "@effectionx/bdd/node";
+import { describe, it } from "@executablemd/test-support/bdd";
import { scoped } from "effection";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { AssertionError } from "node:assert/strict";
import { Component } from "@executablemd/core";
import type { ComponentElement } from "@executablemd/core";
diff --git a/packages/testing/tests/assert.test.ts b/packages/testing/tests/assert.test.ts
index dcf8ae33..0aad08bd 100644
--- a/packages/testing/tests/assert.test.ts
+++ b/packages/testing/tests/assert.test.ts
@@ -7,8 +7,8 @@
* resolve a workspace package's subpath export in CI, where `bun install` runs
* without pnpm's node_modules links.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { AssertionError as NodeAssertionError } from "node:assert/strict";
import {
assert,
diff --git a/packages/testing/tests/assertions.test.ts b/packages/testing/tests/assertions.test.ts
index a7c9a5de..cb6f9826 100644
--- a/packages/testing/tests/assertions.test.ts
+++ b/packages/testing/tests/assertions.test.ts
@@ -1,6 +1,6 @@
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "@executablemd/core";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { AssertionError } from "node:assert/strict";
import { TestFailureError } from "../src/test-api.ts";
import { failureOf, runDoc } from "./helpers.ts";
diff --git a/packages/testing/tests/cli.test.ts b/packages/testing/tests/cli.test.ts
index c307f49c..6a2c6386 100644
--- a/packages/testing/tests/cli.test.ts
+++ b/packages/testing/tests/cli.test.ts
@@ -4,8 +4,8 @@
* Shells out to `deno run --allow-all packages/cli/src/deno.ts` with piped stdio, so
* exit codes and report output are asserted TTY-independently.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { timebox } from "@effectionx/timebox";
import { spawn, each } from "effection";
import type { Operation } from "effection";
diff --git a/packages/testing/tests/replay.test.ts b/packages/testing/tests/replay.test.ts
index c25e9663..2d341a70 100644
--- a/packages/testing/tests/replay.test.ts
+++ b/packages/testing/tests/replay.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { InMemoryStream } from "@executablemd/durable-streams";
import type { DurableEvent } from "@executablemd/durable-streams";
import { API } from "@executablemd/runtime";
diff --git a/packages/testing/tests/smoke.test.ts b/packages/testing/tests/smoke.test.ts
index 9752352a..175264fa 100644
--- a/packages/testing/tests/smoke.test.ts
+++ b/packages/testing/tests/smoke.test.ts
@@ -1,6 +1,6 @@
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "@executablemd/core";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
import type { Operation, Result } from "effection";
import { InMemoryStream } from "@executablemd/durable-streams";
diff --git a/packages/testing/tests/testing-mode.test.ts b/packages/testing/tests/testing-mode.test.ts
index 9e2834a2..22af93d2 100644
--- a/packages/testing/tests/testing-mode.test.ts
+++ b/packages/testing/tests/testing-mode.test.ts
@@ -1,6 +1,6 @@
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "@executablemd/core";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { sleep } from "effection";
import { API } from "@executablemd/runtime";
import { useFailingExec } from "@executablemd/runtime/test";
diff --git a/packages/testing/tests/use-testing.test.ts b/packages/testing/tests/use-testing.test.ts
index baebd751..5376db34 100644
--- a/packages/testing/tests/use-testing.test.ts
+++ b/packages/testing/tests/use-testing.test.ts
@@ -1,6 +1,6 @@
-import { describe, it, beforeAll } from "@effectionx/bdd/node";
+import { describe, it, beforeAll } from "@executablemd/test-support/bdd";
import { useTempFileCompiler } from "@executablemd/core";
-import { expect } from "@effectionx/bdd/expect";
+import { expect } from "@executablemd/test-support/expect";
import { scoped, sleep, spawn } from "effection";
import type { Operation, Subscription } from "effection";
import { InMemoryStream } from "@executablemd/durable-streams";
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1251a803..888d7b3f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -84,7 +84,7 @@ importers:
'@durable-streams/server':
specifier: ^0.3.8
version: 0.3.8
- '@effectionx/bdd':
+ '@executablemd/test-support':
specifier: workspace:*
version: link:packages/test-support
'@types/node':
@@ -302,6 +302,12 @@ importers:
packages/test-support:
dependencies:
+ '@effectionx/test-adapter':
+ specifier: 0.7.4
+ version: 0.7.4(effection@4.1.0-alpha.10)
+ effection:
+ specifier: 4.1.0-alpha.10
+ version: 4.1.0-alpha.10
expect:
specifier: ^30.0.0
version: 30.3.0
diff --git a/scripts/tests/build-npm.test.ts b/scripts/tests/build-npm.test.ts
index fa46f9b6..3f2aaf3b 100644
--- a/scripts/tests/build-npm.test.ts
+++ b/scripts/tests/build-npm.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure } from "effection";
import type { Operation } from "effection";
import { exec, Stdio } from "@effectionx/process";
diff --git a/scripts/tests/bump-version.test.ts b/scripts/tests/bump-version.test.ts
index d94a410d..ea352c5a 100644
--- a/scripts/tests/bump-version.test.ts
+++ b/scripts/tests/bump-version.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure } from "effection";
import type { Operation } from "effection";
import { ensureDir, readTextFile, rm, writeTextFile } from "@effectionx/fs";
diff --git a/scripts/tests/cli-npm-bin.test.ts b/scripts/tests/cli-npm-bin.test.ts
index 11269ee6..f08374d3 100644
--- a/scripts/tests/cli-npm-bin.test.ts
+++ b/scripts/tests/cli-npm-bin.test.ts
@@ -12,8 +12,8 @@
* API, then red for a reason the branch cannot fix. This is also the only
* coverage of the local-sibling build mode.
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure } from "effection";
import type { Operation } from "effection";
import { exec, Stdio } from "@effectionx/process";
diff --git a/scripts/tests/fixtures/aliased-import.ts b/scripts/tests/fixtures/aliased-import.ts
index 91678b00..3880ed87 100644
--- a/scripts/tests/fixtures/aliased-import.ts
+++ b/scripts/tests/fixtures/aliased-import.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped as inScope } from "effection";
describe("aliased import", () => {
diff --git a/scripts/tests/fixtures/doubled.ts b/scripts/tests/fixtures/doubled.ts
index 0bd58b87..90cd8324 100644
--- a/scripts/tests/fixtures/doubled.ts
+++ b/scripts/tests/fixtures/doubled.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped } from "effection";
describe("doubled wrappers", () => {
diff --git a/scripts/tests/fixtures/local-scoped.ts b/scripts/tests/fixtures/local-scoped.ts
index c81f25e9..87babf7a 100644
--- a/scripts/tests/fixtures/local-scoped.ts
+++ b/scripts/tests/fixtures/local-scoped.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import type { Operation } from "effection";
function* scoped(body: () => Operation): Operation {
diff --git a/scripts/tests/fixtures/partial-scope.ts b/scripts/tests/fixtures/partial-scope.ts
index bbe5d103..623fa2ad 100644
--- a/scripts/tests/fixtures/partial-scope.ts
+++ b/scripts/tests/fixtures/partial-scope.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure, scoped, spawn } from "effection";
import type { Operation } from "effection";
diff --git a/scripts/tests/fixtures/whole-body.ts b/scripts/tests/fixtures/whole-body.ts
index 5035b775..3f29b2c4 100644
--- a/scripts/tests/fixtures/whole-body.ts
+++ b/scripts/tests/fixtures/whole-body.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { scoped, sleep } from "effection";
describe("whole-body wrappers", () => {
diff --git a/scripts/tests/no-redundant-test-scope.test.ts b/scripts/tests/no-redundant-test-scope.test.ts
index 70bafbe1..022ecb12 100644
--- a/scripts/tests/no-redundant-test-scope.test.ts
+++ b/scripts/tests/no-redundant-test-scope.test.ts
@@ -1,8 +1,8 @@
/**
* Rule tests for `local/no-redundant-test-scope` (scripts/oxlint-rules).
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import type { Operation } from "effection";
import fs from "node:fs";
import os from "node:os";
diff --git a/scripts/tests/no-yield-in-finally.test.ts b/scripts/tests/no-yield-in-finally.test.ts
index 387d046f..5053289b 100644
--- a/scripts/tests/no-yield-in-finally.test.ts
+++ b/scripts/tests/no-yield-in-finally.test.ts
@@ -1,8 +1,8 @@
/**
* Rule tests for `local/no-yield-in-finally` (scripts/oxlint-rules).
*/
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import type { Operation } from "effection";
import { violations } from "./oxlint.ts";
diff --git a/scripts/tests/workspace.test.ts b/scripts/tests/workspace.test.ts
index a7456b22..c41c641c 100644
--- a/scripts/tests/workspace.test.ts
+++ b/scripts/tests/workspace.test.ts
@@ -1,5 +1,5 @@
-import { describe, it } from "@effectionx/bdd/node";
-import { expect } from "@effectionx/bdd/expect";
+import { describe, it } from "@executablemd/test-support/bdd";
+import { expect } from "@executablemd/test-support/expect";
import { ensure } from "effection";
import type { Operation } from "effection";
import { ensureDir, rm, writeTextFile } from "@effectionx/fs";
diff --git a/specs/executable-mdx-spec.md b/specs/executable-mdx-spec.md
index 73e69afb..0f375236 100644
--- a/specs/executable-mdx-spec.md
+++ b/specs/executable-mdx-spec.md
@@ -1246,7 +1246,7 @@ run but are absent from the diagnostic trace.
| `src/data-uri-compiler.ts` | `useDataUriCompiler()` — data: URI compiler middleware for Deno/Bun; owns `STANDARD_IMPORTS` |
| `src/temp-file-compiler.ts` | `useTempFileCompiler()` — temp-file compiler middleware for Node/Bun; owns `STANDARD_IMPORTS` |
| `src/content-context.ts` | `useContent()` — content slot access for function components |
-| `packages/test-support/bdd.ts` | Deno-native BDD shim — wraps `@std/testing/bdd` with Effection test adapter |
+| `packages/test-support/bdd.ts` | Cross-runtime Effection BDD adapter — drives `@std/testing/bdd`, `node:test`, and `bun:test` |
| `src/eval-handler.ts` | `evalFactory` |
| `src/eval-interpolate.ts` | `interpolateEvalBindings()` — bare `{name}` substitution |
| `src/modifiers/persist.ts` | `persistFactory` |
diff --git a/tsconfig.node.json b/tsconfig.node.json
index 9282a484..b47c6407 100644
--- a/tsconfig.node.json
+++ b/tsconfig.node.json
@@ -18,8 +18,8 @@
"@executablemd/durable-streams": ["./packages/durable-streams/mod.ts"],
"@executablemd/code-review-agent": ["./packages/code-review-agent/mod.ts"],
"@executablemd/testing": ["./packages/testing/mod.ts"],
- "@effectionx/bdd/node": ["./packages/test-support/bdd.ts"],
- "@effectionx/bdd/expect": ["./packages/test-support/expect.ts"]
+ "@executablemd/test-support/bdd": ["./packages/test-support/bdd.ts"],
+ "@executablemd/test-support/expect": ["./packages/test-support/expect.ts"]
}
},
"include": [