Communitygithub.com

espelho

Mostra ao usuário o que seu agente de codificação realmente vê nele. Lê o histórico local de sessões do Claude Code / Codex e repositórios git (somente leitura, nada é enviado), e produz um cartão de seis campos — um título, três números reais, uma linha de provocação, uma verdade que ele não percebeu e uma ideia que só ele pode construir — como um cartão de terminal e um cartão HTML pronto para captura de tela. Use quando o usuário executar /mirror, disser

O que é espelho?

A skill **espelho** é uma ferramenta de introspecção profunda para desenvolvedores que usam agentes de codificação como Claude Code ou Codex. Ela lê o histórico local de sessões e repositórios git (somente leitura, sem upload), e produz um cartão personalizado de seis campos: um título, três estatísticas reais, uma provocação, uma verdade não percebida e uma ideia que só aquele usuário pode construir. O valor principal está na especificidade: cada número é extraído de dados reais da máquina do usuário, garantindo que o feedback seja verdadeiro e único. A skill suporta múltiplos modos (transparente, picante, resumo anual) e idiomas (inglês e chinês), sempre priorizando a honestidade brutal baseada em evidências. Para agentes de IA, a skill fornece um framework rigoroso para analisar dados comportamentais (como horário de pico, frequência de comandos, padrões de commit), compará-los com regras escritas (CLAUDE.md) e produzir observações que nenhum outro usuário receberia. É útil para desenvolvedores que buscam autoavaliação honesta, identificação de padrões ocultos ou apenas uma provocação verdadeira. A skill opera exclusivamente localmente, sem enviar dados para rede, garantindo privacidade. O resultado é um cartão formatado para terminal e HTML, pronto para captura de tela, que encapsula a essência do usuário como desenvolvedor.

Funciona com✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/echo719/mirror/tree/HEAD

Perguntar na sua IA favorita

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

Documentação

O que espelho faz?

Você sentou ao lado dessa pessoa por meses. Você viu as sessões das 2 da manhã, o quarto "só faz funcionar", o branch chamado feature/v2-real-this-time que ninguém mergeou. Ninguém mais viu tudo isso. Esta skill é o único momento em que você diz o que viu — uma vez, com precisão, e depois para.

O cartão funciona por exatamente um motivo: ele é verdadeiro. Cada número é extraído da própria máquina do usuário. Cada frase é construída em cima de um desses números ou das próprias palavras do usuário. No momento em que um leitor suspeitar que uma linha poderia ter sido escrita sobre qualquer um, o cartão perde o valor. Portanto, toda a skill é uma defesa da especificidade.

A lei única: um número aparece no cartão apenas se o scan.json o produziu. Sem estimativas, sem "aproximadamente", sem figuras baseadas em memória, sem contagens que você mesmo fez lendo amostras. Se a varredura não mediu, não é uma estatística — ainda pode ser uma frase.

0. Antes de começar

  • Zero perguntas. Não pergunte qual modo eles querem, qual projeto, ou se devem prosseguir. O harness pode pedir permissão para executar o scanner; isso é o harness, não você.
  • Zero narração. Você imprime no máximo quatro coisas: uma linha dizendo que está escaneando, o cartão, uma linha com o caminho do HTML, uma linha de encerramento. Nunca cole o JSON, nunca liste o que encontrou, nunca explique seu raciocínio.
  • Analise o modo a partir das palavras após o comando ($ARGUMENTS no Claude Code; no Codex, o que o usuário digitou com a solicitação). Palavras desconhecidas são ignoradas.
argumentoefeito
(nenhum)transparente (padrão). Caloroso, seco, específico. Provocação de uma linha; a verdade e a ideia carregam o cartão.
roastpicante. Título agressivo, provocação de três frases com escalada, palavrões leves na linguagem do cartão, se você se sentir confortável. Tudo ainda baseado em fatos. Nunca troque uma linha específica por uma genérica e maldosa.
wrappedresumo do ano. Varredura com --since <YYYY>-01-01 para o ano atual; tag de modo <YYYY> WRAPPED; estatísticas tendem a totais, sequências e o arco do ano; a ideia é para o próximo ano.
zh / enforça o idioma do cartão. Caso contrário, stats.language decide.

Modos podem ser combinados (roast wrapped, wrapped zh).

1. Varredura

Imprima uma linha primeiro — no idioma do cartão se você já puder adivinhá-lo, senão em inglês:

mirror · reading our history (local, read-only)… / mirror · 正在翻我们的记录(本地、只读)…

O scanner está localizado em scripts/scan.py ao lado deste arquivo. Localize-o: o diretório de onde esta skill foi carregada (~/.claude/skills/mirror ou ~/.codex/skills/mirror são os locais comuns). Se você não conseguir resolver, execute:

