Library
ESM-only, dependency-free compiled JavaScript. Node.js 22+ on Linux and macOS.
Typed pipelines for Node.js. Define dependencies, preview execution, and inspect step results.
$ bunx tubeless plan ./examples/typed-import.ts --target normalize-rows --explain Pipeline import: plan (ok=true, dryRun=false, steps=2) - load-rows: run (required by normalize-rows for target normalize-rows) - Normalize Rows [normalize-rows]: run (target normalize-rows)
Import createSteps and definePipeline. Invalid graphs fail at definition.
plan() previews selection. run / runOrThrow execute. The CLI is a Bun
workbench around the same exports.
ESM-only, dependency-free compiled JavaScript. Node.js 22+ on Linux and macOS.
inspect, plan, graph, run, and ui. Bun 1.3.14+. npx tubeless relaunches through Bun.
Pipelines run in your Node.js process. No separate server is required.
Steps declare typed inputs and outputs. Pipeline definitions reject missing dependencies, cycles, and duplicate IDs. Plans, reports, hooks, and CLI selection use the declared step IDs.
import { createSteps, definePipeline, requireOutputs } from "tubeless";
interface ImportOptions {
lines: readonly string[];
}
const step = createSteps<ImportOptions>();
const load = step("load", {
run: (_inputs, context) => context.options.lines,
});
const normalize = step("normalize", {
dependsOn: [load],
run: ({ load: rows }) =>
rows.map((row) => row.trim().toLowerCase()).filter(Boolean),
});
export const ImportPipeline = definePipeline({
id: "import",
steps: [load, normalize],
targets: [normalize],
finalize: requireOutputs([normalize], ({ normalize }) => normalize),
}); plan() lists the steps selected for a target without
executing them. Export the dependency graph as Mermaid with
toMermaid().
flowchart LR
required optional input + failure gate
flowchart LR step0["build-artifact"] step1["validate-artifact"] step2["publish-artifact"] step0 --> step1 step0 --> step2 step1 -. optional input + failure gate .-> step2
run() returns step results, failures, and timings.
The terminal reporter displays progress during execution.
Run history can be stored in SQLite or exported as NDJSON.
The local studio displays recorded runs, step timelines, and nested pipelines from SQLite or NDJSON history.