A2: board card markdown round-trip + directory sync#46
Merged
Conversation
WHAT: Add board_md (card_to_markdown / card_from_markdown) and the
Store::import_dir / export_dir directory sync, so the operational SQLite
cards round-trip to/from the portable markdown+frontmatter form.
- board_md.rs: emits the canonical frontmatter field order (id, project,
created, updated, summary, size, status, recurs, expires, blocked_on,
refs, author/source) + body; parses tolerantly (free-text status,
trailing `# comments` on list items, a `blocked_by` alias for
blocked_on, refs label:url map). lane/context are directory facts, left
empty by the parser and filled by the walker.
- Store::import_dir walks <root>/[<context>/]<lane>/*.md (lanes
p0|p1|p2|done|dropped), follows symlinks (the lane-view convention) but
dedups by card_id so a source file and its lane symlink import once;
returns {added, updated, skipped}.
- Store::export_dir writes flat <context>/<lane>/<card_id>.md real files
(non-destructive; never deletes files it didn't write).
- BoardConfig gains sync_dir / default_lane / default_context (all
#[serde(default)], existing configs parse unchanged).
- New dependency: serde_yaml_ng (maintained drop-in for the deprecated
serde_yaml) — parses the frontmatter map + list cleanly.
WHY: Markdown stays the portable, sovereign artifact (no lock-in); SQLite
is the fast operational store. v1 round-trip is at the card-content level
(frontmatter + body survive SQLite -> md -> SQLite) — it does NOT
reconstruct the numbered relative-symlink lane views; that's a follow-up.
Disclosure tier: internal capability + one new dependency. No MCP surface
change, no listed step yet.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Supersedes #43 (auto-closed when its stacked base branch was deleted on #42's merge). Same content, now targeting
main.Adds the portable-export layer for board cards: SQLite ↔ markdown round-trip and directory sync.
board_md:card_to_markdown/card_from_markdown(tolerant of free-textstatus, trailing# comments,blocked_byalias,refsmap).lane/contextare directory facts.Store::import_dir/export_dir: walk/emit<root>/[<context>/]<lane>/*.md; import dedups bycard_id(source + symlink import once).BoardConfiggainssync_dir/default_lane/default_context.serde_yaml_ng.Fidelity boundary: card-content level (frontmatter + body); does not reconstruct numbered-symlink lane views.
Disclosure tier: internal capability + one dependency.
Test plan
just checkgreen;board_mdround-trip +dir_sync_round_tripstests.🤖 Generated with Claude Code