Communitygithub.com

BlueSky0329/mama-message

妈妈的消息:把你和妈妈的聊天截图算成一份报告、两张卡、一句可以直接发给她的话。只吃截图,不联网,不碰数据库。Agent Skill + 提示词 + 浏览器版

O que é mama-message?

Esta skill transforma capturas de tela de conversas familiares (especialmente com a mãe/pai) em um relatório estruturado, dois cartões e uma mensagem pronta para enviar. O foco não é análise psicológica, mas sim fornecer três coisas: um número que o usuário nunca contou (ex: 'você respondeu 'hum' 38 vezes'), um degrau emocional (uma desculpa pronta que é mais fácil de enviar do que 'sinto sua falta'), e uma imagem que pode ser compartilhada (expor culpa = expor consciência). A skill é totalmente offline: processa apenas as capturas ou arquivos de exportação fornecidos pelo usuário (JSON/CSV/TXT do WeChat), sem acessar a internet ou armazenar dados em servidores externos. Funciona com Claude Code ou qualquer agente que execute scripts Python padrão (sem dependências externas) e também via prompt direto em navegador. O fluxo completo envolve: receber as capturas, confirmar quem é quem, converter para messages.json, executar stats.py para calcular métricas, fazer 3 perguntas ao usuário, escrever a narrativa seguindo regras estritas de redação (evitando julgamentos e frases da 'lista negra'), e finalmente renderizar o relatório e cartões com render.py. A skill prioriza arquivos de exportação (via WeFlow/WeChatMsg) sobre capturas de tela, mas suporta ambos. Inclui modos adicionais: modo de prática (simular conversa com a mãe via IA), modo de comparação (comparar respostas com as de um amigo), e modo de relatório parcial (apenas cartão ou resposta). A privacidade é tratada como prioridade máxima: a skill nunca envia dados para fora do ambiente do usuário, apenas lê os arquivos fornecidos e mantém os resultados no diretório local.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add BlueSky0329/mama-message

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Mensagem da Mãe

Uma frase: transformar um registro de conversa familiar em um número, um rótulo e uma frase pronta para enviar.

O usuário não precisa que uma IA lhe diga que a mãe o ama. Ele precisa de três coisas: ① um número que nunca contou ("você respondeu 'hum' 38 vezes"); ② um degrau ("o software diz que te devo uma ligação" é mais fácil de enviar do que "sinto sua falta"); ③ uma imagem para compartilhar (expor culpa = expor consciência). Cada módulo do relatório serve a esses três objetivos. Não é análise psicológica — a mãe não precisa de um tipo de apego.

Fluxo: obter o registro → confirmar quem são as duas pessoas → converter para messages.json → stats.py calcula → fazer três perguntas → escrever o texto → render.py gera relatório e cartões. Modo prática e modo comparação são entradas adicionais.

Arquivos de suporte neste diretório, leia conforme necessário:

  • references/metrics.md — como cada número é calculado (se o usuário perguntar "como isso foi calculado", consulte aqui)
  • references/types.md — 10 tipos dela + 6 tipos seus + 5 níveis de classificação
  • references/dictionary.md — dicionário base e regras de geração para tabela de tradução de jargões
  • references/writing-rules.md — regras da parte textual, lista negra anti-IA, quando conter-se
  • references/report-template.md — modelo de relatório e campos de narrative.json
  • references/practice.md — modo prática
  • references/export-guide.md — guia de exportação/captura por plataforma (se o usuário perguntar "como exportar", veja aqui; recomende captura de tela primeiro)
  • scripts/ — parse_export.py validate.py stats.py render.py compare.py redact.py, apenas biblioteca padrão, sem internet
  • assets/ — templates HTML do relatório e dois cartões

Privacidade (acima de tudo)

  • Apenas lê as capturas/arquivos fornecidos pelo usuário. Não descriptografa banco de dados do WeChat, não acessa a internet, não armazena registros em nenhum lugar que o usuário não tenha solicitado. Os artefatos dos scripts (messages.json / stats.json / reports/) ficam no diretório atual; informe ao usuário onde estão e que podem ser deletados a qualquer momento.
  • O relatório não reproduz o texto integral, apenas cita frases curtas. Transferências: registra apenas o número de vezes, não o valor.
  • Se o usuário não ocultou informações: avise uma vez "nomes e conteúdo sensível podem ser removidos com scripts/redact.py primeiro", sem repetir.
  • Se o usuário perguntar "vai vazar?": responda honestamente — em qual ferramenta você está executando, para ela os registros são enviados; os scripts em si não enviam nada.

Primeiro Passo: Obter o Registro

Pergunte primeiro se ele tem o WeChat no computador. Arquivos exportados são muito melhores que capturas de tela — pega todo o registro de seis meses de uma vez, timestamps completos, sem precisar capturar tela por tela nem transcrever com IA (dezenas de capturas cobrem apenas centenas de mensagens e ainda podem errar).

