CLI untuk sinkronisasi file/devsync via SSH, dengan mode aman (safe pull/push), menu interaktif, dan dukungan manual sync berbasis path terdaftar maupun pola ! dari .sync_ignore.
PERINGATAN: Fitur "Pipeline System" telah dihapus dari rilis saat ini. Bagian pipeline di README ini dipertahankan sebagai arsip/dokumentasi lama saja — fitur tidak lagi didukung. Untuk migrasi atau akses arsip, lihat dokumentasi internal atau hubungi tim.
- Safe Pull/Push: indeks remote (SQLite) dibuat dulu, lalu bandingkan hash untuk unduh/unggah yang berubah saja.
- Manual/Single Sync Menu:
- Download/Upload
- Pilih folder: salah satu path terdaftar, semua yang terdaftar, atau berdasarkan pola
!di.sync_ignore - Mode: Rsync Soft (tanpa delete) atau Rsync Force (dengan delete terbatas scope)
- Catatan: opsi "Bypass" telah dihapus dari menu top-level Pull/Push. Opsi bypass-ignore masih tersedia sebagai flag CLI/agent untuk pengguna lanjutan, tetapi tidak ditampilkan pada menu interaktif utama untuk mencegah penghapusan tak sengaja.
- Force Mode (Rsync-like delete):
- Download Force: hapus file lokal yang tidak ada di DB remote dalam scope pilihan
- Upload Force: hapus file remote yang tidak ada di lokal (gunakan kolom
checkeddi DB bila ada)
.sync_ignorecerdas: menghormati.sync_tempdan pola wildcard (termasuk**), serta mendukung "include by negation" via!pattern.- SSH Agent Remote: otomatis build atau pakai fallback binary, jalankan indexing di remote, unduh DB.
- Butuh Go 1.24+.
- Jalankan:
go build ./...
Jika ingin menjalankan seluruh test (yang ada):
## Troubleshooting
# Review output after execution
# make-sync
CLI untuk sinkronisasi file/devsync via SSH, dengan mode aman (safe pull/push), menu interaktif, dan dukungan manual sync berbasis path terdaftar maupun pola `!` dari `.sync_ignore`.
**PERINGATAN:** Fitur "Pipeline System" telah dihapus dari rilis saat ini. Jika Anda mencari dokumentasi lama tentang pipeline, silakan lihat arsip internal atau hubungi tim — fitur tersebut tidak lagi didukung.
## Fitur Utama
- Safe Pull/Push: indeks remote (SQLite) dibuat dulu, lalu bandingkan hash untuk unduh/unggah yang berubah saja.
- Manual/Single Sync Menu:
- Download/Upload
- Pilih folder: salah satu path terdaftar, semua yang terdaftar, atau berdasarkan pola `!` di `.sync_ignore`
- Mode: Rsync Soft (tanpa delete) atau Rsync Force (dengan delete terbatas scope)
- Catatan: opsi "Bypass" telah dihapus dari menu top-level Pull/Push. Opsi bypass-ignore masih tersedia sebagai flag CLI/agent untuk pengguna lanjutan, tetapi tidak ditampilkan pada menu interaktif utama untuk mencegah penghapusan tak sengaja.
- Force Mode (Rsync-like delete):
- Download Force: hapus file lokal yang tidak ada di DB remote dalam scope pilihan
- Upload Force: hapus file remote yang tidak ada di lokal (gunakan kolom `checked` di DB bila ada)
- `.sync_ignore` cerdas: menghormati `.sync_temp` dan pola wildcard (termasuk `**`), serta mendukung "include by negation" via `!pattern`.
- SSH Agent Remote: otomatis build atau pakai fallback binary, jalankan indexing di remote, unduh DB.
## Instalasi & Build
- Butuh Go 1.24+.
- Jalankan:
```bash
go build ./...Jika ingin menjalankan seluruh test (yang ada):
go test ./...Konfigurasi utama di make-sync.yaml. Contoh minimal:
local_path: .
remote_path: /home/user/project
devsync:
os_target: linux # atau windows
auth:
host: 1.2.3.4
port: "22"
username: youruser
private_key: C:\\Users\\you\\.ssh\\id_rsa
remote_path: /home/user/project
local_path: .
ignores:
- .sync_temp
manual_transfer:
- src
- assets/imagesCatatan:
devsync.auth.remote_pathadalah root project di remote.devsync.manual_transferadalah daftar path yang ditampilkan di menu Manual/Single Sync..sync_ignoredi root mengatur pola ignore biasa, dan juga bisa memuat pola negasi!patternuntuk fitur include-by-pattern.
make-sync mendukung pembuatan file SSH config otomatis untuk akses langsung ke remote server. Konfigurasi ini memungkinkan koneksi SSH yang lebih mudah tanpa perlu mengetik kredensial berulang.
RemoteCommand di direct_access.ssh_configs harus disesuaikan dengan target OS:
RemoteCommand: cmd /K cd =remotePath- Menggunakan
cmd /Kuntuk menjaga command prompt tetap terbuka cd =remotePathuntuk berpindah ke direktori project
RemoteCommand: cd =remotePath && bash -l- Menggunakan
bash -luntuk login shell cd =remotePathuntuk berpindah ke direktori project
- Jalankan
make-sync direct_accessuntuk generate SSH config - File config akan dibuat di
.sync_temp/.ssh/config - Gunakan
ssh my-serveruntuk koneksi langsung - RemoteCommand akan otomatis menjalankan command sesuai target OS
- Jalankan binary
make-sync.exe(Windows) ataumake-sync(Unix). - Di menu utama pilih DevSync → Single/Manual Sync.
- Pilih Download atau Upload.
- Pilih scope:
- Salah satu path terdaftar (dari
devsync.manual_transfer) - "All data registered in manual_sync only" (semua path terdaftar)
- "All Data Only In Your "Sync Ignore" File Pattern" (berdasarkan
!patternsdari.sync_ignore)
- Salah satu path terdaftar (dari
- Pilih mode:
- Rsync Soft Mode: hanya transfer file yang berubah, tanpa penghapusan
- Rsync Force Mode: selain transfer, juga melakukan penghapusan file yang tidak ada pada sisi lain, terbatas pada scope pilihan
- Catatan: Mode Force sekarang dilindungi dengan konfirmasi captcha untuk operasi destruktif. Ini mencegah eksekusi Force oleh kelalaian. Jika Anda perlu menggunakan bypass-ignore, gunakan flag CLI/agent dengan kehati-hatian.
Selama Download/Upload:
- Sistem akan menjalankan indexing di remote terlebih dahulu (mirroring safe pull/push) agar DB up-to-date.
- Back bertahap: gunakan item menu "Back" untuk naik satu level.
- Keluar cepat: Esc, q, atau Ctrl+C akan keluar dari seluruh flow Single/Manual Sync.
- Catatan: Mode Force sekarang dilindungi konfirmasi captcha untuk operasi destruktif; opsi bypass dihilangkan dari menu top-level. Jika Anda memerlukan bypass, gunakan flag CLI/agent secara eksplisit (akan meminta kehati-hatian).
- Download Soft: unduh file remote yang belum ada atau hash berbeda, dalam scope.
- Download Force: setelah unduh, hapus file lokal yang match scope namun tidak ada di DB remote.
- Upload Soft: unggah file lokal yang belum ada atau hash berbeda, dalam scope.
- Upload Force: tandai setiap file lokal yang diproses sebagai
checked(di DB bila tersedia), lalu hapus file remote match scope yang tidakchecked. - Scope "Sync Ignore !patterns":
- Matcher dibangun dengan basis ignore semua (
**), lalu di-"unignore" oleh tiap negation pattern (ditambah varian**/untuk token pendek). .sync_tempselalu diabaikan.- Pola ignore
.sync_ignoretetap dihormati saat traversing.
- Matcher dibangun dengan basis ignore semua (
- Pastikan
devsync.authterisi benar untuk koneksi SSH. - Jika build agent gagal, sistem akan mencoba fallback binary di folder
.sync_tempsesuai target OS. - Mode Force sekarang menggunakan konfirmasi captcha untuk operasi destruktif; opsi bypass dihilangkan dari menu top-level. Jika Anda memerlukan bypass, gunakan flag CLI/agent secara eksplisit (akan meminta kehati-hatian).
- Untuk Windows remote, penghapusan file menggunakan
cmd.exe /C del /f /q.
.sync_tempselalu dikecualikan dari sinkronisasi.- Pola di
.sync_ignoretetap dihormati saat traversal lokal.
Jalankan perintah langsung di host remote tanpa PTY. Output di-stream real-time; proses akan mengembalikan exit status remote.
Penggunaan:
make-sync exec <command...>Perubahan perilaku penting (2025):
- Perintah non-interactive sekarang dikirim ke remote dengan cara yang lebih andal untuk menghindari masalah quoting/escaping. Semua argumen setelah
execdigabung menjadi satu command string lalu di-encode dengan base64. Di remote, payload didecode dan dijalankan oleh shell (bash -s) sehingga Anda tidak perlu menambah escape ekstra pada kutipan atau karakter khusus.
Perilaku detil:
- Bekerja dari direktori kerja remote:
devsync.auth.remote_path(fallbackremote_path). Jika diisi, client akan menjalankancd <remotePath> && <decoded payload>di remote. - Non-interactive only: pendekatan ini tidak mendukung TTY/interactive sessions (gunakan SSH langsung untuk itu).
- Eksekusi POSIX: default mencoba menjalankan payload di
bashviaecho '<BASE64>' | base64 -d | bash -s. - Fallback Windows: jika remote tidak menyediakan POSIX shell, client mencoba menjalankan perintah dengan
cmd.exe /Csebagai fallback. - Tidak ada parsing flag lokal untuk
exec; semua token setelahexecdianggap bagian dari perintah remote.
Kelebihan:
- Anda dapat menulis perintah natural tanpa menambahkan escape ekstra, contoh:
make-sync exec docker compose exec app bash -c "ping google.co.id"
Keterbatasan & Prasyarat:
- Remote harus menyediakan
base64danbash/shuntuk jalur POSIX agar metode ini bekerja (umum pada Linux hosts). Jika tidak ada, client akan mencoba fallback Windowscmd.exestyle. - Tidak untuk perintah interaktif atau yang memerlukan TTY.
- Jika Anda butuh behavior lain (mis. bypass quoting rules), saat ini tidak ada flag
--raw; silakan gunakan SSH langsung.
Contoh penggunaan:
- Tampilkan file tersembunyi (Linux/Unix):
make-sync exec ls -a -l
- Docker compose restart (tanpa perlu escaping tambahan):
make-sync exec docker compose down && docker compose up
- Menjalankan perintah dengan kutipan dan spasi:
make-sync exec bash -c "printf 'line1\\nline2'"
Tips quoting:
- Windows: operator seperti
&&,|, atau path dengan spasi tetap didukung karena dibungkuscmd.exe /C. Jika ada karakter kutip ganda di command, pertimbangkan untuk mengutip ulang bagian terkait. - Linux/Unix: command dibungkus ke
bash -lc '...'. Jika Anda perlu menyertakan'di dalam command, gunakan escape\\'\\'\\'atau beralih ke kutip ganda dengan hati-hati.
Troubleshooting:
- "command not found": pastikan perintah tersedia di PATH remote, atau gunakan path absolut/bin yang tepat.
- Salah direktori kerja: set
devsync.auth.remote_path(atauremote_path) pada config agarcdotomatis ke root project di remote.
- Tidak ada file yang tertransfer:
- Cek apakah hash sama atau scope/pola tidak match.
- Gagal indexing remote:
- Periksa kredensial SSH, jalur
remote_path, dan izin eksekusi pada binary agent (Unix: chmod +x).
- Periksa kredensial SSH, jalur
- Pola
!patterntidak bekerja:- Pastikan
.sync_ignoreada di root lokal, setiap pattern pada baris terpisah, tanpa komentar. Gunakan**/untuk menjangkau subfolder jika perlu.
- Pastikan
Proyek ini mengikuti lisensi yang ditentukan oleh pemilik repositori.