fix: CRLF notes and configurable test vault path (#3) #8

Merged
aep merged 2 commits from feat/3-crlf-vault-path into main 2026-10-14 23:53:06 +03:00
Owner

Closes #3.

Bounded-задача: дизайн согласован в чате, без OpenSpec change и плана.

Что сделано

  • T4.1 (src/core/note.ts) — заметки с CRLF больше не портятся. Раньше '---\r' не опознавался как граница frontmatter: readVoiceFields возвращал {}, а patchFrontmatter дописывал второй блок --- поверх существующего, и запись выпадала из очереди. Теперь строки делятся по \r?\n, а patchFrontmatter и renderNote пишут в стиле переводов строк самой заметки (область статуса и транскрипт тоже). Для LF-заметок вывод не изменился байт в байт. Смешанный файл приводится к CRLF.
  • M-3 (esbuild.config.mjs, CLAUDE.md) — путь к тестовому vault берётся из VOICE_NOTE_VAULT, по умолчанию прежний. Если vault не найден, dev-сборка предупреждает об этом, а не пропускает копирование молча.

Пункты T1.1 и O-2 этой issue закрыты раньше в PR #4 (aecab76).

Проверка

  • Добавлено 9 тестов CRLF в tests/note-frontmatter.test.ts и tests/note-body.test.ts. До правки падали 8 из них, тест «no-op when already inserted» проходил и раньше.
  • npm test с пустым ключом: 252 passed | 1 skipped. npm run typecheck — чисто. npm run build — exit 0.
  • VOICE_NOTE_VAULT=<временная папка> npm run dev копирует main.js и manifest.json в <папка>/.obsidian/plugins/voice-note/. VOICE_NOTE_VAULT=/nonexistent/vault npm run dev выводит [copy-to-vault] vault не найден…, сборка проходит.

Rulings I made

  • Смешанный файл (часть строк LF, часть CRLF) целиком приводится к CRLF, если в нём есть хотя бы один \r\n. Так проще, чем сохранять перевод строки построчно, а Obsidian читает оба варианта.
  • Предупреждение о ненайденном vault добавлено сверх согласованного дизайна. Без него сборка на чужой машине молча ничего не копирует, и это сложно заметить.

Находки

Маркер Суть Статус
T4.1 note.ts не обрабатывает CRLF fixed ba17005
M-3 жёсткий путь к vault в esbuild.config.mjs fixed b15ae97
T1.1 типы Node в src/core fixed aecab76 (PR #4)
O-2 плавающие версии зависимостей fixed aecab76 (PR #4)

🤖 Generated with Claude Code

Closes #3. Bounded-задача: дизайн согласован в чате, без OpenSpec change и плана. ## Что сделано - **T4.1** (`src/core/note.ts`) — заметки с CRLF больше не портятся. Раньше `'---\r'` не опознавался как граница frontmatter: `readVoiceFields` возвращал `{}`, а `patchFrontmatter` дописывал второй блок `---` поверх существующего, и запись выпадала из очереди. Теперь строки делятся по `\r?\n`, а `patchFrontmatter` и `renderNote` пишут в стиле переводов строк самой заметки (область статуса и транскрипт тоже). Для LF-заметок вывод не изменился байт в байт. Смешанный файл приводится к CRLF. - **M-3** (`esbuild.config.mjs`, `CLAUDE.md`) — путь к тестовому vault берётся из `VOICE_NOTE_VAULT`, по умолчанию прежний. Если vault не найден, dev-сборка предупреждает об этом, а не пропускает копирование молча. Пункты T1.1 и O-2 этой issue закрыты раньше в PR #4 (`aecab76`). ## Проверка - Добавлено 9 тестов CRLF в `tests/note-frontmatter.test.ts` и `tests/note-body.test.ts`. До правки падали 8 из них, тест «no-op when already inserted» проходил и раньше. - `npm test` с пустым ключом: 252 passed | 1 skipped. `npm run typecheck` — чисто. `npm run build` — exit 0. - `VOICE_NOTE_VAULT=<временная папка> npm run dev` копирует `main.js` и `manifest.json` в `<папка>/.obsidian/plugins/voice-note/`. `VOICE_NOTE_VAULT=/nonexistent/vault npm run dev` выводит `[copy-to-vault] vault не найден…`, сборка проходит. ## Rulings I made - Смешанный файл (часть строк LF, часть CRLF) целиком приводится к CRLF, если в нём есть хотя бы один `\r\n`. Так проще, чем сохранять перевод строки построчно, а Obsidian читает оба варианта. - Предупреждение о ненайденном vault добавлено сверх согласованного дизайна. Без него сборка на чужой машине молча ничего не копирует, и это сложно заметить. ## Находки | Маркер | Суть | Статус | |---|---|---| | T4.1 | `note.ts` не обрабатывает CRLF | fixed ba17005 | | M-3 | жёсткий путь к vault в `esbuild.config.mjs` | fixed b15ae97 | | T1.1 | типы Node в `src/core` | fixed aecab76 (PR #4) | | O-2 | плавающие версии зависимостей | fixed aecab76 (PR #4) | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 2 commits 2026-10-10 18:23:34 +03:00
readVoiceFields/patchFrontmatter split on \r?\n; patchFrontmatter and renderNote write in the note's own line-ending style. Before: a CRLF note's '---\r' was not recognised, the patch prepended a second frontmatter block and the record fell out of the queue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Default stays the author's test vault. Without the vault the dev build used to skip copying silently; now it says so and names the variable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 4aad7e3255 into main 2026-10-14 23:53:06 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/obsidian-voice-note#8
No description provided.