feat(git-sync): native-Obsidian vault format (thin meta) — phases 1–2 #148
Closed
Ghost
wants to merge 45 commits from
feat/git-sync-thin-meta into feat/git-sync
pull from: feat/git-sync-thin-meta
merge into: vvzvlad:feat/git-sync
vvzvlad:main
vvzvlad:test/244-part-b
vvzvlad:fix/255-ws-redis-adapter-leak
vvzvlad:feat/251-intentional-clear
vvzvlad:fix/252-e2e-open-handles
vvzvlad:feat/184-autonomous-agent-runs
vvzvlad:feat/221-image-captions
vvzvlad:feat/git-sync
vvzvlad:refactor/193-tool-spec-registry
vvzvlad:fix/244-dataloss-bugs
vvzvlad:fix/embeddings-reindex-progress
vvzvlad:develop
vvzvlad:feature/offline-sync
vvzvlad:feat/229-catalog-yaml
vvzvlad:feat/243-blob-sandbox
vvzvlad:feat/228-inline-footnotes
vvzvlad:fix/qa-ui-bugs-216-218
vvzvlad:feature/agent-roles-catalog
vvzvlad:fix/share-alias-rename
vvzvlad:fix/ai-chat-empty-render
vvzvlad:feat/191-chat-doc-binding
vvzvlad:feat/201-temporary-notes
vvzvlad:feat/198-interrupt-agent
vvzvlad:feat/ai-chat-full-history
vvzvlad:feat/199-ai-generate-title
vvzvlad:feat/205-share-aliases
vvzvlad:batch/issues-189-187-170
vvzvlad:feat/170-mcp-test-button
vvzvlad:feat/189-context-badge
vvzvlad:feat/198-interrupt-agent-send-now
vvzvlad:fix/issues-190-159
vvzvlad:fix/ai-chat-new-chat-during-stream
vvzvlad:fix/ai-chat-stream-perf
vvzvlad:batch/issues-2026-06-25
vvzvlad:feat/ai-chat-persistent-history
vvzvlad:fix/ai-chat-copy-chat-wysiwyg
vvzvlad:fix/ai-stream-reset-resilience
vvzvlad:fix/ai-stream-undici-timeout
vvzvlad:fix/footnote-review-1227-followup
vvzvlad:fix/ai-chat-token-counter-realtime
vvzvlad:docs/manual-qa-test-plan
No Reviewers
Labels
Clear labels
bug
documentation
duplicate
enhancement
epic
feature
good first issue
help wanted
idea
invalid
needs-human
question
refactor
review/approved
review/changes-requested
review/needs
security
status/blocked
status/done
status/in-progress
status/ready
test
wontfix
Something isn't working
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
Large multi-phase effort spanning many changes
New functionality request
Good for newcomers
Extra attention is needed
Idea / proposal for discussion
This doesn't seem right
эскалация: нужно решение человека
Further information is requested
Code cleanup / refactoring
в последнем ревью нет открытых blocking-находок
последнее ревью оставило открытые blocking-находки
head не ревьюился (head != reviewed_head)
Security / hardening issue
ждёт зависимость blocked_by
закрыто и проверено
в активной работе (мягкая заявка)
специфицировано, не заблокировано, ждёт исполнителя
Test coverage / test infrastructure
This will not be worked on
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: vvzvlad/gitmost#148
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "feat/git-sync-thin-meta"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что это
Редизайн on-disk формата git-sync-волта: волт спейса становится настоящим Obsidian-волтом. Цель — открыть папку волта в Obsidian (с плагином Folder Notes) и получить ровно ту же структуру страниц, не заметив разницы. Никаких служебных артефактов в файлах.
Раньше каждый
.mdнёс жирный<!-- docmost:meta {…} -->блок. Теперь — чистый markdown с минимальной YAML-метой.Принятые архитектурные решения
1. Идентичность —
gitmost_idво frontmatter (вариант C).Единственное, что невыводимо из структуры — это Docmost
pageId. Кладём его в минимальный YAML-frontmatter:gitmost_id, не голыйid) — чтобы не конфликтовать с пользовательскими frontmatter-полями..gitmost/index.json(path-keyed индекс хрупок к rename); голыйdocmost:meta(чужероден в Obsidian).2. Вся остальная мета — выводима, в файле её нет.
title= имя файла.parentPageId= родительская папка (по пути).spaceId= репозиторий.updatedAt= git. В файле — толькоgitmost_id.3. Папки = страницы-родители, тело — в folder-note.
Структура дерева зеркальна. Страница С детьми → папка
Имя/, а её собственное тело — вИмя/Имя.md(folder-note, конвенция плагина LostPaul Folder Notes). Дети лежат рядом в той же папке. Лист → простоИмя.md.X/всегда содержит свою заметкуX).4. Ссылки — Obsidian
[[wikilinks]]по basename.Obsidian резолвит
[[Имя]]по basename, не по пути. Следствие: reparent (смена папки) ссылку НЕ ломает, ломает только retitle. Конвертер Docmost-mention ↔[[wikilink]]+ переписывание при retitle — отдельная фаза (не блокирует формат).5. Без обратной совместимости / без миграции.
Волт — это кэш. На переходе
rm -rfволты, они пересобираются из Docmost сразу в native-формате.parsePageFileне читает старыйdocmost:meta; файл безgitmost_id— это голый/рукописный файл → адопция (create page).6. Без
.gitignore..obsidian/, аттачменты, не-.mdфайлы — Obsidian ими владеет, движок не трогает (игнорирует как не-страницы, но в гите они лежат как есть).Риск
Смена ФОРМАТА на data-loss-чувствительном движке (в этой же сессии ловили тяжёлый баг с трашем живых страниц). Поэтому фазируем, и каждая фаза — юнит-тесты движка + браузерный e2e + изолированные shell-e2e на одноразовом спейсе.
Статус по фазам
parsePageFile/serializePageFile,gitmost_idfrontmatter). Юниты.buildVaultLayout: родитель →Папка/Папка.md). 6 юнитов.gitmost_id, title из имени файла, родитель из пути (folder-note awareparentFolderFile). (в работе)docmost:metaкод.[[wikilink]]+ переписывание при retitle.Дизайн целиком:
docs/backlog/git-sync-thin-meta.md.Стек: на
feat/git-sync(#119), т.к. строится поверх движка из той PR.🤖 Generated with Claude Code
Pull request closed