Project as Code framework for Plane - Define and sync projects declaratively with YAML
Project description
Plane Compose
Project as Code framework for Plane - Define projects, schemas, and work items in YAML. Sync bidirectionally. Version control everything.
A powerful, production-ready project as code framework for managing Plane projects locally. Think "Terraform for project management" with declarative workflows, state tracking, and collaborative features.
โจ Features
Core Capabilities
- Local-first workflow - Define everything in YAML, version control with Git
- Bidirectional sync - Push to Plane, pull from Plane
- Auto-create projects - Projects created automatically during schema push
- Rich schema management - Work item types with custom properties, workflows, labels
- Intelligent sync - Content-based change detection, no duplicate creates
- Secure authentication - API keys stored securely
- Beautiful output - Rich terminal UI with progress indicators
Advanced Features
- Declarative mode (
plane apply) - Domain-scoped single source of truth - Collaborative mode (
plane push) - Additive-only, team-friendly - Rate limiting - Built-in 50 req/min throttling, respects API limits
- State tracking - Terraform-style
.plane/state.jsonfor change detection - Stable IDs - User-defined IDs or content hashing for reliable tracking
- Status monitoring - Real-time sync status and rate limit stats
- Debug mode - Comprehensive logging and error handling
- Project cloning - Clone entire projects with schema and work items
Installation
Using pipx (Recommended)
pipx install plane-compose
From source
git clone https://github.com/makeplane/compose.git
cd compose
pipx install -e .
Upgrading
pipx upgrade plane-compose
๐ Quick Start
Starting from Scratch
# 1. Install globally
pipx install plane-compose
# 2. Initialize a new project
plane init my-project
# 3. Authenticate with Plane
plane auth login
# Enter API key from: https://app.plane.so/<workspace-slug>/settings/account/api-tokens/
# 4. Configure your workspace
cd my-project
vim plane.yaml # Set your workspace name
# 5. Push schema (creates project in Plane)
plane schema push
# 6. Add work items
vim work/inbox.yaml
# 7. Push work items
plane push
Cloning Existing Project
# 1. Clone project by UUID
plane clone abc-123-def-456 --workspace my-workspace
# 2. Navigate to project
cd <project-name>
# 3. Check what was pulled
cat .plane/remote/items.yaml
# 4. Make changes and push
vim work/inbox.yaml
plane push
Complete Workflow
1. Initialize Project
plane init my-project --workspace myteam --project API
This creates:
my-project/
โโโ plane.yaml # Project configuration
โโโ schema/
โ โโโ types.yaml # Work item types (task, bug, etc.)
โ โโโ workflows.yaml # State machines
โ โโโ labels.yaml # Label definitions
โโโ work/
โ โโโ inbox.yaml # Work items to create
โโโ .plane/
โโโ state.json # Sync state (auto-managed)
2. Authenticate
plane auth login
# Enter your API key from: https://app.plane.so/<workspace-slug>/settings/account/api-tokens/
Check auth status:
plane auth whoami
3. Customize Schema (Optional)
Edit the schema files to match your workflow:
schema/types.yaml- Define work item typesschema/workflows.yaml- Define states and transitionsschema/labels.yaml- Define labels
4. Push Schema
plane schema push
This will:
- Create the project in Plane (if it doesn't exist)
- Create work item types
- Create states
- Create labels
- Update
plane.yamlwith project UUID
5. Add Work Items
Edit work/inbox.yaml:
# With stable IDs (recommended)
- id: "auth-oauth"
title: Implement user authentication
type: task
priority: high
labels: [backend, feature]
state: todo
description: Add OAuth2 authentication
assignee: dev@example.com
watchers:
- pm@example.com
- qa@example.com
- id: "bug-login-css"
title: Fix login button CSS
type: bug
priority: medium
labels: [frontend, bug]
state: backlog
6. Push Work Items
# Preview what will be pushed
plane push --dry-run
# Push to Plane
plane push
# Or use sync (schema + work items together)
plane sync
7. Check Status & Rate Limits
# Show sync status
plane status
# Show rate limit stats
plane rate stats
๐ Commands
Project Management
plane init [path]- Initialize new project structure locallyplane status- Show current sync statusplane clone <uuid>- Clone existing project from Plane by UUID
Authentication
plane auth login- Authenticate with API keyplane auth whoami- Show current user infoplane auth logout- Remove stored credentials
Schema Management
plane schema validate- Validate local schema filesplane schema push- Create/update project schema in Planeplane schema push --dry-run- Preview schema changes
Work Items - Collaborative Mode
plane push- Push new/updated work items (additive only)plane push --dry-run- Preview what will be pushedplane push --force- Push without confirmationplane pull- Pull work items from Plane to.plane/remote/items.yamlplane sync- Runschema push+pushtogether
Work Items - Declarative Mode
plane apply- Declarative sync with delete support (scope-based)plane apply --dry-run- Preview creates/updates/deletesplane apply --force- Apply without confirmation
Monitoring
plane rate stats- Show rate limit statisticsplane rate reset- Reset rate limit statistics
Global Options
--verbose/-v- Enable verbose output--debug- Enable debug logging (saves to~/.config/plane-cli/plane.log)
Project Structure
plane.yaml
workspace: myteam
project:
key: API # Short key or UUID
name: API Project
defaults:
type: task
workflow: standard
schema/types.yaml
task:
description: A single unit of work
workflow: standard
fields:
- name: title
type: string
required: true
- name: priority
type: enum
options: [none, low, medium, high, urgent]
schema/workflows.yaml
standard:
states:
- name: backlog
group: unstarted
color: "#858585"
- name: in_progress
group: started
color: "#f59e0b"
- name: done
group: completed
color: "#22c55e"
initial: backlog
terminal: [done]
schema/labels.yaml
groups:
area:
color: "#3b82f6"
labels:
- name: frontend
- name: backend
work/inbox.yaml
- title: Work item title
type: task
priority: high
labels: [backend, feature]
state: todo
description: Optional description
โ๏ธ Configuration
API Key
Get your API key from: https://app.plane.so//settings/account/api-tokens/
Stored securely at: ~/.config/plane-compose/credentials
Workspace
Find your workspace slug in the Plane URL: https://app.plane.so/{workspace}
Environment Variables
All settings can be customized via environment variables:
# API Configuration
export PLANE_API_URL="https://api.plane.so"
export PLANE_API_TIMEOUT=30
# Rate Limiting
export PLANE_RATE_LIMIT_PER_MINUTE=50
# Debugging
export PLANE_DEBUG=true
export PLANE_VERBOSE=true
export PLANE_LOG_TO_FILE=true
plane.yaml Options
workspace: my-workspace
project:
key: PROJ # User-defined short key
uuid: abc-123 # Auto-added after schema push
name: My Project
defaults:
type: task
workflow: standard
# Optional: Declarative scope for 'plane apply'
apply_scope:
labels: ["automated"]
assignee: "bot@example.com"
id_prefix: "AUTO-"
๐ง Troubleshooting
Common Issues
Authentication Failed (401)
plane auth logout
plane auth login
Permission Denied (403)
- Verify you're a member/admin of the workspace
- Check with workspace administrator
- Try:
plane auth whoami
Project Not Found (404)
# Remove stale UUID from plane.yaml
vim plane.yaml # Delete uuid line
# Recreate/find project
plane schema push
Rate Limit Exceeded (429)
# Check rate limit status
plane rate stats
# Wait and retry, or reduce rate:
export PLANE_RATE_LIMIT_PER_MINUTE=30
plane push
Duplicate Work Items
# Always use stable IDs:
- id: "unique-identifier"
title: "My task"
State Corruption
# Backup and reset state
cp .plane/state.json .plane/state.json.backup
rm .plane/state.json
plane pull
Debug Mode
# Enable verbose logging
plane --debug push
# View logs
tail -f ~/.config/plane-compose/plane.log
For more help, see docs/troubleshooting.md
๐ ๏ธ Development
# Clone repository
git clone https://github.com/makeplane/compose.git
cd compose
# Create virtual environment
python3 -m venv venv
source venv/bin/activate
# Install in development mode with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
pytest --cov=planecompose --cov-report=html
# Format code
black src/ tests/
# Lint
ruff check src/
# Type check
mypy src/planecompose/
Architecture
Plane Compose follows clean architecture principles:
src/planecompose/
โโโ cli/ # CLI commands (presentation layer)
โโโ backend/ # Backend abstraction (data access layer)
โโโ core/ # Domain models (Pydantic)
โโโ sync/ # Business logic (sync orchestration)
โโโ diff/ # Change detection
โโโ parser/ # YAML parsing
โโโ utils/ # Utilities (rate limiting, logging)
โโโ config/ # Configuration management
โโโ exceptions.py # Custom exception hierarchy
See docs/architecture.md and docs/development.md for more details.
License
AGPLv3 License - see LICENSE.txt file for details.
๐ Documentation
- Architecture Guide - System design and principles
- Development Guide - Contributing and development
- Examples - Common workflows and patterns
- Troubleshooting - Common issues and solutions
๐ Links
- Plane - Main website
- Plane API Documentation - API reference
- Plane Python SDK - Official SDK
- GitHub Repository - Source code
- Issue Tracker - Report bugs
๐ License
AGPLv3 License - see LICENSE.txt file for details.
๐ Acknowledgments
- Built with Typer for CLI
- Rich for beautiful terminal output
- Pydantic for data validation
- Plane SDK for API access
Made with โค๏ธ for the Plane community
Contributions welcome! See docs/development.md for guidelines.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file plane_compose-0.2.0.tar.gz.
File metadata
- Download URL: plane_compose-0.2.0.tar.gz
- Upload date:
- Size: 142.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
199a87a1e428f9257b95c3e186cafcbca612c8b9e2f75e5154f7504e1fe323d2
|
|
| MD5 |
ab3b02508cbbf03c233dd630926bd2df
|
|
| BLAKE2b-256 |
ba1826f08704b10c3663b896e8d139a1d9c67550941004a0fb011443e3ff150e
|
File details
Details for the file plane_compose-0.2.0-py3-none-any.whl.
File metadata
- Download URL: plane_compose-0.2.0-py3-none-any.whl
- Upload date:
- Size: 107.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ccf0286a5af0488bcef7d85a3fd5b659ee9b382fa09ad88e3750a7f43e651bf5
|
|
| MD5 |
5b2b11d6e60b2fc8a202e1457f9d27ae
|
|
| BLAKE2b-256 |
0e11d4d1e7a29f3713be12a2500fd51d0a0270e5e16555b67b213a72aa3d41e9
|