@critical-path/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/engine/index.d.ts +19 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +144 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +52 -0
- package/dist/index.test.js.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +59 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/store/index.d.ts +66 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +154 -0
- package/dist/store/index.js.map +1 -0
- package/dist/types/index.d.ts +130 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +29 -0
- package/src/engine/index.ts +169 -0
- package/src/index.test.ts +63 -0
- package/src/index.ts +4 -0
- package/src/plugins/index.ts +68 -0
- package/src/store/index.ts +224 -0
- package/src/types/index.ts +154 -0
- package/tsconfig.json +8 -0
- package/tsconfig.tsbuildinfo +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jack James
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CriticalPathConfig, Project, Task } from '../types/index.js';
|
|
2
|
+
import { StorageAdapter } from '../store/index.js';
|
|
3
|
+
import { PluginRegistry } from '../plugins/index.js';
|
|
4
|
+
export declare class CriticalPathEngine {
|
|
5
|
+
readonly store: StorageAdapter;
|
|
6
|
+
readonly plugins: PluginRegistry;
|
|
7
|
+
constructor(config?: CriticalPathConfig);
|
|
8
|
+
private seedInitialData;
|
|
9
|
+
getProjects(): Promise<Project[]>;
|
|
10
|
+
getProject(id: string): Promise<Project | null>;
|
|
11
|
+
createProject(project: Omit<Project, 'id' | 'createdAt' | 'updatedAt'>): Promise<Project>;
|
|
12
|
+
getTasks(projectId?: string): Promise<Task[]>;
|
|
13
|
+
getTask(id: string): Promise<Task | null>;
|
|
14
|
+
createTask(taskInput: Omit<Task, 'id' | 'createdAt' | 'updatedAt'>): Promise<Task>;
|
|
15
|
+
updateTask(id: string, updates: Partial<Task>): Promise<Task | null>;
|
|
16
|
+
deleteTask(id: string): Promise<boolean>;
|
|
17
|
+
private dispatchWebhook;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAgB,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAiB,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,kBAAkB;IAC7B,SAAgB,KAAK,EAAE,cAAc,CAAC;IACtC,SAAgB,OAAO,EAAE,cAAc,CAAC;gBAE5B,MAAM,GAAE,kBAAuB;YAkB7B,eAAe;IAevB,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIjC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAI/C,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAYzF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAI7C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIzC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAoClF,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA2BpE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAqBhC,eAAe;CAe9B"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { InMemoryStore } from '../store/index.js';
|
|
2
|
+
import { PluginRegistry } from '../plugins/index.js';
|
|
3
|
+
export class CriticalPathEngine {
|
|
4
|
+
store;
|
|
5
|
+
plugins;
|
|
6
|
+
constructor(config = {}) {
|
|
7
|
+
this.store = typeof config.store === 'object' && config.store !== null
|
|
8
|
+
? config.store
|
|
9
|
+
: new InMemoryStore();
|
|
10
|
+
this.plugins = new PluginRegistry();
|
|
11
|
+
if (config.plugins) {
|
|
12
|
+
for (const plugin of config.plugins) {
|
|
13
|
+
this.plugins.register(plugin);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (config.initialData) {
|
|
17
|
+
this.seedInitialData(config.initialData);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async seedInitialData(data) {
|
|
21
|
+
if (data.projects) {
|
|
22
|
+
for (const p of data.projects) {
|
|
23
|
+
await this.store.createProject(p);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (data.tasks) {
|
|
27
|
+
for (const t of data.tasks) {
|
|
28
|
+
await this.store.createTask(t);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// --- Domain Methods with Plugin Hooks & Audit Logging ---
|
|
33
|
+
async getProjects() {
|
|
34
|
+
return this.store.getProjects();
|
|
35
|
+
}
|
|
36
|
+
async getProject(id) {
|
|
37
|
+
return this.store.getProject(id);
|
|
38
|
+
}
|
|
39
|
+
async createProject(project) {
|
|
40
|
+
const created = await this.store.createProject(project);
|
|
41
|
+
await this.store.logActivity({
|
|
42
|
+
projectId: created.id,
|
|
43
|
+
actorId: project.ownerId || 'system',
|
|
44
|
+
action: 'project.created',
|
|
45
|
+
details: { name: created.name, key: created.key }
|
|
46
|
+
});
|
|
47
|
+
this.dispatchWebhook('project.created', { project: created });
|
|
48
|
+
return created;
|
|
49
|
+
}
|
|
50
|
+
async getTasks(projectId) {
|
|
51
|
+
return this.store.getTasks(projectId);
|
|
52
|
+
}
|
|
53
|
+
async getTask(id) {
|
|
54
|
+
return this.store.getTask(id);
|
|
55
|
+
}
|
|
56
|
+
async createTask(taskInput) {
|
|
57
|
+
// Run plugin beforeTaskCreate hooks
|
|
58
|
+
const processedInput = await this.plugins.runBeforeTaskCreate(taskInput);
|
|
59
|
+
const created = await this.store.createTask({
|
|
60
|
+
projectId: processedInput.projectId || taskInput.projectId,
|
|
61
|
+
title: processedInput.title || taskInput.title,
|
|
62
|
+
description: processedInput.description ?? taskInput.description,
|
|
63
|
+
status: processedInput.status || taskInput.status || 'todo',
|
|
64
|
+
priority: processedInput.priority || taskInput.priority || 'medium',
|
|
65
|
+
assigneeId: processedInput.assigneeId ?? taskInput.assigneeId,
|
|
66
|
+
reporterId: processedInput.reporterId ?? taskInput.reporterId,
|
|
67
|
+
sprintId: processedInput.sprintId ?? taskInput.sprintId,
|
|
68
|
+
dueDate: processedInput.dueDate ?? taskInput.dueDate,
|
|
69
|
+
estimatedHours: processedInput.estimatedHours ?? taskInput.estimatedHours,
|
|
70
|
+
loggedHours: processedInput.loggedHours ?? taskInput.loggedHours ?? 0,
|
|
71
|
+
tags: processedInput.tags ?? taskInput.tags ?? [],
|
|
72
|
+
customFields: processedInput.customFields ?? taskInput.customFields ?? {},
|
|
73
|
+
parentId: processedInput.parentId ?? taskInput.parentId
|
|
74
|
+
});
|
|
75
|
+
// Run plugin afterTaskCreate hooks
|
|
76
|
+
await this.plugins.runAfterTaskCreate(created);
|
|
77
|
+
await this.store.logActivity({
|
|
78
|
+
projectId: created.projectId,
|
|
79
|
+
taskId: created.id,
|
|
80
|
+
actorId: created.reporterId || 'system',
|
|
81
|
+
action: 'task.created',
|
|
82
|
+
details: { title: created.title, status: created.status }
|
|
83
|
+
});
|
|
84
|
+
this.dispatchWebhook('task.created', { task: created });
|
|
85
|
+
return created;
|
|
86
|
+
}
|
|
87
|
+
async updateTask(id, updates) {
|
|
88
|
+
const existing = await this.store.getTask(id);
|
|
89
|
+
if (!existing)
|
|
90
|
+
return null;
|
|
91
|
+
const processedUpdates = await this.plugins.runBeforeTaskUpdate(id, updates);
|
|
92
|
+
const updated = await this.store.updateTask(id, processedUpdates);
|
|
93
|
+
if (!updated)
|
|
94
|
+
return null;
|
|
95
|
+
await this.plugins.runAfterTaskUpdate(updated, existing);
|
|
96
|
+
const isStatusChange = existing.status !== updated.status;
|
|
97
|
+
await this.store.logActivity({
|
|
98
|
+
projectId: updated.projectId,
|
|
99
|
+
taskId: updated.id,
|
|
100
|
+
actorId: updated.assigneeId || 'system',
|
|
101
|
+
action: isStatusChange ? 'task.status_changed' : 'task.updated',
|
|
102
|
+
details: { fromStatus: existing.status, toStatus: updated.status }
|
|
103
|
+
});
|
|
104
|
+
this.dispatchWebhook(isStatusChange ? 'task.status_changed' : 'task.updated', {
|
|
105
|
+
task: updated,
|
|
106
|
+
previous: existing
|
|
107
|
+
});
|
|
108
|
+
return updated;
|
|
109
|
+
}
|
|
110
|
+
async deleteTask(id) {
|
|
111
|
+
const existing = await this.store.getTask(id);
|
|
112
|
+
if (!existing)
|
|
113
|
+
return false;
|
|
114
|
+
await this.plugins.runBeforeTaskDelete(id);
|
|
115
|
+
const deleted = await this.store.deleteTask(id);
|
|
116
|
+
if (deleted) {
|
|
117
|
+
await this.plugins.runAfterTaskDelete(id);
|
|
118
|
+
await this.store.logActivity({
|
|
119
|
+
projectId: existing.projectId,
|
|
120
|
+
taskId: id,
|
|
121
|
+
actorId: 'system',
|
|
122
|
+
action: 'task.deleted',
|
|
123
|
+
details: { title: existing.title }
|
|
124
|
+
});
|
|
125
|
+
this.dispatchWebhook('task.deleted', { taskId: id, title: existing.title });
|
|
126
|
+
}
|
|
127
|
+
return deleted;
|
|
128
|
+
}
|
|
129
|
+
async dispatchWebhook(event, payload) {
|
|
130
|
+
const webhooks = await this.store.getWebhooks();
|
|
131
|
+
const active = webhooks.filter((w) => w.active && w.events.includes(event));
|
|
132
|
+
for (const wh of active) {
|
|
133
|
+
// Fire-and-forget webhook post
|
|
134
|
+
fetch(wh.url, {
|
|
135
|
+
method: 'POST',
|
|
136
|
+
headers: { 'Content-Type': 'application/json' },
|
|
137
|
+
body: JSON.stringify({ event, timestamp: new Date().toISOString(), data: payload })
|
|
138
|
+
}).catch(() => {
|
|
139
|
+
// Silent catch for webhook delivery errors in dev
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { CriticalPathEngine } from './engine/index.js';
|
|
3
|
+
describe('CriticalPathEngine Core Tests', () => {
|
|
4
|
+
it('creates projects and tasks with activity logs', async () => {
|
|
5
|
+
const engine = new CriticalPathEngine();
|
|
6
|
+
const proj = await engine.createProject({
|
|
7
|
+
key: 'TEST',
|
|
8
|
+
name: 'Test Project',
|
|
9
|
+
description: 'A test project'
|
|
10
|
+
});
|
|
11
|
+
expect(proj.id).toBeDefined();
|
|
12
|
+
expect(proj.key).toBe('TEST');
|
|
13
|
+
const task = await engine.createTask({
|
|
14
|
+
projectId: proj.id,
|
|
15
|
+
title: 'First Task',
|
|
16
|
+
status: 'todo',
|
|
17
|
+
priority: 'high'
|
|
18
|
+
});
|
|
19
|
+
expect(task.id).toBeDefined();
|
|
20
|
+
expect(task.title).toBe('First Task');
|
|
21
|
+
const activities = await engine.store.getActivities({ projectId: proj.id });
|
|
22
|
+
expect(activities.length).toBeGreaterThanOrEqual(2);
|
|
23
|
+
});
|
|
24
|
+
it('runs plugin hooks on task lifecycle', async () => {
|
|
25
|
+
let hookExecuted = false;
|
|
26
|
+
const testPlugin = {
|
|
27
|
+
id: 'auto-tag-plugin',
|
|
28
|
+
name: 'Auto Tag Plugin',
|
|
29
|
+
version: '1.0.0',
|
|
30
|
+
hooks: {
|
|
31
|
+
beforeTaskCreate: (task) => {
|
|
32
|
+
hookExecuted = true;
|
|
33
|
+
return {
|
|
34
|
+
...task,
|
|
35
|
+
tags: [...(task.tags || []), 'auto-tagged']
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const engine = new CriticalPathEngine({ plugins: [testPlugin] });
|
|
41
|
+
const proj = await engine.createProject({ key: 'PLUG', name: 'Plugin Proj' });
|
|
42
|
+
const task = await engine.createTask({
|
|
43
|
+
projectId: proj.id,
|
|
44
|
+
title: 'Plugin Task',
|
|
45
|
+
status: 'todo',
|
|
46
|
+
priority: 'medium'
|
|
47
|
+
});
|
|
48
|
+
expect(hookExecuted).toBe(true);
|
|
49
|
+
expect(task.tags).toContain('auto-tagged');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +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,EAAE,MAAM,mBAAmB,CAAC;AAGvD,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACtC,GAAG,EAAE,MAAM;YACX,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,gBAAgB;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,MAAM,UAAU,GAAuB;YACrC,EAAE,EAAE,iBAAiB;YACrB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE;gBACL,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE;oBACzB,YAAY,GAAG,IAAI,CAAC;oBACpB,OAAO;wBACL,GAAG,IAAI;wBACP,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC;qBAC5C,CAAC;gBACJ,CAAC;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEjE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,aAAa;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CriticalPathPlugin, Task } from '../types/index.js';
|
|
2
|
+
export declare class PluginRegistry {
|
|
3
|
+
private plugins;
|
|
4
|
+
register(plugin: CriticalPathPlugin): void;
|
|
5
|
+
getPlugins(): CriticalPathPlugin[];
|
|
6
|
+
runBeforeTaskCreate(task: Partial<Task>): Promise<Partial<Task>>;
|
|
7
|
+
runAfterTaskCreate(task: Task): Promise<void>;
|
|
8
|
+
runBeforeTaskUpdate(id: string, updates: Partial<Task>): Promise<Partial<Task>>;
|
|
9
|
+
runAfterTaskUpdate(task: Task, previousState: Task): Promise<void>;
|
|
10
|
+
runBeforeTaskDelete(id: string): Promise<void>;
|
|
11
|
+
runAfterTaskDelete(id: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAElE,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAyC;IAExD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAO1C,UAAU,IAAI,kBAAkB,EAAE;IAI5B,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAUhE,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAU/E,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export class PluginRegistry {
|
|
2
|
+
plugins = new Map();
|
|
3
|
+
register(plugin) {
|
|
4
|
+
if (this.plugins.has(plugin.id)) {
|
|
5
|
+
throw new Error(`Plugin with ID "${plugin.id}" is already registered.`);
|
|
6
|
+
}
|
|
7
|
+
this.plugins.set(plugin.id, plugin);
|
|
8
|
+
}
|
|
9
|
+
getPlugins() {
|
|
10
|
+
return Array.from(this.plugins.values());
|
|
11
|
+
}
|
|
12
|
+
async runBeforeTaskCreate(task) {
|
|
13
|
+
let currentTask = { ...task };
|
|
14
|
+
for (const plugin of this.plugins.values()) {
|
|
15
|
+
if (plugin.hooks?.beforeTaskCreate) {
|
|
16
|
+
currentTask = await plugin.hooks.beforeTaskCreate(currentTask);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return currentTask;
|
|
20
|
+
}
|
|
21
|
+
async runAfterTaskCreate(task) {
|
|
22
|
+
for (const plugin of this.plugins.values()) {
|
|
23
|
+
if (plugin.hooks?.afterTaskCreate) {
|
|
24
|
+
await plugin.hooks.afterTaskCreate(task);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async runBeforeTaskUpdate(id, updates) {
|
|
29
|
+
let currentUpdates = { ...updates };
|
|
30
|
+
for (const plugin of this.plugins.values()) {
|
|
31
|
+
if (plugin.hooks?.beforeTaskUpdate) {
|
|
32
|
+
currentUpdates = await plugin.hooks.beforeTaskUpdate(id, currentUpdates);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return currentUpdates;
|
|
36
|
+
}
|
|
37
|
+
async runAfterTaskUpdate(task, previousState) {
|
|
38
|
+
for (const plugin of this.plugins.values()) {
|
|
39
|
+
if (plugin.hooks?.afterTaskUpdate) {
|
|
40
|
+
await plugin.hooks.afterTaskUpdate(task, previousState);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async runBeforeTaskDelete(id) {
|
|
45
|
+
for (const plugin of this.plugins.values()) {
|
|
46
|
+
if (plugin.hooks?.beforeTaskDelete) {
|
|
47
|
+
await plugin.hooks.beforeTaskDelete(id);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async runAfterTaskDelete(id) {
|
|
52
|
+
for (const plugin of this.plugins.values()) {
|
|
53
|
+
if (plugin.hooks?.afterTaskDelete) {
|
|
54
|
+
await plugin.hooks.afterTaskDelete(id);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { Project, Task, Sprint, Comment, TimeEntry, Activity, Webhook, TaskDependency } from '../types/index.js';
|
|
2
|
+
export interface StorageAdapter {
|
|
3
|
+
getProjects(): Promise<Project[]>;
|
|
4
|
+
getProject(id: string): Promise<Project | null>;
|
|
5
|
+
createProject(project: Omit<Project, 'id' | 'createdAt' | 'updatedAt'>): Promise<Project>;
|
|
6
|
+
updateProject(id: string, updates: Partial<Project>): Promise<Project | null>;
|
|
7
|
+
deleteProject(id: string): Promise<boolean>;
|
|
8
|
+
getTasks(projectId?: string): Promise<Task[]>;
|
|
9
|
+
getTask(id: string): Promise<Task | null>;
|
|
10
|
+
createTask(task: Omit<Task, 'id' | 'createdAt' | 'updatedAt'>): Promise<Task>;
|
|
11
|
+
updateTask(id: string, updates: Partial<Task>): Promise<Task | null>;
|
|
12
|
+
deleteTask(id: string): Promise<boolean>;
|
|
13
|
+
getSprints(projectId: string): Promise<Sprint[]>;
|
|
14
|
+
createSprint(sprint: Omit<Sprint, 'id' | 'createdAt'>): Promise<Sprint>;
|
|
15
|
+
updateSprint(id: string, updates: Partial<Sprint>): Promise<Sprint | null>;
|
|
16
|
+
getComments(taskId: string): Promise<Comment[]>;
|
|
17
|
+
addComment(comment: Omit<Comment, 'id' | 'createdAt' | 'updatedAt'>): Promise<Comment>;
|
|
18
|
+
getActivities(filter?: {
|
|
19
|
+
projectId?: string;
|
|
20
|
+
taskId?: string;
|
|
21
|
+
}): Promise<Activity[]>;
|
|
22
|
+
logActivity(activity: Omit<Activity, 'id' | 'createdAt'>): Promise<Activity>;
|
|
23
|
+
getTimeEntries(taskId: string): Promise<TimeEntry[]>;
|
|
24
|
+
logTime(entry: Omit<TimeEntry, 'id' | 'loggedAt'>): Promise<TimeEntry>;
|
|
25
|
+
getDependencies(taskId: string): Promise<TaskDependency[]>;
|
|
26
|
+
addDependency(dep: Omit<TaskDependency, 'id'>): Promise<TaskDependency>;
|
|
27
|
+
getWebhooks(): Promise<Webhook[]>;
|
|
28
|
+
addWebhook(webhook: Omit<Webhook, 'id' | 'createdAt'>): Promise<Webhook>;
|
|
29
|
+
}
|
|
30
|
+
export declare class InMemoryStore implements StorageAdapter {
|
|
31
|
+
private projects;
|
|
32
|
+
private tasks;
|
|
33
|
+
private sprints;
|
|
34
|
+
private comments;
|
|
35
|
+
private activities;
|
|
36
|
+
private timeEntries;
|
|
37
|
+
private dependencies;
|
|
38
|
+
private webhooks;
|
|
39
|
+
getProjects(): Promise<Project[]>;
|
|
40
|
+
getProject(id: string): Promise<Project | null>;
|
|
41
|
+
createProject(project: Omit<Project, 'id' | 'createdAt' | 'updatedAt'>): Promise<Project>;
|
|
42
|
+
updateProject(id: string, updates: Partial<Project>): Promise<Project | null>;
|
|
43
|
+
deleteProject(id: string): Promise<boolean>;
|
|
44
|
+
getTasks(projectId?: string): Promise<Task[]>;
|
|
45
|
+
getTask(id: string): Promise<Task | null>;
|
|
46
|
+
createTask(task: Omit<Task, 'id' | 'createdAt' | 'updatedAt'>): Promise<Task>;
|
|
47
|
+
updateTask(id: string, updates: Partial<Task>): Promise<Task | null>;
|
|
48
|
+
deleteTask(id: string): Promise<boolean>;
|
|
49
|
+
getSprints(projectId: string): Promise<Sprint[]>;
|
|
50
|
+
createSprint(sprint: Omit<Sprint, 'id' | 'createdAt'>): Promise<Sprint>;
|
|
51
|
+
updateSprint(id: string, updates: Partial<Sprint>): Promise<Sprint | null>;
|
|
52
|
+
getComments(taskId: string): Promise<Comment[]>;
|
|
53
|
+
addComment(comment: Omit<Comment, 'id' | 'createdAt' | 'updatedAt'>): Promise<Comment>;
|
|
54
|
+
getActivities(filter?: {
|
|
55
|
+
projectId?: string;
|
|
56
|
+
taskId?: string;
|
|
57
|
+
}): Promise<Activity[]>;
|
|
58
|
+
logActivity(activity: Omit<Activity, 'id' | 'createdAt'>): Promise<Activity>;
|
|
59
|
+
getTimeEntries(taskId: string): Promise<TimeEntry[]>;
|
|
60
|
+
logTime(entry: Omit<TimeEntry, 'id' | 'loggedAt'>): Promise<TimeEntry>;
|
|
61
|
+
getDependencies(taskId: string): Promise<TaskDependency[]>;
|
|
62
|
+
addDependency(dep: Omit<TaskDependency, 'id'>): Promise<TaskDependency>;
|
|
63
|
+
getWebhooks(): Promise<Webhook[]>;
|
|
64
|
+
addWebhook(webhook: Omit<Webhook, 'id' | 'createdAt'>): Promise<Webhook>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,IAAI,EAEJ,MAAM,EACN,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,cAAc;IAE7B,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAChD,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC9E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAG5C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC1C,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACrE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGzC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAG3E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvF,aAAa,CAAC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrF,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAG7E,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAGvE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3D,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAGxE,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAClC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAED,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,QAAQ,CAA8B;IAExC,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIjC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAI/C,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAazF,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAY7E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQ7C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIzC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7E,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAYpE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIhD,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ1E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAI/C,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtF,aAAa,CAAC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAQpF,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAO5E,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAIpD,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAOtE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAM1D,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAOvE,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIjC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAM/E"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
export class InMemoryStore {
|
|
2
|
+
projects = new Map();
|
|
3
|
+
tasks = new Map();
|
|
4
|
+
sprints = new Map();
|
|
5
|
+
comments = new Map();
|
|
6
|
+
activities = [];
|
|
7
|
+
timeEntries = new Map();
|
|
8
|
+
dependencies = new Map();
|
|
9
|
+
webhooks = new Map();
|
|
10
|
+
async getProjects() {
|
|
11
|
+
return Array.from(this.projects.values());
|
|
12
|
+
}
|
|
13
|
+
async getProject(id) {
|
|
14
|
+
return this.projects.get(id) || null;
|
|
15
|
+
}
|
|
16
|
+
async createProject(project) {
|
|
17
|
+
const id = `proj_${Math.random().toString(36).substring(2, 9)}`;
|
|
18
|
+
const now = new Date().toISOString();
|
|
19
|
+
const newProject = {
|
|
20
|
+
...project,
|
|
21
|
+
id,
|
|
22
|
+
createdAt: now,
|
|
23
|
+
updatedAt: now
|
|
24
|
+
};
|
|
25
|
+
this.projects.set(id, newProject);
|
|
26
|
+
return newProject;
|
|
27
|
+
}
|
|
28
|
+
async updateProject(id, updates) {
|
|
29
|
+
const existing = this.projects.get(id);
|
|
30
|
+
if (!existing)
|
|
31
|
+
return null;
|
|
32
|
+
const updated = {
|
|
33
|
+
...existing,
|
|
34
|
+
...updates,
|
|
35
|
+
updatedAt: new Date().toISOString()
|
|
36
|
+
};
|
|
37
|
+
this.projects.set(id, updated);
|
|
38
|
+
return updated;
|
|
39
|
+
}
|
|
40
|
+
async deleteProject(id) {
|
|
41
|
+
return this.projects.delete(id);
|
|
42
|
+
}
|
|
43
|
+
async getTasks(projectId) {
|
|
44
|
+
const all = Array.from(this.tasks.values());
|
|
45
|
+
if (projectId) {
|
|
46
|
+
return all.filter((t) => t.projectId === projectId);
|
|
47
|
+
}
|
|
48
|
+
return all;
|
|
49
|
+
}
|
|
50
|
+
async getTask(id) {
|
|
51
|
+
return this.tasks.get(id) || null;
|
|
52
|
+
}
|
|
53
|
+
async createTask(task) {
|
|
54
|
+
const id = `task_${Math.random().toString(36).substring(2, 9)}`;
|
|
55
|
+
const now = new Date().toISOString();
|
|
56
|
+
const newTask = {
|
|
57
|
+
...task,
|
|
58
|
+
id,
|
|
59
|
+
createdAt: now,
|
|
60
|
+
updatedAt: now
|
|
61
|
+
};
|
|
62
|
+
this.tasks.set(id, newTask);
|
|
63
|
+
return newTask;
|
|
64
|
+
}
|
|
65
|
+
async updateTask(id, updates) {
|
|
66
|
+
const existing = this.tasks.get(id);
|
|
67
|
+
if (!existing)
|
|
68
|
+
return null;
|
|
69
|
+
const updated = {
|
|
70
|
+
...existing,
|
|
71
|
+
...updates,
|
|
72
|
+
updatedAt: new Date().toISOString()
|
|
73
|
+
};
|
|
74
|
+
this.tasks.set(id, updated);
|
|
75
|
+
return updated;
|
|
76
|
+
}
|
|
77
|
+
async deleteTask(id) {
|
|
78
|
+
return this.tasks.delete(id);
|
|
79
|
+
}
|
|
80
|
+
async getSprints(projectId) {
|
|
81
|
+
return Array.from(this.sprints.values()).filter((s) => s.projectId === projectId);
|
|
82
|
+
}
|
|
83
|
+
async createSprint(sprint) {
|
|
84
|
+
const id = `sprint_${Math.random().toString(36).substring(2, 9)}`;
|
|
85
|
+
const newSprint = {
|
|
86
|
+
...sprint,
|
|
87
|
+
id,
|
|
88
|
+
createdAt: new Date().toISOString()
|
|
89
|
+
};
|
|
90
|
+
this.sprints.set(id, newSprint);
|
|
91
|
+
return newSprint;
|
|
92
|
+
}
|
|
93
|
+
async updateSprint(id, updates) {
|
|
94
|
+
const existing = this.sprints.get(id);
|
|
95
|
+
if (!existing)
|
|
96
|
+
return null;
|
|
97
|
+
const updated = { ...existing, ...updates };
|
|
98
|
+
this.sprints.set(id, updated);
|
|
99
|
+
return updated;
|
|
100
|
+
}
|
|
101
|
+
async getComments(taskId) {
|
|
102
|
+
return Array.from(this.comments.values()).filter((c) => c.taskId === taskId);
|
|
103
|
+
}
|
|
104
|
+
async addComment(comment) {
|
|
105
|
+
const id = `cmt_${Math.random().toString(36).substring(2, 9)}`;
|
|
106
|
+
const now = new Date().toISOString();
|
|
107
|
+
const newComment = { ...comment, id, createdAt: now, updatedAt: now };
|
|
108
|
+
this.comments.set(id, newComment);
|
|
109
|
+
return newComment;
|
|
110
|
+
}
|
|
111
|
+
async getActivities(filter) {
|
|
112
|
+
return this.activities.filter((a) => {
|
|
113
|
+
if (filter?.projectId && a.projectId !== filter.projectId)
|
|
114
|
+
return false;
|
|
115
|
+
if (filter?.taskId && a.taskId !== filter.taskId)
|
|
116
|
+
return false;
|
|
117
|
+
return true;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async logActivity(activity) {
|
|
121
|
+
const id = `act_${Math.random().toString(36).substring(2, 9)}`;
|
|
122
|
+
const newAct = { ...activity, id, createdAt: new Date().toISOString() };
|
|
123
|
+
this.activities.unshift(newAct);
|
|
124
|
+
return newAct;
|
|
125
|
+
}
|
|
126
|
+
async getTimeEntries(taskId) {
|
|
127
|
+
return Array.from(this.timeEntries.values()).filter((e) => e.taskId === taskId);
|
|
128
|
+
}
|
|
129
|
+
async logTime(entry) {
|
|
130
|
+
const id = `time_${Math.random().toString(36).substring(2, 9)}`;
|
|
131
|
+
const newEntry = { ...entry, id, loggedAt: new Date().toISOString() };
|
|
132
|
+
this.timeEntries.set(id, newEntry);
|
|
133
|
+
return newEntry;
|
|
134
|
+
}
|
|
135
|
+
async getDependencies(taskId) {
|
|
136
|
+
return Array.from(this.dependencies.values()).filter((d) => d.taskId === taskId || d.dependsOnTaskId === taskId);
|
|
137
|
+
}
|
|
138
|
+
async addDependency(dep) {
|
|
139
|
+
const id = `dep_${Math.random().toString(36).substring(2, 9)}`;
|
|
140
|
+
const newDep = { ...dep, id };
|
|
141
|
+
this.dependencies.set(id, newDep);
|
|
142
|
+
return newDep;
|
|
143
|
+
}
|
|
144
|
+
async getWebhooks() {
|
|
145
|
+
return Array.from(this.webhooks.values());
|
|
146
|
+
}
|
|
147
|
+
async addWebhook(webhook) {
|
|
148
|
+
const id = `wh_${Math.random().toString(36).substring(2, 9)}`;
|
|
149
|
+
const newWh = { ...webhook, id, createdAt: new Date().toISOString() };
|
|
150
|
+
this.webhooks.set(id, newWh);
|
|
151
|
+
return newWh;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"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"}
|