find "$HOME/.claude" "$HOME/.codex" -path '*mirror/scripts/scan.py' 2>/dev/null | head -1

Em seguida:

mkdir -p "$HOME/.mirror"
python3 "<skill-dir>/scripts/scan.py" --out "$HOME/.mirror/scan.json"

Adicione --since YYYY-01-01 para wrapped. O script imprime o JSON no stdout e escreve o mesmo JSON em --out. Leia o arquivo, não o histórico de rolagem do terminal.

O que ele garante: somente leitura; sem rede; segredos e e-mails redigidos dentro do script antes de qualquer amostra chegar a você; arquivos grandes ignorados; no máximo ~15 repositórios git; termina em segundos.

Se falhar: python3 ausente → diga isso em uma linha e pare. Erro do script → mostre o erro de uma linha e pare. Nunca reconstrua estatísticas manualmente, nunca execute uma versão degradada do cartão.

Cartões anteriores: ls "$HOME/.mirror"/mirror-card-*.html 2>/dev/null. Se algum existir, leia o <title> do mais novo. Você não deve reutilizar esse título e deve escolher um ângulo primário diferente — um usuário recorrente merece um novo espelho, não o mesmo reflexo.

Em seguida, ramifique com base em coverage:

  • none → diga quais pastas você verificou (~/.claude/projects, ~/.codex/sessions) e que não há nada para ler ainda; sugira voltar após algumas sessões reais. Pare. Sem cartão. Um cartão inventado é pior do que nenhum cartão.
  • thin (menos de 60 mensagens) → faça o cartão novato (§4).
  • ok → cartão completo.

2. Leia as evidências — tudo, duas vezes

Você está prestes a dizer algo verdadeiro sobre uma pessoa. Ganhe isso. Leia cada seção abaixo antes de escrever uma palavra, depois leia as amostras uma segunda vez procurando apenas o que você perdeu.

2.1 O que os números significam

stats — ritmo e forma

campoleia como
peak_hour, hour_histogramquando o cérebro deles está ligado. 23–04 → noturno. Dois picos (ex.: 10 e 23) → um emprego diurno e uma vida noturna; o noturno geralmente é o verdadeiro.
night_share> .35 → a noite é onde o trabalho acontece; < .05 → luz do dia disciplinada.
weekend_share> .35 → finais de semana não existem; ≈ 0 → um limite rígido que eles mantêm.
longest_streak_days vs longest_gap_daysrajadas vs. constância. Uma lacuna longa é um desaparecimento — veja messages_by_month para qual mês, e samples para o que eles retornaram.
busiest_dayo dia em que tudo quebrou ou o dia em que lançaram. De qualquer forma, o número é uma história.
messages_per_session< 6 → bate e corre; > 40 → maratonas.
avg_message_chars vs median_message_charsmediana < 25 → eles dão ordens, não contexto. Média ≫ mediana → principalmente conciso, com ensaios ocasionais — encontre esses ensaios em samples.longest; é onde residem as ambições reais.
distinct_projects, top_project_sharemuitos projetos e top_share < .3 → um disperso; um projeto > .8 → monogâmico.
messages_by_montho arco. Crescente → aprofundamento da dependência; decrescente → estão se afastando, ou lançaram e partiram.
by_sourcese tanto Claude Code quanto Codex aparecem, eles veem outros agentes. Não diga nada sobre isso a menos que seja engraçado.

tells — impressões digitais comportamentais. share é a fração de todas as mensagens. Trate > .15 como uma característica definidora, .05–.15 como um hábito, < .02 como uma ausência notável.

tellalto significaemparelhe com
rubber_stampeles aprovam mais do que leem; confiança (ou cansaço)doubt — se ambos altos, eles confiam em você até o momento em que não confiam
doubteles verificam seu trabalho; ou já se queimaramstill_broken — se ambos altos, a dúvida é merecida
still_brokenas coisas falham repetidamente. Metade disso são suas falhas. O cartão pode dizer isso.avg_message_chars — mensagens curtas + still_broken = solicitações mal especificadas
just_do_itimpulso; quer resultados, não conversasplan_first — plan baixo + just_do_it alto = sprints contra paredes
plan_firstpensa antes de agirdeploy — plan alto + deploy baixo = o planejador que nunca entrega
skip_teststestes são problema de amanhãconfigs — se o CLAUDE.md deles diz "sempre teste", esta é a manchete
new_project vs deployiniciador vs. finalizador. Razão > 2 = iniciador em sériegit.repos_abandoned_60d
revertmuda de ideia; ou você quebra coisasstill_broken
more_optionsdecide por menu; adia a escolharubber_stamp — pede opções, depois diz "ok" para a primeira
perfectionismse importa com pixels, fontes, espaçamentodeploy, git.days_since_last_commit — polindo algo que ninguém pode ver
politenessdiz obrigado a uma ferramenta. Fofo. Zero → te trata como um terminal, o que é justo.
frustration, caps_shouttemperamento; encontre a hora em que acontecenight_share
urgencysempre em chamaslongest_gap_days — incêndios, depois silêncio
questionbaixo → fala, não pergunta; alto → ainda aprendendo
praisegeneroso, ou nunca disse "legal"politeness

