@critical-path/core 0.15.2 → 0.17.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.
Files changed (66) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +25 -0
  3. package/dist/domain/cpm.d.ts +10 -0
  4. package/dist/domain/cpm.d.ts.map +1 -0
  5. package/dist/domain/cpm.js +176 -0
  6. package/dist/domain/cpm.js.map +1 -0
  7. package/dist/domain/cpm.test.d.ts +2 -0
  8. package/dist/domain/cpm.test.d.ts.map +1 -0
  9. package/dist/domain/cpm.test.js +113 -0
  10. package/dist/domain/cpm.test.js.map +1 -0
  11. package/dist/domain/entities.d.ts.map +1 -1
  12. package/dist/domain/entities.js +5 -0
  13. package/dist/domain/entities.js.map +1 -1
  14. package/dist/domain/index.d.ts +3 -0
  15. package/dist/domain/index.d.ts.map +1 -1
  16. package/dist/domain/index.js +3 -0
  17. package/dist/domain/index.js.map +1 -1
  18. package/dist/domain/ladder.d.ts +16 -0
  19. package/dist/domain/ladder.d.ts.map +1 -0
  20. package/dist/domain/ladder.js +352 -0
  21. package/dist/domain/ladder.js.map +1 -0
  22. package/dist/domain/ladder.test.d.ts +2 -0
  23. package/dist/domain/ladder.test.d.ts.map +1 -0
  24. package/dist/domain/ladder.test.js +213 -0
  25. package/dist/domain/ladder.test.js.map +1 -0
  26. package/dist/domain/metrics.d.ts +29 -0
  27. package/dist/domain/metrics.d.ts.map +1 -0
  28. package/dist/domain/metrics.js +403 -0
  29. package/dist/domain/metrics.js.map +1 -0
  30. package/dist/domain/metrics.test.d.ts +2 -0
  31. package/dist/domain/metrics.test.d.ts.map +1 -0
  32. package/dist/domain/metrics.test.js +251 -0
  33. package/dist/domain/metrics.test.js.map +1 -0
  34. package/dist/engine/index.d.ts +8 -1
  35. package/dist/engine/index.d.ts.map +1 -1
  36. package/dist/engine/index.js +124 -1
  37. package/dist/engine/index.js.map +1 -1
  38. package/dist/store/firebase.d.ts +3 -1
  39. package/dist/store/firebase.d.ts.map +1 -1
  40. package/dist/store/firebase.js +1 -1
  41. package/dist/store/firebase.js.map +1 -1
  42. package/dist/store/index.d.ts +6 -2
  43. package/dist/store/index.d.ts.map +1 -1
  44. package/dist/store/index.js +1 -1
  45. package/dist/store/index.js.map +1 -1
  46. package/dist/store/sqlite.d.ts +3 -1
  47. package/dist/store/sqlite.d.ts.map +1 -1
  48. package/dist/store/sqlite.js +1 -1
  49. package/dist/store/sqlite.js.map +1 -1
  50. package/dist/types/index.d.ts +177 -0
  51. package/dist/types/index.d.ts.map +1 -1
  52. package/package.json +1 -1
  53. package/src/domain/cpm.test.ts +128 -0
  54. package/src/domain/cpm.ts +215 -0
  55. package/src/domain/entities.ts +6 -0
  56. package/src/domain/index.ts +4 -0
  57. package/src/domain/ladder.test.ts +251 -0
  58. package/src/domain/ladder.ts +453 -0
  59. package/src/domain/metrics.test.ts +286 -0
  60. package/src/domain/metrics.ts +484 -0
  61. package/src/engine/index.ts +169 -4
  62. package/src/store/firebase.ts +2 -2
  63. package/src/store/index.ts +3 -3
  64. package/src/store/sqlite.ts +2 -2
  65. package/src/types/index.ts +206 -0
  66. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,403 @@
