Skip to content

caffeinated-whale-cli: v3.2.0

Choose a tag to compare

@github-actions github-actions released this 19 Sep 22:20
· 76 commits to develop since this release

3.2.0 (2026-09-19)

A round of operator-found fixes across nearly every verb, a fix for sites left stuck in maintenance mode by an interrupted migrate, plus a root-host init fallback, scoped credential-bridge wiring, and wrong-copy app-update detection.

Upgrade Steps

  • [ACTION REQUIRED] Update cwcli to v3.2.0.
  • [ACTION REQUIRED] On a shared-mode machine that uses the credential bridge, you can now scope it to specific instances with cwcli config cred-bridge enable --project <name> instead of it wiring every running Frappe container.
  • [ACTION REQUIRED] If a site was left in maintenance mode by an earlier migrate or apps update that was killed or lost its terminal, cwcli status <project> now names it directly; run the command it prints (cwcli run <project> --site <site> set-maintenance-mode off) to clear it.

Breaking Changes

  • cwcli rm <project-that-does-not-exist> now exits 1 with a plain not-found warning, matching rm-site/rm-bench; it previously printed the destructive-deletion banner alongside the error and still exited 0.
  • cwcli rm now refuses when a hand-made bench holds sites the backup step never covered, where it previously deleted that bench with no backup; run cwcli inspect <project> --update then re-run rm, or pass the explicit --no-backup flag.
  • cwcli config cred-bridge enable now wires only cwcli-managed instances by default, and refuses (rather than silently skipping) an explicitly named --project that is not cwcli-managed.
  • The human cwcli status web line now prints the reachable host address instead of the container-internal port.
  • A broken pipe (for example cwcli ... | head) now exits quietly by signal instead of returning exit 1.

New Features

  • cwcli init --uid <n> overrides the uid cwcli aligns the container's frappe user to, and init on a root (uid 0) host no longer fails: it now keeps the image's default frappe uid instead of aliasing the container's own root account, and warns once.
  • cwcli list and cwcli instances now work as aliases for ls (and apps ls for apps list); a bare cwcli status with no project prints the all-instances summary instead of a usage error.
  • cwcli doctor gains a check that flags a dev/editable install running behind its tracked upstream branch.
  • cwcli config cred-bridge enable --project <name> (repeatable) scopes the credential bridge to named instances; an unscoped sweep touching more than one instance now announces its targets before wiring.
  • cwcli status reports when a site is stuck in maintenance mode and names the command to clear it.
  • inspect and apps list flag an app whose apps/<app> is a symlink or whose imported copy differs from what's on disk, and apps update/apps checkout no longer report success when they changed a copy the running site doesn't actually use.
  • cwcli config paths prune drops custom search paths that are absent from every live instance (dry-run by default, --yes to apply, --json supported).
  • cwcli label and cwcli axi benches hint toward cwcli inspect <project> --update when a bench listing is empty or possibly incomplete, so a hand-made bench is easier to discover.

Bug Fixes

  • A killed terminal or a plain kill during migrate, apps update, apps checkout, apps install, run-tests, or restore no longer leaves a site stuck in maintenance mode or leaks credential-bridge leftovers (socket, shim, git config line) - SIGTERM and SIGHUP now unwind like Ctrl+C. For migrate/apps update specifically, an interrupt now also ends the exact in-container bench migrate process cwcli started before clearing maintenance mode as the last step, closing a Frappe v16 race where the orphaned migrate could turn maintenance back on after cwcli had cleared it; under --skip-maintenance an interrupt restores each affected site to its own pre-migrate maintenance state. Verified on v14, v15, and v16.
  • A failed apps install no longer poisons every later retry with a half-fetched app directory; the partial directory is now cleaned up, and a present-but-invalid one gets an actionable message instead of a traceback.
  • cwcli rm of a site-less (half-provisioned) instance now proceeds in one run instead of refusing and requiring a second --no-backup run; a blank or invalid project name is now rejected up front and shown as (empty) rather than an empty quoted string.
  • The per-invocation credential-bridge shim now prints one guidance line when its socket is gone (use cwcli run or the persistent bridge) instead of leaking a traceback to raw git.
  • cwcli rm's pre-backup database readiness probe no longer false-fails a healthy, slow-to-start instance, and a real failure now names the specific cause (connection refused, unresolvable host, exec failure) instead of a bare timeout.
  • cwcli init validates the project name before the admin-password check, so an invalid name is reported on the first attempt.
  • backup, unlock, restore --latest, and axi migrate now fall back to a bench's sole site instead of failing with "no default site found"; a multi-site bench lists the available sites in the error.
  • apps install accepts the app name positionally, matching apps update/apps checkout.
  • A failed apps update pull now shows a tail of git's real error by default.
  • A supervisor-install failure during start/restart now shows the actual captured output instead of always blaming a network connection.

Other Changes

  • bench init no longer runs with a hardcoded --verbose, and the Docker Hub bench-tag lookup is now cached and skipped when an image tag is pinned, making a plain cwcli init noticeably faster and quieter.
  • Several wording fixes: "not found" messages are consistent across verbs; a stopped instance's cached benches are reported as "not running" instead of "0 benches"; init --reuse-bench says "Reused bench" instead of "Successfully initialized bench"; the human rm-bench running-bench refusal names the real bench selector.