arrow
Documentation

Introduction

Arrow is a command-line toolkit designed for the speed and composability of modern development. It unifies scaffolding, building, testing, and deployment into a single predictable interface.

Overview

Most CLI tools in the JavaScript ecosystem solve one problem well but compose poorly. Arrow treats the command line as a first-class interface for the entire development lifecycle. Whether you are spinning up a prototype or shipping production infrastructure, Arrow provides a consistent grammar for every operation.

At its core, Arrow is built around three primitives: projects, tasks, and pipelines. A project defines what you are building. Tasks are the operations you run. Pipelines chain tasks together into repeatable workflows.

arrow.config.ts
export default defineConfig({
  project: 'my-app',
  tasks: {
    lint: { command: 'eslint src/' },
    test: { command: 'vitest run' },
    build: { command: 'vite build' },
  },
  pipelines: {
    ci: ['lint', 'test', 'build'],
  },
})

Philosophy

Convention over configuration

Arrow ships with sensible defaults so most projects need zero configuration. When you need to customize, the configuration is minimal and explicit.

Composability

Every task is a standalone unit. Combine, chain, and reuse them across projects without duplicating boilerplate.

Observability

Arrow surfaces timing, cache hits, and dependency graphs so you always know what is happening and why it is taking time.

Core concepts

Project
The root unit of work. A project has a name, a directory, and a set of tasks and pipelines.
Task
A discrete operation like linting, testing, or building. Tasks declare inputs and outputs so Arrow can cache and parallelize them.
Pipeline
An ordered sequence of tasks. Pipelines can depend on other pipelines, forming a directed acyclic graph of work.
Plugin
A package that extends Arrow with new tasks, templates, or configuration schemas. Plugins are versioned and installed from npm.

How it compares

FeatureArrownpm scriptsMake
CachingBuilt-inManualNone
Parallel executionAutomaticNoneLimited
Cross-platformYesShell dependentNo
Plugin ecosystemRichNoneNone