diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 4d980ec8..bfe57eab 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -110,6 +110,25 @@ jobs:
# ── Zero-config path: `planoai up` with no args, no plano.yaml in cwd.
# Exercises the synthesize_default_config branch in cli/planoai/main.py
# which is otherwise never hit by the smoke test above.
+ #
+ # Pre-seed ~/.plano/ from the freshly-built artifacts so the CLI's
+ # cached-download path hits in step (2) of ensure_wasm_plugins /
+ # ensure_brightstaff_binary. Without this, running from outside the
+ # repo means find_repo_root() returns None, the local-build short-
+ # circuit is skipped, and the CLI tries to download from a GitHub
+ # release that does not yet exist for the in-flight version on
+ # release-bump PRs (e.g. 0.4.23 before publish-binaries has run).
+ - name: Seed ~/.plano cache for zero-config test
+ run: |
+ VERSION=$(sed -nE 's/^__version__ = "(.*)"$/\1/p' cli/planoai/__init__.py)
+ mkdir -p ~/.plano/plugins ~/.plano/bin
+ cp crates/target/wasm32-wasip1/release/prompt_gateway.wasm ~/.plano/plugins/
+ cp crates/target/wasm32-wasip1/release/llm_gateway.wasm ~/.plano/plugins/
+ cp crates/target/release/brightstaff ~/.plano/bin/
+ chmod +x ~/.plano/bin/brightstaff
+ echo "$VERSION" > ~/.plano/plugins/wasm.version
+ echo "$VERSION" > ~/.plano/bin/brightstaff.version
+
- name: Zero-config smoke test
env:
OPENAI_API_KEY: test-key-not-used
@@ -164,13 +183,13 @@ jobs:
load: true
tags: |
${{ env.PLANO_DOCKER_IMAGE }}
- ${{ env.DOCKER_IMAGE }}:0.4.22
+ ${{ env.DOCKER_IMAGE }}:0.4.23
${{ env.DOCKER_IMAGE }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Save image as artifact
- run: docker save ${{ env.PLANO_DOCKER_IMAGE }} ${{ env.DOCKER_IMAGE }}:0.4.22 ${{ env.DOCKER_IMAGE }}:latest -o /tmp/plano-image.tar
+ run: docker save ${{ env.PLANO_DOCKER_IMAGE }} ${{ env.DOCKER_IMAGE }}:0.4.23 ${{ env.DOCKER_IMAGE }}:latest -o /tmp/plano-image.tar
- name: Upload image artifact
uses: actions/upload-artifact@v6
diff --git a/apps/www/src/components/Hero.tsx b/apps/www/src/components/Hero.tsx
index b45c6873..b9d5b170 100644
--- a/apps/www/src/components/Hero.tsx
+++ b/apps/www/src/components/Hero.tsx
@@ -24,7 +24,7 @@ export function Hero() {
>
- v0.4.22
+ v0.4.23
—
diff --git a/build_filter_image.sh b/build_filter_image.sh
index 64708056..624955c2 100644
--- a/build_filter_image.sh
+++ b/build_filter_image.sh
@@ -1 +1 @@
-docker build -f Dockerfile . -t katanemo/plano -t katanemo/plano:0.4.22
+docker build -f Dockerfile . -t katanemo/plano -t katanemo/plano:0.4.23
diff --git a/cli/planoai/__init__.py b/cli/planoai/__init__.py
index ec2c63da..dc0c543a 100644
--- a/cli/planoai/__init__.py
+++ b/cli/planoai/__init__.py
@@ -1,3 +1,3 @@
"""Plano CLI - Intelligent Prompt Gateway."""
-__version__ = "0.4.22"
+__version__ = "0.4.23"
diff --git a/cli/planoai/consts.py b/cli/planoai/consts.py
index 5cafb817..8f13ba50 100644
--- a/cli/planoai/consts.py
+++ b/cli/planoai/consts.py
@@ -5,7 +5,7 @@ PLANO_COLOR = "#969FF4"
SERVICE_NAME_ARCHGW = "plano"
PLANO_DOCKER_NAME = "plano"
-PLANO_DOCKER_IMAGE = os.getenv("PLANO_DOCKER_IMAGE", "katanemo/plano:0.4.22")
+PLANO_DOCKER_IMAGE = os.getenv("PLANO_DOCKER_IMAGE", "katanemo/plano:0.4.23")
DEFAULT_OTEL_TRACING_GRPC_ENDPOINT = "http://localhost:4317"
# Native mode constants
diff --git a/cli/pyproject.toml b/cli/pyproject.toml
index f7ac640e..e0a90e11 100644
--- a/cli/pyproject.toml
+++ b/cli/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "planoai"
-version = "0.4.22"
+version = "0.4.23"
description = "Python-based CLI tool to manage Plano."
authors = [{name = "Katanemo Labs, Inc."}]
readme = "README.md"
diff --git a/cli/uv.lock b/cli/uv.lock
index d63fab73..98d50481 100644
--- a/cli/uv.lock
+++ b/cli/uv.lock
@@ -337,7 +337,7 @@ wheels = [
[[package]]
name = "planoai"
-version = "0.4.22"
+version = "0.4.23"
source = { editable = "." }
dependencies = [
{ name = "click" },
diff --git a/demos/llm_routing/preference_based_routing/README.md b/demos/llm_routing/preference_based_routing/README.md
index 5bbcab13..3401dcf6 100644
--- a/demos/llm_routing/preference_based_routing/README.md
+++ b/demos/llm_routing/preference_based_routing/README.md
@@ -3,7 +3,7 @@ This demo shows how you can use user preferences to route user prompts to approp
## How to start the demo
-Make sure you have Plano CLI installed (`pip install planoai==0.4.22` or `uv tool install planoai==0.4.22`).
+Make sure you have Plano CLI installed (`pip install planoai==0.4.23` or `uv tool install planoai==0.4.23`).
```bash
cd demos/llm_routing/preference_based_routing
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 4a739313..8d006444 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -17,7 +17,7 @@ from sphinxawesome_theme.postprocess import Icons
project = "Plano Docs"
copyright = "2026, Katanemo Labs, a DigitalOcean Company"
author = "Katanemo Labs, Inc"
-release = " v0.4.22"
+release = " v0.4.23"
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
diff --git a/docs/source/get_started/quickstart.rst b/docs/source/get_started/quickstart.rst
index 801ad685..0b49f104 100644
--- a/docs/source/get_started/quickstart.rst
+++ b/docs/source/get_started/quickstart.rst
@@ -43,7 +43,7 @@ Plano's CLI allows you to manage and interact with the Plano efficiently. To ins
.. code-block:: console
- $ uv tool install planoai==0.4.22
+ $ uv tool install planoai==0.4.23
**Option 2: Install with pip (Traditional)**
@@ -51,7 +51,7 @@ Plano's CLI allows you to manage and interact with the Plano efficiently. To ins
$ python -m venv venv
$ source venv/bin/activate # On Windows, use: venv\Scripts\activate
- $ pip install planoai==0.4.22
+ $ pip install planoai==0.4.23
.. _llm_routing_quickstart:
diff --git a/docs/source/resources/deployment.rst b/docs/source/resources/deployment.rst
index c8246f8c..6858269f 100644
--- a/docs/source/resources/deployment.rst
+++ b/docs/source/resources/deployment.rst
@@ -65,7 +65,7 @@ Create a ``docker-compose.yml`` file with the following configuration:
# docker-compose.yml
services:
plano:
- image: katanemo/plano:0.4.22
+ image: katanemo/plano:0.4.23
container_name: plano
ports:
- "10000:10000" # ingress (client -> plano)
@@ -153,7 +153,7 @@ Create a ``plano-deployment.yaml``:
spec:
containers:
- name: plano
- image: katanemo/plano:0.4.22
+ image: katanemo/plano:0.4.23
ports:
- containerPort: 12000 # LLM gateway (chat completions, model routing)
name: llm-gateway