feat: Added new memory functions for deleting and renaming memory files, as well as new lints for memory expiration dates and staleness of memories to improve the memory system
CI / All (ubuntu-latest) (push) Failing after 28s
CI / All (macos-latest) (push) Has been cancelled
CI / All (windows-latest) (push) Has been cancelled

This commit is contained in:
2026-07-03 22:30:08 -06:00
parent ede0f75a89
commit 08f6ea5e6c
3 changed files with 742 additions and 48 deletions
+9
View File
@@ -118,6 +118,14 @@ pub struct MemoryFrontmatter {
pub description: Option<String>,
#[serde(default, rename = "type")]
pub kind: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub superseded_by: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires: Option<String>,
}
#[derive(Debug, Clone)]
@@ -545,6 +553,7 @@ mod tests {
name: "test".into(),
description: Some("a test".into()),
kind: Some("user".into()),
..Default::default()
},
body: "Hello world\nmore text".into(),
};
+12 -2
View File
@@ -18,10 +18,16 @@ pub(crate) const DEFAULT_MEMORY_INSTRUCTIONS: &str = indoc! {"
- `memory__read(name)`: Read a specific drill file's full content.
- `memory__write(name, content, scope)`: Create or replace a drill file (scope: 'global' | 'workspace').
The MEMORY.md index is appended automatically; do not also update the index by hand.
Optional `superseded_by` / `expires` (YYYY-MM-DD) mark a memory as stale for later cleanup.
- `memory__rename(name, new_name, scope)`: Rename a drill file. Its index entry and every
[[wikilink]] to it are rewritten automatically.
- `memory__delete(name, scope)`: Delete a drill file and its index entry. Reports any
[[wikilinks]] left dangling in other files.
- `memory__edit_index(scope, content)`: Replace the entire MEMORY.md at the given scope.
Use this to add always-on facts, reorganize, prune stale entries, or fix descriptions.
- `memory__list()`: See all known drill files and their metadata.
- `memory__lint()`: Health-check memory for orphans, broken links, oversized files.
- `memory__lint()`: Health-check memory for orphans, broken links, oversized files,
stale (superseded/expired) files, and index descriptions that drifted from the files.
RULES:
- Every interaction has two outputs: your answer AND any memory updates the conversation warrants.
@@ -29,7 +35,11 @@ pub(crate) const DEFAULT_MEMORY_INSTRUCTIONS: &str = indoc! {"
- All MEMORY.md edits MUST go through `memory__edit_index`. NEVER use `fs_write`, `fs_patch`,
or any other generic file tool on MEMORY.md — Coyote manages its location and a stray
MEMORY.md outside the managed path is invisible to memory.
- All drill files MUST go through `memory__write`. The index updates itself.
- All drill files MUST go through `memory__write`. The index updates itself. Renames and
deletions MUST go through `memory__rename` / `memory__delete` so links stay intact.
- When a fact becomes outdated, update it in place, delete it, or mark the old file with
`superseded_by`/`expires` so `memory__lint` flags it later. Never leave contradictory
memories side by side.
- Use [[wikilink]] notation in memory files to reference other memories by their `name:` slug.
- NEVER write secrets, credentials, or API keys to memory — memory is plaintext on disk.
Use coyote's Vault for secrets.