fix: 修复笔记 YAML 标签保存与索引重建一致性

This commit is contained in:
2026-09-05 19:40:14 +08:00
parent 8692910508
commit 02dd585a4e
9 changed files with 219 additions and 55 deletions
@@ -50,6 +50,25 @@ afterEach(() => {
})
describe('workspaceService backend adapter', () => {
it.each([
['tags:\n- python\n- rust', { tags: ['python', 'rust'] }],
['tags: []', { tags: [] }],
['tags:', { tags: [] }],
['tags: ["a,b", rust]', { tags: ['a,b', 'rust'] }],
['title: Demo', {}],
['tags: [broken', {}],
])('saves explicit metadata tags with the same Markdown snapshot: %s', async (yaml, tagPayload) => {
const fetchMock = vi.mocked(fetch)
fetchMock.mockImplementation(async (input) => String(input) === '/api/workspace/open'
? jsonResponse(workspaceSnapshot) : jsonResponse({}))
await workspaceService.openVault('C:\\data\\vault')
const markdown = `---\n${yaml}\n---\n# Body\n`
await workspaceService.saveFileContent('/课程/操作系统.md', markdown)
const patchCall = fetchMock.mock.calls.find(([, init]) => init?.method === 'PATCH')
expect(String(patchCall?.[0])).toBe('/api/notes/note-os')
expect(JSON.parse(String(patchCall?.[1]?.body))).toEqual({ markdown, ...tagPayload })
})
it('opens the configured Vault and reads/saves Markdown through Note API', async () => {
const fetchMock = vi.mocked(fetch)
fetchMock.mockImplementation(async (input, init) => {
+7 -1
View File
@@ -9,6 +9,7 @@ import type {
import apiClient from './apiClient'
import { t } from '@/i18n'
import * as noteService from './noteService'
import { splitNoteMetadata } from '@/utils/noteMetadata'
/** Web 联调只连接 AI Core 配置的单一 Vault;多 Vault 选择由 Tauri Host 接管。 */
export interface VaultInfo {
@@ -122,7 +123,12 @@ export async function getNoteId(filePath: string): Promise<string> {
}
export async function saveFileContent(filePath: string, content: string): Promise<void> {
await noteService.updateNote(await requireNoteId(filePath), { markdown: content })
const metadata = splitNoteMetadata(content)
await noteService.updateNote(await requireNoteId(filePath), {
markdown: content,
// Explicit [] clears the index; absent tags retain API-managed tags.
...(metadata?.hasTags ? { tags: metadata.tags } : {}),
})
}
export async function createFile(