A framework for building reusable JS tasks.

Usage no npm install needed!

<script type="module">
  import taskEnv from 'https://cdn.skypack.dev/task-env';


Task Env

A framework for building reusable JS tasks.

Feature Built With
Parse CLI arguments mri
Interact with the CLI Inquirer.js
Execute commands commandland
JSON and text store dot-store


npm install --save-dev task-env

Create an executable

touch run
chmod +x run

Write some code

#!/usr/bin/env node

  args: process.argv.slice(2),
  tasks: [
      sayHello: ({ hello }) => {
        console.log(">", hello)

Run your task

./run sayHello --hello=hi
> hi

Package tasks

Export task:

export function sayHello({ hello }) {

Require task:

#!/usr/bin/env node

  args: process.argv.slice(2),
  tasks: [require("./say-hello")],


export async function happy({ ask }) {
  let { happy } = await ask([
      type: "confirm",
      name: "happy",
      message: "Are you happy?",

See the Inquirer.js prompt docs for available options.

Call other tasks

export function sayHello({ tasks }) {
  tasks.say({ text: "hello" })

export function say({ text }) {
  console.log(">", text)

Calling through tasks binds the CLI arguments and helper functions, as if the task were called via CLI.

Execute commands

export async function ls({ run }) {
  await run("ls", ["/"])

See the commandland docs for available options.

JSON and text store

Task env uses dot-store to provide an immutable store with atomic filesystem persistence.

Create a directory with some JSON files:

  "users": {
    "bob": {
      "key": "~/.ssh/bob_rsa"

The stores option allows you to define multiple named stores:

#!/usr/bin/env node

  args: process.argv.slice(2),
  stores: {
    config: {
      pattern: "**/*",
      root: __dirname,
  tasks: [require("./tasks/user")],

Within your task, get and set JSON using dot-style property strings:

export async function user({ config, name, key }) {
  if (key) {
    await config.set(`users.${name}.key`, key)

  console.log(">", config.get(`users.${name}`))

Run via CLI:

./run user --name=bob --key=~/.ssh/id_rsa
> { key: "~/.ssh/id_rsa" }

All options

Option Example Purpose
alias {h: ["help"]} CLI arguments aliases
preSetup [config=>config] Pre-setup functions (before argv parsing)
setup [config=>config] Setup functions
stores {store: {root: __dirname, pattern: "**/*"}} Store configurations
teardown [args=>{}] Teardown functions
tasks [{ task: ({})=>{} }] Task functions