feat(sync): scaffold monorepo, extract docmost-client, add Phase-0 harness + read-only pull

Lock the access-layer decision (REST only) and start implementation per SPEC.

- monorepo (npm workspaces): packages/docmost-client = DocmostClient + lib/*
  copied 1:1 from docmost-mcp/src (backport target), plus bannered sync methods
  (listTrash, restorePage, listAllSpacePages, exportPageBody, listRecentSince /
  collectRecentSince cursor scan)
- engine stays the root app per AGENTS.md (src/, test/, build/, data/, settings.ts);
  add roundtrip.ts (SPEC §11 idempotency harness), pull.ts (SPEC §6 read-only
  Docmost->FS mirror), sanitize.ts (SPEC §12 filenames, path-traversal-safe)
- Dockerfile builds the workspace lib before the app; vitest gates CI
- exportPageBody never touches /comments (SPEC §3); serializeDocmostMarkdownBody
  emits meta + body only
- SPEC: resolve access-layer (REST), reflect root-engine layout + REST pagination
- tests: sanitize (incl. dot-traversal), collectRecentSince (cutoff/dedup/cap),
  stripBlockIds, markdown round-trip byte-stability

Note: raw ProseMirror round-trip is byte-stable in Markdown but not yet attribute-
idempotent (SPEC §11 Задача №0, before Phase 2).
This commit is contained in:
vvzvlad
2026-06-16 20:20:20 +03:00
parent 2f92dc4c1f
commit 447d2508ae
33 changed files with 10502 additions and 174 deletions

View File

@@ -3,19 +3,21 @@
"version": "0.1.0",
"private": true,
"type": "module",
"description": "Bidirectional sync daemon between Docmost articles and a local Markdown git vault.",
"description": "Bidirectional sync daemon between Docmost articles and a local Markdown git vault (git is the state store). See SPEC.md.",
"license": "MIT",
"engines": {
"node": ">=20"
},
"workspaces": ["packages/*"],
"engines": { "node": ">=20" },
"scripts": {
"build": "tsc",
"build": "npm run build -w docmost-client && tsc",
"start": "node build/index.js",
"dev": "tsx watch src/index.ts",
"test": "vitest run",
"test:watch": "vitest"
"test:watch": "vitest",
"roundtrip": "node build/roundtrip.js",
"pull": "node build/pull.js"
},
"dependencies": {
"docmost-client": "*",
"dotenv": "17.4.2",
"zod": "3.25.76"
},