cmp-standards 2.4.0 → 2.7.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 +633 -611
- package/dist/cli/index.js +0 -0
- package/dist/db/drizzle-client.d.ts +3 -3
- package/dist/db/drizzle-client.d.ts.map +1 -1
- package/dist/db/drizzle-client.js +57 -58
- package/dist/db/drizzle-client.js.map +1 -1
- package/dist/db/turso-client.js +11 -11
- package/dist/eslint/rules/no-async-useeffect.js +6 -6
- package/dist/hooks/cloud-pre-tool-use.js +20 -20
- package/dist/hooks/cloud-session-start.d.ts +15 -3
- package/dist/hooks/cloud-session-start.d.ts.map +1 -1
- package/dist/hooks/cloud-session-start.js +135 -8
- package/dist/hooks/cloud-session-start.js.map +1 -1
- package/dist/hooks/session-start.d.ts +2 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +99 -74
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/schema/plans.d.ts +194 -0
- package/dist/schema/plans.d.ts.map +1 -0
- package/dist/schema/plans.js +180 -0
- package/dist/schema/plans.js.map +1 -0
- package/dist/schema/tracking.d.ts +90 -90
- package/dist/services/ContextGenerator.d.ts +16 -0
- package/dist/services/ContextGenerator.d.ts.map +1 -0
- package/dist/services/ContextGenerator.js +62 -0
- package/dist/services/ContextGenerator.js.map +1 -0
- package/dist/services/PlanManager.d.ts +99 -0
- package/dist/services/PlanManager.d.ts.map +1 -0
- package/dist/services/PlanManager.js +372 -0
- package/dist/services/PlanManager.js.map +1 -0
- package/dist/services/ProjectScaffold.js +76 -76
- package/dist/services/context-injector.d.ts +111 -0
- package/dist/services/context-injector.d.ts.map +1 -0
- package/dist/services/context-injector.js +397 -0
- package/dist/services/context-injector.js.map +1 -0
- package/dist/services/index.d.ts +15 -15
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +18 -20
- package/dist/services/index.js.map +1 -1
- package/dist/services/memory-router.d.ts +122 -0
- package/dist/services/memory-router.d.ts.map +1 -0
- package/dist/services/memory-router.js +517 -0
- package/dist/services/memory-router.js.map +1 -0
- package/dist/services/pattern-tracker.d.ts +97 -0
- package/dist/services/pattern-tracker.d.ts.map +1 -0
- package/dist/services/pattern-tracker.js +425 -0
- package/dist/services/pattern-tracker.js.map +1 -0
- package/dist/services/semantic-search.d.ts +33 -35
- package/dist/services/semantic-search.d.ts.map +1 -1
- package/dist/services/semantic-search.js +207 -165
- package/dist/services/semantic-search.js.map +1 -1
- package/dist/types/index.d.ts +329 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +186 -9
- package/dist/types/index.js.map +1 -1
- package/package.json +104 -100
- package/standards/README.md +50 -50
- package/standards/experts/expert-routing.md +215 -215
- package/standards/general/code-quality.md +86 -86
- package/standards/general/memory-usage.md +205 -205
- package/standards/general/sync-workflow.md +235 -235
- package/standards/general/workflow.md +82 -82
- package/standards/hooks/mandatory-tracking.md +446 -446
- package/standards/infrastructure/cloud-database.md +287 -287
- package/standards/mcp/server-design.md +243 -243
- package/standards/mcp/tool-patterns.md +354 -354
- package/standards/skills/skill-structure.md +286 -286
- package/standards/skills/workflow-design.md +323 -323
- package/standards/tools/tool-design.md +297 -297
- package/templates/agents/architecture-expert.md +61 -61
- package/templates/agents/database-expert.md +62 -62
- package/templates/agents/documentation-expert.md +57 -57
- package/templates/agents/memory-expert.md +88 -88
- package/templates/agents/performance-expert.md +61 -61
- package/templates/agents/security-expert.md +59 -59
- package/templates/agents/ux-expert.md +63 -63
- package/templates/agents/worker.md +75 -75
- package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
- package/templates/claude-settings.json +72 -72
- package/templates/commands/experts.md +138 -138
- package/templates/hooks/README.md +158 -158
- package/templates/hooks/project.config.json.template +77 -77
- package/templates/hooks/settings.local.json.template +57 -57
- package/templates/memory-config.json +56 -56
- package/templates/memory-config.schema.json +212 -212
- package/templates/settings.json +58 -58
- package/templates/skills/continue.md +205 -205
- package/templates/workflows/business-improvement.md +264 -264
- package/templates/workflows/expert-review.md +153 -153
- package/templates/workflows/internal-app.md +245 -245
- package/templates/workflows/sync-docs.md +187 -187
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanManager.d.ts","sourceRoot":"","sources":["../../src/services/PlanManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file PlanManager Service
|
|
3
|
+
* @description Gestiona planes de trabajo con checkpoints para continuidad multi-agente.
|
|
4
|
+
*
|
|
5
|
+
* Características:
|
|
6
|
+
* - Detección de planes similares al iniciar sesión
|
|
7
|
+
* - Checkpoints incrementales para save points
|
|
8
|
+
* - Soporte para merge de planes
|
|
9
|
+
* - Historial navegable
|
|
10
|
+
*
|
|
11
|
+
* @version 1.0.0
|
|
12
|
+
*/
|
|
13
|
+
import { createDrizzleClient } from '../db/drizzle-client.js';
|
|
14
|
+
import { PlanSchema, PlanCheckpointSchema, createPlan, createCheckpoint, extractKeywords, calculateKeywordSimilarity, } from '../schema/plans.js';
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// PLAN MANAGER SERVICE
|
|
17
|
+
// =============================================================================
|
|
18
|
+
export class PlanManager {
|
|
19
|
+
client;
|
|
20
|
+
system;
|
|
21
|
+
currentSessionId;
|
|
22
|
+
agentId;
|
|
23
|
+
constructor(system, options) {
|
|
24
|
+
this.system = system;
|
|
25
|
+
this.client = createDrizzleClient(system);
|
|
26
|
+
this.currentSessionId = options?.sessionId || `session_${Date.now()}`;
|
|
27
|
+
this.agentId = options?.agentId || 'claude';
|
|
28
|
+
}
|
|
29
|
+
// ===========================================================================
|
|
30
|
+
// PLAN LIFECYCLE
|
|
31
|
+
// ===========================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Crear un nuevo plan
|
|
34
|
+
*/
|
|
35
|
+
async create(options) {
|
|
36
|
+
const now = new Date().toISOString();
|
|
37
|
+
const planData = createPlan({
|
|
38
|
+
...options,
|
|
39
|
+
system: this.system,
|
|
40
|
+
createdBy: this.agentId,
|
|
41
|
+
});
|
|
42
|
+
const result = await this.client.create({
|
|
43
|
+
type: 'plan',
|
|
44
|
+
status: 'active',
|
|
45
|
+
priority: 'high',
|
|
46
|
+
content: planData,
|
|
47
|
+
tags: ['plan', 'active', ...(options.domain ? [options.domain] : [])],
|
|
48
|
+
});
|
|
49
|
+
const plan = {
|
|
50
|
+
...planData,
|
|
51
|
+
id: result.id,
|
|
52
|
+
createdAt: now,
|
|
53
|
+
updatedAt: now,
|
|
54
|
+
};
|
|
55
|
+
// Crear checkpoint inicial
|
|
56
|
+
await this.addCheckpoint(plan.id, {
|
|
57
|
+
checkpointType: 'progress',
|
|
58
|
+
summary: `Plan creado: ${options.title}`,
|
|
59
|
+
nextSteps: options.description ? [options.description] : [],
|
|
60
|
+
});
|
|
61
|
+
return plan;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Obtener plan por ID con validación Zod
|
|
65
|
+
*/
|
|
66
|
+
async get(planId) {
|
|
67
|
+
const item = await this.client.get(planId);
|
|
68
|
+
if (!item || item.type !== 'plan')
|
|
69
|
+
return null;
|
|
70
|
+
// Validate schema before returning
|
|
71
|
+
const parseResult = PlanSchema.safeParse({
|
|
72
|
+
...item.content,
|
|
73
|
+
id: item.id,
|
|
74
|
+
});
|
|
75
|
+
if (!parseResult.success) {
|
|
76
|
+
console.error('[PlanManager] Invalid plan schema:', parseResult.error.message);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
return parseResult.data;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Obtener todos los planes activos
|
|
83
|
+
*/
|
|
84
|
+
async getActive() {
|
|
85
|
+
const items = await this.client.list({
|
|
86
|
+
type: 'plan',
|
|
87
|
+
status: 'active',
|
|
88
|
+
limit: 20,
|
|
89
|
+
});
|
|
90
|
+
return items.map(item => ({
|
|
91
|
+
...item.content,
|
|
92
|
+
id: item.id,
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Buscar planes similares a un prompt (optimizado para evitar N+1 queries)
|
|
97
|
+
*/
|
|
98
|
+
async findSimilar(options) {
|
|
99
|
+
const { prompt, domain, limit = 5, minSimilarity = 0.2 } = options;
|
|
100
|
+
const promptKeywords = extractKeywords(prompt);
|
|
101
|
+
// Batch query: obtener planes Y checkpoints en paralelo
|
|
102
|
+
const [planItems, checkpointItems] = await Promise.all([
|
|
103
|
+
this.client.list({ type: 'plan', limit: 50 }),
|
|
104
|
+
this.client.list({ type: 'plan_checkpoint', limit: 500 }),
|
|
105
|
+
]);
|
|
106
|
+
// Pre-compute checkpoint counts por planId (O(n) en lugar de O(n*m))
|
|
107
|
+
const checkpointCounts = new Map();
|
|
108
|
+
for (const item of checkpointItems) {
|
|
109
|
+
const content = item.content;
|
|
110
|
+
const planId = content.planId;
|
|
111
|
+
if (planId) {
|
|
112
|
+
checkpointCounts.set(planId, (checkpointCounts.get(planId) || 0) + 1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const matches = [];
|
|
116
|
+
for (const item of planItems) {
|
|
117
|
+
const plan = item.content;
|
|
118
|
+
if (plan.status === 'completed' || plan.status === 'abandoned')
|
|
119
|
+
continue;
|
|
120
|
+
// Calcular similitud
|
|
121
|
+
const keywordSim = calculateKeywordSimilarity(promptKeywords, plan.keywords || []);
|
|
122
|
+
// Bonus por mismo dominio
|
|
123
|
+
const domainBonus = domain && plan.domain === domain ? 0.2 : 0;
|
|
124
|
+
// Bonus por actividad reciente (últimas 24h)
|
|
125
|
+
const lastUpdate = new Date(plan.updatedAt || plan.createdAt);
|
|
126
|
+
const hoursSinceUpdate = (Date.now() - lastUpdate.getTime()) / (1000 * 60 * 60);
|
|
127
|
+
const recencyBonus = hoursSinceUpdate < 24 ? 0.1 : hoursSinceUpdate < 72 ? 0.05 : 0;
|
|
128
|
+
const similarity = Math.min(1, keywordSim + domainBonus + recencyBonus);
|
|
129
|
+
if (similarity >= minSimilarity) {
|
|
130
|
+
matches.push({
|
|
131
|
+
planId: item.id,
|
|
132
|
+
title: plan.title,
|
|
133
|
+
similarity,
|
|
134
|
+
matchReason: domainBonus > 0 ? 'domain' : recencyBonus > 0 ? 'recent' : 'keyword',
|
|
135
|
+
lastActivity: plan.updatedAt || plan.createdAt,
|
|
136
|
+
checkpointCount: checkpointCounts.get(item.id) || 0, // O(1) lookup
|
|
137
|
+
status: plan.status,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Ordenar por similitud descendente
|
|
142
|
+
return matches
|
|
143
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
144
|
+
.slice(0, limit);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Actualizar estado del plan
|
|
148
|
+
*/
|
|
149
|
+
async updateStatus(planId, status) {
|
|
150
|
+
const item = await this.client.get(planId);
|
|
151
|
+
if (!item)
|
|
152
|
+
return;
|
|
153
|
+
const plan = item.content;
|
|
154
|
+
const now = new Date().toISOString();
|
|
155
|
+
await this.client.update(planId, {
|
|
156
|
+
status: status === 'active' ? 'active' : status === 'completed' ? 'done' : 'blocked',
|
|
157
|
+
content: {
|
|
158
|
+
...plan,
|
|
159
|
+
status,
|
|
160
|
+
updatedAt: now,
|
|
161
|
+
...(status === 'completed' ? { completedAt: now } : {}),
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
// Agregar checkpoint de estado
|
|
165
|
+
await this.addCheckpoint(planId, {
|
|
166
|
+
checkpointType: status === 'completed' ? 'complete' : 'progress',
|
|
167
|
+
summary: `Plan ${status === 'completed' ? 'completado' : status === 'paused' ? 'pausado' : 'actualizado'}`,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Mergear dos planes
|
|
172
|
+
*/
|
|
173
|
+
async merge(targetPlanId, sourcePlanId) {
|
|
174
|
+
const [targetItem, sourceItem] = await Promise.all([
|
|
175
|
+
this.client.get(targetPlanId),
|
|
176
|
+
this.client.get(sourcePlanId),
|
|
177
|
+
]);
|
|
178
|
+
if (!targetItem || !sourceItem) {
|
|
179
|
+
throw new Error('Planes no encontrados');
|
|
180
|
+
}
|
|
181
|
+
const target = targetItem.content;
|
|
182
|
+
const source = sourceItem.content;
|
|
183
|
+
const now = new Date().toISOString();
|
|
184
|
+
// Combinar keywords y taskIds
|
|
185
|
+
const allKeywords = (target.keywords || []).concat(source.keywords || []);
|
|
186
|
+
const mergedKeywords = Array.from(new Set(allKeywords));
|
|
187
|
+
const allTaskIds = (target.taskIds || []).concat(source.taskIds || []);
|
|
188
|
+
const mergedTaskIds = Array.from(new Set(allTaskIds));
|
|
189
|
+
const mergedFromIds = [...(target.mergedFromIds || []), sourcePlanId];
|
|
190
|
+
// Actualizar plan target
|
|
191
|
+
await this.client.update(targetPlanId, {
|
|
192
|
+
content: {
|
|
193
|
+
...target,
|
|
194
|
+
keywords: mergedKeywords,
|
|
195
|
+
taskIds: mergedTaskIds,
|
|
196
|
+
mergedFromIds,
|
|
197
|
+
updatedAt: now,
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
// Marcar source como merged
|
|
201
|
+
await this.client.update(sourcePlanId, {
|
|
202
|
+
status: 'done',
|
|
203
|
+
content: {
|
|
204
|
+
...source,
|
|
205
|
+
status: 'merged',
|
|
206
|
+
parentPlanId: targetPlanId,
|
|
207
|
+
updatedAt: now,
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
// Agregar checkpoints en ambos
|
|
211
|
+
await Promise.all([
|
|
212
|
+
this.addCheckpoint(targetPlanId, {
|
|
213
|
+
checkpointType: 'progress',
|
|
214
|
+
summary: `Plan fusionado con: ${source.title}`,
|
|
215
|
+
}),
|
|
216
|
+
this.addCheckpoint(sourcePlanId, {
|
|
217
|
+
checkpointType: 'complete',
|
|
218
|
+
summary: `Fusionado en: ${target.title}`,
|
|
219
|
+
}),
|
|
220
|
+
]);
|
|
221
|
+
}
|
|
222
|
+
// ===========================================================================
|
|
223
|
+
// CHECKPOINTS
|
|
224
|
+
// ===========================================================================
|
|
225
|
+
/**
|
|
226
|
+
* Agregar checkpoint a un plan
|
|
227
|
+
*/
|
|
228
|
+
async addCheckpoint(planId, options) {
|
|
229
|
+
const now = new Date().toISOString();
|
|
230
|
+
const checkpointData = createCheckpoint({
|
|
231
|
+
planId,
|
|
232
|
+
...options,
|
|
233
|
+
agentId: this.agentId,
|
|
234
|
+
sessionId: this.currentSessionId,
|
|
235
|
+
});
|
|
236
|
+
const result = await this.client.create({
|
|
237
|
+
type: 'plan_checkpoint',
|
|
238
|
+
status: 'active',
|
|
239
|
+
priority: 'medium',
|
|
240
|
+
content: checkpointData,
|
|
241
|
+
tags: ['checkpoint', options.checkpointType, planId],
|
|
242
|
+
});
|
|
243
|
+
// Actualizar lastCheckpoint en el plan
|
|
244
|
+
const planItem = await this.client.get(planId);
|
|
245
|
+
if (planItem) {
|
|
246
|
+
const plan = planItem.content;
|
|
247
|
+
await this.client.update(planId, {
|
|
248
|
+
content: {
|
|
249
|
+
...plan,
|
|
250
|
+
lastCheckpointId: result.id,
|
|
251
|
+
lastCheckpointSummary: options.summary,
|
|
252
|
+
updatedAt: now,
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
...checkpointData,
|
|
258
|
+
id: result.id,
|
|
259
|
+
createdAt: now,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Obtener checkpoints de un plan con validación Zod
|
|
264
|
+
*/
|
|
265
|
+
async getCheckpoints(planId, limit = 10) {
|
|
266
|
+
const items = await this.client.list({
|
|
267
|
+
type: 'plan_checkpoint',
|
|
268
|
+
limit,
|
|
269
|
+
});
|
|
270
|
+
const validCheckpoints = [];
|
|
271
|
+
for (const item of items) {
|
|
272
|
+
const parseResult = PlanCheckpointSchema.safeParse({
|
|
273
|
+
...item.content,
|
|
274
|
+
id: item.id,
|
|
275
|
+
});
|
|
276
|
+
if (parseResult.success && parseResult.data.planId === planId) {
|
|
277
|
+
validCheckpoints.push(parseResult.data);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return validCheckpoints;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Obtener último checkpoint de un plan
|
|
284
|
+
*/
|
|
285
|
+
async getLastCheckpoint(planId) {
|
|
286
|
+
const checkpoints = await this.getCheckpoints(planId, 1);
|
|
287
|
+
return checkpoints[0] || null;
|
|
288
|
+
}
|
|
289
|
+
// ===========================================================================
|
|
290
|
+
// CONTEXT FOR SESSION START
|
|
291
|
+
// ===========================================================================
|
|
292
|
+
/**
|
|
293
|
+
* Generar contexto de planes para session start
|
|
294
|
+
*/
|
|
295
|
+
async getSessionContext(currentPrompt) {
|
|
296
|
+
let context = '';
|
|
297
|
+
// Planes activos
|
|
298
|
+
const activePlans = await this.getActive();
|
|
299
|
+
if (activePlans.length > 0) {
|
|
300
|
+
context += `## 🎯 Planes Activos (${activePlans.length})\n\n`;
|
|
301
|
+
for (const plan of activePlans.slice(0, 3)) {
|
|
302
|
+
const lastCheckpoint = await this.getLastCheckpoint(plan.id);
|
|
303
|
+
context += `### ${plan.title}\n`;
|
|
304
|
+
context += `- **Estado**: ${plan.status}\n`;
|
|
305
|
+
if (lastCheckpoint) {
|
|
306
|
+
context += `- **Último avance**: ${lastCheckpoint.summary}\n`;
|
|
307
|
+
if (lastCheckpoint.nextSteps.length > 0) {
|
|
308
|
+
context += `- **Próximos pasos**: ${lastCheckpoint.nextSteps[0]}\n`;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
context += `- **ID**: \`${plan.id}\`\n\n`;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Buscar planes similares si hay prompt
|
|
315
|
+
if (currentPrompt) {
|
|
316
|
+
const similar = await this.findSimilar({
|
|
317
|
+
prompt: currentPrompt,
|
|
318
|
+
minSimilarity: 0.3,
|
|
319
|
+
limit: 3,
|
|
320
|
+
});
|
|
321
|
+
if (similar.length > 0) {
|
|
322
|
+
context += `## 🔍 Planes Relacionados Encontrados\n\n`;
|
|
323
|
+
context += `Tu solicitud parece relacionarse con planes existentes:\n\n`;
|
|
324
|
+
for (const match of similar) {
|
|
325
|
+
const similarity = Math.round(match.similarity * 100);
|
|
326
|
+
context += `- **${match.title}** (${similarity}% similar, ${match.checkpointCount} checkpoints)\n`;
|
|
327
|
+
context += ` ID: \`${match.planId}\` | Último: ${formatTimeAgo(match.lastActivity)}\n`;
|
|
328
|
+
}
|
|
329
|
+
context += `\n> Usa \`/plan continue <id>\` para retomar o \`/plan new\` para crear uno nuevo.\n\n`;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return context;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// =============================================================================
|
|
336
|
+
// HELPERS
|
|
337
|
+
// =============================================================================
|
|
338
|
+
function formatTimeAgo(isoDate) {
|
|
339
|
+
const date = new Date(isoDate);
|
|
340
|
+
const now = new Date();
|
|
341
|
+
const diffMs = now.getTime() - date.getTime();
|
|
342
|
+
const diffMins = Math.floor(diffMs / 60000);
|
|
343
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
344
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
345
|
+
if (diffMins < 1)
|
|
346
|
+
return 'ahora';
|
|
347
|
+
if (diffMins < 60)
|
|
348
|
+
return `hace ${diffMins}m`;
|
|
349
|
+
if (diffHours < 24)
|
|
350
|
+
return `hace ${diffHours}h`;
|
|
351
|
+
return `hace ${diffDays}d`;
|
|
352
|
+
}
|
|
353
|
+
// =============================================================================
|
|
354
|
+
// FACTORY
|
|
355
|
+
// =============================================================================
|
|
356
|
+
let managerInstance = null;
|
|
357
|
+
/**
|
|
358
|
+
* Obtener o crear instancia de PlanManager
|
|
359
|
+
*/
|
|
360
|
+
export function getPlanManager(system, options) {
|
|
361
|
+
if (!managerInstance || options) {
|
|
362
|
+
managerInstance = new PlanManager(system, options);
|
|
363
|
+
}
|
|
364
|
+
return managerInstance;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Crear nueva instancia de PlanManager
|
|
368
|
+
*/
|
|
369
|
+
export function createPlanManager(system, options) {
|
|
370
|
+
return new PlanManager(system, options);
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=PlanManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanManager.js","sourceRoot":"","sources":["../../src/services/PlanManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -248,19 +248,19 @@ export class ProjectScaffold {
|
|
|
248
248
|
generateClaudeMd(scan, options) {
|
|
249
249
|
const system = options.system.toUpperCase();
|
|
250
250
|
const projectName = options.projectName || scan.name;
|
|
251
|
-
let content = `# CLAUDE.md - ${projectName}
|
|
252
|
-
|
|
253
|
-
> **System**: ${system}
|
|
254
|
-
> **Generated**: ${new Date().toISOString().split('T')[0]}
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## Project Overview
|
|
259
|
-
|
|
260
|
-
${projectName} is part of the **MetaNautical Group** ecosystem.
|
|
261
|
-
|
|
262
|
-
### Tech Stack
|
|
263
|
-
|
|
251
|
+
let content = `# CLAUDE.md - ${projectName}
|
|
252
|
+
|
|
253
|
+
> **System**: ${system}
|
|
254
|
+
> **Generated**: ${new Date().toISOString().split('T')[0]}
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Project Overview
|
|
259
|
+
|
|
260
|
+
${projectName} is part of the **MetaNautical Group** ecosystem.
|
|
261
|
+
|
|
262
|
+
### Tech Stack
|
|
263
|
+
|
|
264
264
|
`;
|
|
265
265
|
// Framework
|
|
266
266
|
if (scan.framework.name !== 'unknown') {
|
|
@@ -294,33 +294,33 @@ ${projectName} is part of the **MetaNautical Group** ecosystem.
|
|
|
294
294
|
if (scan.api.type !== 'none') {
|
|
295
295
|
content += `- **API**: ${scan.api.type.toUpperCase()}\n`;
|
|
296
296
|
}
|
|
297
|
-
content += `
|
|
298
|
-
---
|
|
299
|
-
|
|
300
|
-
## Core Rules (Non-Negotiable)
|
|
301
|
-
|
|
302
|
-
### Code Quality
|
|
303
|
-
- NO \`any\`/\`unknown\` types - use proper typing
|
|
304
|
-
- NO ESLint disable comments without justification
|
|
305
|
-
- **Never Assume**: Verify files/constants exist before using
|
|
306
|
-
|
|
307
|
-
### Security
|
|
308
|
-
- All inputs must be validated with Zod
|
|
309
|
-
- Use \`protectedProcedure\` for authenticated routes
|
|
310
|
-
- Never expose sensitive data in responses
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
314
|
-
## Structure
|
|
315
|
-
|
|
316
|
-
\`\`\`
|
|
317
|
-
${scan.name}/
|
|
318
|
-
├── .claude/ # Claude Code configuration
|
|
319
|
-
│ ├── agents/ # AI expert agents
|
|
320
|
-
│ ├── commands/ # Slash commands (/experts, etc.)
|
|
321
|
-
│ ├── hooks/ # Session hooks
|
|
322
|
-
│ └── project.config.json
|
|
323
|
-
├── .ai-skills/ # Project-specific knowledge
|
|
297
|
+
content += `
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Core Rules (Non-Negotiable)
|
|
301
|
+
|
|
302
|
+
### Code Quality
|
|
303
|
+
- NO \`any\`/\`unknown\` types - use proper typing
|
|
304
|
+
- NO ESLint disable comments without justification
|
|
305
|
+
- **Never Assume**: Verify files/constants exist before using
|
|
306
|
+
|
|
307
|
+
### Security
|
|
308
|
+
- All inputs must be validated with Zod
|
|
309
|
+
- Use \`protectedProcedure\` for authenticated routes
|
|
310
|
+
- Never expose sensitive data in responses
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Structure
|
|
315
|
+
|
|
316
|
+
\`\`\`
|
|
317
|
+
${scan.name}/
|
|
318
|
+
├── .claude/ # Claude Code configuration
|
|
319
|
+
│ ├── agents/ # AI expert agents
|
|
320
|
+
│ ├── commands/ # Slash commands (/experts, etc.)
|
|
321
|
+
│ ├── hooks/ # Session hooks
|
|
322
|
+
│ └── project.config.json
|
|
323
|
+
├── .ai-skills/ # Project-specific knowledge
|
|
324
324
|
`;
|
|
325
325
|
if (scan.structure.srcDir) {
|
|
326
326
|
content += `├── src/\n`;
|
|
@@ -331,42 +331,42 @@ ${scan.name}/
|
|
|
331
331
|
content += `│ ├── server/\n`;
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
|
-
content += `└── CLAUDE.md # This file
|
|
335
|
-
\`\`\`
|
|
336
|
-
|
|
337
|
-
---
|
|
338
|
-
|
|
339
|
-
## Commands
|
|
340
|
-
|
|
341
|
-
### Development
|
|
342
|
-
\`\`\`bash
|
|
343
|
-
npm run dev # Start dev server
|
|
344
|
-
npm run build # Production build
|
|
345
|
-
npm run lint # ESLint check
|
|
346
|
-
npm run typecheck # TypeScript check
|
|
347
|
-
\`\`\`
|
|
348
|
-
|
|
349
|
-
### Memory System
|
|
350
|
-
\`\`\`bash
|
|
351
|
-
cmp-memory status # Check memory system health
|
|
352
|
-
cmp-memory validate # Validate project structure
|
|
353
|
-
cmp-memory sync # Sync experts/hooks from npm
|
|
354
|
-
\`\`\`
|
|
355
|
-
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
## Expert Review
|
|
359
|
-
|
|
360
|
-
Use \`/experts\` for code review:
|
|
361
|
-
|
|
362
|
-
\`\`\`bash
|
|
363
|
-
/experts src/path/to/file.ts # Review specific file
|
|
364
|
-
/experts src/server/api/ # Review directory
|
|
365
|
-
\`\`\`
|
|
366
|
-
|
|
367
|
-
---
|
|
368
|
-
|
|
369
|
-
*Part of MetaNautical Group ecosystem*
|
|
334
|
+
content += `└── CLAUDE.md # This file
|
|
335
|
+
\`\`\`
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Commands
|
|
340
|
+
|
|
341
|
+
### Development
|
|
342
|
+
\`\`\`bash
|
|
343
|
+
npm run dev # Start dev server
|
|
344
|
+
npm run build # Production build
|
|
345
|
+
npm run lint # ESLint check
|
|
346
|
+
npm run typecheck # TypeScript check
|
|
347
|
+
\`\`\`
|
|
348
|
+
|
|
349
|
+
### Memory System
|
|
350
|
+
\`\`\`bash
|
|
351
|
+
cmp-memory status # Check memory system health
|
|
352
|
+
cmp-memory validate # Validate project structure
|
|
353
|
+
cmp-memory sync # Sync experts/hooks from npm
|
|
354
|
+
\`\`\`
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Expert Review
|
|
359
|
+
|
|
360
|
+
Use \`/experts\` for code review:
|
|
361
|
+
|
|
362
|
+
\`\`\`bash
|
|
363
|
+
/experts src/path/to/file.ts # Review specific file
|
|
364
|
+
/experts src/server/api/ # Review directory
|
|
365
|
+
\`\`\`
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
*Part of MetaNautical Group ecosystem*
|
|
370
370
|
`;
|
|
371
371
|
return content;
|
|
372
372
|
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Context Injector Service
|
|
3
|
+
* @description Smart context loading for sessions and tools
|
|
4
|
+
*
|
|
5
|
+
* Provides:
|
|
6
|
+
* - Domain-specific memory loading
|
|
7
|
+
* - Semantic context matching for tasks
|
|
8
|
+
* - Skill suggestions based on context
|
|
9
|
+
* - "Did we solve this before?" detection
|
|
10
|
+
*/
|
|
11
|
+
import { type UnifiedMemory } from './memory-router.js';
|
|
12
|
+
import type { DevSystem } from '../types/index.js';
|
|
13
|
+
export interface SessionContext {
|
|
14
|
+
/** Recent memories for the detected domain */
|
|
15
|
+
recentMemories: UnifiedMemory[];
|
|
16
|
+
/** Unresolved issues/gotchas */
|
|
17
|
+
unresolved: UnifiedMemory[];
|
|
18
|
+
/** Frequent patterns in this domain */
|
|
19
|
+
patterns: PatternSummary[];
|
|
20
|
+
/** Relevant skills for the domain */
|
|
21
|
+
skills: SkillSuggestion[];
|
|
22
|
+
/** Active tasks */
|
|
23
|
+
activeTasks: TaskSummary[];
|
|
24
|
+
/** Pending improvements count */
|
|
25
|
+
pendingImprovements: number;
|
|
26
|
+
/** System health status */
|
|
27
|
+
health: SystemHealth;
|
|
28
|
+
}
|
|
29
|
+
export interface TaskContext {
|
|
30
|
+
/** Related past work */
|
|
31
|
+
relatedWork: UnifiedMemory[];
|
|
32
|
+
/** Potential gotchas to be aware of */
|
|
33
|
+
potentialGotchas: UnifiedMemory[];
|
|
34
|
+
/** Suggested approach based on past success */
|
|
35
|
+
suggestedApproach?: string;
|
|
36
|
+
/** Similar completed tasks */
|
|
37
|
+
similarTasks: TaskSummary[];
|
|
38
|
+
}
|
|
39
|
+
export interface PatternSummary {
|
|
40
|
+
id: string;
|
|
41
|
+
description: string;
|
|
42
|
+
occurrences: number;
|
|
43
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
44
|
+
}
|
|
45
|
+
export interface SkillSuggestion {
|
|
46
|
+
name: string;
|
|
47
|
+
description: string;
|
|
48
|
+
command: string;
|
|
49
|
+
relevance: number;
|
|
50
|
+
}
|
|
51
|
+
export interface TaskSummary {
|
|
52
|
+
id: string;
|
|
53
|
+
title: string;
|
|
54
|
+
status: string;
|
|
55
|
+
progress: string;
|
|
56
|
+
lastActivity: string;
|
|
57
|
+
}
|
|
58
|
+
export interface SystemHealth {
|
|
59
|
+
turso: boolean;
|
|
60
|
+
redis: boolean;
|
|
61
|
+
vector: boolean;
|
|
62
|
+
overall: 'healthy' | 'degraded' | 'offline';
|
|
63
|
+
}
|
|
64
|
+
declare class ContextInjectorService {
|
|
65
|
+
private config;
|
|
66
|
+
/**
|
|
67
|
+
* Get full session context for SessionStart hook
|
|
68
|
+
*/
|
|
69
|
+
getSessionContext(system: DevSystem, domain?: string, projectRoot?: string): Promise<SessionContext>;
|
|
70
|
+
/**
|
|
71
|
+
* Get context for a specific task/operation
|
|
72
|
+
* Called by PreToolUse for Task tool
|
|
73
|
+
*/
|
|
74
|
+
getTaskContext(taskDescription: string, system: DevSystem): Promise<TaskContext>;
|
|
75
|
+
/**
|
|
76
|
+
* Check if similar work was done before
|
|
77
|
+
* Returns matching memories if found
|
|
78
|
+
*/
|
|
79
|
+
checkPreviousWork(query: string, system: DevSystem, filePath?: string): Promise<{
|
|
80
|
+
found: boolean;
|
|
81
|
+
memories: UnifiedMemory[];
|
|
82
|
+
message?: string;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Format session context as markdown for injection
|
|
86
|
+
*/
|
|
87
|
+
formatSessionContext(context: SessionContext, system: string): string;
|
|
88
|
+
/**
|
|
89
|
+
* Format task context as markdown for injection
|
|
90
|
+
*/
|
|
91
|
+
formatTaskContext(context: TaskContext): string;
|
|
92
|
+
private getRecentMemories;
|
|
93
|
+
private getUnresolvedIssues;
|
|
94
|
+
private getFrequentPatterns;
|
|
95
|
+
private getActiveTasks;
|
|
96
|
+
private getPendingImprovementsCount;
|
|
97
|
+
private checkHealth;
|
|
98
|
+
private getSkillsForDomain;
|
|
99
|
+
/**
|
|
100
|
+
* Find similar completed tasks using semantic search
|
|
101
|
+
*
|
|
102
|
+
* Uses vector embeddings to find tasks with similar descriptions,
|
|
103
|
+
* helping inform approach based on past successful implementations.
|
|
104
|
+
*/
|
|
105
|
+
private getSimilarCompletedTasks;
|
|
106
|
+
private generateApproachSuggestion;
|
|
107
|
+
private formatTimeAgo;
|
|
108
|
+
}
|
|
109
|
+
export declare const contextInjector: ContextInjectorService;
|
|
110
|
+
export default contextInjector;
|
|
111
|
+
//# sourceMappingURL=context-injector.d.ts.map
|