feat: move vault cache to ~/.laputa/cache/ and make writes atomic

Cache files are now stored outside the vault directory at
~/.laputa/cache/<vault-hash>.json, preventing them from polluting
the user's git repo. Writes use atomic tmp+rename to avoid corruption.
Legacy .laputa-cache.json files are auto-migrated and cleaned up on
first run.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Test
2026-03-08 22:58:00 +01:00
parent 5c85bc41f6
commit aef98f17eb
7 changed files with 295 additions and 255 deletions

View File

@@ -44,7 +44,6 @@ pub fn init_repo(path: &str) -> Result<(), String> {
std::fs::write(
&gitignore_path,
"# Laputa app files (machine-specific, never commit)\n\
.laputa-cache.json\n\
.laputa/settings.json\n\
\n\
# macOS\n\
@@ -265,7 +264,7 @@ mod tests {
}
#[test]
fn test_init_repo_creates_gitignore_with_ds_store() {
fn test_init_repo_creates_gitignore() {
let dir = TempDir::new().unwrap();
let vault = dir.path().join("new-vault");
fs::create_dir_all(&vault).unwrap();
@@ -283,14 +282,15 @@ mod tests {
content.contains(".DS_Store"),
".gitignore should exclude .DS_Store"
);
assert!(
content.contains(".laputa-cache.json"),
".gitignore should exclude .laputa-cache.json"
);
assert!(
content.contains(".laputa/settings.json"),
".gitignore should exclude settings.json"
);
// Cache is now stored outside the vault — no need for .gitignore entry
assert!(
!content.contains(".laputa-cache.json"),
".gitignore should NOT contain .laputa-cache.json (cache is external)"
);
}
#[test]