foundry_mcp/types/
edit_commands.rs1use 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}