Run your exported blueprint JSON through an engine that reproduces Make's execution and failure semantics — offline, no account, no network. Assert behavior in CI before a dropped guard or a typo'd mapper ships.
Filters, routers, iterators, aggregators, IML formulas, error routes — all the
logic of a real program, living in a web UI with no unit tests and no diff. Edit a scenario,
drop a dedup filter or fat-finger a {{...}} mapper, and it ships
silently. You find out when leads get double-pushed or an email goes out blank.
make-testkit gives that logic a test harness.
IML evaluator, filter + Airtable-formula operators, a blueprint interpreter modeling routers/aggregators/iterators and the five error directives, plus a linter and a config-drift contract checker.
Four tools over stdio — eval_iml, simulate_blueprint, lint_blueprint, run_testsuite — for any MCP client.
Slash commands /make-iml, /make-simulate, /make-lint, /make-test wired straight to the server.
# get it
git clone https://github.com/SaharBarak/make-testkit
cd make-testkit && npm install && npm run build
# run the engine + example suites
npm test
Simulate a blueprint, lint it, and pin its behavior:
import { runBlueprint, lintBlueprint, checkContracts } from "@make-testkit/engine";
import { makeState, handlers, contracts } from "./examples/handlers.mjs";
import bp from "./examples/blueprints/lead-sync.json" with { type: "json" };
const ctx = { state: makeState(), handlers };
const res = await runBlueprint(bp, ctx);
res.status; // "success" | "warning" | "error"
ctx.state.pushed; // what the scenario actually did
lintBlueprint(bp); // unresolved refs, duplicate ids, …
checkContracts(bp, contracts); // { ok, results } — config-drift guards
{{...}} expression against a bundle context. Debug a mapper without a run.node --test suite and summarize pass/fail with failing names.# add the marketplace + install
/plugin marketplace add SaharBarak/make-testkit
/plugin install make-testkit@make-testkit
# then, against your blueprints
/make-lint ./scenarios/lead-sync.json ./scenarios/contracts.mjs
/make-simulate ./scenarios/lead-sync.json ./scenarios/handlers.mjs
/make-iml {{lower(trim(1.Email))}}
registerFunction, registerOperator,
and your own module handlers.