# Loco CLI
Loco CLI is a powerful command-line tool designed to streamline the process of generating Loco websites.
## Installation
To install Loco CLI, execute the following command in your terminal:
```sh
cargo install loco-cli
```
## Usage
### Generating a Website
This command generates a website in your current working directory:
```sh
loco new
```
To generate the website in a different directory, use the following command:
```sh
loco new --path /my-work/websites/
```
## Running Locally
When working with loco-cli against the local Loco repository, you can utilize the `STARTERS_LOCAL_PATH` environment variable to point the generator to a local starter instead of fetching from GitHub.
```sh
cd loco-cli
$ STARTERS_LOCAL_PATH=[FULL_PATH]/loco-rs/loco cargo run new --path /tmp
```
## Starters folder
This CLI depends on a folder with _starters_. Each starter is a folder with a `generator.yaml` in its root.
The `generator.yaml` file describes:
* _Global replacements_: a regex describing things to replace such as a mock app name with a real app name that the user selected.
For example:
```yaml
...
rules:
- pattern: loco_starter_template
kind: LibName
file_patterns:
- rs
- toml
- trycmd
- pattern: PqRwLF2rhHe8J22oBeHy
kind: JwtToken
file_patterns:
- config/test.yaml
- config/development.yaml
```
* _Starter options_: some starters can configure based on multiple options: which database to use, which asset pipeline, which kind of background worker configuration. Each starter _declares_ what kind of options it subscribes into and is relevant for it.
The options are picked up in generation, for each option a selection is made for the user to pick.
For example:
```yaml
---
description: SaaS app (with DB and user auth)
options:
- db
- bg
- assets
rules:
# ...
```
As an example, for the `db` option: `postgres` or `sqlite` is offered as a selection.
The source of truth of _which options_ exist and _which selection for each option_ is based on 2 factors:
1. A set of enums to describe all options (in this project, the CLI)
2. Support of the options and formatting of the configuration: in the main Loco project
Enabling or disabling options are done by:
* Replacing text with a different text (such as configuration value for background worker type)
* Enabling or disabling blocks in the configuration by adding or removing comment blocks, using block markers inside the configuration file (`(block-name-start)`, etc)