plano/cli
Musa 92f82a9c68
fix(cli): drop function-local import yaml shadowing module global in up (#916)
`up()` had a redundant inline `import yaml` (line 444) even though `yaml`
is already imported at the module top (line 9). Python's compile-time
scope analysis turned `yaml` into a function-local for the entire body,
which was harmless until #890 added `yaml.safe_dump(...)` earlier in the
same function (in the synthesized-default-config branch).

After #890, running `planoai up` in any directory without a config file
crashes with:

    UnboundLocalError: cannot access local variable 'yaml'
    where it is not associated with a value
      File "cli/planoai/main.py", line 388, in up
        yaml.safe_dump(cfg_dict, fh, sort_keys=False)

Removing the redundant inline import lets the module-level `yaml` resolve
normally on both code paths.
2026-04-24 16:18:11 -07:00
..
planoai fix(cli): drop function-local import yaml shadowing module global in up (#916) 2026-04-24 16:18:11 -07:00
test fix(routing): auto-migrate v0.3.0 inline routing_preferences to v0.4.0 top-level (#912) 2026-04-24 12:31:44 -07:00
build_cli.sh use uv instead of poetry (#663) 2025-12-26 11:21:42 -08:00
pyproject.toml Bump version to 0.4.21 (#911) 2026-04-24 14:27:32 -07:00
README.md sync CLI templates with demo configs via manifest + CI flow (#764) 2026-02-17 12:59:09 -08:00
uv.lock Bump version to 0.4.21 (#911) 2026-04-24 14:27:32 -07:00

plano CLI - Local Development

This guide will walk you through setting up the plano CLI for local development using uv.

Install uv

First, install the uv package manager. This is required for managing dependencies and running the development version of planoai.

On macOS and Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

On Windows:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Setup

  1. Install dependencies

    In the cli directory, run:

    uv sync
    

    This will create a virtual environment in .venv and install all dependencies from pyproject.toml.

  2. Install the CLI tool globally (optional)

    To install planoai as a global tool on your system:

    uv tool install --editable .
    

    This installs planoai globally in editable mode, allowing you to run planoai commands from anywhere while still using the source code from this directory. Any changes you make to the code will be reflected immediately.

  3. Run plano commands

    Use uv run to execute plano commands with the development version:

    uv run planoai build
    

    Or, if you installed globally with uv tool install .:

    planoai build
    

    Note: uv run automatically uses the virtual environment - no activation needed.

Development Workflow

Build plano:

uv run planoai build

View logs:

uv run planoai logs --follow

Run other plano commands:

uv run planoai <command> [options]

CI: Keep CLI templates and demos in sync

The CLI templates in cli/planoai/templates/ are the source of truth for mapped demo config.yaml files.

Use the sync utility to write mapped demo configs from templates:

uv run python -m planoai.template_sync

Optional: Manual Virtual Environment Activation

While uv run handles the virtual environment automatically, you can activate it manually if needed:

source .venv/bin/activate
planoai build  # No need for 'uv run' when activated

Note: For end-user installation instructions, see the Plano documentation.