handoff-mcp-server 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.lock +42 -1
- package/Cargo.toml +3 -2
- package/README.md +163 -4
- package/package.json +1 -1
- package/scripts/cargo-env.sh +29 -0
- package/scripts/handoff-memory-hook.py +208 -0
- package/skills/handoff/SKILL.md +8 -1
- package/src/mcp/handlers/capacity.rs +21 -6
- package/src/mcp/handlers/config.rs +80 -0
- package/src/mcp/handlers/init.rs +1 -1
- package/src/mcp/handlers/memory.rs +906 -0
- package/src/mcp/handlers/metrics.rs +11 -0
- package/src/mcp/handlers/mod.rs +6 -0
- package/src/mcp/handlers/referrals.rs +20 -1
- package/src/mcp/handlers/update_task.rs +53 -4
- package/src/mcp/tools.rs +77 -0
- package/src/storage/config.rs +69 -0
- package/src/storage/memory/injected.rs +340 -0
- package/src/storage/memory/mod.rs +235 -0
- package/src/storage/memory/model.rs +96 -0
- package/src/storage/mod.rs +2 -0
- package/src/storage/referrals.rs +38 -0
- package/src/storage/tasks.rs +55 -0
|
@@ -44,7 +44,15 @@ pub fn handle_update(arguments: &Value) -> Result<String> {
|
|
|
44
44
|
"settings.history_limit",
|
|
45
45
|
"settings.done_task_limit",
|
|
46
46
|
"settings.auto_git_summary",
|
|
47
|
+
"settings.require_estimate_hours",
|
|
48
|
+
"settings.ai_estimate_multiplier",
|
|
47
49
|
"settings.context_files",
|
|
50
|
+
"settings.memory_enabled",
|
|
51
|
+
"settings.memory_dup_threshold",
|
|
52
|
+
"settings.memory_query_min_score",
|
|
53
|
+
"settings.memory_query_limit",
|
|
54
|
+
"settings.memory_stale_days",
|
|
55
|
+
"settings.memory_injected_gc_days",
|
|
48
56
|
"dashboard.scan_dirs",
|
|
49
57
|
"dashboard.exclude_patterns",
|
|
50
58
|
"project.name",
|
|
@@ -87,6 +95,21 @@ pub fn handle_update(arguments: &Value) -> Result<String> {
|
|
|
87
95
|
applied.push(format!("settings.auto_git_summary = {b}"));
|
|
88
96
|
}
|
|
89
97
|
}
|
|
98
|
+
"settings.require_estimate_hours" => {
|
|
99
|
+
if let Some(b) = value.as_bool() {
|
|
100
|
+
config.settings.require_estimate_hours = b;
|
|
101
|
+
applied.push(format!("settings.require_estimate_hours = {b}"));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
"settings.ai_estimate_multiplier" => {
|
|
105
|
+
if let Some(n) = value.as_f64() {
|
|
106
|
+
if n < 0.0 {
|
|
107
|
+
anyhow::bail!("settings.ai_estimate_multiplier must be >= 0");
|
|
108
|
+
}
|
|
109
|
+
config.settings.ai_estimate_multiplier = n;
|
|
110
|
+
applied.push(format!("settings.ai_estimate_multiplier = {n}"));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
90
113
|
"settings.context_files" => {
|
|
91
114
|
if let Some(arr) = value.as_array() {
|
|
92
115
|
config.settings.context_files = arr
|
|
@@ -99,6 +122,63 @@ pub fn handle_update(arguments: &Value) -> Result<String> {
|
|
|
99
122
|
));
|
|
100
123
|
}
|
|
101
124
|
}
|
|
125
|
+
"settings.memory_enabled" => {
|
|
126
|
+
let Some(b) = value.as_bool() else {
|
|
127
|
+
anyhow::bail!("settings.memory_enabled must be a boolean");
|
|
128
|
+
};
|
|
129
|
+
config.settings.memory_enabled = b;
|
|
130
|
+
applied.push(format!("settings.memory_enabled = {b}"));
|
|
131
|
+
}
|
|
132
|
+
"settings.memory_dup_threshold" => {
|
|
133
|
+
let Some(n) = value.as_f64() else {
|
|
134
|
+
anyhow::bail!("settings.memory_dup_threshold must be a number");
|
|
135
|
+
};
|
|
136
|
+
if !(0.0..=1.0).contains(&n) {
|
|
137
|
+
anyhow::bail!("settings.memory_dup_threshold must be between 0 and 1");
|
|
138
|
+
}
|
|
139
|
+
config.settings.memory_dup_threshold = n;
|
|
140
|
+
applied.push(format!("settings.memory_dup_threshold = {n}"));
|
|
141
|
+
}
|
|
142
|
+
"settings.memory_query_min_score" => {
|
|
143
|
+
let Some(n) = value.as_f64() else {
|
|
144
|
+
anyhow::bail!("settings.memory_query_min_score must be a number");
|
|
145
|
+
};
|
|
146
|
+
if n < 0.0 {
|
|
147
|
+
anyhow::bail!("settings.memory_query_min_score must be >= 0");
|
|
148
|
+
}
|
|
149
|
+
config.settings.memory_query_min_score = n;
|
|
150
|
+
applied.push(format!("settings.memory_query_min_score = {n}"));
|
|
151
|
+
}
|
|
152
|
+
"settings.memory_query_limit" => {
|
|
153
|
+
let Some(n) = value.as_u64() else {
|
|
154
|
+
anyhow::bail!("settings.memory_query_limit must be a non-negative integer");
|
|
155
|
+
};
|
|
156
|
+
if n == 0 {
|
|
157
|
+
anyhow::bail!("settings.memory_query_limit must be >= 1");
|
|
158
|
+
}
|
|
159
|
+
config.settings.memory_query_limit = n as u32;
|
|
160
|
+
applied.push(format!("settings.memory_query_limit = {n}"));
|
|
161
|
+
}
|
|
162
|
+
"settings.memory_stale_days" => {
|
|
163
|
+
let Some(n) = value.as_i64() else {
|
|
164
|
+
anyhow::bail!("settings.memory_stale_days must be an integer");
|
|
165
|
+
};
|
|
166
|
+
if n < 0 {
|
|
167
|
+
anyhow::bail!("settings.memory_stale_days must be >= 0");
|
|
168
|
+
}
|
|
169
|
+
config.settings.memory_stale_days = n;
|
|
170
|
+
applied.push(format!("settings.memory_stale_days = {n}"));
|
|
171
|
+
}
|
|
172
|
+
"settings.memory_injected_gc_days" => {
|
|
173
|
+
let Some(n) = value.as_i64() else {
|
|
174
|
+
anyhow::bail!("settings.memory_injected_gc_days must be an integer");
|
|
175
|
+
};
|
|
176
|
+
if n < 0 {
|
|
177
|
+
anyhow::bail!("settings.memory_injected_gc_days must be >= 0");
|
|
178
|
+
}
|
|
179
|
+
config.settings.memory_injected_gc_days = n;
|
|
180
|
+
applied.push(format!("settings.memory_injected_gc_days = {n}"));
|
|
181
|
+
}
|
|
102
182
|
"dashboard.scan_dirs" => {
|
|
103
183
|
if let Some(arr) = value.as_array() {
|
|
104
184
|
config.dashboard.scan_dirs = arr
|
package/src/mcp/handlers/init.rs
CHANGED
|
@@ -21,7 +21,7 @@ pub fn handle(arguments: &Value) -> Result<String> {
|
|
|
21
21
|
|
|
22
22
|
Ok(format!(
|
|
23
23
|
"Initialized handoff tracking for '{}' at {}/.handoff/\n\
|
|
24
|
-
Created: config.toml, sessions/, tasks/",
|
|
24
|
+
Created: config.toml, sessions/, tasks/, memory/",
|
|
25
25
|
project_name,
|
|
26
26
|
project_dir.display()
|
|
27
27
|
))
|