jan-cli 0.16.0

YAML-defined CLI trees with progressive help, optional exec aliases, merged extra specs, and SQLite audit logging keyed by git branch
Documentation
# Time triggers

Put a five-field crontab expression (or a list of them) on a script node or its `run` child. Then run `jan cron` from the host crontab (typically every minute) to execute every matching script's `run` leaf.

```yaml
commands:
  scripts:
    commands:
      misc:
        commands:
          morning-note:
            about: Append a daily note
            cron: "30 10 * * *"
            # or: cron: ["30 10 * * *", "0 18 * * *"]
            # or: cron: "@hourly"
            commands:
              run:
                exec:
                  argv: ["bash", "-lc", "echo hi >> ~/cron.txt"]
```

CLI details: [`jan cron`](../cli/cron.md).

## Expression syntax

Five fields: `minute hour day-of-month month day-of-week`.

Supported tokens per field: `*`, `N`, `A,B`, `A-B`, `*/S`, `A-B/S`.

| Field | Range |
|-------|-------|
| minute | 0–59 |
| hour | 0–23 |
| day of month | 1–31 |
| month | 1–12 |
| day of week | 0–7 (0 and 7 are Sunday) |

Month/weekday **names** are not supported — use numbers.

Matching uses **local civil time**. Day-of-month and day-of-week are ANDed (both must match), which is simpler than some Vixie cron implementations.

## Nicknames

| Nickname | Expands to |
|----------|------------|
| `@yearly` / `@annually` | `0 0 1 1 *` |
| `@monthly` | `0 0 1 * *` |
| `@weekly` | `0 0 * * 0` |
| `@daily` / `@midnight` | `0 0 * * *` |
| `@hourly` | `0 * * * *` |

Typical host crontab entry:

```cron
* * * * * jan cron
```