
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
A CLI tool to automate your development workflows using named flows. Simplifies task automation with readable config and plugin support.
Automate your workflows in a flash
Jido is a CLI tool for running named workflows, called flows, automating sequences of tasks and improving the developer experience without needing to memorize a bunch of commands or wiring up Makefiles.
Define your flows in a config file jido.config.js in the root directory of your project, and run a specific flow with:
jido flow <flowname>
It's like npm run but cooler.
You can install jido globally or locally.
npm install -g jido
npm install --save-dev jido
Then, you're good to go!
Run this to initialize a config:
npx jido init
It creates a basic jido.config.js in your project root.
import { jido } from "jido";
/*
* Define your workflows here.
* Each flow is a series of steps with commands to run and optional hooks (onStart, onSuccess, etc) to execute.
*/
const config = {
flows: [
{
name: "run",
description: "Run the project",
steps: [
{
run: "npm install",
onStart: () => console.log("Installing dependencies..."),
onSuccess: () => console.log("Dependencies installed!")
},
{
run: "npm run dev",
onStart: () => console.log("Starting dev server...")
}
]
}
]
}
export default jido(config);
jido flow [flowname]Runs the named flow as defined in your config:
npx jido flow build
-d, --dry-run: Preview what the flow would do without actually executing it.npx jido flow build --dry-run
jido listLists all available flows defined in jido.config.js:
npx jido list
jido initScaffolds a basic jido.config.js in your project root:
npx jido init
-f, --force: Overwrite existing jido.config.js files, if any.npx jido init --force
The jido() function takes an object (the config) as argument, which should be defined as follows:
export default jido({
flows: [
{
name: string, // Name of the flow
description?: string, // Description, what the flow does
steps: [
{
run: string, // Command to be run, eg. 'npm run dev'
// Optional hooks
onStart?: Hook,
onSuccess?: Hook,
onFailure?: Hook,
// Plugins
plugins: [
{
// Optional hooks received through plugins
onStart?: Hook,
onSuccess?: Hook,
onFailure?: Hook,
}
],
}
]
}
]
});
Commands are run sequentially. If any command fails, the flow stops immediately.
Jido supports lightweight plugins at the step level, allowing you to inject custom behavior during onStart, onSuccess, and/or onFailure.
A plugin should be a function that returns an object of the type Plugin:
type Plugin = {
onStart?: Hook;
onSuccess?: Hook;
onFailure?: Hook;
};
Create a file (eg. myPlugin.js):
export const myPlugin = () => ({
onStart: () => {
console.log("Plugin: Flow step is starting...");
},
onSuccess: () => {
console.log("Plugin: Step completed successfully!");
}
});
This plugin exports a function that returns an object containing hooks.
Use it in your jido.config.js as follows:
import { myPlugin } from "./myPlugin.js";
export default jido({
flows: [
{
name: "example",
steps: [
{
run: "echo hello",
onStart: () => console.log("Echo step started..."),
plugins: [myPlugin()]
}
]
}
]
});
You can also pass a plugin directly as an object:
// Plugin
const myPlugin = {
onStart: () => {
console.log("Plugin: Flow step started...");
},
onSuccess: () => {
console.log("Plugin: Step completed successfully!");
}
};
// jido.config.js
plugins: [myPlugin] // Directly passes the object, unlike previous example where a function was called to return the object
This works fine, but using functions that return plugin objects is recommended — especially when your plugin logic needs configuration or arguments.
Plugins can be dynamic:
// Plugin
const myPlugin = (name) => ({
onStart: () => {
console.log(`Hello, ${name}! Starting the flow step...`);
}
});
// jido.config.js
plugins: [myPlugin("Bob")] // Dynamic plugins, hooks dependent on arguments
This pattern keeps your plugins composable, configurable, and scalable.
You can enable better IntelliSense by adding this at the top of your plugin file:
/** @type {import("jido-kit/types").Plugin} */
You can simulate a flow with:
npx jido flow build --dry-run
This prints the commands without executing them. Helpful for debugging.
deploy: Run build scripts and deploy using CLI tools.validate: Combine linting, testing, type checking tools into one command.reset: Clear caches, reinstall steps, reset DB, etc.You are free to define any set of shell commands that makes sense for your workflow.
Yes! It's a JS file, not JSON, so you can use variables, imports, etc.
Not currently. However, you can use types from jido-kit to make custom plugins and build them into JS functions to be used as plugins in your jido config.
jido-kit)Install jido-kit for full IntelliSense in VS Code:
npm install --save-dev jido-kit
Then, in your config:
/** @type {import("jido-kit/types").Config} */
export default jido({
...
});
✅ Clean alternative to npm run clutter ✅ Centralizes all your workflows ✅ Dry-run support for safety ✅ Lightweight and dependency-free core ✅ Config in JS — not YAML or JSON
MIT
FAQs
A CLI tool to automate your development workflows using named flows. Simplifies task automation with readable config and plugin support.
We found that jido demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.