@critical-path/core 0.1.2 → 0.2.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 +19 -0
- package/README.md +43 -26
- package/dist/engine/index.d.ts +19 -1
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +129 -6
- package/dist/engine/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +96 -1
- package/dist/index.test.js.map +1 -1
- package/dist/store/firebase.d.ts +113 -0
- package/dist/store/firebase.d.ts.map +1 -0
- package/dist/store/firebase.js +319 -0
- package/dist/store/firebase.js.map +1 -0
- package/dist/store/firebase.test.d.ts +2 -0
- package/dist/store/firebase.test.d.ts.map +1 -0
- package/dist/store/firebase.test.js +45 -0
- package/dist/store/firebase.test.js.map +1 -0
- package/dist/store/index.d.ts +36 -8
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +78 -12
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite.d.ts +61 -0
- package/dist/store/sqlite.d.ts.map +1 -0
- package/dist/store/sqlite.js +492 -0
- package/dist/store/sqlite.js.map +1 -0
- package/dist/store/sqlite.test.d.ts +2 -0
- package/dist/store/sqlite.test.d.ts.map +1 -0
- package/dist/store/sqlite.test.js +63 -0
- package/dist/store/sqlite.test.js.map +1 -0
- package/dist/types/index.d.ts +68 -8
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/status.d.ts +14 -0
- package/dist/utils/status.d.ts.map +1 -0
- package/dist/utils/status.js +58 -0
- package/dist/utils/status.js.map +1 -0
- package/package.json +9 -1
- package/src/engine/index.ts +161 -8
- package/src/index.test.ts +113 -1
- package/src/index.ts +1 -0
- package/src/store/firebase.test.ts +59 -0
- package/src/store/firebase.ts +381 -0
- package/src/store/index.ts +113 -19
- package/src/store/sqlite.test.ts +78 -0
- package/src/store/sqlite.ts +729 -0
- package/src/types/index.ts +74 -9
- package/src/utils/status.ts +85 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @critical-path/core
|
|
2
|
+
|
|
3
|
+
## 0.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- df22aad: Remove implicit InMemoryFirestoreMock fallback and require explicit db parameter in FirebaseStore constructor
|
|
8
|
+
|
|
9
|
+
## 0.2.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 755286a: Add native `SQLiteStore` (using `node:sqlite`) and `FirebaseStore` (Firestore) storage adapters with full CRUD support for projects, tasks, sprints, comments, activities, time entries, dependencies, and webhooks.
|
|
14
|
+
|
|
15
|
+
## 0.1.2
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Initial open-source release of the core headless domain engine, plugin lifecycle hooks, and in-memory store.
|
package/README.md
CHANGED
|
@@ -1,55 +1,72 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@critical-path/core`
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
`@critical-path/core` provides the core business logic, type definitions, storage abstractions, and plugin lifecycle hooks for the [Critical Path](https://github.com/Pixerate/Critical-Path) headless project management framework.
|
|
3
|
+
> The foundational domain engine, plugin lifecycle hooks, and storage adapters for **Critical Path**.
|
|
6
4
|
|
|
7
5
|
---
|
|
8
6
|
|
|
9
|
-
## 📦
|
|
7
|
+
## 📦 Features
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
- **Domain Engine**: Complete business logic for projects, tasks, sprints, comments, activities, time tracking, task dependencies, and webhooks.
|
|
10
|
+
- **Plugin Lifecycle Architecture**: Extensible hooks (`beforeTaskCreate`, `afterTaskUpdate`, `beforeTaskDelete`, etc.).
|
|
11
|
+
- **Multiple Built-in Storage Adapters**:
|
|
12
|
+
- `InMemoryStore`: Fast, zero-config in-memory storage for local dev and testing.
|
|
13
|
+
- `SQLiteStore`: Embedded relational database storage powered by native Node.js SQLite (`node:sqlite`).
|
|
14
|
+
- `FirebaseStore`: Firestore collection mapping for cloud-native web and mobile backends.
|
|
15
|
+
- Custom `StorageAdapter` interface for connecting PostgreSQL, Prisma, or Drizzle.
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
-
## 🚀
|
|
19
|
+
## 🚀 Usage Example
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
- **`CriticalPathEngine`**: Central engine that coordinates storage operations and executes plugin lifecycle hooks.
|
|
23
|
-
- **Storage Abstraction**: `StorageAdapter` interface for connecting custom databases (PostgreSQL, SQLite, Prisma, Drizzle) and included `InMemoryStore`.
|
|
24
|
-
- **Strapi-Style Plugin Architecture**: `PluginRegistry` supporting lifecycle hooks (`beforeTaskCreate`, `afterTaskUpdate`, `beforeTaskDelete`).
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 💡 Quick Example
|
|
21
|
+
### Using SQLiteStore
|
|
29
22
|
|
|
30
23
|
```ts
|
|
31
|
-
import { CriticalPathEngine,
|
|
24
|
+
import { CriticalPathEngine, SQLiteStore } from '@critical-path/core';
|
|
32
25
|
|
|
33
|
-
|
|
26
|
+
// Initialize SQLite database store (file-backed or :memory:)
|
|
27
|
+
const store = new SQLiteStore({ filename: 'critical-path.db' });
|
|
34
28
|
const engine = new CriticalPathEngine({ store });
|
|
35
29
|
|
|
36
30
|
// Create a project
|
|
37
31
|
const project = await engine.createProject({
|
|
38
32
|
key: 'MAIN',
|
|
39
|
-
name: 'Core
|
|
33
|
+
name: 'Core Roadmap'
|
|
40
34
|
});
|
|
41
35
|
|
|
42
36
|
// Create a task
|
|
43
37
|
const task = await engine.createTask({
|
|
44
38
|
projectId: project.id,
|
|
45
|
-
title: 'Setup
|
|
46
|
-
status: '
|
|
39
|
+
title: 'Setup Database Migration',
|
|
40
|
+
status: 'todo',
|
|
47
41
|
priority: 'high'
|
|
48
42
|
});
|
|
49
43
|
```
|
|
50
44
|
|
|
45
|
+
### Using FirebaseStore
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import { CriticalPathEngine, FirebaseStore } from '@critical-path/core';
|
|
49
|
+
|
|
50
|
+
// Initialize Firebase / Firestore store
|
|
51
|
+
const store = new FirebaseStore({ db: myFirestoreInstance });
|
|
52
|
+
const engine = new CriticalPathEngine({ store });
|
|
53
|
+
```
|
|
54
|
+
|
|
51
55
|
---
|
|
52
56
|
|
|
53
|
-
##
|
|
57
|
+
## 🔌 Creating a Custom Plugin
|
|
54
58
|
|
|
55
|
-
|
|
59
|
+
```ts
|
|
60
|
+
import type { CriticalPathPlugin } from '@critical-path/core';
|
|
61
|
+
|
|
62
|
+
export const auditPlugin: CriticalPathPlugin = {
|
|
63
|
+
id: 'audit-logger',
|
|
64
|
+
name: 'Audit Logger',
|
|
65
|
+
version: '1.0.0',
|
|
66
|
+
hooks: {
|
|
67
|
+
beforeTaskCreate: (task) => {
|
|
68
|
+
return { ...task, tags: [...(task.tags || []), 'AUDITED'] };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
```
|
package/dist/engine/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { CriticalPathConfig, Project, Task } from '../types/index.js';
|
|
1
|
+
import type { CriticalPathConfig, Project, Task, TaskDependencyGraph, Team, TaskContainer, Iteration } from '../types/index.js';
|
|
2
2
|
import { StorageAdapter } from '../store/index.js';
|
|
3
3
|
import { PluginRegistry } from '../plugins/index.js';
|
|
4
|
+
import { type TaskLifecycleState } from '../utils/status.js';
|
|
4
5
|
export declare class CriticalPathEngine {
|
|
5
6
|
readonly store: StorageAdapter;
|
|
6
7
|
readonly plugins: PluginRegistry;
|
|
@@ -14,6 +15,23 @@ export declare class CriticalPathEngine {
|
|
|
14
15
|
createTask(taskInput: Omit<Task, 'id' | 'createdAt' | 'updatedAt'>): Promise<Task>;
|
|
15
16
|
updateTask(id: string, updates: Partial<Task>): Promise<Task | null>;
|
|
16
17
|
deleteTask(id: string): Promise<boolean>;
|
|
18
|
+
getTaskDependencyGraph(taskId: string): Promise<TaskDependencyGraph>;
|
|
19
|
+
getTaskLifecycleState(taskId: string): Promise<TaskLifecycleState | null>;
|
|
20
|
+
getTeams(): Promise<Team[]>;
|
|
21
|
+
getTeam(id: string): Promise<Team | null>;
|
|
22
|
+
createTeam(team: Omit<Team, 'id' | 'createdAt' | 'updatedAt'>): Promise<Team>;
|
|
23
|
+
updateTeam(id: string, updates: Partial<Team>): Promise<Team | null>;
|
|
24
|
+
deleteTeam(id: string): Promise<boolean>;
|
|
25
|
+
getContainers(projectId: string): Promise<TaskContainer[]>;
|
|
26
|
+
getContainer(id: string): Promise<TaskContainer | null>;
|
|
27
|
+
createContainer(container: Omit<TaskContainer, 'id' | 'createdAt' | 'updatedAt'>): Promise<TaskContainer>;
|
|
28
|
+
updateContainer(id: string, updates: Partial<TaskContainer>): Promise<TaskContainer | null>;
|
|
29
|
+
deleteContainer(id: string): Promise<boolean>;
|
|
30
|
+
getIterations(projectId: string): Promise<Iteration[]>;
|
|
31
|
+
getIteration(id: string): Promise<Iteration | null>;
|
|
32
|
+
createIteration(iteration: Omit<Iteration, 'id' | 'createdAt'>): Promise<Iteration>;
|
|
33
|
+
updateIteration(id: string, updates: Partial<Iteration>): Promise<Iteration | null>;
|
|
34
|
+
deleteIteration(id: string): Promise<boolean>;
|
|
17
35
|
private dispatchWebhook;
|
|
18
36
|
}
|
|
19
37
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { InMemoryStore } from '../store/index.js';
|
|
2
2
|
import { PluginRegistry } from '../plugins/index.js';
|
|
3
|
+
import { deriveTaskLifecycleState } from '../utils/status.js';
|
|
3
4
|
export class CriticalPathEngine {
|
|
4
5
|
store;
|
|
5
6
|
plugins;
|
|
@@ -23,13 +24,28 @@ export class CriticalPathEngine {
|
|
|
23
24
|
await this.store.createProject(p);
|
|
24
25
|
}
|
|
25
26
|
}
|
|
27
|
+
if (data.teams) {
|
|
28
|
+
for (const tm of data.teams) {
|
|
29
|
+
await this.store.createTeam(tm);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (data.containers) {
|
|
33
|
+
for (const c of data.containers) {
|
|
34
|
+
await this.store.createContainer(c);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (data.iterations) {
|
|
38
|
+
for (const it of data.iterations) {
|
|
39
|
+
await this.store.createIteration(it);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
26
42
|
if (data.tasks) {
|
|
27
43
|
for (const t of data.tasks) {
|
|
28
44
|
await this.store.createTask(t);
|
|
29
45
|
}
|
|
30
46
|
}
|
|
31
47
|
}
|
|
32
|
-
// ---
|
|
48
|
+
// --- Projects ---
|
|
33
49
|
async getProjects() {
|
|
34
50
|
return this.store.getProjects();
|
|
35
51
|
}
|
|
@@ -47,6 +63,7 @@ export class CriticalPathEngine {
|
|
|
47
63
|
this.dispatchWebhook('project.created', { project: created });
|
|
48
64
|
return created;
|
|
49
65
|
}
|
|
66
|
+
// --- Tasks ---
|
|
50
67
|
async getTasks(projectId) {
|
|
51
68
|
return this.store.getTasks(projectId);
|
|
52
69
|
}
|
|
@@ -54,7 +71,6 @@ export class CriticalPathEngine {
|
|
|
54
71
|
return this.store.getTask(id);
|
|
55
72
|
}
|
|
56
73
|
async createTask(taskInput) {
|
|
57
|
-
// Run plugin beforeTaskCreate hooks
|
|
58
74
|
const processedInput = await this.plugins.runBeforeTaskCreate(taskInput);
|
|
59
75
|
const created = await this.store.createTask({
|
|
60
76
|
projectId: processedInput.projectId || taskInput.projectId,
|
|
@@ -64,15 +80,26 @@ export class CriticalPathEngine {
|
|
|
64
80
|
priority: processedInput.priority || taskInput.priority || 'medium',
|
|
65
81
|
assigneeId: processedInput.assigneeId ?? taskInput.assigneeId,
|
|
66
82
|
reporterId: processedInput.reporterId ?? taskInput.reporterId,
|
|
67
|
-
|
|
83
|
+
reviewerId: processedInput.reviewerId ?? taskInput.reviewerId,
|
|
84
|
+
iterationId: processedInput.iterationId ?? taskInput.iterationId,
|
|
85
|
+
teamId: processedInput.teamId ?? taskInput.teamId,
|
|
86
|
+
containerId: processedInput.containerId ?? taskInput.containerId,
|
|
87
|
+
plannedStartDate: processedInput.plannedStartDate ?? taskInput.plannedStartDate,
|
|
88
|
+
actualStartDate: processedInput.actualStartDate ?? taskInput.actualStartDate,
|
|
89
|
+
actualEndDate: processedInput.actualEndDate ?? taskInput.actualEndDate,
|
|
68
90
|
dueDate: processedInput.dueDate ?? taskInput.dueDate,
|
|
69
91
|
estimatedHours: processedInput.estimatedHours ?? taskInput.estimatedHours,
|
|
70
92
|
loggedHours: processedInput.loggedHours ?? taskInput.loggedHours ?? 0,
|
|
93
|
+
actualHours: processedInput.actualHours ?? taskInput.actualHours,
|
|
94
|
+
billableHours: processedInput.billableHours ?? taskInput.billableHours,
|
|
95
|
+
estimatedDurationMinutes: processedInput.estimatedDurationMinutes ?? taskInput.estimatedDurationMinutes,
|
|
96
|
+
actualDurationMinutes: processedInput.actualDurationMinutes ?? taskInput.actualDurationMinutes,
|
|
97
|
+
billableDurationMinutes: processedInput.billableDurationMinutes ?? taskInput.billableDurationMinutes,
|
|
98
|
+
progress: processedInput.progress ?? taskInput.progress ?? 0,
|
|
71
99
|
tags: processedInput.tags ?? taskInput.tags ?? [],
|
|
72
100
|
customFields: processedInput.customFields ?? taskInput.customFields ?? {},
|
|
73
101
|
parentId: processedInput.parentId ?? taskInput.parentId
|
|
74
102
|
});
|
|
75
|
-
// Run plugin afterTaskCreate hooks
|
|
76
103
|
await this.plugins.runAfterTaskCreate(created);
|
|
77
104
|
await this.store.logActivity({
|
|
78
105
|
projectId: created.projectId,
|
|
@@ -126,17 +153,113 @@ export class CriticalPathEngine {
|
|
|
126
153
|
}
|
|
127
154
|
return deleted;
|
|
128
155
|
}
|
|
156
|
+
// --- Task Dependencies & Graph ---
|
|
157
|
+
async getTaskDependencyGraph(taskId) {
|
|
158
|
+
const dependencies = await this.store.getDependencies(taskId);
|
|
159
|
+
const upstreamTaskIds = new Set();
|
|
160
|
+
const downstreamTaskIds = new Set();
|
|
161
|
+
for (const dep of dependencies) {
|
|
162
|
+
if (dep.taskId === taskId) {
|
|
163
|
+
upstreamTaskIds.add(dep.dependsOnTaskId);
|
|
164
|
+
}
|
|
165
|
+
else if (dep.dependsOnTaskId === taskId) {
|
|
166
|
+
downstreamTaskIds.add(dep.taskId);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const upstreamTasks = (await Promise.all(Array.from(upstreamTaskIds).map((id) => this.store.getTask(id)))).filter((t) => t !== null);
|
|
170
|
+
const downstreamTasks = (await Promise.all(Array.from(downstreamTaskIds).map((id) => this.store.getTask(id)))).filter((t) => t !== null);
|
|
171
|
+
return {
|
|
172
|
+
taskId,
|
|
173
|
+
upstreamTasks,
|
|
174
|
+
downstreamTasks,
|
|
175
|
+
dependencies
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async getTaskLifecycleState(taskId) {
|
|
179
|
+
const task = await this.getTask(taskId);
|
|
180
|
+
if (!task)
|
|
181
|
+
return null;
|
|
182
|
+
const project = await this.getProject(task.projectId);
|
|
183
|
+
return deriveTaskLifecycleState(task, project?.statusDefinitions);
|
|
184
|
+
}
|
|
185
|
+
// --- Teams ---
|
|
186
|
+
async getTeams() {
|
|
187
|
+
return this.store.getTeams();
|
|
188
|
+
}
|
|
189
|
+
async getTeam(id) {
|
|
190
|
+
return this.store.getTeam(id);
|
|
191
|
+
}
|
|
192
|
+
async createTeam(team) {
|
|
193
|
+
const created = await this.store.createTeam(team);
|
|
194
|
+
this.dispatchWebhook('team.created', { team: created });
|
|
195
|
+
return created;
|
|
196
|
+
}
|
|
197
|
+
async updateTeam(id, updates) {
|
|
198
|
+
return this.store.updateTeam(id, updates);
|
|
199
|
+
}
|
|
200
|
+
async deleteTeam(id) {
|
|
201
|
+
return this.store.deleteTeam(id);
|
|
202
|
+
}
|
|
203
|
+
// --- Containers ---
|
|
204
|
+
async getContainers(projectId) {
|
|
205
|
+
return this.store.getContainers(projectId);
|
|
206
|
+
}
|
|
207
|
+
async getContainer(id) {
|
|
208
|
+
return this.store.getContainer(id);
|
|
209
|
+
}
|
|
210
|
+
async createContainer(container) {
|
|
211
|
+
const created = await this.store.createContainer(container);
|
|
212
|
+
this.dispatchWebhook('container.created', { container: created });
|
|
213
|
+
return created;
|
|
214
|
+
}
|
|
215
|
+
async updateContainer(id, updates) {
|
|
216
|
+
return this.store.updateContainer(id, updates);
|
|
217
|
+
}
|
|
218
|
+
async deleteContainer(id) {
|
|
219
|
+
return this.store.deleteContainer(id);
|
|
220
|
+
}
|
|
221
|
+
// --- Iterations ---
|
|
222
|
+
async getIterations(projectId) {
|
|
223
|
+
return this.store.getIterations(projectId);
|
|
224
|
+
}
|
|
225
|
+
async getIteration(id) {
|
|
226
|
+
return this.store.getIteration(id);
|
|
227
|
+
}
|
|
228
|
+
async createIteration(iteration) {
|
|
229
|
+
const created = await this.store.createIteration(iteration);
|
|
230
|
+
if (created.status === 'active') {
|
|
231
|
+
this.dispatchWebhook('iteration.started', { iteration: created });
|
|
232
|
+
}
|
|
233
|
+
return created;
|
|
234
|
+
}
|
|
235
|
+
async updateIteration(id, updates) {
|
|
236
|
+
const existing = await this.store.getIteration(id);
|
|
237
|
+
if (!existing)
|
|
238
|
+
return null;
|
|
239
|
+
const updated = await this.store.updateIteration(id, updates);
|
|
240
|
+
if (updated) {
|
|
241
|
+
if (existing.status !== 'active' && updated.status === 'active') {
|
|
242
|
+
this.dispatchWebhook('iteration.started', { iteration: updated });
|
|
243
|
+
}
|
|
244
|
+
else if (existing.status !== 'completed' && updated.status === 'completed') {
|
|
245
|
+
this.dispatchWebhook('iteration.completed', { iteration: updated });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return updated;
|
|
249
|
+
}
|
|
250
|
+
async deleteIteration(id) {
|
|
251
|
+
return this.store.deleteIteration(id);
|
|
252
|
+
}
|
|
129
253
|
async dispatchWebhook(event, payload) {
|
|
130
254
|
const webhooks = await this.store.getWebhooks();
|
|
131
255
|
const active = webhooks.filter((w) => w.active && w.events.includes(event));
|
|
132
256
|
for (const wh of active) {
|
|
133
|
-
// Fire-and-forget webhook post
|
|
134
257
|
fetch(wh.url, {
|
|
135
258
|
method: 'POST',
|
|
136
259
|
headers: { 'Content-Type': 'application/json' },
|
|
137
260
|
body: JSON.stringify({ event, timestamp: new Date().toISOString(), data: payload })
|
|
138
261
|
}).catch(() => {
|
|
139
|
-
// Silent catch for webhook
|
|
262
|
+
// Silent catch for webhook errors in dev
|
|
140
263
|
});
|
|
141
264
|
}
|
|
142
265
|
}
|
package/dist/engine/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { CriticalPathEngine } from './
|
|
2
|
+
import { CriticalPathEngine } from './index.js';
|
|
3
3
|
describe('CriticalPathEngine Core Tests', () => {
|
|
4
4
|
it('creates projects and tasks with activity logs', async () => {
|
|
5
5
|
const engine = new CriticalPathEngine();
|
|
@@ -48,5 +48,100 @@ describe('CriticalPathEngine Core Tests', () => {
|
|
|
48
48
|
expect(hookExecuted).toBe(true);
|
|
49
49
|
expect(task.tags).toContain('auto-tagged');
|
|
50
50
|
});
|
|
51
|
+
it('handles teams, containers, and iterations', async () => {
|
|
52
|
+
const engine = new CriticalPathEngine();
|
|
53
|
+
const team = await engine.createTeam({
|
|
54
|
+
name: 'Engineering',
|
|
55
|
+
memberIds: ['user_1', 'user_2']
|
|
56
|
+
});
|
|
57
|
+
const proj = await engine.createProject({
|
|
58
|
+
key: 'ENG',
|
|
59
|
+
name: 'Engineering Project',
|
|
60
|
+
teamIds: [team.id]
|
|
61
|
+
});
|
|
62
|
+
const container = await engine.createContainer({
|
|
63
|
+
projectId: proj.id,
|
|
64
|
+
name: 'Core Platform Epic',
|
|
65
|
+
type: 'epic'
|
|
66
|
+
});
|
|
67
|
+
const iteration = await engine.createIteration({
|
|
68
|
+
projectId: proj.id,
|
|
69
|
+
name: 'Sprint 1',
|
|
70
|
+
type: 'sprint',
|
|
71
|
+
status: 'active'
|
|
72
|
+
});
|
|
73
|
+
const task = await engine.createTask({
|
|
74
|
+
projectId: proj.id,
|
|
75
|
+
title: 'Setup Database Schema',
|
|
76
|
+
status: 'in_progress',
|
|
77
|
+
priority: 'urgent',
|
|
78
|
+
reviewerId: 'user_2',
|
|
79
|
+
teamId: team.id,
|
|
80
|
+
containerId: container.id,
|
|
81
|
+
iterationId: iteration.id,
|
|
82
|
+
plannedStartDate: '2026-09-01T00:00:00.000Z',
|
|
83
|
+
dueDate: '2026-09-15T00:00:00.000Z',
|
|
84
|
+
estimatedHours: 10,
|
|
85
|
+
actualHours: 8,
|
|
86
|
+
billableHours: 8,
|
|
87
|
+
estimatedDurationMinutes: 600,
|
|
88
|
+
actualDurationMinutes: 480,
|
|
89
|
+
billableDurationMinutes: 480,
|
|
90
|
+
progress: 80
|
|
91
|
+
});
|
|
92
|
+
expect(task.reviewerId).toBe('user_2');
|
|
93
|
+
expect(task.teamId).toBe(team.id);
|
|
94
|
+
expect(task.containerId).toBe(container.id);
|
|
95
|
+
expect(task.iterationId).toBe(iteration.id);
|
|
96
|
+
expect(task.estimatedHours).toBe(10);
|
|
97
|
+
expect(task.actualHours).toBe(8);
|
|
98
|
+
expect(task.billableHours).toBe(8);
|
|
99
|
+
expect(task.estimatedDurationMinutes).toBe(600);
|
|
100
|
+
expect(task.actualDurationMinutes).toBe(480);
|
|
101
|
+
expect(task.billableDurationMinutes).toBe(480);
|
|
102
|
+
expect(task.progress).toBe(80);
|
|
103
|
+
});
|
|
104
|
+
it('evaluates status definitions and task lifecycle state', async () => {
|
|
105
|
+
const engine = new CriticalPathEngine();
|
|
106
|
+
const proj = await engine.createProject({
|
|
107
|
+
key: 'CUST',
|
|
108
|
+
name: 'Custom Workflow Project',
|
|
109
|
+
statusDefinitions: [
|
|
110
|
+
{ key: 'draft', label: 'Draft', completionState: 'not_done', executionState: 'inactive' },
|
|
111
|
+
{ key: 'active_work', label: 'Active Work', completionState: 'not_done', executionState: 'active' },
|
|
112
|
+
{ key: 'finished', label: 'Finished', completionState: 'done', executionState: 'inactive' }
|
|
113
|
+
]
|
|
114
|
+
});
|
|
115
|
+
const task = await engine.createTask({
|
|
116
|
+
projectId: proj.id,
|
|
117
|
+
title: 'Workflow Task',
|
|
118
|
+
status: 'active_work',
|
|
119
|
+
priority: 'medium',
|
|
120
|
+
plannedStartDate: '2026-08-01T00:00:00.000Z',
|
|
121
|
+
dueDate: '2026-08-10T00:00:00.000Z'
|
|
122
|
+
});
|
|
123
|
+
const state = await engine.getTaskLifecycleState(task.id);
|
|
124
|
+
expect(state).not.toBeNull();
|
|
125
|
+
expect(state?.completionState).toBe('not_done');
|
|
126
|
+
expect(state?.executionState).toBe('active');
|
|
127
|
+
expect(state?.isActive).toBe(true);
|
|
128
|
+
expect(state?.isDone).toBe(false);
|
|
129
|
+
});
|
|
130
|
+
it('builds task dependency graph with upstream and downstream tasks', async () => {
|
|
131
|
+
const engine = new CriticalPathEngine();
|
|
132
|
+
const proj = await engine.createProject({ key: 'DEP', name: 'Dependency Project' });
|
|
133
|
+
const taskA = await engine.createTask({ projectId: proj.id, title: 'Task A', status: 'todo', priority: 'medium' });
|
|
134
|
+
const taskB = await engine.createTask({ projectId: proj.id, title: 'Task B', status: 'todo', priority: 'medium' });
|
|
135
|
+
// Task B depends on Task A
|
|
136
|
+
await engine.store.addDependency({
|
|
137
|
+
taskId: taskB.id,
|
|
138
|
+
dependsOnTaskId: taskA.id,
|
|
139
|
+
type: 'blocking'
|
|
140
|
+
});
|
|
141
|
+
const graphA = await engine.getTaskDependencyGraph(taskA.id);
|
|
142
|
+
expect(graphA.downstreamTasks.map((t) => t.id)).toContain(taskB.id);
|
|
143
|
+
const graphB = await engine.getTaskDependencyGraph(taskB.id);
|
|
144
|
+
expect(graphB.upstreamTasks.map((t) => t.id)).toContain(taskA.id);
|
|
145
|
+
});
|
|
51
146
|
});
|
|
52
147
|
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|