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.
Files changed (108) hide show
  1. package/.agent/skills/wegho-global-rules/SKILL.md +20 -0
  2. package/.agent/workflows/PROMPT_GUIDE.md +7 -4
  3. package/.agents/cli.ts +29 -21
  4. package/.agents/core/base-agent.ts +28 -12
  5. package/.agents/core/memory-system.ts +45 -13
  6. package/.agents/core/report-generator.ts +26 -19
  7. package/.agents/orchestrator.ts +104 -74
  8. package/.clinerules +318 -1229
  9. package/.cursorrules +0 -189
  10. package/README.md +3 -3
  11. package/docs/VERSION.md +3 -2
  12. package/package.json +3 -3
  13. package/.agents/agents/ai-agents/README.md +0 -175
  14. package/.agents/agents/ai-agents/agent.ts +0 -83
  15. package/.agents/agents/ai-agents/specialty.md +0 -14
  16. package/.agents/agents/architecture/README.md +0 -61
  17. package/.agents/agents/architecture/agent.ts +0 -238
  18. package/.agents/agents/architecture/memory.md +0 -111
  19. package/.agents/agents/architecture/specialty.md +0 -31
  20. package/.agents/agents/automation/README.md +0 -60
  21. package/.agents/agents/automation/agent.ts +0 -61
  22. package/.agents/agents/automation/specialty.md +0 -14
  23. package/.agents/agents/backend/README.md +0 -155
  24. package/.agents/agents/backend/agent.ts +0 -100
  25. package/.agents/agents/backend/specialty.md +0 -14
  26. package/.agents/agents/cloud/README.md +0 -73
  27. package/.agents/agents/cloud/agent.ts +0 -53
  28. package/.agents/agents/cloud/specialty.md +0 -14
  29. package/.agents/agents/code-auditor/README.md +0 -37
  30. package/.agents/agents/code-auditor/agent.ts +0 -334
  31. package/.agents/agents/code-auditor/specialty.md +0 -14
  32. package/.agents/agents/cro/README.md +0 -200
  33. package/.agents/agents/cro/agent.ts +0 -61
  34. package/.agents/agents/cro/specialty.md +0 -14
  35. package/.agents/agents/database/README.md +0 -67
  36. package/.agents/agents/database/agent.ts +0 -93
  37. package/.agents/agents/database/specialty.md +0 -14
  38. package/.agents/agents/devops/README.md +0 -84
  39. package/.agents/agents/devops/agent.ts +0 -54
  40. package/.agents/agents/devops/specialty.md +0 -14
  41. package/.agents/agents/documentation/README.md +0 -107
  42. package/.agents/agents/documentation/agent.ts +0 -253
  43. package/.agents/agents/documentation/memory.md +0 -56
  44. package/.agents/agents/documentation/specialty.md +0 -33
  45. package/.agents/agents/frontend/README.md +0 -188
  46. package/.agents/agents/frontend/agent.ts +0 -211
  47. package/.agents/agents/frontend/memory.md +0 -139
  48. package/.agents/agents/frontend/specialty.md +0 -30
  49. package/.agents/agents/inventory/README.md +0 -35
  50. package/.agents/agents/inventory/agent.ts +0 -758
  51. package/.agents/agents/inventory/memory.md +0 -50
  52. package/.agents/agents/inventory/specialty.md +0 -129
  53. package/.agents/agents/nextjs/README.md +0 -58
  54. package/.agents/agents/nextjs/agent.ts +0 -114
  55. package/.agents/agents/nextjs/specialty.md +0 -14
  56. package/.agents/agents/pentest/README.md +0 -228
  57. package/.agents/agents/pentest/agent.ts +0 -96
  58. package/.agents/agents/pentest/specialty.md +0 -14
  59. package/.agents/agents/planning/README.md +0 -107
  60. package/.agents/agents/planning/agent.ts +0 -389
  61. package/.agents/agents/planning/specialty.md +0 -14
  62. package/.agents/agents/project-discovery/README.md +0 -35
  63. package/.agents/agents/project-discovery/agent.ts +0 -344
  64. package/.agents/agents/project-discovery/specialty.md +0 -14
  65. package/.agents/agents/quality/README.md +0 -81
  66. package/.agents/agents/quality/agent.ts +0 -269
  67. package/.agents/agents/quality/memory.md +0 -110
  68. package/.agents/agents/quality/specialty.md +0 -31
  69. package/.agents/agents/rag/README.md +0 -41
  70. package/.agents/agents/rag/agent.ts +0 -85
  71. package/.agents/agents/rag/specialty.md +0 -14
  72. package/.agents/agents/security/README.md +0 -152
  73. package/.agents/agents/security/agent.ts +0 -218
  74. package/.agents/agents/security/memory.md +0 -91
  75. package/.agents/agents/security/specialty.md +0 -31
  76. package/.agents/agents/task-analyzer/README.md +0 -36
  77. package/.agents/agents/task-analyzer/agent.ts +0 -462
  78. package/.agents/agents/task-analyzer/specialty.md +0 -14
  79. package/.agents/agents/testing/README.md +0 -161
  80. package/.agents/agents/testing/agent.ts +0 -61
  81. package/.agents/agents/testing/specialty.md +0 -14
  82. package/.agents/agents/uiux/README.md +0 -68
  83. package/.agents/agents/uiux/agent.ts +0 -95
  84. package/.agents/agents/uiux/specialty.md +0 -14
  85. package/.agents/base/base-agent.ts +0 -331
  86. package/.agents/base/memory-system.ts +0 -397
  87. package/.agents/base/skill-manager.ts +0 -95
  88. package/.agents/convert-memory.ps1 +0 -153
  89. package/.agents/examples/reporting-example.md +0 -203
  90. package/.agents/managers/build-manager.ts +0 -304
  91. package/.agents/managers/cache-manager.ts +0 -184
  92. package/.agents/managers/checkpoint-manager.ts +0 -299
  93. package/.agents/migrate-agents.ps1 +0 -117
  94. package/.agents/templates/change-report.md +0 -55
  95. package/.agents/templates/execution-plan.md +0 -36
  96. package/.agents/unmapped-skills.txt +0 -0
  97. package/.agents/utils/agent-migrator.ts +0 -360
  98. package/.agents/utils/agent-monitor.ts +0 -102
  99. package/.agents/utils/agent-parallelizer.ts +0 -108
  100. package/.agents/utils/context-monitor.ts +0 -140
  101. package/.agents/utils/feedback-collector.ts +0 -207
  102. package/.agents/utils/file-generator.ts +0 -304
  103. package/.agents/utils/memory-converter.ts +0 -217
  104. package/.agents/utils/memory-dashboard.ts +0 -147
  105. package/.agents/utils/performance-tracker.ts +0 -275
  106. package/.agents/utils/report-generator.ts +0 -193
  107. package/.agents/utils/retry-utility.ts +0 -140
  108. 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