1
+ import { resolveStatusDefinition } from '../utils/status.js';
2
+ /**
3
+ * Infer task progress percentage from explicit user input, todos/checklists,
4
+ * logged effort vs estimate, and elapsed schedule duration.
5
+ */
6
+ export function inferTaskProgress(task, options) {
7
+ const referenceDate = options?.referenceDate ?? new Date();
8
+ const statusDef = resolveStatusDefinition(task.status, options?.customStatusDefinitions);
9
+ const semanticStatus = task.semanticStatus || statusDef.category;
10
+ // Completed tasks are 100% complete
11
+ if (semanticStatus === 'completed') {
12
+ return {
13
+ progressPercentage: 100,
14
+ source: task.progress === 100 ? 'explicit' : 'blended',
15
+ isExplicit: task.progress !== undefined && task.progress !== null,
16
+ breakdown: {
17
+ explicitProgress: task.progress,
18
+ todoProgress: task.todos && task.todos.length > 0 ? 100 : undefined,
19
+ effortProgress: 100,
20
+ scheduleProgress: 100
21
+ }
22
+ };
23
+ }
24
+ // 1. Explicit Progress
25
+ let explicitProgress;
26
+ if (task.progress !== undefined && task.progress !== null) {
27
+ explicitProgress = Math.min(100, Math.max(0, Math.round(task.progress * 10) / 10));
28
+ }
29
+ // 2. Checklist / Todo Progress
30
+ let todoProgress;
31
+ if (task.todos && task.todos.length > 0) {
32
+ const completed = task.todos.filter((t) => t.completed).length;
33
+ todoProgress = Math.round((completed / task.todos.length) * 1000) / 10;
34
+ }
35
+ // 3. Effort / Hours Progress (Logged vs Estimated)
36
+ let effortProgress;
37
+ const estimatedH = task.estimatedHours || (task.estimatedDurationMinutes ? task.estimatedDurationMinutes / 60 : 0);
38
+ const loggedH = task.loggedHours || task.actualHours || 0;
39
+ if (estimatedH > 0) {
40
+ effortProgress = Math.min(100, Math.round((loggedH / estimatedH) * 1000) / 10);
41
+ }
42
+ // 4. Schedule Elapsed Progress
43
+ let scheduleProgress;
44
+ const startDateStr = task.actualStartDate || task.plannedStartDate;
45
+ if (startDateStr && task.dueDate && semanticStatus === 'in_progress') {
46
+ const startTime = new Date(startDateStr).getTime();
47
+ const dueTime = new Date(task.dueDate).getTime();
48
+ const nowTime = referenceDate.getTime();
49
+ if (!isNaN(startTime) && !isNaN(dueTime) && dueTime > startTime) {
50
+ const elapsed = nowTime - startTime;
51
+ const total = dueTime - startTime;
52
+ const ratio = Math.min(1, Math.max(0, elapsed / total));
53
+ scheduleProgress = Math.round(ratio * 1000) / 10;
54
+ }
55
+ }
56
+ // Select canonical progress percentage and primary inference source
57
+ let progressPercentage = 0;
58
+ let source = 'explicit';
59
+ if (explicitProgress !== undefined && explicitProgress > 0) {
60
+ progressPercentage = explicitProgress;
61
+ source = 'explicit';
62
+ }
63
+ else if (todoProgress !== undefined && todoProgress > 0) {
64
+ progressPercentage = todoProgress;
65
+ source = 'todos';
66
+ }
67
+ else if (effortProgress !== undefined && effortProgress > 0 && semanticStatus === 'in_progress') {
68
+ progressPercentage = effortProgress;
69
+ source = 'time_effort';
70
+ }
71
+ else if (scheduleProgress !== undefined && scheduleProgress > 0 && semanticStatus === 'in_progress') {
72
+ progressPercentage = scheduleProgress;
73
+ source = 'schedule_elapsed';
74
+ }
75
+ else if (explicitProgress !== undefined) {
76
+ progressPercentage = explicitProgress;
77
+ source = 'explicit';
78
+ }
79
+ else {
80
+ progressPercentage = 0;
81
+ source = 'explicit';
82
+ }
83
+ return {
84
+ progressPercentage,
85
+ source,
86
+ isExplicit: explicitProgress !== undefined,
87
+ breakdown: {
88
+ explicitProgress,
89
+ todoProgress,
90
+ effortProgress,
91
+ scheduleProgress
92
+ }
93
+ };
94
+ }
95
+ /**
96
+ * Calculate Earned Value Management (EVM) metrics for a task.
97
+ */
98
+ export function calculateTaskEVM(task, options) {
99
+ const referenceDate = options?.referenceDate ?? new Date();
100
+ const statusDef = resolveStatusDefinition(task.status, options?.customStatusDefinitions);
101
+ const semanticStatus = task.semanticStatus || statusDef.category;
102
+ const estimatedHours = task.estimatedHours || (task.estimatedDurationMinutes ? task.estimatedDurationMinutes / 60 : 0);
103
+ const actualCost = Math.round(((task.loggedHours ?? task.actualHours) || 0) * 100) / 100;
104
+ if (estimatedHours <= 0) {
105
+ return {
106
+ plannedValue: actualCost,
107
+ earnedValue: actualCost,
108
+ actualCost,
109
+ costVariance: 0,
110
+ scheduleVariance: 0,
111
+ costPerformanceIndex: 1.0,
112
+ schedulePerformanceIndex: 1.0
113
+ };
114
+ }
115
+ const progress = options?.progressInference ?? inferTaskProgress(task, options);
116
+ const actualProgressRatio = Math.min(1, Math.max(0, progress.progressPercentage / 100));
117
+ const earnedValue = Math.round(actualProgressRatio * estimatedHours * 100) / 100;
118
+ // Compute Planned Value (PV) based on expected progress at reference date
119
+ let plannedRatio = 0;
120
+ if (semanticStatus === 'completed') {
121
+ plannedRatio = 1.0;
122
+ }
123
+ else {
124
+ const startStr = task.plannedStartDate || task.actualStartDate;
125
+ if (startStr && task.dueDate) {
126
+ const startTime = new Date(startStr).getTime();
127
+ const dueTime = new Date(task.dueDate).getTime();
128
+ const nowTime = referenceDate.getTime();
129
+ if (!isNaN(startTime) && !isNaN(dueTime)) {
130
+ if (nowTime <= startTime) {
131
+ plannedRatio = 0;
132
+ }
133
+ else if (nowTime >= dueTime) {
134
+ plannedRatio = 1.0;
135
+ }
136
+ else {
137
+ plannedRatio = (nowTime - startTime) / (dueTime - startTime);
138
+ }
139
+ }
140
+ }
141
+ else if (task.dueDate) {
142
+ const dueTime = new Date(task.dueDate).getTime();
143
+ if (!isNaN(dueTime) && referenceDate.getTime() >= dueTime) {
144
+ plannedRatio = 1.0;
145
+ }
146
+ else if (semanticStatus === 'in_progress') {
147
+ plannedRatio = 0.5;
148
+ }
149
+ }
150
+ else if (semanticStatus === 'in_progress') {
151
+ plannedRatio = 0.5;
152
+ }
153
+ }
154
+ const plannedValue = Math.round(plannedRatio * estimatedHours * 100) / 100;
155
+ const costVariance = Math.round((earnedValue - actualCost) * 100) / 100;
156
+ const scheduleVariance = Math.round((earnedValue - plannedValue) * 100) / 100;
157
+ const costPerformanceIndex = actualCost > 0
158
+ ? Math.round((earnedValue / actualCost) * 100) / 100
159
+ : earnedValue > 0 ? 1.0 : 1.0;
160
+ const schedulePerformanceIndex = plannedValue > 0
161
+ ? Math.round((earnedValue / plannedValue) * 100) / 100
162
+ : earnedValue > 0 ? 1.0 : 1.0;
163
+ return {
164
+ plannedValue,
165
+ earnedValue,
166
+ actualCost,
167
+ costVariance,
168
+ scheduleVariance,
169
+ costPerformanceIndex,
170
+ schedulePerformanceIndex
171
+ };
172
+ }
173
+ /**
174
+ * Reconstruct task progress history and curve shape from activity logs.
175
+ */
176
+ export function reconstructTaskProgressHistory(task, activities = [], options) {
177
+ const referenceDate = options?.referenceDate ?? new Date();
178
+ const taskActivities = activities
179
+ .filter((a) => a.taskId === task.id)
180
+ .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
181
+ const points = [];
182
+ // Point 0: Task creation
183
+ points.push({
184
+ timestamp: task.createdAt,
185
+ progress: 0,
186
+ inferredProgress: 0,
187
+ status: 'todo',
188
+ semanticStatus: 'not_started',
189
+ action: 'task.created'
190
+ });
191
+ let runningProgress = 0;
192
+ let runningStatus = task.status;
193
+ for (const act of taskActivities) {
194
+ let pointProgress = runningProgress;
195
+ let pointInferred;
196
+ const details = (act.details || {});
197
+ if (act.action === 'task.status_changed') {
198
+ const newStatus = details.toStatus || details.newStatus || runningStatus;
199
+ runningStatus = newStatus;
200
+ const def = resolveStatusDefinition(newStatus, options?.customStatusDefinitions);
201
+ if (def.category === 'completed') {
202
+ pointProgress = 100;
203
+ pointInferred = 100;
204
+ }
205
+ }
206
+ else if (act.action === 'task.updated') {
207
+ if (typeof details.progress === 'number') {
208
+ pointProgress = Math.min(100, Math.max(0, details.progress));
209
+ }
210
+ else if (details.updates && typeof details.updates.progress === 'number') {
211
+ pointProgress = Math.min(100, Math.max(0, details.updates.progress));
212
+ }
213
+ }
214
+ runningProgress = pointProgress;
215
+ const def = resolveStatusDefinition(runningStatus, options?.customStatusDefinitions);
216
+ points.push({
217
+ timestamp: act.createdAt,
218
+ progress: pointProgress,
219
+ inferredProgress: pointInferred,
220
+ status: runningStatus,
221
+ semanticStatus: def.category,
222
+ action: act.action
223
+ });
224
+ }
225
+ // Ensure latest current state is reflected at the end if different from last point
226
+ const currentInferred = inferTaskProgress(task, options);
227
+ const currentProgress = task.progress ?? currentInferred.progressPercentage;
228
+ const lastPoint = points[points.length - 1];
229
+ if (!lastPoint || lastPoint.progress !== currentProgress || lastPoint.status !== task.status) {
230
+ points.push({
231
+ timestamp: task.updatedAt || referenceDate.toISOString(),
232
+ progress: currentProgress,
233
+ inferredProgress: currentInferred.progressPercentage,
234
+ status: task.status,
235
+ semanticStatus: task.semanticStatus || resolveStatusDefinition(task.status, options?.customStatusDefinitions).category,
236
+ action: 'snapshot.current'
237
+ });
238
+ }
239
+ // Deduplicate any points with exact same timestamp
240
+ const uniquePoints = [];
241
+ const seenTimestamps = new Set();
242
+ for (const pt of points) {
243
+ if (!seenTimestamps.has(pt.timestamp + pt.action)) {
244
+ seenTimestamps.add(pt.timestamp + pt.action);
245
+ uniquePoints.push(pt);
246
+ }
247
+ }
248
+ // Classify curve profile
249
+ const curveProfile = classifyCurveProfile(uniquePoints, task, referenceDate);
250
+ return {
251
+ taskId: task.id,
252
+ points: uniquePoints,
253
+ curveProfile
254
+ };
255
+ }
256
+ function classifyCurveProfile(points, task, referenceDate) {
257
+ if (points.length < 3) {
258
+ return 'insufficient_data';
259
+ }
260
+ const startPt = points[0];
261
+ const endPt = points[points.length - 1];
262
+ const startTime = new Date(startPt.timestamp).getTime();
263
+ const endTime = new Date(endPt.timestamp).getTime();
264
+ const totalDuration = endTime - startTime;
265
+ if (totalDuration <= 0) {
266
+ return 'insufficient_data';
267
+ }
268
+ // Check if stalled: last 2 or more points have same progress for an extended span while in progress
269
+ const statusDef = resolveStatusDefinition(task.status);
270
+ if (statusDef.category === 'in_progress') {
271
+ const lastActivity = new Date(endPt.timestamp).getTime();
272
+ const stallThresholdMs = 5 * 24 * 60 * 60 * 1000;
273
+ if (referenceDate.getTime() - lastActivity > stallThresholdMs) {
274
+ return 'stalled';
275
+ }
276
+ }
277
+ // Sample progress at 25%, 50%, and 75% marks of timeline
278
+ const p25Time = startTime + totalDuration * 0.25;
279
+ const p50Time = startTime + totalDuration * 0.50;
280
+ const p75Time = startTime + totalDuration * 0.75;
281
+ const getInterpolatedProgress = (t) => {
282
+ if (t <= startTime)
283
+ return points[0].progress;
284
+ if (t >= endTime)
285
+ return endPt.progress;
286
+ for (let i = 0; i < points.length - 1; i++) {
287
+ const pA = points[i];
288
+ const pB = points[i + 1];
289
+ const tA = new Date(pA.timestamp).getTime();
290
+ const tB = new Date(pB.timestamp).getTime();
291
+ if (t >= tA && t <= tB) {
292
+ if (tB === tA)
293
+ return pA.progress;
294
+ const fraction = (t - tA) / (tB - tA);
295
+ return pA.progress + fraction * (pB.progress - pA.progress);
296
+ }
297
+ }
298
+ return endPt.progress;
299
+ };
300
+ const p25 = getInterpolatedProgress(p25Time);
301
+ const p50 = getInterpolatedProgress(p50Time);
302
+ const p75 = getInterpolatedProgress(p75Time);
303
+ const finalP = endPt.progress;
304
+ const totalGain = finalP - startPt.progress;
305
+ if (totalGain <= 5) {
306
+ return 'stalled';
307
+ }
308
+ // Early Surge: Reached > 60% early on (by 25% or 50% time) and flattened
309
+ if (p25 >= 60 || (p50 >= 65 && finalP - p50 <= 15)) {
310
+ return 'early_surge';
311
+ }
312
+ // Late Rush: Little progress (< 25%) until late in the timeline (75%), then steep jump
313
+ if (p50 <= 20 && p75 <= 35 && finalP >= 70) {
314
+ return 'late_rush';
315
+ }
316
+ // S-Curve: Slow start (p25 <= 25), steep middle acceleration (p75 - p25 >= 55), slow finish (finalP - p75 <= 20)
317
+ if (p25 <= 25 && (p75 - p25) >= 55 && (finalP - p75) <= 20) {
318
+ return 's_curve';
319
+ }
320
+ // Default steady progression
321
+ return 'linear';
322
+ }
323
+ /**
324
+ * Calculate comprehensive multi-dimensional metrics for a task.
325
+ */
326
+ export function calculateTaskMetrics(task, activities = [], timeEntries = [], options) {
327
+ const referenceDate = options?.referenceDate ?? new Date();
328
+ const taskTimeEntries = timeEntries.filter((te) => te.taskId === task.id);
329
+ const taskActivities = activities.filter((a) => a.taskId === task.id);
330
+ const loggedHoursFromEntries = taskTimeEntries.reduce((sum, e) => sum + e.hours, 0);
331
+ const effectiveLoggedHours = Math.max(loggedHoursFromEntries, task.loggedHours || 0, task.actualHours || 0);
332
+ const estimatedHours = task.estimatedHours || (task.estimatedDurationMinutes ? task.estimatedDurationMinutes / 60 : 0);
333
+ const varianceHours = Math.round((effectiveLoggedHours - estimatedHours) * 100) / 100;
334
+ // Multi-dimensional variance
335
+ let scheduleVarianceDays;
336
+ if (task.dueDate && task.actualEndDate) {
337
+ const dueTime = new Date(task.dueDate).getTime();
338
+ const actualTime = new Date(task.actualEndDate).getTime();
339
+ if (!isNaN(dueTime) && !isNaN(actualTime)) {
340
+ scheduleVarianceDays = Math.round((actualTime - dueTime) / (1000 * 60 * 60 * 24));
341
+ }
342
+ }
343
+ let durationVarianceHours;
344
+ if (task.actualStartDate && task.actualEndDate && task.plannedStartDate && task.dueDate) {
345
+ const actualDuration = (new Date(task.actualEndDate).getTime() - new Date(task.actualStartDate).getTime()) / (1000 * 60 * 60);
346
+ const plannedDuration = (new Date(task.dueDate).getTime() - new Date(task.plannedStartDate).getTime()) / (1000 * 60 * 60);
347
+ if (!isNaN(actualDuration) && !isNaN(plannedDuration)) {
348
+ durationVarianceHours = Math.round((actualDuration - plannedDuration) * 100) / 100;
349
+ }
350
+ }
351
+ const accuracyRatio = estimatedHours > 0
352
+ ? Math.round((effectiveLoggedHours / estimatedHours) * 100) / 100
353
+ : undefined;
354
+ const nowIso = referenceDate.toISOString();
355
+ const isOverdue = Boolean(task.dueDate &&
356
+ task.dueDate < nowIso &&
357
+ task.semanticStatus !== 'completed' &&
358
+ task.semanticStatus !== 'canceled');
359
+ const isOverEstimate = Boolean(estimatedHours > 0 && effectiveLoggedHours > estimatedHours);
360
+ const realityDelta = {
361
+ plannedStartDate: task.plannedStartDate,
362
+ actualStartDate: task.actualStartDate,
363
+ dueDate: task.dueDate,
364
+ actualEndDate: task.actualEndDate,
365
+ estimatedHours: Math.round(estimatedHours * 100) / 100,
366
+ loggedHours: Math.round(effectiveLoggedHours * 100) / 100,
367
+ varianceHours,
368
+ effortVarianceHours: varianceHours,
369
+ durationVarianceHours,
370
+ scheduleVarianceDays,
371
+ accuracyRatio,
372
+ isOverdue,
373
+ isOverEstimate
374
+ };
375
+ // Compute Inferred Actuals
376
+ let activeWorkingHours;
377
+ if (task.actualStartDate && task.actualEndDate) {
378
+ const startMs = new Date(task.actualStartDate).getTime();
379
+ const endMs = new Date(task.actualEndDate).getTime();
380
+ if (!isNaN(startMs) && !isNaN(endMs) && endMs >= startMs) {
381
+ activeWorkingHours = Math.round(((endMs - startMs) / (1000 * 60 * 60)) * 100) / 100;
382
+ }
383
+ }
384
+ const inferredActuals = {
385
+ actualStartDate: task.actualStartDate,
386
+ actualEndDate: task.actualEndDate,
387
+ isStartDateInferred: Boolean(task.actualStartDate && !task.plannedStartDate),
388
+ isEndDateInferred: Boolean(task.actualEndDate && task.semanticStatus === 'completed'),
389
+ activeWorkingHours
390
+ };
391
+ const progress = inferTaskProgress(task, options);
392
+ const evm = calculateTaskEVM(task, { ...options, progressInference: progress });
393
+ const progressHistory = reconstructTaskProgressHistory(task, taskActivities, options);
394
+ return {
395
+ taskId: task.id,
396
+ inferredActuals,
397
+ realityDelta,
398
+ progress,
399
+ evm,
400
+ progressHistory
401
+ };
402
+ }
403
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/domain/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metrics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.test.d.ts","sourceRoot":"","sources":["../../src/domain/metrics.test.ts"],"names":[],"mappings":""}