cmp-standards 2.0.1 → 2.6.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 -541
- 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/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/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/eslint/rules/no-async-useeffect.js +6 -6
- 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 +32 -0
- package/dist/hooks/cloud-session-start.d.ts.map +1 -0
- package/dist/hooks/cloud-session-start.js +257 -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 +2 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +111 -77
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +225 -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 +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/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.d.ts.map +1 -1
- package/dist/services/ProjectScaffold.js +109 -81
- 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/context-injector.d.ts +105 -0
- package/dist/services/context-injector.d.ts.map +1 -0
- package/dist/services/context-injector.js +357 -0
- package/dist/services/context-injector.js.map +1 -0
- 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/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-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/services/memory-router.d.ts +98 -0
- package/dist/services/memory-router.d.ts.map +1 -0
- package/dist/services/memory-router.js +373 -0
- package/dist/services/memory-router.js.map +1 -0
- package/dist/services/pattern-tracker.d.ts +93 -0
- package/dist/services/pattern-tracker.d.ts.map +1 -0
- package/dist/services/pattern-tracker.js +347 -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/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 +100 -94
- 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/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 -0
- 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 -82
- package/templates/memory-config.schema.json +212 -212
- package/templates/settings.json +58 -58
- package/templates/skills/continue.md +205 -0
- 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,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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"}
|
|
@@ -14,12 +14,12 @@ const rule = {
|
|
|
14
14
|
},
|
|
15
15
|
messages: {
|
|
16
16
|
noAsyncUseEffect: 'useEffect callback cannot be async. Create an inner async function and call it.',
|
|
17
|
-
suggestion: `
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
const fetchData = async () => {
|
|
20
|
-
// your async code
|
|
21
|
-
};
|
|
22
|
-
fetchData();
|
|
17
|
+
suggestion: `
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const fetchData = async () => {
|
|
20
|
+
// your async code
|
|
21
|
+
};
|
|
22
|
+
fetchData();
|
|
23
23
|
}, []);`,
|
|
24
24
|
},
|
|
25
25
|
schema: [],
|
|
@@ -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"}
|