API Reference
Full API reference for all exported functions and types
API Reference
Concurrent Process Runner
runConcurrently(commands, options?)
Run commands concurrently with real-time output streaming. Automatically uses native Rust addon when available.
import { runConcurrently } from "@visulima/task-runner";
const result = await runConcurrently(["npm run build", { command: "npm run test", name: "test" }], {
maxProcesses: 4,
killOthers: ["failure"],
onEvent: (event) => console.log(event),
});
// result: { success: boolean, closeEvents: ConcurrentCloseEvent[] }Options:
| Option | Type | Default | Description |
|---|---|---|---|
maxProcesses | number | 0 (unlimited) | Max simultaneous processes |
killOthers | ("failure" | "success")[] | [] | Kill others on condition |
killSignal | string | "SIGTERM" | Signal for killing |
killTimeout | number | 5000 | Ms before SIGKILL |
successCondition | string | "all" | Success evaluation |
shellPath | string | auto-detected | Custom shell path |
restart | { tries, delay } | none | Retry failed commands |
teardown | string[] | none | Cleanup commands |
timings | boolean | false | Print timing table |
onEvent | (event) => void | none | Event callback |
parseCommands(inputs, options?)
Parse command strings through the expansion pipeline: strip quotes, expand shortcuts (npm:build), expand wildcards (npm run watch-*), expand argument placeholders ({1}, {@}, {*}).
import { parseCommands } from "@visulima/task-runner";
const commands = parseCommands(['"npm:build"', "npm run watch-*"], { additionalArguments: ["--verbose"] });detectScriptShell()
Detect the npm script-shell configuration. Checks npm_config_script_shell env var first, then queries npm config get script-shell (cached). Returns string | undefined.
Flow Controllers
withRestart(runFn, commands, options, restartOptions)- Wrap a runner with retry logiccreateInputHandler(commands, options?)- Route stdin to child processes by name/index prefixlogTimings(closeEvents, output?)- Print timing summary table to a streamformatTimingTable(closeEvents)- Generate timing table as a stringrunTeardown(options)- Run cleanup commands sequentially
Command Parsers
stripQuotes(config)- Remove surrounding quotesexpandShortcut(config)- Expandnpm:buildtonpm run buildexpandWildcard(config)- Expandnpm run watch-*against package.json/deno.json scriptsexpandArguments(config, args)- Replace{1},{@},{*}placeholders
Task Runner
defaultTaskRunner(tasks, options, context)
The main entry point. Returns Promise<TaskResults>.
Task Graph
createTaskGraph(tasks, options)
Creates a dependency-ordered task graph from task definitions. options is a CreateTaskGraphOptions object with projectGraph, targetDefaults?, and workspace.
getTaskId(target)
Creates a task ID string from a TaskTarget object ("project:target:configuration").
parseTaskId(id)
Parses a task ID into { project, target, configuration? }.
Graph Utilities
findCycle(graph)- Returns first cycle found, or undefinedfindCycles(graph)- Returns all cyclesmakeAcyclic(graph)- Removes cycle-forming edgeswalkTaskGraph(graph, fn)- Walk in topological ordergetDependentTasks(graph, taskId)- Find all tasks depending on a taskgetTransitiveDependencies(graph, taskId)- Find all transitive depsgetLeafTasks(graph)- Find tasks with no dependenciesreverseTaskGraph(graph)- Reverse edge directions
Hashing
InProcessTaskHasher
Computes task hashes from explicit input declarations.
const hasher = new InProcessTaskHasher({
workspaceRoot,
projects,
namedInputs,
targetDefaults,
envVars,
globalInputs,
globalEnv,
smartLockfileHashing,
frameworkInference,
});
const details = await hasher.hashTask(task);computeTaskHash(hashDetails)
Computes a final SHA-256 hash from TaskHashDetails.
IncrementalFileHasher
mtime-based file hasher that only re-hashes changed files.
const hasher = new IncrementalFileHasher({
workspaceRoot,
snapshotPath: "node_modules/.cache/task-runner/file-snapshot.json", // default
});
const hashes = await hasher.hashDirectory("packages/my-app/src");Cache
Cache
Local file-based cache with LRU eviction.
get(hash)- Retrieve cached resultput(hash, output, outputs, code, fingerprint?)- Store resultrestoreOutputs(hash, outputs)- Restore build artifactsclear()- Clear entire cache
RemoteCache
Turborepo-compatible HTTP cache client.
retrieve(hash, localCacheDirectory)- Download from remotestore(hash, localCacheDirectory)- Upload to remote
Lockfile
LockfileHasher
Smart lockfile parser that hashes per-package dependency versions.
hashForPackage(packageJsonPath)- ReturnsPackageLockfileHash | undefinedlockfileType- Detected format ("npm" | "pnpm" | "yarn" | undefined)
Lockfile Parsers
parseNpmLockfile(content)- Parse package-lock.jsonparsePnpmLockfile(content)- Parse pnpm-lock.yamlparseYarnLockfile(content)- Parse yarn.lock
Framework Inference
detectFrameworks(packageJsonPath)- Returns detected frameworksinferFrameworkEnvPatterns(workspaceRoot, projects)- Returns env patternsgetFrameworkEnvVariables(packageJsonPath, env?)- Returns matching env vars
Affected Detection
getChangedFiles(workspaceRoot, base, head)- Git diff to get changed file pathsgetAffectedProjects(options)- Detect affected projects from git changes (AffectedOptions)filterAffectedTasks(taskIds, affectedProjects)- Filter task IDs by affected project set
Visualization
toGraphvizDot(graph, options?)- DOT formattoGraphJson(graph, options?)- JSON formattoGraphHtml(graph, options?)- Self-contained HTMLtoGraphAscii(graph, options?)- ASCII treeprojectGraphToDot(projectGraph)- Project graph DOT
Run Summary
generateRunSummary(results, taskGraph, startTime)- Create summarywriteRunSummary(summary, workspaceRoot)- Write to disk
Lifecycle
ConsoleLifeCycle- Logs events to consoleEmptyLifeCycle- No-op implementationCompositeLifeCycle- Combines multiple lifecycles
Types
Key interfaces: Task, TaskGraph, TaskResult, TaskRunnerOptions, TaskRunnerContext, ProjectGraph, ProjectConfiguration, TargetConfiguration, TaskHashDetails, InputDefinition, TaskFingerprint, CacheMissReason, RunSummary, DetectedFramework, ConcurrentCommandConfig, ConcurrentCommandInput, ConcurrentRunnerOptions, ConcurrentRunResult, ConcurrentCloseEvent, ProcessEvent.