feat(tickets): ajoute les pièces jointes sur tickets (#108)

Stockage flat côté ticket + métadonnées d'attachments, lecture exposée côté
backend/MCP, et UI minimale de liste/ajout dans TicketDetail. Traverse le
domaine (Issue, ports), l'application (usecases + assistant de ticket), les
adaptateurs infra/MCP (issues store, orchestrateur), les DTO backend/web-
server/app-tauri, et le frontend (domain/ports/adapters/hooks/UI).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-29 11:08:45 +02:00
parent 2692b9cc03
commit 8158057b1d
34 changed files with 1722 additions and 102 deletions

View File

@ -68,6 +68,7 @@ import type {
TerminalSession,
Ticket,
TicketBulkResult,
TicketAttachmentContent,
TicketChat,
TicketCarnet,
TicketLinkKind,
@ -96,6 +97,12 @@ export interface SystemGateway {
* cancelled. Same sanctioned-picker rule as {@link pickFolder}.
*/
pickArchiveFile(): Promise<string | null>;
/**
* Opens a native file picker for one local file and returns its path, or
* `null` when cancelled. Used for ticket attachments; no file bytes cross the
* frontend boundary.
*/
pickFile(): Promise<string | null>;
/**
* Subscribes to the app-exit work-in-progress guard (ticket #83): fired when
* closing the main window is intercepted because it would interrupt active
@ -1096,6 +1103,27 @@ export interface TicketGateway {
carnet: string,
expectedVersion: number,
): Promise<Ticket>;
/** Adds a local file path as a ticket attachment and returns the updated ticket. */
addAttachment(
projectId: string,
ref: string,
path: string,
expectedVersion: number,
mime?: string | null,
): Promise<Ticket>;
/** Reads raw attachment content as base64. Not used by the minimal v1 UI. */
readAttachment(
projectId: string,
ref: string,
attachmentId: string,
): Promise<TicketAttachmentContent>;
/** Marks an attachment as summarized in the ticket carnet. */
markAttachmentSummarized(
projectId: string,
ref: string,
attachmentId: string,
expectedVersion: number,
): Promise<Ticket>;
/** Links this ticket to another `#id` with the given relationship kind. */
link(
projectId: string,