lvlup
Version:
A simple version manager solution for packages
182 lines (112 loc) • 6.59 kB
Markdown
# lvlup 🎩
<p align="center">
<img src="https://i.ibb.co/3dqjJfw/lvlup-v1.png" width="250" alt="lvlup logo" />
</p>
A CLI tool to help you manage your package versions easily.
<p align="center">
<img src="https://i.ibb.co/3y3tYQP/lvlup-help.png" width="1280" alt="lvlup help" />
</p>
## 1. Getting Started
### Step 1: Install the package
First install the package by running:
```bash
npm install lvlup
```
### Step 2: Run the init command
When it's your first time using the CLI, you need to run the `init` command.
At the root of your project, run:
```bash
npx lvlup init
```
You are now ready to use the CLI tool 🙂
### Step 3: Add your first experience
Run the following:
```bash
npx lvlup add
```
and follow the prompts.
---
## 2. Core Concepts
### `lvlup`
As the name of the package suggests, **LvLup** is all about leveling up your package. We took the boring concept of package versioning, and added a small form of gamification to it.
### `Experience`
An `experience` is a contributor's _intent to release_, stored as data within a file.
With `lvlup`, you essentially take a package, add some `experience` to it, and when it's ready - it levels up and bumps to the next level, i.e. the next version number.
Contributors to a repository should be able to declare an _intent to release_, creating `experience` file(s), and multiple `experience`s would then be used to calculate the next level (next version).
`lvlup` makes sure that an `experience` is only used once for the purpose of leveling up a package.
---
## 3. Your new Workflow
Your team just started working on a _to-be-released_ branch called `RELEASE-123` (made-up name).
A contributor branched out of `RELEASE-123`, and checked out to some `side-branch`. When this contributor is done working on a new feature, a bugfix, or a major change oin their `side-branch`, they should run:
```bash
npx lvlup add
```
and answer the prompted questions. An `experience` file is then created, holding the new information as data.
The `experience` file should be committed, and be included in the PR to be merged into branch `RELEASE-123`.
The `lvlup add` command can occur many times either by the same contributor (on the same `side-branch` branch), or by multiple contributors (on different side branches, also to be merged into `RELEASE-123`).
When the maintainer wants to release the package, after all desired PRs to `RELEASE-123` branch had been merged, they should checkout to the `HEAD` of `RELEASE-123`, and run:
```bash
npx lvlup bump
```
followed by the command:
```bash
npx lvlup publish
```
The mentioned commands are explained further down below.
---
## 4. Commands
### 1. `init`
```bash
lvlup init
```
This command sets up the `.lvlup` folder at the root of your project. It generates a `README.md` and a `config.json` file. The config file has to be found within the `.lvlup` dir in order for the tool to work. You should run the _init_ command once, when you are setting up `lvlup`.
### 2. `add`
```
lvlup add [FLAGS]
```
By default this command is **interactive**: it asks for semver bump type (`major` | `minor` | `patch`), then a summary of the changes, then confirmation. You can pass flags to pre-fill answers—any value you omit is still prompted. When **`--level`** is given together with **`--message`** or **`--message-file`**, the command runs **fully non-interactively** (no prompts, confirmation skipped).
Once confirmed, `experience` file be written as a Markdown file that contains the summary and YAML front matter which stores the package's name that will be released and the semver bump types for it.
For example, an `experience` file that minor bumps `axios` would look like this:
```md
---
"axios": minor
---
A description of the minor changes.
```
If you want to modify the `experience` file after it's generated, it's completely fine. You can even write your own `experience` files yourself if you want, just don't forget to commit them.
Inside your `.lvlup/config.json`, if you were to set the `commit.afterAdd` option to `true`, the `add` command will create and also commit the `experience` file.
By default, `add` requires uncommitted git changes (`add.requireGitChanges` defaults to `true`). Set `"requireGitChanges": false` under `add` to allow running `add` on a clean working tree.
- `--skip` — skips the final "are you sure?" confirmation (other prompts still run unless you pass enough flags for a fully non-interactive run).
- `--editor EditorType` — use an external editor for the summary when not using `--message` / `--message-file`. EditorType: `vim` | `vi` | `nano` | `code` (VsCode).
- `-l, --level` — semver bump type. Omit to be prompted.
- `-m, --message` — summary text (CHANGELOG). Cannot be combined with `--message-file`. Omit to be prompted (or use `--editor`).
- `-f, --message-file` — read the summary from a file. Cannot be combined with `--message`. Omit to be prompted.
**Fully non-interactive** (scripts, CI, AI agents): pass **`--level`** and exactly one of **`--message`** or **`--message-file`**.
```bash
lvlup add --level minor --message "Add widget API"
lvlup add -l patch -m "Fix null handling"
lvlup add --level major --message-file ./release-notes.md
```
**Partial flags** (hybrid): e.g. `lvlup add --level minor` prompts only for the summary; `lvlup add -m "Fix typo"` prompts only for semver level.
### 3. `bump`
```bash
lvlup bump
```
Levels up your package.
Updates the version of the package according to all `experience` files found under `.lvlup` since the last release (WHETHER THEY ARE COMMITTED OR NOT ! So make sure they are committed).
Will also create/append to a **CHANGELOG** file using the summaries from the `experience` files.
We recommend making sure changes made from this command are merged back into the main branch before you run `publish`.
This command will **read**, and then **delete**, `experience` files found on disk, ensuring that they are only used once.
### 4. `publish`
```bash
lvlup publish
```
Publishes the package to a dedicated registry. Because this command assumes that last commit is the release commit you should not commit any changes between calling `bump` and `publish`. These commands are separate to enable you to check if release commit is accurate.
### 5. `status`
```bash
lvlup status
```
The status command provides information about all the `experience` files that currently exist in a nice tabular view.
<p align="center">
<img src="https://i.ibb.co/9y8gTDC/lvlup-status.png" width="1280" alt="lvlup status" />
</p>