foundry_mcp/core/backends/
mod.rs1use anyhow::Result;
4use serde::{Deserialize, Serialize};
5
6use crate::types::{
7 project::{Project, ProjectConfig, ProjectMetadata},
8 spec::{Spec, SpecConfig, SpecFileType, SpecMetadata},
9};
10
11#[async_trait::async_trait]
13pub trait FoundryBackend: Send + Sync {
14 async fn create_project(&self, config: ProjectConfig) -> Result<Project>;
16 async fn project_exists(&self, name: &str) -> Result<bool>;
17 async fn list_projects(&self) -> Result<Vec<ProjectMetadata>>;
18 async fn load_project(&self, name: &str) -> Result<Project>;
19
20 async fn create_spec(&self, config: SpecConfig) -> Result<Spec>;
22 async fn list_specs(&self, project_name: &str) -> Result<Vec<SpecMetadata>>;
23 async fn load_spec(&self, project_name: &str, spec_name: &str) -> Result<Spec>;
24 async fn update_spec_content(
25 &self,
26 project_name: &str,
27 spec_name: &str,
28 file_type: SpecFileType,
29 content: &str,
30 ) -> Result<()>;
31 async fn delete_spec(&self, project_name: &str, spec_name: &str) -> Result<()>;
32
33 async fn get_latest_spec(&self, project_name: &str) -> Result<Option<SpecMetadata>>;
35 async fn count_specs(&self, project_name: &str) -> Result<usize>;
36
37 fn capabilities(&self) -> BackendCapabilities;
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct BackendCapabilities {
44 pub supports_documents: bool,
45 pub supports_subtasks: bool,
46 pub url_deeplinks: bool,
47 pub atomic_replace: bool,
48 pub strong_consistency: bool,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(rename_all = "snake_case")]
54pub enum ResourceLocator {
55 FilesystemPath(String),
56 }
58
59#[async_trait::async_trait]
61pub trait SpecContentStore: Send + Sync {
62 async fn read_spec_file(
63 &self,
64 project_name: &str,
65 spec_name: &str,
66 file_type: SpecFileType,
67 ) -> Result<String>;
68
69 async fn write_spec_file(
70 &self,
71 project_name: &str,
72 spec_name: &str,
73 file_type: SpecFileType,
74 content: &str,
75 ) -> Result<()>;
76
77 async fn is_file_modified(
78 &self,
79 project_name: &str,
80 spec_name: &str,
81 file_type: SpecFileType,
82 new_content: &str,
83 ) -> Result<bool>;
84}
85
86pub mod filesystem;
88
89pub mod memory;
91
92mod tests;
94
95pub use crate::core::foundry::get_default_foundry;