SpedySpedy Docs

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:

  1. Metadaten — Name, Slug, Beschreibung
  2. Scope — optional Board- und Repository-Scope
  3. Instructions — das Prompt-Template (mit Variablen wie {{ticket.title}})
  4. 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:

GateWertWirkung
Organisations-FeatureCLAUDE_ROUTINESAlle /routines/*-Endpunkte und die UI brauchen das aktiviert
Permission routines:manageDefault in Admin + Team MemberEigene Routines anlegen, lesen, ändern, löschen
Permission routines:triggerDefault in Admin + Team MemberRoutines 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:

VariableQuelle
{{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 (BACKLOGDONE)
{{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:

TypParameterWannWirkung
move_statusstatusKey: BACKLOG | TODO | IN_PROGRESS | BLOCKED | DONEpre / postTicket in den passenden Board-Status verschieben
assign_selfpre / postTriggernden User als Assignee setzen
post_pr_commentpostDen 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 liefert 400.
  • allowedRepos — Liste von owner/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:

FeldBeschreibung
webhookTargetUrlHTTPS-URL auf api.anthropic.com. Beim Trigger POSTet Spedy { "text": resolvedPrompt } an diese URL.
webhookTargetSecretWird als Authorization: Bearer <secret> gesendet. Erscheint nie in List-/Read-Responses (dort nur das boolsche webhookTargetSecretSet).
webhookTargetHeadersZusä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

NameTypBeschreibung
boardIdstringOptional. 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

FeldTypPflichtHinweis
namestringja2–120 Zeichen
slugstringja2–120 Zeichen, lowercase kebab-case, pro User eindeutig
descriptionstringnein≤ 500 Zeichen
boardIdsstring[]neinBis zu 100 Board-IDs. Leer = alle Boards
instructionsstringja10–20000 Zeichen. Unterstützt {{ticket.*}}-Variablen
preActionsRoutineAction[]neinSiehe oben
postActionsRoutineAction[]neinGleiches Shape wie Pre-Actions
expectPrLinkbooleanneinDefault true. Ob Post-Actions einen PR-Link erwarten
isActivebooleanneinDefault true
allowedReposstring[]neinBis zu 50 owner/repo-Strings
webhookTargetUrlstring | nullneinMuss eine https://api.anthropic.com/…-URL sein
webhookTargetSecretstring | nullneinWird gespeichert, nie zurückgegeben
webhookTargetHeadersobjectneinMap 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

FeldTypPflichtHinweis
routineIdstringjaEine eigene Routine mit isActive = true
ticketIdstringjaEin Ticket auf einem Board, das der Aufrufer sehen darf
textstringnein≤ 4000 Zeichen. Wird für diesen einen Lauf an den aufgelösten Prompt angehängt

Ablauf

  1. Prüft, ob CLAUDE_ROUTINES aktiviert ist und der Aufrufer Zugriff auf das Ticket-Board hat.
  2. Wenn die Routine boardIds gesetzt hat, wird ein Trigger auf anderen Boards mit 400 abgelehnt.
  3. Löst {{ticket.*}}-Variablen auf und hängt Repo-Context + optionalen text an.
  4. Führt eventuelle preActions serverseitig aus.
  5. Legt eine RoutineExecution mit Status PENDING an.
  6. Wenn webhookTargetUrl gesetzt ist, wird der Outgoing-Webhook gefeuert (fire-and-forget); bei Erfolg springt die Execution auf CLAIMED.

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

CodeGrund
403Aufrufer ist nicht der Auslöser der Execution
400Execution 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.