One config, typed
Commands are declared in rune.config.ts with variables, template strings and imports. Editor autocomplete comes from the published types.
A script runner for JavaScript and TypeScript monorepos, written in Rust. Commands live in one typed config at the repository root, and every package calls them by name.
pnpm add -D @giancarlosio/runeThe command lives in one file at the repository root. Each package references it by name, and that reference never changes again.
import { defineConfig } from '@giancarlosio/rune'
export default defineConfig({
scripts: {
test: {
command: 'vitest run --coverage --reporter=dot',
description: 'Run unit tests',
},
},
}){
"scripts": {
"test": "rune run test"
}
}
// changing a flag is one edit at the root,
// not one edit per packageCommands are declared in rune.config.ts with variables, template strings and imports. Editor autocomplete comes from the published types.
A package extends a root script and appends its own flags. It cannot replace the command, so a shared script stays shared.
Every script runs through the platform shell with node_modules/.bin on PATH, inherits the terminal, and exits with the child exit code.
Run scripts one after another or side by side, with prefixed output, kill-on-failure and a success policy.
The resolved config is cached by the content of its whole import graph. A cache hit reads one JSON file.
Windows, macOS and Linux on x64 and arm64, installed as optional dependencies with no postinstall step.