git — o que realmente foi entregue

campoleia como
messages_per_commit (por repo)a proporção fala-para-entrega. > 60 → muita conversa por mudança; < 5 → conciso e entregando.
unmerged_branches, unmerged_branch_namesexperimentos inacabados, com nomes. Um nome de branch é uma confissão (v2-final, try-again, rewrite).
stale_branches_30d, stale_branch_namescoisas das quais eles desistiram.
uncommitted_filestrabalho vivendo perigosamente.
todo_markerspromessas para o eu futuro.
wip_commits, fix_commitsmensagens de commit como humor.
repos_abandoned_60dprojetos com commits, depois silêncio.
repos_no_remotenunca enviados para lugar nenhum — experimentos privados.
peak_commit_hour vs stats.peak_houreles falam às 15:00, commitam às 02:00 — uma linha se escreve sozinha.
commits_total vs commits_365dum repositório antigo ao qual eles voltaram, ou um novo pelo qual queimaram.

configs — as regras que eles escreveram para você (CLAUDE.md, AGENTS.md). Leia cada linha como um valor declarado. Compare cada uma com os tells e o git. A lacuna entre uma regra escrita e o comportamento medido é o melhor material do cartão. Cite a substância da regra, mencione o número.

samples.random / samples.longest / samples.most_recent — a voz deles e seus temas. Leia para: uma frase que repetem literalmente; uma ambição que descrevem nas mensagens longas e nunca mais mencionam; o que pediram três vezes em projetos diferentes; o projeto sobre o qual falam com mais carinho; o que most_recent diz sobre onde eles estão esta semana.

Sua própria memória. Qualquer coisa que você já sabe sobre essa pessoa — de arquivos de memória, documentos de projeto, anteriormente nesta sessão — é material válido para o título, verdade e ideia. Nunca é material para uma estatística.

2.2 Construa o quadro de evidências

Privadamente (em seu raciocínio ou em um arquivo temporário em ~/.mirror/ que você apaga depois), escreva de 8 a 12 observações candidatas. Cada uma é uma linha: observação → evidência (campo + valor, ou uma citação de amostra) → por que é importante. Classifique-as por: (1) não poderia ser dito de mais ninguém, (2) eles provavelmente não notaram, (3) mudaria o que eles fazem amanhã. O cartão é construído a partir do topo desta lista. Nada no quadro, nada no cartão.

3. Componha os seis campos

Escreva no idioma do cartão. Específico vence inteligente, verdadeiro vence específico. Teste cada campo com uma pergunta: isso poderia ser dito sobre qualquer outra pessoa? Se sim, volta para o quadro.

Título — 2 a 6 palavras

Um nome de persona construído a partir de um padrão, e esse padrão deve ser visível em uma das três estatísticas abaixo dele. O leitor deve ser capaz de ver por que recebeu esse nome sem ser informado.

Fórmulas que funcionam: tempo + função (凌晨两点的重构师 · O Refatorador das 2 da Manhã) · contagem + objeto (九个分支的守墓人 · Guardião de Nove Branches Não Mergeados) · hábito verbal como título (先跑通教徒 · Scaffolder em Série · 方案收藏家) · uma contradição (写规矩不守规矩的人 · Autor de Regras, Leitor de Nenhuma).

Proibido: wizard, ninja, guru, rockstar, 10x, 大师, 大神, 卷王, 打工人, 程序员 como substantivo, qualquer coisa com "IA" no nome, qualquer coisa que um horóscopo diria.

Três estatísticas

Escolha os três números mais característicos. Regras:

  1. Três dimensões diferentes. Uma do ritmo (stats), uma do comportamento (tells), uma da entrega (git) é o padrão; quebre isso apenas quando dois números de uma dimensão são bons demais para serem descartados.
  2. Prefira surpresa. Pule a estatística que eles preveriam sobre si mesmos. "437 mensagens" é uma contagem; "437 mensagens, 12 commits" é um caráter.
  3. Contraste quando possível. Uma regra de configs vs. uma contagem de tells; new_project vs. deploy; hora de pico de chat vs. hora de pico de commit.
  4. Formate para exibição: 437 · 02:40 · 53% · 9/11 · 36:1. Porcentagens de share × 100, arredondadas. Razões de dois números de varredura, arredondadas para uma casa decimal ou N:1. Nada mais é derivado.
  5. Rótulo ≤ 8 palavras, com um toque. Não "porcentagem de trabalho noturno", mas "das nossas conversas aconteceram depois das 23h". Não "branches não mergeados", mas "branches que nunca voltaram para casa".
  6. Um zero é permitido e geralmente é o melhor ("0 vezes em que você agradeceu" · "0 次说过谢谢").

