diff --git a/README.md b/README.md index 59693d2..7d57a88 100644 --- a/README.md +++ b/README.md @@ -1 +1,179 @@ -# sleepycli \ No newline at end of file +

sleepycli

+ +

+ + +

+ +A small Go CLI for calculating sleep and wake times around 90-minute sleep cycles. + +`sleepycli` helps you answer questions like: +- “If I sleep now, when should I wake up?” +- “If I want to wake up at 07:00, when should I go to bed?” +- “How many full sleep cycles fit between two times?” + +The tool supports four main modes: calculate from **now**, from a target **wake** time, from a target **sleep** time, or across a **window** of time. + +## Features + +- Calculate wake times from the current time +- Calculate bedtimes for a target wake time +- Calculate wake times for a target sleep time +- Calculate full sleep cycles within a sleep window +- Configurable fall-asleep buffer +- Configurable minimum and maximum cycle count +- Input validation for modes, time format, and cycle ranges +- Custom help output +- Bash completion script +- Pull request CI for linting and tests + +## How it works + +The calculator uses a **90-minute sleep cycle** and adds an optional **buffer** to represent the time it takes to fall asleep. + +Defaults: +- Sleep cycle: `90 minutes` +- Buffer: `15 minutes` +- Displayed cycles: `4` to `6` + +## Installation + +### Build from source + +```bash +git clone https://github.com/TyostoKarry/sleepycli.git +cd sleepycli +go build -o sleepycli . +``` + +### Run without installing + +```bash +go run . --help +``` + +## Usage + +```bash +sleepycli [mode] [options] +``` + +Choose exactly **one** mode. + +### Modes + +#### `--now` +Calculate wake times starting from the current time. + +```bash +sleepycli --now +``` + +#### `--wake HH:MM` +Calculate suggested bedtimes for a target wake time. + +```bash +sleepycli --wake 07:00 +``` + +#### `--sleep HH:MM` +Calculate suggested wake times for a target sleep time. + +```bash +sleepycli --sleep 22:30 +``` + +#### `--from HH:MM --to HH:MM` +Calculate how many complete sleep cycles fit inside a time window. + +```bash +sleepycli --from 22:00 --to 07:00 +``` + +### Options examples + +#### Use a custom fall-asleep buffer + +```bash +sleepycli --wake 07:00 --buffer 30 +``` + +#### Show a different cycle range + +```bash +sleepycli --sleep 23:00 --cycles-min 3 --cycles-max 7 +``` + +### Sample output + +#### `--wake 07:00` + +```text +To wake up at 07:00: +─────────────────── +Assuming 15 min to fall asleep + + - 6 cycles, go to sleep at 21:45 (9h 00m) + - 5 cycles, go to sleep at 23:15 (7h 30m) + - 4 cycles, go to sleep at 00:45 (6h 00m) +``` + +#### `--from 22:00 --to 07:00` + +```text +Between 22:00 and 07:00: +─────────────────────── +Assuming 15 min to fall asleep + + - 5 complete cycles (7h 30m) + - 75 minutes remaining +``` + +## Flags + +| Flag | Description | Default | +|---|---|---:| +| `-n, --now` | Calculate wake times from the current time | - | +| `-w, --wake HH:MM` | Calculate bedtimes for a target wake time | - | +| `-s, --sleep HH:MM` | Calculate wake times for a target sleep time | - | +| `-f, --from HH:MM` | Start of sleep window, used with `--to` | - | +| `-t, --to HH:MM` | End of sleep window, used with `--from` | - | +| `-b, --buffer int` | Minutes needed to fall asleep | `15` | +| `-m, --cycles-min int` | Minimum cycles to show | `4` | +| `-x, --cycles-max int` | Maximum cycles to show | `6` | +| `-g, --good-night` | Print random good night ASCII art | - | +| `-v, --version` | Print version | - | +| `-h, --help` | Show help | - | + +## Input rules + +- Time format is 24-hour `HH:MM` +- Short hour values like `7:00` are accepted +- Modes cannot be combined +- `--from` and `--to` must be used together +- `--now`, `--wake` and `--sleep` are mutually exclusive +- `--cycles-min` cannot be greater than `--cycles-max` +- Buffer and cycle values cannot be negative + +## Bash completion + +A completion script is included at: + +```bash +scripts/sleepycli-completion.bash +``` + +To load it in your current shell: + +```bash +source scripts/sleepycli-completion.bash +``` + +To make it persistent, add that line to your shell profile. + +## CI + +The repository includes a pull request workflow that: +- runs `golangci-lint` +- runs `go test ./...` +- triggers on pull requests targeting `main`