npm package: @kvnlnt/spawn
Description: The CLI for CLIs
Author: @kvnlnt
Latest version: 1.0.4

<a href="https://badge.fury.io/js/%40kvnlnt%2Fspawn"><img src="https://badge.fury.io/js/%40kvnlnt%2Fspawn.svg" alt="npm version" height="18"></a>

# Spawn

## Features

1. Create your own cli
2. Auto generates guide for cli and individual commands
3. Interactive mode (using `-i` flag)
4. Argument defaults

## Install

```shell
npm i @kvnlnt/spawn
```

## Usage

mycli.js

```javascript
// the lib
const cli = require("@kvnlnt/spawn");

// add a command, add an argument, a callback and an example
cli
  .command("hello", "Prints hello")
  .argument("output", "o", "Hello to")
  .callback(resp => console.log("Hello,", resp.output))
  .example("hello -o=World", "Prints; Hello World");

// add another
cli
  .command("goodbye", "Prints goodbye")
  .argument("output", "o", "Goodbye to")
  .callback(resp => console.log("Goodbye,", resp.output))
  .example("goodbye -o=World", "Prints: Goodbye World");

// set the default command
cli.defaultCommand("help");

// run the cli
cli.run();
```

Now set up your tool to be a cli with [npm link](https://docs.npmjs.com/cli/link) and you'll get something like this

```shell
mycli hello -o=You
# result => Hello You
```

## Methods

All methods are meant to be chained. This is to support a clean api. To keep things organized it's recommended that you keep your callbacks as external scripts. It keep my in a `tasks` folder.

### command(name, desc)

Adds a command

| Arg  | Type   | Desc                   |
| ---- | ------ | ---------------------- |
| name | string | name of command        |
| desc | string | description of command |

### argument(name, abbr, desc, def)

Adds an argument to last added command

| Arg  | Type     | Desc                      |
| ---- | -------- | ------------------------- |
| name | string   | name of argument          |
| abbr | string   | abbreviated argument name |
| desc | string   | description of argument   |
| def  | anything | default value             |

### callback(f)

Adds callback to last added command

| Arg | Type     | Desc                                     |
| --- | -------- | ---------------------------------------- |
| f   | function | function called when command is executed |

### example(cmd, desc)

Adds example to last added command

| Arg  | Type   | Desc            |
| ---- | ------ | --------------- |
| cmd  | string | example command |
| desc | string | description     |

### defaultCommand(cmd)

Sets default command

| Arg | Type   | Desc            |
| --- | ------ | --------------- |
| cmd | string | name of command |

### run()

Runs the cli

### printGuide()

This is the auto generated guide. To use it, assign it as a callback. Something like this:

```js
cli.command("guide", "Prints guide").callback(cli.printGuide);
```

### printCommandGuide()

This is the autogenerated guide for a command. Commands are bound to the cli instance and therefore are available inside the callback as `this.printCommandGuide`. Just pass in the string name of the command. Here's an example:

```js
// your callback
function myCallback(resp) {
  if (resp.help === true) return this.printCommandGuide("myCallback");
  console.log(resp.output);
}

// your cli
cli
  .command("myCallback", "does stuff")
  .argument("help", "h", "Output help", false)
  .callback(myCallback);
```

The following will output the command's guide:

```shell
mycli myCallback -h
```

## Flags

### -i, Interactive Mode

You can pass the `-i` flag without a command and use your tool interactively, like this:

```shell
mycli -i
```

## Examples

All examples are in the [Examples](examples) folder.