@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/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(getAgentMemoryPath(agentName), limited, "utf-8");
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
- Gerencia memória persistente para subagents entre sessões.
260
-
261
- **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.
262
-
263
- **LOCALIZAÇÃO:** .claude/agent-memory/<agent-name>/MEMORY.md (nome do agent é normalizado: lowercase, hífens para espaços)
264
-
265
- **LIMITE:** Máximo 200 linhas (quando excedido, mantém as últimas 160 entradas + cabeçalho de alerta)
266
-
267
- ═══════════════════════════════════════════════════════════════
268
- COMANDOS DISPONÍVEIS:
269
- ═══════════════════════════════════════════════════════════════
270
-
271
- 1. **read** - a memória de um agent
272
- Uso: Carregar contexto anterior ao iniciar uma sessão
273
- - agent: (opcional) Nome do agent. Se não fornecido, usa "unknown"
274
- - Retorna: Conteúdo completo do MEMORY.md com contagem de linhas
275
- - Se não existir: Retorna mensagem de memória vazia com sugestão
276
-
277
- 2. **write** - Substitui TODO o conteúdo da memória
278
- Uso: Reorganizar, limpar ou reconstruir memória do zero
279
- - agent: (opcional) Nome do agent
280
- - content: (OBRIGATÓRIO) Novo conteúdo completo em markdown
281
- - Aplica: Limite de 200 linhas automaticamente
282
- - Retorna: Confirmação + contagem de linhas
283
-
284
- 3. **append** - Adiciona entrada ao final (COM TIMESTAMP)
285
- Uso: Salvar aprendizados incrementais sem perder histórico
286
- - agent: (opcional) Nome do agent
287
- - entry: (OBRIGATÓRIO) Texto a adicionar
288
- - Formato automático: "## [YYYY-MM-DD HH:MM:SS]\\n<entry>"
289
- - Aplica: Limite de 200 linhas automaticamente
290
- - Retorna: Timestamp + preview da entrada
291
-
292
- 4. **search** - Busca termo específico na memória
293
- Uso: Encontrar informações rápidas sem ler tudo
294
- - agent: (opcional) Nome do agent
295
- - query: (OBRIGATÓRIO) Termo de busca (case-insensitive)
296
- - Retorna: Máximo 20 ocorrências com número da linha
297
- - Se não encontrado: Mensagem clara de "nenhuma ocorrência"
298
-
299
- 5. **list** - Lista todos os agents com memória no projeto
300
- Uso: Descobrir quais agents usaram memória neste projeto
301
- - Sem parâmetros adicionais
302
- - Retorna: Lista com nome de cada agent + contagem de linhas
303
-
304
- ═══════════════════════════════════════════════════════════════
305
- QUANDO USAR CADA COMANDO:
306
- ═══════════════════════════════════════════════════════════════
307
-
308
- **USE READ:**
309
- - Ao INICIAR uma sessão de trabalho
310
- - Quando precisar entender o contexto anterior
311
- - Antes de fazer decisões baseadas em memória passada
312
-
313
- ✅ **USE APPEND:**
314
- - Ao APRENDER algo novo e importante
315
- - Ao descobrir padrões no código
316
- - Ao encontrar bugs recorrentes
317
- - Ao tomar decisões arquiteturais
318
- - Para manter cronologia de descobertas
319
-
320
- ✅ **USE WRITE:**
321
- - Quando memória estiver muito grande (perto de 200 linhas)
322
- - Para reorganizar e consolidar informações
323
- - Para remover entradas obsoletas
324
- - Para reestruturar seções (Padrões, Decisões, Bugs)
325
-
326
- ✅ **USE SEARCH:**
327
- - Para buscar informações específicas rapidamente
328
- - Para verificar se algo já foi documentado
329
- - Para encontrar padrões específicos (ex: "Zod", "TypeScript")
330
-
331
- **USE LIST:**
332
- - Para descobrir agents existentes no projeto
333
- - Para ver quantos agents usaram memória
334
- - Ao iniciar trabalho em projeto desconhecido
335
-
336
- ═══════════════════════════════════════════════════════════════
337
- EXEMPLOS DE USO:
338
- ═══════════════════════════════════════════════════════════════
339
-
340
- Exemplo 1 - Iniciar sessão e carregar memória:
341
- { "command": "read", "agent": "sentinel" }
342
-
343
- Exemplo 2 - Salvar padrão descoberto:
344
- { "command": "append", "agent": "sentinel", "entry": "Padrão: Sempre use Zod para validar inputs do usuário em todos os componentes de formulário" }
345
-
346
- Exemplo 3 - Salvar decisão arquitetural:
347
- { "command": "append", "agent": "nexus", "entry": "Decisão: Usar Zustand para estado global (mais leve que Redux) - Projeto tem até 5 stores independentes" }
348
-
349
- Exemplo 4 - Buscar informações sobre Zod:
350
- { "command": "search", "agent": "sentinel", "query": "Zod" }
351
-
352
- Exemplo 5 - Reorganizar memória grande:
353
- { "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..." }
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", "write", "append", "search", "list"],
427
- 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.",
428
371
  },
429
372
  agent: {
430
373
  type: "string",
431
- 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.',
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 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.',
440
387
  },
441
388
  query: {
442
389
  type: "string",
443
- 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.',
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", "write", "append", "search", "list"];
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 - a memória de um agent
474
- 2. write - Substitui todo o conteúdo da memória
475
- 3. append - Adiciona uma entrada ao final (com timestamp)
476
- 4. search - Busca um termo na memória
477
- 5. list - Lista todos os agents com memória no projeto
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 "write" para reorganizar memória grande ou reconstruir do zero.
505
- 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".
506
460
  `;
507
461
  break;
508
462
  }
509
- result = await handleWrite(agentName, content);
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
  }