feat(sprints): modèle de sprints — domaine, use-cases, persistance et surfaces (backend)

Ticket #10 — introduction du modèle de sprints côté backend.

- Domaine : nouvel agrégat Sprint (sprint.rs), IDs, événements et invariants ;
  rattachement des issues à un sprint (issue.rs) et ports associés.
- Application : use-cases sprints (application/src/sprints) + erreurs dédiées.
- Infrastructure : store de sprints (infrastructure/src/sprints.rs), adaptation
  du store d'issues et exposition MCP via orchestrator/mcp/tickets.rs.
- app-tauri : commandes, state et events pour piloter les sprints depuis l'UI.

Tests domaine/application/infra/app-tauri verts (sprint_usecases, sprint_store,
issue_store, mcp_server).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 10:57:33 +02:00
parent 9740149ebb
commit 48b652ff91
21 changed files with 2896 additions and 45 deletions

View File

@ -8,7 +8,7 @@ use std::str::FromStr;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use crate::ids::{AgentId, IssueId};
use crate::ids::{AgentId, IssueId, SprintId};
use crate::markdown::MarkdownDoc;
/// Sequential per-project issue number.
@ -255,6 +255,8 @@ pub struct Issue {
pub status: IssueStatus,
/// Priority.
pub priority: IssuePriority,
/// Sprint membership. `None` means backlog / no sprint.
pub sprint: Option<SprintId>,
/// Editable issue-local knowledge.
pub carnet: MarkdownDoc,
/// Links to other issues.
@ -299,6 +301,7 @@ impl Issue {
description,
status,
priority,
sprint: None,
carnet,
links,
agent_refs,
@ -392,6 +395,8 @@ pub struct IssueIndexEntry {
pub status: IssueStatus,
/// Priority.
pub priority: IssuePriority,
/// Sprint membership.
pub sprint: Option<SprintId>,
/// Assigned agent ids.
pub assigned_agent_ids: Vec<AgentId>,
/// Last update time.
@ -406,6 +411,7 @@ impl From<&Issue> for IssueIndexEntry {
title: issue.title.clone(),
status: issue.status,
priority: issue.priority,
sprint: issue.sprint,
assigned_agent_ids: issue
.agent_refs
.iter()
@ -426,6 +432,8 @@ pub struct IssueListFilter {
pub priority: Option<IssuePriority>,
/// Optional assigned agent filter.
pub assigned_agent_id: Option<AgentId>,
/// Optional sprint membership filter.
pub sprint: Option<SprintId>,
/// Optional case-insensitive text query.
pub text: Option<String>,
}