projectctl 1.0.0

CLI tool to manage project
![ci](https://github.com/leroyguillaume/projectctl/actions/workflows/ci.yml/badge.svg)

# projectctl

CLI tool to manage project.

## Getting started

- Install from binary

```bash
VERSION=1.0.0

# Linux x64
curl -Lfo /usr/local/bin/projectctl https://github.com/leroyguillaume/projectctl/releases/download/v$VERSION/projectctl-$VERSION-linux-x64
# Linux aarch64
curl -Lfo /usr/local/bin/projectctl https://github.com/leroyguillaume/projectctl/releases/download/v$VERSION/projectctl-$VERSION-linux-aarch64
# MacOS x64
curl -Lfo /usr/local/bin/projectctl https://github.com/leroyguillaume/projectctl/releases/download/v$VERSION/projectctl-$VERSION-macos-x64
# MacOS ARM
curl -Lfo /usr/local/bin/projectctl https://github.com/leroyguillaume/projectctl/releases/download/v$VERSION/projectctl-$VERSION-macos-aarch64

sudo chmod +x /usr/local/bin/projectctl

# Allow projectctl to source environment variables automatically when you're entering into a directory present in ~/.projectctl/allowed-dirs
# If you're using bash
echo 'eval "$(projectctl hook bash)"' >> ~/.bashrc
source ~/.bashrc
# If you're using zsh
echo 'eval "$(projectctl hook zsh)"' >> ~/.zshrc
source ~/.zshrc
```

- Install from cargo
```bash
cargo install projectctl

# Allow projectctl to source environment variables automatically when you're entering into a directory present in ~/.projectctl/allowed-dirs
# If you're using bash
echo 'eval "$(projectctl hook bash)"' >> ~/.bashrc
source ~/.bashrc
# If you're using zsh
echo 'eval "$(projectctl hook zsh)"' >> ~/.zshrc
source ~/.zshrc
```

- Install from source
```bash
git clone https://github.com/leroyguillaume/projectctl
cargo install --path projectctl

# Allow projectctl to source environment variables automatically when you're entering into a directory present in ~/.projectctl/allowed-dirs
# If you're using bash
echo 'eval "$(projectctl hook bash)"' >> ~/.bashrc
source ~/.bashrc
# If you're using zsh
echo 'eval "$(projectctl hook zsh)"' >> ~/.zshrc
source ~/.zshrc
```

### Project

To create a new project from a template, you can use `new` subcommand.

By default, [leroyguillaume/projectctl-templates](https://github.com/leroyguillaume/projectctl-templates) is used as templates repository. Each directory matches a template. Feel free to open a pull request to add one if you want! You can override it by using `--git` option.

[Liquid](https://shopify.github.io/liquid/) is using as template engine. Each file with `.liquid` extension will be rendered. You can templatize filenames.

projectctl injects some variables:
- `name` that has for value the project name
- `description` that has for value the project description (can be set with `-d` option, unset by default)
- `env` that contains all environment variables
- `git` that contains default git configuration

You can also define any variable you want but keep in mind that you will have to set it when you run command by adding `--values` option.

Examples:
```bash
projectctl new rs-lib my-project-name
projectctl new --values '{"repository-url":"https://github.com/username/project-name"}' rs-lib my-project-name
```

projectctl automatically updated `~/.projectctl/allowed-dirs`.

When you want to delete a project, you can run the following command to make sure everything is clean-up:
```bash
projectctl destroy my-project-name
```

### Configuration files

When you run `projectctl env`, these configuration files are loaded (from least to most priority):
- `projectctl.yml`
- `projectctl.local.yml`

Note that you can override these locations with option `-c` (or `--config`).

All configuration files must match [this JSON schema](resources/main/config.schema.json).

You can find [here](examples/) some configuration examples.