plane-compose 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plane_compose-0.1.0.dist-info/METADATA +526 -0
- plane_compose-0.1.0.dist-info/RECORD +51 -0
- plane_compose-0.1.0.dist-info/WHEEL +4 -0
- plane_compose-0.1.0.dist-info/entry_points.txt +2 -0
- plane_compose-0.1.0.dist-info/licenses/LICENSE.txt +664 -0
- planecompose/__init__.py +2 -0
- planecompose/automations/__init__.py +25 -0
- planecompose/automations/actions.py +277 -0
- planecompose/automations/engine.py +435 -0
- planecompose/automations/evaluator.py +500 -0
- planecompose/automations/models.py +283 -0
- planecompose/automations/parser.py +175 -0
- planecompose/automations/runner.py +288 -0
- planecompose/automations/visualizer.py +675 -0
- planecompose/backend/__init__.py +1 -0
- planecompose/backend/base.py +59 -0
- planecompose/backend/plane.py +1277 -0
- planecompose/cli/__init__.py +1 -0
- planecompose/cli/auth.py +93 -0
- planecompose/cli/automations.py +838 -0
- planecompose/cli/clone.py +487 -0
- planecompose/cli/init.py +181 -0
- planecompose/cli/pull.py +373 -0
- planecompose/cli/push.py +343 -0
- planecompose/cli/rate_stats.py +74 -0
- planecompose/cli/root.py +77 -0
- planecompose/cli/schema.py +795 -0
- planecompose/cli/status.py +122 -0
- planecompose/config/__init__.py +1 -0
- planecompose/config/context.py +119 -0
- planecompose/config/settings.py +119 -0
- planecompose/core/__init__.py +1 -0
- planecompose/core/models.py +139 -0
- planecompose/diff/__init__.py +1 -0
- planecompose/exceptions.py +171 -0
- planecompose/main.py +5 -0
- planecompose/parser/__init__.py +1 -0
- planecompose/parser/labels_yaml.py +37 -0
- planecompose/parser/plane_yaml.py +24 -0
- planecompose/parser/types_yaml.py +86 -0
- planecompose/parser/work_yaml.py +84 -0
- planecompose/parser/workflows_yaml.py +36 -0
- planecompose/sync/__init__.py +1 -0
- planecompose/utils/__init__.py +1 -0
- planecompose/utils/errors.py +224 -0
- planecompose/utils/http_client.py +92 -0
- planecompose/utils/logger.py +102 -0
- planecompose/utils/project.py +162 -0
- planecompose/utils/rate_limit.py +116 -0
- planecompose/utils/work_items.py +62 -0
- planecompose/validation/__init__.py +1 -0
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: plane-compose
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Project as Code framework for Plane - Define and sync projects declaratively with YAML
|
|
5
|
+
Project-URL: Homepage, https://github.com/makeplane/compose
|
|
6
|
+
Project-URL: Documentation, https://github.com/makeplane/compose/tree/main/docs
|
|
7
|
+
Project-URL: Repository, https://github.com/makeplane/compose
|
|
8
|
+
Project-URL: Bug Tracker, https://github.com/makeplane/compose/issues
|
|
9
|
+
Project-URL: Source Code, https://github.com/makeplane/compose
|
|
10
|
+
Author-email: "Plane Software, Inc." <hello@plane.so>
|
|
11
|
+
Maintainer-email: "Plane Software, Inc." <hello@plane.so>
|
|
12
|
+
License: AGPL-3.0-or-later
|
|
13
|
+
License-File: LICENSE.txt
|
|
14
|
+
Keywords: automation,cli,devops,infrastructure-as-code,issue-tracking,plane,project-management,workflow,yaml
|
|
15
|
+
Classifier: Development Status :: 4 - Beta
|
|
16
|
+
Classifier: Environment :: Console
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
|
|
19
|
+
Classifier: Operating System :: OS Independent
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
+
Classifier: Typing :: Typed
|
|
27
|
+
Requires-Python: >=3.10
|
|
28
|
+
Requires-Dist: cel-python>=0.4.0
|
|
29
|
+
Requires-Dist: httpx>=0.25.0
|
|
30
|
+
Requires-Dist: plane-sdk>=0.1.10
|
|
31
|
+
Requires-Dist: pydantic-settings>=2.0.0
|
|
32
|
+
Requires-Dist: pydantic>=2.0.0
|
|
33
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
34
|
+
Requires-Dist: pyyaml>=6.0
|
|
35
|
+
Requires-Dist: rich>=13.0.0
|
|
36
|
+
Requires-Dist: typer[all]>=0.9.0
|
|
37
|
+
Provides-Extra: dev
|
|
38
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
39
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
|
|
41
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
43
|
+
Description-Content-Type: text/markdown
|
|
44
|
+
|
|
45
|
+
# ✈️ Plane Compose
|
|
46
|
+
|
|
47
|
+
> **Project as Code for Plane** - Define projects, schemas, and work items in YAML. Sync bidirectionally. Version control everything.
|
|
48
|
+
|
|
49
|
+
A powerful, production-ready project as code framework for managing [Plane](https://plane.so) projects locally. Think "Terraform for project management" with declarative workflows, state tracking, and collaborative features.
|
|
50
|
+
|
|
51
|
+
## ✨ Features
|
|
52
|
+
|
|
53
|
+
### Core Capabilities
|
|
54
|
+
- 📁 **Local-first workflow** - Define everything in YAML, version control with Git
|
|
55
|
+
- 🔄 **Bidirectional sync** - Push to Plane, pull from Plane
|
|
56
|
+
- 🚀 **Auto-create projects** - Projects created automatically during schema push
|
|
57
|
+
- 📋 **Rich schema management** - Work item types with custom properties, workflows, labels
|
|
58
|
+
- 🎯 **Intelligent sync** - Content-based change detection, no duplicate creates
|
|
59
|
+
- 🔐 **Secure authentication** - API keys stored securely
|
|
60
|
+
- 💎 **Beautiful output** - Rich terminal UI with progress indicators
|
|
61
|
+
|
|
62
|
+
### Advanced Features
|
|
63
|
+
- 🎨 **Declarative mode** (`plane apply`) - Domain-scoped single source of truth
|
|
64
|
+
- 🤝 **Collaborative mode** (`plane push`) - Additive-only, team-friendly
|
|
65
|
+
- ⚡ **Rate limiting** - Built-in 50 req/min throttling, respects API limits
|
|
66
|
+
- 🔍 **State tracking** - Terraform-style `.plane/state.json` for change detection
|
|
67
|
+
- 🏷️ **Stable IDs** - User-defined IDs or content hashing for reliable tracking
|
|
68
|
+
- 📊 **Status monitoring** - Real-time sync status and rate limit stats
|
|
69
|
+
- 🔬 **Debug mode** - Comprehensive logging and error handling
|
|
70
|
+
- 🌐 **Project cloning** - Clone entire projects with schema and work items
|
|
71
|
+
|
|
72
|
+
## Installation
|
|
73
|
+
|
|
74
|
+
### Using pipx (Recommended)
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pipx install plane-compose
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### From source
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
git clone https://github.com/makeplane/compose.git
|
|
84
|
+
cd compose
|
|
85
|
+
pipx install -e .
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Upgrading
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
pipx upgrade plane-compose
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 🚀 Quick Start
|
|
95
|
+
|
|
96
|
+
### Starting from Scratch
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# 1. Install globally
|
|
100
|
+
pipx install plane-compose
|
|
101
|
+
|
|
102
|
+
# 2. Initialize a new project
|
|
103
|
+
plane init my-project
|
|
104
|
+
|
|
105
|
+
# 3. Authenticate with Plane
|
|
106
|
+
plane auth login
|
|
107
|
+
# Enter API key from: https://app.plane.so/profile/api-tokens
|
|
108
|
+
|
|
109
|
+
# 4. Configure your workspace
|
|
110
|
+
cd my-project
|
|
111
|
+
vim plane.yaml # Set your workspace name
|
|
112
|
+
|
|
113
|
+
# 5. Push schema (creates project in Plane)
|
|
114
|
+
plane schema push
|
|
115
|
+
|
|
116
|
+
# 6. Add work items
|
|
117
|
+
vim work/inbox.yaml
|
|
118
|
+
|
|
119
|
+
# 7. Push work items
|
|
120
|
+
plane push
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Cloning Existing Project
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# 1. Clone project by UUID
|
|
127
|
+
plane clone abc-123-def-456 --workspace my-workspace
|
|
128
|
+
|
|
129
|
+
# 2. Navigate to project
|
|
130
|
+
cd <project-name>
|
|
131
|
+
|
|
132
|
+
# 3. Check what was pulled
|
|
133
|
+
cat .plane/remote/items.yaml
|
|
134
|
+
|
|
135
|
+
# 4. Make changes and push
|
|
136
|
+
vim work/inbox.yaml
|
|
137
|
+
plane push
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Complete Workflow
|
|
141
|
+
|
|
142
|
+
### 1. Initialize Project
|
|
143
|
+
```bash
|
|
144
|
+
plane init my-project --workspace myteam --project API
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
This creates:
|
|
148
|
+
```
|
|
149
|
+
my-project/
|
|
150
|
+
├── plane.yaml # Project configuration
|
|
151
|
+
├── schema/
|
|
152
|
+
│ ├── types.yaml # Work item types (task, bug, etc.)
|
|
153
|
+
│ ├── workflows.yaml # State machines
|
|
154
|
+
│ └── labels.yaml # Label definitions
|
|
155
|
+
├── work/
|
|
156
|
+
│ └── inbox.yaml # Work items to create
|
|
157
|
+
└── .plane/
|
|
158
|
+
└── state.json # Sync state (auto-managed)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 2. Authenticate
|
|
162
|
+
```bash
|
|
163
|
+
plane auth login
|
|
164
|
+
# Enter your API key from: https://app.plane.so/profile/api-tokens
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Check auth status:
|
|
168
|
+
```bash
|
|
169
|
+
plane auth whoami
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 3. Customize Schema (Optional)
|
|
173
|
+
Edit the schema files to match your workflow:
|
|
174
|
+
- `schema/types.yaml` - Define work item types
|
|
175
|
+
- `schema/workflows.yaml` - Define states and transitions
|
|
176
|
+
- `schema/labels.yaml` - Define labels
|
|
177
|
+
|
|
178
|
+
### 4. Push Schema
|
|
179
|
+
```bash
|
|
180
|
+
plane schema push
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
This will:
|
|
184
|
+
1. Create the project in Plane (if it doesn't exist)
|
|
185
|
+
2. Create work item types
|
|
186
|
+
3. Create states
|
|
187
|
+
4. Create labels
|
|
188
|
+
5. Update `plane.yaml` with project UUID
|
|
189
|
+
|
|
190
|
+
### 5. Add Work Items
|
|
191
|
+
Edit `work/inbox.yaml`:
|
|
192
|
+
```yaml
|
|
193
|
+
# With stable IDs (recommended)
|
|
194
|
+
- id: "auth-oauth"
|
|
195
|
+
title: Implement user authentication
|
|
196
|
+
type: task
|
|
197
|
+
priority: high
|
|
198
|
+
labels: [backend, feature]
|
|
199
|
+
state: todo
|
|
200
|
+
description: Add OAuth2 authentication
|
|
201
|
+
assignee: dev@example.com
|
|
202
|
+
watchers:
|
|
203
|
+
- pm@example.com
|
|
204
|
+
- qa@example.com
|
|
205
|
+
|
|
206
|
+
- id: "bug-login-css"
|
|
207
|
+
title: Fix login button CSS
|
|
208
|
+
type: bug
|
|
209
|
+
priority: medium
|
|
210
|
+
labels: [frontend, bug]
|
|
211
|
+
state: backlog
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### 6. Push Work Items
|
|
215
|
+
```bash
|
|
216
|
+
# Preview what will be pushed
|
|
217
|
+
plane push --dry-run
|
|
218
|
+
|
|
219
|
+
# Push to Plane
|
|
220
|
+
plane push
|
|
221
|
+
|
|
222
|
+
# Or use sync (schema + work items together)
|
|
223
|
+
plane sync
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 7. Check Status & Rate Limits
|
|
227
|
+
```bash
|
|
228
|
+
# Show sync status
|
|
229
|
+
plane status
|
|
230
|
+
|
|
231
|
+
# Show rate limit stats
|
|
232
|
+
plane rate stats
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## 📚 Commands
|
|
236
|
+
|
|
237
|
+
### Project Management
|
|
238
|
+
- `plane init [path]` - Initialize new project structure locally
|
|
239
|
+
- `plane status` - Show current sync status
|
|
240
|
+
- `plane clone <uuid>` - Clone existing project from Plane by UUID
|
|
241
|
+
|
|
242
|
+
### Authentication
|
|
243
|
+
- `plane auth login` - Authenticate with API key
|
|
244
|
+
- `plane auth whoami` - Show current user info
|
|
245
|
+
- `plane auth logout` - Remove stored credentials
|
|
246
|
+
|
|
247
|
+
### Schema Management
|
|
248
|
+
- `plane schema validate` - Validate local schema files
|
|
249
|
+
- `plane schema push` - Create/update project schema in Plane
|
|
250
|
+
- `plane schema push --dry-run` - Preview schema changes
|
|
251
|
+
|
|
252
|
+
### Work Items - Collaborative Mode
|
|
253
|
+
- `plane push` - Push new/updated work items (additive only)
|
|
254
|
+
- `plane push --dry-run` - Preview what will be pushed
|
|
255
|
+
- `plane push --force` - Push without confirmation
|
|
256
|
+
- `plane pull` - Pull work items from Plane to `.plane/remote/items.yaml`
|
|
257
|
+
- `plane sync` - Run `schema push` + `push` together
|
|
258
|
+
|
|
259
|
+
### Work Items - Declarative Mode
|
|
260
|
+
- `plane apply` - Declarative sync with delete support (scope-based)
|
|
261
|
+
- `plane apply --dry-run` - Preview creates/updates/deletes
|
|
262
|
+
- `plane apply --force` - Apply without confirmation
|
|
263
|
+
|
|
264
|
+
### Monitoring
|
|
265
|
+
- `plane rate stats` - Show rate limit statistics
|
|
266
|
+
- `plane rate reset` - Reset rate limit statistics
|
|
267
|
+
|
|
268
|
+
### Global Options
|
|
269
|
+
- `--verbose` / `-v` - Enable verbose output
|
|
270
|
+
- `--debug` - Enable debug logging (saves to `~/.config/plane-cli/plane.log`)
|
|
271
|
+
|
|
272
|
+
## Project Structure
|
|
273
|
+
|
|
274
|
+
### plane.yaml
|
|
275
|
+
```yaml
|
|
276
|
+
workspace: myteam
|
|
277
|
+
project:
|
|
278
|
+
key: API # Short key or UUID
|
|
279
|
+
name: API Project
|
|
280
|
+
|
|
281
|
+
defaults:
|
|
282
|
+
type: task
|
|
283
|
+
workflow: standard
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### schema/types.yaml
|
|
287
|
+
```yaml
|
|
288
|
+
task:
|
|
289
|
+
description: A single unit of work
|
|
290
|
+
workflow: standard
|
|
291
|
+
fields:
|
|
292
|
+
- name: title
|
|
293
|
+
type: string
|
|
294
|
+
required: true
|
|
295
|
+
- name: priority
|
|
296
|
+
type: enum
|
|
297
|
+
options: [none, low, medium, high, urgent]
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### schema/workflows.yaml
|
|
301
|
+
```yaml
|
|
302
|
+
standard:
|
|
303
|
+
states:
|
|
304
|
+
- name: backlog
|
|
305
|
+
group: unstarted
|
|
306
|
+
color: "#858585"
|
|
307
|
+
- name: in_progress
|
|
308
|
+
group: started
|
|
309
|
+
color: "#f59e0b"
|
|
310
|
+
- name: done
|
|
311
|
+
group: completed
|
|
312
|
+
color: "#22c55e"
|
|
313
|
+
initial: backlog
|
|
314
|
+
terminal: [done]
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### schema/labels.yaml
|
|
318
|
+
```yaml
|
|
319
|
+
groups:
|
|
320
|
+
area:
|
|
321
|
+
color: "#3b82f6"
|
|
322
|
+
labels:
|
|
323
|
+
- name: frontend
|
|
324
|
+
- name: backend
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### work/inbox.yaml
|
|
328
|
+
```yaml
|
|
329
|
+
- title: Work item title
|
|
330
|
+
type: task
|
|
331
|
+
priority: high
|
|
332
|
+
labels: [backend, feature]
|
|
333
|
+
state: todo
|
|
334
|
+
description: Optional description
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## ⚙️ Configuration
|
|
338
|
+
|
|
339
|
+
### API Key
|
|
340
|
+
Get your API key from: https://app.plane.so/profile/api-tokens
|
|
341
|
+
|
|
342
|
+
Stored securely at: `~/.config/plane-compose/credentials`
|
|
343
|
+
|
|
344
|
+
### Workspace
|
|
345
|
+
Find your workspace slug in the Plane URL: `https://app.plane.so/{workspace}`
|
|
346
|
+
|
|
347
|
+
### Environment Variables
|
|
348
|
+
|
|
349
|
+
All settings can be customized via environment variables:
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
# API Configuration
|
|
353
|
+
export PLANE_API_URL="https://api.plane.so"
|
|
354
|
+
export PLANE_API_TIMEOUT=30
|
|
355
|
+
|
|
356
|
+
# Rate Limiting
|
|
357
|
+
export PLANE_RATE_LIMIT_PER_MINUTE=50
|
|
358
|
+
|
|
359
|
+
# Debugging
|
|
360
|
+
export PLANE_DEBUG=true
|
|
361
|
+
export PLANE_VERBOSE=true
|
|
362
|
+
export PLANE_LOG_TO_FILE=true
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### plane.yaml Options
|
|
366
|
+
|
|
367
|
+
```yaml
|
|
368
|
+
workspace: my-workspace
|
|
369
|
+
project:
|
|
370
|
+
key: PROJ # User-defined short key
|
|
371
|
+
uuid: abc-123 # Auto-added after schema push
|
|
372
|
+
name: My Project
|
|
373
|
+
|
|
374
|
+
defaults:
|
|
375
|
+
type: task
|
|
376
|
+
workflow: standard
|
|
377
|
+
|
|
378
|
+
# Optional: Declarative scope for 'plane apply'
|
|
379
|
+
apply_scope:
|
|
380
|
+
labels: ["automated"]
|
|
381
|
+
assignee: "bot@example.com"
|
|
382
|
+
id_prefix: "AUTO-"
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## 🔧 Troubleshooting
|
|
386
|
+
|
|
387
|
+
### Common Issues
|
|
388
|
+
|
|
389
|
+
**Authentication Failed (401)**
|
|
390
|
+
```bash
|
|
391
|
+
plane auth logout
|
|
392
|
+
plane auth login
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
**Permission Denied (403)**
|
|
396
|
+
- Verify you're a member/admin of the workspace
|
|
397
|
+
- Check with workspace administrator
|
|
398
|
+
- Try: `plane auth whoami`
|
|
399
|
+
|
|
400
|
+
**Project Not Found (404)**
|
|
401
|
+
```bash
|
|
402
|
+
# Remove stale UUID from plane.yaml
|
|
403
|
+
vim plane.yaml # Delete uuid line
|
|
404
|
+
|
|
405
|
+
# Recreate/find project
|
|
406
|
+
plane schema push
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Rate Limit Exceeded (429)**
|
|
410
|
+
```bash
|
|
411
|
+
# Check rate limit status
|
|
412
|
+
plane rate stats
|
|
413
|
+
|
|
414
|
+
# Wait and retry, or reduce rate:
|
|
415
|
+
export PLANE_RATE_LIMIT_PER_MINUTE=30
|
|
416
|
+
plane push
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Duplicate Work Items**
|
|
420
|
+
```yaml
|
|
421
|
+
# Always use stable IDs:
|
|
422
|
+
- id: "unique-identifier"
|
|
423
|
+
title: "My task"
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
**State Corruption**
|
|
427
|
+
```bash
|
|
428
|
+
# Backup and reset state
|
|
429
|
+
cp .plane/state.json .plane/state.json.backup
|
|
430
|
+
rm .plane/state.json
|
|
431
|
+
plane pull
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
**Debug Mode**
|
|
435
|
+
```bash
|
|
436
|
+
# Enable verbose logging
|
|
437
|
+
plane --debug push
|
|
438
|
+
|
|
439
|
+
# View logs
|
|
440
|
+
tail -f ~/.config/plane-compose/plane.log
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
For more help, see [`docs/troubleshooting.md`](docs/troubleshooting.md)
|
|
444
|
+
|
|
445
|
+
## 🛠️ Development
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
# Clone repository
|
|
449
|
+
git clone https://github.com/makeplane/compose.git
|
|
450
|
+
cd compose
|
|
451
|
+
|
|
452
|
+
# Create virtual environment
|
|
453
|
+
python3 -m venv venv
|
|
454
|
+
source venv/bin/activate
|
|
455
|
+
|
|
456
|
+
# Install in development mode with dev dependencies
|
|
457
|
+
pip install -e ".[dev]"
|
|
458
|
+
|
|
459
|
+
# Run tests
|
|
460
|
+
pytest
|
|
461
|
+
pytest --cov=planecompose --cov-report=html
|
|
462
|
+
|
|
463
|
+
# Format code
|
|
464
|
+
black src/ tests/
|
|
465
|
+
|
|
466
|
+
# Lint
|
|
467
|
+
ruff check src/
|
|
468
|
+
|
|
469
|
+
# Type check
|
|
470
|
+
mypy src/planecompose/
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Architecture
|
|
474
|
+
|
|
475
|
+
Plane Compose follows clean architecture principles:
|
|
476
|
+
|
|
477
|
+
```
|
|
478
|
+
src/planecompose/
|
|
479
|
+
├── cli/ # CLI commands (presentation layer)
|
|
480
|
+
├── backend/ # Backend abstraction (data access layer)
|
|
481
|
+
├── core/ # Domain models (Pydantic)
|
|
482
|
+
├── sync/ # Business logic (sync orchestration)
|
|
483
|
+
├── diff/ # Change detection
|
|
484
|
+
├── parser/ # YAML parsing
|
|
485
|
+
├── utils/ # Utilities (rate limiting, logging)
|
|
486
|
+
├── config/ # Configuration management
|
|
487
|
+
└── exceptions.py # Custom exception hierarchy
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
See [`docs/architecture.md`](docs/architecture.md) and [`docs/development.md`](docs/development.md) for more details.
|
|
491
|
+
|
|
492
|
+
## License
|
|
493
|
+
|
|
494
|
+
AGPLv3 License - see LICENSE.txt file for details.
|
|
495
|
+
|
|
496
|
+
## 📖 Documentation
|
|
497
|
+
|
|
498
|
+
- [Architecture Guide](docs/architecture.md) - System design and principles
|
|
499
|
+
- [Development Guide](docs/development.md) - Contributing and development
|
|
500
|
+
- [Examples](docs/examples.md) - Common workflows and patterns
|
|
501
|
+
- [Troubleshooting](docs/troubleshooting.md) - Common issues and solutions
|
|
502
|
+
|
|
503
|
+
## 🔗 Links
|
|
504
|
+
|
|
505
|
+
- [Plane](https://plane.so) - Main website
|
|
506
|
+
- [Plane API Documentation](https://docs.plane.so/api) - API reference
|
|
507
|
+
- [Plane Python SDK](https://github.com/makeplane/plane-python-sdk) - Official SDK
|
|
508
|
+
- [GitHub Repository](https://github.com/makeplane/compose) - Source code
|
|
509
|
+
- [Issue Tracker](https://github.com/makeplane/compose/issues) - Report bugs
|
|
510
|
+
|
|
511
|
+
## 📄 License
|
|
512
|
+
|
|
513
|
+
AGPLv3 License - see [LICENSE.txt](LICENSE.txt) file for details.
|
|
514
|
+
|
|
515
|
+
## 🙏 Acknowledgments
|
|
516
|
+
|
|
517
|
+
- Built with [Typer](https://typer.tiangolo.com/) for CLI
|
|
518
|
+
- [Rich](https://rich.readthedocs.io/) for beautiful terminal output
|
|
519
|
+
- [Pydantic](https://docs.pydantic.dev/) for data validation
|
|
520
|
+
- [Plane SDK](https://github.com/makeplane/plane-python-sdk) for API access
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
**Made with ❤️ for the Plane community**
|
|
525
|
+
|
|
526
|
+
*Contributions welcome! See [docs/development.md](docs/development.md) for guidelines.*
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
planecompose/__init__.py,sha256=ixX08JqxNxjGs7utGBDfBqJVpX3hYJExl9f0cKZJo7A,79
|
|
2
|
+
planecompose/exceptions.py,sha256=QytPGAydFnAPDIvkak34OP0YH7XBvm_iI-Px-2clD5M,4659
|
|
3
|
+
planecompose/main.py,sha256=MyVDJPiM7zMdqStoqe7qL1Al4Y0fn-KLVCiSWFCmx0Y,112
|
|
4
|
+
planecompose/automations/__init__.py,sha256=oO4Oh1sRH7rmb1NHEKN973yjueSt3V4iwckg2QKLYA0,506
|
|
5
|
+
planecompose/automations/actions.py,sha256=FG74gRwFVqHUm_j7qBpFWMmprb2TZF5d6iWibghB_X8,9384
|
|
6
|
+
planecompose/automations/engine.py,sha256=fFAatcglIFGWlP1ubERE-RoKkzBHaUfZLRd206P3mEI,13740
|
|
7
|
+
planecompose/automations/evaluator.py,sha256=qKUaw3qt-uWy2Bo43YNGrlcaYJrvtZJ8gaWu_PGiy0w,17970
|
|
8
|
+
planecompose/automations/models.py,sha256=vRSiIbPyv3__lXZWdgR1yF9y5rnFwGfoGkfElMDMUyA,8281
|
|
9
|
+
planecompose/automations/parser.py,sha256=_5kpss5_AfnrjOyKVQh0X3RXrAJX2NOouA8qrlRnivE,5237
|
|
10
|
+
planecompose/automations/runner.py,sha256=y8kQxu0YgCC3gPjQIwVeDO5UIANLXM4BlF5fIkvgbaM,8888
|
|
11
|
+
planecompose/automations/visualizer.py,sha256=xsbbEmUSqHgxWeVgtx_SlVNu7ZPWPtpFcDLMy-2Tz88,21917
|
|
12
|
+
planecompose/backend/__init__.py,sha256=AM3YNMSnlc9NPGQh981kvexwWUKmpFEiNyPHT1nMhB0,30
|
|
13
|
+
planecompose/backend/base.py,sha256=5E18ebOo947m6oGiGIVHhYkiuJqAdta_yGppbiogKH0,1497
|
|
14
|
+
planecompose/backend/plane.py,sha256=w19ch_8fHuf_utlVBegrgrR0nPDSPD6NwXamkGv-arw,51427
|
|
15
|
+
planecompose/cli/__init__.py,sha256=7fbyhqC41_YxJ74bujMzplPI1mzskfNpplc372ZlnUY,19
|
|
16
|
+
planecompose/cli/auth.py,sha256=nNhQsMZtSvmgk9DIiByVMNr4wF38SMuZY6KPDU0OrsU,3386
|
|
17
|
+
planecompose/cli/automations.py,sha256=T76lTtVgsb6FkHQ2A9OvA1EocFqdsZP_Vt3k5RXJTN0,26219
|
|
18
|
+
planecompose/cli/clone.py,sha256=7gpbDgELfHqiY2Nw7un2REB4YdftW3oK4Gby5VVoUaA,23072
|
|
19
|
+
planecompose/cli/init.py,sha256=_GZW_vWKVYDsG5jJ6R5k7GWH3l2LBPBvYRfhYPW0FMM,5692
|
|
20
|
+
planecompose/cli/pull.py,sha256=BtQi2CLJ6PbTugkp6YfZ8MDplNZLlAXtCmuzm9ofxIA,16572
|
|
21
|
+
planecompose/cli/push.py,sha256=PsNb0OwsBDMaIXOFNSwFRb73LWoe3GMfagfvXcwQNoU,14537
|
|
22
|
+
planecompose/cli/rate_stats.py,sha256=9HlhUhYsGsGTHjFGCbTAbEdjxXXId3uxvFZhtcvvuYo,3044
|
|
23
|
+
planecompose/cli/root.py,sha256=JFYxfwwWDFjhqiAHsxY2jYOjSobTgERFMS_tatb1urM,2551
|
|
24
|
+
planecompose/cli/schema.py,sha256=Z3qEOwgoVKlfOBZnVE2qon7B-H7mqVNCfBPmv8sD7Ek,34340
|
|
25
|
+
planecompose/cli/status.py,sha256=jNxZp34uTeBfr_pFitOuhW5Tqijo9IbKd9lNZnlvS48,4525
|
|
26
|
+
planecompose/config/__init__.py,sha256=1qDu1VGIOBcEaX82xXuryU6-EAF-IMJ17Qfg_doMyBk,31
|
|
27
|
+
planecompose/config/context.py,sha256=tnhZFwuujPl0eTyMSl5ofCQNfTkUxuLegDRVkS9jPJM,3510
|
|
28
|
+
planecompose/config/settings.py,sha256=u4LmOztuCIIpBVOx0Cxr38JBZy7BNAEVJ4a-neBQzMM,3249
|
|
29
|
+
planecompose/core/__init__.py,sha256=fpMeZhK94FUCjMn8qWdsKatx0fdknG8v6cKjF5RP1uU,25
|
|
30
|
+
planecompose/core/models.py,sha256=6U7aK1bGLqJwDHg5WtZR9fQZa4j-HjKPb9tjoUgsNPk,4721
|
|
31
|
+
planecompose/diff/__init__.py,sha256=Yg65HhEnRyDLIV9_p5prHxgWeb97nicnhranc2RcGzQ,18
|
|
32
|
+
planecompose/parser/__init__.py,sha256=SewiATfaySZvxDTGg3zdZl4FwfWRWZatxXT8Z34io08,19
|
|
33
|
+
planecompose/parser/labels_yaml.py,sha256=uT8XtAsaKBDMTe7vkU1cLRfOC88mBnLFJGXRXyqT2NU,1019
|
|
34
|
+
planecompose/parser/plane_yaml.py,sha256=8Tuu0N62VXb833UUtIDMAVzGrCpy3LTkwQoVoopG-5k,750
|
|
35
|
+
planecompose/parser/types_yaml.py,sha256=JLq7s2bpQrptr0EdpgK21ldeVV5wNyV9N7OPeB690eE,3264
|
|
36
|
+
planecompose/parser/work_yaml.py,sha256=gfFrsIJmAPTm3cVp7Ke2BwMjGlur0OXpYWTjplOdVa0,2835
|
|
37
|
+
planecompose/parser/workflows_yaml.py,sha256=PgA1gUiibk6i-HHc7C0sbc76zKyujiTU_9m5S7Bz0bg,1016
|
|
38
|
+
planecompose/sync/__init__.py,sha256=Q9ZkkvPPDBYCvL4-P0KcsIW3beKDNya7BNFJ3RGlrl4,25
|
|
39
|
+
planecompose/utils/__init__.py,sha256=nj34D521dMrS4-iEKSDWm4RQY0kGpzb_9wpMKJDYXIE,16
|
|
40
|
+
planecompose/utils/errors.py,sha256=RRk5izD3i8QxvR7tHlgKrIz2paUlycrmIZO76JLGlVY,8115
|
|
41
|
+
planecompose/utils/http_client.py,sha256=EJ-2T2zkGiRUnmjwlY-Iz2x8yZANuBrcd7eXqFBpX6w,3177
|
|
42
|
+
planecompose/utils/logger.py,sha256=Nez8WKDAqEkFJgMYSE9HSPGnXcdhFIEllCqarWyGS2Y,2633
|
|
43
|
+
planecompose/utils/project.py,sha256=xTVyZ8Dl23wIWJDJFxEhgctZtcSTqKH7lIVXQYwr3hQ,5694
|
|
44
|
+
planecompose/utils/rate_limit.py,sha256=-uPvdiKnzRXp0iecu7V4Tib1e40YQwQi8TLD6Z-y5K8,4502
|
|
45
|
+
planecompose/utils/work_items.py,sha256=dcd4BfnlmN_Tgjhj7wxk-QUorXyCnQD_W83_GiuS3qU,1985
|
|
46
|
+
planecompose/validation/__init__.py,sha256=9wnY_q3c63VDtJdKXt3_uTVUtKXiJ7IJ0tmvWQfBPmE,23
|
|
47
|
+
plane_compose-0.1.0.dist-info/METADATA,sha256=pDYtVUZnswE16lQIK_d1UseZw5gkGz8sOGNQXSXrfkQ,13373
|
|
48
|
+
plane_compose-0.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
49
|
+
plane_compose-0.1.0.dist-info/entry_points.txt,sha256=GPcCO-ke7osAOFLVmc7BIlbNmK6pxSsX0pSWfFjVesg,48
|
|
50
|
+
plane_compose-0.1.0.dist-info/licenses/LICENSE.txt,sha256=3Rb6lO2YWrXMNXCwNpmeMaSaxz1gGkdDztXtlKRxGyk,34571
|
|
51
|
+
plane_compose-0.1.0.dist-info/RECORD,,
|