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