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.
Files changed (110) hide show
  1. package/README.md +171 -101
  2. package/dist/cli/index.js +239 -7
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/dashboard/server.d.ts.map +1 -1
  5. package/dist/dashboard/server.js +203 -39
  6. package/dist/dashboard/server.js.map +1 -1
  7. package/dist/db/cloud.d.ts +174 -0
  8. package/dist/db/cloud.d.ts.map +1 -0
  9. package/dist/db/cloud.js +241 -0
  10. package/dist/db/cloud.js.map +1 -0
  11. package/dist/db/errors.d.ts +76 -0
  12. package/dist/db/errors.d.ts.map +1 -0
  13. package/dist/db/errors.js +135 -0
  14. package/dist/db/errors.js.map +1 -0
  15. package/dist/db/turso-client.d.ts +178 -0
  16. package/dist/db/turso-client.d.ts.map +1 -0
  17. package/dist/db/turso-client.js +455 -0
  18. package/dist/db/turso-client.js.map +1 -0
  19. package/dist/db/upstash-client.d.ts +161 -0
  20. package/dist/db/upstash-client.d.ts.map +1 -0
  21. package/dist/db/upstash-client.js +325 -0
  22. package/dist/db/upstash-client.js.map +1 -0
  23. package/dist/hooks/cloud-post-tool-use.d.ts +30 -0
  24. package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -0
  25. package/dist/hooks/cloud-post-tool-use.js +116 -0
  26. package/dist/hooks/cloud-post-tool-use.js.map +1 -0
  27. package/dist/hooks/cloud-pre-tool-use.d.ts +19 -0
  28. package/dist/hooks/cloud-pre-tool-use.d.ts.map +1 -0
  29. package/dist/hooks/cloud-pre-tool-use.js +149 -0
  30. package/dist/hooks/cloud-pre-tool-use.js.map +1 -0
  31. package/dist/hooks/cloud-session-start.d.ts +20 -0
  32. package/dist/hooks/cloud-session-start.d.ts.map +1 -0
  33. package/dist/hooks/cloud-session-start.js +130 -0
  34. package/dist/hooks/cloud-session-start.js.map +1 -0
  35. package/dist/hooks/index.d.ts +3 -0
  36. package/dist/hooks/index.d.ts.map +1 -1
  37. package/dist/hooks/index.js +5 -0
  38. package/dist/hooks/index.js.map +1 -1
  39. package/dist/hooks/memory-checkpoint.d.ts.map +1 -1
  40. package/dist/hooks/memory-checkpoint.js +12 -20
  41. package/dist/hooks/memory-checkpoint.js.map +1 -1
  42. package/dist/hooks/pre-tool-use.d.ts +2 -8
  43. package/dist/hooks/pre-tool-use.d.ts.map +1 -1
  44. package/dist/hooks/pre-tool-use.js +7 -106
  45. package/dist/hooks/pre-tool-use.js.map +1 -1
  46. package/dist/hooks/session-start.d.ts.map +1 -1
  47. package/dist/hooks/session-start.js +15 -6
  48. package/dist/hooks/session-start.js.map +1 -1
  49. package/dist/index.d.ts +10 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +14 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/mcp/server.d.ts.map +1 -1
  54. package/dist/mcp/server.js +223 -0
  55. package/dist/mcp/server.js.map +1 -1
  56. package/dist/schema/tracking.d.ts +644 -0
  57. package/dist/schema/tracking.d.ts.map +1 -0
  58. package/dist/schema/tracking.js +204 -0
  59. package/dist/schema/tracking.js.map +1 -0
  60. package/dist/services/ProjectScaffold.d.ts.map +1 -1
  61. package/dist/services/ProjectScaffold.js +33 -5
  62. package/dist/services/ProjectScaffold.js.map +1 -1
  63. package/dist/services/TaskTracker.d.ts +1 -1
  64. package/dist/services/TaskTracker.d.ts.map +1 -1
  65. package/dist/services/TaskTracker.js +4 -8
  66. package/dist/services/TaskTracker.js.map +1 -1
  67. package/dist/services/WorkPlanManager.d.ts +1 -1
  68. package/dist/services/WorkPlanManager.d.ts.map +1 -1
  69. package/dist/services/WorkPlanManager.js +8 -14
  70. package/dist/services/WorkPlanManager.js.map +1 -1
  71. package/dist/services/auto-inject.d.ts +1 -0
  72. package/dist/services/auto-inject.d.ts.map +1 -1
  73. package/dist/services/auto-inject.js +12 -17
  74. package/dist/services/auto-inject.js.map +1 -1
  75. package/dist/services/cross-project-sync.d.ts +2 -0
  76. package/dist/services/cross-project-sync.d.ts.map +1 -1
  77. package/dist/services/cross-project-sync.js +26 -21
  78. package/dist/services/cross-project-sync.js.map +1 -1
  79. package/dist/services/memory-consolidation.d.ts.map +1 -1
  80. package/dist/services/memory-consolidation.js +30 -27
  81. package/dist/services/memory-consolidation.js.map +1 -1
  82. package/dist/utils/env-loader.d.ts +41 -0
  83. package/dist/utils/env-loader.d.ts.map +1 -0
  84. package/dist/utils/env-loader.js +78 -0
  85. package/dist/utils/env-loader.js.map +1 -0
  86. package/dist/utils/git.d.ts +52 -0
  87. package/dist/utils/git.d.ts.map +1 -0
  88. package/dist/utils/git.js +267 -0
  89. package/dist/utils/git.js.map +1 -0
  90. package/dist/utils/paths.d.ts +39 -5
  91. package/dist/utils/paths.d.ts.map +1 -1
  92. package/dist/utils/paths.js +88 -7
  93. package/dist/utils/paths.js.map +1 -1
  94. package/package.json +8 -2
  95. package/standards/README.md +50 -0
  96. package/standards/experts/expert-routing.md +215 -0
  97. package/standards/general/code-quality.md +86 -0
  98. package/standards/general/memory-usage.md +205 -0
  99. package/standards/general/sync-workflow.md +235 -0
  100. package/standards/general/workflow.md +82 -0
  101. package/standards/hooks/mandatory-tracking.md +446 -0
  102. package/standards/infrastructure/cloud-database.md +287 -0
  103. package/standards/mcp/server-design.md +243 -0
  104. package/standards/mcp/tool-patterns.md +354 -0
  105. package/standards/skills/skill-structure.md +286 -0
  106. package/standards/skills/workflow-design.md +323 -0
  107. package/standards/tools/tool-design.md +297 -0
  108. package/templates/claude-settings.json +72 -0
  109. package/templates/memory-config.json +2 -28
  110. 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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"}