Communitygithub.com

amalshaji/cafeblr

Cafés sympas à Bengaluru, trouvés par l'internet — un répertoire participatif construit à partir de posts X que les gens ont vraiment aimés. Ajoutez un café via une issue ou une PR.

Qu'est-ce que cafeblr ?

Cette compétence permet à un agent IA d'ajouter automatiquement un café au répertoire participatif 'cafeblr' de Bengaluru, en utilisant un tweet X comme source. L'agent doit extraire les informations du tweet (nom, quartier, image, likes, etc.), construire une entrée JSON conforme au schéma du projet, valider les données, puis soumettre une Pull Request via l'interface GitHub CLI. La compétence inclut des garde-fous stricts : elle vérifie que le tweet existe, contient une photo (pas de tweet textuel uniquement), n'est pas un doublon, et provient d'un compte personnel réel (pas de marque ou d'agrégateur). En cas d'informations manquantes (comme un lien Google Maps), elle le signale dans le corps de la PR. Les plateformes supportées sont les clones locaux du dépôt `amalshaji/cafeblr` avec `bun`, `git` et l'outil `gh` authentifié.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add amalshaji/cafeblr

Demander à votre IA préférée

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

Documentation

Ajoutez le café à partir de l'URL du tweet dans $ARGUMENTS vers data/cafes.json et créez une PR.

Prérequis : un clone de amalshaji/cafeblr (clonez-le si vous n'êtes pas déjà dans le dépôt), bun, et une CLI gh authentifiée.

1. Commencer depuis le dernier main

Les IDs doivent être calculés à partir des données les plus récentes, jamais d'un checkout obsolète :

git fetch origin && git checkout main && git pull

2. Récupérer le tweet

Extrayez l'ID numérique du statut depuis l'URL (x.com/<utilisateur>/status/<id> ou twitter.com/...), puis :

bun -e '
import { fetchTweet } from "./scripts/lib/tweet.ts";
const t = await fetchTweet("TWEET_ID");
console.log(JSON.stringify({
  user: t?.user?.screen_name, likes: t?.favorite_count, text: t?.text,
  media: t?.mediaDetails?.map(m => ({ type: m.type, url: m.media_url_https,
    mp4: m.video_info?.variants?.filter(v => v.content_type === "video/mp4")
      .sort((a, b) => (b.bitrate ?? 0) - (a.bitrate ?? 0))[0]?.url })),
}, null, 2));'

3. Garde-fous — arrêtez-vous et informez l'utilisateur si l'un d'eux échoue

  • Tweet manquant ou supprimé (l'adaptateur renvoie null).
  • Pas de photo — chaque entrée a besoin d'une image ; un tweet textuel uniquement ne peut pas être ajouté. Lorsqu'il existe plusieurs médias dans le tweet, inspectez-les et préférez d'abord une photo de nourriture/boisson ; si aucune ne montre de nourriture ou boisson, utilisez la meilleure image du tweet disponible.
  • Doublon — l'URL source (ou le même café) est déjà dans data/cafes.json.
  • Politique de sourcing — l'auteur doit être une personne réelle partageant une découverte. Rejetez les comptes de marque, le compte du café lui-même, les agrégateurs d'actualités et les comptes marketing.

4. Construire l'entrée

  • name / area — à partir du texte du tweet (les lignes 📍 sont courantes). Si le nom n'est pas dans le tweet, vérifiez les propres réponses de suivi de l'auteur dans le fil (navigateur). Si toujours inconnu, demandez à l'utilisateur plutôt que de deviner. La zone est un quartier ("Indiranagar", "HSR Layout"), pas une adresse.
  • knownFor — une ligne reformulant ce que le post lui-même loue. N'inventez jamais des qualités que le tweet ne mentionne pas.
  • image — inspectez les médias du tweet et choisissez d'abord une photo qui montre clairement l'article de nourriture/boisson. Si aucun média ne montre de nourriture ou boisson, utilisez la meilleure photo du tweet disponible (ou l'affiche de la vidéo). video — URL mp4 du meilleur débit si le média est une vidéo, sinon null.
  • mapsUrl — lien Google Maps si le tweet/fil en contient un (vérifiez entities.urls[].expanded_url), sinon null.
  • googleRating — évaluation Google Maps pour l'endroit exact si vérifié, sinon null.
  • source — https://x.com/<utilisateur>/status/<id> canonique. author — @<utilisateur>.
  • postedAt — le timestamp ISO datePublished de la page du tweet. Utilisez les métadonnées de la page X rendue dans le navigateur, pas une date devinée.
  • likes — favorite_count de la récupération. addedAt — aujourd'hui, YYYY-MM-DD.
  • id — max + 1 sur le fichier de l'étape 1 ; les entrées restent dans l'ordre des ids (schéma et règles : src/lib/schema.ts, README "Ajouter un café").

Ajoutez à data/cafes.json (indentation de 2 espaces, ordre des clés correspondant aux entrées existantes).

5. Valider

bun run validate
BASE_REF=origin/main bun scripts/validate.ts   # vérifie en direct la nouvelle entrée

Les deux doivent réussir avant de pusher.

6. Créer la PR

git checkout -b add-cafe-<nom-en-kebab>
git add data/cafes.json
git commit -m "data: add <Nom> (<Zone>)"
git push -u origin add-cafe-<nom-en-kebab>
gh pr create --title "Add <Nom> (<Zone>)" --body "..."

Corps de la PR : tableau des détails du café (nom, zone, lien source, likes) plus une section Données manquantes énumérant tout ce qui est inconnu (généralement mapsUrl). Si mapsUrl est null, laissez également un commentaire sur la PR listant les liens Maps manquants afin qu'un humain puisse les remplir. Pas d'attribution IA/assistant dans les commits ou la PR.

Terminez en rapportant l'URL de la PR.

Skills associés