@anthais/glsync
v0.1.2
Published
CLI tool for two-way sync between GitLab and local Markdown files
Readme
glsync
Two-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code — version-controlled, diffable, and editable in your favorite editor.
Features
- Two-way sync — pull from GitLab, edit locally, push back
- Hash-based conflict detection — never accidentally overwrite someone else's changes
- Issues as Code — store issues, milestones, and labels as Markdown files with YAML frontmatter
- Git-friendly —
.mdfiles are tracked in git, so your team shares the same view - Self-hosted GitLab support — works with any GitLab instance
Quick Start
npm install -g @anthais/glsync
cd your-project
glsync init # auto-detects git remote, prompts for token
glsync pull # pull issues, milestones, labels as .md files
# edit files in .gitlab/issues/, .gitlab/milestones/, .gitlab/labels/
glsync diff # preview changes
glsync push # push changes back to GitLabCommands
| Command | Description |
|---------|-------------|
| glsync init | Initialize config (auto-detect git remote, prompt for token) |
| glsync fetch | Fetch latest data from GitLab to local cache |
| glsync pull | Pull and write .md files from GitLab |
| glsync diff | Show diff between local files and GitLab |
| glsync push | Push local changes to GitLab |
Options
-r, --resource <type> Sync only: issues, milestones, or labels
--force Overwrite without conflict check
--backup Create .bak file before overwriting (pull only)
--yes Skip confirmation prompt (push only)File Structure
After glsync pull, your project will look like:
.gitlab/
├── issues/
│ ├── 21.research-auto-time-tracking.md
│ └── 42.setup-ci-pipeline.md
├── milestones/
│ └── sprint-1.md
├── labels/
│ ├── bug.md
│ └── feature.md
└── .glsync/ # gitignored — config & cache
├── config.json
└── objects/Each file uses YAML frontmatter + Markdown body:
---
id: 42
iid: 10
title: Setup CI pipeline
labels:
- devops
- high-priority
milestone: Sprint 1
state: opened
---
Configure GitLab CI/CD for the monorepo...How It Works
glsync uses SHA-256 hashes to track changes on both sides:
base_hash— snapshot from the last pullserver_hash— latest state on GitLablocal_hash— current state of your local file
Push: local changed + server unchanged → safe to push
local changed + server changed → conflict (pull first)
Pull: server changed + local unchanged → safe to overwrite
server changed + local changed → conflict (use --force or --backup)No version numbers, no timestamps — just content hashes.
License
MIT
