First step of docs/git-sync-plan.md. New workspace package @docmost/git-sync vendoring the PURE parts from docmost-sync (HEAD b03eb35): - lib: markdown-converter, markdown-document, canonicalize, docmost-schema, node-ops, diff, and an extracted markdown-to-prosemirror (only the pure marked->HTML->generateJSON path from upstream collaboration.ts; no websocket). - engine (pure, no IO): reconcile, layout, sanitize, stabilize, loop-guard. Ported the upstream pure-module + round-trip corpus tests (vitest): 314 pass, 3 expected upstream known-limitation fails. tsc clean. No server wiring yet. docmost-schema inlines getStyleProperty (as packages/mcp does — @tiptap/core 3.20.4 doesn't export it). IO engine (pull/push/git/settings) deferred to later Phase A/B steps; the editor-ext idempotency gate (plan §13.1) is the next step. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
24 lines
1009 B
TypeScript
24 lines
1009 B
TypeScript
/**
|
|
* Pure helpers extracted from the docmost-sync Phase-0 idempotency harness
|
|
* (`src/roundtrip.ts`). Only the IO-free comparison utilities are vendored —
|
|
* the CLI scaffold (`--fixture`/`--page`/`--corpus`, `loadSettings`, the
|
|
* `DocmostClient` live path and `process.exit`) is NOT vendored (plan §2.1:
|
|
* the roundtrip harness moves into the package's tests, not the engine).
|
|
*/
|
|
/**
|
|
* Recursively strip every `attrs.id` from a ProseMirror node tree. Block ids
|
|
* are regenerated by `markdownToProseMirror` (SPEC §11), so they must be
|
|
* ignored when comparing the semantic shape of two documents. Returns a NEW
|
|
* tree; the input is not mutated.
|
|
*/
|
|
export declare function stripBlockIds(node: any): any;
|
|
/**
|
|
* Find the first divergence between two values via a recursive deep compare.
|
|
* Returns a short path + the two differing values, or null if they are equal.
|
|
*/
|
|
export declare function firstDivergence(a: any, b: any, path?: string): {
|
|
path: string;
|
|
a: any;
|
|
b: any;
|
|
} | null;
|