cmp-memory-system 1.0.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/README.md +541 -0
- package/dist/analytics/index.d.ts +5 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +5 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/tracker.d.ts +107 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +333 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/auto-improve/eslint-generator.d.ts +36 -0
- package/dist/auto-improve/eslint-generator.d.ts.map +1 -0
- package/dist/auto-improve/eslint-generator.js +280 -0
- package/dist/auto-improve/eslint-generator.js.map +1 -0
- package/dist/auto-improve/index.d.ts +6 -0
- package/dist/auto-improve/index.d.ts.map +1 -0
- package/dist/auto-improve/index.js +6 -0
- package/dist/auto-improve/index.js.map +1 -0
- package/dist/auto-improve/pattern-detector.d.ts +92 -0
- package/dist/auto-improve/pattern-detector.d.ts.map +1 -0
- package/dist/auto-improve/pattern-detector.js +231 -0
- package/dist/auto-improve/pattern-detector.js.map +1 -0
- package/dist/cli/index.d.ts +16 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +636 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/dashboard/index.d.ts +6 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +6 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/server.d.ts +15 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +373 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/ui.d.ts +9 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +530 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/db/client.d.ts +66 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +159 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/drizzle-client.d.ts +302 -0
- package/dist/db/drizzle-client.d.ts.map +1 -0
- package/dist/db/drizzle-client.js +404 -0
- package/dist/db/drizzle-client.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/feedback/collector.d.ts +74 -0
- package/dist/feedback/collector.d.ts.map +1 -0
- package/dist/feedback/collector.js +231 -0
- package/dist/feedback/collector.js.map +1 -0
- package/dist/feedback/index.d.ts +5 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +5 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/memory-checkpoint.d.ts +43 -0
- package/dist/hooks/memory-checkpoint.d.ts.map +1 -0
- package/dist/hooks/memory-checkpoint.js +257 -0
- package/dist/hooks/memory-checkpoint.js.map +1 -0
- package/dist/hooks/post-tool-use.d.ts +61 -0
- package/dist/hooks/post-tool-use.d.ts.map +1 -0
- package/dist/hooks/post-tool-use.js +262 -0
- package/dist/hooks/post-tool-use.js.map +1 -0
- package/dist/hooks/pre-tool-use.d.ts +34 -0
- package/dist/hooks/pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/pre-tool-use.js +358 -0
- package/dist/hooks/pre-tool-use.js.map +1 -0
- package/dist/hooks/session-start.d.ts +38 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +274 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +42 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +599 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/registry/embeddings.d.ts +38 -0
- package/dist/registry/embeddings.d.ts.map +1 -0
- package/dist/registry/embeddings.js +110 -0
- package/dist/registry/embeddings.js.map +1 -0
- package/dist/registry/generator.d.ts +41 -0
- package/dist/registry/generator.d.ts.map +1 -0
- package/dist/registry/generator.js +323 -0
- package/dist/registry/generator.js.map +1 -0
- package/dist/registry/index.d.ts +6 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +6 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/services/IdeaCollector.d.ts +103 -0
- package/dist/services/IdeaCollector.d.ts.map +1 -0
- package/dist/services/IdeaCollector.js +371 -0
- package/dist/services/IdeaCollector.js.map +1 -0
- package/dist/services/TaskTracker.d.ts +89 -0
- package/dist/services/TaskTracker.d.ts.map +1 -0
- package/dist/services/TaskTracker.js +324 -0
- package/dist/services/TaskTracker.js.map +1 -0
- package/dist/services/WorkPlanManager.d.ts +107 -0
- package/dist/services/WorkPlanManager.d.ts.map +1 -0
- package/dist/services/WorkPlanManager.js +440 -0
- package/dist/services/WorkPlanManager.js.map +1 -0
- package/dist/services/auto-inject.d.ts +77 -0
- package/dist/services/auto-inject.d.ts.map +1 -0
- package/dist/services/auto-inject.js +289 -0
- package/dist/services/auto-inject.js.map +1 -0
- package/dist/services/auto-tag.d.ts +61 -0
- package/dist/services/auto-tag.d.ts.map +1 -0
- package/dist/services/auto-tag.js +203 -0
- package/dist/services/auto-tag.js.map +1 -0
- package/dist/services/cross-project-sync.d.ts +76 -0
- package/dist/services/cross-project-sync.d.ts.map +1 -0
- package/dist/services/cross-project-sync.js +235 -0
- package/dist/services/cross-project-sync.js.map +1 -0
- package/dist/services/index.d.ts +15 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/memory-consolidation.d.ts +77 -0
- package/dist/services/memory-consolidation.d.ts.map +1 -0
- package/dist/services/memory-consolidation.js +298 -0
- package/dist/services/memory-consolidation.js.map +1 -0
- package/dist/services/semantic-search.d.ts +93 -0
- package/dist/services/semantic-search.d.ts.map +1 -0
- package/dist/services/semantic-search.js +278 -0
- package/dist/services/semantic-search.js.map +1 -0
- package/dist/services/weekly-digest.d.ts +105 -0
- package/dist/services/weekly-digest.d.ts.map +1 -0
- package/dist/services/weekly-digest.js +292 -0
- package/dist/services/weekly-digest.js.map +1 -0
- package/dist/types/index.d.ts +274 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +84 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +21 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +89 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/paths.d.ts +28 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +80 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +89 -0
- package/templates/memory-config.json +82 -0
- package/templates/memory-config.schema.json +212 -0
- package/templates/settings.json +58 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkPlanManager Service
|
|
3
|
+
*
|
|
4
|
+
* Manages the current work plan across sessions.
|
|
5
|
+
* Persists the plan to database so it survives session restarts.
|
|
6
|
+
*/
|
|
7
|
+
import { ulid } from 'ulid';
|
|
8
|
+
import { createDrizzleClient } from '../db/drizzle-client.js';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// WORK PLAN MANAGER SERVICE
|
|
11
|
+
// =============================================================================
|
|
12
|
+
export class WorkPlanManager {
|
|
13
|
+
client;
|
|
14
|
+
system;
|
|
15
|
+
currentPlanId = null;
|
|
16
|
+
constructor(system) {
|
|
17
|
+
this.system = system;
|
|
18
|
+
this.client = createDrizzleClient(system);
|
|
19
|
+
}
|
|
20
|
+
// ===========================================================================
|
|
21
|
+
// PLAN LIFECYCLE
|
|
22
|
+
// ===========================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Create a new work plan
|
|
25
|
+
*/
|
|
26
|
+
async createPlan(options) {
|
|
27
|
+
const now = new Date().toISOString();
|
|
28
|
+
// Generate IDs for tasks if not provided
|
|
29
|
+
const taskIds = options.tasks.map(t => t.id ?? ulid());
|
|
30
|
+
// Create task entries first
|
|
31
|
+
for (let i = 0; i < options.tasks.length; i++) {
|
|
32
|
+
const task = options.tasks[i];
|
|
33
|
+
const taskId = taskIds[i];
|
|
34
|
+
const taskContent = {
|
|
35
|
+
title: task.title,
|
|
36
|
+
description: task.description,
|
|
37
|
+
status: task.status ?? 'pending',
|
|
38
|
+
startedAt: now,
|
|
39
|
+
filesModified: [],
|
|
40
|
+
context: {},
|
|
41
|
+
ideas: [],
|
|
42
|
+
improvements: [],
|
|
43
|
+
};
|
|
44
|
+
await this.client.create({
|
|
45
|
+
type: 'task',
|
|
46
|
+
status: task.status ?? 'todo',
|
|
47
|
+
priority: 'medium',
|
|
48
|
+
content: taskContent,
|
|
49
|
+
tags: ['task', 'plan-task'],
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// Create the plan
|
|
53
|
+
const content = {
|
|
54
|
+
title: options.title,
|
|
55
|
+
description: options.description,
|
|
56
|
+
status: 'active',
|
|
57
|
+
createdAt: now,
|
|
58
|
+
updatedAt: now,
|
|
59
|
+
taskIds,
|
|
60
|
+
currentTaskId: taskIds[0],
|
|
61
|
+
progress: 0,
|
|
62
|
+
};
|
|
63
|
+
const result = await this.client.create({
|
|
64
|
+
type: 'work_plan',
|
|
65
|
+
status: 'active',
|
|
66
|
+
priority: 'high',
|
|
67
|
+
content: content,
|
|
68
|
+
tags: ['work_plan', 'active'],
|
|
69
|
+
});
|
|
70
|
+
this.currentPlanId = result.id;
|
|
71
|
+
return result.id;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the current active plan
|
|
75
|
+
*/
|
|
76
|
+
async getActivePlan() {
|
|
77
|
+
// First check cached ID
|
|
78
|
+
if (this.currentPlanId) {
|
|
79
|
+
const plan = await this.client.get(this.currentPlanId);
|
|
80
|
+
if (plan) {
|
|
81
|
+
const content = plan.content;
|
|
82
|
+
if (content.status === 'active') {
|
|
83
|
+
return { plan, content };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Search for active plan
|
|
88
|
+
const plans = await this.client.list({
|
|
89
|
+
type: 'work_plan',
|
|
90
|
+
status: 'active',
|
|
91
|
+
limit: 1,
|
|
92
|
+
});
|
|
93
|
+
if (plans.length > 0) {
|
|
94
|
+
this.currentPlanId = plans[0].id;
|
|
95
|
+
return {
|
|
96
|
+
plan: plans[0],
|
|
97
|
+
content: plans[0].content,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get plan summary for display
|
|
104
|
+
*/
|
|
105
|
+
async getPlanSummary() {
|
|
106
|
+
const active = await this.getActivePlan();
|
|
107
|
+
if (!active)
|
|
108
|
+
return null;
|
|
109
|
+
const { plan, content } = active;
|
|
110
|
+
// Get tasks to count completed
|
|
111
|
+
const tasks = await this.getTasksForPlan(content.taskIds);
|
|
112
|
+
const completedTasks = tasks.filter(t => {
|
|
113
|
+
const tc = t.content;
|
|
114
|
+
return tc.status === 'completed';
|
|
115
|
+
}).length;
|
|
116
|
+
// Get current task details
|
|
117
|
+
let currentTask;
|
|
118
|
+
if (content.currentTaskId) {
|
|
119
|
+
const ct = tasks.find(t => t.id === content.currentTaskId);
|
|
120
|
+
if (ct) {
|
|
121
|
+
const tc = ct.content;
|
|
122
|
+
currentTask = {
|
|
123
|
+
id: ct.id,
|
|
124
|
+
title: tc.title,
|
|
125
|
+
status: tc.status,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
id: plan.id,
|
|
131
|
+
title: content.title,
|
|
132
|
+
status: content.status,
|
|
133
|
+
progress: content.progress,
|
|
134
|
+
totalTasks: content.taskIds.length,
|
|
135
|
+
completedTasks,
|
|
136
|
+
currentTask,
|
|
137
|
+
createdAt: content.createdAt,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Update plan progress
|
|
142
|
+
*/
|
|
143
|
+
async updateProgress() {
|
|
144
|
+
const active = await this.getActivePlan();
|
|
145
|
+
if (!active)
|
|
146
|
+
return;
|
|
147
|
+
const { plan, content } = active;
|
|
148
|
+
// Get tasks and calculate progress
|
|
149
|
+
const tasks = await this.getTasksForPlan(content.taskIds);
|
|
150
|
+
const completedTasks = tasks.filter(t => {
|
|
151
|
+
const tc = t.content;
|
|
152
|
+
return tc.status === 'completed';
|
|
153
|
+
}).length;
|
|
154
|
+
const progress = Math.round((completedTasks / content.taskIds.length) * 100);
|
|
155
|
+
// Find next incomplete task if current is done
|
|
156
|
+
let currentTaskId = content.currentTaskId;
|
|
157
|
+
if (currentTaskId) {
|
|
158
|
+
const currentTask = tasks.find(t => t.id === currentTaskId);
|
|
159
|
+
if (currentTask) {
|
|
160
|
+
const tc = currentTask.content;
|
|
161
|
+
if (tc.status === 'completed') {
|
|
162
|
+
// Find next pending task
|
|
163
|
+
const nextTask = tasks.find(t => {
|
|
164
|
+
const ntc = t.content;
|
|
165
|
+
return ntc.status === 'pending';
|
|
166
|
+
});
|
|
167
|
+
currentTaskId = nextTask?.id;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Update plan
|
|
172
|
+
await this.client.update(plan.id, {
|
|
173
|
+
content: {
|
|
174
|
+
...content,
|
|
175
|
+
progress,
|
|
176
|
+
currentTaskId,
|
|
177
|
+
updatedAt: new Date().toISOString(),
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
// Mark as completed if all done
|
|
181
|
+
if (progress === 100) {
|
|
182
|
+
await this.completePlan();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Mark current task as complete and move to next
|
|
187
|
+
*/
|
|
188
|
+
async completeCurrentTask() {
|
|
189
|
+
const active = await this.getActivePlan();
|
|
190
|
+
if (!active)
|
|
191
|
+
return;
|
|
192
|
+
const { content } = active;
|
|
193
|
+
if (content.currentTaskId) {
|
|
194
|
+
// Update task status
|
|
195
|
+
const task = await this.client.get(content.currentTaskId);
|
|
196
|
+
if (task) {
|
|
197
|
+
const tc = task.content;
|
|
198
|
+
await this.client.update(content.currentTaskId, {
|
|
199
|
+
status: 'done',
|
|
200
|
+
content: {
|
|
201
|
+
...tc,
|
|
202
|
+
status: 'completed',
|
|
203
|
+
completedAt: new Date().toISOString(),
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Update plan progress
|
|
209
|
+
await this.updateProgress();
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Mark current task as in progress
|
|
213
|
+
*/
|
|
214
|
+
async startCurrentTask() {
|
|
215
|
+
const active = await this.getActivePlan();
|
|
216
|
+
if (!active)
|
|
217
|
+
return;
|
|
218
|
+
const { content } = active;
|
|
219
|
+
if (content.currentTaskId) {
|
|
220
|
+
const task = await this.client.get(content.currentTaskId);
|
|
221
|
+
if (task) {
|
|
222
|
+
const tc = task.content;
|
|
223
|
+
await this.client.update(content.currentTaskId, {
|
|
224
|
+
status: 'in_progress',
|
|
225
|
+
content: {
|
|
226
|
+
...tc,
|
|
227
|
+
status: 'in_progress',
|
|
228
|
+
startedAt: new Date().toISOString(),
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Complete the entire plan
|
|
236
|
+
*/
|
|
237
|
+
async completePlan() {
|
|
238
|
+
const active = await this.getActivePlan();
|
|
239
|
+
if (!active)
|
|
240
|
+
return;
|
|
241
|
+
const { plan, content } = active;
|
|
242
|
+
await this.client.update(plan.id, {
|
|
243
|
+
status: 'done',
|
|
244
|
+
content: {
|
|
245
|
+
...content,
|
|
246
|
+
status: 'completed',
|
|
247
|
+
progress: 100,
|
|
248
|
+
updatedAt: new Date().toISOString(),
|
|
249
|
+
},
|
|
250
|
+
tags: ['work_plan', 'completed'],
|
|
251
|
+
});
|
|
252
|
+
this.currentPlanId = null;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Pause the current plan
|
|
256
|
+
*/
|
|
257
|
+
async pausePlan() {
|
|
258
|
+
const active = await this.getActivePlan();
|
|
259
|
+
if (!active)
|
|
260
|
+
return;
|
|
261
|
+
const { plan, content } = active;
|
|
262
|
+
await this.client.update(plan.id, {
|
|
263
|
+
status: 'blocked',
|
|
264
|
+
content: {
|
|
265
|
+
...content,
|
|
266
|
+
status: 'paused',
|
|
267
|
+
updatedAt: new Date().toISOString(),
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
this.currentPlanId = null;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Resume a paused plan
|
|
274
|
+
*/
|
|
275
|
+
async resumePlan(planId) {
|
|
276
|
+
const plan = await this.client.get(planId);
|
|
277
|
+
if (!plan)
|
|
278
|
+
return;
|
|
279
|
+
const content = plan.content;
|
|
280
|
+
await this.client.update(planId, {
|
|
281
|
+
status: 'active',
|
|
282
|
+
content: {
|
|
283
|
+
...content,
|
|
284
|
+
status: 'active',
|
|
285
|
+
updatedAt: new Date().toISOString(),
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
this.currentPlanId = planId;
|
|
289
|
+
}
|
|
290
|
+
// ===========================================================================
|
|
291
|
+
// TASK MANAGEMENT
|
|
292
|
+
// ===========================================================================
|
|
293
|
+
/**
|
|
294
|
+
* Add a task to the current plan
|
|
295
|
+
*/
|
|
296
|
+
async addTask(task) {
|
|
297
|
+
const active = await this.getActivePlan();
|
|
298
|
+
if (!active) {
|
|
299
|
+
throw new Error('No active plan');
|
|
300
|
+
}
|
|
301
|
+
const { plan, content } = active;
|
|
302
|
+
const taskId = task.id ?? ulid();
|
|
303
|
+
const now = new Date().toISOString();
|
|
304
|
+
// Create task
|
|
305
|
+
const taskContent = {
|
|
306
|
+
title: task.title,
|
|
307
|
+
description: task.description,
|
|
308
|
+
status: task.status ?? 'pending',
|
|
309
|
+
startedAt: now,
|
|
310
|
+
filesModified: [],
|
|
311
|
+
context: {},
|
|
312
|
+
ideas: [],
|
|
313
|
+
improvements: [],
|
|
314
|
+
};
|
|
315
|
+
await this.client.create({
|
|
316
|
+
type: 'task',
|
|
317
|
+
status: task.status ?? 'todo',
|
|
318
|
+
priority: 'medium',
|
|
319
|
+
content: taskContent,
|
|
320
|
+
tags: ['task', 'plan-task'],
|
|
321
|
+
});
|
|
322
|
+
// Update plan
|
|
323
|
+
await this.client.update(plan.id, {
|
|
324
|
+
content: {
|
|
325
|
+
...content,
|
|
326
|
+
taskIds: [...content.taskIds, taskId],
|
|
327
|
+
updatedAt: now,
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
// Recalculate progress
|
|
331
|
+
await this.updateProgress();
|
|
332
|
+
return taskId;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get all tasks for a plan
|
|
336
|
+
*/
|
|
337
|
+
async getTasksForPlan(taskIds) {
|
|
338
|
+
const tasks = [];
|
|
339
|
+
for (const id of taskIds) {
|
|
340
|
+
const task = await this.client.get(id);
|
|
341
|
+
if (task) {
|
|
342
|
+
tasks.push(task);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return tasks;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Get tasks with details for display
|
|
349
|
+
*/
|
|
350
|
+
async getPlanTasks() {
|
|
351
|
+
const active = await this.getActivePlan();
|
|
352
|
+
if (!active)
|
|
353
|
+
return [];
|
|
354
|
+
const { content } = active;
|
|
355
|
+
const tasks = await this.getTasksForPlan(content.taskIds);
|
|
356
|
+
return tasks.map(t => {
|
|
357
|
+
const tc = t.content;
|
|
358
|
+
return {
|
|
359
|
+
id: t.id,
|
|
360
|
+
title: tc.title,
|
|
361
|
+
status: tc.status,
|
|
362
|
+
isCurrent: t.id === content.currentTaskId,
|
|
363
|
+
};
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
// ===========================================================================
|
|
367
|
+
// CONTEXT FOR SESSION START
|
|
368
|
+
// ===========================================================================
|
|
369
|
+
/**
|
|
370
|
+
* Get context string for session start hook
|
|
371
|
+
*/
|
|
372
|
+
async getSessionContext() {
|
|
373
|
+
const summary = await this.getPlanSummary();
|
|
374
|
+
if (!summary) {
|
|
375
|
+
return 'No active work plan. Use `claude-memory plan` to create one.';
|
|
376
|
+
}
|
|
377
|
+
const tasks = await this.getPlanTasks();
|
|
378
|
+
const pendingTasks = tasks.filter(t => t.status === 'pending' || t.status === 'in_progress');
|
|
379
|
+
let context = `## Active Work Plan: ${summary.title}\n\n`;
|
|
380
|
+
context += `Progress: ${summary.progress}% (${summary.completedTasks}/${summary.totalTasks} tasks)\n\n`;
|
|
381
|
+
if (summary.currentTask) {
|
|
382
|
+
context += `### Current Task\n`;
|
|
383
|
+
context += `**${summary.currentTask.title}** (${summary.currentTask.status})\n\n`;
|
|
384
|
+
}
|
|
385
|
+
if (pendingTasks.length > 0) {
|
|
386
|
+
context += `### Remaining Tasks\n`;
|
|
387
|
+
for (const task of pendingTasks) {
|
|
388
|
+
const marker = task.isCurrent ? '→' : '-';
|
|
389
|
+
context += `${marker} ${task.title} [${task.status}]\n`;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return context;
|
|
393
|
+
}
|
|
394
|
+
// ===========================================================================
|
|
395
|
+
// HISTORY
|
|
396
|
+
// ===========================================================================
|
|
397
|
+
/**
|
|
398
|
+
* Get plan history
|
|
399
|
+
*/
|
|
400
|
+
async getPlanHistory(limit = 10) {
|
|
401
|
+
const plans = await this.client.list({
|
|
402
|
+
type: 'work_plan',
|
|
403
|
+
limit,
|
|
404
|
+
});
|
|
405
|
+
const summaries = [];
|
|
406
|
+
for (const plan of plans) {
|
|
407
|
+
const content = plan.content;
|
|
408
|
+
summaries.push({
|
|
409
|
+
id: plan.id,
|
|
410
|
+
title: content.title,
|
|
411
|
+
status: content.status,
|
|
412
|
+
progress: content.progress,
|
|
413
|
+
totalTasks: content.taskIds.length,
|
|
414
|
+
completedTasks: Math.round(content.progress / 100 * content.taskIds.length),
|
|
415
|
+
createdAt: content.createdAt,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
return summaries;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// =============================================================================
|
|
422
|
+
// FACTORY
|
|
423
|
+
// =============================================================================
|
|
424
|
+
let managerInstance = null;
|
|
425
|
+
/**
|
|
426
|
+
* Get or create WorkPlanManager instance
|
|
427
|
+
*/
|
|
428
|
+
export function getWorkPlanManager(system) {
|
|
429
|
+
if (!managerInstance) {
|
|
430
|
+
managerInstance = new WorkPlanManager(system);
|
|
431
|
+
}
|
|
432
|
+
return managerInstance;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Create fresh WorkPlanManager instance
|
|
436
|
+
*/
|
|
437
|
+
export function createWorkPlanManager(system) {
|
|
438
|
+
return new WorkPlanManager(system);
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=WorkPlanManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkPlanManager.js","sourceRoot":"","sources":["../../src/services/WorkPlanManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Inject Service
|
|
3
|
+
*
|
|
4
|
+
* Automatically injects relevant memories into Claude sessions.
|
|
5
|
+
* - Detects working module from git diff
|
|
6
|
+
* - Finds semantically relevant memories
|
|
7
|
+
* - Formats context for injection
|
|
8
|
+
*/
|
|
9
|
+
import { SemanticSearchService } from './semantic-search.js';
|
|
10
|
+
import type { DrizzleMemoryClient } from '../db/drizzle-client.js';
|
|
11
|
+
import type { MemoryConfig } from '../types/index.js';
|
|
12
|
+
export interface SessionContext {
|
|
13
|
+
system: string;
|
|
14
|
+
projectName: string;
|
|
15
|
+
detectedModule: string | null;
|
|
16
|
+
recentFiles: string[];
|
|
17
|
+
memories: InjectedMemory[];
|
|
18
|
+
patterns: InjectedPattern[];
|
|
19
|
+
stats: SessionStats;
|
|
20
|
+
}
|
|
21
|
+
export interface InjectedMemory {
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
body: string;
|
|
25
|
+
domain?: string;
|
|
26
|
+
relevanceScore?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface InjectedPattern {
|
|
29
|
+
patternId: string;
|
|
30
|
+
description: string;
|
|
31
|
+
occurrences: number;
|
|
32
|
+
severity: string;
|
|
33
|
+
}
|
|
34
|
+
export interface SessionStats {
|
|
35
|
+
totalMemories: number;
|
|
36
|
+
loadedMemories: number;
|
|
37
|
+
triggeredPatterns: number;
|
|
38
|
+
}
|
|
39
|
+
export declare class AutoInjectService {
|
|
40
|
+
private client;
|
|
41
|
+
private searchService;
|
|
42
|
+
private config;
|
|
43
|
+
constructor(client: DrizzleMemoryClient, searchService: SemanticSearchService, config: MemoryConfig);
|
|
44
|
+
/**
|
|
45
|
+
* Generate session context for auto-injection
|
|
46
|
+
*/
|
|
47
|
+
generateSessionContext(projectRoot: string): Promise<SessionContext>;
|
|
48
|
+
/**
|
|
49
|
+
* Format context for Claude injection
|
|
50
|
+
*/
|
|
51
|
+
formatForInjection(context: SessionContext): string;
|
|
52
|
+
/**
|
|
53
|
+
* Quick context for minimal injection
|
|
54
|
+
*/
|
|
55
|
+
getQuickContext(projectRoot: string): Promise<string>;
|
|
56
|
+
/**
|
|
57
|
+
* Detect working module from git diff
|
|
58
|
+
*/
|
|
59
|
+
private detectWorkingModule;
|
|
60
|
+
/**
|
|
61
|
+
* Get relevant memories using semantic search
|
|
62
|
+
*/
|
|
63
|
+
private getRelevantMemories;
|
|
64
|
+
/**
|
|
65
|
+
* Get triggered patterns
|
|
66
|
+
*/
|
|
67
|
+
private getTriggeredPatterns;
|
|
68
|
+
/**
|
|
69
|
+
* Get session statistics
|
|
70
|
+
*/
|
|
71
|
+
private getSessionStats;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create an auto-inject service
|
|
75
|
+
*/
|
|
76
|
+
export declare function createAutoInjectService(client: DrizzleMemoryClient, searchService: SemanticSearchService, config: MemoryConfig): AutoInjectService;
|
|
77
|
+
//# sourceMappingURL=auto-inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-inject.d.ts","sourceRoot":"","sources":["../../src/services/auto-inject.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAA0C,MAAM,mBAAmB,CAAA;AAQ7F,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,KAAK,EAAE,YAAY,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,MAAM,CAAc;gBAG1B,MAAM,EAAE,mBAAmB,EAC3B,aAAa,EAAE,qBAAqB,EACpC,MAAM,EAAE,YAAY;IAOtB;;OAEG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAwB1E;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAkDnD;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+B3D;;OAEG;YACW,mBAAmB;IAsFjC;;OAEG;YACW,mBAAmB;IAmEjC;;OAEG;YACW,oBAAoB;IAclC;;OAEG;YACW,eAAe;CAY9B;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,mBAAmB,EAC3B,aAAa,EAAE,qBAAqB,EACpC,MAAM,EAAE,YAAY,GACnB,iBAAiB,CAEnB"}
|