cmp-standards 2.0.1 → 2.4.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 +171 -101
- package/dist/cli/index.js +239 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +203 -39
- package/dist/dashboard/server.js.map +1 -1
- package/dist/db/cloud.d.ts +174 -0
- package/dist/db/cloud.d.ts.map +1 -0
- package/dist/db/cloud.js +241 -0
- package/dist/db/cloud.js.map +1 -0
- package/dist/db/errors.d.ts +76 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +135 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/turso-client.d.ts +178 -0
- package/dist/db/turso-client.d.ts.map +1 -0
- package/dist/db/turso-client.js +455 -0
- package/dist/db/turso-client.js.map +1 -0
- package/dist/db/upstash-client.d.ts +161 -0
- package/dist/db/upstash-client.d.ts.map +1 -0
- package/dist/db/upstash-client.js +325 -0
- package/dist/db/upstash-client.js.map +1 -0
- package/dist/hooks/cloud-post-tool-use.d.ts +30 -0
- package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -0
- package/dist/hooks/cloud-post-tool-use.js +116 -0
- package/dist/hooks/cloud-post-tool-use.js.map +1 -0
- package/dist/hooks/cloud-pre-tool-use.d.ts +19 -0
- package/dist/hooks/cloud-pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/cloud-pre-tool-use.js +149 -0
- package/dist/hooks/cloud-pre-tool-use.js.map +1 -0
- package/dist/hooks/cloud-session-start.d.ts +20 -0
- package/dist/hooks/cloud-session-start.d.ts.map +1 -0
- package/dist/hooks/cloud-session-start.js +130 -0
- package/dist/hooks/cloud-session-start.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/memory-checkpoint.d.ts.map +1 -1
- package/dist/hooks/memory-checkpoint.js +12 -20
- package/dist/hooks/memory-checkpoint.js.map +1 -1
- package/dist/hooks/pre-tool-use.d.ts +2 -8
- package/dist/hooks/pre-tool-use.d.ts.map +1 -1
- package/dist/hooks/pre-tool-use.js +7 -106
- package/dist/hooks/pre-tool-use.js.map +1 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +15 -6
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +223 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/schema/tracking.d.ts +644 -0
- package/dist/schema/tracking.d.ts.map +1 -0
- package/dist/schema/tracking.js +204 -0
- package/dist/schema/tracking.js.map +1 -0
- package/dist/services/ProjectScaffold.d.ts.map +1 -1
- package/dist/services/ProjectScaffold.js +33 -5
- package/dist/services/ProjectScaffold.js.map +1 -1
- package/dist/services/TaskTracker.d.ts +1 -1
- package/dist/services/TaskTracker.d.ts.map +1 -1
- package/dist/services/TaskTracker.js +4 -8
- package/dist/services/TaskTracker.js.map +1 -1
- package/dist/services/WorkPlanManager.d.ts +1 -1
- package/dist/services/WorkPlanManager.d.ts.map +1 -1
- package/dist/services/WorkPlanManager.js +8 -14
- package/dist/services/WorkPlanManager.js.map +1 -1
- package/dist/services/auto-inject.d.ts +1 -0
- package/dist/services/auto-inject.d.ts.map +1 -1
- package/dist/services/auto-inject.js +12 -17
- package/dist/services/auto-inject.js.map +1 -1
- package/dist/services/cross-project-sync.d.ts +2 -0
- package/dist/services/cross-project-sync.d.ts.map +1 -1
- package/dist/services/cross-project-sync.js +26 -21
- package/dist/services/cross-project-sync.js.map +1 -1
- package/dist/services/memory-consolidation.d.ts.map +1 -1
- package/dist/services/memory-consolidation.js +30 -27
- package/dist/services/memory-consolidation.js.map +1 -1
- package/dist/utils/env-loader.d.ts +41 -0
- package/dist/utils/env-loader.d.ts.map +1 -0
- package/dist/utils/env-loader.js +78 -0
- package/dist/utils/env-loader.js.map +1 -0
- package/dist/utils/git.d.ts +52 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +267 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/paths.d.ts +39 -5
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +88 -7
- package/dist/utils/paths.js.map +1 -1
- package/package.json +8 -2
- package/standards/README.md +50 -0
- package/standards/experts/expert-routing.md +215 -0
- package/standards/general/code-quality.md +86 -0
- package/standards/general/memory-usage.md +205 -0
- package/standards/general/sync-workflow.md +235 -0
- package/standards/general/workflow.md +82 -0
- package/standards/hooks/mandatory-tracking.md +446 -0
- package/standards/infrastructure/cloud-database.md +287 -0
- package/standards/mcp/server-design.md +243 -0
- package/standards/mcp/tool-patterns.md +354 -0
- package/standards/skills/skill-structure.md +286 -0
- package/standards/skills/workflow-design.md +323 -0
- package/standards/tools/tool-design.md +297 -0
- package/templates/claude-settings.json +72 -0
- package/templates/memory-config.json +2 -28
- package/templates/skills/continue.md +205 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Cliente Upstash (Redis + Vector)
|
|
3
|
+
* @description Cliente serverless para cache y búsqueda semántica
|
|
4
|
+
*/
|
|
5
|
+
import { Redis } from '@upstash/redis';
|
|
6
|
+
import { Index } from '@upstash/vector';
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Redis Client
|
|
9
|
+
// =============================================================================
|
|
10
|
+
let redis = null;
|
|
11
|
+
/**
|
|
12
|
+
* Inicializar cliente Redis
|
|
13
|
+
*/
|
|
14
|
+
export function initRedis(config) {
|
|
15
|
+
if (redis)
|
|
16
|
+
return redis;
|
|
17
|
+
const url = config?.url || process.env.UPSTASH_REDIS_REST_URL;
|
|
18
|
+
const token = config?.token || process.env.UPSTASH_REDIS_REST_TOKEN;
|
|
19
|
+
if (!url || !token) {
|
|
20
|
+
throw new Error('Upstash Redis credentials not configured. Set UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN');
|
|
21
|
+
}
|
|
22
|
+
redis = new Redis({ url, token });
|
|
23
|
+
return redis;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Obtener cliente Redis
|
|
27
|
+
*/
|
|
28
|
+
export function getRedis() {
|
|
29
|
+
if (!redis) {
|
|
30
|
+
return initRedis();
|
|
31
|
+
}
|
|
32
|
+
return redis;
|
|
33
|
+
}
|
|
34
|
+
// =============================================================================
|
|
35
|
+
// Config Cache
|
|
36
|
+
// =============================================================================
|
|
37
|
+
const CONFIG_TTL = 3600; // 1 hora
|
|
38
|
+
/**
|
|
39
|
+
* Cachear configuración de proyecto
|
|
40
|
+
*/
|
|
41
|
+
export async function cacheConfig(system, config) {
|
|
42
|
+
const r = getRedis();
|
|
43
|
+
const key = `config:${system}`;
|
|
44
|
+
await r.set(key, JSON.stringify({
|
|
45
|
+
system,
|
|
46
|
+
config,
|
|
47
|
+
cachedAt: new Date().toISOString()
|
|
48
|
+
}), { ex: CONFIG_TTL });
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Obtener configuración cacheada
|
|
52
|
+
*/
|
|
53
|
+
export async function getCachedConfig(system) {
|
|
54
|
+
const r = getRedis();
|
|
55
|
+
const key = `config:${system}`;
|
|
56
|
+
const data = await r.get(key);
|
|
57
|
+
if (!data)
|
|
58
|
+
return null;
|
|
59
|
+
return typeof data === 'string' ? JSON.parse(data) : data;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Invalidar cache de configuración
|
|
63
|
+
*/
|
|
64
|
+
export async function invalidateConfig(system) {
|
|
65
|
+
const r = getRedis();
|
|
66
|
+
await r.del(`config:${system}`);
|
|
67
|
+
}
|
|
68
|
+
// =============================================================================
|
|
69
|
+
// Session Tracking
|
|
70
|
+
// =============================================================================
|
|
71
|
+
const SESSION_TTL = 86400; // 24 horas
|
|
72
|
+
/**
|
|
73
|
+
* Registrar sesión activa
|
|
74
|
+
*/
|
|
75
|
+
export async function registerSession(session) {
|
|
76
|
+
const r = getRedis();
|
|
77
|
+
// Guardar en hash de sesiones activas
|
|
78
|
+
await r.hset('sessions:active', {
|
|
79
|
+
[session.sessionId]: JSON.stringify(session)
|
|
80
|
+
});
|
|
81
|
+
// Expiration individual
|
|
82
|
+
await r.set(`session:${session.sessionId}`, JSON.stringify(session), { ex: SESSION_TTL });
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Obtener sesión activa
|
|
86
|
+
*/
|
|
87
|
+
export async function getActiveSession(sessionId) {
|
|
88
|
+
const r = getRedis();
|
|
89
|
+
const data = await r.get(`session:${sessionId}`);
|
|
90
|
+
if (!data)
|
|
91
|
+
return null;
|
|
92
|
+
return typeof data === 'string' ? JSON.parse(data) : data;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Actualizar última actividad de sesión
|
|
96
|
+
*/
|
|
97
|
+
export async function updateSessionActivity(sessionId, updates) {
|
|
98
|
+
const session = await getActiveSession(sessionId);
|
|
99
|
+
if (!session)
|
|
100
|
+
return;
|
|
101
|
+
const updated = {
|
|
102
|
+
...session,
|
|
103
|
+
...updates,
|
|
104
|
+
lastActivityAt: new Date().toISOString()
|
|
105
|
+
};
|
|
106
|
+
await registerSession(updated);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Obtener todas las sesiones activas de un sistema
|
|
110
|
+
*/
|
|
111
|
+
export async function getSystemSessions(system) {
|
|
112
|
+
const r = getRedis();
|
|
113
|
+
const all = await r.hgetall('sessions:active');
|
|
114
|
+
if (!all)
|
|
115
|
+
return [];
|
|
116
|
+
return Object.values(all)
|
|
117
|
+
.map(v => typeof v === 'string' ? JSON.parse(v) : v)
|
|
118
|
+
.filter((s) => s.system === system);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Eliminar sesión
|
|
122
|
+
*/
|
|
123
|
+
export async function removeSession(sessionId) {
|
|
124
|
+
const r = getRedis();
|
|
125
|
+
await r.hdel('sessions:active', sessionId);
|
|
126
|
+
await r.del(`session:${sessionId}`);
|
|
127
|
+
}
|
|
128
|
+
// =============================================================================
|
|
129
|
+
// Rate Limiting
|
|
130
|
+
// =============================================================================
|
|
131
|
+
/**
|
|
132
|
+
* Check rate limit
|
|
133
|
+
*/
|
|
134
|
+
export async function checkRateLimit(key, limit, windowSeconds) {
|
|
135
|
+
const r = getRedis();
|
|
136
|
+
const redisKey = `ratelimit:${key}`;
|
|
137
|
+
const current = await r.incr(redisKey);
|
|
138
|
+
if (current === 1) {
|
|
139
|
+
await r.expire(redisKey, windowSeconds);
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
allowed: current <= limit,
|
|
143
|
+
remaining: Math.max(0, limit - current)
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// =============================================================================
|
|
147
|
+
// Quick Cache (for any data)
|
|
148
|
+
// =============================================================================
|
|
149
|
+
/**
|
|
150
|
+
* Set value with TTL
|
|
151
|
+
*/
|
|
152
|
+
export async function setCache(key, value, ttlSeconds) {
|
|
153
|
+
const r = getRedis();
|
|
154
|
+
if (ttlSeconds) {
|
|
155
|
+
await r.set(key, JSON.stringify(value), { ex: ttlSeconds });
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
await r.set(key, JSON.stringify(value));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get cached value
|
|
163
|
+
*/
|
|
164
|
+
export async function getCache(key) {
|
|
165
|
+
const r = getRedis();
|
|
166
|
+
const data = await r.get(key);
|
|
167
|
+
if (!data)
|
|
168
|
+
return null;
|
|
169
|
+
return typeof data === 'string' ? JSON.parse(data) : data;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Delete cached value
|
|
173
|
+
*/
|
|
174
|
+
export async function deleteCache(key) {
|
|
175
|
+
const r = getRedis();
|
|
176
|
+
await r.del(key);
|
|
177
|
+
}
|
|
178
|
+
// =============================================================================
|
|
179
|
+
// Health Check
|
|
180
|
+
// =============================================================================
|
|
181
|
+
/**
|
|
182
|
+
* Verificar conexión a Redis
|
|
183
|
+
*/
|
|
184
|
+
export async function healthCheck() {
|
|
185
|
+
const r = getRedis();
|
|
186
|
+
const start = Date.now();
|
|
187
|
+
try {
|
|
188
|
+
await r.ping();
|
|
189
|
+
return {
|
|
190
|
+
ok: true,
|
|
191
|
+
latency: Date.now() - start
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return {
|
|
196
|
+
ok: false,
|
|
197
|
+
latency: Date.now() - start
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// =============================================================================
|
|
202
|
+
// Vector Search
|
|
203
|
+
// =============================================================================
|
|
204
|
+
let vectorIndex = null;
|
|
205
|
+
/**
|
|
206
|
+
* Inicializar cliente Vector
|
|
207
|
+
*/
|
|
208
|
+
export function initVector(config) {
|
|
209
|
+
if (vectorIndex)
|
|
210
|
+
return vectorIndex;
|
|
211
|
+
const url = config?.url || process.env.UPSTASH_VECTOR_REST_URL;
|
|
212
|
+
const token = config?.token || process.env.UPSTASH_VECTOR_REST_TOKEN;
|
|
213
|
+
if (!url || !token) {
|
|
214
|
+
throw new Error('Upstash Vector credentials not configured. Set UPSTASH_VECTOR_REST_URL and UPSTASH_VECTOR_REST_TOKEN');
|
|
215
|
+
}
|
|
216
|
+
vectorIndex = new Index({ url, token });
|
|
217
|
+
return vectorIndex;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Obtener cliente Vector
|
|
221
|
+
*/
|
|
222
|
+
export function getVector() {
|
|
223
|
+
if (!vectorIndex) {
|
|
224
|
+
return initVector();
|
|
225
|
+
}
|
|
226
|
+
return vectorIndex;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Insertar/actualizar vector con embedding automático
|
|
230
|
+
*/
|
|
231
|
+
export async function upsertVector(id, data, metadata) {
|
|
232
|
+
const index = getVector();
|
|
233
|
+
await index.upsert({
|
|
234
|
+
id,
|
|
235
|
+
data, // Upstash genera el embedding automáticamente
|
|
236
|
+
metadata
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Buscar por similitud semántica
|
|
241
|
+
*/
|
|
242
|
+
export async function searchVectors(query, options) {
|
|
243
|
+
const index = getVector();
|
|
244
|
+
const results = await index.query({
|
|
245
|
+
data: query,
|
|
246
|
+
topK: options?.topK || 5,
|
|
247
|
+
includeMetadata: options?.includeMetadata ?? true,
|
|
248
|
+
includeData: options?.includeData ?? false,
|
|
249
|
+
filter: options?.filter
|
|
250
|
+
});
|
|
251
|
+
return results.map(r => ({
|
|
252
|
+
id: r.id,
|
|
253
|
+
score: r.score,
|
|
254
|
+
metadata: r.metadata,
|
|
255
|
+
data: r.data
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Eliminar vector
|
|
260
|
+
*/
|
|
261
|
+
export async function deleteVector(id) {
|
|
262
|
+
const index = getVector();
|
|
263
|
+
await index.delete(id);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Eliminar múltiples vectores
|
|
267
|
+
*/
|
|
268
|
+
export async function deleteVectors(ids) {
|
|
269
|
+
const index = getVector();
|
|
270
|
+
await index.delete(ids);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Health check para Vector
|
|
274
|
+
*/
|
|
275
|
+
export async function vectorHealthCheck() {
|
|
276
|
+
try {
|
|
277
|
+
const index = getVector();
|
|
278
|
+
const info = await index.info();
|
|
279
|
+
return {
|
|
280
|
+
ok: true,
|
|
281
|
+
message: `Connected (${info.vectorCount} vectors)`
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
return {
|
|
286
|
+
ok: false,
|
|
287
|
+
message: String(error)
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// =============================================================================
|
|
292
|
+
// Exports
|
|
293
|
+
// =============================================================================
|
|
294
|
+
export const upstash = {
|
|
295
|
+
// Redis
|
|
296
|
+
initRedis,
|
|
297
|
+
getRedis,
|
|
298
|
+
healthCheck,
|
|
299
|
+
// Config cache
|
|
300
|
+
cacheConfig,
|
|
301
|
+
getCachedConfig,
|
|
302
|
+
invalidateConfig,
|
|
303
|
+
// Sessions
|
|
304
|
+
registerSession,
|
|
305
|
+
getActiveSession,
|
|
306
|
+
updateSessionActivity,
|
|
307
|
+
getSystemSessions,
|
|
308
|
+
removeSession,
|
|
309
|
+
// Rate limiting
|
|
310
|
+
checkRateLimit,
|
|
311
|
+
// Generic cache
|
|
312
|
+
setCache,
|
|
313
|
+
getCache,
|
|
314
|
+
deleteCache,
|
|
315
|
+
// Vector
|
|
316
|
+
initVector,
|
|
317
|
+
getVector,
|
|
318
|
+
upsertVector,
|
|
319
|
+
searchVectors,
|
|
320
|
+
deleteVector,
|
|
321
|
+
deleteVectors,
|
|
322
|
+
vectorHealthCheck
|
|
323
|
+
};
|
|
324
|
+
export default upstash;
|
|
325
|
+
//# sourceMappingURL=upstash-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstash-client.js","sourceRoot":"","sources":["../../src/db/upstash-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Cloud Post-Tool-Use Hook
|
|
3
|
+
* @description Hook que se ejecuta después de usar herramientas
|
|
4
|
+
* Registra cambios y detecta oportunidades de mejora
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Auto-registro de archivos editados en la tarea activa
|
|
8
|
+
* - Tracking de métricas de sesión
|
|
9
|
+
* - Detección de patrones para auto-mejora
|
|
10
|
+
*/
|
|
11
|
+
export interface PostToolUseEvent {
|
|
12
|
+
tool: string;
|
|
13
|
+
params: Record<string, unknown>;
|
|
14
|
+
result: {
|
|
15
|
+
success: boolean;
|
|
16
|
+
output?: string;
|
|
17
|
+
error?: string;
|
|
18
|
+
};
|
|
19
|
+
cwd: string;
|
|
20
|
+
}
|
|
21
|
+
export interface PostToolUseResult {
|
|
22
|
+
logged: boolean;
|
|
23
|
+
metrics?: {
|
|
24
|
+
toolCalls: number;
|
|
25
|
+
filesModified: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function onPostToolUse(event: PostToolUseEvent): Promise<PostToolUseResult>;
|
|
29
|
+
export default onPostToolUse;
|
|
30
|
+
//# sourceMappingURL=cloud-post-tool-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-post-tool-use.d.ts","sourceRoot":"","sources":["../../src/hooks/cloud-post-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,CAAA;QACjB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;CACF;AAuBD,wBAAsB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsEvF;AA2BD,eAAe,aAAa,CAAA"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Cloud Post-Tool-Use Hook
|
|
3
|
+
* @description Hook que se ejecuta después de usar herramientas
|
|
4
|
+
* Registra cambios y detecta oportunidades de mejora
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Auto-registro de archivos editados en la tarea activa
|
|
8
|
+
* - Tracking de métricas de sesión
|
|
9
|
+
* - Detección de patrones para auto-mejora
|
|
10
|
+
*/
|
|
11
|
+
import { loadEnvFromAncestors } from '../utils/env-loader.js';
|
|
12
|
+
import { upstash } from '../db/upstash-client.js';
|
|
13
|
+
import { cloud } from '../db/cloud.js';
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// System Detection
|
|
16
|
+
// =============================================================================
|
|
17
|
+
function detectSystem(cwd) {
|
|
18
|
+
if (cwd.includes('swarmscale') || cwd.includes('SwarmScale')) {
|
|
19
|
+
return 'SWARMSCALE';
|
|
20
|
+
}
|
|
21
|
+
if (cwd.includes('easycharter') || cwd.includes('charter')) {
|
|
22
|
+
return 'CHARTER';
|
|
23
|
+
}
|
|
24
|
+
if (cwd.includes('carlosmartinpavon')) {
|
|
25
|
+
return 'CMP';
|
|
26
|
+
}
|
|
27
|
+
return 'UNKNOWN';
|
|
28
|
+
}
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Hook Implementation
|
|
31
|
+
// =============================================================================
|
|
32
|
+
export async function onPostToolUse(event) {
|
|
33
|
+
const { tool, params, result, cwd } = event;
|
|
34
|
+
// Solo trackear tools significativos
|
|
35
|
+
const significantTools = ['Edit', 'Write', 'Bash', 'Task'];
|
|
36
|
+
if (!significantTools.includes(tool)) {
|
|
37
|
+
return { logged: false };
|
|
38
|
+
}
|
|
39
|
+
// Cargar .env usando la nueva función de monorepo
|
|
40
|
+
loadEnvFromAncestors(cwd);
|
|
41
|
+
const system = detectSystem(cwd);
|
|
42
|
+
try {
|
|
43
|
+
// Buscar sesión activa
|
|
44
|
+
const sessions = await upstash.getSystemSessions(system);
|
|
45
|
+
const activeSession = sessions.find(s => {
|
|
46
|
+
const lastActivity = new Date(s.lastActivityAt);
|
|
47
|
+
const fourHoursAgo = new Date(Date.now() - 4 * 60 * 60 * 1000);
|
|
48
|
+
return lastActivity > fourHoursAgo;
|
|
49
|
+
});
|
|
50
|
+
if (!activeSession) {
|
|
51
|
+
return { logged: false };
|
|
52
|
+
}
|
|
53
|
+
// Actualizar contador de tool calls
|
|
54
|
+
await upstash.updateSessionActivity(activeSession.sessionId);
|
|
55
|
+
// Registrar métricas en cache
|
|
56
|
+
const metricsKey = `metrics:${activeSession.sessionId}`;
|
|
57
|
+
const existingMetrics = await upstash.getCache(metricsKey);
|
|
58
|
+
const metrics = existingMetrics || { toolCalls: 0, filesModified: [] };
|
|
59
|
+
metrics.toolCalls++;
|
|
60
|
+
// Auto-registrar archivos modificados
|
|
61
|
+
if ((tool === 'Edit' || tool === 'Write') && params.file_path) {
|
|
62
|
+
const filePath = params.file_path;
|
|
63
|
+
if (!metrics.filesModified.includes(filePath)) {
|
|
64
|
+
metrics.filesModified.push(filePath);
|
|
65
|
+
}
|
|
66
|
+
// Si hay tarea activa, actualizar con archivos modificados
|
|
67
|
+
if (activeSession.activeTaskId) {
|
|
68
|
+
try {
|
|
69
|
+
await cloud.updateProgress(activeSession.activeTaskId, {
|
|
70
|
+
files: metrics.filesModified
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Silently ignore - task might not exist anymore
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Guardar métricas (TTL 4 horas)
|
|
79
|
+
await upstash.setCache(metricsKey, metrics, 4 * 60 * 60);
|
|
80
|
+
return {
|
|
81
|
+
logged: true,
|
|
82
|
+
metrics: {
|
|
83
|
+
toolCalls: metrics.toolCalls,
|
|
84
|
+
filesModified: metrics.filesModified.length
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.error('[cloud-post-tool-use] Error:', error);
|
|
90
|
+
return { logged: false };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// =============================================================================
|
|
94
|
+
// CLI Entry Point
|
|
95
|
+
// =============================================================================
|
|
96
|
+
if (process.argv[1]?.includes('cloud-post-tool-use')) {
|
|
97
|
+
const tool = process.argv[2] || 'Unknown';
|
|
98
|
+
const success = process.argv[3] !== 'false';
|
|
99
|
+
const cwd = process.cwd();
|
|
100
|
+
onPostToolUse({
|
|
101
|
+
tool,
|
|
102
|
+
params: {},
|
|
103
|
+
result: { success },
|
|
104
|
+
cwd
|
|
105
|
+
})
|
|
106
|
+
.then(result => {
|
|
107
|
+
if (result.logged && result.metrics) {
|
|
108
|
+
console.log(`[Tracked] Tools: ${result.metrics.toolCalls}, Files: ${result.metrics.filesModified}`);
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
.catch(error => {
|
|
112
|
+
console.error('Error:', error.message);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
export default onPostToolUse;
|
|
116
|
+
//# sourceMappingURL=cloud-post-tool-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/cloud-post-tool-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Cloud Pre-Tool-Use Hook
|
|
3
|
+
* @description Hook que valida y trackea antes de usar herramientas
|
|
4
|
+
* Verifica que hay tarea activa antes de editar código
|
|
5
|
+
*/
|
|
6
|
+
export interface PreToolUseEvent {
|
|
7
|
+
tool: string;
|
|
8
|
+
params: Record<string, unknown>;
|
|
9
|
+
sessionId?: string;
|
|
10
|
+
cwd: string;
|
|
11
|
+
}
|
|
12
|
+
export interface PreToolUseResult {
|
|
13
|
+
proceed: boolean;
|
|
14
|
+
message?: string;
|
|
15
|
+
warning?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function onPreToolUse(event: PreToolUseEvent): Promise<PreToolUseResult>;
|
|
18
|
+
export default onPreToolUse;
|
|
19
|
+
//# sourceMappingURL=cloud-pre-tool-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-pre-tool-use.d.ts","sourceRoot":"","sources":["../../src/hooks/cloud-pre-tool-use.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAiCD,wBAAsB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqGpF;AA0BD,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Cloud Pre-Tool-Use Hook
|
|
3
|
+
* @description Hook que valida y trackea antes de usar herramientas
|
|
4
|
+
* Verifica que hay tarea activa antes de editar código
|
|
5
|
+
*/
|
|
6
|
+
import { config } from 'dotenv';
|
|
7
|
+
import { resolve } from 'path';
|
|
8
|
+
import { cloud } from '../db/cloud.js';
|
|
9
|
+
import { upstash } from '../db/upstash-client.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Configuration
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Tools que requieren tarea activa
|
|
14
|
+
const TRACKED_TOOLS = ['Edit', 'Write', 'Task'];
|
|
15
|
+
// Tools que siempre proceden
|
|
16
|
+
const ALWAYS_ALLOWED = ['Read', 'Glob', 'Grep', 'Bash', 'WebSearch', 'WebFetch'];
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// System Detection
|
|
19
|
+
// =============================================================================
|
|
20
|
+
function detectSystem(cwd) {
|
|
21
|
+
if (cwd.includes('swarmscale') || cwd.includes('SwarmScale')) {
|
|
22
|
+
return 'SWARMSCALE';
|
|
23
|
+
}
|
|
24
|
+
if (cwd.includes('easycharter') || cwd.includes('charter')) {
|
|
25
|
+
return 'CHARTER';
|
|
26
|
+
}
|
|
27
|
+
if (cwd.includes('carlosmartinpavon')) {
|
|
28
|
+
return 'CMP';
|
|
29
|
+
}
|
|
30
|
+
return 'UNKNOWN';
|
|
31
|
+
}
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// Hook Implementation
|
|
34
|
+
// =============================================================================
|
|
35
|
+
export async function onPreToolUse(event) {
|
|
36
|
+
const { tool, params, cwd } = event;
|
|
37
|
+
// Tools que siempre proceden
|
|
38
|
+
if (ALWAYS_ALLOWED.includes(tool)) {
|
|
39
|
+
return { proceed: true };
|
|
40
|
+
}
|
|
41
|
+
// Cargar .env
|
|
42
|
+
const envPaths = [
|
|
43
|
+
resolve(cwd, '.env'),
|
|
44
|
+
resolve(cwd, '../.env'),
|
|
45
|
+
resolve(cwd, '../../.env')
|
|
46
|
+
];
|
|
47
|
+
for (const envPath of envPaths) {
|
|
48
|
+
config({ path: envPath });
|
|
49
|
+
}
|
|
50
|
+
// Si no es un tool que trackeamos, proceder
|
|
51
|
+
if (!TRACKED_TOOLS.includes(tool)) {
|
|
52
|
+
return { proceed: true };
|
|
53
|
+
}
|
|
54
|
+
const system = detectSystem(cwd);
|
|
55
|
+
try {
|
|
56
|
+
// Buscar sesión activa en Redis
|
|
57
|
+
const sessions = await upstash.getSystemSessions(system);
|
|
58
|
+
const activeSession = sessions.find(s => {
|
|
59
|
+
// Sesión de las últimas 4 horas
|
|
60
|
+
const lastActivity = new Date(s.lastActivityAt);
|
|
61
|
+
const fourHoursAgo = new Date(Date.now() - 4 * 60 * 60 * 1000);
|
|
62
|
+
return lastActivity > fourHoursAgo;
|
|
63
|
+
});
|
|
64
|
+
if (!activeSession) {
|
|
65
|
+
// No hay sesión activa, advertir pero permitir
|
|
66
|
+
return {
|
|
67
|
+
proceed: true,
|
|
68
|
+
warning: `⚠️ No hay sesión de trabajo activa.
|
|
69
|
+
|
|
70
|
+
Para tracking completo, inicia una sesión:
|
|
71
|
+
\`\`\`
|
|
72
|
+
Tarea: [descripción]
|
|
73
|
+
Plan:
|
|
74
|
+
1. [paso 1]
|
|
75
|
+
2. [paso 2]
|
|
76
|
+
\`\`\`
|
|
77
|
+
|
|
78
|
+
Continuando sin tracking...`
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Verificar si hay tarea activa
|
|
82
|
+
const activeTasks = await cloud.turso.getActiveTasks(system);
|
|
83
|
+
if (activeTasks.length === 0 && tool !== 'Task') {
|
|
84
|
+
// No hay tarea activa, advertir pero permitir
|
|
85
|
+
return {
|
|
86
|
+
proceed: true,
|
|
87
|
+
warning: `⚠️ No hay tarea registrada.
|
|
88
|
+
|
|
89
|
+
Registra la tarea antes de continuar:
|
|
90
|
+
\`\`\`
|
|
91
|
+
Tarea: [qué estás haciendo]
|
|
92
|
+
Plan:
|
|
93
|
+
1. [paso 1]
|
|
94
|
+
2. [paso 2]
|
|
95
|
+
\`\`\`
|
|
96
|
+
|
|
97
|
+
Esto permite continuidad si se cierra la sesión.`
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Hay sesión y tarea, actualizar actividad
|
|
101
|
+
if (activeSession.activeTaskId) {
|
|
102
|
+
const filePath = params.file_path;
|
|
103
|
+
if (filePath && (tool === 'Edit' || tool === 'Write')) {
|
|
104
|
+
// Actualizar archivos modificados en la tarea
|
|
105
|
+
const task = await cloud.turso.getItem(activeSession.activeTaskId);
|
|
106
|
+
if (task) {
|
|
107
|
+
const content = task.content;
|
|
108
|
+
const files = content.files || [];
|
|
109
|
+
if (!files.includes(filePath)) {
|
|
110
|
+
await cloud.updateProgress(activeSession.activeTaskId, {
|
|
111
|
+
files: [...files, filePath]
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Actualizar actividad de sesión
|
|
118
|
+
await upstash.updateSessionActivity(activeSession.sessionId);
|
|
119
|
+
return { proceed: true };
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
// Si falla la conexión, continuar sin tracking
|
|
123
|
+
console.error('[cloud-pre-tool-use] Error:', error);
|
|
124
|
+
return { proceed: true };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// =============================================================================
|
|
128
|
+
// CLI Entry Point
|
|
129
|
+
// =============================================================================
|
|
130
|
+
if (process.argv[1]?.includes('cloud-pre-tool-use')) {
|
|
131
|
+
// Leer evento desde stdin o args
|
|
132
|
+
const tool = process.argv[2] || 'Unknown';
|
|
133
|
+
const cwd = process.cwd();
|
|
134
|
+
onPreToolUse({ tool, params: {}, cwd })
|
|
135
|
+
.then(result => {
|
|
136
|
+
if (result.warning) {
|
|
137
|
+
console.log(result.warning);
|
|
138
|
+
}
|
|
139
|
+
if (!result.proceed) {
|
|
140
|
+
console.log(result.message);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
.catch(error => {
|
|
145
|
+
console.error('Error:', error.message);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
export default onPreToolUse;
|
|
149
|
+
//# sourceMappingURL=cloud-pre-tool-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-pre-tool-use.js","sourceRoot":"","sources":["../../src/hooks/cloud-pre-tool-use.ts"],"names":[],"mappings":"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"}
|