# Release notes

Per-version changelog for the `@dreamlake/lakeshore` CLI. Pre-1.0, so
minor bumps may include breaking changes — each release flags those
under **Changed**.

> **Note:** Entries below 0.1.16 carry the dates from the original changelog. The
> 0.1.16 and 0.2.0 entries are reconstructed from the release commits and
> are listed without a date rather than with a guessed one.

## 0.2.0

### Added

- **`lakeshore tui`** — an Ink terminal dashboard over Workers /
  Queues / Invocations / Storage, with per-item action hints rendered
  inline and dispatched from the same table. Aliases `dashboard` and
  `top`. See [TUI dashboard](/cli/tui.md).
- **`lakeshore worker start` / `worker once`** — supervise a native
  Python queue worker on the local machine (`python -u -m
  dreamlake.lakeshore.daemon`). Omitted flags are deliberately kept off
  the child argv so the module's own `LAKESHORE_*` env fallbacks stay
  authoritative. Added Bun runtime support to the `bin` shim.
- **`lakeshore dreamlake`** — the DreamLake data-plane group ported
  from the Python CLI: `login` / `logout` / `profile`, `upload` /
  `download` / `list`, `create` / `update` / `delete` for bindrs and
  datasets, `video`, `artifact`, and `vectorize`. It uses its own
  servers and its own credential store under `~/.dreamlake/`.
- **`lakeshore storage`** — S3-compatible storage entries: `add`
  (with `--provision` to create the bucket), `list`, `show`, `update`,
  `remove --purge`, `presign`, and `credentials` (STS). Direct flags
  for the common config fields (`--bucket`, `--region`, `--prefix`,
  `--endpoint`, `--creds`) plus pass-through for anything else.
  `<namespace>/<name>` syntax works in every storage subcommand.
- **`lakeshore code push` / `code list`** — archive the current git
  tree and upload it to a storage entry, deduped by
  `(remote, commit)`. Default storage name is `code-staging`.
- **`lakeshore admin`** — `tokens create` / `list` / `revoke` and
  `namespace create` / `list` / `delete`. Every subcommand requires
  `LAKESHORE_ADMIN_TOKEN`.
- **Compose daemon-group fields** — `setup` (bash snippets),
  `startup` (Python-env script), `python`, and `mounts` in
  `lakeshore.yaml`.

### Changed

- **`host_setup` → `setup`** in the compose daemon-group schema.
- **Mounts are per daemon group** in the compose runConfig, not
  project-level.

### Fixed

- **S3 PUT uploads are buffered**, not streamed — S3 rejects
  `Transfer-Encoding: chunked`.
- **`mounts add --kind` help** now lists all ten kinds the server
  accepts: `nfs`, `samba`, `ftp`, `sftp`, `s3`, `s3fs`,
  `google_drive`, `dropbox`, `bind`, `configmap`.
- Server-side `hint` fields on errors are surfaced in CLI output, and
  the `token create` login hint includes `--namespace`.

## 0.1.16

### Added