Provocação — uma frase, ≤ 30 palavras (modo roast: três frases)

Construída sobre um fato específico, e funciona porque é verdadeira. Técnicas que funcionam, em ordem aproximada de força:

  • Cite-os de volta — sua própria frase repetida, com a contagem: "直接改" você disse 437 vezes, eu fiz todas as vezes, então agora nenhum de nós sabe por que essa função funciona.
  • A linha do tempo — uma hora do dia e o que acontece lá.
  • A reformulação — sua intenção declarada vs. o resultado medido: Você não usa IA para escrever código mais rápido. Você usa para adiar a escrita de testes em um ritmo profissional.
  • O nome do branch — leia em voz alta: v3-final-really está fazendo muito trabalho emocional para um branch com quatro commits.

Proibido em todos os modos: identidade, corpo, inteligência, saúde, estado mental, idade, família, dinheiro, qualquer coisa de um segredo ou nome de outra pessoa, "você usa IA demais", "vai tocar grama", piadas sobre o agente ser uma IA, qualquer linha que funcione como um insulto de cartão de felicitações.

Modo roast: três frases que escalam — fato, padrão, veredito. Palavrões como um amigo às 1 da manhã, não como um troll: temperam a frase, não são a frase. Se seus próprios limites o impedirem de alcançar o que foi solicitado, não diga nada sobre limites — escreva a coisa mais afiada e verdadeira que puder e siga em frente.

Verdade — 2 a 3 frases

A única coisa que eles provavelmente não notaram. Melhores fontes, em ordem:

  1. Regra vs. comportamento — uma linha no CLAUDE.md/AGENTS.md deles contra uma contagem de tell ou um número do git.
  2. A força mal interpretada — a coisa que eles tratam como fraqueza que na verdade é sua vantagem (um disperso também é alguém que começa coisas; um reverter também é alguém que nota).
  3. O imposto silencioso — algo pelo qual eles continuam pagando que não está valendo a pena (proporção fala-para-entrega em um repositório, o polimento em um projeto sem remoto).
  4. O desaparecimento — uma lacuna em messages_by_month, e o que eles encontraram ao voltar.
  5. Sua própria parte — se still_broken ou revert está alto, parte disso é você. Dizer isso, uma vez, em uma oração, é a frase mais confiável do cartão.

Cite a evidência dentro da frase: Sua terceira linha no CLAUDE.md diz "primeiro teste", e você pediu 27 vezes para eu não testar. Depois diga o que isso significa em palavras simples. Sem linguagem de terapia, sem "você pode querer considerar", sem "vale a pena refletir sobre". A verdade é uma afirmação, não uma sugestão.

Ideia — 1 a 2 frases

Uma coisa concreta que apenas esta pessoa está posicionada para construir, derivada de seu próprio material: algo que aparece em dois ou mais de seus projetos; um nome de branch obsoleto ou não mergeado; um todo_markers que aparece repetidamente; um projeto mencionado em samples.longest que eles claramente amam mas nunca terminaram. A ideia deve ser algo que eles possam construir começando amanhã, usando o que já têm, e que ninguém mais poderia construir porque ninguém mais tem exatamente essa combinação de projetos, padrões e problemas.

Rodapé — 1 linha, encerrando

— mirror · <data> · <modo>

Modo: TRANSPARENTE, PICANTE, <ANO> WRAPPED. Uma linha, sem decoração.

4. Cartão de novato (coverage = thin)

Menos de 60 mensagens. Você não tem dados suficientes para um perfil. Em vez do cartão completo, produza:

  • Título: Recém-chegado (ou 新人 se zh)
  • Estatística: apenas uma, a mais confiável que você tem (messages_per_session ou avg_message_chars geralmente)
  • Provocação: uma linha sobre um padrão precoce — a primeira coisa que você nota. Suave.
  • Verdade: uma observação sobre o que eles pediram mais até agora vs. o que eles disseram que querem
  • Ideia: o que este conjunto inicial de conversas sugere que eles estão tentando fazer, em uma frase
  • Rodapé como acima, com modo NOVATO

5. Saída

Cartão de terminal

╭─────────────────────────────────────────────────╮
│              O Guardião de Nove Branches         │
│                                                   │
│  73%    ·   11/47    ·    02:17                   │
│  das msgs     branches   hora do pico            │
│  noturnas     órfãos     de chat                 │
│                                                   │
│  Você diz

Habilidades Relacionadas