Claude Routines
Integrationsschicht, um deine Anthropic-Claude-Routinen direkt aus einem Spedy-Ticket zu triggern — mit Ticket-Kontext, optionalem Board-/Repo-Scope, Pre- und Post-Actions und Rückmeldung im Ticket.
Claude Routines sind ein Produkt von Anthropic: wiederverwendbare Arbeitsanweisungen, die du in deinem Anthropic-Account definierst und Claude ausführt. Spedy hostet oder startet diese Routinen nicht — Spedy liefert die Integrationsschicht, damit du sie direkt aus einem Ticket triggern kannst.
Konkret übernimmt diese Integration:
- das Auflösen von Ticket-Kontext (Titel, Beschreibung, Status, Board, URL) in dein Prompt-Template,
- den POST des aufgelösten Prompts an deine Anthropic-Routine-Webhook-URL mit deinem Secret,
- optionale Pre- und Post-Schritte am Ticket (Status-Wechsel, Self-Assign, PR-Link-Kommentar),
- das Nachhalten und Anzeigen jeder Execution direkt am Ticket.
Die Routinen selbst, das Modell-Budget und die Kosten bleiben in deinem Anthropic-Account.
Die Spedy-Integration ist Teil des Pro-Plans und muss organisationsweit über das Feature-Flag CLAUDE_ROUTINES aktiviert werden.
Konzepte
In Spedy besteht ein Routine-Eintrag aus vier Teilen:
- Metadaten — Name, Slug, Beschreibung
- Scope — optional Board- und Repository-Scope
- Instructions — das Prompt-Template (mit Variablen wie
{{ticket.title}}) - Pre- und Post-Actions — serverseitige Ticket-Schritte vor und nach dem Handoff an Claude
Jeder Trigger erzeugt eine RoutineExecution, die den Status des Handoffs, den aufgelösten Prompt und Abschluss-Metadaten festhält. Die eigentliche AI-Arbeit passiert bei Anthropic — RoutineExecution ist nur Spedys Sicht darauf.
Berechtigungen und Feature-Flag
Routines sind gegated durch:
| Gate | Wert | Wirkung |
|---|---|---|
| Organisations-Feature | CLAUDE_ROUTINES | Alle /routines/*-Endpunkte und die UI brauchen das aktiviert |
Permission routines:manage | Default in Admin + Team Member | Eigene Routines anlegen, lesen, ändern, löschen |
Permission routines:trigger | Default in Admin + Team Member | Routines triggern und eigene Executions abbrechen |
Kunden (Organisationsrolle CUSTOMER) sind bewusst von beiden Permissions ausgenommen.
Board-Zugriff wird zusätzlich geprüft: ein Trigger auf ein Ticket, dessen Board du nicht sehen darfst, liefert 403 Forbidden.
Prompt-Variablen
In instructions werden folgende {{variable}}-Platzhalter beim Trigger aufgelöst:
| Variable | Quelle |
|---|---|
{{ticket.id}} | Ticket-ID |
{{ticket.displayId}} | Lesbarer Ticket-Key (z. B. WEB-42) |
{{ticket.title}} | Ticket-Titel |
{{ticket.description}} | Ticket-Beschreibung |
{{ticket.status}} | Status-Name |
{{ticket.statusKey}} | Status-Key (BACKLOG … DONE) |
{{ticket.boardId}} | Board-ID |
{{ticket.boardName}} | Board-Name |
{{ticket.boardSlug}} | Board-Prefix |
{{ticket.url}} | Relative URL des Tickets |
Wenn der Trigger-Request ein optionales text-Feld mitschickt, wird es unter einem ----Separator als Additional instructions for this run: angehängt.
Pre- und Post-Actions
Drei serverseitige Aktions-Typen sind in preActions und postActions erlaubt:
| Typ | Parameter | Wann | Wirkung |
|---|---|---|---|
move_status | statusKey: BACKLOG | TODO | IN_PROGRESS | BLOCKED | DONE | pre / post | Ticket in den passenden Board-Status verschieben |
assign_self | — | pre / post | Triggernden User als Assignee setzen |
post_pr_comment | — | post | Den PR-Link als internen Kommentar am Ticket posten |
Aktionen laufen in der Reihenfolge, in der sie im Array stehen. Pre-Actions laufen synchron vor dem Dispatch an Claude; Post-Actions laufen, wenn Claude Abschluss meldet.
Scope
Zwei Felder grenzen ein, wo eine Routine laufen darf:
boardIds— wenn nicht leer, wird die Routine nur auf Tickets dieser Boards angeboten. Ein Trigger auf ein Ticket außerhalb liefert400.allowedRepos— Liste vonowner/repo-Strings. Nur Repositories, die a) mit dem Ticket-Board verknüpft sind und b) in dieser Liste stehen, werden Claude als Repo-Kontext mitgegeben. Leer = kein Repo-Constraint.
Nutze den Helper GET /routines/available-repos, um die gültigen allowedRepos-Werte deiner Organisation zu bekommen.
Outgoing Webhook
Für den Handoff an die Claude-Code-Routines-API kann jede Routine setzen:
| Feld | Beschreibung |
|---|---|
webhookTargetUrl | HTTPS-URL auf api.anthropic.com. Beim Trigger POSTet Spedy { "text": resolvedPrompt } an diese URL. |
webhookTargetSecret | Wird als Authorization: Bearer <secret> gesendet. Erscheint nie in List-/Read-Responses (dort nur das boolsche webhookTargetSecretSet). |
webhookTargetHeaders | Zusätzliche, nicht-geheime Header, z. B. {"anthropic-version": "2023-06-01"}. Für api.anthropic.com setzt Spedy sinnvolle Defaults, wenn du keine lieferst. |
Nach erfolgreichem Handoff springt die Execution von PENDING auf CLAIMED (mit claimedAt), und die Ticket-Karte zeigt An Claude übergeben.
API-Referenz
Alle Endpunkte liegen unter /api/v1/routines, sind durch JwtAuthGuard geschützt und unterstützen Personal Access Tokens.
GET /routines/me
Eigene Routines auflisten.
Permission: routines:manage
Query-Parameter
| Name | Typ | Beschreibung |
|---|---|---|
boardId | string | Optional. Liefert Routines, die entweder unscoped sind oder dieses Board enthalten |
Response 200 — Array von Routines. Secret-Felder (webhookTargetSecret) sind entfernt; webhookTargetSecretSet zeigt an, ob eines gesetzt ist.
POST /routines/me
Neue Routine anlegen.
Permission: routines:manage
Request-Body
| Feld | Typ | Pflicht | Hinweis |
|---|---|---|---|
name | string | ja | 2–120 Zeichen |
slug | string | ja | 2–120 Zeichen, lowercase kebab-case, pro User eindeutig |
description | string | nein | ≤ 500 Zeichen |
boardIds | string[] | nein | Bis zu 100 Board-IDs. Leer = alle Boards |
instructions | string | ja | 10–20000 Zeichen. Unterstützt {{ticket.*}}-Variablen |
preActions | RoutineAction[] | nein | Siehe oben |
postActions | RoutineAction[] | nein | Gleiches Shape wie Pre-Actions |
expectPrLink | boolean | nein | Default true. Ob Post-Actions einen PR-Link erwarten |
isActive | boolean | nein | Default true |
allowedRepos | string[] | nein | Bis zu 50 owner/repo-Strings |
webhookTargetUrl | string | null | nein | Muss eine https://api.anthropic.com/…-URL sein |
webhookTargetSecret | string | null | nein | Wird gespeichert, nie zurückgegeben |
webhookTargetHeaders | object | nein | Map aus string → string |
Response 201 — die erstellte Routine (Secret gestript).
GET /routines/me/:id
Eine eigene Routine laden.
Permission: routines:manage
PATCH /routines/me/:id
Routine aktualisieren. Nur die im Body enthaltenen Felder werden geändert. webhookTargetSecret: "" leert das Secret; das Feld wegzulassen lässt es unverändert.
Permission: routines:manage
DELETE /routines/me/:id
Routine soft-löschen (setzt deletedAt, isActive=false).
Permission: routines:manage
Response: 204 No Content
GET /routines/available-repos
Liefert distincte repoFullName-Werte aus allen Boards deiner Organisation — die erlaubten Werte für allowedRepos.
Permission: routines:manage
POST /routines/executions
Routine auf einem Ticket triggern.
Permission: routines:trigger
Request-Body
| Feld | Typ | Pflicht | Hinweis |
|---|---|---|---|
routineId | string | ja | Eine eigene Routine mit isActive = true |
ticketId | string | ja | Ein Ticket auf einem Board, das der Aufrufer sehen darf |
text | string | nein | ≤ 4000 Zeichen. Wird für diesen einen Lauf an den aufgelösten Prompt angehängt |
Ablauf
- Prüft, ob
CLAUDE_ROUTINESaktiviert ist und der Aufrufer Zugriff auf das Ticket-Board hat. - Wenn die Routine
boardIdsgesetzt hat, wird ein Trigger auf anderen Boards mit400abgelehnt. - Löst
{{ticket.*}}-Variablen auf und hängt Repo-Context + optionalentextan. - Führt eventuelle
preActionsserverseitig aus. - Legt eine
RoutineExecutionmit StatusPENDINGan. - Wenn
webhookTargetUrlgesetzt ist, wird der Outgoing-Webhook gefeuert (fire-and-forget); bei Erfolg springt die Execution aufCLAIMED.
Response 201 — die RoutineExecution.
GET /routines/executions?ticketId=…
Liefert die letzten 20 Executions eines Tickets (für alle Nutzer:innen der Organisation, die das Board sehen dürfen).
Permission: routines:trigger
Response 200 — Executions absteigend nach enqueuedAt, jeweils mit routine- und triggeredBy-Summary.
POST /routines/executions/:id/cancel
Eine eigene PENDING- oder CLAIMED-Execution abbrechen. Setzt Status CANCELLED und completedAt.
Permission: routines:trigger
Fehler
| Code | Grund |
|---|---|
| 403 | Aufrufer ist nicht der Auslöser der Execution |
| 400 | Execution ist nicht in PENDING oder CLAIMED |
Routines in der UI
- Verwalten:
Account → Claude Routines. Anlegen, editieren, löschen, 4-stufiger Setup-Wizard. - Triggern: ein Ticket auf einem Board öffnen, zu dem du Zugriff hast. Die Claude Routines-Karte bietet jede Routine an, die entweder unscoped ist oder dieses Board einschließt. Auswählen, optional Freitext ergänzen, Trigger klicken.
- Historie: die Karte listet die letzten Executions dieses Tickets mit Status und Abbrechen-Button für eigene Läufe.