Skip to main content

foundry_mcp/types/
edit_commands.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4#[serde(rename_all = "snake_case")]
5pub enum EditCommandTarget {
6    Spec,
7    Tasks,
8    Notes,
9}
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(rename_all = "snake_case")]
13pub enum EditCommandName {
14    SetTaskStatus,
15    UpsertTask,
16    AppendToSection,
17    RemoveListItem,
18    RemoveFromSection,
19    RemoveSection,
20    ReplaceListItem,
21    ReplaceInSection,
22    ReplaceSectionContent,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26#[serde(tag = "type", rename_all = "snake_case")]
27pub enum EditSelector {
28    Section {
29        value: String,
30    },
31    TaskText {
32        value: String,
33        #[serde(default)]
34        section_context: Option<String>,
35    },
36    TextInSection {
37        section: String,
38        text: String,
39    },
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
43#[serde(rename_all = "snake_case")]
44pub enum TaskStatus {
45    Done,
46    Todo,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct EditCommand {
51    pub target: EditCommandTarget,
52    pub command: EditCommandName,
53    pub selector: EditSelector,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub status: Option<TaskStatus>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub content: Option<String>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct FileUpdateSummary {
62    pub target: EditCommandTarget,
63    pub applied: usize,
64    pub skipped_idempotent: usize,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub hints: Option<Vec<String>>,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct SelectorCandidate {
71    pub selector_suggestion: EditSelector,
72    pub preview: String,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct EditCommandError {
77    pub target: EditCommandTarget,
78    pub command_index: usize,
79    pub message: String,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub candidates: Option<Vec<SelectorCandidate>>,
82}