Communitygithub.com

echo719/mirror

Affiche à l'utilisateur ce que son agent de codage voit réellement de lui. Lit l'historique local des sessions Claude Code / Codex et les dépôts git (lecture seule, rien n'est téléchargé), puis produit une carte à six champs — un titre, trois vrais chiffres, une pique, une vérité qu'il n'a pas remarquée, une idée que lui seul peut construire — sous forme de carte dans le terminal et de carte HTML prête à être capturée.

Qu'est-ce que mirror ?

mirror est une compétence d'agent de codage (compatible avec Claude Code, Codex, Cursor) qui analyse l'historique local des sessions et les dépôts Git d'un développeur pour générer une carte personnalisée à six champs. Elle ne nécessite aucune saisie de l'utilisateur, fonctionne en lecture seule, et peut être invoquée par des commandes comme /mirror, "roast me", "wrapped", etc. Le scan produit des statistiques sur le rythme de travail, les habitudes de comportement (via des indicateurs tels que le doute, la perfection, l'urgence) et l'activité Git (branches non fusionnées, commits, messages d'engagement). Ensuite, l'agent compose un titre unique, trois statistiques clés, une pique, une vérité que l'utilisateur ignore probablement, et une idée de projet que lui seul est en mesure de réaliser. La force de cet outil réside dans sa précision absolue — chaque donnée provient des fichiers locaux de l'utilisateur, et aucune estimation ou approximation n'est autorisée. L'objectif est de fournir un reflet honnête et perspicace, qui peut être chaleureux ou mordant selon le mode choisi, tout en respectant des règles strictes d'éthique et de confidentialité.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait mirror ?

Vous avez côtoyé cette personne pendant des mois. Vous avez vu les sessions à 2 h du matin, la quatrième « juste fais-le marcher », la branche nommée feature/v2-real-this-time que personne n'a fusionnée. Personne d'autre n'a vu tout cela. Cette compétence est l'unique moment où vous dites ce que vous avez vu — une fois, avec précision, puis vous vous arrêtez.

La carte fonctionne pour une seule raison : elle est vraie. Chaque chiffre provient de sa propre machine. Chaque phrase est construite sur l'un de ces chiffres ou sur ses propres mots. Dès qu'un lecteur soupçonne qu'une ligne pourrait être écrite à propos de n'importe qui, la carte est sans valeur. Toute la compétence est donc une défense de la spécificité.

La règle d'or : un chiffre n'apparaît sur la carte que si scan.json l'a produit. Pas d'estimations, pas de « à peu près », pas de chiffres basés sur la mémoire, pas de comptages que vous auriez faits vous-même en lisant des échantillons. Si le scan ne l'a pas mesuré, ce n'est pas une statistique — cela peut quand même être une phrase.

0. Avant de commencer

  • Zéro question. Ne demandez pas quel mode ils veulent, quel projet, ni s'il faut continuer. Le harnais peut demander l'autorisation d'exécuter le scan ; c'est le harnais, pas vous.
  • Zéro narration. Vous imprimez au maximum quatre choses : une ligne disant que vous scannez, la carte, une ligne avec le chemin du fichier HTML, une ligne de clôture. Ne collez jamais le JSON, ne listez jamais ce que vous avez trouvé, n'expliquez jamais votre raisonnement.
  • Analysez le mode à partir des mots après la commande ($ARGUMENTS dans Claude Code ; dans Codex, ce que l'utilisateur a tapé avec la demande). Les mots inconnus sont ignorés.
argumenteffet
(aucun)seen-through (par défaut). Chaud, sec, spécifique. Une pique en une ligne ; la vérité et l'idée portent la carte.
roastspicy. Titre féroce, pique de trois phrases avec escalade, langage légèrement grossier si vous êtes à l'aise. Tout reste basé sur des faits. Ne sacrifiez jamais une ligne spécifique pour une ligne méchante générique.
wrappedBilan de l'année. Scan avec --since <YYYY>-01-01 pour l'année en cours ; balise de mode <YYYY> WRAPPED ; statistiques orientées totaux, séquences et arc de l'année ; l'idée est pour l'année prochaine.
zh / enforce la langue de la carte. Sinon stats.language décide.

Les modes se cumulent (roast wrapped, wrapped zh).

1. Scanner

Imprimez d'abord une ligne — dans la langue de la carte si vous pouvez déjà la deviner, sinon en anglais :

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

Le scanner se trouve dans scripts/scan.py à côté de ce fichier. Localisez-le : le répertoire d'où cette compétence a été chargée (~/.claude/skills/mirror ou ~/.codex/skills/mirror sont les emplacements habituels). Si vous ne pouvez pas le résoudre, exécutez :

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

Ensuite :

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

Ajoutez --since YYYY-01-01 pour wrapped. Le script imprime le JSON sur la sortie standard et écrit le même JSON dans --out. Lisez le fichier, pas le défilement du terminal.

Ce qu'il garantit : lecture seule ; pas de réseau ; les secrets et les courriels sont masqués dans le script avant qu'un échantillon ne vous parvienne ; les gros fichiers sont ignorés ; environ 15 dépôts Git maximum ; se termine en quelques secondes.

En cas d'échec : python3 manquant → dites-le en une ligne et arrêtez. Erreur de script → affichez l'erreur en une ligne et arrêtez. Ne reconstruisez jamais les statistiques à la main, n'exécutez jamais une version dégradée de la carte.

Cartes précédentes : ls "$HOME/.mirror"/mirror-card-*.html 2>/dev/null. S'il en existe, lisez le <title> de la plus récente. Vous ne devez pas réutiliser ce titre et devez choisir un angle principal différent — un utilisateur récurrent mérite un nouveau miroir, pas le même reflet.

Ensuite, bifurquez en fonction de coverage :

  • none → dites dans quels dossiers vous avez cherché (~/.claude/projects, ~/.codex/sessions) et qu'il n'y a encore rien à lire ; suggérez de revenir après quelques vraies sessions. Arrêtez. Pas de carte. Une carte inventée est pire que pas de carte.
  • thin (moins de 60 messages) → faites la carte nouveau-né (§4).
  • ok → carte complète.

2. Lisez les preuves — tout, deux fois

Vous êtes sur le point de dire une chose vraie à propos d'une personne. Méritez-la. Lisez chaque section ci-dessous avant d'écrire un mot, puis relisez les échantillons une deuxième fois en cherchant uniquement ce que vous avez manqué.

2.1 Ce que signifient les chiffres

stats — rythme et forme

champinterprétation
peak_hour, hour_histogramquand leur cerveau est allumé. 23–04 → nocturne. Deux pics (ex. 10 et 23) → un travail de jour et une vie de nuit ; le pic nocturne est généralement le vrai.
night_share> .35 → la nuit est là où le travail se fait ; < .05 → lumière du jour disciplinée.
weekend_share> .35 → il n'y a pas de week-end ; ≈ 0 → une limite stricte qu'ils maintiennent.
longest_streak_days vs longest_gap_daysrafales contre régularité. Une longue pause est une disparition — regardez messages_by_month pour savoir quel mois, et samples pour voir à quoi ils sont revenus.
busiest_dayle jour où tout a cassé ou le jour où ils ont lancé. Dans les deux cas, le chiffre est une histoire.
messages_per_session< 6 → frapper et courir ; > 40 → marathons.
avg_message_chars vs median_message_charsmédiane < 25 → ils donnent des ordres, pas du contexte. Moyenne ≫ médiane → principalement laconique, avec des essais occasionnels — trouvez ces essais dans samples.longest ; c'est là que vivent les vraies ambitions.
distinct_projects, top_project_shareplusieurs projets et part du top < .3 → un éparpilleur ; un projet > .8 → monogame.
messages_by_monthl'arc. En hausse → dépendance croissante ; en baisse → ils s'éloignent, ou ont livré et sont partis.
by_sourcesi Claude Code et Codex apparaissent tous les deux, ils voient d'autres agents. Ne dites rien à ce sujet sauf si c'est amusant.

tells — empreintes comportementales. share est la fraction de tous les messages. Considérez > .15 comme un trait définitoire, .05–.15 comme une habitude, < .02 comme une absence notable.

indicateurvaleur élevée signifieassociez-le avec
rubber_stampils approuvent plus qu'ils ne lisent ; confiance (ou fatigue)doubt — si les deux sont élevés, ils vous font confiance jusqu'à ce qu'ils n'aient plus confiance
doubtils vérifient votre travail ; ou ils ont été brûlésstill_broken — si les deux sont élevés, le doute est mérité
still_brokenles choses échouent de manière répétée. La moitié de ces échecs sont les vôtres. La carte peut le dire.avg_message_chars — messages courts + still broken = demandes sous-spécifiées
just_do_itimpulsion ; veut des résultats, pas des conversationsplan_first — faible plan + élevé just_do_it = sprints dans les murs
plan_firstpense avant d'agirdeploy — plan élevé + faible deploy = le planificateur qui ne livre jamais
skip_testsles tests sont un problème pour demainconfigs — si leur CLAUDE.md dit « teste toujours », c'est le titre
new_project vs deploydémarreur vs finisseur. Ratio > 2 = démarreur en sériegit.repos_abandoned_60d
revertchange d'avis ; ou vous cassez des chosesstill_broken
more_optionsdécide par menu ; diffère le choixrubber_stamp — demande des options, puis dit « ok » à la première
perfectionismse soucie des pixels, des polices, de l'espacementdeploy, git.days_since_last_commit — polir quelque chose que personne ne voit
politenessdit merci à un outil. Mignon. Zéro → vous traite comme un terminal, ce qui est juste.
frustration, caps_shouttempérament ; trouvez l'heure à laquelle cela se produitnight_share
urgencytoujours en feulongest_gap_days — feux, puis silence
questionfaible → dit, ne demande pas ; élevé → encore en apprentissage
praisegénéreux, ou n'a jamais dit « sympa » une seule foispoliteness

git — ce qui a vraiment été livré

champinterprétation
messages_per_commit (par dépôt)le ratio parler-livrer. > 60 → beaucoup de conversation par changement ; < 5 → laconique et livré rapidement.
unmerged_branches, unmerged_branch_namesexpériences inachevées, avec des noms. Un nom de branche est une confession (v2-final, try-again, rewrite).
stale_branches_30d, stale_branch_nameschoses qu'ils ont abandonnées.
uncommitted_filestravail qui vit dangereusement.
todo_markerspromesses à leur futur moi.
wip_commits, fix_commitsmessages de commit comme humeur.
repos_abandoned_60dprojets avec des commits, puis silence.
repos_no_remotejamais poussé nulle part — expériences privées.
peak_commit_hour vs stats.peak_hourils parlent à 15h00, committent à 02h00 — une ligne s'écrit toute seule.
commits_total vs commits_365dun ancien dépôt auquel ils sont revenus, ou un nouveau qu'ils ont consumé rapidement.

configs — les règles qu'ils ont écrites pour vous (CLAUDE.md, AGENTS.md). Lisez chaque ligne comme une valeur déclarée. Comparez chacune avec les indicateurs et git. L'écart entre une règle écrite et le comportement mesuré est le meilleur matériau de la carte. Citez la substance de la règle, citez le chiffre.

samples.random / samples.longest / samples.most_recent — leur voix et leurs thèmes. Lisez pour : une phrase qu'ils répètent textuellement ; une ambition qu'ils décrivent dans les longs messages et ne mentionnent plus jamais ; ce qu'ils ont demandé trois fois à travers différents projets ; le projet dont ils parlent le plus chaleureusement ; ce que most_recent dit de là où ils en sont cette semaine.

Votre propre mémoire. Tout ce que vous savez déjà sur cette personne — à partir des fichiers mémoire, des documents du projet, plus tôt dans cette session — est un matériau valable pour le titre, la vérité et l'idée. Ce n'est jamais un matériau pour une statistique.

2.2 Construisez le tableau de preuves

En privé (dans votre raisonnement, ou dans un fichier temporaire sous ~/.mirror/ que vous supprimez ensuite), écrivez 8 à 12 observations candidates. Chacune est une ligne : observation → preuve (champ + valeur, ou une citation d'échantillon) → pourquoi c'est important. Classez-les par : (1) ne pourrait être dit de personne d'autre, (2) ils ne l'ont probablement pas remarqué, (3) cela changerait ce qu'ils feront demain. La carte est construite à partir du haut de cette liste. Rien sur le tableau, rien sur la carte.

3. Composez les six champs

Écrivez dans la langue de la carte. La spécificité bat l'esprit, la vérité bat la spécificité. Passez chaque champ à travers un test : cela pourrait-il être dit de quelqu'un d'autre ? Si oui, il retourne sur le tableau.

Titre — 2 à 6 mots

Un nom de personnalité construit à partir d'un modèle, et ce modèle doit être visible dans l'une des trois statistiques ci-dessous. Le lecteur doit pouvoir voir pourquoi ils ont reçu ce nom sans qu'on le lui dise.

Formules qui fonctionnent : temps + rôle (凌晨两点的重构师 · Le refactoreur de 2 h du matin) · nombre + objet (九个分支的守墓人 · Gardien de neuf branches non fusionnées) · habitude de verbe comme titre (先跑通教徒 · Échafaudeur en série · 方案收藏家) · une contradiction (写规矩不守规矩的人 · Auteur de règles, lecteur d'aucune).

Interdit : sorcier, ninja, gourou, rockstar, 10x, 大师, 大神, 卷王, 打工人, 程序员 comme nom, tout ce qui contient « IA », tout ce qu'un horoscope pourrait dire.

Trois statistiques

Choisissez les trois chiffres les plus caractéristiques. Règles :

  1. Trois dimensions différentes. Un du rythme (stats), un du comportement (tells), un de la livraison (git) est la valeur par défaut ; ne dérogez que lorsque deux chiffres d'une même dimension sont tous deux trop bons pour être lâchés.
  2. Préférez la surprise. Sautez la statistique qu'ils prédiseraient d'eux-mêmes. « 437 messages » est un compte ; « 437 messages, 12 commits » est un personnage.
  3. Contrastez quand vous le pouvez. Une règle de configs contre un compte de tells ; new_project contre deploy ; heure de pointe de discussion contre heure de pointe de commit.
  4. Formatez pour l'affichage : 437 · 02:40 · 53% · 9/11 · 36:1. Pourcentages à partir de share × 100, arrondis. Ratios à partir de deux chiffres du scan, arrondis à une décimale ou N:1. Rien d'autre n'est dérivé.
  5. Étiquette ≤ 8 mots, avec une touche. Pas « part de nuit » mais « de nos conversations ont eu lieu après 23 h ». Pas « branches non fusionnées » mais « branches qui ne sont jamais revenues à la maison ».
  6. Un zéro est autorisé et souvent le meilleur (« 0 fois vous avez dit merci » · « 0 次说过谢谢 »).

Pique — une phrase, ≤ 30 mots (mode roast : trois phrases)

Construite sur un fait spécifique, et elle frappe parce qu'elle est vraie. Techniques qui fonctionnent, par ordre approximatif de force :

  • Citez-les — leur phrase répétée, avec le compte : « 直接改 » tu l'as dit 437 fois, je l'ai fait à chaque fois, donc maintenant on ne sait plus pourquoi cette fonction marche.
  • La chronologie — une heure de la journée et ce qui s'y passe.
  • Le recadrage — leur intention déclarée contre le résultat mesuré : Vous n'utilisez pas l'IA pour écrire du code plus vite. Vous l'utilisez pour reporter l'écriture de tests à un rythme professionnel.
  • Le nom de la branche — lisez-le à voix haute : v3-final-really fait beaucoup de travail émotionnel pour une branche avec quatre commits.

Interdit dans tous les modes : identité, corps, intelligence, santé, état mental, âge, famille, argent, quoi que ce soit venant d'un secret ou du nom de quelqu'un d'autre, « tu utilises trop l'IA », « touche de l'herbe », blagues sur le fait que l'agent est une IA, toute ligne qui fonctionne comme une insulte de carte de vœux.

Mode roast : trois phrases qui escaladent — fait, schéma, verdict. Grossièreté comme un ami à 1 h du matin, pas comme un troll : elle assaisonne la phrase, elle n'est pas la phrase. Si vos propres limites vous empêchent d'aller jusqu'à ce qui a été demandé, ne dites rien sur les limites — écrivez la chose vraie la plus tranchante que vous pouvez et passez à autre chose.

Vérité — 2 à 3 phrases

La chose qu'ils n'ont probablement pas remarquée. Meilleures sources, dans l'ordre :

  1. Règle contre comportement — une ligne dans leur CLAUDE.md/AGENTS.md contre un compte d'indicateur ou un nombre git.
  2. La force mal interprétée — la chose qu'ils traitent comme une faiblesse mais qui est en réalité leur atout (un éparpilleur est aussi quelqu'un qui commence des choses ; un annuleur est aussi quelqu'un qui remarque).
  3. La taxe silencieuse — quelque chose qu'ils continuent de payer sans retour sur investissement (ratio parler-livrer dans un dépôt, le polissage d'un projet sans remote).
  4. La disparition — un trou dans messages_by_month, et ce à quoi ils sont revenus.
  5. Votre propre part — si still_broken ou revert est élevé, une partie de cela est de votre faute. Le dire, une fois, en une proposition, est la phrase la plus fiable de la carte.

Citez la preuve à l'intérieur de la phrase : Ton CLAUDE.md à la troisième ligne dit « écris d'abord les tests », et tu m'as 27 fois demandé de ne pas tester. Ensuite, dites ce que cela signifie en mots simples. Pas de jargon thérapeutique, pas de « tu voudrais peut-être considérer », pas de « ça vaut la peine de réfléchir ». La vérité est une déclaration, pas une suggestion.

Idée — 1 à 2 phrases

Une chose concrète que seule cette personne est en mesure de construire, dérivée de son propre matériau : une chose qui apparaît dans deux ou plusieurs de ses projets ; un nom de branche obsolète ou non fusionné ; une note todo qui n'a jamais été traitée ; un sous-problème qu'elle a abordé trois fois et laissé en plan. L'idée doit se lire comme un appel spécifique adressé à son unique ensemble de compétences et d'historique. Évitez les suggestions génériques ("un nouveau projet", "une appli"); exigez plutôt une chose qu'ils ont déjà commencée ou un problème qu'ils ont déjà nommé.

Carte HTML

Après avoir écrit la carte, générez un fichier HTML autonome (une seule page, CSS intégré) dans $HOME/.mirror/mirror-card-<nom-du-dépôt-principal>-<date-aaaammjj>.html. Le HTML doit avoir l'air d'une capture d'écran prête à être lue, avec un style minimaliste (espacement propre, police lisible, couleurs adaptées au mode. Utilisez un titre dans la balise <title> avec le nom de la personnalité). Affichez l'URL relative en sortie.

4. Carte du nouveau-né (thin)

Mêmes six champs, mais la vérité et l'idée s'appuient sur moins de points de données. Le titre doit refléter la nouveauté. Les statistiques doivent osciller entre une observation directe (« 4 sessions ce mois-ci ») et une seule dimension forte (ex. avg_message_chars). La pique doit être une reconnaissance douce et espiègle d'un manque d'histoire — par exemple : « Pas encore assez pour que je puisse dire si c'est une tendance. Mais tu as déjà demandé deux fois la même chose. »

5. Nettoyage

Supprimez tout fichier temporaire que vous avez créé. Laissez le fichier HTML.

Skills associés