Multi-Ticketsystem-Unterstützung: Pluggable Ticket-Quellen pro Projekt #14
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beschreibung
TicketPilot soll mehrere Ticketsysteme als Quelle unterstützen — nicht nur Odoo und AppSignal.
Pro Projekt/Repo können ein oder mehrere Ticketsysteme konfiguriert werden.
Die Ticket-Synchronisation soll auch ohne Claude-Pipeline möglich sein (reiner Sync-Modus).
Unbekannte Ticketsysteme können dynamisch hinzugefügt werden (URL + Token),
wobei Claude Code den Adapter automatisch generiert.
Hintergrund
Aktuell sind Ticket-Quellen fest verdrahtet (Odoo via JSON-RPC in
odoo_poller.py,AppSignal via GraphQL in
appsignal_poller.py). Die Konfiguration läuft global über.env.Das schränkt die Flexibilität ein:
Konzept
1. Architektur: Pluggable Ticket-Source-System
Abstrakte Basis-Klasse (
backend/services/ticket_sources/base.py):authenticate(token, url) → boolfetch_tickets(since: datetime) → list[RawTicket]post_comment(ticket_id, message) → boolget_ticket_url(ticket_id) → strtest_connection() → ConnectionResult2. Neues DB-Modell:
TicketSourceConfig3. Erweiterung Ticket-Modell
Bestehendes Feld
sourceerweitern:source→ Referenz aufticket_source_configs.idstatt hardcoded Stringsource_config_id→ FK auf TicketSourceConfigexternal_ticket_id→ Generisch stattodoo_id/appsignal_incident_id4. Sync-Modus ohne Pipeline
sync_only=Truein TicketSourceConfig5. Dynamische Adapter-Generierung (Custom Ticketsystem)
Wenn ein unbekanntes Ticketsystem konfiguriert wird:
backend/services/ticket_sources/custom_{name}.py6. Frontend: Ticket-Source-Verwaltung
Neue Seite
TicketSources.tsx:7. Betroffene Dateien
Neu:
backend/services/ticket_sources/base.py— Abstrakte Basis-Klassebackend/services/ticket_sources/odoo.py— Refactored aus odoo_poller.pybackend/services/ticket_sources/appsignal.py— Refactored aus appsignal_poller.pybackend/services/ticket_sources/jira.py— Jira-Adapterbackend/services/ticket_sources/github.py— GitHub-Adapterbackend/services/ticket_sources/custom_loader.py— Dynamischer Adapter-Loaderbackend/models/ticket_source.py— Neues DB-Modellbackend/api/ticket_sources.py— Neue REST-Endpointsfrontend/src/pages/TicketSources.tsx— Neue UI-SeiteRefactored:
backend/services/odoo_poller.py→ Logik nach ticket_sources/odoo.pybackend/services/appsignal_poller.py→ Logik nach ticket_sources/appsignal.pybackend/models/ticket.py— Generische source-Felderbackend/services/pipeline.py— Sync-only Modusbackend/main.py— Dynamische Poller-Registrierungbackend/config.py— Ticket-Source-Config statt globale Odoo/AppSignal-Varsfrontend/src/App.tsx— Neue Routefrontend/src/api/client.ts— Neue API-CallsMigration:
Akzeptanzkriterien
Technische Hinweise
cryptography.fernetmit Key aus .envimportlib.import_module()für Custom-AdapterAufwand: XL
Neuer Service-Layer, DB-Migration, Frontend-Seite, Refactoring bestehender Poller.
Empfehlung: In 4 Sub-Issues aufteilen: