carryctx 0.0.1

Persistent project context for coding agents
pub struct NewWorktree {
    pub id: String,
    pub project_id: String,
    pub path: String,
    pub branch: Option<String>,
    pub head: Option<String>,
    pub task_id: Option<String>,
}

#[derive(serde::Serialize)]
pub struct WorktreeRecord {
    pub id: String,
    pub project_id: String,
    pub path: String,
    pub branch: Option<String>,
    pub head: Option<String>,
    pub task_id: Option<String>,
    pub created_at: String,
    pub updated_at: String,
}

pub trait WorktreeRepository {
    fn upsert(
        &self,
        input: &NewWorktree,
        now: &str,
    ) -> Result<WorktreeRecord, crate::error::CarryCtxError>;
    fn find_by_id(
        &self,
        project_id: &str,
        id: &str,
    ) -> Result<Option<WorktreeRecord>, crate::error::CarryCtxError>;
    fn find_by_path(
        &self,
        project_id: &str,
        path: &str,
    ) -> Result<Option<WorktreeRecord>, crate::error::CarryCtxError>;
    fn find_by_task_id(
        &self,
        project_id: &str,
        task_id: &str,
    ) -> Result<Option<WorktreeRecord>, crate::error::CarryCtxError>;
    fn list(&self, project_id: &str) -> Result<Vec<WorktreeRecord>, crate::error::CarryCtxError>;
    fn unbind_task(
        &self,
        id: &str,
        project_id: &str,
        now: &str,
    ) -> Result<WorktreeRecord, crate::error::CarryCtxError>;
}