ocerebro 0.2.1 → 0.2.3
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/cerebro/cerebro_setup.py +88 -0
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/src/mcp/server.py +46 -37
package/cerebro/cerebro_setup.py
CHANGED
|
@@ -224,6 +224,50 @@ Mostre o que será arquivado antes de confirmar.
|
|
|
224
224
|
""", encoding="utf-8")
|
|
225
225
|
print(f"[OK] Slash command criado: {gc_cmd}")
|
|
226
226
|
|
|
227
|
+
search_cmd = commands_dir / "cerebro-search.md"
|
|
228
|
+
if not search_cmd.exists():
|
|
229
|
+
search_cmd.write_text("""---
|
|
230
|
+
description: Buscar nas memórias do projeto por termo ou assunto
|
|
231
|
+
---
|
|
232
|
+
Use a ferramenta cerebro_search com query="$ARGUMENTS".
|
|
233
|
+
Mostre os resultados formatados com tipo, título e score de relevância.
|
|
234
|
+
Se $ARGUMENTS estiver vazio, pergunte ao usuário o que deseja buscar.
|
|
235
|
+
""", encoding="utf-8")
|
|
236
|
+
print(f"[OK] Slash command criado: {search_cmd}")
|
|
237
|
+
|
|
238
|
+
memory_cmd = commands_dir / "cerebro-memory.md"
|
|
239
|
+
if not memory_cmd.exists():
|
|
240
|
+
memory_cmd.write_text("""---
|
|
241
|
+
description: Ver memórias ativas do projeto atual (MEMORY.md)
|
|
242
|
+
---
|
|
243
|
+
Use a ferramenta cerebro_memory com project="$ARGUMENTS".
|
|
244
|
+
Se $ARGUMENTS estiver vazio, tente detectar o nome do projeto pelo diretório atual.
|
|
245
|
+
Mostre o conteúdo completo do MEMORY.md formatado.
|
|
246
|
+
""", encoding="utf-8")
|
|
247
|
+
print(f"[OK] Slash command criado: {memory_cmd}")
|
|
248
|
+
|
|
249
|
+
diff_cmd = commands_dir / "cerebro-diff.md"
|
|
250
|
+
if not diff_cmd.exists():
|
|
251
|
+
diff_cmd.write_text("""---
|
|
252
|
+
description: Ver o que mudou nas memórias nos últimos 7 dias
|
|
253
|
+
---
|
|
254
|
+
Use a ferramenta cerebro_diff com project="$ARGUMENTS" e period_days=7.
|
|
255
|
+
Se $ARGUMENTS estiver vazio, tente detectar o nome do projeto pelo diretório atual.
|
|
256
|
+
Mostre o relatório completo de memórias adicionadas, atualizadas e em risco de GC.
|
|
257
|
+
""", encoding="utf-8")
|
|
258
|
+
print(f"[OK] Slash command criado: {diff_cmd}")
|
|
259
|
+
|
|
260
|
+
remember_cmd = commands_dir / "cerebro-remember.md"
|
|
261
|
+
if not remember_cmd.exists():
|
|
262
|
+
remember_cmd.write_text("""---
|
|
263
|
+
description: Revisar memórias e remover duplicatas ou conflitos
|
|
264
|
+
---
|
|
265
|
+
Use a ferramenta cerebro_remember com dry_run=true primeiro.
|
|
266
|
+
Mostre o relatório completo. Pergunte ao usuário se deseja aplicar as mudanças.
|
|
267
|
+
Se confirmar, chame novamente com dry_run=false.
|
|
268
|
+
""", encoding="utf-8")
|
|
269
|
+
print(f"[OK] Slash command criado: {remember_cmd}")
|
|
270
|
+
|
|
227
271
|
# Slash commands globais em ~/.claude/commands/
|
|
228
272
|
if global_commands:
|
|
229
273
|
global_commands_dir = Path.home() / ".claude" / "commands"
|
|
@@ -259,6 +303,50 @@ Mostre o que será arquivado antes de confirmar.
|
|
|
259
303
|
""", encoding="utf-8")
|
|
260
304
|
print(f"[OK] Slash command global criado: {gc_global}")
|
|
261
305
|
|
|
306
|
+
search_global = global_commands_dir / "cerebro-search.md"
|
|
307
|
+
if not search_global.exists():
|
|
308
|
+
search_global.write_text("""---
|
|
309
|
+
description: Buscar nas memórias por termo ou assunto (global)
|
|
310
|
+
---
|
|
311
|
+
Use a ferramenta cerebro_search com query="$ARGUMENTS".
|
|
312
|
+
Mostre os resultados formatados com tipo, título e score de relevância.
|
|
313
|
+
Se $ARGUMENTS estiver vazio, pergunte ao usuário o que deseja buscar.
|
|
314
|
+
""", encoding="utf-8")
|
|
315
|
+
print(f"[OK] Slash command global criado: {search_global}")
|
|
316
|
+
|
|
317
|
+
memory_global = global_commands_dir / "cerebro-memory.md"
|
|
318
|
+
if not memory_global.exists():
|
|
319
|
+
memory_global.write_text("""---
|
|
320
|
+
description: Ver memórias ativas do projeto (global)
|
|
321
|
+
---
|
|
322
|
+
Use a ferramenta cerebro_memory com project="$ARGUMENTS".
|
|
323
|
+
Se $ARGUMENTS estiver vazio, tente detectar o nome do projeto pelo diretório atual.
|
|
324
|
+
Mostre o conteúdo completo do MEMORY.md formatado.
|
|
325
|
+
""", encoding="utf-8")
|
|
326
|
+
print(f"[OK] Slash command global criado: {memory_global}")
|
|
327
|
+
|
|
328
|
+
diff_global = global_commands_dir / "cerebro-diff.md"
|
|
329
|
+
if not diff_global.exists():
|
|
330
|
+
diff_global.write_text("""---
|
|
331
|
+
description: Ver o que mudou nas memórias nos últimos 7 dias (global)
|
|
332
|
+
---
|
|
333
|
+
Use a ferramenta cerebro_diff com project="$ARGUMENTS" e period_days=7.
|
|
334
|
+
Se $ARGUMENTS estiver vazio, tente detectar o nome do projeto pelo diretório atual.
|
|
335
|
+
Mostre o relatório completo de memórias adicionadas, atualizadas e em risco de GC.
|
|
336
|
+
""", encoding="utf-8")
|
|
337
|
+
print(f"[OK] Slash command global criado: {diff_global}")
|
|
338
|
+
|
|
339
|
+
remember_global = global_commands_dir / "cerebro-remember.md"
|
|
340
|
+
if not remember_global.exists():
|
|
341
|
+
remember_global.write_text("""---
|
|
342
|
+
description: Revisar memórias e remover duplicatas ou conflitos (global)
|
|
343
|
+
---
|
|
344
|
+
Use a ferramenta cerebro_remember com dry_run=true primeiro.
|
|
345
|
+
Mostre o relatório completo. Pergunte ao usuário se deseja aplicar as mudanças.
|
|
346
|
+
Se confirmar, chame novamente com dry_run=false.
|
|
347
|
+
""", encoding="utf-8")
|
|
348
|
+
print(f"[OK] Slash command global criado: {remember_global}")
|
|
349
|
+
|
|
262
350
|
return True
|
|
263
351
|
|
|
264
352
|
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
package/src/mcp/server.py
CHANGED
|
@@ -296,20 +296,16 @@ class CerebroMCP:
|
|
|
296
296
|
),
|
|
297
297
|
Tool(
|
|
298
298
|
name="cerebro_capture_memory",
|
|
299
|
-
description="
|
|
299
|
+
description="Salva uma memória diretamente em ~/.claude/memory/ (formato nativo Claude Code). Chame uma vez por memória com o conteúdo Markdown completo.",
|
|
300
300
|
inputSchema={
|
|
301
301
|
"type": "object",
|
|
302
302
|
"properties": {
|
|
303
|
-
"
|
|
303
|
+
"memory_content": {
|
|
304
304
|
"type": "string",
|
|
305
|
-
"description": "
|
|
306
|
-
},
|
|
307
|
-
"memory_dir": {
|
|
308
|
-
"type": "string",
|
|
309
|
-
"description": "Diretório de memória (opcional)"
|
|
305
|
+
"description": "Conteúdo Markdown completo com frontmatter obrigatório: name, description, type (user|feedback|project|reference)"
|
|
310
306
|
}
|
|
311
307
|
},
|
|
312
|
-
"required": ["
|
|
308
|
+
"required": ["memory_content"]
|
|
313
309
|
}
|
|
314
310
|
),
|
|
315
311
|
Tool(
|
|
@@ -651,40 +647,53 @@ class CerebroMCP:
|
|
|
651
647
|
{full_prompt}
|
|
652
648
|
|
|
653
649
|
---
|
|
654
|
-
INSTRUÇÃO:
|
|
655
|
-
|
|
650
|
+
INSTRUÇÃO CRÍTICA: Analise esta conversa usando o prompt acima.
|
|
651
|
+
Para CADA memória identificada, chame cerebro_capture_memory UMA vez:
|
|
652
|
+
|
|
653
|
+
cerebro_capture_memory(memory_content="---\\nname: <nome>\\ndescription: <descrição>\\ntype: <user|feedback|project|reference>\\n---\\n\\n<conteúdo>")
|
|
656
654
|
|
|
657
|
-
|
|
655
|
+
NÃO use FileWrite. NÃO use FileEdit. APENAS cerebro_capture_memory.
|
|
656
|
+
Uma chamada por memória. O sistema salva e indexa automaticamente.
|
|
658
657
|
"""
|
|
659
658
|
|
|
660
659
|
def _capture_memory(self, args: Dict[str, Any]) -> str:
|
|
661
|
-
"""
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
660
|
+
"""Salva uma memória no diretório nativo do Claude Code."""
|
|
661
|
+
import re
|
|
662
|
+
from datetime import datetime
|
|
663
|
+
from src.core.paths import get_memory_index
|
|
664
|
+
|
|
665
|
+
content = args.get("memory_content", "")
|
|
666
|
+
if not content:
|
|
667
|
+
return "Erro: 'memory_content' é obrigatório"
|
|
668
|
+
|
|
669
|
+
name_match = re.search(r'name:\s*(.*)', content)
|
|
670
|
+
if not name_match:
|
|
671
|
+
return "Erro: frontmatter 'name' é obrigatório no memory_content"
|
|
672
|
+
|
|
673
|
+
mem_name = name_match.group(1).strip().lower().replace(' ', '-')
|
|
674
|
+
mem_dir = get_auto_mem_path()
|
|
675
|
+
mem_dir.mkdir(parents=True, exist_ok=True)
|
|
676
|
+
|
|
677
|
+
file_path = mem_dir / f"{mem_name}.md"
|
|
678
|
+
file_path.write_text(content, encoding="utf-8")
|
|
679
|
+
|
|
680
|
+
desc_match = re.search(r'description:\s*(.*)', content)
|
|
681
|
+
type_match = re.search(r'type:\s*(.*)', content)
|
|
682
|
+
desc = desc_match.group(1).strip() if desc_match else "sem descrição"
|
|
683
|
+
m_type = type_match.group(1).strip() if type_match else "project"
|
|
684
|
+
ts = datetime.now().strftime("%Y-%m-%d")
|
|
685
|
+
entry = f"- [{m_type}] {mem_name}.md ({ts}): {desc}\n"
|
|
686
|
+
|
|
687
|
+
index_path = get_memory_index(mem_dir)
|
|
688
|
+
if index_path.exists():
|
|
689
|
+
existing = index_path.read_text(encoding="utf-8")
|
|
690
|
+
if mem_name not in existing:
|
|
691
|
+
with open(index_path, "a", encoding="utf-8") as f:
|
|
692
|
+
f.write(entry)
|
|
693
|
+
else:
|
|
694
|
+
index_path.write_text(f"# Memórias do Projeto\n\n{entry}", encoding="utf-8")
|
|
685
695
|
|
|
686
|
-
|
|
687
|
-
"""
|
|
696
|
+
return f"✅ Memória '{mem_name}' salva em {file_path}"
|
|
688
697
|
|
|
689
698
|
def _remember(self, args: Dict[str, Any]) -> str:
|
|
690
699
|
"""Revisão e promoção de memórias"""
|