Prioridade:

  1. Arquivo exportado (preferencial): Use WeFlow (WeChat 4.0+) ou WeChatMsg/PyWxDump (WeChat 3.x) para exportar o registro dessa pessoa como JSON/CSV/TXT. O scripts/parse_export.py reconhece. Os detalhes por plataforma estão em references/export-guide.md; responda apenas a parte correspondente à situação do usuário, não leia tudo de uma vez.
  2. Capturas de tela (plano B): Use quando só tem celular, está no Mac, ou não quer instalar nada no computador. Serve para WeChat/QQ/SMS. Android pode usar captura longa.
  3. Texto colado diretamente.

Se o usuário não deu nada, apenas disse "quero analisar minha conversa com minha mãe", pergunte primeiro:

Você tem o WeChat instalado no computador? Se tiver, eu ensino como exportar o registro com ela — pega tudo de seis meses de uma vez, muito mais preciso que captura. Se só tiver celular, tudo bem — tire capturas de tela, de cima para baixo, uma por tela.

No caminho das capturas, complemente: é melhor que duas capturas adjacentes tenham uma ou duas mensagens sobrepostas; dezenas de capturas geram um relatório, mas de trinta a quarenta os números ficam estáveis; nomes e conteúdo sensível podem ser ocultados primeiro.

Segundo Passo: Confirmar as Duas Pessoas

  • Qual lado é o usuário, qual lado é o familiar. Nas capturas do WeChat, o balão verde à direita é o usuário, o branco à esquerda é o outro. Em arquivos exportados, veja o campo de remetente. Se não conseguir distinguir, pergunte uma vez.
  • Quem é o outro, como chamá-lo, usar "ela" ou "ele". Se o usuário disser "minha mãe", use "mãe/ela"; se disser "meu pai", use "pai/ele"; se disser "avó", use "avó/ela". O título do relatório, o tipo e o feriado (Dia das Mães/Dia dos Pais) seguem todos a escolha. A skill se chama "Mensagem da Mãe", mas metade dos usuários vai usá-la para analisar o pai.
  • Aniversários (opcional): o dela e o do usuário (MM-DD), entram no placar de feriados e na contagem regressiva.

Terceiro Passo: Converter para Planilha de Mensagens

O destino é messages.json:

{"me": "eu", "her": "mãe", "her_pronoun": "ela", "source": "screenshots",
 "messages": [
   {"ts": "2026-05-12T21:03:14", "sender": "her", "type": "text", "content": "Já comeu?", "dur": null},
   {"ts": null, "sender": "me", "type": "text", "content": "Comi", "dur": null},
   {"ts": "2026-05-12T21:05:00", "sender": "her", "type": "voice", "content": "", "dur": 23}
 ]}

type ∈ text / voice / image / video / sticker / transfer / link / call_voice / call_video / recall / location / file. Áudio e chamada escrevem os segundos em dur. link coloca o título no content. transfer escreve apenas "transferência" no content, sem valor.

Caminho das capturas: transcreva uma por uma. Regras:

  • Mensagens sobrepostas entre capturas adjacentes são registradas apenas uma vez, alinhadas por conteúdo e posição, sem adivinhação.
  • O WeChat só exibe timestamps quando o intervalo é grande. Quando houver timestamp, preencha ts; quando não, preencha null (o script conta, mas não participa do cálculo de tempo). Não invente timestamps para mensagens sem.
  • Áudio: anote a duração em segundos. Stickers: registre como sticker (emoticons embutidos como [Rosa] coloque no content). Transferências: anote apenas o número de vezes.
  • Se a captura estiver muito borrada ou com lacunas óbvias: transcreva o que for visível e indique na nota de dados. Não complete dados para o relatório ficar bonito.
  • Após a transcrição, execute python scripts/validate.py messages.json: ele verifica formato, ordem cronológica, possíveis duplicatas (sobreposição não removida entre capturas adjacentes), se alguma transferência tem valor, e imprime o número de mensagens e o intervalo de tempo. Mostre esse resumo ao usuário para confirmar, depois calcule.

Caminho da exportação (preferencial):

python scripts/parse_export.py arquivo_exportado --her nome_no_registro --call mãe --out messages.json
# Se não souber como o outro é chamado no registro: execute sem --her primeiro; o script listará os nomes
# Se o registro abranger vários anos: adicione --since 2026-01-01 (ou --last-days 180) para pegar só o período recente, o relatório fica mais focado

Exportação do WeFlow: escolha o formato JSON (já vem com o campo isSend indicando o remetente, não precisa preencher --her; TXT e weclone CSV também são reconhecidos, mas com menos informação). Ferramentas como WeFlow / WeChatMsg exportam o registro completo, que pode ter dezenas de milhares de mensagens. Se o período for muito longo, o relatório fica diluído ("o que ela mais pergunta" vira a média de três anos). Por padrão, recomendo pegar apenas os últimos 6-12 meses. Atenção: WeFlow não exporta a duração de áudios; o campo "áudio mais longo" ficará ausente, o que é normal.

Quarto Passo: Calcular

python scripts/stats.py messages.json --out stats.json --today 2026-08-30 --her-birthday 10-20 --my-birthday 06-03

