digital-tools 2.0.2 → 2.1.1
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/CHANGELOG.md +17 -0
- package/package.json +3 -4
- package/src/define.js +267 -0
- package/src/entities/advertising.js +999 -0
- package/src/entities/ai.js +756 -0
- package/src/entities/analytics.js +1588 -0
- package/src/entities/automation.js +601 -0
- package/src/entities/communication.js +1150 -0
- package/src/entities/crm.js +1386 -0
- package/src/entities/design.js +546 -0
- package/src/entities/development.js +2212 -0
- package/src/entities/document.js +874 -0
- package/src/entities/ecommerce.js +1429 -0
- package/src/entities/experiment.js +1039 -0
- package/src/entities/finance.js +3478 -0
- package/src/entities/forms.js +1892 -0
- package/src/entities/hr.js +661 -0
- package/src/entities/identity.js +997 -0
- package/src/entities/index.js +282 -0
- package/src/entities/infrastructure.js +1153 -0
- package/src/entities/knowledge.js +1438 -0
- package/src/entities/marketing.js +1610 -0
- package/src/entities/media.js +1634 -0
- package/src/entities/notification.js +1199 -0
- package/src/entities/presentation.js +1274 -0
- package/src/entities/productivity.js +1317 -0
- package/src/entities/project-management.js +1136 -0
- package/src/entities/recruiting.js +736 -0
- package/src/entities/shipping.js +509 -0
- package/src/entities/signature.js +1102 -0
- package/src/entities/site.js +222 -0
- package/src/entities/spreadsheet.js +1341 -0
- package/src/entities/storage.js +1198 -0
- package/src/entities/support.js +1166 -0
- package/src/entities/video-conferencing.js +1750 -0
- package/src/entities/video.js +950 -0
- package/src/entities.js +1663 -0
- package/src/index.js +74 -0
- package/src/providers/analytics/index.js +17 -0
- package/src/providers/analytics/mixpanel.js +255 -0
- package/src/providers/calendar/cal-com.js +303 -0
- package/src/providers/calendar/google-calendar.js +335 -0
- package/src/providers/calendar/index.js +20 -0
- package/src/providers/crm/hubspot.js +566 -0
- package/src/providers/crm/index.js +17 -0
- package/src/providers/development/github.js +472 -0
- package/src/providers/development/index.js +17 -0
- package/src/providers/ecommerce/index.js +17 -0
- package/src/providers/ecommerce/shopify.js +378 -0
- package/src/providers/email/index.js +20 -0
- package/src/providers/email/resend.js +258 -0
- package/src/providers/email/sendgrid.js +161 -0
- package/src/providers/finance/index.js +17 -0
- package/src/providers/finance/stripe.js +549 -0
- package/src/providers/forms/index.js +17 -0
- package/src/providers/forms/typeform.js +500 -0
- package/src/providers/index.js +123 -0
- package/src/providers/knowledge/index.js +17 -0
- package/src/providers/knowledge/notion.js +389 -0
- package/src/providers/marketing/index.js +17 -0
- package/src/providers/marketing/mailchimp.js +443 -0
- package/src/providers/media/cloudinary.js +318 -0
- package/src/providers/media/index.js +17 -0
- package/src/providers/messaging/index.js +20 -0
- package/src/providers/messaging/slack.js +393 -0
- package/src/providers/messaging/twilio-sms.js +249 -0
- package/src/providers/project-management/index.js +17 -0
- package/src/providers/project-management/linear.js +575 -0
- package/src/providers/registry.js +86 -0
- package/src/providers/spreadsheet/google-sheets.js +375 -0
- package/src/providers/spreadsheet/index.js +20 -0
- package/src/providers/spreadsheet/xlsx.js +423 -0
- package/src/providers/storage/index.js +24 -0
- package/src/providers/storage/s3.js +419 -0
- package/src/providers/support/index.js +17 -0
- package/src/providers/support/zendesk.js +373 -0
- package/src/providers/tasks/index.js +17 -0
- package/src/providers/tasks/todoist.js +286 -0
- package/src/providers/types.js +9 -0
- package/src/providers/video-conferencing/google-meet.js +286 -0
- package/src/providers/video-conferencing/index.js +31 -0
- package/src/providers/video-conferencing/jitsi.js +254 -0
- package/src/providers/video-conferencing/teams.js +270 -0
- package/src/providers/video-conferencing/zoom.js +332 -0
- package/src/registry.js +128 -0
- package/src/tools/communication.js +184 -0
- package/src/tools/data.js +205 -0
- package/src/tools/index.js +11 -0
- package/src/tools/web.js +137 -0
- package/src/types.js +10 -0
- package/test/define.test.js +306 -0
- package/test/registry.test.js +357 -0
- package/test/tools.test.js +363 -0
|
@@ -0,0 +1,1136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Management Entity Types (Nouns)
|
|
3
|
+
*
|
|
4
|
+
* Semantic type definitions for project management tools that can be used by
|
|
5
|
+
* both remote human workers AND AI agents. Each entity defines:
|
|
6
|
+
* - Properties: The data fields
|
|
7
|
+
* - Actions: Operations that can be performed (Verbs)
|
|
8
|
+
* - Events: State changes that occur
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Project
|
|
14
|
+
// =============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Project entity
|
|
17
|
+
*
|
|
18
|
+
* Represents a project with goals, deliverables, team members, and timeline.
|
|
19
|
+
* Used by tools like Jira, Linear, Asana, Monday, ClickUp, etc.
|
|
20
|
+
*/
|
|
21
|
+
export const Project = {
|
|
22
|
+
singular: 'project',
|
|
23
|
+
plural: 'projects',
|
|
24
|
+
description: 'A project with defined scope, timeline, and team members',
|
|
25
|
+
properties: {
|
|
26
|
+
// Identity
|
|
27
|
+
name: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Project name',
|
|
30
|
+
},
|
|
31
|
+
key: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
optional: true,
|
|
34
|
+
description: 'Unique project key/identifier (e.g., PROJ, WEB)',
|
|
35
|
+
},
|
|
36
|
+
description: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
optional: true,
|
|
39
|
+
description: 'Detailed project description',
|
|
40
|
+
},
|
|
41
|
+
icon: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
optional: true,
|
|
44
|
+
description: 'Project icon/emoji',
|
|
45
|
+
},
|
|
46
|
+
color: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
optional: true,
|
|
49
|
+
description: 'Project color code',
|
|
50
|
+
},
|
|
51
|
+
// Status & Progress
|
|
52
|
+
status: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: 'Project status: planning, active, on-hold, completed, cancelled',
|
|
55
|
+
examples: ['planning', 'active', 'on-hold', 'completed', 'cancelled'],
|
|
56
|
+
},
|
|
57
|
+
progress: {
|
|
58
|
+
type: 'number',
|
|
59
|
+
optional: true,
|
|
60
|
+
description: 'Overall completion percentage (0-100)',
|
|
61
|
+
},
|
|
62
|
+
health: {
|
|
63
|
+
type: 'string',
|
|
64
|
+
optional: true,
|
|
65
|
+
description: 'Project health: on-track, at-risk, off-track',
|
|
66
|
+
examples: ['on-track', 'at-risk', 'off-track'],
|
|
67
|
+
},
|
|
68
|
+
// Timeline
|
|
69
|
+
startDate: {
|
|
70
|
+
type: 'date',
|
|
71
|
+
optional: true,
|
|
72
|
+
description: 'Project start date',
|
|
73
|
+
},
|
|
74
|
+
endDate: {
|
|
75
|
+
type: 'date',
|
|
76
|
+
optional: true,
|
|
77
|
+
description: 'Project end date',
|
|
78
|
+
},
|
|
79
|
+
targetDate: {
|
|
80
|
+
type: 'date',
|
|
81
|
+
optional: true,
|
|
82
|
+
description: 'Target completion date',
|
|
83
|
+
},
|
|
84
|
+
// Organization
|
|
85
|
+
visibility: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
description: 'Project visibility: public, private, team',
|
|
88
|
+
examples: ['public', 'private', 'team'],
|
|
89
|
+
},
|
|
90
|
+
archived: {
|
|
91
|
+
type: 'boolean',
|
|
92
|
+
optional: true,
|
|
93
|
+
description: 'Whether the project is archived',
|
|
94
|
+
},
|
|
95
|
+
// Metrics
|
|
96
|
+
issueCount: {
|
|
97
|
+
type: 'number',
|
|
98
|
+
optional: true,
|
|
99
|
+
description: 'Total number of issues',
|
|
100
|
+
},
|
|
101
|
+
openIssueCount: {
|
|
102
|
+
type: 'number',
|
|
103
|
+
optional: true,
|
|
104
|
+
description: 'Number of open issues',
|
|
105
|
+
},
|
|
106
|
+
memberCount: {
|
|
107
|
+
type: 'number',
|
|
108
|
+
optional: true,
|
|
109
|
+
description: 'Number of team members',
|
|
110
|
+
},
|
|
111
|
+
// Settings
|
|
112
|
+
template: {
|
|
113
|
+
type: 'string',
|
|
114
|
+
optional: true,
|
|
115
|
+
description: 'Project template used',
|
|
116
|
+
},
|
|
117
|
+
workflow: {
|
|
118
|
+
type: 'json',
|
|
119
|
+
optional: true,
|
|
120
|
+
description: 'Custom workflow configuration',
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
relationships: {
|
|
124
|
+
owner: {
|
|
125
|
+
type: 'Contact',
|
|
126
|
+
description: 'Project owner/lead',
|
|
127
|
+
},
|
|
128
|
+
team: {
|
|
129
|
+
type: 'Contact[]',
|
|
130
|
+
description: 'Team members assigned to the project',
|
|
131
|
+
},
|
|
132
|
+
issues: {
|
|
133
|
+
type: 'Issue[]',
|
|
134
|
+
backref: 'project',
|
|
135
|
+
description: 'Issues/tickets in this project',
|
|
136
|
+
},
|
|
137
|
+
epics: {
|
|
138
|
+
type: 'Epic[]',
|
|
139
|
+
backref: 'project',
|
|
140
|
+
description: 'Epics in this project',
|
|
141
|
+
},
|
|
142
|
+
sprints: {
|
|
143
|
+
type: 'Sprint[]',
|
|
144
|
+
backref: 'project',
|
|
145
|
+
description: 'Sprints/iterations for this project',
|
|
146
|
+
},
|
|
147
|
+
milestones: {
|
|
148
|
+
type: 'Milestone[]',
|
|
149
|
+
backref: 'project',
|
|
150
|
+
description: 'Project milestones',
|
|
151
|
+
},
|
|
152
|
+
boards: {
|
|
153
|
+
type: 'Board[]',
|
|
154
|
+
backref: 'project',
|
|
155
|
+
description: 'Kanban boards for this project',
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
actions: [
|
|
159
|
+
'create',
|
|
160
|
+
'update',
|
|
161
|
+
'delete',
|
|
162
|
+
'archive',
|
|
163
|
+
'restore',
|
|
164
|
+
'duplicate',
|
|
165
|
+
'setStatus',
|
|
166
|
+
'addMember',
|
|
167
|
+
'removeMember',
|
|
168
|
+
'setOwner',
|
|
169
|
+
'setDates',
|
|
170
|
+
'updateProgress',
|
|
171
|
+
'export',
|
|
172
|
+
],
|
|
173
|
+
events: [
|
|
174
|
+
'created',
|
|
175
|
+
'updated',
|
|
176
|
+
'deleted',
|
|
177
|
+
'archived',
|
|
178
|
+
'restored',
|
|
179
|
+
'duplicated',
|
|
180
|
+
'statusChanged',
|
|
181
|
+
'memberAdded',
|
|
182
|
+
'memberRemoved',
|
|
183
|
+
'ownerChanged',
|
|
184
|
+
'datesChanged',
|
|
185
|
+
'progressUpdated',
|
|
186
|
+
'completed',
|
|
187
|
+
'cancelled',
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
// =============================================================================
|
|
191
|
+
// Issue
|
|
192
|
+
// =============================================================================
|
|
193
|
+
/**
|
|
194
|
+
* Issue/Ticket entity
|
|
195
|
+
*
|
|
196
|
+
* Represents a work item, task, bug, or feature request.
|
|
197
|
+
* Brand-agnostic equivalent of:
|
|
198
|
+
* - Jira Issue
|
|
199
|
+
* - Linear Issue
|
|
200
|
+
* - GitHub Issue
|
|
201
|
+
* - Asana Task
|
|
202
|
+
*/
|
|
203
|
+
export const Issue = {
|
|
204
|
+
singular: 'issue',
|
|
205
|
+
plural: 'issues',
|
|
206
|
+
description: 'A work item, task, bug, or feature request',
|
|
207
|
+
properties: {
|
|
208
|
+
// Identity
|
|
209
|
+
title: {
|
|
210
|
+
type: 'string',
|
|
211
|
+
description: 'Issue title/summary',
|
|
212
|
+
},
|
|
213
|
+
identifier: {
|
|
214
|
+
type: 'string',
|
|
215
|
+
optional: true,
|
|
216
|
+
description: 'Issue identifier (e.g., PROJ-123, #456)',
|
|
217
|
+
},
|
|
218
|
+
description: {
|
|
219
|
+
type: 'markdown',
|
|
220
|
+
optional: true,
|
|
221
|
+
description: 'Detailed issue description',
|
|
222
|
+
},
|
|
223
|
+
// Type & Classification
|
|
224
|
+
type: {
|
|
225
|
+
type: 'string',
|
|
226
|
+
description: 'Issue type: task, bug, feature, story, epic, subtask',
|
|
227
|
+
examples: ['task', 'bug', 'feature', 'story', 'epic', 'subtask'],
|
|
228
|
+
},
|
|
229
|
+
priority: {
|
|
230
|
+
type: 'string',
|
|
231
|
+
description: 'Priority level: none, low, medium, high, urgent',
|
|
232
|
+
examples: ['none', 'low', 'medium', 'high', 'urgent'],
|
|
233
|
+
},
|
|
234
|
+
severity: {
|
|
235
|
+
type: 'string',
|
|
236
|
+
optional: true,
|
|
237
|
+
description: 'Bug severity: minor, major, critical, blocker',
|
|
238
|
+
examples: ['minor', 'major', 'critical', 'blocker'],
|
|
239
|
+
},
|
|
240
|
+
// Status & Progress
|
|
241
|
+
status: {
|
|
242
|
+
type: 'string',
|
|
243
|
+
description: 'Issue status: backlog, todo, in-progress, review, done, cancelled',
|
|
244
|
+
examples: ['backlog', 'todo', 'in-progress', 'review', 'done', 'cancelled'],
|
|
245
|
+
},
|
|
246
|
+
progress: {
|
|
247
|
+
type: 'number',
|
|
248
|
+
optional: true,
|
|
249
|
+
description: 'Completion percentage (0-100)',
|
|
250
|
+
},
|
|
251
|
+
resolution: {
|
|
252
|
+
type: 'string',
|
|
253
|
+
optional: true,
|
|
254
|
+
description: 'Resolution: fixed, wont-fix, duplicate, works-as-designed',
|
|
255
|
+
examples: ['fixed', 'wont-fix', 'duplicate', 'works-as-designed'],
|
|
256
|
+
},
|
|
257
|
+
// Timeline
|
|
258
|
+
createdAt: {
|
|
259
|
+
type: 'datetime',
|
|
260
|
+
description: 'When the issue was created',
|
|
261
|
+
},
|
|
262
|
+
updatedAt: {
|
|
263
|
+
type: 'datetime',
|
|
264
|
+
description: 'When the issue was last updated',
|
|
265
|
+
},
|
|
266
|
+
startDate: {
|
|
267
|
+
type: 'date',
|
|
268
|
+
optional: true,
|
|
269
|
+
description: 'Planned start date',
|
|
270
|
+
},
|
|
271
|
+
dueDate: {
|
|
272
|
+
type: 'date',
|
|
273
|
+
optional: true,
|
|
274
|
+
description: 'Due date',
|
|
275
|
+
},
|
|
276
|
+
completedAt: {
|
|
277
|
+
type: 'datetime',
|
|
278
|
+
optional: true,
|
|
279
|
+
description: 'When the issue was completed',
|
|
280
|
+
},
|
|
281
|
+
// Estimation
|
|
282
|
+
estimate: {
|
|
283
|
+
type: 'number',
|
|
284
|
+
optional: true,
|
|
285
|
+
description: 'Story points or time estimate',
|
|
286
|
+
},
|
|
287
|
+
estimateType: {
|
|
288
|
+
type: 'string',
|
|
289
|
+
optional: true,
|
|
290
|
+
description: 'Estimation unit: points, hours, days',
|
|
291
|
+
examples: ['points', 'hours', 'days'],
|
|
292
|
+
},
|
|
293
|
+
timeSpent: {
|
|
294
|
+
type: 'number',
|
|
295
|
+
optional: true,
|
|
296
|
+
description: 'Actual time spent in hours',
|
|
297
|
+
},
|
|
298
|
+
timeRemaining: {
|
|
299
|
+
type: 'number',
|
|
300
|
+
optional: true,
|
|
301
|
+
description: 'Estimated time remaining in hours',
|
|
302
|
+
},
|
|
303
|
+
// Context
|
|
304
|
+
storyPoints: {
|
|
305
|
+
type: 'number',
|
|
306
|
+
optional: true,
|
|
307
|
+
description: 'Story points for agile estimation',
|
|
308
|
+
},
|
|
309
|
+
environment: {
|
|
310
|
+
type: 'string',
|
|
311
|
+
optional: true,
|
|
312
|
+
description: 'Environment where issue occurs: dev, staging, production',
|
|
313
|
+
examples: ['dev', 'staging', 'production'],
|
|
314
|
+
},
|
|
315
|
+
// Organization
|
|
316
|
+
archived: {
|
|
317
|
+
type: 'boolean',
|
|
318
|
+
optional: true,
|
|
319
|
+
description: 'Whether the issue is archived',
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
relationships: {
|
|
323
|
+
project: {
|
|
324
|
+
type: 'Project',
|
|
325
|
+
backref: 'issues',
|
|
326
|
+
description: 'Project this issue belongs to',
|
|
327
|
+
},
|
|
328
|
+
epic: {
|
|
329
|
+
type: 'Epic',
|
|
330
|
+
required: false,
|
|
331
|
+
backref: 'issues',
|
|
332
|
+
description: 'Parent epic if this is part of one',
|
|
333
|
+
},
|
|
334
|
+
sprint: {
|
|
335
|
+
type: 'Sprint',
|
|
336
|
+
required: false,
|
|
337
|
+
backref: 'issues',
|
|
338
|
+
description: 'Sprint this issue is assigned to',
|
|
339
|
+
},
|
|
340
|
+
milestone: {
|
|
341
|
+
type: 'Milestone',
|
|
342
|
+
required: false,
|
|
343
|
+
backref: 'issues',
|
|
344
|
+
description: 'Milestone this issue is part of',
|
|
345
|
+
},
|
|
346
|
+
assignee: {
|
|
347
|
+
type: 'Contact',
|
|
348
|
+
required: false,
|
|
349
|
+
description: 'Person assigned to work on this issue',
|
|
350
|
+
},
|
|
351
|
+
reporter: {
|
|
352
|
+
type: 'Contact',
|
|
353
|
+
description: 'Person who reported/created the issue',
|
|
354
|
+
},
|
|
355
|
+
labels: {
|
|
356
|
+
type: 'Label[]',
|
|
357
|
+
description: 'Labels applied to this issue',
|
|
358
|
+
},
|
|
359
|
+
parent: {
|
|
360
|
+
type: 'Issue',
|
|
361
|
+
required: false,
|
|
362
|
+
description: 'Parent issue (for subtasks)',
|
|
363
|
+
},
|
|
364
|
+
subtasks: {
|
|
365
|
+
type: 'Issue[]',
|
|
366
|
+
description: 'Child issues/subtasks',
|
|
367
|
+
},
|
|
368
|
+
blockedBy: {
|
|
369
|
+
type: 'Issue[]',
|
|
370
|
+
description: 'Issues blocking this one',
|
|
371
|
+
},
|
|
372
|
+
blocks: {
|
|
373
|
+
type: 'Issue[]',
|
|
374
|
+
description: 'Issues this one blocks',
|
|
375
|
+
},
|
|
376
|
+
relatedTo: {
|
|
377
|
+
type: 'Issue[]',
|
|
378
|
+
description: 'Related issues',
|
|
379
|
+
},
|
|
380
|
+
comments: {
|
|
381
|
+
type: 'Comment[]',
|
|
382
|
+
backref: 'issue',
|
|
383
|
+
description: 'Comments on this issue',
|
|
384
|
+
},
|
|
385
|
+
attachments: {
|
|
386
|
+
type: 'Attachment[]',
|
|
387
|
+
description: 'Files attached to this issue',
|
|
388
|
+
},
|
|
389
|
+
column: {
|
|
390
|
+
type: 'Column',
|
|
391
|
+
required: false,
|
|
392
|
+
description: 'Board column this issue is in',
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
actions: [
|
|
396
|
+
'create',
|
|
397
|
+
'update',
|
|
398
|
+
'delete',
|
|
399
|
+
'archive',
|
|
400
|
+
'restore',
|
|
401
|
+
'duplicate',
|
|
402
|
+
'assign',
|
|
403
|
+
'unassign',
|
|
404
|
+
'setStatus',
|
|
405
|
+
'setPriority',
|
|
406
|
+
'setType',
|
|
407
|
+
'addLabel',
|
|
408
|
+
'removeLabel',
|
|
409
|
+
'addSubtask',
|
|
410
|
+
'link',
|
|
411
|
+
'unlink',
|
|
412
|
+
'block',
|
|
413
|
+
'unblock',
|
|
414
|
+
'move',
|
|
415
|
+
'comment',
|
|
416
|
+
'estimate',
|
|
417
|
+
'logTime',
|
|
418
|
+
'watch',
|
|
419
|
+
'unwatch',
|
|
420
|
+
],
|
|
421
|
+
events: [
|
|
422
|
+
'created',
|
|
423
|
+
'updated',
|
|
424
|
+
'deleted',
|
|
425
|
+
'archived',
|
|
426
|
+
'restored',
|
|
427
|
+
'duplicated',
|
|
428
|
+
'assigned',
|
|
429
|
+
'unassigned',
|
|
430
|
+
'statusChanged',
|
|
431
|
+
'priorityChanged',
|
|
432
|
+
'typeChanged',
|
|
433
|
+
'labeled',
|
|
434
|
+
'unlabeled',
|
|
435
|
+
'subtaskAdded',
|
|
436
|
+
'linked',
|
|
437
|
+
'unlinked',
|
|
438
|
+
'blocked',
|
|
439
|
+
'unblocked',
|
|
440
|
+
'moved',
|
|
441
|
+
'commented',
|
|
442
|
+
'estimated',
|
|
443
|
+
'timeLogged',
|
|
444
|
+
'completed',
|
|
445
|
+
'reopened',
|
|
446
|
+
],
|
|
447
|
+
};
|
|
448
|
+
// =============================================================================
|
|
449
|
+
// Sprint
|
|
450
|
+
// =============================================================================
|
|
451
|
+
/**
|
|
452
|
+
* Sprint/Iteration entity
|
|
453
|
+
*
|
|
454
|
+
* Represents a time-boxed iteration for agile development.
|
|
455
|
+
*/
|
|
456
|
+
export const Sprint = {
|
|
457
|
+
singular: 'sprint',
|
|
458
|
+
plural: 'sprints',
|
|
459
|
+
description: 'A time-boxed iteration for agile development',
|
|
460
|
+
properties: {
|
|
461
|
+
// Identity
|
|
462
|
+
name: {
|
|
463
|
+
type: 'string',
|
|
464
|
+
description: 'Sprint name',
|
|
465
|
+
},
|
|
466
|
+
number: {
|
|
467
|
+
type: 'number',
|
|
468
|
+
optional: true,
|
|
469
|
+
description: 'Sprint number/sequence',
|
|
470
|
+
},
|
|
471
|
+
goal: {
|
|
472
|
+
type: 'string',
|
|
473
|
+
optional: true,
|
|
474
|
+
description: 'Sprint goal or objective',
|
|
475
|
+
},
|
|
476
|
+
// Status
|
|
477
|
+
status: {
|
|
478
|
+
type: 'string',
|
|
479
|
+
description: 'Sprint status: planning, active, completed, cancelled',
|
|
480
|
+
examples: ['planning', 'active', 'completed', 'cancelled'],
|
|
481
|
+
},
|
|
482
|
+
// Timeline
|
|
483
|
+
startDate: {
|
|
484
|
+
type: 'date',
|
|
485
|
+
description: 'Sprint start date',
|
|
486
|
+
},
|
|
487
|
+
endDate: {
|
|
488
|
+
type: 'date',
|
|
489
|
+
description: 'Sprint end date',
|
|
490
|
+
},
|
|
491
|
+
duration: {
|
|
492
|
+
type: 'number',
|
|
493
|
+
optional: true,
|
|
494
|
+
description: 'Sprint duration in days',
|
|
495
|
+
},
|
|
496
|
+
// Metrics
|
|
497
|
+
capacity: {
|
|
498
|
+
type: 'number',
|
|
499
|
+
optional: true,
|
|
500
|
+
description: 'Team capacity in story points or hours',
|
|
501
|
+
},
|
|
502
|
+
commitment: {
|
|
503
|
+
type: 'number',
|
|
504
|
+
optional: true,
|
|
505
|
+
description: 'Committed story points or hours',
|
|
506
|
+
},
|
|
507
|
+
completed: {
|
|
508
|
+
type: 'number',
|
|
509
|
+
optional: true,
|
|
510
|
+
description: 'Completed story points or hours',
|
|
511
|
+
},
|
|
512
|
+
velocity: {
|
|
513
|
+
type: 'number',
|
|
514
|
+
optional: true,
|
|
515
|
+
description: 'Actual velocity (completed work)',
|
|
516
|
+
},
|
|
517
|
+
issueCount: {
|
|
518
|
+
type: 'number',
|
|
519
|
+
optional: true,
|
|
520
|
+
description: 'Total number of issues',
|
|
521
|
+
},
|
|
522
|
+
completedIssueCount: {
|
|
523
|
+
type: 'number',
|
|
524
|
+
optional: true,
|
|
525
|
+
description: 'Number of completed issues',
|
|
526
|
+
},
|
|
527
|
+
// Settings
|
|
528
|
+
autoComplete: {
|
|
529
|
+
type: 'boolean',
|
|
530
|
+
optional: true,
|
|
531
|
+
description: 'Whether to auto-complete the sprint when end date is reached',
|
|
532
|
+
},
|
|
533
|
+
},
|
|
534
|
+
relationships: {
|
|
535
|
+
project: {
|
|
536
|
+
type: 'Project',
|
|
537
|
+
backref: 'sprints',
|
|
538
|
+
description: 'Project this sprint belongs to',
|
|
539
|
+
},
|
|
540
|
+
issues: {
|
|
541
|
+
type: 'Issue[]',
|
|
542
|
+
backref: 'sprint',
|
|
543
|
+
description: 'Issues in this sprint',
|
|
544
|
+
},
|
|
545
|
+
team: {
|
|
546
|
+
type: 'Contact[]',
|
|
547
|
+
description: 'Team members working in this sprint',
|
|
548
|
+
},
|
|
549
|
+
},
|
|
550
|
+
actions: [
|
|
551
|
+
'create',
|
|
552
|
+
'update',
|
|
553
|
+
'delete',
|
|
554
|
+
'start',
|
|
555
|
+
'complete',
|
|
556
|
+
'cancel',
|
|
557
|
+
'addIssue',
|
|
558
|
+
'removeIssue',
|
|
559
|
+
'setGoal',
|
|
560
|
+
'setCapacity',
|
|
561
|
+
'extend',
|
|
562
|
+
],
|
|
563
|
+
events: [
|
|
564
|
+
'created',
|
|
565
|
+
'updated',
|
|
566
|
+
'deleted',
|
|
567
|
+
'started',
|
|
568
|
+
'completed',
|
|
569
|
+
'cancelled',
|
|
570
|
+
'issueAdded',
|
|
571
|
+
'issueRemoved',
|
|
572
|
+
'goalChanged',
|
|
573
|
+
'capacityChanged',
|
|
574
|
+
'extended',
|
|
575
|
+
],
|
|
576
|
+
};
|
|
577
|
+
// =============================================================================
|
|
578
|
+
// Milestone
|
|
579
|
+
// =============================================================================
|
|
580
|
+
/**
|
|
581
|
+
* Milestone/Release entity
|
|
582
|
+
*
|
|
583
|
+
* Represents a significant point in project timeline, often a release or major deliverable.
|
|
584
|
+
*/
|
|
585
|
+
export const Milestone = {
|
|
586
|
+
singular: 'milestone',
|
|
587
|
+
plural: 'milestones',
|
|
588
|
+
description: 'A significant point in project timeline or a release',
|
|
589
|
+
properties: {
|
|
590
|
+
// Identity
|
|
591
|
+
name: {
|
|
592
|
+
type: 'string',
|
|
593
|
+
description: 'Milestone name',
|
|
594
|
+
},
|
|
595
|
+
description: {
|
|
596
|
+
type: 'string',
|
|
597
|
+
optional: true,
|
|
598
|
+
description: 'Milestone description',
|
|
599
|
+
},
|
|
600
|
+
version: {
|
|
601
|
+
type: 'string',
|
|
602
|
+
optional: true,
|
|
603
|
+
description: 'Version number for releases (e.g., v1.2.0)',
|
|
604
|
+
},
|
|
605
|
+
// Status
|
|
606
|
+
status: {
|
|
607
|
+
type: 'string',
|
|
608
|
+
description: 'Milestone status: planned, active, completed, cancelled',
|
|
609
|
+
examples: ['planned', 'active', 'completed', 'cancelled'],
|
|
610
|
+
},
|
|
611
|
+
progress: {
|
|
612
|
+
type: 'number',
|
|
613
|
+
optional: true,
|
|
614
|
+
description: 'Overall completion percentage (0-100)',
|
|
615
|
+
},
|
|
616
|
+
// Timeline
|
|
617
|
+
startDate: {
|
|
618
|
+
type: 'date',
|
|
619
|
+
optional: true,
|
|
620
|
+
description: 'Milestone start date',
|
|
621
|
+
},
|
|
622
|
+
targetDate: {
|
|
623
|
+
type: 'date',
|
|
624
|
+
description: 'Target completion date',
|
|
625
|
+
},
|
|
626
|
+
completedAt: {
|
|
627
|
+
type: 'datetime',
|
|
628
|
+
optional: true,
|
|
629
|
+
description: 'When the milestone was completed',
|
|
630
|
+
},
|
|
631
|
+
// Metrics
|
|
632
|
+
issueCount: {
|
|
633
|
+
type: 'number',
|
|
634
|
+
optional: true,
|
|
635
|
+
description: 'Total number of issues',
|
|
636
|
+
},
|
|
637
|
+
openIssueCount: {
|
|
638
|
+
type: 'number',
|
|
639
|
+
optional: true,
|
|
640
|
+
description: 'Number of open issues',
|
|
641
|
+
},
|
|
642
|
+
closedIssueCount: {
|
|
643
|
+
type: 'number',
|
|
644
|
+
optional: true,
|
|
645
|
+
description: 'Number of closed issues',
|
|
646
|
+
},
|
|
647
|
+
// Organization
|
|
648
|
+
archived: {
|
|
649
|
+
type: 'boolean',
|
|
650
|
+
optional: true,
|
|
651
|
+
description: 'Whether the milestone is archived',
|
|
652
|
+
},
|
|
653
|
+
},
|
|
654
|
+
relationships: {
|
|
655
|
+
project: {
|
|
656
|
+
type: 'Project',
|
|
657
|
+
backref: 'milestones',
|
|
658
|
+
description: 'Project this milestone belongs to',
|
|
659
|
+
},
|
|
660
|
+
issues: {
|
|
661
|
+
type: 'Issue[]',
|
|
662
|
+
backref: 'milestone',
|
|
663
|
+
description: 'Issues associated with this milestone',
|
|
664
|
+
},
|
|
665
|
+
owner: {
|
|
666
|
+
type: 'Contact',
|
|
667
|
+
required: false,
|
|
668
|
+
description: 'Person responsible for this milestone',
|
|
669
|
+
},
|
|
670
|
+
},
|
|
671
|
+
actions: [
|
|
672
|
+
'create',
|
|
673
|
+
'update',
|
|
674
|
+
'delete',
|
|
675
|
+
'archive',
|
|
676
|
+
'restore',
|
|
677
|
+
'complete',
|
|
678
|
+
'cancel',
|
|
679
|
+
'addIssue',
|
|
680
|
+
'removeIssue',
|
|
681
|
+
'setTargetDate',
|
|
682
|
+
],
|
|
683
|
+
events: [
|
|
684
|
+
'created',
|
|
685
|
+
'updated',
|
|
686
|
+
'deleted',
|
|
687
|
+
'archived',
|
|
688
|
+
'restored',
|
|
689
|
+
'completed',
|
|
690
|
+
'cancelled',
|
|
691
|
+
'issueAdded',
|
|
692
|
+
'issueRemoved',
|
|
693
|
+
'targetDateChanged',
|
|
694
|
+
'delayed',
|
|
695
|
+
],
|
|
696
|
+
};
|
|
697
|
+
// =============================================================================
|
|
698
|
+
// Board
|
|
699
|
+
// =============================================================================
|
|
700
|
+
/**
|
|
701
|
+
* Board entity
|
|
702
|
+
*
|
|
703
|
+
* Represents a Kanban board for visualizing work and workflow.
|
|
704
|
+
*/
|
|
705
|
+
export const Board = {
|
|
706
|
+
singular: 'board',
|
|
707
|
+
plural: 'boards',
|
|
708
|
+
description: 'A Kanban board for visualizing work and workflow',
|
|
709
|
+
properties: {
|
|
710
|
+
// Identity
|
|
711
|
+
name: {
|
|
712
|
+
type: 'string',
|
|
713
|
+
description: 'Board name',
|
|
714
|
+
},
|
|
715
|
+
description: {
|
|
716
|
+
type: 'string',
|
|
717
|
+
optional: true,
|
|
718
|
+
description: 'Board description',
|
|
719
|
+
},
|
|
720
|
+
icon: {
|
|
721
|
+
type: 'string',
|
|
722
|
+
optional: true,
|
|
723
|
+
description: 'Board icon/emoji',
|
|
724
|
+
},
|
|
725
|
+
// Type
|
|
726
|
+
type: {
|
|
727
|
+
type: 'string',
|
|
728
|
+
description: 'Board type: kanban, scrum, list',
|
|
729
|
+
examples: ['kanban', 'scrum', 'list'],
|
|
730
|
+
},
|
|
731
|
+
// Settings
|
|
732
|
+
swimlanes: {
|
|
733
|
+
type: 'string',
|
|
734
|
+
optional: true,
|
|
735
|
+
description: 'Swimlane grouping: none, assignee, priority, epic',
|
|
736
|
+
examples: ['none', 'assignee', 'priority', 'epic'],
|
|
737
|
+
},
|
|
738
|
+
cardStyle: {
|
|
739
|
+
type: 'string',
|
|
740
|
+
optional: true,
|
|
741
|
+
description: 'Card display style: compact, detailed, custom',
|
|
742
|
+
examples: ['compact', 'detailed', 'custom'],
|
|
743
|
+
},
|
|
744
|
+
autoArchive: {
|
|
745
|
+
type: 'boolean',
|
|
746
|
+
optional: true,
|
|
747
|
+
description: 'Whether to automatically archive completed issues',
|
|
748
|
+
},
|
|
749
|
+
// Organization
|
|
750
|
+
visibility: {
|
|
751
|
+
type: 'string',
|
|
752
|
+
description: 'Board visibility: public, private, team',
|
|
753
|
+
examples: ['public', 'private', 'team'],
|
|
754
|
+
},
|
|
755
|
+
archived: {
|
|
756
|
+
type: 'boolean',
|
|
757
|
+
optional: true,
|
|
758
|
+
description: 'Whether the board is archived',
|
|
759
|
+
},
|
|
760
|
+
},
|
|
761
|
+
relationships: {
|
|
762
|
+
project: {
|
|
763
|
+
type: 'Project',
|
|
764
|
+
backref: 'boards',
|
|
765
|
+
description: 'Project this board belongs to',
|
|
766
|
+
},
|
|
767
|
+
columns: {
|
|
768
|
+
type: 'Column[]',
|
|
769
|
+
backref: 'board',
|
|
770
|
+
description: 'Columns in this board',
|
|
771
|
+
},
|
|
772
|
+
owner: {
|
|
773
|
+
type: 'Contact',
|
|
774
|
+
description: 'Board owner',
|
|
775
|
+
},
|
|
776
|
+
members: {
|
|
777
|
+
type: 'Contact[]',
|
|
778
|
+
description: 'Members with access to this board',
|
|
779
|
+
},
|
|
780
|
+
},
|
|
781
|
+
actions: [
|
|
782
|
+
'create',
|
|
783
|
+
'update',
|
|
784
|
+
'delete',
|
|
785
|
+
'archive',
|
|
786
|
+
'restore',
|
|
787
|
+
'duplicate',
|
|
788
|
+
'addColumn',
|
|
789
|
+
'removeColumn',
|
|
790
|
+
'reorderColumns',
|
|
791
|
+
'addMember',
|
|
792
|
+
'removeMember',
|
|
793
|
+
'setSwimlanes',
|
|
794
|
+
],
|
|
795
|
+
events: [
|
|
796
|
+
'created',
|
|
797
|
+
'updated',
|
|
798
|
+
'deleted',
|
|
799
|
+
'archived',
|
|
800
|
+
'restored',
|
|
801
|
+
'duplicated',
|
|
802
|
+
'columnAdded',
|
|
803
|
+
'columnRemoved',
|
|
804
|
+
'columnsReordered',
|
|
805
|
+
'memberAdded',
|
|
806
|
+
'memberRemoved',
|
|
807
|
+
'swimlanesChanged',
|
|
808
|
+
],
|
|
809
|
+
};
|
|
810
|
+
// =============================================================================
|
|
811
|
+
// Column
|
|
812
|
+
// =============================================================================
|
|
813
|
+
/**
|
|
814
|
+
* Column entity
|
|
815
|
+
*
|
|
816
|
+
* Represents a column in a Kanban board (e.g., Todo, In Progress, Done).
|
|
817
|
+
*/
|
|
818
|
+
export const Column = {
|
|
819
|
+
singular: 'column',
|
|
820
|
+
plural: 'columns',
|
|
821
|
+
description: 'A column in a Kanban board representing a workflow state',
|
|
822
|
+
properties: {
|
|
823
|
+
// Identity
|
|
824
|
+
name: {
|
|
825
|
+
type: 'string',
|
|
826
|
+
description: 'Column name',
|
|
827
|
+
},
|
|
828
|
+
description: {
|
|
829
|
+
type: 'string',
|
|
830
|
+
optional: true,
|
|
831
|
+
description: 'Column description',
|
|
832
|
+
},
|
|
833
|
+
// Visual
|
|
834
|
+
color: {
|
|
835
|
+
type: 'string',
|
|
836
|
+
optional: true,
|
|
837
|
+
description: 'Column color code',
|
|
838
|
+
},
|
|
839
|
+
icon: {
|
|
840
|
+
type: 'string',
|
|
841
|
+
optional: true,
|
|
842
|
+
description: 'Column icon/emoji',
|
|
843
|
+
},
|
|
844
|
+
// Position
|
|
845
|
+
position: {
|
|
846
|
+
type: 'number',
|
|
847
|
+
description: 'Column position/order (0-indexed)',
|
|
848
|
+
},
|
|
849
|
+
// Constraints
|
|
850
|
+
wipLimit: {
|
|
851
|
+
type: 'number',
|
|
852
|
+
optional: true,
|
|
853
|
+
description: 'Work-in-progress limit for this column',
|
|
854
|
+
},
|
|
855
|
+
issueCount: {
|
|
856
|
+
type: 'number',
|
|
857
|
+
optional: true,
|
|
858
|
+
description: 'Current number of issues in this column',
|
|
859
|
+
},
|
|
860
|
+
// Status Mapping
|
|
861
|
+
statusCategory: {
|
|
862
|
+
type: 'string',
|
|
863
|
+
description: 'Status category: todo, in-progress, done',
|
|
864
|
+
examples: ['todo', 'in-progress', 'done'],
|
|
865
|
+
},
|
|
866
|
+
},
|
|
867
|
+
relationships: {
|
|
868
|
+
board: {
|
|
869
|
+
type: 'Board',
|
|
870
|
+
backref: 'columns',
|
|
871
|
+
description: 'Board this column belongs to',
|
|
872
|
+
},
|
|
873
|
+
issues: {
|
|
874
|
+
type: 'Issue[]',
|
|
875
|
+
description: 'Issues currently in this column',
|
|
876
|
+
},
|
|
877
|
+
},
|
|
878
|
+
actions: [
|
|
879
|
+
'create',
|
|
880
|
+
'update',
|
|
881
|
+
'delete',
|
|
882
|
+
'rename',
|
|
883
|
+
'move',
|
|
884
|
+
'setColor',
|
|
885
|
+
'setWipLimit',
|
|
886
|
+
],
|
|
887
|
+
events: [
|
|
888
|
+
'created',
|
|
889
|
+
'updated',
|
|
890
|
+
'deleted',
|
|
891
|
+
'renamed',
|
|
892
|
+
'moved',
|
|
893
|
+
'colorChanged',
|
|
894
|
+
'wipLimitChanged',
|
|
895
|
+
'wipLimitExceeded',
|
|
896
|
+
],
|
|
897
|
+
};
|
|
898
|
+
// =============================================================================
|
|
899
|
+
// Label
|
|
900
|
+
// =============================================================================
|
|
901
|
+
/**
|
|
902
|
+
* Label entity
|
|
903
|
+
*
|
|
904
|
+
* Represents a label/tag for categorizing and filtering issues.
|
|
905
|
+
*/
|
|
906
|
+
export const Label = {
|
|
907
|
+
singular: 'label',
|
|
908
|
+
plural: 'labels',
|
|
909
|
+
description: 'A label or tag for categorizing and filtering issues',
|
|
910
|
+
properties: {
|
|
911
|
+
// Identity
|
|
912
|
+
name: {
|
|
913
|
+
type: 'string',
|
|
914
|
+
description: 'Label name',
|
|
915
|
+
},
|
|
916
|
+
description: {
|
|
917
|
+
type: 'string',
|
|
918
|
+
optional: true,
|
|
919
|
+
description: 'Label description',
|
|
920
|
+
},
|
|
921
|
+
// Visual
|
|
922
|
+
color: {
|
|
923
|
+
type: 'string',
|
|
924
|
+
description: 'Label color code (hex)',
|
|
925
|
+
},
|
|
926
|
+
icon: {
|
|
927
|
+
type: 'string',
|
|
928
|
+
optional: true,
|
|
929
|
+
description: 'Label icon/emoji',
|
|
930
|
+
},
|
|
931
|
+
// Organization
|
|
932
|
+
category: {
|
|
933
|
+
type: 'string',
|
|
934
|
+
optional: true,
|
|
935
|
+
description: 'Label category or group',
|
|
936
|
+
},
|
|
937
|
+
},
|
|
938
|
+
relationships: {
|
|
939
|
+
project: {
|
|
940
|
+
type: 'Project',
|
|
941
|
+
required: false,
|
|
942
|
+
description: 'Project this label is scoped to (if any)',
|
|
943
|
+
},
|
|
944
|
+
issues: {
|
|
945
|
+
type: 'Issue[]',
|
|
946
|
+
description: 'Issues with this label',
|
|
947
|
+
},
|
|
948
|
+
},
|
|
949
|
+
actions: [
|
|
950
|
+
'create',
|
|
951
|
+
'update',
|
|
952
|
+
'delete',
|
|
953
|
+
'rename',
|
|
954
|
+
'setColor',
|
|
955
|
+
'merge',
|
|
956
|
+
],
|
|
957
|
+
events: [
|
|
958
|
+
'created',
|
|
959
|
+
'updated',
|
|
960
|
+
'deleted',
|
|
961
|
+
'renamed',
|
|
962
|
+
'colorChanged',
|
|
963
|
+
'merged',
|
|
964
|
+
'applied',
|
|
965
|
+
'removed',
|
|
966
|
+
],
|
|
967
|
+
};
|
|
968
|
+
// =============================================================================
|
|
969
|
+
// Epic
|
|
970
|
+
// =============================================================================
|
|
971
|
+
/**
|
|
972
|
+
* Epic entity
|
|
973
|
+
*
|
|
974
|
+
* Represents a large body of work that can be broken down into smaller issues.
|
|
975
|
+
*/
|
|
976
|
+
export const Epic = {
|
|
977
|
+
singular: 'epic',
|
|
978
|
+
plural: 'epics',
|
|
979
|
+
description: 'A large body of work containing multiple related issues',
|
|
980
|
+
properties: {
|
|
981
|
+
// Identity
|
|
982
|
+
name: {
|
|
983
|
+
type: 'string',
|
|
984
|
+
description: 'Epic name/title',
|
|
985
|
+
},
|
|
986
|
+
identifier: {
|
|
987
|
+
type: 'string',
|
|
988
|
+
optional: true,
|
|
989
|
+
description: 'Epic identifier (e.g., PROJ-E1)',
|
|
990
|
+
},
|
|
991
|
+
description: {
|
|
992
|
+
type: 'markdown',
|
|
993
|
+
optional: true,
|
|
994
|
+
description: 'Detailed epic description',
|
|
995
|
+
},
|
|
996
|
+
// Visual
|
|
997
|
+
color: {
|
|
998
|
+
type: 'string',
|
|
999
|
+
optional: true,
|
|
1000
|
+
description: 'Epic color code',
|
|
1001
|
+
},
|
|
1002
|
+
icon: {
|
|
1003
|
+
type: 'string',
|
|
1004
|
+
optional: true,
|
|
1005
|
+
description: 'Epic icon/emoji',
|
|
1006
|
+
},
|
|
1007
|
+
// Status & Progress
|
|
1008
|
+
status: {
|
|
1009
|
+
type: 'string',
|
|
1010
|
+
description: 'Epic status: planned, active, completed, cancelled',
|
|
1011
|
+
examples: ['planned', 'active', 'completed', 'cancelled'],
|
|
1012
|
+
},
|
|
1013
|
+
progress: {
|
|
1014
|
+
type: 'number',
|
|
1015
|
+
optional: true,
|
|
1016
|
+
description: 'Overall completion percentage (0-100)',
|
|
1017
|
+
},
|
|
1018
|
+
// Timeline
|
|
1019
|
+
startDate: {
|
|
1020
|
+
type: 'date',
|
|
1021
|
+
optional: true,
|
|
1022
|
+
description: 'Epic start date',
|
|
1023
|
+
},
|
|
1024
|
+
targetDate: {
|
|
1025
|
+
type: 'date',
|
|
1026
|
+
optional: true,
|
|
1027
|
+
description: 'Target completion date',
|
|
1028
|
+
},
|
|
1029
|
+
completedAt: {
|
|
1030
|
+
type: 'datetime',
|
|
1031
|
+
optional: true,
|
|
1032
|
+
description: 'When the epic was completed',
|
|
1033
|
+
},
|
|
1034
|
+
// Metrics
|
|
1035
|
+
issueCount: {
|
|
1036
|
+
type: 'number',
|
|
1037
|
+
optional: true,
|
|
1038
|
+
description: 'Total number of issues in this epic',
|
|
1039
|
+
},
|
|
1040
|
+
completedIssueCount: {
|
|
1041
|
+
type: 'number',
|
|
1042
|
+
optional: true,
|
|
1043
|
+
description: 'Number of completed issues',
|
|
1044
|
+
},
|
|
1045
|
+
storyPoints: {
|
|
1046
|
+
type: 'number',
|
|
1047
|
+
optional: true,
|
|
1048
|
+
description: 'Total story points',
|
|
1049
|
+
},
|
|
1050
|
+
completedStoryPoints: {
|
|
1051
|
+
type: 'number',
|
|
1052
|
+
optional: true,
|
|
1053
|
+
description: 'Completed story points',
|
|
1054
|
+
},
|
|
1055
|
+
// Organization
|
|
1056
|
+
archived: {
|
|
1057
|
+
type: 'boolean',
|
|
1058
|
+
optional: true,
|
|
1059
|
+
description: 'Whether the epic is archived',
|
|
1060
|
+
},
|
|
1061
|
+
},
|
|
1062
|
+
relationships: {
|
|
1063
|
+
project: {
|
|
1064
|
+
type: 'Project',
|
|
1065
|
+
backref: 'epics',
|
|
1066
|
+
description: 'Project this epic belongs to',
|
|
1067
|
+
},
|
|
1068
|
+
issues: {
|
|
1069
|
+
type: 'Issue[]',
|
|
1070
|
+
backref: 'epic',
|
|
1071
|
+
description: 'Issues in this epic',
|
|
1072
|
+
},
|
|
1073
|
+
owner: {
|
|
1074
|
+
type: 'Contact',
|
|
1075
|
+
required: false,
|
|
1076
|
+
description: 'Person responsible for this epic',
|
|
1077
|
+
},
|
|
1078
|
+
labels: {
|
|
1079
|
+
type: 'Label[]',
|
|
1080
|
+
description: 'Labels applied to this epic',
|
|
1081
|
+
},
|
|
1082
|
+
},
|
|
1083
|
+
actions: [
|
|
1084
|
+
'create',
|
|
1085
|
+
'update',
|
|
1086
|
+
'delete',
|
|
1087
|
+
'archive',
|
|
1088
|
+
'restore',
|
|
1089
|
+
'setStatus',
|
|
1090
|
+
'addIssue',
|
|
1091
|
+
'removeIssue',
|
|
1092
|
+
'setDates',
|
|
1093
|
+
'addLabel',
|
|
1094
|
+
'removeLabel',
|
|
1095
|
+
],
|
|
1096
|
+
events: [
|
|
1097
|
+
'created',
|
|
1098
|
+
'updated',
|
|
1099
|
+
'deleted',
|
|
1100
|
+
'archived',
|
|
1101
|
+
'restored',
|
|
1102
|
+
'statusChanged',
|
|
1103
|
+
'issueAdded',
|
|
1104
|
+
'issueRemoved',
|
|
1105
|
+
'datesChanged',
|
|
1106
|
+
'labeled',
|
|
1107
|
+
'unlabeled',
|
|
1108
|
+
'completed',
|
|
1109
|
+
'cancelled',
|
|
1110
|
+
],
|
|
1111
|
+
};
|
|
1112
|
+
// =============================================================================
|
|
1113
|
+
// Export all entities as a schema
|
|
1114
|
+
// =============================================================================
|
|
1115
|
+
/**
|
|
1116
|
+
* All project management entity types
|
|
1117
|
+
*/
|
|
1118
|
+
export const ProjectManagementEntities = {
|
|
1119
|
+
Project,
|
|
1120
|
+
Issue,
|
|
1121
|
+
Sprint,
|
|
1122
|
+
Milestone,
|
|
1123
|
+
Board,
|
|
1124
|
+
Column,
|
|
1125
|
+
Label,
|
|
1126
|
+
Epic,
|
|
1127
|
+
};
|
|
1128
|
+
/**
|
|
1129
|
+
* Entity categories for organization
|
|
1130
|
+
*/
|
|
1131
|
+
export const ProjectManagementCategories = {
|
|
1132
|
+
core: ['Project', 'Issue', 'Epic'],
|
|
1133
|
+
planning: ['Sprint', 'Milestone'],
|
|
1134
|
+
visualization: ['Board', 'Column'],
|
|
1135
|
+
organization: ['Label'],
|
|
1136
|
+
};
|