@justmpm/memory 0.1.2 → 0.2.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/README.md +292 -281
- package/TEST_REPORT.md +226 -0
- package/dist/index.js +224 -273
- package/dist/index.js.map +1 -1
- package/package.json +40 -40
- package/src/index.ts +645 -692
package/dist/index.js
CHANGED
|
@@ -83,10 +83,10 @@ function limitMemoryLines(content, maxLines = 200) {
|
|
|
83
83
|
return content;
|
|
84
84
|
const keepCount = Math.floor(maxLines * 0.8); // 160 linhas
|
|
85
85
|
const removed = lines.length - keepCount;
|
|
86
|
-
return `# Memória (últimas ${keepCount} de ${lines.length} linhas)
|
|
87
|
-
|
|
88
|
-
[... ${removed} linhas anteriores removidas ...]
|
|
89
|
-
|
|
86
|
+
return `# Memória (últimas ${keepCount} de ${lines.length} linhas)
|
|
87
|
+
|
|
88
|
+
[... ${removed} linhas anteriores removidas ...]
|
|
89
|
+
|
|
90
90
|
${lines.slice(-keepCount).join("\n")}`;
|
|
91
91
|
}
|
|
92
92
|
/**
|
|
@@ -115,17 +115,17 @@ function listAgentsWithMemory() {
|
|
|
115
115
|
async function handleRead(agentName) {
|
|
116
116
|
const memoryPath = getAgentMemoryPath(agentName);
|
|
117
117
|
if (!existsSync(memoryPath)) {
|
|
118
|
-
return `📝 Memória vazia para agent "${agentName}".
|
|
119
|
-
|
|
118
|
+
return `📝 Memória vazia para agent "${agentName}".
|
|
119
|
+
|
|
120
120
|
Use \`command="append", entry="..."\` para criar a primeira entrada.`;
|
|
121
121
|
}
|
|
122
122
|
try {
|
|
123
123
|
const content = readFileSync(memoryPath, "utf-8");
|
|
124
124
|
const lines = content.split("\n").length;
|
|
125
|
-
return `📝 Memória de "${agentName}" (${lines} linhas):
|
|
126
|
-
|
|
127
|
-
─────────────────────────────────────────────────────────────────
|
|
128
|
-
|
|
125
|
+
return `📝 Memória de "${agentName}" (${lines} linhas):
|
|
126
|
+
|
|
127
|
+
─────────────────────────────────────────────────────────────────
|
|
128
|
+
|
|
129
129
|
${content}`;
|
|
130
130
|
}
|
|
131
131
|
catch (error) {
|
|
@@ -135,14 +135,23 @@ ${content}`;
|
|
|
135
135
|
/**
|
|
136
136
|
* Handler: write - Substitui toda a memória
|
|
137
137
|
*/
|
|
138
|
-
async function handleWrite(agentName, content) {
|
|
138
|
+
async function handleWrite(agentName, content, backup = false) {
|
|
139
139
|
try {
|
|
140
140
|
ensureAgentMemoryDir(agentName);
|
|
141
|
+
const memoryPath = getAgentMemoryPath(agentName);
|
|
142
|
+
// Cria backup se solicitado e arquivo existir
|
|
143
|
+
let backupMessage = "";
|
|
144
|
+
if (backup && existsSync(memoryPath)) {
|
|
145
|
+
const backupPath = memoryPath + ".backup";
|
|
146
|
+
const existingContent = readFileSync(memoryPath, "utf-8");
|
|
147
|
+
writeFileSync(backupPath, existingContent, "utf-8");
|
|
148
|
+
backupMessage = `\n💾 Backup criado: MEMORY.md.backup`;
|
|
149
|
+
}
|
|
141
150
|
const limited = limitMemoryLines(content);
|
|
142
|
-
writeFileSync(
|
|
151
|
+
writeFileSync(memoryPath, limited, "utf-8");
|
|
143
152
|
const lines = limited.split("\n").length;
|
|
144
|
-
return `✅ Memória de "${agentName}" atualizada (${lines} linhas)
|
|
145
|
-
|
|
153
|
+
return `✅ Memória de "${agentName}" atualizada (${lines} linhas).${backupMessage}
|
|
154
|
+
|
|
146
155
|
${lines >= 200 ? "⚠️ Memória atingiu o limite de 200 linhas." : ""}`;
|
|
147
156
|
}
|
|
148
157
|
catch (error) {
|
|
@@ -168,9 +177,9 @@ async function handleAppend(agentName, entry) {
|
|
|
168
177
|
// Salva com limite
|
|
169
178
|
const limited = limitMemoryLines(newContent);
|
|
170
179
|
writeFileSync(memoryPath, limited, "utf-8");
|
|
171
|
-
return `✅ Entrada adicionada à memória de "${agentName}".
|
|
172
|
-
|
|
173
|
-
**Timestamp:** ${timestamp}
|
|
180
|
+
return `✅ Entrada adicionada à memória de "${agentName}".
|
|
181
|
+
|
|
182
|
+
**Timestamp:** ${timestamp}
|
|
174
183
|
**Entry:** ${entry.slice(0, 100)}${entry.length > 100 ? "..." : ""}`;
|
|
175
184
|
}
|
|
176
185
|
catch (error) {
|
|
@@ -200,8 +209,8 @@ async function handleSearch(agentName, query) {
|
|
|
200
209
|
.map(({ line, idx }) => ` L${idx + 1}: ${line}`)
|
|
201
210
|
.join("\n");
|
|
202
211
|
const more = matches.length > 20 ? `\n... e mais ${matches.length - 20} ocorrências` : "";
|
|
203
|
-
return `📝 Busca por "${query}" em "${agentName}" (${matches.length} ocorrências):
|
|
204
|
-
|
|
212
|
+
return `📝 Busca por "${query}" em "${agentName}" (${matches.length} ocorrências):
|
|
213
|
+
|
|
205
214
|
${results}${more}`;
|
|
206
215
|
}
|
|
207
216
|
catch (error) {
|
|
@@ -214,8 +223,8 @@ ${results}${more}`;
|
|
|
214
223
|
async function handleList() {
|
|
215
224
|
const agents = listAgentsWithMemory();
|
|
216
225
|
if (agents.length === 0) {
|
|
217
|
-
return `📝 Nenhum agent com memória neste projeto.
|
|
218
|
-
|
|
226
|
+
return `📝 Nenhum agent com memória neste projeto.
|
|
227
|
+
|
|
219
228
|
Diretório: .claude/agent-memory/`;
|
|
220
229
|
}
|
|
221
230
|
const agentList = agents
|
|
@@ -229,10 +238,10 @@ Diretório: .claude/agent-memory/`;
|
|
|
229
238
|
return ` • ${name} (${lines} linhas)`;
|
|
230
239
|
})
|
|
231
240
|
.join("\n");
|
|
232
|
-
return `📝 Agents com memória neste projeto (${agents.length}):
|
|
233
|
-
|
|
234
|
-
${agentList}
|
|
235
|
-
|
|
241
|
+
return `📝 Agents com memória neste projeto (${agents.length}):
|
|
242
|
+
|
|
243
|
+
${agentList}
|
|
244
|
+
|
|
236
245
|
Use o comando "read" de cada agent para ver o conteúdo.`;
|
|
237
246
|
}
|
|
238
247
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -255,192 +264,130 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
255
264
|
tools: [
|
|
256
265
|
{
|
|
257
266
|
name: "memory",
|
|
258
|
-
description: `
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
**
|
|
262
|
-
|
|
263
|
-
**
|
|
264
|
-
|
|
265
|
-
**
|
|
266
|
-
|
|
267
|
-
═══════════════════════════════════════════════════════════════
|
|
268
|
-
COMANDOS DISPONÍVEIS:
|
|
269
|
-
═══════════════════════════════════════════════════════════════
|
|
270
|
-
|
|
271
|
-
1. **read** -
|
|
272
|
-
Uso:
|
|
273
|
-
- agent: (opcional)
|
|
274
|
-
- Retorna: Conteúdo completo do MEMORY.md com contagem de linhas
|
|
275
|
-
- Se não existir:
|
|
276
|
-
|
|
277
|
-
2. **
|
|
278
|
-
Uso:
|
|
279
|
-
-
|
|
280
|
-
-
|
|
281
|
-
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
Exemplo 6 - Listar todos os agents:
|
|
356
|
-
{ "command": "list" }
|
|
357
|
-
|
|
358
|
-
═══════════════════════════════════════════════════════════════
|
|
359
|
-
BOAS PRÁTICAS (O QUE SALVAR):
|
|
360
|
-
═══════════════════════════════════════════════════════════════
|
|
361
|
-
|
|
362
|
-
✅ **SEMPRE salve:**
|
|
363
|
-
- Padrões de código descobertos (ex: "Sempre use 2 espaços de indentação em TSX")
|
|
364
|
-
- Decisões arquiteturais (ex: "Escolhemos Firestore em vez de PostgreSQL porque...")
|
|
365
|
-
- Bugs recorrentes (ex: "Erro X acontece quando...")
|
|
366
|
-
- Soluções para problemas específicos (ex: "Para resolver problema Y, use...")
|
|
367
|
-
- Configurações importantes (ex: "Firebase Auth usa Google Sign-In")
|
|
368
|
-
- Preferências do usuário (ex: "Matheus prefere estilos inline para componentes simples")
|
|
369
|
-
|
|
370
|
-
✅ **Use markdown organizado:**
|
|
371
|
-
## Padrões - Padrões de código e convenções
|
|
372
|
-
## Decisões - Escolhas arquiteturais e trade-offs
|
|
373
|
-
## Bugs - Problemas conhecidos e workarounds
|
|
374
|
-
## Configurações - Configs e setup específicos
|
|
375
|
-
## Preferências - Preferências pessoais do usuário
|
|
376
|
-
|
|
377
|
-
✅ **Adicione contexto:**
|
|
378
|
-
- "No projeto X, use Y..." (especifica o projeto)
|
|
379
|
-
- "Ao trabalhar com componente Z..." (especifica o contexto)
|
|
380
|
-
- "Quando acontecer erro Y..." (especifica a condição)
|
|
381
|
-
|
|
382
|
-
═══════════════════════════════════════════════════════════════
|
|
383
|
-
BOAS PRÁTICAS (O QUE NÃO SALVAR):
|
|
384
|
-
═══════════════════════════════════════════════════════════════
|
|
385
|
-
|
|
386
|
-
❌ **NÃO salve:**
|
|
387
|
-
- Coisas triviais (ex: "Hoje está chovendo")
|
|
388
|
-
- Informações que mudam frequentemente (ex: "Tem 3 arquivos na pasta")
|
|
389
|
-
- Coisas que são óbvias (ex: "O código precisa compilar")
|
|
390
|
-
- Informações duplicadas
|
|
391
|
-
- Logs de conversação
|
|
392
|
-
- Erros temporários que já foram resolvidos
|
|
393
|
-
|
|
394
|
-
❌ **NÃO repita:**
|
|
395
|
-
- Se um padrão já está salvo, não salve novamente
|
|
396
|
-
- Use search para verificar antes de salvar
|
|
397
|
-
|
|
398
|
-
═══════════════════════════════════════════════════════════════
|
|
399
|
-
IMPORTANTE:
|
|
400
|
-
═══════════════════════════════════════════════════════════════
|
|
401
|
-
|
|
402
|
-
• O nome do agent é NORMALIZADO automaticamente:
|
|
403
|
-
- "Sentinel" → "sentinel"
|
|
404
|
-
- "QA-Tester" → "qa-tester"
|
|
405
|
-
- "My Agent" → "my-agent"
|
|
406
|
-
|
|
407
|
-
• O parâmetro 'agent' é OPCIONAL:
|
|
408
|
-
- Se não fornecido, usa "unknown" como nome padrão
|
|
409
|
-
- É recomendável SEMPRE fornecer o nome do agent atual
|
|
410
|
-
|
|
411
|
-
• Memória é específica por projeto:
|
|
412
|
-
- Cada projeto tem sua própria pasta .claude/agent-memory/
|
|
413
|
-
- Memórias de diferentes projetos não se misturam
|
|
414
|
-
|
|
415
|
-
• Quando a memória atinge 200 linhas:
|
|
416
|
-
- As primeiras entradas mais antigas são removidas automaticamente
|
|
417
|
-
- Mantém as últimas 160 linhas mais recentes
|
|
418
|
-
- Adiciona cabeçalho informando sobre a limpeza
|
|
419
|
-
- Use write para reorganizar se isso acontecer com frequência
|
|
267
|
+
description: `
|
|
268
|
+
Sua memória pessoal - salve e recupere seus aprendizados entre sessões.
|
|
269
|
+
|
|
270
|
+
**PARA QUE:** Guarde padrões de código, bugs encontrados, decisões tomadas e preferências do usuário. Tudo persiste entre sessões.
|
|
271
|
+
|
|
272
|
+
**ONDE:** Seu arquivo fica em .claude/agent-memory/<seu-nome>/MEMORY.md
|
|
273
|
+
|
|
274
|
+
**IMPORTANTE:** Máximo 200 linhas. Quando passar, as mais antigas são removidas (mantém últimas 160).
|
|
275
|
+
|
|
276
|
+
═══════════════════════════════════════════════════════════════
|
|
277
|
+
COMANDOS DISPONÍVEIS:
|
|
278
|
+
═══════════════════════════════════════════════════════════════
|
|
279
|
+
|
|
280
|
+
1. **read** - Carrega sua memória
|
|
281
|
+
Uso: Ao iniciar uma sessão para recuperar seu contexto anterior
|
|
282
|
+
- agent: (opcional) Seu nome de agent. Se não fornecido, usa "unknown"
|
|
283
|
+
- Retorna: Conteúdo completo do seu MEMORY.md com contagem de linhas
|
|
284
|
+
- Se não existir: Mensagem de memória vazia com sugestão de usar 'append'
|
|
285
|
+
|
|
286
|
+
2. **append** - Adiciona nova informação à sua memória
|
|
287
|
+
Uso: Quando aprender algo novo importante (padrão, bug, decisão)
|
|
288
|
+
- entry: (OBRIGATÓRIO) Texto da informação a salvar
|
|
289
|
+
- Formato automático: Adiciona timestamp "## [YYYY-MM-DD HH:MM:SS]"
|
|
290
|
+
- Retorna: Confirmação com timestamp e preview da entrada
|
|
291
|
+
|
|
292
|
+
3. **search** - Procura informação específica na sua memória
|
|
293
|
+
Uso: Quando precisar encontrar algo sem ler tudo
|
|
294
|
+
- query: (OBRIGATÓRIO) Termo ou palavra-chave a buscar
|
|
295
|
+
- Busca: Case-insensitive, máximo 20 resultados
|
|
296
|
+
- Retorna: Ocorrências encontradas com número da linha
|
|
297
|
+
|
|
298
|
+
4. **write** - Reescreve sua memória reorganizando tudo
|
|
299
|
+
Uso: Quando a memória ficar grande (perto de 200 linhas) ou precisar reestruturar
|
|
300
|
+
- content: (OBRIGATÓRIO) Novo conteúdo completo em markdown
|
|
301
|
+
- backup: (opcional) Se true, cria backup antes de sobrescrever
|
|
302
|
+
- Retorna: Confirmação com contagem de linhas e alerta se atingir limite
|
|
303
|
+
|
|
304
|
+
═══════════════════════════════════════════════════════════════
|
|
305
|
+
WORKFLOW RECOMENDADO:
|
|
306
|
+
═══════════════════════════════════════════════════════════════
|
|
307
|
+
|
|
308
|
+
1. **INICIAR SESSÃO:** { "command": "read" }
|
|
309
|
+
→ Carrega sua memória anterior para ter contexto
|
|
310
|
+
|
|
311
|
+
2. **DURANTE O TRABALHO:** { "command": "append", "entry": "Padrão: ..." }
|
|
312
|
+
→ Sempre que aprender algo importante, salve imediatamente
|
|
313
|
+
|
|
314
|
+
3. **PRECISAR DE ALGO:** { "command": "search", "query": "Zod" }
|
|
315
|
+
→ Procure na sua memória sem precisar ler tudo
|
|
316
|
+
|
|
317
|
+
4. **MEMÓRIA GRANDE:** { "command": "write", "content": "...", "backup": true }
|
|
318
|
+
→ Reestruture e use backup para segurança
|
|
319
|
+
|
|
320
|
+
═══════════════════════════════════════════════════════════════
|
|
321
|
+
EXEMPLOS PRÁTICOS:
|
|
322
|
+
═══════════════════════════════════════════════════════════════
|
|
323
|
+
|
|
324
|
+
Iniciar sessão (sempre comece assim):
|
|
325
|
+
{ "command": "read" }
|
|
326
|
+
|
|
327
|
+
Salvar um padrão de código:
|
|
328
|
+
{ "command": "append", "entry": "Padrão: Sempre use Zod para validar inputs do usuário" }
|
|
329
|
+
|
|
330
|
+
Salvar uma decisão importante:
|
|
331
|
+
{ "command": "append", "entry": "Decisão: Usar Zustand em vez de Redux (mais leve)" }
|
|
332
|
+
|
|
333
|
+
Salvar um bug recorrente:
|
|
334
|
+
{ "command": "append", "entry": "Bug: Erro acontece quando array está vazio no submit" }
|
|
335
|
+
|
|
336
|
+
Buscar informação sobre Zod:
|
|
337
|
+
{ "command": "search", "query": "Zod" }
|
|
338
|
+
|
|
339
|
+
Reorganizar memória grande com backup:
|
|
340
|
+
{ "command": "write", "content": "# Memória Reorganizada\\n\\n## Padrões\\n- Padrão 1\\n- Padrão 2", "backup": true }
|
|
341
|
+
|
|
342
|
+
═══════════════════════════════════════════════════════════════
|
|
343
|
+
O QUE SALVAR (exemplos):
|
|
344
|
+
═══════════════════════════════════════════════════════════════
|
|
345
|
+
|
|
346
|
+
✅ **Salve:** Padrões de código, bugs recorrentes, decisões arquiteturais, preferências do usuário, configurações importantes.
|
|
347
|
+
|
|
348
|
+
✅ **Organize com markdown:**
|
|
349
|
+
## Padrões - Convenções de código
|
|
350
|
+
## Bugs - Problemas e workarounds
|
|
351
|
+
## Decisões - Escolhas arquiteturais
|
|
352
|
+
|
|
353
|
+
❌ **Não salve:** Coisas triviais, informações temporárias, logs de conversa, coisas óbvias.
|
|
354
|
+
|
|
355
|
+
═══════════════════════════════════════════════════════════════
|
|
356
|
+
DICAS IMPORTANTES:
|
|
357
|
+
═══════════════════════════════════════════════════════════════
|
|
358
|
+
|
|
359
|
+
• Seu nome é normalizado: "Meu Agent" → "meu-agent"
|
|
360
|
+
• Use search antes de salvar para evitar duplicatas
|
|
361
|
+
• Memória é por projeto (pasta .claude/agent-memory/)
|
|
362
|
+
• Ao atingir 200 linhas, as mais antigas são removidas automaticamente
|
|
420
363
|
`.trim(),
|
|
421
364
|
inputSchema: {
|
|
422
365
|
type: "object",
|
|
423
366
|
properties: {
|
|
424
367
|
command: {
|
|
425
368
|
type: "string",
|
|
426
|
-
enum: ["read", "
|
|
427
|
-
description: "Comando a executar
|
|
369
|
+
enum: ["read", "append", "search", "write"],
|
|
370
|
+
description: "Comando a executar: 'read' carrega sua memória, 'append' adiciona nova informação, 'search' procura algo específico, 'write' reescreve reorganizando tudo.",
|
|
428
371
|
},
|
|
429
372
|
agent: {
|
|
430
373
|
type: "string",
|
|
431
|
-
description: '
|
|
374
|
+
description: 'Seu nome de agent (ex: "sentinel", "fix-worker"). Opcional - usa "unknown" se não informado. Será normalizado para minúsculas.',
|
|
432
375
|
},
|
|
433
376
|
content: {
|
|
434
377
|
type: "string",
|
|
435
378
|
description: 'Conteúdo completo em markdown para substituir a memória existente (OBRIGATÓRIO para "write"). Use para reorganizar, limpar ou reconstruir memória do zero.',
|
|
436
379
|
},
|
|
380
|
+
backup: {
|
|
381
|
+
type: "boolean",
|
|
382
|
+
description: 'Se true, cria um backup do conteúdo atual antes de sobrescrever. O backup é salvo como MEMORY.md.backup no mesmo diretório. Padrão: false.',
|
|
383
|
+
},
|
|
437
384
|
entry: {
|
|
438
385
|
type: "string",
|
|
439
|
-
description: 'Texto da
|
|
386
|
+
description: 'Texto da informação a salvar (OBRIGATÓRIO para append). Ex: "Padrão: sempre use try/catch em funções async" ou "Bug: erro quando usuário clica 2x". Será adicionado com timestamp automaticamente.',
|
|
440
387
|
},
|
|
441
388
|
query: {
|
|
442
389
|
type: "string",
|
|
443
|
-
description: '
|
|
390
|
+
description: 'Palavra-chave para buscar na sua memória (OBRIGATÓRIO para search). Ex: "Zod", "bug", "Firebase". Retorna até 20 resultados com número da linha.',
|
|
444
391
|
},
|
|
445
392
|
},
|
|
446
393
|
required: ["command"],
|
|
@@ -460,23 +407,22 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
460
407
|
const command = args?.command;
|
|
461
408
|
const agentName = args?.agent || "unknown";
|
|
462
409
|
// Valida comando
|
|
463
|
-
const validCommands = ["read", "
|
|
410
|
+
const validCommands = ["read", "append", "search", "write"];
|
|
464
411
|
if (!validCommands.includes(command)) {
|
|
465
412
|
return {
|
|
466
413
|
content: [
|
|
467
414
|
{
|
|
468
415
|
type: "text",
|
|
469
|
-
text: `❌ ERRO: Comando desconhecido "${command}"
|
|
470
|
-
|
|
471
|
-
COMANDOS DISPONÍVEIS:
|
|
472
|
-
|
|
473
|
-
1. read -
|
|
474
|
-
2.
|
|
475
|
-
3.
|
|
476
|
-
4.
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
PARA MAIS DETALHES, CONSULTE A DESCRIÇÃO DA TOOL "memory"
|
|
416
|
+
text: `❌ ERRO: Comando desconhecido "${command}"
|
|
417
|
+
|
|
418
|
+
COMANDOS DISPONÍVEIS:
|
|
419
|
+
|
|
420
|
+
1. read - Carrega sua memória (use ao iniciar)
|
|
421
|
+
2. append - Adiciona nova informação (mais usado)
|
|
422
|
+
3. search - Procura algo na sua memória
|
|
423
|
+
4. write - Reescreve reorganizando tudo (cuidado!)
|
|
424
|
+
|
|
425
|
+
PARA MAIS DETALHES, CONSULTE A DESCRIÇÃO DA TOOL "memory"
|
|
480
426
|
`,
|
|
481
427
|
},
|
|
482
428
|
],
|
|
@@ -492,40 +438,49 @@ PARA MAIS DETALHES, CONSULTE A DESCRIÇÃO DA TOOL "memory"
|
|
|
492
438
|
case "write": {
|
|
493
439
|
const content = args?.content;
|
|
494
440
|
if (!content) {
|
|
495
|
-
result = `❌ ERRO: O parâmetro "content" é OBRIGATÓRIO para o comando "write".
|
|
496
|
-
|
|
497
|
-
EXEMPLO DE USO CORRETO:
|
|
498
|
-
{
|
|
499
|
-
"command": "write",
|
|
500
|
-
"agent": "sentinel",
|
|
501
|
-
"content": "# Memória do Sentinel\\n\\n## Padrões\\n- Sempre use Zod para validação\\n\\n## Bugs\\n- Bug XYZ ocorre quando..."
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
DICA: Use "
|
|
505
|
-
|
|
441
|
+
result = `❌ ERRO: O parâmetro "content" é OBRIGATÓRIO para o comando "write".
|
|
442
|
+
|
|
443
|
+
EXEMPLO DE USO CORRETO:
|
|
444
|
+
{
|
|
445
|
+
"command": "write",
|
|
446
|
+
"agent": "sentinel",
|
|
447
|
+
"content": "# Memória do Sentinel\\n\\n## Padrões\\n- Sempre use Zod para validação\\n\\n## Bugs\\n- Bug XYZ ocorre quando..."
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
DICA: Use "backup": true para criar uma cópia de segurança antes de sobrescrever:
|
|
451
|
+
{
|
|
452
|
+
"command": "write",
|
|
453
|
+
"agent": "sentinel",
|
|
454
|
+
"content": "# Nova memória...",
|
|
455
|
+
"backup": true
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
Use "write" para reorganizar memória grande ou reconstruir do zero.
|
|
459
|
+
Para adicionar uma entrada preservando o histórico, use "append".
|
|
506
460
|
`;
|
|
507
461
|
break;
|
|
508
462
|
}
|
|
509
|
-
|
|
463
|
+
const backup = args?.backup || false;
|
|
464
|
+
result = await handleWrite(agentName, content, backup);
|
|
510
465
|
break;
|
|
511
466
|
}
|
|
512
467
|
case "append": {
|
|
513
468
|
const entry = args?.entry;
|
|
514
469
|
if (!entry) {
|
|
515
|
-
result = `❌ ERRO: O parâmetro "entry" é OBRIGATÓRIO para o comando "append".
|
|
516
|
-
|
|
517
|
-
EXEMPLO DE USO CORRETO:
|
|
518
|
-
{
|
|
519
|
-
"command": "append",
|
|
520
|
-
"agent": "sentinel",
|
|
521
|
-
"entry": "Padrão descoberto: Sempre use Zod para validar inputs do usuário em todos os componentes de formulário"
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
DICA: Use "append" para salvar aprendizados incrementais. O timestamp é adicionado automaticamente no formato:
|
|
525
|
-
## [2026-02-09 12:34:56]
|
|
526
|
-
Sua entrada aqui
|
|
527
|
-
|
|
528
|
-
Para salvar informações mais longas ou estruturadas, considere usar "write".
|
|
470
|
+
result = `❌ ERRO: O parâmetro "entry" é OBRIGATÓRIO para o comando "append".
|
|
471
|
+
|
|
472
|
+
EXEMPLO DE USO CORRETO:
|
|
473
|
+
{
|
|
474
|
+
"command": "append",
|
|
475
|
+
"agent": "sentinel",
|
|
476
|
+
"entry": "Padrão descoberto: Sempre use Zod para validar inputs do usuário em todos os componentes de formulário"
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
DICA: Use "append" para salvar aprendizados incrementais. O timestamp é adicionado automaticamente no formato:
|
|
480
|
+
## [2026-02-09 12:34:56]
|
|
481
|
+
Sua entrada aqui
|
|
482
|
+
|
|
483
|
+
Para salvar informações mais longas ou estruturadas, considere usar "write".
|
|
529
484
|
`;
|
|
530
485
|
break;
|
|
531
486
|
}
|
|
@@ -535,27 +490,23 @@ Para salvar informações mais longas ou estruturadas, considere usar "write".
|
|
|
535
490
|
case "search": {
|
|
536
491
|
const query = args?.query;
|
|
537
492
|
if (!query) {
|
|
538
|
-
result = `❌ ERRO: O parâmetro "query" é OBRIGATÓRIO para o comando "search".
|
|
539
|
-
|
|
540
|
-
EXEMPLO DE USO CORRETO:
|
|
541
|
-
{
|
|
542
|
-
"command": "search",
|
|
543
|
-
"agent": "sentinel",
|
|
544
|
-
"query": "Zod"
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
DICA: A busca é case-insensitive e retorna até 20 ocorrências com o número da linha.
|
|
548
|
-
Exemplos de busca úteis: "padrão", "bug", "TypeScript", "Firebase", "erro"
|
|
493
|
+
result = `❌ ERRO: O parâmetro "query" é OBRIGATÓRIO para o comando "search".
|
|
494
|
+
|
|
495
|
+
EXEMPLO DE USO CORRETO:
|
|
496
|
+
{
|
|
497
|
+
"command": "search",
|
|
498
|
+
"agent": "sentinel",
|
|
499
|
+
"query": "Zod"
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
DICA: A busca é case-insensitive e retorna até 20 ocorrências com o número da linha.
|
|
503
|
+
Exemplos de busca úteis: "padrão", "bug", "TypeScript", "Firebase", "erro"
|
|
549
504
|
`;
|
|
550
505
|
break;
|
|
551
506
|
}
|
|
552
507
|
result = await handleSearch(agentName, query);
|
|
553
508
|
break;
|
|
554
509
|
}
|
|
555
|
-
case "list": {
|
|
556
|
-
result = await handleList();
|
|
557
|
-
break;
|
|
558
|
-
}
|
|
559
510
|
default:
|
|
560
511
|
result = `❌ Comando desconhecido: ${command}`;
|
|
561
512
|
}
|
|
@@ -581,34 +532,34 @@ async function main() {
|
|
|
581
532
|
}
|
|
582
533
|
// --help
|
|
583
534
|
if (args.includes("--help") || args.includes("-h")) {
|
|
584
|
-
console.log(`
|
|
585
|
-
@justmpm/memory - MCP Server para gerenciar memória persistente de subagents
|
|
586
|
-
|
|
587
|
-
Versão: ${PACKAGE_VERSION}
|
|
588
|
-
|
|
589
|
-
USO:
|
|
590
|
-
memory Inicia o servidor MCP (comunicação via stdio)
|
|
591
|
-
memory --version Mostra a versão do pacote
|
|
592
|
-
memory --help Mostra esta mensagem de ajuda
|
|
593
|
-
|
|
594
|
-
COMANDOS MCP:
|
|
595
|
-
- read Lê a memória de um agent
|
|
596
|
-
- write Substitui toda a memória
|
|
597
|
-
- append Adiciona uma entrada ao final
|
|
598
|
-
- search Busca texto na memória
|
|
599
|
-
- list Lista todos os agents com memória
|
|
600
|
-
|
|
601
|
-
DOCUMENTAÇÃO:
|
|
602
|
-
Para mais detalhes, consulte:
|
|
603
|
-
- CLAUDE.md (Documentação para IAs)
|
|
604
|
-
- AGENTS.md (Guia para subagents)
|
|
605
|
-
- README.md (Documentação principal)
|
|
606
|
-
|
|
607
|
-
REPOSITÓRIO:
|
|
608
|
-
https://github.com/justmpm/memory-mcp
|
|
609
|
-
|
|
610
|
-
LICENÇA:
|
|
611
|
-
MIT © Koda AI Studio
|
|
535
|
+
console.log(`
|
|
536
|
+
@justmpm/memory - MCP Server para gerenciar memória persistente de subagents
|
|
537
|
+
|
|
538
|
+
Versão: ${PACKAGE_VERSION}
|
|
539
|
+
|
|
540
|
+
USO:
|
|
541
|
+
memory Inicia o servidor MCP (comunicação via stdio)
|
|
542
|
+
memory --version Mostra a versão do pacote
|
|
543
|
+
memory --help Mostra esta mensagem de ajuda
|
|
544
|
+
|
|
545
|
+
COMANDOS MCP:
|
|
546
|
+
- read Lê a memória de um agent
|
|
547
|
+
- write Substitui toda a memória
|
|
548
|
+
- append Adiciona uma entrada ao final
|
|
549
|
+
- search Busca texto na memória
|
|
550
|
+
- list Lista todos os agents com memória
|
|
551
|
+
|
|
552
|
+
DOCUMENTAÇÃO:
|
|
553
|
+
Para mais detalhes, consulte:
|
|
554
|
+
- CLAUDE.md (Documentação para IAs)
|
|
555
|
+
- AGENTS.md (Guia para subagents)
|
|
556
|
+
- README.md (Documentação principal)
|
|
557
|
+
|
|
558
|
+
REPOSITÓRIO:
|
|
559
|
+
https://github.com/justmpm/memory-mcp
|
|
560
|
+
|
|
561
|
+
LICENÇA:
|
|
562
|
+
MIT © Koda AI Studio
|
|
612
563
|
`);
|
|
613
564
|
process.exit(0);
|
|
614
565
|
}
|