Kill the Standup
Liest die Linear-Issues und GitHub-Commits von gestern. Formatiert ein Standup-Update. Postet es in Slack.
Schritt 1: Setup-Prüfung
Bestätige, dass die erforderlichen Umgebungsvariablen gesetzt sind:
echo "LINEAR_API_KEY: ${LINEAR_API_KEY:+gesetzt}"
echo "SLACK_WEBHOOK_URL: ${SLACK_WEBHOOK_URL:+gesetzt}"
echo "GITHUB_REPO: ${GITHUB_REPO:-nicht gesetzt}"
echo "GITHUB_USERNAME: ${GITHUB_USERNAME:-nicht gesetzt}"
Wenn LINEAR_API_KEY fehlt: Stoppe. Sage dem Benutzer: "LINEAR_API_KEY wird benötigt. Hole ihn von Linear → Einstellungen → API → Persönliche API-Schlüssel. Füge ihn in deine .env-Datei ein."
Wenn SLACK_WEBHOOK_URL fehlt: Stoppe. Sage dem Benutzer: "SLACK_WEBHOOK_URL wird benötigt. Erstelle einen eingehenden Webhook unter api.slack.com/apps → Deine App → Eingehende Webhooks. Füge ihn in deine .env-Datei ein."
Wenn GITHUB_REPO fehlt: Fahre fort. GitHub-Commits werden übersprungen. Weise den Benutzer darauf hin.
Schritt 2: Linear-Aktivitäten abrufen
Berechne das gestrige Datum im ISO-8601-Format (z.B. 2026-04-09T00:00:00.000Z).
Aktuelle Benutzer-ID abrufen:
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 } }"}'
Extrahiere das id-Feld aus der Antwort. Speichere es als LINEAR_USER_ID.
Issues abrufen, die mir zugewiesen und seit gestern aktualisiert wurden:
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": "YESTERDAY_ISO", "userId": "LINEAR_USER_ID"}
}'
Kategorisiere die Issues:
completedAtist nicht null → Erledigtstate.nameist "In Bearbeitung", "Gestartet" oder "In Überprüfung" → Laufendstate.nameist "Abgebrochen" → überspringenstate.nameist "Zu erledigen" oder "Backlog" → überspringen (nicht bearbeitet)
Wenn keine Issues vorhanden sind: notiere "Keine Linear-Aktivitäten für gestern gefunden."
Schritt 3: GitHub-Commits abrufen
Überspringe diesen Schritt stillschweigend, wenn GITHUB_REPO nicht gesetzt ist.
Wenn GITHUB_REPO gesetzt ist:
gh api "repos/$GITHUB_REPO/commits?author=${GITHUB_USERNAME:-$(gh api user --jq .login)}&since=YESTERDAY_ISO&per_page=30" \
--jq '[.[] | {message: .commit.message, url: .html_url}]'
Verarbeite die Commits:
- Extrahiere die erste Zeile jeder Commit-Nachricht (alles vor dem ersten Zeilenumbruch)
- Überspringe Merge-Commits: entferne alle Nachrichten, die mit "Merge" beginnen
- Dedupliziere nach Nachrichtentext
Wenn GITHUB_REPO gesetzt ist, aber keine Commits zurückgegeben werden: notiere "Keine Commits gestern gefunden."
Schritt 4: Standup formatieren
Lese references/standup-format.md vollständig, bevor du schreibst.
Erstelle das Standup in dieser genauen Struktur:
**Erledigt**
- [ENG-123] Titel des abgeschlossenen Issues
- fix: Commit-Nachricht hier
**Laufend**
- [ENG-124] Titel des in Bearbeitung befindlichen Issues
**Blocker**
Keine Blocker.
Regeln aus standup-format.md:
- Keine Pronomen in der ersten Person ("Ich", "Wir")
- Vergangenheitsform für Erledigt, Verlaufsform für Laufend
- Jeder Linear-Eintrag im Format
[IDENTIFIER] Titel - Jeder GitHub-Commit verwendet die erste Zeile der Commit-Nachricht
- Wenn keine Erledigt-Einträge: schreibe "Nichts erledigt." unter Erledigt
- Wenn keine Laufend-Einträge: schreibe "Nichts in Bearbeitung." unter Laufend
- Wenn keine Blocker: schreibe "Keine Blocker."
- Unter 200 Wörter insgesamt
Schritt 5: In Slack posten oder ausgeben
Präsentiere dem Benutzer das formatierte Standup.
Frage: "In Slack posten oder nur ausgeben?"
Bei Bestätigung zum Posten:
curl -s -X POST "$SLACK_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Standup — DATUM_HIER*\n\n*Erledigt*\nEINTRÄGE\n\n*Laufend*\nEINTRÄGE\n\n*Blocker*\nEINTRÄGE"
}
}
]
}'
Übergebe den Body über eine temporäre Datei oder ein Heredoc, um Shell-Zitierungsprobleme mit Sonderzeichen in Commit-Nachrichten oder Issue-Titeln zu vermeiden:
cat > /tmp/standup-payload.json << 'ENDJSON'
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "STANDUP_INHALT_HIER"
}
}
]
}
ENDJSON
curl -s -X POST "$SLACK_WEBHOOK_URL" -H "Content-Type: application/json" -d @/tmp/standup-payload.json
Nach dem Posten: "Standup gepostet."
Bei "Nur ausgeben": Gib das Standup in einem Codeblock zum Kopieren und Einfügen aus.