Parent
#26 — H0 — Markdown Import/Export (full round-trip)
What to build
A .md file becomes a new page: frontmatter → title + pages.properties + tags; body → rich editor content written through the existing collaboration path (hydrate-on-open — no new server route). Imported [[wikilinks]]/#tags are indexed by the graph index service like normal edits, and the server-side graph index folds properties.tags into the tag index so imported frontmatter tags are searchable.
Acceptance criteria
Parent
#26 — H0 — Markdown Import/Export (full round-trip)
What to build
A
.mdfile becomes a new page: frontmatter → title +pages.properties+ tags; body → rich editor content written through the existing collaboration path (hydrate-on-open — no new server route). Imported[[wikilinks]]/#tagsare indexed by the graph index service like normal edits, and the server-side graph index foldsproperties.tagsinto the tag index so imported frontmatter tags are searchable.Acceptance criteria
Importaction accepts a.mdfile; import creates a page and navigates the user to it.services/import.tsparses the file: title from frontmatter (fallback: filename), frontmatter keys →pages.properties,tags→properties.tags; parses the body via the round-trip engine; creates the page; stashes the body in a per-tab payload store keyed by page id.EditorWorkspaceacceptsinitialContentand hydrates the editor on first mount only when the doc is empty; the payload is cleared after consumption; a refresh before hydration just opens the page empty.server/graph-index.jsindexPagereadspages.propertiesand foldsproperties.tags(array or comma/space-separated string) into the tag rows written viasync_page_graph; body tags and wikilinks still extracted; links resolution unchanged.sync_page_graphremains service-key-only.npm run lintandnpm run buildgreen.