wegho-agentes 7.0.0 → 7.0.1
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/.agent/skills/wegho-global-rules/SKILL.md +20 -0
- package/.agent/workflows/PROMPT_GUIDE.md +7 -4
- package/.agents/cli.ts +29 -21
- package/.agents/core/base-agent.ts +28 -12
- package/.agents/core/memory-system.ts +45 -13
- package/.agents/core/report-generator.ts +26 -19
- package/.agents/orchestrator.ts +104 -74
- package/.clinerules +318 -1229
- package/.cursorrules +0 -189
- package/README.md +3 -3
- package/docs/VERSION.md +3 -2
- package/package.json +3 -3
- package/.agents/agents/ai-agents/README.md +0 -175
- package/.agents/agents/ai-agents/agent.ts +0 -83
- package/.agents/agents/ai-agents/specialty.md +0 -14
- package/.agents/agents/architecture/README.md +0 -61
- package/.agents/agents/architecture/agent.ts +0 -238
- package/.agents/agents/architecture/memory.md +0 -111
- package/.agents/agents/architecture/specialty.md +0 -31
- package/.agents/agents/automation/README.md +0 -60
- package/.agents/agents/automation/agent.ts +0 -61
- package/.agents/agents/automation/specialty.md +0 -14
- package/.agents/agents/backend/README.md +0 -155
- package/.agents/agents/backend/agent.ts +0 -100
- package/.agents/agents/backend/specialty.md +0 -14
- package/.agents/agents/cloud/README.md +0 -73
- package/.agents/agents/cloud/agent.ts +0 -53
- package/.agents/agents/cloud/specialty.md +0 -14
- package/.agents/agents/code-auditor/README.md +0 -37
- package/.agents/agents/code-auditor/agent.ts +0 -334
- package/.agents/agents/code-auditor/specialty.md +0 -14
- package/.agents/agents/cro/README.md +0 -200
- package/.agents/agents/cro/agent.ts +0 -61
- package/.agents/agents/cro/specialty.md +0 -14
- package/.agents/agents/database/README.md +0 -67
- package/.agents/agents/database/agent.ts +0 -93
- package/.agents/agents/database/specialty.md +0 -14
- package/.agents/agents/devops/README.md +0 -84
- package/.agents/agents/devops/agent.ts +0 -54
- package/.agents/agents/devops/specialty.md +0 -14
- package/.agents/agents/documentation/README.md +0 -107
- package/.agents/agents/documentation/agent.ts +0 -253
- package/.agents/agents/documentation/memory.md +0 -56
- package/.agents/agents/documentation/specialty.md +0 -33
- package/.agents/agents/frontend/README.md +0 -188
- package/.agents/agents/frontend/agent.ts +0 -211
- package/.agents/agents/frontend/memory.md +0 -139
- package/.agents/agents/frontend/specialty.md +0 -30
- package/.agents/agents/inventory/README.md +0 -35
- package/.agents/agents/inventory/agent.ts +0 -758
- package/.agents/agents/inventory/memory.md +0 -50
- package/.agents/agents/inventory/specialty.md +0 -129
- package/.agents/agents/nextjs/README.md +0 -58
- package/.agents/agents/nextjs/agent.ts +0 -114
- package/.agents/agents/nextjs/specialty.md +0 -14
- package/.agents/agents/pentest/README.md +0 -228
- package/.agents/agents/pentest/agent.ts +0 -96
- package/.agents/agents/pentest/specialty.md +0 -14
- package/.agents/agents/planning/README.md +0 -107
- package/.agents/agents/planning/agent.ts +0 -389
- package/.agents/agents/planning/specialty.md +0 -14
- package/.agents/agents/project-discovery/README.md +0 -35
- package/.agents/agents/project-discovery/agent.ts +0 -344
- package/.agents/agents/project-discovery/specialty.md +0 -14
- package/.agents/agents/quality/README.md +0 -81
- package/.agents/agents/quality/agent.ts +0 -269
- package/.agents/agents/quality/memory.md +0 -110
- package/.agents/agents/quality/specialty.md +0 -31
- package/.agents/agents/rag/README.md +0 -41
- package/.agents/agents/rag/agent.ts +0 -85
- package/.agents/agents/rag/specialty.md +0 -14
- package/.agents/agents/security/README.md +0 -152
- package/.agents/agents/security/agent.ts +0 -218
- package/.agents/agents/security/memory.md +0 -91
- package/.agents/agents/security/specialty.md +0 -31
- package/.agents/agents/task-analyzer/README.md +0 -36
- package/.agents/agents/task-analyzer/agent.ts +0 -462
- package/.agents/agents/task-analyzer/specialty.md +0 -14
- package/.agents/agents/testing/README.md +0 -161
- package/.agents/agents/testing/agent.ts +0 -61
- package/.agents/agents/testing/specialty.md +0 -14
- package/.agents/agents/uiux/README.md +0 -68
- package/.agents/agents/uiux/agent.ts +0 -95
- package/.agents/agents/uiux/specialty.md +0 -14
- package/.agents/base/base-agent.ts +0 -331
- package/.agents/base/memory-system.ts +0 -397
- package/.agents/base/skill-manager.ts +0 -95
- package/.agents/convert-memory.ps1 +0 -153
- package/.agents/examples/reporting-example.md +0 -203
- package/.agents/managers/build-manager.ts +0 -304
- package/.agents/managers/cache-manager.ts +0 -184
- package/.agents/managers/checkpoint-manager.ts +0 -299
- package/.agents/migrate-agents.ps1 +0 -117
- package/.agents/templates/change-report.md +0 -55
- package/.agents/templates/execution-plan.md +0 -36
- package/.agents/unmapped-skills.txt +0 -0
- package/.agents/utils/agent-migrator.ts +0 -360
- package/.agents/utils/agent-monitor.ts +0 -102
- package/.agents/utils/agent-parallelizer.ts +0 -108
- package/.agents/utils/context-monitor.ts +0 -140
- package/.agents/utils/feedback-collector.ts +0 -207
- package/.agents/utils/file-generator.ts +0 -304
- package/.agents/utils/memory-converter.ts +0 -217
- package/.agents/utils/memory-dashboard.ts +0 -147
- package/.agents/utils/performance-tracker.ts +0 -275
- package/.agents/utils/report-generator.ts +0 -193
- package/.agents/utils/retry-utility.ts +0 -140
- package/.agents/utils/workflow-validator.ts +0 -158
|
@@ -1,397 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory System - Sistema de Memória para Agentes
|
|
3
|
-
*
|
|
4
|
-
* Responsabilidades:
|
|
5
|
-
* - Gerenciar memória persistente de cada agente
|
|
6
|
-
* - Registrar sucessos e falhas
|
|
7
|
-
* - Armazenar aprendizados
|
|
8
|
-
* - Buscar casos similares
|
|
9
|
-
* - Fornecer recomendações baseadas em histórico
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import * as fs from 'fs';
|
|
13
|
-
import * as path from 'path';
|
|
14
|
-
import { CacheManager } from './cache-manager.js';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Entrada individual de memória
|
|
18
|
-
*/
|
|
19
|
-
export interface MemoryEntry {
|
|
20
|
-
id: string;
|
|
21
|
-
timestamp: Date;
|
|
22
|
-
taskDescription: string;
|
|
23
|
-
context: {
|
|
24
|
-
files: string[];
|
|
25
|
-
areas: string[];
|
|
26
|
-
complexity: 'low' | 'medium' | 'high';
|
|
27
|
-
};
|
|
28
|
-
result: 'success' | 'failure';
|
|
29
|
-
details: string;
|
|
30
|
-
userFeedback?: {
|
|
31
|
-
satisfied: boolean;
|
|
32
|
-
likes: string[];
|
|
33
|
-
dislikes: string[];
|
|
34
|
-
suggestions: string[];
|
|
35
|
-
};
|
|
36
|
-
metadata?: Record<string, any>;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Padrão aprendido
|
|
41
|
-
*/
|
|
42
|
-
export interface Learning {
|
|
43
|
-
id: string;
|
|
44
|
-
pattern: string;
|
|
45
|
-
description: string;
|
|
46
|
-
recommendation: string;
|
|
47
|
-
confidence: number; // 0-1
|
|
48
|
-
occurrences: number;
|
|
49
|
-
lastSeen: Date;
|
|
50
|
-
examples: string[]; // IDs de MemoryEntry
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Estrutura de memória de um agente
|
|
55
|
-
*/
|
|
56
|
-
export interface AgentMemory {
|
|
57
|
-
agentName: string;
|
|
58
|
-
successes: MemoryEntry[];
|
|
59
|
-
failures: MemoryEntry[];
|
|
60
|
-
learnings: Learning[];
|
|
61
|
-
stats: {
|
|
62
|
-
totalTasks: number;
|
|
63
|
-
successRate: number;
|
|
64
|
-
lastUpdated: Date;
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Sistema de Memória
|
|
70
|
-
*/
|
|
71
|
-
export class MemorySystem {
|
|
72
|
-
private memoryBasePath: string;
|
|
73
|
-
private maxEntries: number;
|
|
74
|
-
private cache: CacheManager;
|
|
75
|
-
|
|
76
|
-
constructor(memoryBasePath: string = '.agents/memory', maxEntries: number = 1000) {
|
|
77
|
-
this.memoryBasePath = memoryBasePath;
|
|
78
|
-
this.maxEntries = maxEntries;
|
|
79
|
-
this.cache = new CacheManager(300000, 500); // 5 min TTL, max 500 entries
|
|
80
|
-
this.ensureMemoryStructure();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Garante que a estrutura de pastas existe
|
|
85
|
-
*/
|
|
86
|
-
private ensureMemoryStructure(): void {
|
|
87
|
-
if (!fs.existsSync(this.memoryBasePath)) {
|
|
88
|
-
fs.mkdirSync(this.memoryBasePath, { recursive: true });
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Garante que a pasta do agente existe
|
|
94
|
-
*/
|
|
95
|
-
private ensureAgentFolder(agentName: string): string {
|
|
96
|
-
const agentPath = path.join(this.memoryBasePath, agentName);
|
|
97
|
-
if (!fs.existsSync(agentPath)) {
|
|
98
|
-
fs.mkdirSync(agentPath, { recursive: true });
|
|
99
|
-
}
|
|
100
|
-
return agentPath;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Carrega memória de um agente
|
|
105
|
-
*/
|
|
106
|
-
loadMemory(agentName: string): AgentMemory {
|
|
107
|
-
const agentPath = this.ensureAgentFolder(agentName);
|
|
108
|
-
|
|
109
|
-
const successesPath = path.join(agentPath, 'successes.json');
|
|
110
|
-
const failuresPath = path.join(agentPath, 'failures.json');
|
|
111
|
-
const learningsPath = path.join(agentPath, 'learnings.json');
|
|
112
|
-
|
|
113
|
-
const successes = this.loadJsonFile<MemoryEntry[]>(successesPath, []);
|
|
114
|
-
const failures = this.loadJsonFile<MemoryEntry[]>(failuresPath, []);
|
|
115
|
-
const learnings = this.loadJsonFile<Learning[]>(learningsPath, []);
|
|
116
|
-
|
|
117
|
-
const totalTasks = successes.length + failures.length;
|
|
118
|
-
const successRate = totalTasks > 0 ? successes.length / totalTasks : 0;
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
agentName,
|
|
122
|
-
successes,
|
|
123
|
-
failures,
|
|
124
|
-
learnings,
|
|
125
|
-
stats: {
|
|
126
|
-
totalTasks,
|
|
127
|
-
successRate,
|
|
128
|
-
lastUpdated: new Date(),
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Salva memória de um agente
|
|
135
|
-
*/
|
|
136
|
-
saveMemory(memory: AgentMemory): void {
|
|
137
|
-
const agentPath = this.ensureAgentFolder(memory.agentName);
|
|
138
|
-
|
|
139
|
-
// Limitar número de entradas
|
|
140
|
-
const successes = this.limitEntries(memory.successes);
|
|
141
|
-
const failures = this.limitEntries(memory.failures);
|
|
142
|
-
|
|
143
|
-
this.saveJsonFile(path.join(agentPath, 'successes.json'), successes);
|
|
144
|
-
this.saveJsonFile(path.join(agentPath, 'failures.json'), failures);
|
|
145
|
-
this.saveJsonFile(path.join(agentPath, 'learnings.json'), memory.learnings);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Registra um sucesso
|
|
150
|
-
*/
|
|
151
|
-
recordSuccess(
|
|
152
|
-
agentName: string,
|
|
153
|
-
taskDescription: string,
|
|
154
|
-
context: MemoryEntry['context'],
|
|
155
|
-
details: string,
|
|
156
|
-
userFeedback?: MemoryEntry['userFeedback']
|
|
157
|
-
): void {
|
|
158
|
-
const memory = this.loadMemory(agentName);
|
|
159
|
-
|
|
160
|
-
const entry: MemoryEntry = {
|
|
161
|
-
id: this.generateId(),
|
|
162
|
-
timestamp: new Date(),
|
|
163
|
-
taskDescription,
|
|
164
|
-
context,
|
|
165
|
-
result: 'success',
|
|
166
|
-
details,
|
|
167
|
-
userFeedback,
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
memory.successes.push(entry);
|
|
171
|
-
this.saveMemory(memory);
|
|
172
|
-
|
|
173
|
-
console.log(`✅ [${agentName}] Sucesso registrado: ${taskDescription}`);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Registra uma falha
|
|
178
|
-
*/
|
|
179
|
-
recordFailure(
|
|
180
|
-
agentName: string,
|
|
181
|
-
taskDescription: string,
|
|
182
|
-
context: MemoryEntry['context'],
|
|
183
|
-
details: string,
|
|
184
|
-
userFeedback?: MemoryEntry['userFeedback']
|
|
185
|
-
): void {
|
|
186
|
-
const memory = this.loadMemory(agentName);
|
|
187
|
-
|
|
188
|
-
const entry: MemoryEntry = {
|
|
189
|
-
id: this.generateId(),
|
|
190
|
-
timestamp: new Date(),
|
|
191
|
-
taskDescription,
|
|
192
|
-
context,
|
|
193
|
-
result: 'failure',
|
|
194
|
-
details,
|
|
195
|
-
userFeedback,
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
memory.failures.push(entry);
|
|
199
|
-
this.saveMemory(memory);
|
|
200
|
-
|
|
201
|
-
console.log(`❌ [${agentName}] Falha registrada: ${taskDescription}`);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Adiciona um aprendizado
|
|
206
|
-
*/
|
|
207
|
-
addLearning(
|
|
208
|
-
agentName: string,
|
|
209
|
-
pattern: string,
|
|
210
|
-
description: string,
|
|
211
|
-
recommendation: string,
|
|
212
|
-
exampleIds: string[] = []
|
|
213
|
-
): void {
|
|
214
|
-
const memory = this.loadMemory(agentName);
|
|
215
|
-
|
|
216
|
-
// Verificar se já existe
|
|
217
|
-
const existing = memory.learnings.find(l => l.pattern === pattern);
|
|
218
|
-
|
|
219
|
-
if (existing) {
|
|
220
|
-
existing.occurrences++;
|
|
221
|
-
existing.lastSeen = new Date();
|
|
222
|
-
existing.confidence = Math.min(1, existing.confidence + 0.1);
|
|
223
|
-
existing.examples.push(...exampleIds);
|
|
224
|
-
} else {
|
|
225
|
-
const learning: Learning = {
|
|
226
|
-
id: this.generateId(),
|
|
227
|
-
pattern,
|
|
228
|
-
description,
|
|
229
|
-
recommendation,
|
|
230
|
-
confidence: 0.5,
|
|
231
|
-
occurrences: 1,
|
|
232
|
-
lastSeen: new Date(),
|
|
233
|
-
examples: exampleIds,
|
|
234
|
-
};
|
|
235
|
-
memory.learnings.push(learning);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
this.saveMemory(memory);
|
|
239
|
-
console.log(`🧠 [${agentName}] Aprendizado adicionado: ${pattern}`);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Busca casos similares
|
|
244
|
-
*/
|
|
245
|
-
getSimilarCases(
|
|
246
|
-
agentName: string,
|
|
247
|
-
taskDescription: string,
|
|
248
|
-
limit: number = 5
|
|
249
|
-
): MemoryEntry[] {
|
|
250
|
-
// Verificar cache primeiro
|
|
251
|
-
const cacheKey = `similar:${agentName}:${taskDescription}:${limit}`;
|
|
252
|
-
const cached = this.cache.get<MemoryEntry[]>(cacheKey);
|
|
253
|
-
|
|
254
|
-
if (cached) {
|
|
255
|
-
return cached;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Cache miss - buscar do disco
|
|
259
|
-
const memory = this.loadMemory(agentName);
|
|
260
|
-
const allEntries = [...memory.successes, ...memory.failures];
|
|
261
|
-
|
|
262
|
-
// Busca simples por palavras-chave
|
|
263
|
-
const keywords = this.extractKeywords(taskDescription);
|
|
264
|
-
|
|
265
|
-
const scored = allEntries.map(entry => {
|
|
266
|
-
const entryKeywords = this.extractKeywords(entry.taskDescription);
|
|
267
|
-
const score = this.calculateSimilarity(keywords, entryKeywords);
|
|
268
|
-
return { entry, score };
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
const results = scored
|
|
272
|
-
.sort((a, b) => b.score - a.score)
|
|
273
|
-
.slice(0, limit)
|
|
274
|
-
.filter(s => s.score > 0.3)
|
|
275
|
-
.map(s => s.entry);
|
|
276
|
-
|
|
277
|
-
// Cachear resultado
|
|
278
|
-
this.cache.set(cacheKey, results, 60000); // 1 minuto TTL
|
|
279
|
-
|
|
280
|
-
return results;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Obtém recomendações baseadas em aprendizados
|
|
285
|
-
*/
|
|
286
|
-
getRecommendations(agentName: string, taskDescription: string): string[] {
|
|
287
|
-
// Verificar cache primeiro
|
|
288
|
-
const cacheKey = `recommendations:${agentName}:${taskDescription}`;
|
|
289
|
-
const cached = this.cache.get<string[]>(cacheKey);
|
|
290
|
-
|
|
291
|
-
if (cached) {
|
|
292
|
-
return cached;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
// Cache miss - buscar do disco
|
|
296
|
-
const memory = this.loadMemory(agentName);
|
|
297
|
-
const keywords = this.extractKeywords(taskDescription);
|
|
298
|
-
|
|
299
|
-
const results = memory.learnings
|
|
300
|
-
.filter(learning => {
|
|
301
|
-
const patternKeywords = this.extractKeywords(learning.pattern);
|
|
302
|
-
const similarity = this.calculateSimilarity(keywords, patternKeywords);
|
|
303
|
-
return similarity > 0.3 && learning.confidence > 0.5;
|
|
304
|
-
})
|
|
305
|
-
.sort((a, b) => b.confidence - a.confidence)
|
|
306
|
-
.map(l => l.recommendation);
|
|
307
|
-
|
|
308
|
-
// Cachear resultado
|
|
309
|
-
this.cache.set(cacheKey, results, 120000); // 2 minutos TTL
|
|
310
|
-
|
|
311
|
-
return results;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Obtém estatísticas do cache
|
|
316
|
-
*/
|
|
317
|
-
getCacheStats() {
|
|
318
|
-
return this.cache.getStats();
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Limpa o cache
|
|
323
|
-
*/
|
|
324
|
-
clearCache(): void {
|
|
325
|
-
this.cache.clear();
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Obtém estatísticas de um agente
|
|
330
|
-
*/
|
|
331
|
-
getStats(agentName: string): AgentMemory['stats'] {
|
|
332
|
-
const memory = this.loadMemory(agentName);
|
|
333
|
-
return memory.stats;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// ==================== Métodos Auxiliares ====================
|
|
337
|
-
|
|
338
|
-
private loadJsonFile<T>(filePath: string, defaultValue: T): T {
|
|
339
|
-
try {
|
|
340
|
-
if (fs.existsSync(filePath)) {
|
|
341
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
342
|
-
const data = JSON.parse(content);
|
|
343
|
-
|
|
344
|
-
// Robustez: se o arquivo JSON estiver envolto em um objeto (ex: { "successes": [] })
|
|
345
|
-
// extraímos o array diretamente
|
|
346
|
-
const fileName = path.basename(filePath, '.json');
|
|
347
|
-
if (data && typeof data === 'object' && !Array.isArray(data) && data[fileName]) {
|
|
348
|
-
return data[fileName] as T;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
return data;
|
|
352
|
-
}
|
|
353
|
-
} catch (error) {
|
|
354
|
-
console.warn(`Erro ao carregar ${filePath}:`, error);
|
|
355
|
-
}
|
|
356
|
-
return defaultValue;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
private saveJsonFile(filePath: string, data: any): void {
|
|
360
|
-
try {
|
|
361
|
-
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
362
|
-
} catch (error) {
|
|
363
|
-
console.error(`Erro ao salvar ${filePath}:`, error);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
private limitEntries<T extends MemoryEntry>(entries: T[]): T[] {
|
|
368
|
-
if (entries.length <= this.maxEntries) {
|
|
369
|
-
return entries;
|
|
370
|
-
}
|
|
371
|
-
// Manter as mais recentes
|
|
372
|
-
return entries
|
|
373
|
-
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())
|
|
374
|
-
.slice(0, this.maxEntries);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
private generateId(): string {
|
|
378
|
-
return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
private extractKeywords(text: string): string[] {
|
|
382
|
-
return text
|
|
383
|
-
.toLowerCase()
|
|
384
|
-
.replace(/[^\w\s]/g, ' ')
|
|
385
|
-
.split(/\s+/)
|
|
386
|
-
.filter(word => word.length > 3);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
private calculateSimilarity(keywords1: string[], keywords2: string[]): number {
|
|
390
|
-
const set1 = new Set(keywords1);
|
|
391
|
-
const set2 = new Set(keywords2);
|
|
392
|
-
const intersection = new Set([...set1].filter(k => set2.has(k)));
|
|
393
|
-
const union = new Set([...set1, ...set2]);
|
|
394
|
-
|
|
395
|
-
return union.size > 0 ? intersection.size / union.size : 0;
|
|
396
|
-
}
|
|
397
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
|
|
4
|
-
export interface SkillMetadata {
|
|
5
|
-
name: string;
|
|
6
|
-
description: string;
|
|
7
|
-
path: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface Skill {
|
|
11
|
-
metadata: SkillMetadata;
|
|
12
|
-
instructions: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class SkillManager {
|
|
16
|
-
private skillsPath: string;
|
|
17
|
-
|
|
18
|
-
constructor(skillsPath: string = 'skills') {
|
|
19
|
-
this.skillsPath = path.resolve(process.cwd(), skillsPath);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Scans the skills directory for available skills
|
|
24
|
-
*/
|
|
25
|
-
async listAvailableSkills(): Promise<SkillMetadata[]> {
|
|
26
|
-
if (!fs.existsSync(this.skillsPath)) return [];
|
|
27
|
-
|
|
28
|
-
const skills: SkillMetadata[] = [];
|
|
29
|
-
const directories = fs.readdirSync(this.skillsPath, { withFileTypes: true })
|
|
30
|
-
.filter(dirent => dirent.isDirectory());
|
|
31
|
-
|
|
32
|
-
for (const dir of directories) {
|
|
33
|
-
const skillMdPath = path.join(this.skillsPath, dir.name, 'SKILL.md');
|
|
34
|
-
if (fs.existsSync(skillMdPath)) {
|
|
35
|
-
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
36
|
-
const metadata = this.parseMetadata(content, path.join(this.skillsPath, dir.name));
|
|
37
|
-
if (metadata) {
|
|
38
|
-
skills.push(metadata);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return skills;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Finds skills relevant to a task description
|
|
48
|
-
*/
|
|
49
|
-
async getRelevantSkills(taskDescription: string): Promise<Skill[]> {
|
|
50
|
-
const availableSkills = await this.listAvailableSkills();
|
|
51
|
-
const relevantSkills: Skill[] = [];
|
|
52
|
-
const taskLower = taskDescription.toLowerCase();
|
|
53
|
-
|
|
54
|
-
for (const meta of availableSkills) {
|
|
55
|
-
// Simple keyword matching for now
|
|
56
|
-
// Future improvement: use embeddings/LLM for matching
|
|
57
|
-
const keywords = meta.description.toLowerCase().split(/\W+/);
|
|
58
|
-
const matches = keywords.some(kw => kw.length > 3 && taskLower.includes(kw));
|
|
59
|
-
|
|
60
|
-
if (matches) {
|
|
61
|
-
relevantSkills.push(this.loadSkill(meta));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return relevantSkills;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
private loadSkill(metadata: SkillMetadata): Skill {
|
|
69
|
-
const skillMdPath = path.join(metadata.path, 'SKILL.md');
|
|
70
|
-
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
71
|
-
|
|
72
|
-
// Remove yaml frontmatter
|
|
73
|
-
const instructions = content.replace(/^---[\s\S]*?---/, '').trim();
|
|
74
|
-
|
|
75
|
-
return {
|
|
76
|
-
metadata,
|
|
77
|
-
instructions
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
private parseMetadata(content: string, fullPath: string): SkillMetadata | null {
|
|
82
|
-
const match = content.match(/^---([\s\S]*?)---/);
|
|
83
|
-
if (!match) return null;
|
|
84
|
-
|
|
85
|
-
const yaml = match[1];
|
|
86
|
-
const name = yaml.match(/name:\s*(.+)/)?.[1]?.trim();
|
|
87
|
-
const description = yaml.match(/description:\s*(.+)/)?.[1]?.trim();
|
|
88
|
-
|
|
89
|
-
if (name && description) {
|
|
90
|
-
return { name, description, path: fullPath };
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
# PowerShell Script para Converter Memória JSON → MD
|
|
2
|
-
|
|
3
|
-
Write-Host "`n🔄 Convertendo memória de JSON para Markdown...`n" -ForegroundColor Cyan
|
|
4
|
-
|
|
5
|
-
$memoryDir = ".agents\memory"
|
|
6
|
-
$agentsDir = ".agents\agents"
|
|
7
|
-
|
|
8
|
-
# Obter todas as pastas de memória
|
|
9
|
-
$agentMemories = Get-ChildItem $memoryDir -Directory
|
|
10
|
-
|
|
11
|
-
foreach ($agentMem in $agentMemories) {
|
|
12
|
-
$agentName = $agentMem.Name -replace "-agent$", ""
|
|
13
|
-
$targetDir = "$agentsDir\$agentName"
|
|
14
|
-
|
|
15
|
-
if (!(Test-Path $targetDir)) {
|
|
16
|
-
Write-Host "⚠️ Pasta não encontrada: $targetDir" -ForegroundColor Yellow
|
|
17
|
-
continue
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
# Ler JSONs
|
|
21
|
-
$successesPath = "$($agentMem.FullName)\successes.json"
|
|
22
|
-
$failuresPath = "$($agentMem.FullName)\failures.json"
|
|
23
|
-
$learningsPath = "$($agentMem.FullName)\learnings.json"
|
|
24
|
-
|
|
25
|
-
$successes = if (Test-Path $successesPath) { Get-Content $successesPath -Raw | ConvertFrom-Json } else { @() }
|
|
26
|
-
$failures = if (Test-Path $failuresPath) { Get-Content $failuresPath -Raw | ConvertFrom-Json } else { @() }
|
|
27
|
-
$learnings = if (Test-Path $learningsPath) { Get-Content $learningsPath -Raw -ErrorAction SilentlyContinue | ConvertFrom-Json } else { @() }
|
|
28
|
-
|
|
29
|
-
# Calcular estatísticas
|
|
30
|
-
$totalSuccesses = $successes.Count
|
|
31
|
-
$totalFailures = $failures.Count
|
|
32
|
-
$totalTasks = $totalSuccesses + $totalFailures
|
|
33
|
-
$successRate = if ($totalTasks -gt 0) { [math]::Round(($totalSuccesses / $totalTasks) * 100, 1) } else { 0 }
|
|
34
|
-
$totalLearnings = if ($learnings) { $learnings.Count } else { 0 }
|
|
35
|
-
|
|
36
|
-
# Gerar Markdown
|
|
37
|
-
$markdown = @"
|
|
38
|
-
# Memória do Agente $agentName
|
|
39
|
-
|
|
40
|
-
Última atualização: $(Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## 📊 Estatísticas
|
|
45
|
-
|
|
46
|
-
- Total de sucessos: $totalSuccesses
|
|
47
|
-
- Total de falhas: $totalFailures
|
|
48
|
-
- Taxa de sucesso: $successRate%
|
|
49
|
-
- Aprendizados acumulados: $totalLearnings
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## ✅ Sucessos Recentes
|
|
54
|
-
|
|
55
|
-
"@
|
|
56
|
-
|
|
57
|
-
# Sucessos (últimos 10)
|
|
58
|
-
$recentSuccesses = $successes | Select-Object -Last 10
|
|
59
|
-
[array]::Reverse($recentSuccesses)
|
|
60
|
-
|
|
61
|
-
if ($recentSuccesses.Count -eq 0) {
|
|
62
|
-
$markdown += "_Nenhum sucesso registrado ainda._`n`n"
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
foreach ($entry in $recentSuccesses) {
|
|
66
|
-
$date = (Get-Date $entry.timestamp).ToString("dd/MM/yyyy")
|
|
67
|
-
$markdown += "### $date - ``$($entry.id)```n`n"
|
|
68
|
-
$markdown += "**Tarefa**: $($entry.taskDescription)`n`n"
|
|
69
|
-
$markdown += "**Contexto**:`n"
|
|
70
|
-
$files = if ($entry.context.files.Count -gt 0) { $entry.context.files -join ", " } else { "nenhum" }
|
|
71
|
-
$markdown += "- Arquivos: $files`n"
|
|
72
|
-
$markdown += "- Áreas: $($entry.context.areas -join ', ')`n"
|
|
73
|
-
$complexity = if ($entry.complexity) { $entry.complexity } else { $entry.context.complexity }
|
|
74
|
-
$markdown += "- Complexidade: $complexity`n`n"
|
|
75
|
-
$markdown += "**Resultado**: $($entry.details)`n`n"
|
|
76
|
-
|
|
77
|
-
if ($entry.userFeedback) {
|
|
78
|
-
$emoji = if ($entry.userFeedback.satisfied) { "👍" } else { "👎" }
|
|
79
|
-
$markdown += "**Feedback do usuário**: $emoji`n"
|
|
80
|
-
if ($entry.userFeedback.likes.Count -gt 0) {
|
|
81
|
-
$markdown += "- Gostou: $($entry.userFeedback.likes -join ', ')`n"
|
|
82
|
-
}
|
|
83
|
-
if ($entry.userFeedback.dislikes.Count -gt 0) {
|
|
84
|
-
$markdown += "- Não gostou: $($entry.userFeedback.dislikes -join ', ')`n"
|
|
85
|
-
}
|
|
86
|
-
if ($entry.userFeedback.suggestions.Count -gt 0) {
|
|
87
|
-
$markdown += "- Sugestões: $($entry.userFeedback.suggestions -join ', ')`n"
|
|
88
|
-
}
|
|
89
|
-
$markdown += "`n"
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
$markdown += "---`n`n## ❌ Falhas Registradas`n`n"
|
|
95
|
-
|
|
96
|
-
# Falhas (últimas 10)
|
|
97
|
-
$recentFailures = $failures | Select-Object -Last 10
|
|
98
|
-
[array]::Reverse($recentFailures)
|
|
99
|
-
|
|
100
|
-
if ($recentFailures.Count -eq 0) {
|
|
101
|
-
$markdown += "_Nenhuma falha registrada._`n`n"
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
foreach ($entry in $recentFailures) {
|
|
105
|
-
$date = (Get-Date $entry.timestamp).ToString("dd/MM/yyyy")
|
|
106
|
-
$markdown += "### $date - ``$($entry.id)```n`n"
|
|
107
|
-
$markdown += "**Tarefa**: $($entry.taskDescription)`n`n"
|
|
108
|
-
$markdown += "**Motivo**: $($entry.details)`n`n"
|
|
109
|
-
|
|
110
|
-
if ($entry.userFeedback -and $entry.userFeedback.suggestions.Count -gt 0) {
|
|
111
|
-
$markdown += "**Lição aprendida**: $($entry.userFeedback.suggestions -join '; ')`n`n"
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
$markdown += "---`n`n## 🧠 Aprendizados`n`n"
|
|
117
|
-
|
|
118
|
-
# Aprendizados
|
|
119
|
-
if (!$learnings -or $learnings.Count -eq 0) {
|
|
120
|
-
$markdown += "_Nenhum aprendizado registrado ainda._`n"
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
$index = 1
|
|
124
|
-
foreach ($learning in $learnings) {
|
|
125
|
-
$markdown += "### Aprendizado $index`n`n"
|
|
126
|
-
$markdown += "**Padrão**: $($learning.pattern)`n`n"
|
|
127
|
-
$markdown += "**Descrição**: $($learning.description)`n`n"
|
|
128
|
-
$markdown += "**Recomendação**: $($learning.recommendation)`n`n"
|
|
129
|
-
$confidence = [math]::Round($learning.confidence * 100, 0)
|
|
130
|
-
$markdown += "**Confiança**: $confidence%`n`n"
|
|
131
|
-
|
|
132
|
-
if ($learning.exampleIds.Count -gt 0) {
|
|
133
|
-
$examples = ($learning.exampleIds | ForEach-Object { "``$_``" }) -join ", "
|
|
134
|
-
$markdown += "**Exemplos**: $examples`n`n"
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if ($learning.createdAt) {
|
|
138
|
-
$date = (Get-Date $learning.createdAt).ToString("dd/MM/yyyy")
|
|
139
|
-
$markdown += "_Criado em: $date_`n`n"
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
$index++
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
# Salvar memory.md
|
|
147
|
-
$outputPath = "$targetDir\memory.md"
|
|
148
|
-
$markdown | Set-Content $outputPath -Encoding UTF8
|
|
149
|
-
|
|
150
|
-
Write-Host "✅ $agentName/memory.md ($totalSuccesses sucessos, $totalFailures falhas, $totalLearnings aprendizados)" -ForegroundColor Green
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
Write-Host "`n✅ Conversão de memória concluída!`n" -ForegroundColor Cyan
|