Skip to main content

tycode_core/file/modify/
mod.rs

1//! File modification module.
2//!
3//! Provides tools for creating, updating, and deleting files.
4//! The modify_file tool implementation is selected based on FileModificationApi setting.
5
6pub mod apply_codex_patch;
7pub mod cline_replace_in_file;
8pub mod command;
9pub mod delete_file;
10pub mod replace_in_file;
11pub mod write_file;
12
13use std::path::PathBuf;
14use std::sync::Arc;
15
16use anyhow::Result;
17
18use crate::file::config::File;
19use crate::module::ContextComponent;
20use crate::module::Module;
21use crate::module::PromptComponent;
22use crate::module::SlashCommand;
23use crate::settings::config::FileModificationApi;
24use crate::settings::SettingsManager;
25use crate::tools::r#trait::ToolExecutor;
26
27use command::FileApiSlashCommand;
28
29use apply_codex_patch::ApplyCodexPatchTool;
30use cline_replace_in_file::ClineReplaceInFileTool;
31use delete_file::DeleteFileTool;
32use replace_in_file::ReplaceInFileTool;
33use write_file::WriteFileTool;
34
35/// Module providing file modification capabilities.
36///
37/// Bundles:
38/// - WriteFileTool: Create or overwrite files
39/// - DeleteFileTool: Delete files or empty directories
40/// - modify_file tool: Selected based on FileModificationApi setting (late bound)
41pub struct FileModifyModule {
42    write_file: Arc<WriteFileTool>,
43    delete_file: Arc<DeleteFileTool>,
44    apply_codex_patch: Arc<ApplyCodexPatchTool>,
45    replace_in_file: Arc<ReplaceInFileTool>,
46    cline_replace_in_file: Arc<ClineReplaceInFileTool>,
47    settings: SettingsManager,
48}
49
50impl FileModifyModule {
51    pub fn new(workspace_roots: Vec<PathBuf>, settings: SettingsManager) -> Result<Self> {
52        Ok(Self {
53            write_file: Arc::new(WriteFileTool::new(workspace_roots.clone())?),
54            delete_file: Arc::new(DeleteFileTool::new(workspace_roots.clone())?),
55            apply_codex_patch: Arc::new(ApplyCodexPatchTool::new(workspace_roots.clone())?),
56            replace_in_file: Arc::new(ReplaceInFileTool::new(workspace_roots.clone())?),
57            cline_replace_in_file: Arc::new(ClineReplaceInFileTool::new(workspace_roots)?),
58            settings,
59        })
60    }
61}
62
63impl Module for FileModifyModule {
64    fn prompt_components(&self) -> Vec<Arc<dyn PromptComponent>> {
65        vec![]
66    }
67
68    fn context_components(&self) -> Vec<Arc<dyn ContextComponent>> {
69        vec![]
70    }
71
72    fn slash_commands(&self) -> Vec<Arc<dyn SlashCommand>> {
73        vec![Arc::new(FileApiSlashCommand)]
74    }
75
76    fn tools(&self) -> Vec<Arc<dyn ToolExecutor>> {
77        let modify_file: Arc<dyn ToolExecutor> = match self
78            .settings
79            .get_module_config::<File>(File::NAMESPACE)
80            .file_modification_api
81        {
82            FileModificationApi::Patch => self.apply_codex_patch.clone(),
83            FileModificationApi::Default | FileModificationApi::FindReplace => {
84                self.replace_in_file.clone()
85            }
86            FileModificationApi::ClineSearchReplace => self.cline_replace_in_file.clone(),
87        };
88
89        vec![
90            self.write_file.clone(),
91            self.delete_file.clone(),
92            modify_file,
93        ]
94    }
95}