Skip to main content

plane-cli

Use Plane.so without leaving the command line. Works great with AI agents.

[!NOTE] This project was built with AI assistance (Claude). The code is functional and reviewed, but heads up if that matters to you.

plane projects list                         # list all projects in your workspace
plane issues list --pretty                  # view issues as a rich table
plane issues create --title "Fix login bug" # create an issue
plane issues list --all                     # fetch every page of issues
plane issues comment add <id> --body -      # pipe a comment body from stdin

Installation

pip install plane-cli

Or with uv:

uv tool install plane-cli

Configuration

Run the interactive setup wizard on first use:

plane config init

Config is stored in ~/.config/plane-cli/config.toml:

[core]
api_key        = "plane_api_xxxxxxxx"
workspace_slug = "my-workspace"
base_url       = "https://api.plane.so"   # optional

[defaults]
project  = "uuid-of-default-project"      # optional
per_page = 20

Environment variables

All config values can be overridden with environment variables — useful for CI or agent use:

Environment variable Config key
PLANE_API_KEY core.api_key
PLANE_WORKSPACE_SLUG core.workspace_slug
PLANE_BASE_URL core.base_url
PLANE_PROJECT defaults.project

CLI flags (--api-key, --workspace, --base-url, --project) override both.

Get an API key

Go to Plane → Settings → API Tokens and create a token.

Commands

config

plane config init            # interactive setup wizard
plane config show            # print resolved config (api_key masked)
plane config show --reveal   # print full api_key
plane config set <key> <val> # set a single value, e.g. defaults.project <uuid>

projects

plane projects list
plane projects get <project-id>
plane projects create --name NAME [--identifier ID] [--description TEXT] [--network public|secret]
plane projects update <project-id> [--name] [--description] [--network]
plane projects delete <project-id> [--yes]

issues

plane issues list   [--project] [--state] [--priority] [--label] [--assignee]
                    [--page N] [--per-page N] [--all]
plane issues get    <issue-id>  [--project]
plane issues create --title TITLE [--project] [--description TEXT|-] [--state]
                    [--priority urgent|high|medium|low|none]
                    [--label ID]... [--assignee ID]... [--due-date YYYY-MM-DD]
plane issues update <issue-id>  [--project] [--title] [--description TEXT|-]
                    [--state] [--priority] [--label ID]... [--due-date]
plane issues delete <issue-id>  [--project] [--yes]

plane issues comment list <issue-id> [--project]
plane issues comment add  <issue-id> [--project] --body TEXT|-

states

plane states list   [--project]
plane states get    <state-id>  [--project]
plane states create --name NAME --color HEX [--project]
                    [--group backlog|unstarted|started|completed|cancelled]
plane states update <state-id>  [--project] [--name] [--color] [--group]
plane states delete <state-id>  [--project] [--yes]

labels

plane labels list   [--project]
plane labels get    <label-id>  [--project]
plane labels create --name NAME [--project] [--color HEX]
plane labels update <label-id>  [--project] [--name] [--color]
plane labels delete <label-id>  [--project] [--yes]

pages

plane pages list    [--project]
plane pages get     <page-id>   [--project]
plane pages create  --name NAME [--project] [--description TEXT|-]
plane pages update  <page-id>   [--project] [--name] [--description TEXT|-]
plane pages delete  <page-id>   [--project] [--yes]
plane pages delete  <page-id>   [--project] --archive [--yes]

Output

By default all commands print JSON to stdout, making them easy to pipe into jq or feed to an LLM:

plane issues list | jq '.[].name'
plane projects list | jq '.[] | {id, name: .identifier}'

Pass --pretty for Rich-rendered tables with color-coded priorities, state groups, and due-date highlighting:

plane issues list --pretty
plane states list --pretty

Reading from stdin

Any --description or --body option accepts - to read from stdin:

plane issues create --title "Refactor auth" --description - <<'EOF'
Replace the JWT library with a simpler custom implementation.
Motivation: reduce bundle size and eliminate the CVE.
EOF

git diff HEAD~1 | plane issues comment add <id> --project <pid> --body -

Pagination

plane issues list                # first page (default 20 per page)
plane issues list --per-page 50  # custom page size
plane issues list --page 3       # jump to a specific page
plane issues list --all          # fetch all pages, capped at 1000

Agent use

Because output is plain JSON and the CLI is fully non-interactive by default (no prompts, no spinners on stdout), it works cleanly as a tool for LLM agents:

# safe to run in any non-TTY context
PLANE_API_KEY=... PLANE_WORKSPACE_SLUG=... plane issues list
# destructive commands require explicit --yes in non-TTY
plane issues delete <id> --yes

Errors are always JSON on stderr with a consistent shape:

{ "error": { "type": "not_found", "message": "...", "status_code": 404 } }

Exit codes: 0 success · 1 error · 2 rate-limited (retry safe)

License

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plane_cli-0.2.4.tar.gz (15.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plane_cli-0.2.4-py3-none-any.whl (22.1 kB view details)

Uploaded Python 3

File details

Details for the file plane_cli-0.2.4.tar.gz.

File metadata

  • Download URL: plane_cli-0.2.4.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for plane_cli-0.2.4.tar.gz
Algorithm Hash digest
SHA256 caad5077aa827d9dbcb87fa24f5fac76db92b4f5214a3fa5453854d04af819fd
MD5 9d29238ae5c793c20555ea0bda3ed8b8
BLAKE2b-256 a956b6c6402cf28b0536a1999572eb637fec0464436fa697a3d9c319a74c2d5a

See more details on using hashes here.

File details

Details for the file plane_cli-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: plane_cli-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 22.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for plane_cli-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 93b2bc7c2df15730ae07ed922841da52f59b9fd497a643963433e0e7d3385bff
MD5 16ab89462fa235ca7496eae7467c5554
BLAKE2b-256 229d32c496dec86b35b8c6eee195e740d1bd092a6344f4808b440e65fce9c8f8

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.2.4 This release

2 files

0.2.3

2 files

0.2.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page