Tue le standup
Lit les tâches Linear et les commits GitHub de la veille. Formate une mise à jour de standup. Publie-la sur Slack.
Étape 1 : Vérification de la configuration
Confirme que les variables d'environnement requises sont définies :
echo "LINEAR_API_KEY: ${LINEAR_API_KEY:+définie}"
echo "SLACK_WEBHOOK_URL: ${SLACK_WEBHOOK_URL:+définie}"
echo "GITHUB_REPO: ${GITHUB_REPO:-non définie}"
echo "GITHUB_USERNAME: ${GITHUB_USERNAME:-non définie}"
Si LINEAR_API_KEY est manquante : Arrête-toi. Dis à l'utilisateur : "LINEAR_API_KEY est requise. Obtiens-la depuis Linear → Paramètres → API → Clés API personnelles. Ajoute-la à ton fichier .env."
Si SLACK_WEBHOOK_URL est manquant : Arrête-toi. Dis à l'utilisateur : "SLACK_WEBHOOK_URL est requis. Crée un webhook entrant sur api.slack.com/apps → Ton application → Webhooks entrants. Ajoute-le à ton fichier .env."
Si GITHUB_REPO est manquant : Continue. Les commits GitHub seront ignorés. Note-le à l'utilisateur.
Étape 2 : Récupération de l'activité Linear
Calcule la date d'hier au format ISO 8601 (ex : 2026-04-09T00:00:00.000Z).
Obtenir l'ID utilisateur actuel :
curl -s -X POST https://api.linear.app/graphql \
-H "Authorization: Bearer $LINEAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "query { viewer { id name email } }"}'
Extrais le champ id de la réponse. Stocke-le comme LINEAR_USER_ID.
Récupérer les tâches qui me sont assignées, mises à jour depuis hier :
curl -s -X POST https://api.linear.app/graphql \
-H "Authorization: Bearer $LINEAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "query($since: DateTime!, $userId: ID!) { issues(first: 50, filter: { assignee: { id: { eq: $userId } } updatedAt: { gte: $since } }) { edges { node { identifier title state { name } url completedAt updatedAt createdAt } } } }",
"variables": {"since": "HIER_ISO", "userId": "LINEAR_USER_ID"}
}'
Catégoriser les tâches :
completedAtnon null → Faitstate.nameest "In Progress", "Started" ou "In Review" → En coursstate.nameest "Cancelled" → ignorerstate.nameest "Todo" ou "Backlog" → ignorer (non travaillé)
Si zéro tâche : note "Aucune activité Linear trouvée hier."
Étape 3 : Récupération des commits GitHub
Ignore cette étape silencieusement si GITHUB_REPO n'est pas défini.
Si GITHUB_REPO est défini :
gh api "repos/$GITHUB_REPO/commits?author=${GITHUB_USERNAME:-$(gh api user --jq .login)}&since=HIER_ISO&per_page=30" \
--jq '[.[] | {message: .commit.message, url: .html_url}]'
Traiter les commits :
- Extrais la première ligne de chaque message de commit (tout ce qui précède la première nouvelle ligne)
- Ignorer les commits de merge : supprimer tout message commençant par "Merge"
- Dédupliquer par texte du message
Si GITHUB_REPO est défini mais retourne zéro commit : note "Aucun commit trouvé hier."
Étape 4 : Formatage du standup
Lis references/standup-format.md en entier avant d'écrire.
Produis le standup dans cette structure exacte :
**Fait**
- [ENG-123] Titre de la tâche terminée
- correctif : message de commit ici
**En cours**
- [ENG-124] Titre de la tâche en cours
**Bloqueurs**
Aucun bloqueur.
Règles issues de standup-format.md :
- Pas de pronoms à la première personne ("je", "nous")
- Passé pour les éléments Fait, présent continu pour les éléments En cours
- Chaque élément Linear utilise le format
[IDENTIFIANT] Titre - Chaque commit GitHub utilise la première ligne du message de commit
- Si aucun élément Fait : écris "Rien de terminé." sous Fait
- Si aucun élément En cours : écris "Rien en cours." sous En cours
- Si aucun bloqueur : écris "Aucun bloqueur."
- Moins de 200 mots au total
Étape 5 : Publication sur Slack ou sortie
Présente le standup formaté à l'utilisateur.
Demande : "Publier ceci sur Slack, ou simplement afficher ?"
Sur confirmation de publication :
curl -s -X POST "$SLACK_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Standup — DATE_ICI*\n\n*Fait*\nÉLÉMENTS\n\n*En cours*\nÉLÉMENTS\n\n*Bloqueurs*\nÉLÉMENTS"
}
}
]
}'
Passe le corps via un fichier temporaire ou heredoc pour éviter les problèmes de citation du shell avec les caractères spéciaux dans les messages de commit ou les titres de tâches :
cat > /tmp/standup-payload.json << 'ENDJSON'
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "CONTENU_STANDUP_ICI"
}
}
]
}
ENDJSON
curl -s -X POST "$SLACK_WEBHOOK_URL" -H "Content-Type: application/json" -d @/tmp/standup-payload.json
Après publication : "Standup publié."
Sur "afficher seulement" : Affiche le standup dans un bloc de code pour copier-coller.