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

@ -911,6 +911,8 @@ fn is_ticket_policy_mutation_tool(name: &str) -> bool {
| "idea_ticket_update_status"
| "idea_ticket_update_priority"
| "idea_ticket_update_carnet"
| "idea_ticket_attachment_add"
| "idea_ticket_attachment_mark_summarized"
| "idea_ticket_link"
| "idea_ticket_unlink"
)

View File

@ -292,6 +292,48 @@ pub fn catalogue() -> Vec<ToolDef> {
"additionalProperties": false
}),
},
ToolDef {
name: "idea_ticket_attachment_add",
description: "Attach a local file to a ticket using optimistic concurrency.",
input_schema: json!({
"type": "object",
"properties": {
"ref": ticket_ref.clone(),
"path": { "type": "string" },
"mime": { "type": "string" },
"expectedVersion": { "type": "integer", "minimum": 1 }
},
"required": ["ref", "path", "expectedVersion"],
"additionalProperties": false
}),
},
ToolDef {
name: "idea_ticket_attachment_read",
description: "Read one ticket attachment as base64 content.",
input_schema: json!({
"type": "object",
"properties": {
"ref": ticket_ref.clone(),
"attachmentId": { "type": "string" }
},
"required": ["ref", "attachmentId"],
"additionalProperties": false
}),
},
ToolDef {
name: "idea_ticket_attachment_mark_summarized",
description: "Mark a ticket attachment as summarized in the carnet.",
input_schema: json!({
"type": "object",
"properties": {
"ref": ticket_ref.clone(),
"attachmentId": { "type": "string" },
"expectedVersion": { "type": "integer", "minimum": 1 }
},
"required": ["ref", "attachmentId", "expectedVersion"],
"additionalProperties": false
}),
},
ToolDef {
name: "idea_ticket_link",
description: "Add a link from one ticket to another using optimistic concurrency.",

View File

@ -53,6 +53,7 @@ pub const READ_ONLY_TOOLS: &[&str] = &[
"idea_ticket_read",
"idea_ticket_list",
"idea_ticket_read_carnet",
"idea_ticket_attachment_read",
"idea_sprint_list",
"idea_template_list",
"idea_template_read",
@ -78,6 +79,8 @@ pub const WRITE_ACTION_TOOLS: &[&str] = &[
"idea_ticket_bulk_update_priority",
"idea_ticket_bulk_delete",
"idea_ticket_update_carnet",
"idea_ticket_attachment_add",
"idea_ticket_attachment_mark_summarized",
"idea_ticket_link",
"idea_ticket_unlink",
"idea_template_create",