planflow-plugin 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/bin/cli.js +169 -0
- package/bin/postinstall.js +87 -0
- package/commands/pfActivity/SKILL.md +725 -0
- package/commands/pfAssign/SKILL.md +623 -0
- package/commands/pfCloudLink/SKILL.md +192 -0
- package/commands/pfCloudList/SKILL.md +222 -0
- package/commands/pfCloudNew/SKILL.md +187 -0
- package/commands/pfCloudUnlink/SKILL.md +152 -0
- package/commands/pfComment/SKILL.md +227 -0
- package/commands/pfComments/SKILL.md +159 -0
- package/commands/pfConnectionStatus/SKILL.md +433 -0
- package/commands/pfDiscord/SKILL.md +740 -0
- package/commands/pfGithubBranch/SKILL.md +672 -0
- package/commands/pfGithubIssue/SKILL.md +963 -0
- package/commands/pfGithubLink/SKILL.md +859 -0
- package/commands/pfGithubPr/SKILL.md +1335 -0
- package/commands/pfGithubUnlink/SKILL.md +401 -0
- package/commands/pfLive/SKILL.md +185 -0
- package/commands/pfLogin/SKILL.md +249 -0
- package/commands/pfLogout/SKILL.md +155 -0
- package/commands/pfMyTasks/SKILL.md +198 -0
- package/commands/pfNotificationSettings/SKILL.md +619 -0
- package/commands/pfNotifications/SKILL.md +420 -0
- package/commands/pfNotificationsClear/SKILL.md +421 -0
- package/commands/pfReact/SKILL.md +232 -0
- package/commands/pfSlack/SKILL.md +659 -0
- package/commands/pfSyncPull/SKILL.md +210 -0
- package/commands/pfSyncPush/SKILL.md +299 -0
- package/commands/pfSyncStatus/SKILL.md +212 -0
- package/commands/pfTeamInvite/SKILL.md +161 -0
- package/commands/pfTeamList/SKILL.md +253 -0
- package/commands/pfTeamRemove/SKILL.md +115 -0
- package/commands/pfTeamRole/SKILL.md +160 -0
- package/commands/pfTestWebhooks/SKILL.md +722 -0
- package/commands/pfUnassign/SKILL.md +134 -0
- package/commands/pfWhoami/SKILL.md +258 -0
- package/commands/pfWorkload/SKILL.md +219 -0
- package/commands/planExportCsv/SKILL.md +106 -0
- package/commands/planExportGithub/SKILL.md +222 -0
- package/commands/planExportJson/SKILL.md +159 -0
- package/commands/planExportSummary/SKILL.md +158 -0
- package/commands/planNew/SKILL.md +641 -0
- package/commands/planNext/SKILL.md +1200 -0
- package/commands/planSettingsAutoSync/SKILL.md +199 -0
- package/commands/planSettingsLanguage/SKILL.md +201 -0
- package/commands/planSettingsReset/SKILL.md +237 -0
- package/commands/planSettingsShow/SKILL.md +482 -0
- package/commands/planSpec/SKILL.md +929 -0
- package/commands/planUpdate/SKILL.md +2518 -0
- package/commands/team/SKILL.md +740 -0
- package/locales/en.json +1499 -0
- package/locales/ka.json +1499 -0
- package/package.json +48 -0
- package/templates/PROJECT_PLAN.template.md +157 -0
- package/templates/backend-api.template.md +562 -0
- package/templates/frontend-spa.template.md +610 -0
- package/templates/fullstack.template.md +397 -0
- package/templates/ka/backend-api.template.md +562 -0
- package/templates/ka/frontend-spa.template.md +610 -0
- package/templates/ka/fullstack.template.md +397 -0
- package/templates/sections/architecture.md +21 -0
- package/templates/sections/overview.md +15 -0
- package/templates/sections/tasks.md +22 -0
- package/templates/sections/tech-stack.md +19 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pfUnassign
|
|
3
|
+
description: Remove assignment from a task in the current PlanFlow project
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PlanFlow Task Unassignment
|
|
7
|
+
|
|
8
|
+
Remove the assignee from a task in the linked cloud project with unassignment card.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
/pfUnassign <task-id> # Remove assignment from task
|
|
14
|
+
/pfUnassign T2.1 # Example
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Step 0: Load Configuration
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
// ... standard config loading ...
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Step 1: Show Usage Card (if no arguments)
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
27
|
+
│ 📋 Task Unassignment │
|
|
28
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
29
|
+
│ │
|
|
30
|
+
│ ── Usage ─────────────────────────────────────────────────────────────── │
|
|
31
|
+
│ │
|
|
32
|
+
│ /pfUnassign <task-id> Remove assignment from task │
|
|
33
|
+
│ │
|
|
34
|
+
│ ── Example ──────────────────────────────────────────────────────────── │
|
|
35
|
+
│ │
|
|
36
|
+
│ /pfUnassign T2.1 │
|
|
37
|
+
│ │
|
|
38
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Step 2: Display Success Card
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
45
|
+
│ ✅ SUCCESS │
|
|
46
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
47
|
+
│ │
|
|
48
|
+
│ Assignment removed! │
|
|
49
|
+
│ │
|
|
50
|
+
│ ── Unassignment Details ─────────────────────────────────────────────── │
|
|
51
|
+
│ │
|
|
52
|
+
│ 📋 Task: T2.1: Implement login API │
|
|
53
|
+
│ 👤 Removed from: Jane Smith (jane@company.com) │
|
|
54
|
+
│ 📁 Project: Planflow Plugin │
|
|
55
|
+
│ │
|
|
56
|
+
│ ╭───────────────────╮ │
|
|
57
|
+
│ │ ✓ Unassigned │ │
|
|
58
|
+
│ ╰───────────────────╯ │
|
|
59
|
+
│ │
|
|
60
|
+
│ The task is now available for anyone to pick up. │
|
|
61
|
+
│ │
|
|
62
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
63
|
+
│ │
|
|
64
|
+
│ 💡 {t.ui.labels.commands} │
|
|
65
|
+
│ • /pfAssign T2.1 <email> Reassign to someone │
|
|
66
|
+
│ • /pfAssign T2.1 me Assign to yourself │
|
|
67
|
+
│ │
|
|
68
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
69
|
+
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Error Handling
|
|
73
|
+
|
|
74
|
+
**Task Not Found Card (404):**
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
78
|
+
│ ❌ ERROR │
|
|
79
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
80
|
+
│ │
|
|
81
|
+
│ Task not found: T2.1 │
|
|
82
|
+
│ │
|
|
83
|
+
│ Make sure the task exists in the cloud project. │
|
|
84
|
+
│ │
|
|
85
|
+
│ 💡 Run /pfSyncPush to sync your local tasks first. │
|
|
86
|
+
│ │
|
|
87
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Task Not Assigned Card (400):**
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
94
|
+
│ ⚠️ WARNING │
|
|
95
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
96
|
+
│ │
|
|
97
|
+
│ Task T2.1 has no assignee. │
|
|
98
|
+
│ │
|
|
99
|
+
│ This task is not currently assigned to anyone. │
|
|
100
|
+
│ │
|
|
101
|
+
│ 💡 To assign it: │
|
|
102
|
+
│ • /pfAssign T2.1 <email> │
|
|
103
|
+
│ │
|
|
104
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Permission Denied Card (403):**
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
111
|
+
│ ❌ ERROR │
|
|
112
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
113
|
+
│ │
|
|
114
|
+
│ You don't have permission to unassign tasks. │
|
|
115
|
+
│ │
|
|
116
|
+
│ Only editors and above can modify task assignments. │
|
|
117
|
+
│ │
|
|
118
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Invalid Task ID Card:**
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
125
|
+
│ ❌ ERROR │
|
|
126
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
127
|
+
│ │
|
|
128
|
+
│ Invalid task ID format. │
|
|
129
|
+
│ │
|
|
130
|
+
│ Task ID should be like: T1.1, T2.3, T10.5 │
|
|
131
|
+
│ │
|
|
132
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
133
|
+
```
|
|
134
|
+
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pfWhoami
|
|
3
|
+
description: PlanFlow Who Am I
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PlanFlow Who Am I
|
|
7
|
+
|
|
8
|
+
Display current PlanFlow user information and connection status with modern card UI.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
/pfWhoami # Show current user info
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Step 0: Load Configuration
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
function getConfig() {
|
|
20
|
+
const globalConfigPath = expandPath("~/.config/claude/plan-plugin-config.json")
|
|
21
|
+
if (fileExists(globalConfigPath)) {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(readFile(globalConfigPath))
|
|
24
|
+
} catch (error) {}
|
|
25
|
+
}
|
|
26
|
+
return { "language": "en" }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const config = getConfig()
|
|
30
|
+
const language = config.language || "en"
|
|
31
|
+
const cloudConfig = config.cloud || {}
|
|
32
|
+
const isAuthenticated = !!cloudConfig.apiToken
|
|
33
|
+
const apiUrl = cloudConfig.apiUrl || "https://api.planflow.tools"
|
|
34
|
+
|
|
35
|
+
const t = JSON.parse(readFile(`locales/${language}.json`))
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Step 1: Check Auth Status
|
|
39
|
+
|
|
40
|
+
If not authenticated, display error card:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
44
|
+
│ ❌ {t.ui.alerts.error} │
|
|
45
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
46
|
+
│ │
|
|
47
|
+
│ {t.commands.whoami.notLoggedIn} │
|
|
48
|
+
│ │
|
|
49
|
+
│ 💡 {t.ui.labels.nextSteps} │
|
|
50
|
+
│ • /pfLogin │
|
|
51
|
+
│ │
|
|
52
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Step 2: Get User Info from API
|
|
56
|
+
|
|
57
|
+
**API Call:**
|
|
58
|
+
```bash
|
|
59
|
+
curl -s \
|
|
60
|
+
-H "Authorization: Bearer {TOKEN}" \
|
|
61
|
+
"https://api.planflow.tools/auth/me"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Response:**
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"success": true,
|
|
68
|
+
"data": {
|
|
69
|
+
"id": "uuid",
|
|
70
|
+
"email": "user@example.com",
|
|
71
|
+
"name": "John Doe",
|
|
72
|
+
"projectCount": 5
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Step 3: Display User Info Card
|
|
78
|
+
|
|
79
|
+
**Output Format:**
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
83
|
+
│ 👤 {t.commands.whoami.title} │
|
|
84
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
85
|
+
│ │
|
|
86
|
+
│ {t.commands.whoami.name} John Doe │
|
|
87
|
+
│ {t.commands.whoami.email} user@example.com │
|
|
88
|
+
│ {t.commands.whoami.userId} uuid-1234-5678-abcd │
|
|
89
|
+
│ {t.commands.whoami.apiUrl} https://api.planflow.tools │
|
|
90
|
+
│ │
|
|
91
|
+
│ ── {t.commands.whoami.status} ────────────────────────────────────────── │
|
|
92
|
+
│ │
|
|
93
|
+
│ ╭────────────────╮ │
|
|
94
|
+
│ │ ✓ {t.commands.whoami.connected} │ │
|
|
95
|
+
│ ╰────────────────╯ │
|
|
96
|
+
│ │
|
|
97
|
+
│ ── {t.commands.whoami.cloudStats} ───────────────────────────────────── │
|
|
98
|
+
│ │
|
|
99
|
+
│ {t.commands.whoami.projects} 5 │
|
|
100
|
+
│ │
|
|
101
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
102
|
+
│ │
|
|
103
|
+
│ 💡 {t.ui.labels.quickActions} │
|
|
104
|
+
│ • /pfCloudList View your projects │
|
|
105
|
+
│ • /pfSyncStatus Check sync status │
|
|
106
|
+
│ • /pfLogout Sign out │
|
|
107
|
+
│ │
|
|
108
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
109
|
+
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Example Output (English):**
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
116
|
+
│ 👤 Current User │
|
|
117
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
118
|
+
│ │
|
|
119
|
+
│ Name: John Doe │
|
|
120
|
+
│ Email: user@example.com │
|
|
121
|
+
│ User ID: uuid-1234-5678-abcd │
|
|
122
|
+
│ API URL: https://api.planflow.tools │
|
|
123
|
+
│ │
|
|
124
|
+
│ ── Status ────────────────────────────────────────────────────────────── │
|
|
125
|
+
│ │
|
|
126
|
+
│ ╭────────────────╮ │
|
|
127
|
+
│ │ ✓ Connected │ │
|
|
128
|
+
│ ╰────────────────╯ │
|
|
129
|
+
│ │
|
|
130
|
+
│ ── Cloud Stats ───────────────────────────────────────────────────────── │
|
|
131
|
+
│ │
|
|
132
|
+
│ Projects: 5 │
|
|
133
|
+
│ │
|
|
134
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
135
|
+
│ │
|
|
136
|
+
│ 💡 Quick Actions: │
|
|
137
|
+
│ • /pfCloudList View your projects │
|
|
138
|
+
│ • /pfSyncStatus Check sync status │
|
|
139
|
+
│ • /pfLogout Sign out │
|
|
140
|
+
│ │
|
|
141
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
142
|
+
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Example Output (Georgian):**
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
149
|
+
│ 👤 მიმდინარე მომხმარებელი │
|
|
150
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
151
|
+
│ │
|
|
152
|
+
│ სახელი: John Doe │
|
|
153
|
+
│ ელ-ფოსტა: user@example.com │
|
|
154
|
+
│ მომხმარებლის ID: uuid-1234-5678-abcd │
|
|
155
|
+
│ API URL: https://api.planflow.tools │
|
|
156
|
+
│ │
|
|
157
|
+
│ ── სტატუსი ───────────────────────────────────────────────────────────── │
|
|
158
|
+
│ │
|
|
159
|
+
│ ╭─────────────────────╮ │
|
|
160
|
+
│ │ ✓ დაკავშირებულია │ │
|
|
161
|
+
│ ╰─────────────────────╯ │
|
|
162
|
+
│ │
|
|
163
|
+
│ ── Cloud სტატისტიკა ──────────────────────────────────────────────────── │
|
|
164
|
+
│ │
|
|
165
|
+
│ პროექტები: 5 │
|
|
166
|
+
│ │
|
|
167
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
168
|
+
│ │
|
|
169
|
+
│ 💡 სწრაფი მოქმედებები: │
|
|
170
|
+
│ • /pfCloudList პროექტების ნახვა │
|
|
171
|
+
│ • /pfSyncStatus სინქრონიზაციის სტატუსი │
|
|
172
|
+
│ • /pfLogout გამოსვლა │
|
|
173
|
+
│ │
|
|
174
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
175
|
+
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Error Handling
|
|
179
|
+
|
|
180
|
+
**Token Expired Card:**
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
184
|
+
│ ❌ ERROR │
|
|
185
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
186
|
+
│ │
|
|
187
|
+
│ Session expired. Please login again. │
|
|
188
|
+
│ │
|
|
189
|
+
│ 💡 Next Steps: │
|
|
190
|
+
│ • /pfLogin Re-authenticate │
|
|
191
|
+
│ │
|
|
192
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Network Error Card:**
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
199
|
+
│ ❌ ERROR │
|
|
200
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
201
|
+
│ │
|
|
202
|
+
│ Could not connect to PlanFlow API. │
|
|
203
|
+
│ │
|
|
204
|
+
│ Please check your internet connection and try again. │
|
|
205
|
+
│ │
|
|
206
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Pseudo-code for Rendering
|
|
210
|
+
|
|
211
|
+
```javascript
|
|
212
|
+
function renderWhoamiCard(userData, t) {
|
|
213
|
+
const width = 80
|
|
214
|
+
const innerWidth = width - 4
|
|
215
|
+
|
|
216
|
+
let output = ""
|
|
217
|
+
|
|
218
|
+
// Top border
|
|
219
|
+
output += "╭" + "─".repeat(width - 2) + "╮\n"
|
|
220
|
+
|
|
221
|
+
// Title
|
|
222
|
+
const title = `👤 ${t.commands.whoami.title}`
|
|
223
|
+
output += "│ " + title.padEnd(innerWidth) + "│\n"
|
|
224
|
+
|
|
225
|
+
// Divider
|
|
226
|
+
output += "├" + "─".repeat(width - 2) + "┤\n"
|
|
227
|
+
|
|
228
|
+
// Empty line
|
|
229
|
+
output += "│" + " ".repeat(width - 2) + "│\n"
|
|
230
|
+
|
|
231
|
+
// User info
|
|
232
|
+
const labelWidth = 12
|
|
233
|
+
output += `│ ${t.commands.whoami.name.padEnd(labelWidth)} ${userData.name.padEnd(innerWidth - labelWidth - 2)}│\n`
|
|
234
|
+
output += `│ ${t.commands.whoami.email.padEnd(labelWidth)} ${userData.email.padEnd(innerWidth - labelWidth - 2)}│\n`
|
|
235
|
+
output += `│ ${t.commands.whoami.userId.padEnd(labelWidth)} ${userData.id.padEnd(innerWidth - labelWidth - 2)}│\n`
|
|
236
|
+
output += `│ ${t.commands.whoami.apiUrl.padEnd(labelWidth)} ${apiUrl.padEnd(innerWidth - labelWidth - 2)}│\n`
|
|
237
|
+
|
|
238
|
+
// Empty line
|
|
239
|
+
output += "│" + " ".repeat(width - 2) + "│\n"
|
|
240
|
+
|
|
241
|
+
// Status section header
|
|
242
|
+
output += `│ ── ${t.commands.whoami.status} ${"─".repeat(innerWidth - t.commands.whoami.status.length - 6)}│\n`
|
|
243
|
+
output += "│" + " ".repeat(width - 2) + "│\n"
|
|
244
|
+
|
|
245
|
+
// Status badge
|
|
246
|
+
const statusText = `✓ ${t.commands.whoami.connected}`
|
|
247
|
+
output += `│ ╭${"─".repeat(statusText.length + 2)}╮${"".padEnd(innerWidth - statusText.length - 6)}│\n`
|
|
248
|
+
output += `│ │ ${statusText} │${"".padEnd(innerWidth - statusText.length - 6)}│\n`
|
|
249
|
+
output += `│ ╰${"─".repeat(statusText.length + 2)}╯${"".padEnd(innerWidth - statusText.length - 6)}│\n`
|
|
250
|
+
|
|
251
|
+
// ... continue with cloud stats and actions
|
|
252
|
+
|
|
253
|
+
// Shadow
|
|
254
|
+
output += " " + "░".repeat(width - 1) + "\n"
|
|
255
|
+
|
|
256
|
+
return output
|
|
257
|
+
}
|
|
258
|
+
```
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pfWorkload
|
|
3
|
+
description: View team workload distribution for the current PlanFlow project
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PlanFlow Team Workload
|
|
7
|
+
|
|
8
|
+
Display team workload distribution with visual progress bars for each team member.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
/pfWorkload # Show team workload overview
|
|
14
|
+
/pfWorkload --details # Show detailed task breakdown per member
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Step 0: Load Configuration
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
// ... standard config loading ...
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Step 0.5: Show Notification Badge (v1.6.0+)
|
|
24
|
+
|
|
25
|
+
**Purpose:** Display unread notification count to keep users informed of team activity.
|
|
26
|
+
|
|
27
|
+
**When to Execute:** Only if authenticated AND linked to a project.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Only proceed if authenticated and linked
|
|
31
|
+
if [ -n "$TOKEN" ] && [ -n "$PROJECT_ID" ]; then
|
|
32
|
+
RESPONSE=$(curl -s --connect-timeout 3 --max-time 5 \
|
|
33
|
+
-X GET \
|
|
34
|
+
-H "Accept: application/json" \
|
|
35
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
36
|
+
"${API_URL}/projects/${PROJECT_ID}/notifications?limit=1&unread=true" 2>/dev/null)
|
|
37
|
+
|
|
38
|
+
if [ $? -eq 0 ]; then
|
|
39
|
+
UNREAD_COUNT=$(echo "$RESPONSE" | grep -o '"unreadCount":[0-9]*' | grep -o '[0-9]*')
|
|
40
|
+
if [ -n "$UNREAD_COUNT" ] && [ "$UNREAD_COUNT" -gt 0 ]; then
|
|
41
|
+
echo "🔔 $UNREAD_COUNT unread notification(s) — /pfNotifications to view"
|
|
42
|
+
echo ""
|
|
43
|
+
fi
|
|
44
|
+
fi
|
|
45
|
+
fi
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
See: `skills/notification-badge/SKILL.md` for full implementation details.
|
|
49
|
+
|
|
50
|
+
## Step 1: Display Workload Card
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
54
|
+
│ 📊 Team Workload │
|
|
55
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
56
|
+
│ │
|
|
57
|
+
│ 📁 Project: Planflow Plugin │
|
|
58
|
+
│ 📋 Total Tasks: 24 │
|
|
59
|
+
│ │
|
|
60
|
+
│ ── Workload Distribution ────────────────────────────────────────────── │
|
|
61
|
+
│ │
|
|
62
|
+
│ John ████████████████████░░░░░░░░░░ 8 tasks (2 in progress) │
|
|
63
|
+
│ Jane ██████████████░░░░░░░░░░░░░░░░ 6 tasks (1 in progress) │
|
|
64
|
+
│ Bob ████████░░░░░░░░░░░░░░░░░░░░░░ 4 tasks │
|
|
65
|
+
│ │
|
|
66
|
+
│ ── Unassigned ───────────────────────────────────────────────────────── │
|
|
67
|
+
│ │
|
|
68
|
+
│ 📭 12 tasks are not assigned │
|
|
69
|
+
│ │
|
|
70
|
+
│ ── Summary ──────────────────────────────────────────────────────────── │
|
|
71
|
+
│ │
|
|
72
|
+
│ Average per member: 6.0 tasks │
|
|
73
|
+
│ │
|
|
74
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
75
|
+
│ │
|
|
76
|
+
│ 💡 {t.ui.labels.commands} │
|
|
77
|
+
│ • /pfAssign <task-id> <email> Assign unassigned tasks │
|
|
78
|
+
│ • /pfWorkload --details View detailed breakdown │
|
|
79
|
+
│ │
|
|
80
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
81
|
+
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Step 2: Detailed Workload Card (--details)
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
88
|
+
│ 📊 Team Workload │
|
|
89
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
90
|
+
│ │
|
|
91
|
+
│ 📁 Project: Planflow Plugin │
|
|
92
|
+
│ 📋 Total Tasks: 24 │
|
|
93
|
+
│ │
|
|
94
|
+
│ ── Workload Distribution ────────────────────────────────────────────── │
|
|
95
|
+
│ │
|
|
96
|
+
│ John ████████████████████░░░░░░░░░░ 8 tasks (2 in progress) │
|
|
97
|
+
│ Jane ██████████████░░░░░░░░░░░░░░░░ 6 tasks (1 in progress) │
|
|
98
|
+
│ Bob ████████░░░░░░░░░░░░░░░░░░░░░░ 4 tasks │
|
|
99
|
+
│ │
|
|
100
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
101
|
+
│ │
|
|
102
|
+
│ ── Detailed Breakdown ───────────────────────────────────────────────── │
|
|
103
|
+
│ │
|
|
104
|
+
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
105
|
+
│ │ 👤 John Doe (john@company.com) │ │
|
|
106
|
+
│ │ 🔄 In Progress: │ │
|
|
107
|
+
│ │ T2.1 - API endpoints │ │
|
|
108
|
+
│ │ T2.4 - Database schema │ │
|
|
109
|
+
│ │ ○ To Do: │ │
|
|
110
|
+
│ │ T2.3 - Validation │ │
|
|
111
|
+
│ │ T2.5 - Error handling │ │
|
|
112
|
+
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
113
|
+
│ │
|
|
114
|
+
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
115
|
+
│ │ 👤 Jane Smith (jane@company.com) │ │
|
|
116
|
+
│ │ 🔄 In Progress: │ │
|
|
117
|
+
│ │ T3.5 - Dashboard │ │
|
|
118
|
+
│ │ ○ To Do: │ │
|
|
119
|
+
│ │ T3.6 - Charts │ │
|
|
120
|
+
│ │ T3.7 - Reports │ │
|
|
121
|
+
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
122
|
+
│ │
|
|
123
|
+
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
124
|
+
│ │ 👤 Bob Wilson (bob@company.com) │ │
|
|
125
|
+
│ │ ○ To Do: │ │
|
|
126
|
+
│ │ T4.1 - Testing │ │
|
|
127
|
+
│ │ T4.2 - Documentation │ │
|
|
128
|
+
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
129
|
+
│ │
|
|
130
|
+
│ ── Unassigned Tasks ─────────────────────────────────────────────────── │
|
|
131
|
+
│ │
|
|
132
|
+
│ 📭 T5.1 - Deployment │
|
|
133
|
+
│ 📭 T5.2 - CI/CD setup │
|
|
134
|
+
│ 📭 T5.3 - Monitoring │
|
|
135
|
+
│ ... and 9 more │
|
|
136
|
+
│ │
|
|
137
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
138
|
+
│ │
|
|
139
|
+
│ 💡 {t.ui.labels.commands} │
|
|
140
|
+
│ • /pfAssign T5.1 bob@company.com Assign a task │
|
|
141
|
+
│ │
|
|
142
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
143
|
+
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Step 3: Only Owner Card (Empty Team)
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
150
|
+
│ 📊 Team Workload │
|
|
151
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
152
|
+
│ │
|
|
153
|
+
│ 📁 Project: Planflow Plugin │
|
|
154
|
+
│ 📋 Total Tasks: 15 │
|
|
155
|
+
│ │
|
|
156
|
+
│ ── Workload Distribution ────────────────────────────────────────────── │
|
|
157
|
+
│ │
|
|
158
|
+
│ You ██████████████░░░░░░░░░░░░░░░░ 7 tasks (1 in progress) │
|
|
159
|
+
│ │
|
|
160
|
+
│ 📭 Unassigned: 8 tasks │
|
|
161
|
+
│ │
|
|
162
|
+
│ ℹ️ You're the only team member. │
|
|
163
|
+
│ │
|
|
164
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
165
|
+
│ │
|
|
166
|
+
│ 💡 To distribute workload: │
|
|
167
|
+
│ • /pfTeamInvite <email> Invite team members │
|
|
168
|
+
│ │
|
|
169
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
170
|
+
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Workload Imbalance Warning
|
|
174
|
+
|
|
175
|
+
When workload is significantly unbalanced:
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
179
|
+
│ ⚠️ Workload Imbalance Detected │
|
|
180
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
181
|
+
│ │
|
|
182
|
+
│ John has 12 tasks while Bob has only 2 tasks. │
|
|
183
|
+
│ │
|
|
184
|
+
│ Consider redistributing tasks for better balance. │
|
|
185
|
+
│ │
|
|
186
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Error Handling
|
|
190
|
+
|
|
191
|
+
**Not Authenticated Card:**
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
195
|
+
│ ❌ ERROR │
|
|
196
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
197
|
+
│ │
|
|
198
|
+
│ {t.commands.sync.notAuthenticated} │
|
|
199
|
+
│ │
|
|
200
|
+
│ 💡 {t.ui.labels.nextSteps} │
|
|
201
|
+
│ • /pfLogin Sign in to PlanFlow │
|
|
202
|
+
│ │
|
|
203
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Network Error Card:**
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
╭──────────────────────────────────────────────────────────────────────────────╮
|
|
210
|
+
│ ❌ ERROR │
|
|
211
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
212
|
+
│ │
|
|
213
|
+
│ Network error. Could not fetch workload data. │
|
|
214
|
+
│ │
|
|
215
|
+
│ Please check your connection and try again. │
|
|
216
|
+
│ │
|
|
217
|
+
╰──────────────────────────────────────────────────────────────────────────────╯
|
|
218
|
+
```
|
|
219
|
+
|