//! Local workspace web control plane backend bootstrap. //! //! This crate deliberately provides backend building blocks and an HTTP router; //! it is not the product CLI facade. Existing `.yoi` Ticket and Objective files //! remain the canonical project records and are read through bounded bridge APIs. pub mod hosts; pub mod identity; pub mod records; pub mod repositories; pub mod server; pub mod store; pub use identity::{WORKSPACE_IDENTITY_RELATIVE_PATH, WorkspaceIdentity}; pub use records::{ LocalProjectRecordReader, ObjectiveDetail, ObjectiveSummary, TicketDetail, TicketSummary, }; pub use repositories::{ GitCommitSummary, GitRemoteSummary, GitRepositorySummary, LocalRepositoryReader, RepositoryLogRead, RepositorySummary, }; pub use server::{AuthConfig, ServerConfig, WorkspaceApi, build_router, serve}; pub use store::{ControlPlaneStore, SqliteWorkspaceStore, WorkspaceRecord}; pub type Result = std::result::Result; #[derive(Debug, thiserror::Error)] pub enum Error { #[error("io error: {0}")] Io(#[from] std::io::Error), #[error("sqlite error: {0}")] Sqlite(#[from] rusqlite::Error), #[error("ticket error: {0}")] Ticket(#[from] ticket::TicketError), #[error("yaml error: {0}")] Yaml(#[from] serde_yaml::Error), #[error("invalid project record id `{0}`")] InvalidRecordId(String), #[error("record `{0}` is missing frontmatter")] MissingFrontmatter(String), #[error("unknown local host `{0}`")] UnknownHost(String), #[error("unknown local repository `{0}`")] UnknownRepository(String), #[error("workspace identity error: {0}")] WorkspaceIdentity(String), #[error("store error: {0}")] Store(String), }