feat(tickets): suppression d'un ticket (backend + frontend)

Ajoute la suppression complète d'un ticket (#6).

Backend Rust :
- port IssueStore::delete (NotFound si absent) + event IssueDeleted{freed_sprint}
- FsIssueStore::delete : supprime .ideai/tickets/<N>/ et l'index sous lock
- use case DeleteIssue + adaptations des tests sprint/ticket_assistant au port
- commande Tauri ticket_delete + câblage events/state/lib

Frontend :
- gateway delete (ports, adapter ticket + mock, domain)
- useTicketDetail : retrait de la liste et fermeture du détail via event issueDeleted
- intégration TicketDetail + tests

Tests verts : application/issue_usecases (6), infrastructure/issue_store (7),
app-tauri --lib (56), frontend vitest (503), npm run build (exit 0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 06:27:09 +02:00
parent d25e340b44
commit 5417bd756b
20 changed files with 689 additions and 95 deletions

View File

@ -126,6 +126,19 @@ export type DomainEvent =
}
| { type: "issueCreated"; issueId: string; issueRef: string }
| { type: "issueUpdated"; issueRef: string; version: number }
| {
/**
* A ticket was deleted (ticket #6). Mirror of the backend
* `DomainEventDto::IssueDeleted`. `issueRef` is the deleted `#N`;
* `freedSprint` is the sprint id it was released from, when any. Starts with
* `issue`, so {@link isTicketEvent} matches it and ticket lists refresh
* automatically; an open detail on the same `issueRef` closes.
*/
type: "issueDeleted";
projectId: string;
issueRef: string;
freedSprint: string | null;
}
| {
type: "issueStatusChanged";
issueRef: string;