- **`lakeshore queues`** — the queue CRUD surface: `add`, `ls`,
  `show`, `patch`, `archive`, `unarchive`, `drain`, `rm`, plus
  `events` (the elasticity controller's audit trail) and `stats`
  (current daemon / utilization / pending signals). `daemon launch
  --queue` and `daemon update --add-queue` / `--remove-queue` plumb
  membership through `Worker.queues`.
- **Compose** — `lakeshore up` / `down` / `ps` / `status` / `logs`,
  reading a `lakeshore.yaml` (`-f` to override). Stateless: desired
  state comes from the file, current state from the control plane on
  every run. See [Compose](/get-started/compose.md).
- **`lakeshore exec --queue <name>`** — skip the daemon picker and let
  the control plane route the command to an eligible queue member.

### Changed

- **Lanes were replaced by queues.** The `lanes` CLI surface is gone;
  `Worker.queues` is the membership field.

### Fixed

- **`daemon update`** resolves a label to a worker id before PATCHing
  queue membership.

## 0.1.15 — 2026-05-22

### Added

- **`lakeshore exec <cmd>`** — top-level shorthand. Pops an
  interactive picker over the daemon list (freshest-first) and runs the
  command on the chosen daemon.
- **Name resolution on `lakeshore daemon exec`** — the `<daemon>` arg
  accepts a worker id, a label (set by `daemon launch --name`), or a
  `machine_id`. ObjectId-shaped strings skip the lookup. Duplicates
  report the candidates and ask for `--id <id>`; `--id` forces
  literal-id mode.
- **`lakeshore daemon install --binary <path>`** — rsyncs a local nymph
  binary to the SSH host instead of downloading a release. Mutually
  exclusive with `--nymph-base-url`. ELF-validated to reject Mach-O.
- **`lakeshore run <script.py>`** — pipes a local Python file to a
  remote `python3 -` over the exec channel. Picker if no `--daemon`.
- **`lakeshore nymph push <file>` / `nymph list`** — uploads a hashed
  nymph binary to the control plane (admin-authed) so debug-fleet
  daemons can OTA without cutting a release.
- **No `--` separator on `exec` / `daemon exec`.**
  `passThroughOptions()` means CLI-side flags go before the daemon
  argument and everything after it is the remote command.

### Changed

- **`POLL_WINDOW_S` 60 → 25** — fits under Heroku's hard 30-second
  router cap (H12). Long-poll cycles now land under the limit.

### Fixed

- **Exec stdin bytes weren't reaching the daemon.** Storage-vs-wire
  mismatch in the control plane (`stdin_b64: string` on the ExecJob row
  vs `stdin: Vec<u8>` on the daemon's `ExecBody`). The transform now
  decodes base64 → bytes at the poll-pop boundary.
- **`daemon exec <label>` 500'd during name lookup.** The control
  plane's `prisma.worker.findUnique({where:{id}})` rejected
  non-ObjectId strings as malformed; CLI-side name resolution
  pre-resolves to the canonical id.

## 0.1.14 — 2026-05-21

### Added

- **`daemon exec <id> <command>`** — run an arbitrary command on a
  daemon with stdin / env / timeout / long-poll. Returns stdout,
  stderr, and the exit code.
- **`daemon launch --count N`** — parallel fleet launches with a
  progress bar; bounded concurrency plus retry on AWS
  `RequestLimitExceeded`.
- **`daemon launch --name <name>`** and `daemon.name` in `.lakeshore`
  for human-friendly labels.
- **`daemon.capacity` in `.lakeshore`** — per-project instance-type
  override that flows through `daemon launch`.
- **`daemon launch-log <id>`** — fetch cloud console output for
  boot-time debugging (EC2 only).
- **`.lakeshore` project config** — a local file declaring
  project-level daemon launch / setup defaults, consumed by
  `daemon launch`. Walks up from cwd and stops at the git root;
  `.lakeshore.local` layers on top.
- **`daemon install`** improvements — runs as the installing user,
  adds the user to the `docker` group, suppresses TTY warnings,
  4-step progress bar.
- **Picker polish** — hashed tag colors for stable visual identity,
  expand-on-`→`, SLURM / Kube / Docker entries visible alongside cloud
  providers.

### Changed

- **`daemon ota` → `daemon update`** — renamed for clarity, with new
  `--all` and `--prefix <pattern>` flags for bulk updates. `ota`
  survives as a **hidden, deprecated alias** that still requires
  `--version`; new scripts should use `daemon update`.
- **`daemon kill`** — terminating the cloud instance is now the
  default (opt out with `--no-terminate`); the `--provider` flag was
  dropped; bulk kill via `--prefix <pattern>` + `--yes`.

## 0.1.13 — 2026-04-18

### Added

- **`--watch` on `daemon list` / `daemon show`** — live refresh in the
  terminal, `Ctrl-C` to exit. The value is optional; bare `--watch`
  means every 2 seconds.

## 0.1.12 — 2026-04-15

### Added

- **`daemon hibernate` / `daemon ota` / `daemon target-version`** —
  remote-control subcommands wired end to end through the control
  plane and the nymph daemon.
- **`--watch`** on daemon and jobs `list` / `show` (initial cut).

## 0.1.10 — 2026-04-01

### Added

- **Mounts CRUD** — `lakeshore mounts add / list / show / update /
  remove` for `nfs`, `samba`, `ftp`, `sftp`, `s3`, `s3fs`,
  `google_drive`, `dropbox`, `bind`, and `configmap`. Server-side
  source of truth; the CLI writes metadata only. See
  [Mounts](/get-started/mounts.md).

### Fixed

- **`daemon install`** re-anchored as a subcommand of `daemon` (it had
  been accidentally chained off `show.action()`).

## 0.1.9 — 2026-03-15

### Added

- **One-command daemon lifecycle** — `lakeshore daemon install
  <ssh-alias>` SSHes to the host, drops the `nymph` binary, registers
  it, and waits for the Worker row. Pair with `daemon kill <id>` and
  `daemon cleanup --older-than <duration>` to prune stale rows. See
  [Daemon lifecycle](/nymph/daemon-lifecycle.md).
- **Interactive provider editor** — `lakeshore providers edit` opens a
  two-step picker (provider → action) for hide / unhide / soft-delete /
  restore. `providers list --hidden --deleted --all` widens the view.
  See [Providers](https://docs.dreamlake.ai/lakeshore/providers#interactive-editor).
- **Cloud-config auto-detect** — `lakeshore aws discover` and
  `lakeshore gcp discover` enumerate profiles already on your laptop;
  `providers add --from-aws-profile <name>` /
  `--from-gcloud-config <name>` seed credentials and region in one
  step. See [EC2 Provider](https://docs.dreamlake.ai/lakeshore/providers/ec2#seeding-from-an-aws-profile) and
  [GCE Provider](https://docs.dreamlake.ai/lakeshore/providers/gce#seeding-from-a-gcloud-configuration).
- **SSH picker** — `lakeshore ssh discover` marks entries with
  local-only directives stripped and aliases already on the server.
  `lakeshore ssh upload` with no alias drops into a multi-select
  grouped into "new" / "existing", dedup'd by SSH fingerprint. See
  [SSH Provider](https://docs.dreamlake.ai/lakeshore/providers/ssh#importing-from-sshconfig).
- **Shell completion** covering the top-level groups, their
  subcommands, flag names, and dynamic values. Install with
  `lakeshore completion bash|zsh|fish`. See
  [Completion](/cli/completion.md).
- **Tunnels** (metadata only) — `lakeshore tunnels add / list / show /
  remove` stores wg-quick configs; `providers update <name> --tunnel
  <tunnel>` attaches one. See [Tunnels](/get-started/tunnels.md).
