Feature/semantic similarity (#36)

* fix: mixed up migrations

* feat: semantic similarity first take

* feat: semantic similarity first round of fixes

* feat: more work on making semantic similarity work properly

* feat: getPostBySlug for the AI

* feat: show similarity in post-link-insert-modal

* chore: remove done doc

---------

Co-authored-by: hugo <hugoms@me.com>
This commit is contained in:
Georg Bauer
2026-03-05 22:05:32 +01:00
committed by GitHub
parent 8ac8305e01
commit 7e1e8981a3
64 changed files with 6429 additions and 499 deletions

View File

@@ -450,6 +450,36 @@ describe('MetaEngine', () => {
}));
});
it('should preserve semanticSimilarityEnabled when updating from null metadata', async () => {
// projectMetadata is null (fresh engine, no syncOnStartup called)
// Simulates the case where setProjectContext was just called (e.g., dataPath change)
expect(await metaEngine.getProjectMetadata()).toBeNull();
await metaEngine.updateProjectMetadata({ name: 'Blog', semanticSimilarityEnabled: true });
const metadata = await metaEngine.getProjectMetadata();
expect(metadata?.semanticSimilarityEnabled).toBe(true);
});
it('should preserve semanticSimilarityEnabled when merging into existing metadata', async () => {
await metaEngine.setProjectMetadata({ name: 'Blog', semanticSimilarityEnabled: true });
// Update an unrelated field — should not lose semanticSimilarityEnabled
await metaEngine.updateProjectMetadata({ name: 'Renamed Blog' });
const metadata = await metaEngine.getProjectMetadata();
expect(metadata?.semanticSimilarityEnabled).toBe(true);
});
it('should persist semanticSimilarityEnabled to project.json', async () => {
await metaEngine.updateProjectMetadata({ name: 'Blog', semanticSimilarityEnabled: true });
const metaDir = metaEngine.getMetaDir();
const projectPath = normalizePath(`${metaDir}/project.json`);
const parsed = JSON.parse(mockFiles.get(projectPath)!);
expect(parsed.semanticSimilarityEnabled).toBe(true);
});
it('should update project name only', async () => {
await metaEngine.setProjectMetadata({
name: 'Original Name',