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

@ -17,11 +17,11 @@ use domain::profile::StructuredAdapter;
use domain::{
AgentId, AgentPermissionOverride, AgentProfile, AgentToolPolicy, AgentToolPolicyStore,
AssistantContextError, AssistantContextProvider, ContextInjection, DomainEvent, EventBus,
EventStream, Issue, IssueActor, IssueCarnet, IssueId, IssueListFilter, IssueNumber,
IssuePriority, IssueRef, IssueStatus, IssueStore, IssueStoreError, IssueVersion, MarkdownDoc,
NetworkPolicy, PermissionSet, PreparedContext, ProfileId, ProfileStore, Project, ProjectId,
ProjectPath, ProjectPermissions, ProjectSystemPermissions, RemoteRef, SessionId,
SystemPermissionSet,
EventStream, Issue, IssueActor, IssueAttachmentContent, IssueAttachmentId, IssueCarnet,
IssueId, IssueListFilter, IssueNumber, IssuePriority, IssueRef, IssueStatus, IssueStore,
IssueStoreError, IssueVersion, LocalPath, MarkdownDoc, NetworkPolicy, PermissionSet,
PreparedContext, ProfileId, ProfileStore, Project, ProjectId, ProjectPath, ProjectPermissions,
ProjectSystemPermissions, RemoteRef, SessionId, SystemPermissionSet,
};
use uuid::Uuid;
@ -138,6 +138,42 @@ impl IssueStore for FakeIssues {
) -> Result<IssueCarnet, IssueStoreError> {
unimplemented!()
}
async fn add_attachment_from_path(
&self,
_root: &ProjectPath,
_issue_ref: IssueRef,
_source: &LocalPath,
_attachment_id: IssueAttachmentId,
_filename: String,
_mime: String,
_actor: IssueActor,
_now_ms: u64,
_expected_version: IssueVersion,
) -> Result<Issue, IssueStoreError> {
unimplemented!()
}
async fn read_attachment(
&self,
_root: &ProjectPath,
_issue_ref: IssueRef,
_attachment_id: &IssueAttachmentId,
) -> Result<IssueAttachmentContent, IssueStoreError> {
unimplemented!()
}
async fn mark_attachment_summarized(
&self,
_root: &ProjectPath,
_issue_ref: IssueRef,
_attachment_id: &IssueAttachmentId,
_actor: IssueActor,
_now_ms: u64,
_expected_version: IssueVersion,
) -> Result<Issue, IssueStoreError> {
unimplemented!()
}
}
struct FakeProfiles {