Repository navigation
Releases: rsheyd/google-docs-markdown-sync
Releases · rsheyd/google-docs-markdown-sync
Release list
v0.8.12
Changed
- Surface current Google Docs sync failures compactly in the first line of both managed status footers, keep unchanged error state stable across automatic retries without rewriting either footer or accumulating blank Google Docs paragraphs, retain the last successful sync time, and automatically restore the normal title after recovery.
- Preserve the required paragraph boundary when replacing Markdown content immediately before a native Google Docs table of contents, avoiding rejected deletion ranges.
- Preserve stale native Google Docs tables of contents as opaque native blocks so outdated entries no longer prevent unrelated Markdown changes from synchronizing; local generated entries continue to follow current headings.
- Carry native table-of-contents entry positions from the Google Docs structure through Markdown export, preserving ordinary paragraphs inside the native element and handling entries whose heading links no longer resolve.
- Restore missing Markdown paragraph breaks when a simple Google Doc has uniform native 8-point post-paragraph spacing, and remove matching surplus empty Docs paragraphs during normal Markdown pushes.
v0.8.11
Changed
- Process sync work in batches of at most 20 with up to eight independent pairings in flight, while committing shared state, deletion progress, notifications, and completion output in stable order. Daily reconciliation yields between batches to queued local edits and incremental Drive targets; completed batches remain durable after interruption. Set
GOOGLE_DOCS_SYNC_CONCURRENCY=1for sequential diagnostics.
Fixed
- Resume interrupted Doc trash operations by reconciling the saved
trashingphase with Google Drive before local cleanup, and keep the originally recorded Markdown and asset paths authoritative across manual retries. - Avoid adding the standard 8-point paragraph gap when an explicit empty Markdown paragraph already supplies the separation, preventing compounded whitespace after Google Docs' Paste from Markdown command.
Added
- Add a Homebrew installation path through
rsheyd/tap/gdms, including release-formula updates and documented upgrade handling for versioned Cellar paths. - Add
gdms cleanup-spacing --allto safely remove legacy generated empty paragraphs across every paired Google Doc while isolating individual failures and reporting aggregate results.
v0.8.10
Added
- Sync Markdown task lists as ordinary Google Docs bullets prefixed with
o]orx], preserving completion state in both directions. - Add
gdms configure-checkboxes --enable|--disablefor optional export-verified native checklist conversion, disabled by default. Warn that completed tasks may become open if Google’s export omits completion. - Rebuild changed Markdown tables containing at most one image per cell, reinserting each image at its text-relative position with Google Docs' default image size.
Changed
- Archive local Markdown and assets in a dated
.gdms-recoveryfolder and unpair when Google Drive confirms a Doc is trashed; preserve unsynced edits, resume interrupted cleanup, and email the recovery location. Missing/inaccessible Docs returning 404 remain non-destructive.
Fixed
- Require raw Google Markdown task syntax and unique paragraph text matches before native checkbox conversion; skip ambiguous matches and reject revision changes. A read-only live check selects six native tasks while excluding all 39 Granola bullets.
- Recognize native checklist items that include a
%0glyph format alongsideGLYPH_TYPE_UNSPECIFIED, rather than treating them as numbered lists and skipping conversion. Verified conversion against a live synced document. - Match native Google Docs table-of-contents entries to headings containing bold, italic, code, or escaped Markdown formatting.
- Rebuild Google Docs containing supported standalone images when a structural table edit requires the full-body fallback, using staged image URLs and preserving the displayed size of unchanged images.
v0.8.9
Changed
- Apply CSV changes through typed, value-only Google Sheets updates so existing date, currency, percentage, duration, validation, conditional formatting, and other native cell properties remain intact.
- Preserve native Google Sheets tables during CSV synchronization, expanding their ranges for added CSV rows or columns without automatically shrinking them.
- Treat formatting-only Google Sheets revisions as metadata changes without rewriting unchanged local CSV files.
- Consolidate the hidden spreadsheet tab map and local status page into one visible
GDMS.mdfile, automatically migrating legacy sidecars and recording portable number formats, column types, and native-table structure. - Record compact Google Sheets bold, italic, underline, and strikethrough ranges in
GDMS.md, and restore them when recreating a tab without overwriting live formatting during ordinary CSV pushes.
v0.8.8
Changed
- Load registered sync-location manifests directly during routine daemon polling instead of recursively searching configured folders every five seconds.
- Describe manifest-owning folders as sync locations in user-facing documentation and Raycast, and replace separate project/archive preferences with one persistent, addable list whose locations all use the same lazy folder browser.
- Record the installed CLI, Node, and OAuth paths during service installation so Raycast can use them without exposing runtime plumbing as preferences.
- Use sync-location and discovery-root terminology throughout current code and documentation, prefer
--sync-locationin the CLI, and retain--workspaceas a compatibility alias. - Complete Phase 1 of the unified sync-location registry design: add shared versioned location and manifest registries, migrate legacy discovery state without deleting it, add location-management CLI commands, reconstruct missing indexes from configured locations, and remove recursive discovery from daemon polling.
- Complete Phase 2 of the unified sync-location registry design: make Raycast use the same registry with one-time migration, removal previews, and explicit pairing scans, and move service logs to the standard macOS Logs directory with compatibility migration.
v0.8.5
Changed
- Represent Markdown blockquotes in Google Docs with a modest left indent while preserving separate quoted paragraphs and explicit hard line breaks.
- Show configuration, shutdown, and startup progress while installing or restarting the synchronization service.
- Pause scheduled and local-change synchronization without reporting pairing errors when the Google API hostname is unreachable, and resume automatically when connectivity returns.
- Detect polling timers delayed by likely laptop sleep and allow the network to settle before checking connectivity or issuing Google requests.
- Detect likely laptop sleep independently of polling, discard interrupted synchronization results before state and notification handling, wait 15 seconds for post-wake networking to settle, and start a fresh pass without sending sleep-induced error or recovery email.
- Poll unchanged Google Docs with one lightweight Drive metadata request, fetching the complete Docs structure only after a local change, remote Drive-version change, missing baseline, or status and formatting work that requires document details.
- Poll the Google Drive changes feed during routine daemon cycles and synchronize only paired Docs or Sheets reported as changed, keeping quiet polling cost constant as the pairing count grows.
- Save the Drive changes cursor only after targeted synchronization succeeds, replay uncommitted changes after interruption or restart, and recover an expired cursor through a complete reconciliation without creating per-pairing discovery incidents.
- Run a complete reconciliation every 24 hours, record its completion in machine-local state and heartbeat output, and retain sequential targeted processing after scale and live latency measurements showed no need for concurrent state mutation.
Fixed
- Identify native Google Docs tables of contents from the Docs structure and their exported heading-link sequence instead of requiring a user-authored
Table of Contentslabel. Preserve labels as ordinary content, handle Google's unlabeled empty-heading wrappers and extra export spacing, and recover a missing leading local TOC range even when the following heading changed.
v0.8.4
Changed
- Poll only the lightweight Drive revision for unchanged Google Sheets
pairings, fetching Sheets metadata and tab values only after a local or
remote change. - Classify sync failures as temporary connectivity or needing attention.
Preserve active failure and sent-email markers across service restarts,
group changing timeout and DNS messages into the same incident, and wait at
least 30 minutes before emailing about temporary connectivity failures. - Include the failed spreadsheet operation, elapsed time, and available error
code in daemon diagnostics.
Fixed
- Serialize same-file JSON writes and use collision-safe temporary filenames
so overlapping runtime-state or pairing-index writes cannot race for the same
temporary file and terminate the daemon.
v0.8.3
Changed
- Represent native Google Docs tables of contents locally as marked Markdown TOCs generated from current headings. Ignore changes inside the generated range and preserve the native Docs element during pushes, while leaving unmarked static Markdown TOCs as ordinary synchronized content.
Fixed
- Repair bold, italic, strikethrough, link, and paragraph-spacing drift during otherwise unchanged sync passes without replacing document text.
v0.8.2
Fixed
- Avoid false image-conflict stops when Google changes only a document revision token without changing its Drive modification time, such as during native table-of-contents or metadata normalization.
- Treat a remote revision and modification-time change as metadata-only when normalized remote content and image bytes still match the shared baseline, allowing a concurrent local-only edit to push safely.
- Repair the shared baseline when a document-body update succeeded before a later table-of-contents reconciliation failed, comparing normalized remote images and bytes instead of incompatible raw Markdown and asset-aware hashes.
- Exclude native table-of-contents links from Markdown heading-link validation and rewriting because Google manages those ranges.
- Ignore API-only structural spacer paragraphs around and within native tables of contents while still refusing changes to their visible entries.
- Normalize a changed Markdown TOC back to the current remote-managed native TOC during a push, allowing valid body additions to synchronize without attempting an unsupported Google Docs TOC rewrite.
- Report each distinct daemon sync error once instead of repeating it every polling cycle, and announce when the affected pairing recovers.
Added
- Keep desktop error/recovery notifications off by default because transient banners are not a durable operational record. Installing weekly health email stores one shared recipient and enables persistent sync-error email to that address after 15 minutes by default; add
gdms configure-notificationsfor recipient, delay, and opt-out changes, plus automatic migration from existing heartbeat LaunchAgents. Send a recovery email only when the corresponding persistent-error email was sent.
v0.8.1
Changed
- Rename the CSV Finder Quick Action to Combine & Sync CSVs with New Google Sheet (GDMS) so its new-spreadsheet, one-tab-per-CSV, ongoing-sync behavior is clear, remove the legacy ambiguously named workflow, and open the Quick Actions pane after installation so both GDMS actions can be enabled together.
- Escape action names in generated service plists so the ampersand in the CSV action name does not prevent macOS from registering it.
- Rename the Markdown Finder Quick Action to Sync MDs with New Google Docs (GDMS) so its accepted file type and one-new-Doc-per-file behavior are clear, and remove the previous workflow name when reinstalling the actions.
- Open a newly created Sheet or single Markdown-created Doc from Finder in the default browser; for multi-Markdown batches, avoid opening many tabs and show a completion notification instead. Add the reusable
--openoption togdms createandgdms create-sheet.