Skip to content

v3.5.85

Latest

Choose a tag to compare

@chauncygu chauncygu released this 11 Jul 03:09
· 27 commits to main since this release
1dd75ac
  • July 10, 2026 (v3.5.85): REPL quality-of-life — completion works on every install, /model gets a Tab picker, and sessions autosave every turn. Three related changes. (1) prompt_toolkit is now a core dependency. The typing-time completion menu (slash commands, subcommands, the new /model picker) is driven by prompt_toolkit, but it was an optional extra ([autosuggest]), so only environments that happened to already have it — e.g. a fat Anaconda base — got the rich experience; a clean pip install cheetahclaws or an isolated uv tool install cheetahclaws fell back to bare readline (Tab-only, no live dropdown). Since the interactive REPL is the product, prompt_toolkit>=3.0.43 moved from [project.optional-dependencies].autosuggest into [project].dependencies (and into the core block of requirements.txt), so every install method now gets live completion out of the box. The readline fallback path in ui/input.py is untouched — it still covers any environment where prompt_toolkit genuinely can't be installed. The [autosuggest] extra is kept as a harmless no-op alias for backward compatibility. (2) /model dynamic completion (PR #166). Typing /model and pressing Tab now offers a provider/model picker — one default model per configured provider plus a two-level litellm/<backend>/<model> tree you can drill into — instead of forcing you to remember and hand-type long model strings. Completions are context-aware (/model openai/g narrows to OpenAI models; litellm/openrouter/ expands that backend). Wired into both the prompt_toolkit and readline completers via a new dynamic-completions registry; the litellm provider also gained a small curated starting model list to seed the picker (any valid LiteLLM string still works regardless of the list). (3) Per-turn crash-safe session autosave. Previously the live transcript was written to session_latest.json only on a clean exit / Ctrl+C / budget-pause, so a power-loss or hard kill mid-conversation lost everything since the session started (file edits and explicit /remember writes were already immediate, so only the transcript was at risk). A new autosave_session() (in commands/session.py) is now called at the end of every turn in run_query: it rewrites only session_latest.json via a temp file + flush() + os.fsync() + atomic os.replace() (durable against a power cut, and a crash can never leave a half-written file), stays silent (no console spam), reuses one stable session_id so each turn overwrites the same file, and is best-effort (never raises into the REPL). It deliberately does not write a daily/ copy, append to history.json, or touch SQLite — those remain exit-time finalization steps in save_latest(), which still prints the loud Session saved → … paths on quit. Net effect: /resume now recovers a conversation after a crash, not just after a clean exit. See docs/PR/resume_Feature.md · docs/guides/reference.md (/model, /resume) · docs/guides/features.md (Session persistence). Version bumped 3.5.843.5.85 in pyproject.toml. Not a breaking change — no runtime behavior changes for existing installs beyond the always-on completion and autosave; publishing the new release (git tag + PyPI) is what lets users pull the prompt_toolkit core-dependency change via pip install -U / uv tool upgrade.
  • July 9, 2026: Official Docker image on Docker Hub + a one-command publish script, plus a first-run permission fix. You can now run CheetahClaws without cloning the source: docker pull chauncygu/cheetahclaws and docker run --rm -p 8080:8080 chauncygu/cheetahclaws brings up the Web UI. Three parts shipped. (1) First-run PermissionError fixed. The image runs as a non-root cheetah user (uid 1000), but the Dockerfile declared VOLUME ["/home/cheetah/.cheetahclaws"] and set WORKDIR /workspace without pre-creating those directories, so Docker created them root-owned — and the very first launch died with PermissionError: [Errno 13] ... '/home/cheetah/.cheetahclaws/sessions' when config.load_config tried to mkdir the sessions dir. The Dockerfile now mkdir -ps both .cheetahclaws and /workspace and chowns them to cheetah before USER cheetah, so the anonymous volume and workspace inherit correct ownership and startup succeeds with no host mount required. (2) Compose image is overridable. docker-compose.yml still builds and tags cheetahclaws:latest locally by default, but the image: key is now ${CHEETAH_IMAGE:-cheetahclaws:latest} — set CHEETAH_IMAGE=chauncygu/cheetahclaws:latest docker compose up -d to run the published image and skip the build. (3) scripts/docker-publish.sh reads the version from pyproject.toml, tags both :<version> and :latest, and pushes; multi-arch (linux/amd64,linux/arm64) via buildx by default, or SINGLE_ARCH=1 for a host-arch-only docker build+push, with DRY_RUN=1 to preview and PUSH_LATEST=0 to skip the floating tag. Docs: docs/guides/docker.md gains a Pull from Docker Hub section (pull/run, compose override, maintainer publish) and an Interactive setup / CLI mode section explaining that the default --web image configures the model in the Web UI Settings panel, and how to get the pip-style first-run wizard instead (docker run -it … --setup, with the required -v …:/home/cheetah/.cheetahclaws config-persistence mount). Current published tags: chauncygu/cheetahclaws:latest and :3.5.84 (amd64). Not a breaking change — no source behavior changes; native pip install cheetahclaws is unaffected.
  • July 8, 2026: /workspace — isolated working directories under ~/.cheetahclaws/workspaces, now strictly opt-in (PR #162 + follow-up hardening). Adds a /workspace slash command mirroring the Dulus workflow: list, switch <name> (creates on demand, records last-used), default [name] (show/set the startup workspace), create <name>, and delete <name> (empty dirs only; refuses to delete the workspace you're currently in), plus a bare /workspace that prints the current workspace + cwd. The follow-up fixes two problems in the original PR before they reach users. (1) No more silent chdir on startup. The merged version unconditionally os.chdir-ed into ~/.cheetahclaws/workspaces/workspace1 at every launch — so a user starting cheetahclaws inside their project would have the agent's file tools silently operating on an empty hidden directory instead of their repo. Boot-time switching is now gated behind a new workspace_auto config flag (default False): out of the box the CLI stays in whatever directory you launched from (unchanged behavior); isolation is enabled explicitly with /config workspace_auto=true. (2) default is now sticky. default and switch previously shared one workspace_last key, so setting a startup default was clobbered by the next switch. They're now split into workspace_default (the sticky startup target, set only by /workspace default) and workspace_last (most-recent switch); startup precedence is workspace_defaultworkspace_lastworkspace1. All three keys are registered in config.DEFAULTS. Covered by tests/test_workspace_cmd.py (12 tests: CRUD round-trips, current-workspace detection, the distinct-keys regression, startup precedence, and the boot helper). Not a breaking change — with workspace_auto off (the default), no existing behavior changes. See docs/guides/reference.md (/workspace, workspace_auto).