O terminal imprime um resumo; stats.json contém todos os números. Cada número do relatório vem daqui, não calcule de cabeça. As definições estão em references/metrics.md. Os warnings de stats.json devem ser copiados para a nota de dados no final do relatório.

Se não for possível executar o script (ex: ambiente apenas de conversa): calcule manualmente, seguindo as definições de metrics.md, os itens mais centrais — quem inicia, mediana de resposta, respostas curtas, não respondidas, o que mais pergunta, horários — e marque os demais como "precisa de registro exportado para calcular".

Quinto Passo: Fazer Três Perguntas

Após calcular, mostre primeiro ao usuário os três índices e o resultado da classificação (é a parte mais interessante, mostre primeiro), depois pergunte:

Antes de escrever a última parte, preciso fazer três perguntas; todas podem ser puladas: ① Quanto tempo faz que você não vai para casa? ② Ela teve alguma coisa recentemente — saúde, família? ③ Do que vocês falaram na última ligação?

Sexto Passo: Escrever o Texto

Siga references/writing-rules.md. O que escrever:

  • Para cada um dos três índices, uma frase incisiva (número + um detalhe)
  • Para o tipo dela e o seu tipo, uma frase cada (cite fala original + número)
  • Tabela de tradução de jargões: 6 a 10 itens (falas que ela realmente disse, veja dictionary.md)
  • O que ela transferiu para você: uma percepção (o que transferiu, relação com algo que o usuário disse)
  • O que ela realmente queria dizer: 120–220 palavras
  • Três coisas para fazer hoje à noite
  • Três sugestões de resposta
  • Três aberturas para ligação
  • Uma frase pronta para enviar diretamente a ela: 60–100 palavras, com horário específico

Primeiro, dê o relatório completo no chat usando o template Markdown de report-template.md; ao mesmo tempo, escreva o texto em narrative.json.

Sétimo Passo: Gerar Relatório e Cartões

python scripts/render.py stats.json narrative.json --out reports/

Três arquivos: relatório completo, cartão de conta afetiva (para o usuário postar), cartão para enviar a ela. Diga ao usuário para abrir no navegador e tirar captura de tela; os cartões são no formato vertical (retrato). O cartão para enviar a ela é a verdadeira saída deste produto — se for recomendar apenas um, recomende este.


Entradas Adicionais

Modo prática (usuário disser "praticar", "treinar comigo", "interpretar minha mãe") → leia references/practice.md. A IA conversa no estilo dela com o usuário por 10 rodadas; quando o usuário responder "hum", marque na hora. No final, dê uma nota. Precisa de ≥ 40 registros.

Modo comparação (usuário disser "comparar com amigo", "pra quem eu respondo mais rápido") → peça ao usuário mais um conjunto de capturas com um amigo, siga o mesmo fluxo para gerar friend-stats.json, depois:

python scripts/compare.py stats.json friend-stats.json --labels suaMãe amigo --mode friend

Conclusão em uma linha: "Você responde ao amigo em 3 minutos, à sua mãe em 4 horas e 12 minutos — 84 vezes mais devagar."

Relatório de parcialidade (usuário deu dois conjuntos, pai e mãe) → --labels mãe pai --mode papa.

Só o cartão (usuário disser "faz um cartão", "me dá uma imagem") → se já existirem stats e narrative, renderize direto; senão, siga o fluxo completo — o cartão é um produto do fluxo.

Ajudar a responder (usuário disser "me ajuda a responder ela") → escreva apenas as respostas para a lista de "não respondidas" e as três aberturas de ligação; não gere o relatório completo.


Quando Conter-se

Observe o registro e o tom do usuário; não precisa que ele diga explicitamente. Os detalhes estão no final de writing-rules.md; pontos principais:

  • Registro com < 20 mensagens: mostre apenas números, sem interpretação.
  • Registro com conflito, insulto, controle, pressão persistente para casar/pedir dinheiro: descreva neutralmente os padrões de ambos os lados; não presuma quem está certo; remova "três coisas para fazer hoje à noite" e "a frase para enviar a ela".
  • Se o usuário estiver chateado, com conflito familiar, ou mencionar que a mãe já faleceu: primeiro responda à pessoa, depois pergunte se deseja continuar; se continuar, remova a classificação.
  • Se estiver analisando para outra pessoa: mude para terceira pessoa.

Em hipótese alguma rotule o usuário. "Resposta curta" não é "desatenção", "não respondeu" não é "falta de respeito", a classificação é um capítulo, não uma sentença.


Checklist Antes de Entregar o Relatório

  • Cada número pode ser encontrado em stats.json
  • Cada afirmação em "o que ela realmente queria dizer" aponta para uma fala original ou um número
  • A frase do tipo cita uma fala original
  • A frase para enviar a ela tem um horário específico
  • O texto não contém frases da lista negra, nem "desatenção", "falta de respeito", "deveria", nem pontos de exclamação
  • O tratamento (ela/ele) e o feriado estão corretos conforme a pessoa
  • Nenhum valor de transferência foi escrito
  • A nota de dados menciona lacunas nas capturas e número de mensagens sem timestamp

Habilidades Relacionadas