Skip to main content

symphony_tracker/
lib.rs

1//! Issue tracker integration (Spec Section 11).
2//!
3//! Provides a Linear-compatible tracker client that fetches candidate issues,
4//! refreshes issue states, and normalizes payloads into the core domain model.
5
6pub mod graphql_tool;
7pub mod linear;
8
9use async_trait::async_trait;
10use symphony_core::Issue;
11
12/// Errors from tracker operations (Spec Section 11.4).
13#[derive(Debug, thiserror::Error)]
14pub enum TrackerError {
15    #[error("unsupported_tracker_kind: {0}")]
16    UnsupportedKind(String),
17    #[error("missing_tracker_api_key")]
18    MissingApiKey,
19    #[error("missing_tracker_project_slug")]
20    MissingProjectSlug,
21    #[error("linear_api_request: {0}")]
22    ApiRequest(String),
23    #[error("linear_api_status: {status} {body}")]
24    ApiStatus { status: u16, body: String },
25    #[error("linear_graphql_errors: {0}")]
26    GraphqlErrors(String),
27    #[error("linear_unknown_payload: {0}")]
28    UnknownPayload(String),
29    #[error("linear_missing_end_cursor")]
30    MissingEndCursor,
31}
32
33/// Trait for issue tracker adapters (Spec Section 11.1).
34#[async_trait]
35pub trait TrackerClient: Send + Sync {
36    /// Fetch issues in configured active states for the project.
37    async fn fetch_candidate_issues(&self) -> Result<Vec<Issue>, TrackerError>;
38
39    /// Fetch issues in the given states (used for startup terminal cleanup).
40    async fn fetch_issues_by_states(&self, states: &[String]) -> Result<Vec<Issue>, TrackerError>;
41
42    /// Fetch current states for specific issue IDs (reconciliation).
43    async fn fetch_issue_states_by_ids(
44        &self,
45        issue_ids: &[String],
46    ) -> Result<Vec<Issue>, TrackerError>;
47}