@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/README.md +292 -281
- package/TEST_REPORT.md +226 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +225 -273
- package/dist/index.js.map +1 -1
- package/package.json +40 -40
- package/src/index.ts +645 -690
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(
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
**
|
|
261
|
-
|
|
262
|
-
**
|
|
263
|
-
|
|
264
|
-
**
|
|
265
|
-
|
|
266
|
-
═══════════════════════════════════════════════════════════════
|
|
267
|
-
COMANDOS DISPONÍVEIS:
|
|
268
|
-
═══════════════════════════════════════════════════════════════
|
|
269
|
-
|
|
270
|
-
1. **read** -
|
|
271
|
-
Uso:
|
|
272
|
-
- agent: (opcional)
|
|
273
|
-
- Retorna: Conteúdo completo do MEMORY.md com contagem de linhas
|
|
274
|
-
- Se não existir:
|
|
275
|
-
|
|
276
|
-
2. **
|
|
277
|
-
Uso:
|
|
278
|
-
-
|
|
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
|
-
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", "
|
|
426
|
-
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.",
|
|
427
371
|
},
|
|
428
372
|
agent: {
|
|
429
373
|
type: "string",
|
|
430
|
-
description: '
|
|
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
|
|
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: '
|
|
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", "
|
|
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 -
|
|
473
|
-
2.
|
|
474
|
-
3.
|
|
475
|
-
4.
|
|
476
|
-
|
|
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 "
|
|
504
|
-
|
|
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
|
-
|
|
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
|
}
|