@critical-path/core 0.3.0 → 0.5.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/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/dist/engine/index.d.ts +8 -1
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +93 -3
- package/dist/engine/index.js.map +1 -1
- package/dist/index.test.js +44 -0
- package/dist/index.test.js.map +1 -1
- package/dist/store/firebase.d.ts +6 -1
- package/dist/store/firebase.d.ts.map +1 -1
- package/dist/store/firebase.js +37 -0
- package/dist/store/firebase.js.map +1 -1
- package/dist/store/firebase.test.js +16 -0
- package/dist/store/firebase.test.js.map +1 -1
- package/dist/store/index.d.ts +12 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +35 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite.d.ts +7 -1
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +81 -10
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/sqlite.test.js +21 -0
- package/dist/store/sqlite.test.js.map +1 -1
- package/dist/types/index.d.ts +32 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/use-case-validation.test.d.ts +2 -0
- package/dist/use-case-validation.test.d.ts.map +1 -0
- package/dist/use-case-validation.test.js +281 -0
- package/dist/use-case-validation.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/status.js +1 -1
- package/dist/utils/status.js.map +1 -1
- package/dist/utils/workflow.d.ts +14 -0
- package/dist/utils/workflow.d.ts.map +1 -0
- package/dist/utils/workflow.js +136 -0
- package/dist/utils/workflow.js.map +1 -0
- package/package.json +1 -1
- package/src/engine/index.ts +106 -4
- package/src/index.test.ts +54 -0
- package/src/store/firebase.test.ts +21 -0
- package/src/store/firebase.ts +42 -1
- package/src/store/index.ts +48 -1
- package/src/store/sqlite.test.ts +28 -0
- package/src/store/sqlite.ts +114 -7
- package/src/types/index.ts +38 -1
- package/src/use-case-validation.test.ts +324 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/status.ts +1 -1
- package/src/utils/workflow.ts +164 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { CriticalPathEngine, DEFAULT_SOFTWARE_WORKFLOW, DEFAULT_VFX_WORKFLOW } from './index.js';
|
|
3
|
+
describe('Critical Path Use Case Validation Suite', () => {
|
|
4
|
+
describe('Use Case 1: Software Development (Product Planning & Issue Tracking)', () => {
|
|
5
|
+
it('supports full software development lifecycle with epics, sprints, dependencies, custom fields, and workflow transitions', async () => {
|
|
6
|
+
const engine = new CriticalPathEngine();
|
|
7
|
+
// 1. Create Workflow & Project
|
|
8
|
+
const softwareProject = await engine.createProject({
|
|
9
|
+
key: 'DEV',
|
|
10
|
+
name: 'Mobile App Project',
|
|
11
|
+
description: 'Software development project for mobile client',
|
|
12
|
+
workflow: DEFAULT_SOFTWARE_WORKFLOW,
|
|
13
|
+
customFieldDefinitions: [
|
|
14
|
+
{ id: 'cf_story_points', key: 'storyPoints', label: 'Story Points', type: 'number' },
|
|
15
|
+
{ id: 'cf_severity', key: 'severity', label: 'Severity', type: 'single_select', options: ['low', 'medium', 'high', 'critical'] }
|
|
16
|
+
]
|
|
17
|
+
});
|
|
18
|
+
expect(softwareProject.id).toBeDefined();
|
|
19
|
+
// 2. Setup Team and Sprint Iteration
|
|
20
|
+
const devTeam = await engine.createTeam({
|
|
21
|
+
name: 'Frontend Core Team',
|
|
22
|
+
memberIds: ['dev_alice', 'dev_bob', 'lead_charlie']
|
|
23
|
+
});
|
|
24
|
+
const sprint = await engine.createIteration({
|
|
25
|
+
projectId: softwareProject.id,
|
|
26
|
+
name: 'Sprint 24',
|
|
27
|
+
type: 'sprint',
|
|
28
|
+
startDate: '2026-09-01T00:00:00.000Z',
|
|
29
|
+
endDate: '2026-09-14T00:00:00.000Z',
|
|
30
|
+
status: 'active'
|
|
31
|
+
});
|
|
32
|
+
// 3. Epics / Task Containers
|
|
33
|
+
const authEpic = await engine.createContainer({
|
|
34
|
+
projectId: softwareProject.id,
|
|
35
|
+
name: 'OAuth2 & Biometric Auth Epic',
|
|
36
|
+
type: 'epic'
|
|
37
|
+
});
|
|
38
|
+
// 4. Tasks & Subtasks
|
|
39
|
+
// Feature task under Auth Epic
|
|
40
|
+
const featureTask = await engine.createTask({
|
|
41
|
+
projectId: softwareProject.id,
|
|
42
|
+
title: 'Implement FaceID & TouchID Login',
|
|
43
|
+
description: 'Add biometric authentication flow to iOS and Android builds',
|
|
44
|
+
status: 'backlog',
|
|
45
|
+
priority: 'high',
|
|
46
|
+
taskType: 'feature',
|
|
47
|
+
reporterId: 'lead_charlie',
|
|
48
|
+
reviewerId: 'lead_charlie',
|
|
49
|
+
teamId: devTeam.id,
|
|
50
|
+
containerId: authEpic.id,
|
|
51
|
+
iterationId: sprint.id,
|
|
52
|
+
estimatedHours: 16,
|
|
53
|
+
customFields: {
|
|
54
|
+
storyPoints: 5,
|
|
55
|
+
severity: 'high'
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// Bug task blocking the feature release
|
|
59
|
+
const bugTask = await engine.createTask({
|
|
60
|
+
projectId: softwareProject.id,
|
|
61
|
+
title: 'Fix OAuth Token Expiry Edge Case',
|
|
62
|
+
description: 'Token refresh fails when app is backgrounded over 24 hours',
|
|
63
|
+
status: 'todo',
|
|
64
|
+
priority: 'urgent',
|
|
65
|
+
taskType: 'bug',
|
|
66
|
+
assigneeId: 'dev_alice',
|
|
67
|
+
reporterId: 'dev_bob',
|
|
68
|
+
reviewerId: 'lead_charlie',
|
|
69
|
+
iterationId: sprint.id,
|
|
70
|
+
estimatedHours: 4,
|
|
71
|
+
customFields: {
|
|
72
|
+
storyPoints: 2,
|
|
73
|
+
severity: 'critical'
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// Subtask under Feature Task
|
|
77
|
+
const subTask = await engine.createTask({
|
|
78
|
+
projectId: softwareProject.id,
|
|
79
|
+
title: 'iOS LocalAuthentication Bridge',
|
|
80
|
+
status: 'todo',
|
|
81
|
+
priority: 'high',
|
|
82
|
+
taskType: 'subtask',
|
|
83
|
+
assigneeId: 'dev_bob',
|
|
84
|
+
parentId: featureTask.id,
|
|
85
|
+
estimatedHours: 8
|
|
86
|
+
});
|
|
87
|
+
expect(subTask.parentId).toBe(featureTask.id);
|
|
88
|
+
// 5. Blocker Dependency: FeatureTask depends on BugTask being resolved first
|
|
89
|
+
await engine.store.addDependency({
|
|
90
|
+
taskId: featureTask.id,
|
|
91
|
+
dependsOnTaskId: bugTask.id,
|
|
92
|
+
type: 'blocking'
|
|
93
|
+
});
|
|
94
|
+
const bugGraph = await engine.getTaskDependencyGraph(bugTask.id);
|
|
95
|
+
expect(bugGraph.downstreamTasks.map((t) => t.id)).toContain(featureTask.id);
|
|
96
|
+
// 6. Execution & Workflow Transitions
|
|
97
|
+
// Move Feature from Backlog -> Todo -> In Progress
|
|
98
|
+
await engine.updateTask(featureTask.id, { status: 'todo' });
|
|
99
|
+
await engine.updateTask(featureTask.id, {
|
|
100
|
+
status: 'in_progress',
|
|
101
|
+
assigneeId: 'dev_alice',
|
|
102
|
+
actualStartDate: '2026-09-02T09:00:00.000Z'
|
|
103
|
+
});
|
|
104
|
+
// Log progress and hours
|
|
105
|
+
const updatedFeature = await engine.updateTask(featureTask.id, {
|
|
106
|
+
loggedHours: 10,
|
|
107
|
+
progress: 60
|
|
108
|
+
});
|
|
109
|
+
expect(updatedFeature?.loggedHours).toBe(10);
|
|
110
|
+
expect(updatedFeature?.progress).toBe(60);
|
|
111
|
+
// Transition In Progress -> In Review
|
|
112
|
+
const reviewTask = await engine.updateTask(featureTask.id, { status: 'in_review' });
|
|
113
|
+
expect(reviewTask?.status).toBe('in_review');
|
|
114
|
+
// Invalid Transition Check: Try to transition back from Done to Backlog directly (not allowed by workflow)
|
|
115
|
+
const doneTask = await engine.updateTask(featureTask.id, { status: 'done', actualEndDate: '2026-09-05T17:00:00.000Z' });
|
|
116
|
+
expect(doneTask?.status).toBe('done');
|
|
117
|
+
await expect(engine.updateTask(featureTask.id, { status: 'backlog' })).rejects.toThrow();
|
|
118
|
+
// Check Lifecycle State
|
|
119
|
+
const lifecycle = await engine.getTaskLifecycleState(featureTask.id);
|
|
120
|
+
expect(lifecycle?.isDone).toBe(true);
|
|
121
|
+
expect(lifecycle?.completionState).toBe('done');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('Use Case 2: Visual Effects (VFX) Production', () => {
|
|
125
|
+
it('supports VFX shot deliverable hierarchies, drafting/bidding, artist/vendor assignment, and multi-stage review workflows', async () => {
|
|
126
|
+
const engine = new CriticalPathEngine();
|
|
127
|
+
// 1. Setup VFX Project with DEFAULT_VFX_WORKFLOW
|
|
128
|
+
const vfxProject = await engine.createProject({
|
|
129
|
+
key: 'FX_MOP',
|
|
130
|
+
name: 'Feature Film - Movie Project',
|
|
131
|
+
description: 'VFX shot production for sequence SEQ_101',
|
|
132
|
+
workflow: DEFAULT_VFX_WORKFLOW,
|
|
133
|
+
customFieldDefinitions: [
|
|
134
|
+
{ id: 'cf_bid_days', key: 'bidDays', label: 'Bid Days', type: 'number' },
|
|
135
|
+
{ id: 'cf_bid_amount', key: 'bidAmountUSD', label: 'Bid Amount ($)', type: 'number' },
|
|
136
|
+
{ id: 'cf_frame_count', key: 'frameCount', label: 'Frame Count', type: 'number' },
|
|
137
|
+
{ id: 'cf_resolution', key: 'resolution', label: 'Resolution', type: 'single_select', options: ['2K', '4K', '8K'] },
|
|
138
|
+
{ id: 'cf_vfx_version', key: 'vfxVersion', label: 'VFX Version', type: 'text' },
|
|
139
|
+
{ id: 'cf_review_url', key: 'reviewMediaUrl', label: 'Review Media URL', type: 'text' }
|
|
140
|
+
]
|
|
141
|
+
});
|
|
142
|
+
// 2. Outsource Vendor & Internal Department Teams
|
|
143
|
+
const vendorTeam = await engine.createTeam({
|
|
144
|
+
name: 'Outsource Vendor Studio X',
|
|
145
|
+
description: '3D Simulation & FX Vendor Studio',
|
|
146
|
+
memberIds: ['vendor_lead_mark', 'vendor_artist_joe']
|
|
147
|
+
});
|
|
148
|
+
const internalLeadTeam = await engine.createTeam({
|
|
149
|
+
name: 'Internal VFX Supervisors',
|
|
150
|
+
memberIds: ['vfx_sup_sarah', 'comp_lead_dave']
|
|
151
|
+
});
|
|
152
|
+
expect(vendorTeam.id).toBeDefined();
|
|
153
|
+
expect(internalLeadTeam.id).toBeDefined();
|
|
154
|
+
// 3. Hierarchy Deliverables: Sequence Container -> Shot Container
|
|
155
|
+
const sequenceContainer = await engine.createContainer({
|
|
156
|
+
projectId: vfxProject.id,
|
|
157
|
+
name: 'SEQ_101 - Desert Canyon Chase',
|
|
158
|
+
type: 'sequence'
|
|
159
|
+
});
|
|
160
|
+
const shotContainer = await engine.createContainer({
|
|
161
|
+
projectId: vfxProject.id,
|
|
162
|
+
name: 'SHOT_101_010 - Hero Vehicle Explosion',
|
|
163
|
+
type: 'shot',
|
|
164
|
+
parentId: sequenceContainer.id
|
|
165
|
+
});
|
|
166
|
+
expect(shotContainer.parentId).toBe(sequenceContainer.id);
|
|
167
|
+
// 4. Draft & Bidding Phase
|
|
168
|
+
// Create VFX Task for FX Simulation department under SHOT_101_010
|
|
169
|
+
const fxBiddingTask = await engine.createTask({
|
|
170
|
+
projectId: vfxProject.id,
|
|
171
|
+
title: 'FX Simulation - Fire & Vehicle Debris',
|
|
172
|
+
description: 'Heavy pyro explosion and fracturing geometry',
|
|
173
|
+
status: 'bidding', // Starts in Draft & Bidding
|
|
174
|
+
priority: 'high',
|
|
175
|
+
taskType: 'vfx_task',
|
|
176
|
+
reporterId: 'vfx_sup_sarah',
|
|
177
|
+
containerId: shotContainer.id,
|
|
178
|
+
teamId: vendorTeam.id,
|
|
179
|
+
customFields: {
|
|
180
|
+
bidDays: 12.5,
|
|
181
|
+
bidAmountUSD: 15000,
|
|
182
|
+
frameCount: 180,
|
|
183
|
+
resolution: '4K',
|
|
184
|
+
vfxVersion: 'v000'
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
expect(fxBiddingTask.status).toBe('bidding');
|
|
188
|
+
expect(fxBiddingTask.customFields?.bidAmountUSD).toBe(15000);
|
|
189
|
+
// Element Subtask
|
|
190
|
+
const dustElementTask = await engine.createTask({
|
|
191
|
+
projectId: vfxProject.id,
|
|
192
|
+
title: 'Secondary Dust Cloud Elements',
|
|
193
|
+
status: 'bidding',
|
|
194
|
+
priority: 'medium',
|
|
195
|
+
taskType: 'subtask',
|
|
196
|
+
parentId: fxBiddingTask.id,
|
|
197
|
+
customFields: { bidDays: 3 }
|
|
198
|
+
});
|
|
199
|
+
expect(dustElementTask.parentId).toBe(fxBiddingTask.id);
|
|
200
|
+
// 5. Award Bids & Transition to In Production
|
|
201
|
+
const awardedTask = await engine.updateTask(fxBiddingTask.id, {
|
|
202
|
+
status: 'awarded'
|
|
203
|
+
});
|
|
204
|
+
expect(awardedTask?.status).toBe('awarded');
|
|
205
|
+
// Assign to Vendor Artist and start production
|
|
206
|
+
const productionTask = await engine.updateTask(fxBiddingTask.id, {
|
|
207
|
+
status: 'in_production',
|
|
208
|
+
assigneeId: 'vendor_artist_joe',
|
|
209
|
+
reviewerId: 'comp_lead_dave',
|
|
210
|
+
customFields: {
|
|
211
|
+
...fxBiddingTask.customFields,
|
|
212
|
+
vfxVersion: 'v001'
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
expect(productionTask?.status).toBe('in_production');
|
|
216
|
+
expect(productionTask?.assigneeId).toBe('vendor_artist_joe');
|
|
217
|
+
// 6. Review & Approval Process
|
|
218
|
+
// Artist finishes v001 and submits to Internal Review
|
|
219
|
+
const internalReviewTask = await engine.updateTask(fxBiddingTask.id, {
|
|
220
|
+
status: 'internal_review',
|
|
221
|
+
customFields: {
|
|
222
|
+
...productionTask?.customFields,
|
|
223
|
+
vfxVersion: 'v001',
|
|
224
|
+
reviewMediaUrl: 'https://vfx-pipeline.studio.com/reviews/SHOT_101_010_FX_v001.mov'
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
expect(internalReviewTask?.status).toBe('internal_review');
|
|
228
|
+
// Internal Lead rejects v001 and requests revisions with notes
|
|
229
|
+
await engine.store.addComment({
|
|
230
|
+
taskId: fxBiddingTask.id,
|
|
231
|
+
authorId: 'comp_lead_dave',
|
|
232
|
+
content: 'Fire velocity looks great, but debris needs 20% more scale and air resistance.'
|
|
233
|
+
});
|
|
234
|
+
const revisionTask = await engine.updateTask(fxBiddingTask.id, {
|
|
235
|
+
status: 'revision_requested'
|
|
236
|
+
});
|
|
237
|
+
expect(revisionTask?.status).toBe('revision_requested');
|
|
238
|
+
// Artist addresses revisions -> In Production -> Resubmits v002 to Internal Review
|
|
239
|
+
await engine.updateTask(fxBiddingTask.id, {
|
|
240
|
+
status: 'in_production',
|
|
241
|
+
customFields: {
|
|
242
|
+
...revisionTask?.customFields,
|
|
243
|
+
vfxVersion: 'v002'
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
const internalReviewPass = await engine.updateTask(fxBiddingTask.id, {
|
|
247
|
+
status: 'internal_review',
|
|
248
|
+
customFields: {
|
|
249
|
+
...revisionTask?.customFields,
|
|
250
|
+
vfxVersion: 'v002',
|
|
251
|
+
reviewMediaUrl: 'https://vfx-pipeline.studio.com/reviews/SHOT_101_010_FX_v002.mov'
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
expect(internalReviewPass?.status).toBe('internal_review');
|
|
255
|
+
// Internal Lead approves and passes shot to Client Review
|
|
256
|
+
const clientReviewTask = await engine.updateTask(fxBiddingTask.id, {
|
|
257
|
+
status: 'client_review'
|
|
258
|
+
});
|
|
259
|
+
expect(clientReviewTask?.status).toBe('client_review');
|
|
260
|
+
// Director / Client Supervisor approves final shot
|
|
261
|
+
await engine.store.addComment({
|
|
262
|
+
taskId: fxBiddingTask.id,
|
|
263
|
+
authorId: 'vfx_sup_sarah',
|
|
264
|
+
content: 'Client Supervisor approved v002 for final comp assembly.'
|
|
265
|
+
});
|
|
266
|
+
const finalApprovedTask = await engine.updateTask(fxBiddingTask.id, {
|
|
267
|
+
status: 'approved',
|
|
268
|
+
progress: 100
|
|
269
|
+
});
|
|
270
|
+
expect(finalApprovedTask?.status).toBe('approved');
|
|
271
|
+
expect(finalApprovedTask?.progress).toBe(100);
|
|
272
|
+
// Verify task lifecycle status shows completed
|
|
273
|
+
const lifecycle = await engine.getTaskLifecycleState(fxBiddingTask.id);
|
|
274
|
+
expect(lifecycle?.isDone).toBe(true);
|
|
275
|
+
// Verify audit log history recorded all approval steps
|
|
276
|
+
const activities = await engine.store.getActivities({ taskId: fxBiddingTask.id });
|
|
277
|
+
expect(activities.length).toBeGreaterThanOrEqual(6);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
//# sourceMappingURL=use-case-validation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-case-validation.test.js","sourceRoot":"","sources":["../src/use-case-validation.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
package/dist/utils/index.js
CHANGED
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
package/dist/utils/status.js
CHANGED
|
@@ -16,7 +16,7 @@ export function resolveStatusDefinition(statusKey, customDefinitions) {
|
|
|
16
16
|
return DEFAULT_STATUS_DEFINITIONS[statusKey];
|
|
17
17
|
}
|
|
18
18
|
// Fallback heuristic for unknown custom statuses:
|
|
19
|
-
const isDoneKey = ['done', 'completed', 'finished', 'closed', 'canceled', 'cancelled'].includes(statusKey.toLowerCase());
|
|
19
|
+
const isDoneKey = ['done', 'completed', 'finished', 'closed', 'canceled', 'cancelled', 'approved', 'final'].includes(statusKey.toLowerCase());
|
|
20
20
|
const isActiveKey = ['in_progress', 'active', 'working', 'in_review', 'review'].includes(statusKey.toLowerCase());
|
|
21
21
|
return {
|
|
22
22
|
key: statusKey,
|
package/dist/utils/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/utils/status.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,0BAA0B,GAAqC;IAC1E,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE;IACtG,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE;IAC9F,WAAW,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE;IAChH,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE;IAC1G,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE;IACzF,QAAQ,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE;CACzH,CAAC;AAYF,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,iBAAsC;IAEtC,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;QACrE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,IAAI,0BAA0B,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IACD,kDAAkD;IAClD,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/utils/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Workflow, TaskTypeDefinition } from '../types/index.js';
|
|
2
|
+
export declare class WorkflowValidationError extends Error {
|
|
3
|
+
readonly fromStatus: string;
|
|
4
|
+
readonly toStatus: string;
|
|
5
|
+
readonly workflowId?: string;
|
|
6
|
+
constructor(fromStatus: string, toStatus: string, workflowId?: string, message?: string);
|
|
7
|
+
}
|
|
8
|
+
export declare const DEFAULT_TASK_TYPES: TaskTypeDefinition[];
|
|
9
|
+
export declare const DEFAULT_SOFTWARE_WORKFLOW: Workflow;
|
|
10
|
+
export declare const DEFAULT_SIMPLE_WORKFLOW: Workflow;
|
|
11
|
+
export declare const DEFAULT_VFX_WORKFLOW: Workflow;
|
|
12
|
+
export declare function validateTransition(workflow: Workflow | undefined, fromStatus: string, toStatus: string): boolean;
|
|
13
|
+
export declare function getAllowedNextStatuses(workflow: Workflow | undefined, currentStatus: string): string[];
|
|
14
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/utils/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAER,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAG3B,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAExB,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAQxF;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAAkB,EAMlD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,QA6BvC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,QAoBrC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,QAkClC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAST;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,CA0BV"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { DEFAULT_STATUS_DEFINITIONS } from './status.js';
|
|
2
|
+
export class WorkflowValidationError extends Error {
|
|
3
|
+
fromStatus;
|
|
4
|
+
toStatus;
|
|
5
|
+
workflowId;
|
|
6
|
+
constructor(fromStatus, toStatus, workflowId, message) {
|
|
7
|
+
const msg = message || `Illegal status transition from "${fromStatus}" to "${toStatus}"${workflowId ? ` in workflow "${workflowId}"` : ''}.`;
|
|
8
|
+
super(msg);
|
|
9
|
+
this.name = 'WorkflowValidationError';
|
|
10
|
+
this.fromStatus = fromStatus;
|
|
11
|
+
this.toStatus = toStatus;
|
|
12
|
+
this.workflowId = workflowId;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const DEFAULT_TASK_TYPES = [
|
|
16
|
+
{ key: 'task', label: 'Task', description: 'A standard work item', icon: 'check-square' },
|
|
17
|
+
{ key: 'bug', label: 'Bug', description: 'A problem or defect that needs fixing', icon: 'bug' },
|
|
18
|
+
{ key: 'feature', label: 'Feature', description: 'A new capability or enhancement', icon: 'sparkles' },
|
|
19
|
+
{ key: 'epic', label: 'Epic', description: 'A large body of work that spans multiple tasks', icon: 'layers' },
|
|
20
|
+
{ key: 'subtask', label: 'Subtask', description: 'A piece of work required to complete a parent task', icon: 'corner-down-right' }
|
|
21
|
+
];
|
|
22
|
+
export const DEFAULT_SOFTWARE_WORKFLOW = {
|
|
23
|
+
id: 'wf_software_default',
|
|
24
|
+
name: 'Software Development Workflow',
|
|
25
|
+
description: 'Standard software development lifecycle with backlog, review, and completion states.',
|
|
26
|
+
statuses: [
|
|
27
|
+
DEFAULT_STATUS_DEFINITIONS.backlog,
|
|
28
|
+
DEFAULT_STATUS_DEFINITIONS.todo,
|
|
29
|
+
DEFAULT_STATUS_DEFINITIONS.in_progress,
|
|
30
|
+
DEFAULT_STATUS_DEFINITIONS.in_review,
|
|
31
|
+
DEFAULT_STATUS_DEFINITIONS.done,
|
|
32
|
+
DEFAULT_STATUS_DEFINITIONS.canceled
|
|
33
|
+
],
|
|
34
|
+
transitions: [
|
|
35
|
+
{ name: 'Start Work', fromStatusKey: 'backlog', toStatusKey: 'todo' },
|
|
36
|
+
{ name: 'Start Implementation', fromStatusKey: 'todo', toStatusKey: 'in_progress' },
|
|
37
|
+
{ name: 'Complete Task', fromStatusKey: 'todo', toStatusKey: 'done' },
|
|
38
|
+
{ name: 'Submit for Review', fromStatusKey: 'in_progress', toStatusKey: 'in_review' },
|
|
39
|
+
{ name: 'Complete Implementation', fromStatusKey: 'in_progress', toStatusKey: 'done' },
|
|
40
|
+
{ name: 'Approve & Complete', fromStatusKey: 'in_review', toStatusKey: 'done' },
|
|
41
|
+
{ name: 'Request Changes', fromStatusKey: 'in_review', toStatusKey: 'in_progress' },
|
|
42
|
+
{ name: 'Reopen', fromStatusKey: 'done', toStatusKey: 'todo' },
|
|
43
|
+
{ name: 'Cancel', fromStatusKey: '*', toStatusKey: 'canceled' },
|
|
44
|
+
{ name: 'Restore', fromStatusKey: 'canceled', toStatusKey: 'todo' }
|
|
45
|
+
],
|
|
46
|
+
taskTypes: DEFAULT_TASK_TYPES,
|
|
47
|
+
defaultStatusKey: 'todo',
|
|
48
|
+
isDefault: true,
|
|
49
|
+
createdAt: '2026-01-01T00:00:00.000Z',
|
|
50
|
+
updatedAt: '2026-01-01T00:00:00.000Z'
|
|
51
|
+
};
|
|
52
|
+
export const DEFAULT_SIMPLE_WORKFLOW = {
|
|
53
|
+
id: 'wf_simple_default',
|
|
54
|
+
name: 'Simple Task Workflow',
|
|
55
|
+
description: 'Lightweight workflow with To Do, In Progress, and Done states.',
|
|
56
|
+
statuses: [
|
|
57
|
+
DEFAULT_STATUS_DEFINITIONS.todo,
|
|
58
|
+
DEFAULT_STATUS_DEFINITIONS.in_progress,
|
|
59
|
+
DEFAULT_STATUS_DEFINITIONS.done
|
|
60
|
+
],
|
|
61
|
+
transitions: [
|
|
62
|
+
{ name: 'Start', fromStatusKey: 'todo', toStatusKey: 'in_progress' },
|
|
63
|
+
{ name: 'Complete', fromStatusKey: 'todo', toStatusKey: 'done' },
|
|
64
|
+
{ name: 'Complete', fromStatusKey: 'in_progress', toStatusKey: 'done' },
|
|
65
|
+
{ name: 'Reopen', fromStatusKey: 'done', toStatusKey: 'todo' }
|
|
66
|
+
],
|
|
67
|
+
taskTypes: DEFAULT_TASK_TYPES.filter((t) => ['task', 'subtask'].includes(t.key)),
|
|
68
|
+
defaultStatusKey: 'todo',
|
|
69
|
+
isDefault: true,
|
|
70
|
+
createdAt: '2026-01-01T00:00:00.000Z',
|
|
71
|
+
updatedAt: '2026-01-01T00:00:00.000Z'
|
|
72
|
+
};
|
|
73
|
+
export const DEFAULT_VFX_WORKFLOW = {
|
|
74
|
+
id: 'wf_vfx_default',
|
|
75
|
+
name: 'VFX Production Workflow',
|
|
76
|
+
description: 'Visual effects production pipeline from bidding and drafting to internal lead review and client supervisor approval.',
|
|
77
|
+
statuses: [
|
|
78
|
+
{ key: 'bidding', label: 'Bidding & Draft', completionState: 'not_done', executionState: 'inactive' },
|
|
79
|
+
{ key: 'awarded', label: 'Awarded / Ready', completionState: 'not_done', executionState: 'inactive' },
|
|
80
|
+
{ key: 'in_production', label: 'In Production', completionState: 'not_done', executionState: 'active' },
|
|
81
|
+
{ key: 'internal_review', label: 'Internal Review', completionState: 'not_done', executionState: 'active' },
|
|
82
|
+
{ key: 'client_review', label: 'Client Review', completionState: 'not_done', executionState: 'active' },
|
|
83
|
+
{ key: 'revision_requested', label: 'Revision Requested', completionState: 'not_done', executionState: 'active' },
|
|
84
|
+
{ key: 'approved', label: 'Approved (Final)', completionState: 'done', executionState: 'inactive' },
|
|
85
|
+
DEFAULT_STATUS_DEFINITIONS.canceled
|
|
86
|
+
],
|
|
87
|
+
transitions: [
|
|
88
|
+
{ name: 'Award Bid', fromStatusKey: 'bidding', toStatusKey: 'awarded' },
|
|
89
|
+
{ name: 'Start Work', fromStatusKey: 'awarded', toStatusKey: 'in_production' },
|
|
90
|
+
{ name: 'Submit to Lead Review', fromStatusKey: 'in_production', toStatusKey: 'internal_review' },
|
|
91
|
+
{ name: 'Submit to Client Review', fromStatusKey: 'internal_review', toStatusKey: 'client_review' },
|
|
92
|
+
{ name: 'Request Internal Revisions', fromStatusKey: 'internal_review', toStatusKey: 'revision_requested' },
|
|
93
|
+
{ name: 'Request Client Revisions', fromStatusKey: 'client_review', toStatusKey: 'revision_requested' },
|
|
94
|
+
{ name: 'Address Revisions', fromStatusKey: 'revision_requested', toStatusKey: 'in_production' },
|
|
95
|
+
{ name: 'Approve Final Shot', fromStatusKey: 'client_review', toStatusKey: 'approved' },
|
|
96
|
+
{ name: 'Cancel', fromStatusKey: '*', toStatusKey: 'canceled' }
|
|
97
|
+
],
|
|
98
|
+
taskTypes: [
|
|
99
|
+
{ key: 'vfx_task', label: 'VFX Task', description: 'Department task (e.g. Matchmove, Animation, FX, Comp)', icon: 'film' },
|
|
100
|
+
{ key: 'asset', label: 'Asset', description: '3D or 2D asset element', icon: 'box' },
|
|
101
|
+
{ key: 'subtask', label: 'Subtask', description: 'Element subtask required to complete a department task', icon: 'corner-down-right' }
|
|
102
|
+
],
|
|
103
|
+
defaultStatusKey: 'bidding',
|
|
104
|
+
isDefault: false,
|
|
105
|
+
createdAt: '2026-01-01T00:00:00.000Z',
|
|
106
|
+
updatedAt: '2026-01-01T00:00:00.000Z'
|
|
107
|
+
};
|
|
108
|
+
export function validateTransition(workflow, fromStatus, toStatus) {
|
|
109
|
+
if (fromStatus === toStatus)
|
|
110
|
+
return true;
|
|
111
|
+
if (!workflow || !workflow.transitions || workflow.transitions.length === 0)
|
|
112
|
+
return true;
|
|
113
|
+
return workflow.transitions.some((t) => (t.fromStatusKey === '*' || t.fromStatusKey === fromStatus) &&
|
|
114
|
+
(t.toStatusKey === '*' || t.toStatusKey === toStatus));
|
|
115
|
+
}
|
|
116
|
+
export function getAllowedNextStatuses(workflow, currentStatus) {
|
|
117
|
+
if (!workflow || !workflow.statuses || workflow.statuses.length === 0) {
|
|
118
|
+
return Object.keys(DEFAULT_STATUS_DEFINITIONS);
|
|
119
|
+
}
|
|
120
|
+
const allStatusKeys = workflow.statuses.map((s) => s.key);
|
|
121
|
+
if (!workflow.transitions || workflow.transitions.length === 0) {
|
|
122
|
+
return allStatusKeys;
|
|
123
|
+
}
|
|
124
|
+
const matches = workflow.transitions.filter((t) => t.fromStatusKey === '*' || t.fromStatusKey === currentStatus);
|
|
125
|
+
if (matches.some((t) => t.toStatusKey === '*')) {
|
|
126
|
+
return allStatusKeys;
|
|
127
|
+
}
|
|
128
|
+
const allowed = new Set();
|
|
129
|
+
for (const t of matches) {
|
|
130
|
+
if (allStatusKeys.includes(t.toStatusKey)) {
|
|
131
|
+
allowed.add(t.toStatusKey);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return Array.from(allowed);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/utils/workflow.ts"],"names":[],"mappings":"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"}
|